第五章-循环结构程序设计_第1页
第五章-循环结构程序设计_第2页
第五章-循环结构程序设计_第3页
第五章-循环结构程序设计_第4页
第五章-循环结构程序设计_第5页
已阅读5页,还剩109页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章循环结构程序设计

5.1while语句5.2do-while语句5.3三种循环语句比较5.4break语句、continue语句和goto语句5.5循环嵌套5.6循环结构程序设计本章要点什么是循环?为什么要使用循环?如何使用循环?实现循环时,如何确定循环变量、循环条件和循环体?什么情况下使用条件循环语句?什么情况下使用条件计数语句?如何使用break和continue语句?如何实现多重循环?5.1while语句5.1.1引例5.1.2while语句5.1.3用while语句编程5.1.1引例【例5-1】编程序:输入一个班学生的成绩,求全班的平均成绩。

问题分析与算法设计

程序解析

问题分析求全班平均成绩:先求全班总成绩和总人数。即:求累加和与求计数问题。需要用循环结构实现。循环体:输入成绩、累加成绩和计数人数。

循环条件:学生人数未知,不知道循环次数,但成绩没有负数。设定循环条件:每当输入的分数大于等于0时就继续循环,当输入的分数小于0时就停止循环。算法设计第一步:设置2个统计变量并赋初值; 总成绩sum=0,总人数count=0第二步:输入第一个学生分数=>score第三步:求总分和总人数:当score>=0时,循环。

累加总分:sum=sum+score

计数人数:count=count+1

输入下一分数

=>score第四步:计算平均成绩;第五步:输出平均成绩;程序清单#include<stdio.h>voidmain(){floatscore,sum=0; /*sum:存放平均成绩,初值为0*/intcount=0; /*count:存放学生数,初值为0*/printf("Entergrades:"); /*输入提示*/scanf("%f",&score); /*输入第一个学生分数*/while(score>=0){ /*循环条件:score>=0*/sum+=score; /*累加总分*/count++; /*计数人数*/scanf("%f",&score); /*输入下一个学生分数*/}if(count!=0)sum=sum/count; /*求平均成绩*/printf("Gradeaverageis%6.2f",sum); /*输出平均成绩*/}while语句while(循环条件)

循环体语句;

真假while下一条语句循环条件循环体语句while(score>=0){ sum+=score; count++; scanf("%f",&score);}执行流程:基本格式while语句VSfor语句while(循环条件)

循环体语句;

真假while下一条语句循环条件循环体语句循环条件循环体for(表达式1;表达式2;表达式3)循环体语句;while语句和for语句比较:都在循环前先判断条件,只有条件为“真”时才进入循环。把for语句改写成while语句表达式1;while(表达式2){

for循环体语句;

表达式3;}for(表达式1;表达式2;表达式3)

循环体语句while语句VSfor语句for(i=1;i<=10;i++)

sum=sum+i;i=1;

循环变量赋初值while(i<=10){循环条件

sum=sum+i;

i++;循环变量的改变}表达式2循环体表达式1表达式3while语句VSfor语句while和for的选择原则:若题目中指定了循环次数,使用for语句更清晰,循环的4个组成部分一目了然,其他情况多使用while语句。改写程序:P80练习5-3【例5-2】利用格里高利公式求π的近似值,要求精确到最后一项的绝对值小于10-4。计算公式:5.1.2用while语句编程【例5-2】利用格里高利公式求π的近似值问题分析与算法设计(一)分析:累加和问题,未直接给出循环次数,只给出精度要求。思想:反复计算累加和,每次都与给出的精度进行比较,一旦某次累加项item的绝对值小于10-4,就达到给定精度,计算中止。循环条件:精度做循环条件,即:|item|>=10-4。【例5-2】利用格里高利公式求π的近似值问题分析与算法设计(二)求累加和问题:使用循环结构实现。其中:

循环条件:|item|>=10-4

循环体:重复执行的工作,包括:

计算item

累加item问题分析与算法设计(三)第一步:设置初值:累加和pi=0,项item=1.0,符号flag=1,分母fm=1第二步:计算π/4:当|item|>=10-4时,重复下列工作。

①.计算项:item=flag*1.0/fm

②.累加项:pi=pi+item

