C语言程序设计课件:循环结构流程及应用_第1页
C语言程序设计课件:循环结构流程及应用_第2页
C语言程序设计课件:循环结构流程及应用_第3页
C语言程序设计课件:循环结构流程及应用_第4页
C语言程序设计课件:循环结构流程及应用_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

循环结构流程及应用第一节While语句的流程及应用第二节do-While语句的流程及应用第三节for语句的流程及应用第四节循环的嵌套第五节break语句和continue语句第六节项目任务:软件用户界面设计再优化第一节While语句的流程及应用许多实际问题往往需要有规律地重复某些操作,相应的操作在计算机程序中就体现为某些语句的重复操作,这就是循环。循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。While语句的一般格式while(表达式){循环体语句;}

其执行流程如图4.1所示。首先计算表达式的值,如果表达式的值非0(真),执行循环体语句,然后重新计算机表达式的值,并再次判断值是否为真,如为真,再执行循环体内的语句。如此循环往复,直到表达式的值0(假)时退出循环,转去执行while循环结构的下一条语句。【案例4-1】求S=1+2+3+……+99+100的值分析:这是一个计算100个数累加和的问题。首先,分析加数的变化规律,加数从1变化到100。第一个加数是1,后一个加数比前一个加数增加1,最后一个加数是100。在实际生活中我们通常用心算来解决这类问题,即首先计算前两个加数的和,然后使用求得的和与第三个加数相加。从上面的分析可以看出,这个问题可以通过进行多次加法运算完成,并且加数的变化是有规律的。因此,使用循环结构来解决这个问题。现在,我们需要解决两个问题:①如何提供所需的加数,②如何计算累加和。提供加数比较简单,设置一个变量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<stdio.h>voidmain(){inti,s=0;/*s存放累加和*/i=1;while(i<=100){s=s+i;i++;}printf("\n1+2+3....+100=%d",s);}【注意】①while后面的括号()不能省略,括号内表达式可以是任意类型的表达式,如条件表达式、逻辑表达式、算术表达式、常量等,但一般是条件表达式或逻辑表达式,表达式的值是循环的控制条件。②循环体如果包含一个以上的语句,应该用左右花括号“{}”括起来,以复合语句形式出现。如果不加“{}”,则while语句的范围只到while后面第一个分号处。例如,本例中whi1e语句中如无“{}”,则while语句范围只到“sum=sum+i;”。【思考】如果将while后花括号“{}”去掉,结果会怎样?【案例4-2】输入20个学生的C语言课程考试成绩,求最高成绩和最低成绩。分析:这是一个求最大值和最小值的问题,用“打擂台”的思路来解决。打擂台时,有一个人先站在台上,第二个人上台与之比武,胜者留在台上,败者下台。第三个人再上台与刚才的胜者比武,胜者留在台上。……直到比完19次,此时留在台上的就是20个人中的优胜者。现在用同样的办法找20个数中的最大者。先输入一个数,把它放到变量MAX中,然后输入第二个数并与MAX比较,如果第二个数大于MAX,则由第二个数取代MAX的值。如此输入和比较19次,每次比较后,大者均放在MAX中,最后MAX中的值就是20个数中的最大者。同样,求最小值的办法类似。其流程图如图4.3所示。#include<stdio.h>voidmain(){inti,max,min,x;i=1;max=0;min=100;while(i<=20){printf("\n请输入第%d个学生的成绩:",i);scanf("%d",&x); if(x>=max)max=x; if(x<=min)min=x;i++;}printf("\n最高分数为%d:",max);printf("\n最低分数为%d:",min);}【试一试】在上例中,如果要同时求出C语言课程成绩的总分和平均分,应如何修改程序?【案例4-3】编写程序,计算满足:12+22+32+……+n2<1000的最大n值。分析:这是一个计算累加和的问题,提供加数和计算累加和的方法与案例4-1相似。区别是本例中加数的终止值末知,但循环终止条件明确,即累加和>=1000。因此设置变量isum,其初值为0,执行循环的条件为s<1000。设置变量i,在循环体中利用语句i++产生1,2,3,……等数。其流程图如图4.4所示。#include<stdio.h>voidmain(){inti=0,isum=0;while(isum<1000){i++;isum+=i*i;}printf("\nn=%d",i-1); printf("\n和为%d",isum-i*i);}【思考】若将语句i++和isum+=i*i互换,会产生什么结果,为什么?第二节do-While语句的流程及应用do-while循环结构与while循环结构不一样,它先执行循环体语句,而后判断循环条件,它的一般形式如下:do{

