资源简介 (共31张PPT)C 语言程序设计2023翻转课堂实用教程第6章 循环结构6.1简单循环结构6.2嵌套循环结构6.1 简单循环结构6.1.1 while、do-while和for循环知识点1、while循环流程图:注意语句格式:while(表达式){循环体(语句块);}执行描述:(1)计算while后面的表达式值,如果值为真,则执行步骤(2),否则跳出循环体,继续执行该结构后面的语句。(2)执行循环体语句;(3)重复执行步骤(1)。循环的结束由while后面的表达式控制,循环体中必须有改变循环控制变量值的语句,使循环倾向于结束,否则出现死循环,无法结束。循环体如果有一条以上的语句,应该用大括号括起来,如果只有一条语句,大括号可以省略。循环四要素:循环控制变量初始值、循环条件的设置、循环语句的编写和循环控制变量的变化。1、while循环例如:用while语句编写程序实现,求1~100的累计和。程序代码:算法设计:main(){int i=1, sum=0;while(i<=100){sum+=i;i++;}printf("%d\n",sum);return 0;}真假流程图:1、定义两个整型变量;2、两个变量初始化(循环控制变量初始值);3、while语句(设置循环条件);4、求和(环体语句的编写);5、被加数变化(循环控制变量的变化);6、输出总和。演示运行过程注意:while 循环的整体思路设置一个带有变量的循环条件,也即一个带有变量的表达式;在循环体中额外添加一条语句,让它能够改变循环条件中变量的值。这样,随着循环的不断执行,循环条件中变量的值也会不断变化,终有一个时刻,循环条件不再成立,整个循环就结束了。6.1.1 while、do-while和for循环知识点2、do-while循环流程图:注意语句格式:do{循环体(语句块);} while(表达式);执行描述:(1)执行循环体语句。(2)计算while后面的表达式值,如果值为真,则执行步骤(2),否则跳出循环体,继续执行该结构后面的语句。(3)重复执行步骤(1)。while(i<=100);最后的分号“;”必须要有。2. while循环和do-while各有特点,实际编程中使用while循环较多。2、do-while循环例如:用do-while语句编写程序实现,求1~100的累计和。程序代码:#include int main(){int i=1, sum=0;do{sum+=i;i++;}while(i<=100);printf("%d\n", sum);return 0;}流程图:6.1.1 while、do-while和for循环知识点3、for循环流程图:注意语句格式:for(初始值;条件;增量){循环体;}执行描述:(1)计算初始值(只执行一次)。(2)判断条件,如果值为真,则执行步骤(3),否则跳出循环体,继续执行 该结构后面的语句。(3)执行循环体语句。(4)计算增量(使循环条件逐渐变得“不成立”,以便结束循环);(5)重复执行步骤(2)。1. 循环体如果有一条以上的语句,应该用大括号括起来,如果只有一条语句,大括号可以省略。2. for语句中的表达式可以省略任意一个,也可以都省略,但“;”不能省略。6.1.1 while、do-while和for循环知识点例如:用for语句编写程序实现,求1~100的累计和。程序代码:算法设计:int main(){int i, sum=0;for(i=1; i<=100; i++){sum+=i;}printf("%d\n",sum);return 0;}流程图:1、定义两个整型变量;2、求和变量初始化;3、For语句(设置初始值、条件和增量);4、求和(循环体语句的编写);5、输出总和。代码分析:(1)执行到 for 语句时,先给 i 赋初值1,判断 i<=100 是否成立;因为此时 i=1,i<=100 成立,所以执行循环体。循环体执行结束后(sum的值为1),再计算 i++。(2)第二次循环时,i 的值为2,i<=100 成立,继续执行循环体。循环体执行结束后(sum的值为3),再计算 i++。(3)重复执行步骤 2),直到第101次循环,此时 i 的值为101,i<=100 不成立,所以结束循环。。4、while、do-while和for循环的相互转换6.1.1 while、do-while和for循环知识点注意:循环语句的选择:主要考虑因素-循环控制方式(1)事先给定循环次数,首选 for(2)通过其他条件控制循环,考虑 while或 do-whileif(循环次数已知)使用 for 语句else /* 循环次数未知 */if (循环条件在进入循环时明确)使用 while 语句else /* 循环条件需要在循环体中明确 */使用 do-while 语句5、break和continue语句语句格式:break;语句功能:(1)break关键字注意:使程序运行时中途退出switch结构或者一个循环体(1)break语句不能用在除了switch语句和循环语句以外的任何其他语句。(2)在嵌套循环结构中,break语句只能退出包含break语句的那层循环体。例如:编写程序实现,输入一个整数判断此数是否为素数。算法设计:定义两个整型变量;输入数据;for语句(设置初始值、条件和增量);判断是否能整除;输出结果。(1)break关键字例如:使用 while 循环计算1加到100的值。程序代码:#includeint main(){int i=1, sum=0;while(1){ //循环条件为死循环sum+=i;i++;if(i>100) break;}printf("%d\n", sum);return 0;}#includeint main(){int i,a;scanf("%d",&a);for(i=2;i<=a-1;i++){if(a%2==0)break;}if(i<=a-1)printf("该数不是素数!\n");elseprintf("该数是素数!\n");return 0;}程序代码:break跳出死循环5、break和continue语句语句格式:continue;语句功能:(2)continue关键字注意:提前结束本次循环,跳过continue语句下面未执行的语句,继续进行下一次循环1. continue语句通常和if语句连用,只能提前结束本次循环,不能使整个循环终止。2. continue语句只对循环起作用。3. continue语句在for语句中结束本次循环,但for语句中的增量仍然执行。例如:编写程序,输出1~100之间不能被7整除的数。算法设计:1、定义一个整型变量;2、for语句(设置初始值、条件和增量);3、判断如果能被7整除,则continue执行下一次循环,否则输出。int main(),{ int i;for(i=1;i<=100;i++){if(i%7==0)continue;printf("%d ",i); 3}代码:程序运行时,当i是1-6时,都不能被7整除,输出1-6的值,当i=7时,能被整除,执行continue语句,结束当前循环,直接进入下一次循环。执行说明:break与continue的区别6.1.2 简单循环案例分析案例6.1.1统计一行字符的个数(while)案例6.1.1程序代码:问题分析:#includeint main(){int n=0;//统计字符个数printf("Input a string:");while(getchar()!='\n')n++;printf("Number is: %d\n", n);return 0;}1、从键盘输入多少字符不固定,因此无法用for循环实现。2、键入一行字符,当回车时字符输入结束,所以可以把getchar()!='\n'作为循环的判定条件,用while语句实现。要求:从键盘输入一串字符(输入回车符时结束),统计字符的个数案例6.1.1运行结果:Input a string:I am a Chinese.↙Number is: 15思考:把上题改成用do-while语句实现,代码该如何改写?6.1.2 简单循环案例分析案例6.1.2 统计大写字符(do-while)案例6.1.2程序代码:算法设计:#include int main(){char ch;int num=0;printf("输入字符串:");do{ch=getchar( );if(ch>='A'&& ch<='Z')num++;}while(ch!='\n');printf("有%d个大写字母。\n",num);return 0;}(1)设置变量ch存放输入的字符;计数器变量num存放大写英文字母的个数(2)输入字符ch若ch是大写英文字母,计数器num+1重复上述操作,直到输入换行符为止(3)输出大写英文字母个数要求:从键盘输入一串字符(输入回车符时结束),统计其中大写英文字母的个数。案例6.1.2运行结果:输入字符串:Tomorrow is Tuesday .有2个大写字母。6.1.2 简单循环案例分析案例6.1.3输入一批体育考生的身高,打印最高身高是多少(单位cm)?案例6.1.3程序代码:算法设计:int main(){double mark, max,length;printf("Enter length:");scanf ("%lf", &length); /* 读入第一个身高值 */max = length; /* 假设第一个身高值最大 */while (length >= 0){if(max < length )max = length ;scanf ("%lf", &length );}printf("Max = %.2f\n", max);}1. 定义max存储最大值,length存储身高;2. 读入第一个成绩身高值赋给length;3. max=length,假设第一个数是最高身高;4. while(length>0),进入循环体, if(max < mark) ,max = mark ;再接收下一个身高值;5. 直到循环结束,打印max的值。要求:在键盘输入一批学生的身高,当输入-1是表示输入结束,求出最大身高值。案例6.1.3运行结果:Enter length:160.5 176.3 180.4 185.7 -1Max = 185.70求身高最矮的值?6.1.2 简单循环案例分析案例6.1.4 把一个整数的每一位数分离出来并输出(while)案例6.1.4程序代码:问题分析:#include int main(){int x=0,item;scanf ( "%d", &x );while ( x != 0 ){item = x %10;x = x/10 ;printf ( "%d ", item );}return 0;}当接收到一个多位数的整数时,这个整数是整体被接收的,当需要用到其中的某一位数时,需要把整数的每一位分离开来。因为不知道接收整数的位数,不能用for循环。要求:在键盘输入一批学生的身高,当输入-1是表示输入结束,求出最大身高值。案例6.1.4运行结果:6789↙9 8 7 6输入的12345,分离步骤如下:12345 % 10 = 5 12345 / 10 = 12341234 % 10 = 4 1234 / 10 = 123123 % 10 = 3 123 / 10 = 1212 % 10 = 2 12 / 10 = 11 % 10 = 1 1 / 10 = 0 结束所以得到:循环体:x%10 x=x/10循环结束条件 x==06.1.2 简单循环案例分析案例6.1.5打印所有的“水仙花数”(分离每位整数的应用)。案例6.1.5程序代码:问题分析:#include int main(){int n,i,j,k;// 百位数i、十位数j和个位数kfor(n=100;n<1000;n++){k=n%10;j=n/10%10;i=n/100;if(n== i*i*i+j*j*j+k*k*k) printf("%d\n",n);}return 0;}(1)该题需要先生成三位数:设变量n为三位数,使用for语句,即for (n=100;n<1000;n++){…}即可。 (2)在循环体中,对每一个n,分离出其百位数i、十位数j和个位数k,那么当条件“n==i*i*i+j*j*j+k*k*k”满足时n即为所求的三位数。所谓的“水仙花数”是指一个三位数,其各位数字立方和等于该数本身,例如:153=1^3+3^3+5^3。案例6.1.5运行结果:1533703714076.1.2 简单循环案例分析案例6.1.6打印Fibonacci序列的前20个数:1,1,2,3,5,8,13,… (for),每5个数据一行。案例6.1.6 程序代码:问题分析:#include int main(){int x1 = 1,x2 = 1,x,i;printf ("%5d%5d", x1, x2 ); /* 输出头两项,每个数据占5位 */for ( i = 3; i <= 20; i++ ){ /* 循环输出后18项 */x = x1 + x2; /* 计算新项 */printf("%5d", x );if(i%5==0) //输出5个数据后,换行到下一行输出printf("\n");x1 = x2;x2 = x; /* 更新x1和x2 */}}此类题一般要先观察前3-5个数的规律,然后根据规律写出一般的表达式作为循环体的内容,再确定好循环条件即可编程了。。所谓的“水仙花数”是指一个三位数,其各位数字立方和等于该数本身,例如:153=1^3+3^3+5^3。案例6.1.5运行结果:本题中,经观察发现,前两个数和等于后面的数。随着数的后移,数在变化,设x1 ,x2表示前两个数,x表示x2后面的那个数,它们的规律如下:1 1 2 3 58 13 21 34 5589 144 233 377 610987 1597 2584 4181 67656.1.2 简单循环案例分析案例6.1.7兔子繁衍问题(Fibonacci序列的应用)案例6.1.7 程序代码:问题分析:#include int main(){ int x1,x2,month,N,x=0;scanf("%d",&N);x1=1; x2=1;if(N<2)month=1;else{ month=2;while(x<=N){x=x1+x2;x1=x2;x2=x;month++;}}printf("%d\n",month);}第1、2月是初始的兔子数,第三个月又生了一对兔子,第5个月时新出生的一对兔子达到3个月,又可以生兔子了,因此数据是5,第6个月时,有三对兔子可以生小兔子了,以此类推。问题描述:一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对(N从键盘输入)?输入:在一行中给出一个不超过10000的正整数N输出:在一行中输出兔子总数达到N最少需要的月数案例6.1.5运行果:表6-1-1 兔子繁殖数据表30↙96.1.3 简单循环课堂练习题课堂练习题6.1.1:用格里高利公式求π的近似值本题要求编写程序,计算序列部分和 1 - 1/3 + 1/5 - 1/7 + ... 直到最后一项的绝对值小于给定精度eps。课堂练习题6.1.2:输出2到n之间的全部素数本题要求输出2到n之间的全部素数,每行输出10个。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。课堂练习题6.1.3:找出一批学生的最高分本题要求编写程序,找出最高分。输入在一行中给出一系列非负整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。课堂练习题6.1.4:简单的猜数字游戏猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”)、小了(“Too small”),还是相等(“Lucky You!”)。如果猜到,则结束程序。如果超过7次都没有猜到,则提示“Game Over”,并结束程序。提示: 随机数的产生用下面的2个函数: srand (time(0)); //初始化随机函数mynumber = rand () % 100 + 1; /* 随机产生一个1~100之间的被猜数 */这两个函数在time 头文件中,因此程序需要加上# include 这个语句。6.2 嵌套循环结构所谓嵌套(Nest),就是一条语句里面还有另一条语句6.2.1 嵌套循环知识点注意:while语句和for语句可以相互嵌套。外层循环执行一次,内层循环执行一轮(即执行完自己的循环)。3. 内层循环控制可以直接引用外层循环的相关变量,但不要轻易改变外层循环控制变量的值。例如:输出九九乘法表问题分析:要求:编写程序输出以下形式的乘法“九九表”6.2.1 嵌套循环知识点(1)乘法表第1行的变化规律:for(j=1;j<=9;j++)printf(“%d*%d=%4d”,1,j,1*j);(2)乘法表第2行的变化规律:(3) 在上述循环语句外面再加上一个循环(即构成双重循环),就可输出所要求的“九九表”。流程图:例如:输出九九乘法表程序代码:#include main( ){int i,j;/*外循环控制变量i,控制被乘数变化*/for(i=1;i<=9;i++){/*内循环控制变量j 控制乘数变化*/for(j=1;j<=9;j++)printf("%d*%d=%-4d",i,j,i*j);printf("\n"); /*换行*/}}注意:双重循环执行过程(1)先执行外循环,当外循环控制变量i取初值1后,执行内循环(j从1变化到9),(2)在内循环执行期间,i的值始终不变;内循环结束后,到了外循环,i的值增为2,然后再执行内循环,……如此下去,直到外循环控制变量i超过终值,整个双重循环就执行完毕。(3)内层 for 每循环一次输出一条数据,外层 for 每循环一次输出一行数据。思考:如果把内循环语句改为:for(j=1;j<=i;j++)printf(“%d*%d=%-4d”,i,j,i*j);将会输出什么形式的乘法“九九表”?6.2.2 循环嵌套案例分析案例6-2-1 编写打印3*3矩阵的程序,打印出for 嵌套执行的流程案例6-2-1程序代码:案例6-2-1,运行结果:算法设计:#include int main(){int i, j;for(i=1; i<=3; i++){ //外层for循环for(j=1; j<=3; j++){ //内层for循环printf("i=%d, j=%d\n", i, j);}}printf("\n");//打印完一行后换行}问题分析:打印3*3矩阵,需要一个循环控制行,另一个循环控制列,因此需要嵌套循环。因为行列固定,用for循环即可.i=1, j=1i=1, j=2i=1, j=3i=2, j=1i=2, j=2i=2, j=3i=3, j=1i=3, j=2i=3, j=3定义i控制行,j控制列;控制行的循环for(i=1; i<=4; i++);内嵌控制列的循环for(j=1; j<=4; j++);打印行列的变化值;直到循环结束.注意:上例中,for 循环嵌套,外层循环和内层循环交叉执行,外层 for 每执行一次,内层 for 就要执行三次。外层 for 每次循环时,都必须等待内层 for 循环完毕(也就是循环3次)才能进行下次循环。虽然 i 是变量,但是对于内层 for 来说,每次循环时它的值都是固定的。6.2.2 循环嵌套案例分析案例6-2-2 编写程序打印下列图案:案例6-2-2程序代码:#include int main(){int i,j;for(i=1;i<=6;i++){for(j=1;j<=20-i;j++) /*控制输出空格个数*/printf(" ");for(j=1;j<=2*i-1;j++) /*控制输出*号*/printf("*");printf("\n"); /*换行*/}}问题分析:(1)该图案共有6行,打印时需要一行一行进行,设正在处理的行为第i行,则i从1~6;(2)每行的字符与所在的行有关,设j表示第i行第j个字符,则j从1~2*i-1;(3)设定每行字符的起始位置:设第1行起始位置为第20列,则第1行‘*’之前有19个空格,第i行‘*’之前有20-i个空格。************************************思考:如果打印下示图案,程序该如何修改6.2.2 循环嵌套案例分析案例6-2-3 组合问题案例6-2-3程序代码:#include int main(){int i,j,k,n;n=5;for(i=1;i<=n;i++)for(j=1;j<=n;j++)for(k=1;k<=n;k++)if(i!=j&&i!=k&&j!=k&&iprintf("%3d%3d%3d\n",i,j,k);}下面以n=5,r=3为例,求出所有符合上述要求的5个数中3个数的组合。设:i,j,k为组合中的三个数,它们可能的取值均为1~5;i,j,k应要求满足:问题描述:找出n个自然数(1,2,……,n)中r(r问题分析:(1)每一个组合中的三个数字不能相同,即i≠j≠k;(2)任何两组数所包含的数不能相同,例如(1,2,3)和(3,2,1)只能取其中一组,为此约定:前一个数应小于后一个,则有:i案例6.2.3运行结果:1 2 31 2 41 2 51 3 41 3 51 4 52 3 42 3 52 4 53 4 56.2.2 循环嵌套案例分析案例6-2-3程序代码优化:#include int main(){int i,j,k,n;n=5;for(i=1;i<=n-2;i++)for(j=2;j<=n-1;j++)for(k=3;k<=n;k++)if(i!=j&&j!=k&&iprintf("%3d%3d%3d\n",i,j,k);}注意:(1)在循环结构的程序设计中,对此类问题的求解通常使用穷举法。(2)穷举法是一种重复性算法,其基本思想是:对问题的所有可能状态一一测试,直到找到解或将全部可能状态都测试过为止。(3)尽量减少循环次数以提高程序运行效率。启示:从循环结构想到的(1)要想使循环能正确的执行,编程者需要设计好循环条件和循环体等。但一旦做好这些,计算机就能帮我们做复杂的运算和任务了,这就是先苦后甜。(2)我们经过努力才考上大学,这也是先苦后甜,但大学毕业并不是循环的终止条件,而是前期准备,只有在大学打好坚实的专业基础,在走上工作岗位才能轻松的工作(执行循环);(3)循环过程是不断累积增加的过程,我们的工作也需要不断的进步,如果把我们的循环终止时间设定为一生,我们岂不是每天都在进步了?6.2.3 循环嵌套练习题课堂练习题6.2.1:计算阶乘和对于给定的正整数N,需要你计算 S=1!+2!+3!+...+N!。输入在一行中给出一个不超过10的正整数N。课堂练习题6.2.2:输出三角形字符阵列本题要求编写程序,输出n行由大写字母A开始构成的三角形字符阵列。课堂练习题6.2.3:穷举问题-搬砖某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。如果想用n人正好搬n块砖,问有多少种搬法?【微视频6.1】for循环语句—工作日向上的力量【微视频6.2】地球自转与公转-嵌套循环谢谢观看 展开更多...... 收起↑ 资源预览