③.求下一项符号与分母: flag=-flag;fm=fm+2第三步:计算π:pi=4*pi第四步:输出π【例5-2】利用格里高利公式求π的近似值voidmain(){intfm,flag;doubleitem,pi;

flag=1;fm=1;item=1.0;

pi=0;

while(fabs(item)>=0.0001)

{

item=flag*1.0/fm;

pi=pi+item;

flag=-flag;

fm=fm+2;

}

pi=4*pi;

printf(“pi=%f\n”,pi);}初值确定问题?pi=?item=?,flag=?,fm=?pi=0item=1.0flag=1fm=1【例5-2】:程序清单5.2do-while语句5.2.1引例5.2.2do-while语句5.2.3用do-while语句编程5.2.1引例【例5-3】编程序:输入一个班学生的成绩,求全班的平均成绩。

要求:用do-while语句实现。

问题分析与算法设计

程序解析

问题分析求全班平均成绩:先求全班总成绩和总人数。即:求累加和与求计数问题。需要用循环结构实现。循环体:输入成绩、累加成绩和计数人数。

循环条件:学生人数未知,不知道循环次数,但成绩没有负数。设定循环条件:每当输入的分数大于等于0时就继续循环,当输入的分数小于0时就停止循环。算法设计第一步:设置2个统计变量并赋初值; 总成绩sum=0,总人数count=0第二步:求总分和总人数:重复下列工作,直到 score<0为止。

①输入一个分数

=>score

②若score>=0,则做

累加总分:sum=sum+score

计数人数:count=count+1第三步:计算平均成绩;第四步:输出平均成绩;程序清单#include<stdio.h>voidmain(){floatscore,sum=0; /*sum:存放平均成绩,初值为0*/intcount=0; /*count:存放学生数,初值为0*/printf("Enterscores:"); /*输入提示*/do{ scanf("%f",&score); /*输入一个学生分数*/ if(score>=0){ sum+=score; /*累加总分*/count++; /*计数人数*/ }}while(score>=0); /*循环条件:score>=0*/if(count!=0)sum=sum/count; /*求平均成绩*/printf("Gradeaverageis%6.2f",sum); /*输出平均成绩*/}do-while循环do{

循环体}

while(表达式);先循环后判断真假表达式循环体do-while的下一条语句执行流程:基本结构:循环条件do{scanf("%f",&score);if(score>=0){sum+=score;count++;}}while(score>=0);请思考?

该题使用do-while语句编程,为什么需要增添选择语句“if(score>=0)…”?如果去掉选择语句,应该怎样保证程序的正确性?【例5-4】输入一个整数,求该数的位数。 例如:

输入:12345

输入:0

输出:5

输出:15.2.2用do-while语句编程【例5-4】输入一个整数,求该数的位数。问题分析与算法设计(一)分析:需要对整数num逐位计数,属于循环计数问题。思路:对整数num每次去掉未位并计数,直到num为0,则计数次数即为num的位数。循环条件:num!=0

循环体:去末位、计数【例5-4】输入一个整数,求该数的位数。问题分析与算法设计(二)

循环计数问题。需要确定:

循环条件:num!=0

循环体:重复执行的工作,包括:

去掉num末位数:num/10=>num;

位数计数器加1:count++;问题分析与算法设计(三)第一步:设置初值:位数计算器count置0第二步:输入一个整数=>num;第三步:求整数num位数:重复下列工作,直到num为零。

①.去掉num的末位数:num/10=>num;

