知识准备任务引例----计算1+2+...+100。算法设计把每一个加数看成要投入的硬币数,第一次投了1枚硬币,第二次投了2枚硬币,…,第100次投了100枚硬币。定义一个变量s用来存放累加和,相当于存放硬币的容器,变量i代表加数(也可以看成累加次数),相当于投放的硬币数,见图3-1。s=s+i;/*投入i枚硬币到s中*/i=i+1;/*计算下次投币数*/图3-1算法设计示意图#includestdio.hvoidmain(){ints=0;//s用来存放累加和,初始值为0inti=1;//i用来存放累加次数,初值为1表示第一次相加while(i=100){s=s+i;//把数i累加到s中i++;//累加次数增1,i也是累加数}printf(“s=%d\n”,s);}输出结果s=5050程序清单3.1while语句用while语句实现的循环,其结构是当型循环结构,即先判断后执行循环体的循环结构,流程图如下图所示。做中学3-1从键盘输入n(n≥0)的值,计算并输出n!。算法设计程序中需要定义一个变量f用来存放连乘积,连乘积变量的初值通常被置成1,还需要定义一个变量i用来提供1~n个乘数。需要做的就是将这n个乘数循环乘入连乘积中。循环控制变量为i,初值是1;初始化部分:i=1;判断部分:i=n;循环体部分:f=f*i;迭代部分:i++;算法见右图。结束#includestdio.hvoidmain(){inti=1,n;//初始化部分doublef=1;printf(请输入变量n的值:\n);scanf(%d,&n);while(i=n){//判断部分f=f*i;//循环体部分i++;//迭代部分}printf(%d!=%le,n,f);}程序清单程序运行请输入变量n的值:3030!=2.652529e+032知识点while语句语法格式:while(表达式)语句其中,“语句”表示while循环结构中不断被重复执行的语句行,称为循环体。若循环体内有多条语句,则用花括弧引起来。while循环结构的功能:只要循环条件表达式成立(条件表达式为真),则执行循环体,直到表达式不成立(表达式为假)时结束循环。循环体可以为空语句、简单语句或复合语句。注意while语句中的表达式一般是关系表达式或逻辑表达式,只要表达式的值为真(非0)就继续循环(执行循环体中的语句);循环体中应该有使循环趋于结束的语句,否则出现死循环;while语句的循环体允许嵌套while结构,也可以允许多层循环嵌套;while结构中,判断部分若一开始条件就不成立,循环体一次都不执行。3.2do-while语句用do-while语句实现的循环,其结构是直到型循环结构。它的特点是先执行循环体,再判断循环条件是否成立,流程图如下图所示。做中学3-2用do-while语句计算1~100的和。算法设计程序中需要定义一个变量total用来存放累加和,累加和变量的初值通常被置成0,还需要定义一个变量n用来提供加数。需要做的就是将这100个加数循环加入累加和中。循环控制变量为n。初始化部分:n=1;判断部分:n=100;循环体部分:total=total*n;迭代部分:n++;算法见右图。#includestdio.hvoidmain(){intn=1,total=0;do{total=total+n;n++;}while(n=100);printf(total=%d,total);}输出结果total=5050当n的初值为102时,while后面的“表达式”一开始就为“假”,dowhile循环的循环体也被执行一次。程序清单知识点do-while语句语法格式:do{语句组}while(条件表达式);执行过程:先执行循环体语句一次,再判别表达式的值,若为真(非0),则继续循环,否则终止循环。一般用while和dowhile语句解决同一问题时,若两者的循环体部分一样,它们的结果也一样。但当while后面的“表达式”一开始就为“假”时,它们的结果就不一样。注意3.3for语句在C语言程序设计中,for循环结构使用最为灵活,不仅适用于循环次数已知的情况,也适用于循环次数不能确定、只能给出循环结束条件的情况,它完全可以替代while语句。做中学3-3用for语句实现求1~100的累加和。算法设计循环控制变量为k,s用来存放累加和。初始化部分:k=1;判断部分:k=100;循环体部分:s=s+k;迭代部分:k++;算法见右图。输出输出结果total=5050知识点for语句语法格式:for(表达式1;表达式2;表达式3)循环体语句;执行过程见右图说明3个表达式可以为任何表达式。表达式1通常为赋值表达式。表达式2作为循环控制条件。表达式3通常为赋值表达式。表达式1、3一般为简单表达式,也可以为逗号表达式3个表达式均可以省略或部分省略。但分号不能省循环的比较:几种循环一般可互相替代。for语句主要用于给定循环控制变量初值,步长增量以及循环次数确定的循环结构。循环次数及控制条件要在循环过程中才能确定的循环可用while或do-while语句。循环条件:while、do-while在while条件表达式中指定,for循环在“表达式2”中指定。循环变量的初始化:while、do-while在循环之前指定循环变量初值,for循环在“表达式1”中指定。判断循环条件的时机:while、for循环先判断循环条件,后执行循环体;do-while循环先执行循环体,后判断循环条件。3.4循环嵌套循环嵌套即一个循环体内还包含另一个或几个完整的循环结构,当内嵌的循环中还嵌套其他循环时,成为多层循环。做中学3-4打印下列形式的乘积表:1×1=12×1=22×2=43×1=33×2=13×3=9…………………9×1=99×2=189×3=27……9×9=81算法设计使用嵌套的循环结构,外层循环控制变量设为i,用来控制行数,其初值为1,终值为9;内层循环控制变量设为j,用来控制每行打印的内容,初值为1,终值为i。即外层循环控制打印不同的行,内层循环控制打印同一行中的各个算式。算法见下图。#includestdio.hvoidmain(void){inti,j;for(i=1;i=9;i++){for(j=1;j=i;j++)printf(%d*%d=%2d,i,j,i*j);printf(\n);}}输出结果程序清单知识点三种循环结构(for、while和dowhile)可以互相嵌套。多重循环的使用与单一循环完全相同,但应特别注意内、外层循环条件的变化。多重循环嵌套时。循环之间可以并列,但不能交叉。可用转移语句把流程转出循环体外,但不能从外面转向循环体内。123456while(){…while(){…}…}do{…do{…}while();…}while();for(;;){…for(;;){…}…}while(){…do{…}while();…}for(;;){…while(){…}…}do{…for(;;){…}…}while();3.5循环退出语句3.5.1break语句循环过程中,若满足一定的条件需要退出循环,可用break语句实现。做中学3-3求解当n多少时1×2×…×n的积刚好大于1000。算法设计定义变量f(初值为1)存放连乘积,变量n(初值为1)存放乘数,没有具体循环次数。可以用while(f=10000),或do-while(f=10000)语句实现;也可以用for语句实现,但表达式2要空缺,函数体中当f的值大于10000时,用break退出循环。#includestdio.hvoidmain(void){floatf=1;intn;for(n=1;;n++){f*=n;if(f1000)break;//积大于1000时,推出循环}printf(n=%d,%d!=%f\n,n,n,f);}输出结果n=7,7!=5040.000000程序清单3.5.2continue语句有时在循环的过程中,若满足一定的条件本次循环的剩余语句可以不执行,用来加速循环,可用continue语句实现。做中学3-6输出1~100之间的不能被5整除的数。算法设计定义变量n当循环控制变量,也是被除数,若n能被5整除,则结束本次循环,立即进入下一次循环。#includestdio.hvoidmain(void){intn;for(n=1;n=100;n++){if(n%5==0)continue;printf(%5d,n);}}输出结果123467891112131416171819……81828384868788899192939496979899程序清单3.5.3goto语句goto语句为无条件转向语句,它可以控制程序的转向操作。做中学3-7反复读取键盘字符,并显示在屏幕,直到读到回车符为止。程序清单#includestdio.hvoidmain(){charch,ch1;printf(请输入一串字符:\n);output:ch=getchar();//定义了语句标号outputch1=getchar();//读取回车符printf(\n你输入的字符为:%c\n,ch);if(ch!='\n')gotooutput;}程序运行请输入一串字符:qwertyuiop你输入的字符为:q你输入的字符为:e你输入的字符为:t你输入的字符为:u你输入的字符为:o说明:该程序通过goto和if语句的结合使用,实现了循环结构。知识点goto语句语法格式:goto语句标号;语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后加冒号。语句标号起标识语句的作用,与goto语句配合使用。执行goto语句后,程序将跳转到该标号处并执行其后的语句。标号必须与goto语句同处于一个函数中,但可以不在一个循环体中。goto语句用途有两种:与if语句一起构成循环;从循环体内跳到循环体外。不提倡使用goto语句边学边练判断m是否为“素数”。求100-200间的全部素数,并统计素数个数。百钱百鸡问题。拓展提升3.6goto语句综述历史背景有关goto语句的争论有关goto语句的公正的评述可以使用goto语句的情形从多重循环中直接跳出出错时清除资源当型循环,迭代部分在循环体中while语句do-while语句直到型循环,迭代部分在循环体中for语句当型循环,两分号不能省略循环语句总结归纳