循环体语句;}while(表达式);其执行流程如图4.5所示。首先执行循环体语句,再判断循环条件,若表达式值非0(真),那么再次执行循环体语句。每执行一次后,都判断一次循环条件。如此循环往复,直到表达式的值0(假)时退出循环,转去执行while循环结构的下一条语句。图4.5do-while循环结构执行流程【案例4-4】利用do-while语句求1+2+3+...+99+100的和。#include<stdio.h>voidmain(){inti,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语句可以互换,功能相同。【试一试】尝试用do-while语句改写案例4-2和案例4-3。【案例4-5】每个苹果0.8元,第一天买2个苹果,第二天开始,每天买前一天的2倍,直到购买的苹果个数达到不超过100的最大值。编写程序求每天平均花多少钱?#include<stdio.h>main(){intday=0,buy=2;floatsum=0.0,ave;do{sum+=0.8*buy;day++; /*第day天买了buy个苹果,已共花费sum元*/buy*=2; /*下一天将买的苹果数修改为当天的2倍*/}while(buy<=100); /*将买的苹果数不超过100,则可继续买并入帐*/ave=sum/day;printf("每天平均花钱:%f",ave);}【注意】在do-while结构中,while(表达式)后的“;”不能省略。第三节for语句的流程及应用用while语句可以实现循环结构,但是它必须明确地给出继续执行循环的条件(如isum<1000),而在许多情况下,人们给出的往往是执行循环的次数,如统计100人的平均工资、求一个学生5门课的总成绩等,这时用C语言中的for语句更为灵活方便。for语句不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况。for(表达式1;表达式2;表达式3)循环体语句;上面“表达式1”一般是一个赋值表达式,用来给循环控制变量赋初值;而“表达式2”一般是一个关系表达式或逻辑表达式,用来决定什么时候退出循环;“表达式3”一般是个算术表达式,定义循环控制变量每循环一次后按什么方式变化。这三个部分之间用分号(;)间隔。例如:for(i=1;i<=100;i++) sum=sum+i;先给i赋初值1,判断i是否小于等于100,若是则执行语句sum=sum+i,之后值增加1。再重新判断,直到条件为假,即i>100时,结束循环。其执行流程如图4.7所示从图4.7中可以看出,for语句执行过程如下:(1) 求解表达式1。(2) 求解表达式2,若其值为真(非0),则执行循环体中的语句,然后执行下面第(3)步;若其值为假(0),则结束循环,转至第(5)步。(3) 求解表达式3。(4) 转至第(2)步继续执行。(5) 循环结束,执行for语句下面的一个语句。for语句最简单的应用形式如下:for(循环变量赋初值;循环条件;循环变量增值)语句图4.7for循环结构的执行流程图4.8案例4-6流程【案例4-6】利用for语句求1+2+3+...+99+100的和。#include<stdio.h>main(){inti,sum;for(i=0,sum=0;i<=100;i++)sum=sum+i;printf("\n1+2+3....+100=%d",sum);}【试一试】尝试用for语句改写案例4-2和案例4-3。【案例4-7】打印并输出所有的水仙花数,所谓水仙花数是指一个三位数,其各位数的立方和等于数本身,如153=13+53+33,所以153是一个水仙花数。分析:#include<stdio.h>voidmain(){intm,n,a,b;for(m=100;m<1000;m++){n=m/100;a=m%100/10;b=m%10;if(m==n*n*n+a*a*a+b*b*b)printf("%d\n",m);}printf("\n");}

图4.9案例4-7流程【案例4-8】编写程序,判定给定的自然数是否为素数。分析:如果一个自然数除了1和它本身外不能被其他整数整除,则该自然数就称为素数。例如2、3、5、7、...。根据定义,测试自然数k能否被2、3、...、k-1整除,只要能被其中一个整除,则k就不是素数,否则是素数。在程序中设立了flag标志,flag为0时,k不是素数,flag不为0时,k就是素数。#include<stdio.h>main(){inti,k,flag;printf("请输入一个自然数:");scanf("%d",&k);flag=1;/*若flag标志等于0,则k不是素数,否则k是素数*/for(i=2;i<k;i++) /*循环中分别检测k能否被i整除,i=2,3,...,k-1*/if(k%i==0){flag=0;/*k能被i整除,k不是素数,令flag=0*/i=k;/*令i为k,使i<k不成立,其作用是退出循环*/}if(flag==1) printf("%d是素数\n",k);elseprintf("%d不是素数\n",k);}【思考】为了加快程序的执行速度,可以将for循环条件改为i<=sqrt(k),想一想为什么,如何修改程序?【案例4-9】成绩统计。输入一批学生的语文、数学和英语成绩,要求计算出每个学生的总分、平均分,以及学生的最高总分、最低总分,并根据平均分输出及格人数和不及格人数。#include<stdio.h>main(){intn,score,sum,max,min;intn1=0,n2=0;/*n1存放不及格人数,n2存放及格人数*/inti,j;floataverage;printf("输入学生人数:");scanf("%d",&n);printf("在对应的序号后输入每个学生每门课程的成绩\n");for(i=1;i<=n;i++){sum=0;printf("\n\n%10s%10s%10s%10s","学生序号","语文","数学","英语\n");printf("%8d",i);/*输出序号*/for(j=1;j<=3;j++){scanf("%d",&score);sum=sum+score;}if(i==1) max=min=sum;if(sum>max) max=sum;if(sum<min) min=sum;average=sum/3.0;if(average<60)n1++;elsen2++;printf("学生%d的总分为:%d,平均分为%.2f\n",i,sum,average);}printf("\n\n最高总分为:%d,最低总分为:%d",max,min);printf("\n\n平均分及格的人数为:%d",n2);printf("\n\n平均分不及格的人数为:%d",n1);}第四节循环的嵌套一个循环体内又包含另外一个循环语句,称为循环的嵌套。循环嵌套时,外层循环执行一次,内层循环从头到尾执行一遍.3种循环(while循环、do-while循环和for循环)不仅可以自身嵌套,而且还可以互相嵌套,【案例4-10】编写程序,输出如下图案:(1)(2)(1)分析:这是一个图形输出的问题,可以用双重循环来解决。每一个“*”的位置由行和列来确定。外循环用来控制打印的行数,因需输出4行,外循环变量i从1变化到4;内循环用来控制每一行打印的列数(即每一行的“*”数),行数与字符个数的对应关系如表4.1所示。表4.1