②.位数计数器加1:count++;第四步:输出count值。【例5-4】输入一个整数,求该数的位数。voidmain(void){intcount=0,num;printf(“Enteranumber:");scanf("%d",&num);do{

num=num/10;

count++; }while(num!=0);printf("Itcontains%ddigits.\n",count);}while(num!=0){

num=num/10;

count++;}有问题吗?程序清单如何修改?1.求一个整数各数位数字和;2.求一个整数最高位的权;程序清单voidmain(void){intcount=0,num;printf(“Enteranumber:");scanf("%d",&num);do{

num=num/10;

count++; }while(num!=0);printf("Itcontains%ddigits.\n",count);}思考:如何修改?voidmain(void){intnum,digit,sum=0;printf(“Enteranumber:");scanf("%d",&number);do{

digit=number%10; number=number/10;

sum=sum+digit; }while(number!=0);printf(“sum=%d.\n",sum);}求一个整数各数位数字和voidmain(void){intnum,pow=1;printf(“Enteranumber:");scanf("%d",&num);do{

number=number/10;

pow=pow*10; }while(number!=0);printf(“power=%d.\n",pow/10);}求一个整数最高位的权思考:为何pow/10?【例5-5】求1至1000之间满足“除3余2,除5余3,除7余2”的数。要求:一行只输出5个数。5.2.2用do-while语句编程【例5-5】题目略问题分析与算法设计(一)分析:对[1,1000]范围内的每个整数,逐个判定是否满足条件并处理。●整除关系:用求余运算%;●三个条件的“与”关系:用逻辑表达式。●

每行五个数:计数器是否是5的倍数。【例5-5】题目略问题分析与算法设计(二)

显示,对[1,1000]范围的循环结构,其中: 循环条件:num<=1000

循环体:若num满足条件,则:

输出num;

个数计数器count增1;

若计数器count是5的倍数,则输出换行符。问题分析与算法设计(三)第一步:设置初值:个数计数器count初值为0;第二步:num在[1,1000]范围内按步长增1变化,针对每个num,重复下列操作:

if(若num满足条件){

printf(num);

count++;

if(count%5==0)printf(“\n”); }【例5-5】题目略voidmain(void){intcount=0,num=1;do{ if(num%3==2&&num%5==3&&num%7==2){ printf("%4d",num); /*输出num*/ count++; /*计数器加1*/ if(count%5==0

)printf("\n"); /*5个换行*/}num=num+1; /*取下一个整数num*/}while(num<=1000); /*循环条件:num<=1000*/}程序清单真假表达式循环体语句do-while的下一条语句真假while的下一条语句表达式循环体语句5.2.3再析while和do-while执行程序while:先判别循环条件,再决定是否循环。

注意:循环体可能一次也不执行。do-while:先执行循环体,再判别是否继续循环。

注意:循环体至少执行一次。5.2.3再析while和do-while举例:输出100个“*”。程序片段如下:5.2.3再析while和do-whilei=1;while(i<=100)putchar(´*´);i++;问题:“死循环”i=1;while(i<=100){putchar(´*´);

i++;}特别注意:循环变量必须在循环体内有所改变,才能使while和do-while语句的循环条件的值改变,直至循环结束。否则会造成“死循环”。举例:输出100个“*”。程序片段如下:5.2.3再析while和do-whilei=1;while(i<=100){putchar(´*´);

i++;}i=1;do{putchar(´*´);

i++;}while(i<=100)特别注意:while和do-while可以互相转换。5.3三种循环语句比较5.3.1进一步讨论for语句5.3.2循环语句比较与选择5.3.3案例说明5.3.1进一步讨论for语句结合求n!的fact函数,进一步讨论for语句。intfact(intn){ inti,res=1; /*定义变量并赋初值*/ for(i=1;i<=n;i++) /*循环连乘求n!*/ res=res*i; returnres; /*返回结果*/}5.3.1进一步讨论for语句1、省略表达式

A.省略表达式1:则应在for之前给循环变量赋初值,但其后的分号不能省略。

intfact(intn){ inti=1,res=1; /*定义变量并赋初值*/ for(;i<=n;i++) /*循环连乘求n!*/ res=res*i; returnres; /*返回结果*/}5.3.1进一步讨论for语句1、省略表达式

B.省略表达式2:无终止条件循环,其后分号不能省。可能导致“死循环”。应在循环体内设置强制跳出循环的break语句。

intfact(intn){ inti,res=1; /*定义变量并赋初值*/ for(i=1;;i++){ /*循环连乘求n!*/ res=res*i;

if(i>n)break; /*通过break强制跳出循环*/

} returnres; /*返回结果*/}5.3.1进一步讨论for语句1、省略表达式

C.省略表达式3:则可能导致“死循环”。应在for语句的循环体内修改循环变量的值。

intfact(intn){ inti,res=1; /*定义变量并赋初值*/ for(i=1;i<=n;){ /*循环连乘求n!*/ res=res*i;

i++; /*循环变量i增1

*/

} returnres; /*返回结果*/}5.3.1进一步讨论for语句1、省略表达式

D.省略表达式1和表达式3:则应在for语句前给循环变量赋初值,在for语句的循环体内修改循环变量的值。

intfact(intn){ inti=1,res=1; /*定义变量并赋初值*/ for(;i<=n;){ /*循环连乘求n!*/ res=res*i;

i++; /*循环变量i增1

*/

} returnres; /*返回结果*/}5.3.1进一步讨论for语句1、省略表达式

E.省略三个表达式:但分号不能省,且在for之前对循环变量赋初值,在循环体内修改循环变量值,在循环体内设置强制跳出循环的语句break。intfact(intn){ inti=1,res=1; /*定义变量并赋初值*/ for(;;){ /*循环连乘求n!*/ res=res*i;

i++; /*循环变量i增1

*/

if(i>n)break;/*通过break强制跳出循环*/

} returnres; /*返回结果*/}5.3.1进一步讨论for语句2、for语句中的逗号表达式

A.表达式1使用逗号表达式。

intfact(intn){ inti,res; /*定义变量并赋初值*/ for(i=1,res=1;i<=n;i++) /*循环连乘求n!*/ res=res*i; returnres; /*返回结果*/}5.3.1进一步讨论for语句2、for语句中的逗号表达式

B.表达式3使用逗号表达式。

intfact(intn){ inti,res=1; /*定义变量并赋初值*/ for(i=1;i<=n;res=res*i,i++) /*循环连乘求n!*/ ; /*空语句*/ returnres; /*返回结果*/}5.3.1进一步讨论for语句2、for语句中的逗号表达式

C.表达式1和表达式3都可以是逗号表达式。

intfact(intn){ inti=1,res=1; /*定义变量并赋初值*/ for(i=1,res=1;i<=n;res=res*i,i++) /*循环连乘*/ ; /*空语句*/ returnres; /*返回结果*/}思考:表达式3改写成“i++,res=res*i”,正确吗?5.3.1进一步讨论for语句3、循环体为空语句A.一般形式为:

for(表达式1;表达式2;表达式3)

; /*循环体为空语句*/5.3.1进一步讨论for语句3、循环体为空语句B.举例:求n!运算的for语句for(i=1,res=1;i<=n;res=res*i,i++)

;

/*循环体为空语句*/5.3.1进一步讨论for语句3、循环体为空语句C.举例:获得一个时间延迟SOME_VALUE #defineSOME_VALUE100

……

for(t=0;t<SOME_VALUE;t++)

;

/*循环体为空语句*/5.3.2循环语句比较与选择if(循环次数已知) 使用for语句else /*循环次数未知*/

if(循环条件在进入循环时明确) 使用while语句

else 使用do-while语句【例5-6】使用for、while、do-while语句,分别实现例5-4的整数位数计数问题。

使用for语句。

使用while语句。

使用do-while语句。5.3.3三种循环语句的通用性voidmain(void){intcount=0,num;printf(“Enteranumber:");scanf("%d",&num);if(num==0)count=1; /*若num为0,则置count为1*/

for(;num!=0;){

num=num/10;

count++; }printf("Itcontains%ddigits.\n",count);}源程序清单I:for语句编程请思考为何需要添加如下语句?if(num==0)count=1;

voidmain(void){intcount=0,num;printf(“Enteranumber:");scanf("%d",&num);if(num==0)count=1; /*若num为0,则置count为1*/

while(num!=0){

num=num/10;

count++; }printf("Itcontains%ddigits.\n",count);}源程序清单II:while语句编程请思考为何需要添加如下语句?if(num==0)count=1;

voidmain(void){intcount=0,num;printf(“Enteranumber:");scanf("%d",&num);do{

num=num/10;

count++; }while(num!=0);printf("Itcontains%ddigits.\n",count);}源程序清单Ⅲ:do-while语句编程请思考为何不需要下列语句?

if(num==0)count=1;5.4break、continue和goto语句5.4.1break语句5.4.2continue语句5.4.3goto语句语句功能:改变程序的执行流程,使程序从某处转向另一处去执行。主要应用:循环结构的程序设计。5.4.1

break语句语句形式

break;语句功能

强制跳出break语句所在的循环结构,使流程转向循环结构的下一条语句。执行流程如右图。两个出口

出口1:表达式2为“假”

出口2:执行break语句真(非0)否假(0)表达式2语句1表达式1for语句的下一条语句表达式3语句2是break注意两个出口含义不同,在退出循环后,一般要判断从哪个出口跳出。break通常和if配合使用。5.4.1

break语句应用举例【例5-7】输入一个正整数m,判断它是否为素数。1不是素数,2是素数。问题分析与算法设计(一)素数:只能被1和自身整除的整数。1不是素数,2是素数。方法:判定m是否素数,只需检查[2,m-1]范围内的整数是否整除m,若不能,则m是素数,否则m不是素数。用求余运算(%)来判断整除关系。说明:也可在2~m/2范围,或

2~sqrt(m)范围。【例5-7】素数判定问题分析与算法设计(二)第一步:输入整数m;第二步:检测m能否整除i:让i在[2,m-1]范围内增1变化,检查m 能否整除i,若能整除,则跳出循环。描述如下:

for(i=2;i<m;i++)

if(m%i==0)break;第三步:输出结果。

if(i>=m&&m!=1)printf(“素数”);

elseprintf(“非素数”);【例5-5】题目略voidmain(){inti,m; printf(“Enteranumber:");

scanf("%d",&m); for(i=2;i<m;i++)

if(m%i==0)break;

if(i>=m&&m!=1)

printf("%disaprimenumber!\n",m); elseprintf("No!\n"); }源程序-判断素数for(i=2;i<m;i++)

if(m%i==0)printf("No!\n");elseprintf("%disaprimenumber!\n",m);

循环条件?结束循环的两个出口?循环范围:在2~m/2范围,或2~sqrt(m)范围。break语句一般需要与if语句配合使用,即当满足某条件时才跳出循环。for(i=2;i<m;i++)

if(m%i==0)break;

关于break语句的使用说明当循环体中又包括一个switch语句时,switch中的break只会影响switch,不会影响它所在的循环。即:只跳出switch,不会跳出循环。

for(…){ switch(){ …break;} }

关于break语句的使用说明案例分析

five=0;other=0;

for(i=1;i<100;i++){

/*for结构*/x=i%10; /*x:i的末位数*/

switch(x){ /*switch结构*/case0:case5:five++;break;

/*break只跳出switch*/default:other++;break;/*break只跳出switch*/}}关于break语句的使用说明功能:统计100以内5的倍数和非5的倍数的个数。5.4.2

continue语句语句形式

continue;语句功能提前结束本次循环,跳过循环体中continue后面尚未执行的循环体语句,继续下次新的循环。执行流程如右图。真(非0)否假(0)表达式2语句1表达式1for语句的下一条语句表达式3语句2是continue5.4.2

continue语句应用举例【例5-8】输出100以内能被9整除的数。问题分析与算法设计(一)方法:输出100以内能被9整除的数,只需对100以内的每个整数逐一判断,若能整除,则输出;否则不输出。判断整除关系用求余运算(%)。【例5-8】输出100以内能被9整除的数。问题分析与算法设计(二)第一步:设置循环控制变量n;第二步:让n在[1,100]范围内按步长增1变化,检测n能否整除9。描述如下:

for(n=1;n<=100;n++){ if(n%9!=0)continue; printf(n); }【例5-8】输出100以内能被9整除的数。#include<stdio.h>voidmain(){ intn;

for(n=1;n<=100;n++){ /*n在1~100范围内变化*/ if(n%9!=0)continue;/*跳过其后循环体语句,*/

/*开始下次新循环*/ printf("%d",n); }}源程序-输出100内的9的倍数continue语句一般需要与if语句配合使用,即当满足某条件时才继续下一次新的循环。

for(n=1;n<=100;n++){ if(n%9!=0)continue; printf("%d",n); }关于continue语句的使用说明5.4.3

goto语句(选讲)语句形式:goto标号;语句功能:无条件转移语句。使流程转移到标号所在的语句,并从该语句继续执行。语句标号:用标识符表示,语句标号一般放在语句的前面,并用英文“:”分隔。标号语句形式: 标号:语句5.4.3

goto语句应用举例【例5-9】输入一批学生成绩,求全班平均成绩。#include<stdio.h>voidmain(){floatscore,sum=0;intcount=0; /*count:学生人数计数器*/printf("Entergrades:"); /*输入提示*/scanf("%f",&score); /*输入第一个学生的分数*/if(score<0)gotoend; /*负分,转移到end标号语句*/

loop:sum+=score; /*loop:语句标号*/count++; scanf("%f",&score); if(score>=0)gotoloop;/*非负分,转置loop标号语句继续循环*/

end:if(count!=0)sum=sum/count; /*end:语句标号*/printf("Gradeaverageis%6.2f\n",sum);}源程序-求全班学生平均成绩。

一般需要与if语句配合使用。

只允许在同一函数内部转移,不得转移到其他函数。只允许从循环内部跳转到循环外部,不允许从循环外部跳转到循环内部。多重循环结构,只允许从内循环跳转到外循环,不允许从外循环跳转到内循环。

建议:应尽量避免使用goto语句。

关于goto语句的使用说明5.5循环嵌套【例5-10】计算1!+2!+3!+…+100!。求1!+2!+….+100!问题分析与算法设计累加和问题:需要使用“循环结构”。算法用伪代码描述如下: for(i=1;i<=100;i++){

item=i! sum=sum+item; }方法1:调用fact(i)函数

fact(i)函数计算i的阶乘方法2:嵌套循环用一个循环结构计算i的阶乘。如何求i!?两种方法#include<stdio.h>doublefact(intn);

voidmain(){ inti;doublesum=0;

for(i=1;i<=100;i++) sum=sum+fact(i);

printf("1!+2!+3!+…+100!=%e\n",sum);

}doublefact(intn){

inti;doubleresult=1;

for(i=1;i<=n;i++)result=result*i;returnresult;}调用fact(i)函数函数调用函数声明函数定义嵌套循环for(i=1;i<=100;i++){

item=i!sum=sum+item;}for(i=1;i<=100;i++){

item=1;

for(j=1;j<=i;j++)item=item*j;sum=sum+item;}#include<stdio.h>voidmain(){ inti,j; doubleitem,sum=0;

for(i=1;i<=100;i++){

item=1;//阶乘变量初值置1

for(j=1;j<=i;j++)item=item*j;//内循环计算i!

sum=sum+item; }

printf("1!+2!+3!+…+100!=%e\n",sum);}嵌套循环内层循环的初始化for(i=1;i<=100;i++){

item=1;

for(j=1;j<=i;j++) item=item*j;sum=sum+item;}求1!+2!+….+100!item=1;for(i=1;i<=100;i++){for(j=1;j<=i;j++)item=item*j;sum=sum+item;}求1!+1!*2!+……+1!*2!*……*100!分析功能?分析嵌套循环的执行过程for(i=1;i<=100;i++){

item=1;

for(j=1;j<=i;j++)

item=item*j;sum=sum+item;}外层循环变量i的每个值内层循环变量j变化一个轮次;内外层循环变量不能相同分别用i

和j执行规律:for(i=1;i<=100;i++)

进一步分析执行规律:for(j=1;j<=i;j++) printf("%d%d\n",i,j);改写程序:

P96练习6-8#include<stdio.h>voidmain(){ inti,j; doubleitem,sum=0;//item存放阶乘

for(i=1;i<=100;i++){

item=1;//阶乘变量初值置1

for(j=1;j<=i;j++) //内层循环计算item=i!

item=item*j; sum=sum+item; }

printf("1!+2!+3!+…+100!=%e\n",sum);}求1!+2!+….+100!内外层循环变量不能相同。

内循环必须被包含在外循环的循环体中,不允许出现内外层循环体交叉的情况。

嵌套循环的说明do{ while(){ ……}while();}5.6循环结构程序设计循环程序的实现要点:思考两个问题循环体:归纳出需要反复执行的操作循环条件:反复操作执行的条件选用合适的循环语句forwhiledo-while选择原则事先给定循环次数:首选for通过其他条件控制循环:考虑while或do-while5.6循环结构程序设计应用举例【例5-12】编程:评定一批学生的成绩等级。学生成绩从键盘输入。成绩等级评定标准如下:

A:90及以上 B:[80,89]

C:[70,79] D:[60,69]

E:60以下问题分析与算法设计(一)方法:逐个评定一批学生成绩等级,需要使用循环结构。由于学生人数不定,即循环次数不明确,因此应选用while或do-while结构。循环条件:输入成绩不小于0,即score>=0。循环体:输入成绩、评定等级。【例5-12】评定一批学生的成绩等级。问题分析与算法设计(二)第一步:输入第一个学生成绩=>score;第二步:逐个评定成绩等级。用类while结构描述如下:

while(score>=0){

根据score,多分支评定成绩等级;

输入下一个成绩=>score; }进一步分析:如何实现成绩等级评定?【例5-12】评定一批学生的成绩等级。问题分析与算法设计(三)进一步分析:如何实现成绩等级评定?switch处理:score在[0,100]间,score/10在[0,10]区间,根据score/10的值来确定成绩等级。规则如下:

9,10:A;

8:B;

7:C;

6:D;

0、1、2、3、4、5:E;

其他:输入错误。【例5-12】评定一批学生的成绩等级。#include<stdio.h>voidmain(){ intscore;

printf("请输入一批学生成绩:");scanf("%d",&score); /*输入第一个学生成绩*/ while(score>=0){ /*循环条件:score>=0*/ switch(score/10){ /*多分支评定成绩等级*/ case10:case9:printf("%d:A\n",score);break; case8:printf("%d:B\n",score);break; case7:printf("%d:C\n",score);break; case6:printf("%d:D\n",score);break; case0:case1:case2:case3:case4:case5: printf("%d:E\n",score);break; default:printf("%d:error!\n",score);break; }scanf("%d",&score); /*输入下一个学生的成绩*/ }}源程序-评定一批成绩等级。5.6循环结构程序设计应用举例【例5-13】编程:输出[100,999]范围内所有的“水仙花数”并计算个数。水仙花数:满足各数位上数字的立方和等于本身的整数。例如:153是“水仙花数”,因为153=13+53+33。问题分析与算法设计(一)方法:逐个判定[100,999]间的“水仙花”数并计数,需要使用循环结构。让i从100到999按递增1变化,针对每个i值,求i的各数位上数字的立方和,并判断是否等于i本身,若相等,则输出i并且计数。循环条件:i<1000。循环体:

