资源描述
1 1、三种循环语句、三种循环语句3、限定转向语句、限定转向语句(break;continue;);)2、多重循环、多重循环第六章第六章 循环控制循环控制whilewhile(表达式表达式)do fordo for(表达式表达式;表达式表达式;表达式表达式)循环体循环体 循环体循环体 循环体循环体 while while(表达式表达式););王馨梅王馨梅 1*用用 goto 语句和语句和 if 语句构造循环语句构造循环(已淘汰!)(已淘汰!)2用用 while 语句语句 3用用 do-while 语句语句4用用 for 语句语句label:if(表达式(表达式)goto label;C中实现循环的四种方法中实现循环的四种方法定数循环定数循环:要先确定循环次数,然后逐次执行循环体要先确定循环次数,然后逐次执行循环体,完成规定的完成规定的次数后退出循环。次数后退出循环。(需要一个变量当作(需要一个变量当作“计数器计数器”,该变,该变量称为循环变量。)量称为循环变量。)先先确定一个停止条件确定一个停止条件,达到这个条件后,退出循环。,达到这个条件后,退出循环。(如果无停止条件,或者条件根本不可能达到,就成为死(如果无停止条件,或者条件根本不可能达到,就成为死循环。)循环。)考虑循环算法之前,必须先为这个循环问题定性考虑循环算法之前,必须先为这个循环问题定性:不定数循环不定数循环:while语句while(表达式)(表达式)循环体循环体/求和求和:1+2+3+10int i=1,sum=0;while (i=10)sum=sum+i;i+;常用算法常用算法必须掌握必须掌握 因为是定数循环问题,所以因为是定数循环问题,所以i不仅当作乘数,还承当着循环计数器的功能。不仅当作乘数,还承当着循环计数器的功能。编程经验编程经验(笔记):陷入死循环时(笔记):陷入死循环时ctrl+c 结束程序结束程序ctrl+s 暂停暂停int i=2,all=1;while (i=10)all=all*i;i+;如果写成如果写成 i-;则会陷入死循环。则会陷入死循环。常用算法常用算法必须掌握必须掌握do-while 语句do 循环体循环体 while(表达式)(表达式);/*求累乘:从求累乘:从12乘到乘到18*/#include int main()int all=1,i=12;do all=all*i;i+;while(i=18);printf(“all=%dn,all);return 0;循环体表达式真假while(表达式表达式)循环体循环体语句语句循环体表达式真假do 循环体语句循环体语句while(表达式表达式);比较比较 while 和和 do-while的差异的差异二者差别:二者差别:do_while 的循环体必然会执行一次的循环体必然会执行一次scanf(“%d”,&i);sum=0;while (i=10)sum=sum+i;i+;scanf(“%d”,&i);sum=0;do sum=sum+i;i+;while (i=10);学生思考:如果输入学生思考:如果输入i=5,则循环结束时,则循环结束时,sum=?i=?如果输入如果输入i=11,则循环结束时,则循环结束时,sum=?sum=5+6+7+8+9+10i=11sum=0i=11sum=11i=12#include void main()int num;int sum=0;/*清零清零*/printf(“输入数据输入数据,0表示结表示结束束:n);scanf(%d,&num);while(num!=0)sum=num+sum;scanf(%d,&num);printf(%dn,sum);分析:进货次数不定,不定数循环问题,必须约定停止条件。分析:进货次数不定,不定数循环问题,必须约定停止条件。#include void main()int num;int sum=0;printf(输入数据,输入数据,0表示结束表示结束:n);scanf(%d,&num);do sum=num+sum;scanf(%d,&num);while(num!=0);printf(%dn,sum);例:例:计算某商场一个月的苹果进货量计算某商场一个月的苹果进货量表达式表达式1:循环变量赋初值:循环变量赋初值表达式表达式2:循环条件:循环条件表达式表达式3:循环变量增值:循环变量增值表达式1表达式2循环体表达式3假真for(表达式表达式 1;表达式表达式 2;表达式表达式 3)循环体(形式上仅为一条语句)循环体(形式上仅为一条语句)for 语句记住记住执行流程执行流程表达式1表达式2循环体表达式3假真#includevoid main()int i,k;for(i=9;i9;i+)printf(循环一被执行循环一被执行n);printf(i=%dnn,i);for(k=15;k17;k+)printf(循环二被执行循环二被执行n);printf(k=%dn,k);#includevoid main()int sum=0,i;for(i=1;i=10;i+)sum=sum+i;printf(sum=%dn,sum);i=1;while(i=10)sum=sum+i;i+;例:求 提示:提示:for(循环变量赋初值;循环条件;循环变量增值)(循环变量赋初值;循环条件;循环变量增值)学生练习题:学生练习题:打印大写字母表打印大写字母表 char c;for(c=A;c=Z;c+)printf(%c ,c);for(i=1;i=10;i+)sum=sum+i;i=1;for(;i=10;i+)sum=sum+i;for(i=1;i=10;)sum=sum+i;i+;for(i=1;i+)if(i=10)sum=sum+i;else break;推荐格式:推荐格式:for(循环变量赋初值;循环条件;循环变量增值)(循环变量赋初值;循环条件;循环变量增值)不推荐以下格式(虽然语法无错,但不能充分体现出不推荐以下格式(虽然语法无错,但不能充分体现出C语言的简洁风格)语言的简洁风格)注意:循环变量的数据类型要谨慎选择,否则数据溢出造成死循环。注意:循环变量的数据类型要谨慎选择,否则数据溢出造成死循环。查错:查错:char c;/字符变量取值范围:字符变量取值范围:-128127 for(c=0;c=1000;c+)/想打印想打印01000,能实现吗?,能实现吗?printf(“%d ,c);发生滚屏怎么办:发生滚屏怎么办:ctrl+c 结束程序结束程序 ctrl+s 暂停暂停011111111000000010000001127-128-12710000010-12611111111 -1(*仅了解):分析溢出机理仅了解):分析溢出机理最大数是最大数是127,再加,再加1,就溢出了,就溢出了00000000 0例:例:输出输出133200之间所有的整数之间所有的整数 (要求每(要求每7个数换一行)个数换一行)程序的运行结果应该为:程序的运行结果应该为:常用算法常用算法必须掌握必须掌握#includevoid main()int j,m;for(j=133,m=1;j=200;j+,m+)printf(%dt,j);if(m%7=0)printf(n);算法二:如果这两个计数器关系固定,可合并成一个计数器算法二:如果这两个计数器关系固定,可合并成一个计数器for(j=133;j=200;j+)printf(%dt,j);if((j-132)%7=0)printf(n);思考:节约了什么?浪费了什么?算法一:一个循环中设定两个计数器算法一:一个循环中设定两个计数器数据结构数据结构:算法:是循环求和问题算法:是循环求和问题 属于不定数循环问题,因此程序员需要与用户属于不定数循环问题,因此程序员需要与用户约定循环停止的条件。约定循环停止的条件。编程经验编程经验(抄笔记)(抄笔记):通常与用户约定一个非法输入数据作为通常与用户约定一个非法输入数据作为不定数循环结束标志。不定数循环结束标志。思考:思考:对于本题对于本题108,-1 ,-53 哪个更好哪个更好?综例:综例:求任意某班的单科平均成绩求任意某班的单科平均成绩常用算法常用算法必须掌握必须掌握#includevoid main()int grade;/单个学生的成绩单个学生的成绩int total=0;/全班总分全班总分int counter=0;/学生数学生数 float average;/全班平均分全班平均分printf(“输入成绩输入成绩,-1表示结束:表示结束:);/与用户约定循环停止条件与用户约定循环停止条件scanf(%d,&grade);while(grade100|grade100|grade-1)/检查数据的有效性检查数据的有效性 printf(“输入有误输入有误,请重新输入请重新输入“);scanf(%d,&grade);1、三种循环语句、三种循环语句3、限定转向语句、限定转向语句(break;continue;);)2 2、多重循环、多重循环第六章第六章 循环控制循环控制 whilewhile(表达式)(表达式)forfor(表达式;表达式;表达式(表达式;表达式;表达式)思考思考1:如果要在屏幕上输出一行共:如果要在屏幕上输出一行共10个个“顶顶”字?字?for(j=1;j=10;j+)printf(顶顶);思考思考2:如果要在屏幕上输出这样的:如果要在屏幕上输出这样的8行?行?for(i=1;i=8;i+)for(j=1;j=10;j+)printf(“顶顶);printf(“n);6-5 6-5 循环的嵌套例例1:简单图案打印:简单图案打印 *#includevoid main()int m,n;for(m=1;m=6;m+)/思考循环多少次?思考循环多少次?for(n=1;n=4;n+)/思考循环多少次?思考循环多少次?printf(*);printf(n);#include void main()int i,j;for(i=1;i=5;i+)for(j=1;j=i;j+)printf(*);printf(n);*例例1:简单图案打印简单图案打印2常用算法常用算法必须掌握必须掌握 这是定数循环问题,要依次判断每一个三位数这是定数循环问题,要依次判断每一个三位数i(100i999)是否为水仙花数是否为水仙花数,所以设置,所以设置i为循环变量。为循环变量。算法算法1:提取出个位提取出个位数字数字k1、十位、十位数字数字k2、百位数字、百位数字k3,判断:,判断:i=k1*k1*k1+k2*k2*k2+k3*k3*k3 综例:综例:打印三位数中的打印三位数中的水仙花数水仙花数 如:如:153=33+53+13例例:i=543k1=543%10值为值为3k2=543/10%10值为值为4k3=543/100值为值为5总结:总结:(三位数的)数字分离方法(三位数的)数字分离方法:(1)个个位位:k1=i%10 (2)十位十位:k2=i/10%10 (3)百位百位:k3=i/100定性:定性:#include void main()int i,k1,k2,k3;for(i=100;i1000;i+)k1=i%10;/*求求个个位位*/k2=i/10%10;/*求十位求十位*/k3=i/100;/*求百位求百位*/if(i=k1*k1*k1+k2*k2*k2+k3*k3*k3)printf(%d=%d3+%d3+%d3n,i,k1,k2,k3);思考:循环变量思考:循环变量 100i999 共循环几次?共循环几次?算法算法2:三个数字的全排列组合三个数字的全排列组合 设该三位数的百位、十位、个位数字分别设该三位数的百位、十位、个位数字分别为为k3(取值取值19)、k2(取值取值09)、k1(取值取值09)。满足以下关系即为水仙花数:满足以下关系即为水仙花数:k3*100+k2*10+k1 =k3*k3*k3+k2*k2*k2+k1*k1*k1思考:思考:三重三重定数循环,设置循环变量定数循环,设置循环变量k3(取值取值19)、k2(取值取值09)、k1(取值取值09)#includevoid main()int k1,k2,k3,i;for(k3=1;k3=9;k3+)/代表百位代表百位 for(k2=0;k2=9;k2+)/代表十位代表十位 for(k1=0;k1=9;k1+)/代表个位代表个位 i=k3*100+k2*10+k1;if (i=k3*k3*k3+k2*k2*k2+k1*k1*k1)printf(%d=%d3+%d3+%d3n,i,k3,k2,k1);三三重重循循环环 1、三种循环语句、三种循环语句3 3、限定转向语句、限定转向语句(利用(利用(利用(利用breakbreakbreakbreak、continuecontinuecontinuecontinue语句,提前结束循环)语句,提前结束循环)语句,提前结束循环)语句,提前结束循环)2、多重循环、多重循环第六章第六章 循环控制循环控制while(表达式表达式1)if(表达式表达式2)break;注意注意break和和continue语句的区别语句的区别在在while、for、do_while或或switch中中,使用使用break语句语句可使程序可使程序立即退出该结构立即退出该结构在在while、for、do_while中中,使使用用continue语句,语句,跳过循环体跳过循环体中余下的语句中余下的语句,并继续执行下一并继续执行下一次循环次循环while(表达式表达式1)if(表达式表达式2)continue;6-8 6-8 限定转向语句限定转向语句例:例:#includevoid main()int x;for(x=1;x=10;x+)if(x=5)break;/*在在 x=5 时终止循环时终止循环*/printf(%d ,x);1)break 语句语句输出 1 2 3 4 (程序结束时程序结束时x=5)2)continue 语句语句例:例:#includevoid main()int x;for(x=1;x=10;x+)if(x=5)continue;printf(%d,x);假x=5?X=10?真真假continue输出输出 1 2 3 4 6 7 8 9 10(程序结束时(程序结束时 x=11)综例综例1(书(书6.8)任意输入一个正整数任意输入一个正整数m,判断其是否为素数,判断其是否为素数若此循环正常结束则若此循环正常结束则m是素数。是素数。for(i=2;isqrt(m)思路:循环试除,一旦能整除,立即结束循环思路:循环试除,一旦能整除,立即结束循环本章综合训练题本章综合训练题#include#includevoid main()int m,i,k;scanf(%d,&m);k=(int)sqrt(m);for(i=2;i=a&c=A&c=w&c=W&c=Z)c=c-22;综例综例2(书(书128页页6.10)输入一行字符,加密后输出。输入一行字符,加密后输出。(先理解该加密规则:见书(先理解该加密规则:见书128页图页图)运行结果:运行结果:China!Glmre!常用算法常用算法建议掌握建议掌握 算法二:(书上给出的算法)算法二:(书上给出的算法)#includevoid main()char c;while(c=getchar()!=n)/结束约定习惯上为结束约定习惯上为“回回车车”if(c=a&c=A&cZ&cz)c=c-26;printf(%c,c);printf(n);运行结果:运行结果:China!Glmre!仅了解仅了解:按按Enter键后操作系统键后操作系统才将这一批数据才将这一批数据一起一起送到内存缓冲区中去,交由程序处理。送到内存缓冲区中去,交由程序处理。*(仅了解)(仅了解):如果不用如果不用“nn”做循环结束约定,会怎样?做循环结束约定,会怎样?编程编程:将用户输入内容原样输出一遍将用户输入内容原样输出一遍whilewhile((c=c=getchargetchar()())!=!=k k )printf(printf(%c,%c,c,c););运行情况:运行情况:abcdkopqabcdkopq (输入输入)a,b,c,da,b,c,d,(输出输出)因为按因为按Enter键后操作系统才将这一批数据一起键后操作系统才将这一批数据一起送到内存缓冲区中去,交由程序处理。送到内存缓冲区中去,交由程序处理。知识点小结:不同类型数据间的转换知识点小结:不同类型数据间的转换一、隐式转换(系统自动转换)在什么情况下发生:一、隐式转换(系统自动转换)在什么情况下发生:1 1、运算转换、运算转换-不同类型数据混合运算时不同类型数据混合运算时2、赋值转换、赋值转换-把一个值赋给与其类型不同的变量时把一个值赋给与其类型不同的变量时例:int i;float f;f=3+i;/不损失精度不损失精度 b=100/3.0;/损失精度,会出语法损失精度,会出语法warning3、输出转换、输出转换-输出函数中指定其他输出格式输出函数中指定其他输出格式 例:3*4.4+5;/自动向高精度转化,不会损失精度自动向高精度转化,不会损失精度例例:int b=97;printf(“%c”,b);/*按字符输出按字符输出*/printf(“%f”,b);/*会运行出错会运行出错*/除非特殊需要,除非特殊需要,一般严禁用该方式转换!一般严禁用该方式转换!二、显式转换二、显式转换(用(用“类型转换运算符类型转换运算符”)语法形式:语法形式:(类型名类型名)表达式表达式例:例:(double)3/2(double)3/2 (int)(3.7/2.9+8)(int)(3.7/2.9+8)例:例:float f=3.9float f=3.9;intint i i;i=(i=(int)fint)f /结果结果i=3i=3 1、常见输出格式错误常见输出格式错误:例:float b=9.7;printf(%d,b);/*常见错误*/应改为:printf(%d,(int)b);2、常见警告:常见警告:float k;k=1.3;/*warning*/系统将浮点型常量都按双精度处理。该赋值运算会损失系统将浮点型常量都按双精度处理。该赋值运算会损失精度,所以语法精度,所以语法warning。建议以下三种修改方式:建议以下三种修改方式:double k;k=1.3;float k;k=1.3f;float k;k=(float)1.3;回顾我们实验课上常见问题回顾我们实验课上常见问题难点:难点:1 1、复杂循环问题,如何用多重循环实现。、复杂循环问题,如何用多重循环实现。2 2、如何合理使用限定转向语句:、如何合理使用限定转向语句:break;continue;定数循环问题定数循环问题:设置循环变量设置循环变量不定数循环问题不定数循环问题:约定结束标志约定结束标志作业:作业:6.4,6.8,6.14本章小结本章小结whilewhile(表达式表达式)do fordo for(表达式表达式;表达式表达式;表达式表达式)循环体循环体 循环体循环体 循环体循环体 while while(表达式表达式););*趣味C:要求:在屏幕上让一个字“跑”起来提示:用到了stdio库中的清屏函数:system(“cls”);
展开阅读全文