《循环结构流程及应用.ppt》由会员分享,可在线阅读,更多相关《循环结构流程及应用.ppt(58页珍藏版)》请在三一办公上搜索。
1、第四章 循环结构流程及应用,第一节 While语句的流程及应用第二节 do-While语句的流程及应用 第三节 for语句的流程及应用 第四节 循环的嵌套 第五节 break语句和continue语句 第六节 项目任务:软件用户界面设计再优化,第一节 While语句的流程及应用,许多实际问题往往需要有规律地重复某些操作,相应的操作在计算机程序中就体现为某些语句的重复操作,这就是循环。循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。,While语句的一般格式while(表达式)循环体语句;其执
2、行流程如图4.1所示。首先计算表达式的值,如果表达式的值非0(真),执行循环体语句,然后重新计算机表达式的值,并再次判断值是否为真,如为真,再执行循环体内的语句。如此循环往复,直到表达式的值0(假)时退出循环,转去执行while循环结构的下一条语句。,说明:循环体有可能一次也不执行循环体可为任意类型语句语句是多个语句时,要用复合语句(用花括弧)应有使循环趋向于结束的语句。下列情况,退出while循环条件表达式不成立(为零)循环体内遇 break,return,goto无限循环:while(1)循环体;,【案例4-1】求 S=1+2+3+99+100 的值,从上面的分析可以看出,这个问题可以通过
3、进行多次加法运算完成,并且加数的变化是有规律的。因此,使用循环结构来解决这个问题。现在,我们需要解决两个问题:如何提供所需的加数,如何计算累加和。提供加数比较简单,设置一个变量i,使i的初值为1,每循环一次使i增加1,当i的值超过100时就结束循环;计算累加和较复杂,设置一个变量s来存放100个数的累加和,s的初值为0。先计算0与1的和,把结果存放在s中(用s=s+1实现);再把s与2相加,结果仍然存放在s中(用s=s+2实现);以此类推,一直到计算出100个加数的和为止。流程图如图4.2所示。,#include main()int i,s=0;/*s存放累加和*/i=1;while(i=10
4、0)s=s+i;i+;printf(n1+2+3.+100=%d,s);【注意】while后面的括号()不能省略,括号内表达式可以是任意类型的表达式,如条件表达式、逻辑表达式、算术表达式、常量等,但一般是条件表达式或逻辑表达式,表达式的值是循环的控制条件。,循环体如果包含一个以上的语句,应该用左右花括号“”括起来,以复合语句形式出现。如果不加“”,则while语句的范围只到while后面第一个分号处。例如,本例中whi1e语句中如无“”,则while语句范围只到“sum=sum+i;”。【思考】如果将while后花括号“”去掉,结果会怎样?,以上程序的循环部分还可以改为以下形式:,形式一:s=
5、1;n=2;While(n=100)s=s+n;n=n+1;,形式二:s=1;n=1;While(n100)n=n+1;s=s+n;,通过以上三种形式比较,我们可以看到在循环结构中,初值(包括循环变量的初值和计算结果初值等)与循环条件是相互影响的,所以为了避免出错,可以通过验算循环结构开始和结束的运行状态,如上例中代入n=1、n=2以及n=99、n=100,进一步判断是否合要求。习惯上,累计求和的初值为0,累计求积的初值为1,所以推荐原程序的形式。,在循环结构设计中,特别需要注意的是:避免死循环。循环体中必须有改变条件的语句,并且可以使程序执行到某一时刻不满足这个条件而结束循环。Ctrl+br
6、eak练习1:从键盘输入n,求1+2+n的结果并输出。,练习2:求5!的阶乘,#includemain()int p=1,i=1;while(i=5)p=p*i;i+;printf(%dn,p);,int count=0;printf(input a string:n);while(getchar()!=n)count+;,以下程序段的功能是什么?循环结束后,count代表什么含义?,【案例4-2】输入20个学生的C语言课程考试成绩,求最高成绩和最低成绩。分析:这是一个求最大值和最小值的问题,用“打擂台”的思路来解决。打擂台时,有一个人先站在台上,第二个人上台与之比武,胜者留在台上,败者下台。
7、第三个人再上台与刚才的胜者比武,胜者留在台上。直到比完19次,此时留在台上的就是20个人中的优胜者。现在用同样的办法找20个数中的最大者。先输入一个数,把它放到变量MAX中,然后输入第二个数并与MAX比较,如果第二个数大于MAX,则由第二个数取代MAX的值。如此输入和比较19次,每次比较后,大者均放在MAX中,最后MAX中的值就是20个数中的最大者。同样,求最小值的办法类似。,#include main()int i,max,min,x;i=1;max=0;min=100;while(i=max)max=x;if(x=min)min=x;i+;printf(n 最高分数为%d:,max);pr
8、intf(n 最低分数为%d:,min);【试一试】在上例中,如果要同时求出C语言课程成绩的总分和平均分,应如何修改程序?,第二节 do-While语句的流程及应用,do-while循环结构与while循环结构不一样,它先执行循环体语句,而后判断循环条件,它的一般形式如下:do 循环体语句;while(表达式);,其执行流程如图4.5所示。首先执行循环体语句,再判断循环条件,若表达式值非0(真),那么再次执行循环体语句。每执行一次后,都判断一次循环条件。如此循环往复,直到表达式的值0(假)时退出循环,转去执行while循环结构的下一条语句。,【案例4-4】利用do-while语句求1+2+3+
9、.+99+100的和。#include main()int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(n1+2+3.+100=%d,sum);【说明】案例4-4是将案例4-1改写成do-while语句,这两个案例的循环体相同,循环条件相同,输出结构相同。可以发现在循环条件第一次都为真的情况下,while语句和do-while语句可以互换,功能相同。,【案例4-5】每个苹果0.8元,第一天买2个苹果,第二天开始,每天买前一天的2倍,直到购买的苹果个数达到不超过100的最大值。编写程序求每天平均花多少钱?,#include main()int
10、day=0,buy=2;float sum=0.0,ave;do sum+=0.8*buy;day+;buy*=2;while(buy=100);ave=sum/day;printf(每天平均花钱:%f,ave);【注意】在do-while结构中,while(表达式)后的“;”不能省略。,第三节 for语句的流程及应用,用while语句可以实现循环结构,但是它必须明确地给出继续执行循环的条件(如n100),而在许多情况下,人们给出的往往是执行循环的次数,如统计100人的平均工资、求一个学生5门课的总成绩等,这时用C语言中的for语句更为灵活方便。for语句不仅可以用于循环次数已经确定的情况,而
11、且可以用于循环次数不确定而只给出循环结束条件的情况。,for(表达式1;表达式2;表达式3)循环体语句;上面“表达式1”一般是一个赋值表达式,用来给循环控制变量赋初值;而“表达式2”一般是一个关系表达式或逻辑表达式,用来决定什么时候退出循环;“表达式3”一般是个算术表达式,定义循环控制变量每循环一次后按什么方式变化。这三个部分之间用分号(;)间隔。例如:,for(i=1;i 100时,结束循环。,for循环结构的执行流程,案例4-6流程,从图4.7中可以看出,for语句执行过程如下:(1)求解表达式1。(2)求解表达式2,若其值为真(非0),则执行循环体中的语句,然后执行下面第(3)步;若其值
12、为假(0),则结束循环,转至第(5)步。(3)求解表达式3。(4)转至第(2)步继续执行。(5)循环结束,执行for语句下面的一个语句。,for(循环变量赋初值;循环条件;循环变量增值),例如:for(i=1;i=100;i+)sum=sum+i;,相当于:i=1;while(i=100)sum=sum+i;i+;,说明:(1)for语句的一般形式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如 for(;i=100;i+)sum=sum+i;执行时,跳过“求解表达式1”这一步,其他不变。,(2)如果表达式2省略,即不判断循环条件,循
13、环无终止地进行下去。也就是认为表达式2始终为真。例如:for(i=1;i+)sum=sum+i;表达式1是一个赋值表达式,表达式2空缺。它相当于:i=1;while(1)sum=sum+1;i+;,(3)表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如:for(i=1;i=100;)sum=sum+i;i+;在上面的for语句中只有表达式1和表达式2,而没有表达式3。i+的操作不放在for语句的表达式3的位置处,而作为循环体的一部分,效果是一样的,都能使循环正常结束。,(4)可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如:for(;i=100;)sum=sum
14、+i;i+;相当于 while(i=100)sum=sum+i;i+;在这种情况下,完全等同于while语句。可见for语句比while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。,(5)3个表达式都可省略,如:for(;)语句相当于 while(1)语句 即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止地执行循环体。,【案例】利用for 语句求1+2+3+.+99+100的和。#include main()int i,sum;for(i=0,sum=0;i=100;i+)sum=sum+i;printf(n1+2+3.+100=%d,sum);
15、,【案例】打印并输出所有的水仙花数,所谓水仙花数是指一个三位数,其各位数的立方和等于数本身,如153=13+53+33,所以153是一个水仙花数。,#include main()int m,n,a,b;for(m=100;m1000;m+)n=m/100;a=m%100/10;b=m%10;if(m=n*n*n+a*a*a+b*b*b)printf(%dn,m);printf(n);,【案例】编写程序,判定给定的自然数是否为素数。分析:如果一个自然数除了1和它本身外不能被其他整数整除,则该自然数就称为素数。例如2、3、5、7、.。根据定义,测试自然数k能否被2、3、.、k-1整除,只要能被其中
16、一个整除,则k就不是素数,否则是素数。在程序中设立了flag标志,flag为0时,k不是素数,flag不为0时,k就是素数。,#include main()int i,k,flag;printf(请输入一个自然数:);scanf(%d,第四节 循环的嵌套,一个循环体内又包含另外一个循环语句,称为循环的嵌套。循环嵌套时,外层循环执行一次,内层循环从头到尾执行一遍.3种循环(while循环、do-while循环和for循环)不仅可以自身嵌套,而且还可以互相嵌套。,下面几种都是合法的形式:,(1)while()(2)do(3)for(;)while()do for(;)while();while()
17、;,(4)while()(5)for(;)(6)do do while()for(;)while()while(),【案例】编写程序,输出如下图案:,分析:这是一个图形输出的问题,可以用双重循环来解决。每一个“*”的位置由行和列来确定。外循环用来控制打印的行数,因需输出4行,外循环变量i从1变化到4;内循环用来控制每一行打印的列数(即每一行的“*”数),行数与字符个数的对应关系如表所示。,显然,对于第i列而言,共有(2i-1)个“*”号。所以,内循环变量j从1变化到2i-1。#include main()int i,j,k;for(i=1;i=4;i+)for(j=1;j=2*i-1;j+)p
18、rintf(*);printf(n);,分析:与第(1)题不同的是各行输出时的起始位置在变化,需要用到空格“”进行光标的定位,行数、空格个数与字符个数的对应关系如表4.2所示。显然,对于第i列而言,有(5-i)个空格,有(2i-1)个“*”号。,#include main()int i,j,k;for(i=1;i=5;i+)for(j=1;j=5-i;j+)printf();for(k=1;k=2*i-1;k+)printf(*);printf(n);,【试一试】编写程序,输出以下图案(提示:用两个双重循环完成)。,【案例】成绩统计。输入一批学生的语文、数学和英语成绩,要求计算出每个学生的总分
19、、平均分,以及学生的最高总分、最低总分,并根据平均分输出及格人数和不及格人数。,#include main()int n,score,sum,max,min;int n1=0,n2=0;/*n1存放不及格人数,n2存放及格人数*/int i,j;float average;printf(输入学生人数:);scanf(%d,if(i=1)max=min=sum;if(sum max)max=sum;if(sum min)min=sum;average=sum/3.0;if(average60)n1+;else n2+;printf(学生%d的总分为:%d,平均分为%.2fn,i,sum,aver
20、age);printf(nn最高总分为:%d,最低总分为:%d,max,min);printf(nn平均分及格的人数为:%d,n2);printf(nn平均分不及格的人数为:%d,n1);,第五节 break语句和continue语句,一、break语句在3.3节中已经介绍过用break语句使程序流程跳出switch结构,继续执行switch语句下面的一个语句。实际上,break语句还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。break语句的一般形式为:break;其执行过程是:在循环语句中如果执行到break语句,则终止break所在循环的执行,循环体中break
21、语句之后的语句也不再执行。通常break语句总是与if语句联用,即满足条件时便跳出循环。,二、continue语句continue语句的作用是结束本次循环,即跳过循环体中下面尚未执行的语句,直接进行下一次是否执行循环判定。continue语句的一般形式为:continue;其执行过程是:如果在循环体语句的执行过程中遇到并执行了continue语句,那么系统将跳过循环体中剩余的语句而强制执行下一次循环。continue语句常与if条件语句一起使用。,break语句与continue语句的区别:continue是结束本次循环,进行下一次循环,而不是结束整个循环过程。对单层循环,break语句是结束
22、整个循环,转到循环体外;对于多层循环,则是结束最内层循环。,把100200之间的不能被3整除的数输出。#include main()int n;for(n=100;n=200;n+)if(n%3=0)continue;printf(%d,n);,【案例4-12】输入30个学生的成绩,将不及格的学生成绩输出,并求及格学生的平均成绩。分析:在进行循环时,检查学生的成绩,把其中不及格的成绩输出,然后跳过后面总成绩的累加和求平均成绩的语句。用continu语句即可处理此问题。,#include main()float score,sum=0,average;int i,n=0;for(i=1;i=30
23、;i+)/printf(n请输入第%d个学生成绩:,i);scanf(%f,第六节 项目任务:软件用户界面设计再优化,【项目案例】“学生成绩管理系统”软件用户界面设计再优化分析:在上一章的设计中,用户在主菜单中选择某功能并执行后,将退出程序。很明显,这不符合用户的使用习惯,这一章中我们将利用循环语句中加以改进。即用户选择某功能并执行后,还能继续在主菜单中选择其它操作,直到用户选择退出程序。程序如下:#include#include/*包含杂项函数及内存分配函数*/main()char func_code,reply;/*存放选择功能模块编号*/do system(cls);/*清屏*/,pri
24、ntf(欢迎使用学生成绩管理系统 n);printf(*n);printf(*=*n);printf(*=1.输入 2.修改=*n);printf(*=3.删除 4.查找=*n);printf(*=5.显示 6.退出=*n);printf(*=*n);printf(n请选择功能编号进入系统-);func_code=getchar();switch(func_code)/*用户选择不同的功能,进入不同的功能模块*/case 1:printf(nn你正使用学生成绩输入子系统nn);break;,case 2:printf(nn你正使用学生成绩修改子系统nn);break;case 3:printf(nn你正使用学生成绩删除子系统nn);break;case 4:printf(nn你正使用学生成绩查找子系统nn);break;case 5:printf(nn你正使用学生成绩显示子系统nn);break;case 6:exit(0);default:continue;/*switch语句结束*/printf(nn还要继续使用吗(Y/N or y/n)?);scanf(%c,