第四章循环结构程序设计循环就是在给定的条件成立时反复执行某一程序段,被反复执行的程序段称为循环体。在C语言中可以用以下语句来实现循环:1.用while语句;2.用do--while语句;3.用for语句;4.用goto语句和if语句构成循环。×19:1419:141while语句while语句的形式:while(表达式){循环体;}while语句常称为“当型”循环语句。真(非零)表达式循环体假(零)19:14循环结构程序示例一要求:用while循环求1+2+3+…+100。求“和”问题解题思路分析:方案1:单独保存每个数,最后将它们加起来为最终和;方案2:存储当前值和当前和,将当前值加入当前和,直至所有的数相加。19:14例用while循环求#includestdio.hvoidSum(){inti=1,sum=0;while(i=100){sum=sum+i;i++;}printf(%d,sum);}赋初值i是当前值sum是当前和循环终值循环变量(当前值)增值循环条件循环体19:14要求:统计输入字符的个数,并统计其中有多少个字符‘a’,用回车结束字符输入。反复执行输入字符cC不是回车字符个数n++c是‘a’‘a’个数i++输出统计结果结束否是是否输入字符c循环结构程序示例二19:14参考程序voidDoStatistics(){charch;intnum=0,count=0;ch=getchar();while(ch!='\n'){num++;if(ch==‘a’)count++;ch=getchar();}printf(num=%d\n,num);printf(“count=%d\n,count);}while(表达式)后面没有分号。输入数据,为第一次判断做准备判断输入是否结束判断是否为字符‘a’变量在判断前,必须要有明确的初值。循环体中一般有改变条件表达式的语句。19:14do—while语句:do{循环体;}while(表达式);真(非零)表达式循环体假(零)2do--while语句19:14循环结构程序示例要求:编写程序统计从键盘输入的一行字符的个数(包括回车键)。#includestdio.hvoidTestDoWhile(){charch;intnum=0;do{ch=getchar();num++;}while(ch!='\n');printf(num=%d\n,num);}如果要求字符数不包括回车键?19:14比较while和do~while:后者的“循环体”至少执行一次voidtest_Dowhile(){charch;intnum=0;do{ch=getchar();num++;}while(ch!='\n');printf(num=%d,num);}voidtest_while(){charch;intnum=0;ch=getchar();while(ch!='\n'){num++;ch=getchar();}printf(num=%d,num);}19:14注意:在if、while语句中,表达式后面都没有分号,而在do-while语句的表达式后面则必须加分号。19:143for语句for语句:for(初始表达式1;条件表达式2;循环表达式3){循环体;}表达式1:用于循环开始前为循环变量设置初始值。表达式2:控制循环执行的条件,决定循环次数。表达式3:循环控制变量修改表达式。循环体语句:被重复执行的语句。19:14表达式3计算表达式1循环体判断表达式2零非零for的下一条语句执行过程:19:14循环结构程序示例五用for循环求/*用for语句实现*/voidSum(){inti,sum=0;for(i=1;i=100;i++){sum+=i;}printf(%d,sum);}/*用while语句实现*/voidSum(){inti=1,sum=0;while(i=100){sum=sum+i;i++;}printf(%d,sum);}19:14for语句一般应用形式:for(循环变量赋初值;循环条件;循环变量增值){循环体语句;}说明:for语句可以转换成while结构expr1;/*循环变量赋初值*/while(expr2)/*循环条件*/{循环体语句;expr3;/*循环变量增值*/}19:14for语句的省略形式for语句中expr1,expr2,expr3类型任意,都可省略,但分号;不可省无限循环:for(;;)19:14例:#includestdio.hmain(){inti=0;for(i=0;i10;i++)putchar(‘a’+i);}运行结果:abcdefghij例:#includestdio.hmain(){inti=0;for(;i10;i++)putchar(‘a’+i);}19:14选择三种循环的一般原则如果循环次数已知,用for如果循环次数未知,用while如果循环体至少要执行一次,用do-while这只是“一般”原则,不是“原则”单重循环常用于累加求和、累乘求积、数据分类统计这类问题。课后作业例:先由计算机“想”一个1到100之间的数请人猜,如果猜对了,则结束游戏,否则计算机给出提示,告诉人所猜的数是太大还是太小,直到猜对为止。计算机记录猜的次数,以此来反映猜数者“猜”的水平。算法设计step1:通过调用随机函数任意“想”一个数magicstep2:将记录猜数次数的计数器count初始化为0step3:输入人猜的数guessstep4:计数器变量count增1step5:如果guess大于magic,则给出“错误,太大!”的提示信息;如果guess小于magic,则给出“错误,太小!”的提示信息。step6:如果guess不等于magic,则重复执行step3到step5,直到guess等于magic为止,给出“正确”的提示信息后转去执行step7。step7:打印人猜的次数count猜数游戏用到的库函数随机函数rand()#includestdlib.hmagic=rand();//产生[0,32767]之间的随机数magic=rand()%b;//产生[0,b-1]之间的随机数magic=rand()%b+a;//产生[a,a+b-1]之间的随机数随机函数srand为函数rand()设置随机数种子来实现对函数rand所产生的伪随机数的“随机化”通过键入随机数种子,产生[0,100)之间的随机数scanf(%u,&seed);srand(seed);magic=rand()%100;使用计算机读取时钟值并把该值自动设置为随机数种子,产生[0,100)之间的随机数函数time()返回以秒计算的当前时间值,该值被转换为无符号整数并用作随机数发生器的种子#includetime.hsrand(time(NULL));magic=rand()%100;19:14(1)while(){……while(){……}…...}(2)do{……do{……}while();…...}while();(3)while(){……do{……}while();…….}(4)for(;;){……do{……}while();……while(){……}…...}内循环外循环内循环4循环结构的嵌套三种循环可互相嵌套,层数不限使用嵌套的循环体时,应注意以下问题在嵌套的各层循环体中,使用复合语句(即用一对大花括号将循环体语句括起来)保证逻辑上的正确性内层和外层循环控制变量不应同名,以免造成混乱嵌套的循环最好采用右缩进格式书写,以保证层次的清晰性循环嵌套不能交叉,即在一个循环体内必须完整的包含着另一个循环voidtest_nestedloop(){inti,j;for(i=0;i3;i++)//外层循环开始{printf(i=%d:\t,i);for(j=0;j4;j++)//内层循环开始{printf(j=%d\t,j);}//内层循环结束printf(\n);}//外层循环结束}19:1419:14循环嵌套的应用——变换图形矩形“九九表”三角形“九九表”19:14问题:编写程序,打印九九表1234567891234567892468101214161836912151821242791827364554637281……………..ijvoidprint_99(){inti,j;for(i=1;i10;i++)printf(%4d,i);printf(\n---------------------------------------\n);for(i=1;i10;i++){for(j=1;j10;j++)printf(%4d,i*j);putchar('\n');}}19:14printfj++j=1j10真(非0)假(0)for(i=1;i10;i++){for(j=1;j10;j++)printf(%4d,i*j);putchar('\n');}外循环:共打印9行i10假(0)真(非0)i=1i++内循环:打印一行19:14打印九九表的优化版执行效果19:14打印九九表的优化版流程的转移控制break语句continue语句19:145break语句和continue语句break语句:(1)语句形式:break;(2)作用:结束break所在的switch语句。结束当前循环,跳出break所在的循环结构。19:14例:求300以内能被17整除的最大的数。#includestdio.hvoidTestBreak(){intx,k;for(x=300;x=1;x--)if(x%17==0)break;printf(x=%d\n,x);}找到满足条件的最大数,结束循环19:14continue语句:(1)语句形式:continue;(2)语句作用:强制结束本次循环------并不跳出循环体,而是继续执行下一次循环的条件判断。19:14求300以内能被17整除的所有整数#includestdio.hvoidTestContinue(){intx,k;for(x=1;x=300;x++){if(x%17!=0)continue;printf(%d\t,x);}}此数不能被17整除,开始下一次循环输入一个整数,判断它是否是素数假真假真开始输入mmki=2i=km被i整除输出m不是素数输出m是素数结束i=i+1#includemath.hTestPrimeNumber(){intm,i,k;printf(Pleaseenteranumber:);scanf(%d,&m);k=sqrt(m);for(i=2;i=k;i++){if(m%i==0)break;}if(ik)printf(Yes!\n);elseprintf(No!\n);printf(Programisover!\n);}Pleaseenteranumber:6Programisover!No!#includemath.hTestPrimeNumber2(){intm,i,k,flag=1;/*标志变量flag初值置为1*/printf(Pleaseenteranumber:);scanf(%d,&m);k=sqrt(m);for(i=2;i=k&&flag;i++){if(m%i==0)flag=0;}if(flag)printf(Yes!\n);elseprintf(No!\n);printf(Programisover!\n);}方法2补充:单个字符的输入函数getch(),getche()c=getche();c=getch();•功能:从键盘上读入一个字符,但输入后无需回车。【例】#includestdio.h#includeconio.hvoidTestGetch(){chari=’y’;while(i==’y’||i==’Y’){printf(“您好!是否继续?(y/n)\n”);i=getch();}/*见注*