行字符个数11233547显然,对于第i列而言,共有(2i-1)个“*”号。所以,内循环变量j从1变化到2i-1。#include<stdio.h>#include<conio.h>main(){inti,j,k;for(i=1;i<=4;i++){for(j=1;j<=2*i-1;j++)printf("*");printf("\n");}getch();}行字符个数11233547行空格个数字符个数141233325417509表4.2表4.1(2)分析:与第(1)题不同的是各行输出时的起始位置在变化,需要用到空格“”进行光标的定位,行数、空格个数与字符个数的对应关系如表4.2所示。显然,对于第i列而言,有(5-i)个空格,有(2i-1)个“*”号。表4.2

行空格个数字符个数141233325417509#include<stdio.h>#include<conio.h>main(){inti,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");}getch();}【试一试】编写程序,输出以下图案(提示:用两个双重循环完成)。第五节break语句和continue语句一、break语句在3.3节中已经介绍过用break语句使程序流程跳出switch结构,继续执行switch语句下面的一个语句。实际上,break语句还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。break语句的一般形式为:

break;其执行过程是:在循环语句中如果执行到break语句,则终止break所在循环的执行,循环体中break语句之后的语句也不再执行。通常break语句总是与if语句联用,即满足条件时便跳出循环。【案例4-11】统计学生的平均成绩。已知班级人数不确定,但都不超过30人。请编一个能处理学生平均成绩的程序。分析:如果班级人数相同,问题比较简单,只需用一个for语句控制即可。但现在班级人数不确定,则设定一个输入负数作为结束标志,用break语句结束循环。可以约定,当输入的成绩是负数时,就表示本班数据已结束(一般情况下成绩不会是负数),计算出本班平均成绩。#include<stdio.h>main(){floatscore,sum=0,average;inti=1,n;while(1){printf("\n请输入第%d个学生的成绩:",i); scanf("%f",&score);if(score<0)break;/*如果输入负值,则跳出循环*/sum=sum+score; i=i+1;}n=i-1;/*学生数应是i-1*/average=sum/n;/*计算平均成绩*/printf("\n共有%d人,平均成绩为%7.2f分\n",n,average);}二、continue语句continue语句的作用是结束本次循环,即跳过循环体中下面尚未执行的语句,直接进行下一次是否执行循环判定。continue语句的一般形式为:continue;其执行过程是:如果在循环体语句的执行过程中遇到并执行了continue语句,那么系统将跳过循环体中剩余的语句而强制执行下一次循环。continue语句常与if条件语句一起使用。【案例4-12】输入30个学生的成绩,将不及格的学生成绩输出,并求及格学生的平均成绩。分析:在进行循环时,检查学生的成绩,把其中不及格的成绩输出,然后跳过后面总成绩的累加和求平均成绩的语句。用continu语句即可处理此问题。#include<stdio.h>main(){floatscore,sum=0,average;inti,n=0;for(i=1;i<=30;i++)/{printf("\n请输入第%d个学生成绩:",i);scanf("%f",&score);if(score<60)/*如不及格*/ {printf("Fail:%7.2f\n",score);continue;/*跳过下面的语句,结束本次循环*/}sum=sum+score;n=n+1;}average=sum/n;/*及格学生平均分数*/printf("\n及格学生人数为%d,平均成绩为%7.2f",n,average);}break语句与continue语句的区别:continue是结束本次循环,进行下一次循环,而不是结束整个循环过程。对单层循环,break语句是结束整个循环,转到循环体外;对于多层循环,则是结束最内层循环。第六节项目任务:软件用户界面设计再优化【项目案例】“学生成绩管理系统”软件用户界面设计再优化分析:在上一章的设计中,用户在主菜单中选择某功能并执行后,将退出程序。很明显,这不符合用户的使用习惯,这一章中我们将利用循环语句中加以改进。即用户选择某功能并执行后,还能继续在主菜单中选择其它操作,直到用户选择退出程序。程序如下:

温馨提示

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

评论

0/150

提交评论