求整数i的各数位上数字的立方和;

判断i是否“水仙花”数;

例5-13:求[100,999]间所有“水仙花数”并计数问题分析与算法设计(二)第一步:设置计数器count初值为0;第二步:输出[100,999]间所有“水仙花数”并计数。用for结构 描述如下: for(i=100;i<1000;i++){

求整数i的各数位上数字的立方和sum;

若sum等于i,则输出i并且count加1; }第三步:输出计数结果count。进一步分析:如何求整数n的各数位上数字的立方和?

例5-13:求[100,999]间所有“水仙花数”并计数问题分析与算法设计(三)进一步分析:如何求整数n的各数位上数字的立方和?设置累加和变量s初值:s=0;

逐位分离n各数位上的数,直到n等于0。用while结构描述: while(n!=0){

求n的末位数d:d=n%10;

累加d的立方和:s=s+d*d*d;

去掉n的末位数:n=n/10; }显然:二重循环结构,外循环选用for,内循环选用while。例5-13:求[100,999]间所有“水仙花数”并计数#include<stdio.h>voidmain(){ inti,s,n,d,count=0; /*count:计数变量*/ printf("输出[100,999]范围内所有的“水仙花数:"); for(i=100;i<1000;i++){ /*外循环变量i从100变化到999*/ s=0;n=i; /*累加和s赋0,i赋给n*/ while(n!=0){ /*内循环求n的各数位数字的立方和*/ d=n%10; /*取该数的末位数*/s=s+d*d*d; /*累加立方和*/n=n/10; /*去掉n的末位数*/ }if(s==i){printf("%d",i);count++;} /*则输出i并计数个数*/ } printf("\n共%d个\n",count);}源程序-求“水仙花”数。5.6循环结构程序设计应用举例【例5-14】编程:求100以内的全部素数,且每行输出10个。素数:只能被1和自身整除的整数。1不是素数,2是素数。问题分析与算法设计(一)方法:针对100以内的每个整数i,逐一判断i是否素数,若i是素数,则输出i并计数。需用循环结构。循环条件:i<=100。整除判定:需要“%”运算符。【例5-14】求100以内全部素数,每行输出10个。问题分析与算法设计(二)第一步:设置素数个数计数器变量count初值为0;第二步:输出100内的全部素数并计数个数:用类for描述为: for(i=2;i<=100;i++){

判定i是否素数?

若i是素数,则:

输出i、计数count;

若count是10的倍数,则换行; }进一步分析:素数的判定问题?

【例5-14】求100以内全部素数,每行输出10个。问题分析与算法设计(三)进一步分析:素数判定问题?算法描述如下:

设置标志变量flag初值:flag=0;

判定i是否素数:用类for结构描述为: for(j=2;j<i;j++) if(i%j==0){

flag=1;

break;

}【例5-14】求100以内全部素数,每行输出10个。

显然:flag是素数标记,

flag=0,素数

flag=1,非素数voidmain(){ intj,j,count=0,flag;; /*count:计数变量*/ printf(“输出100内全部素数:"); f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论