专题6:for循环、循环的嵌套(讲义)-《编程语言基础—C语言》(高等教育出版社第5版)高考备考讲练测(湖南省)

2025-10-09
| 22页
| 141人阅读
| 1人下载
精品

内容正文:

专题6:for循环、循环的嵌套(讲义) 《编程语言基础—C语言》专题复习讲练测 [考纲要求] 1:掌握for语句的格式、执行流程及其应用。 2:掌握while、do…while、for三种循环的相互嵌套应用。 3:掌握循环状态改变语句(break、continue)的功能。 [课时安排] 2课时 [知识梳理] 1、for循环 (2)执行过程: ①计算“表达式1”。 ②计算“表达式2”。如果结果为真,则转到第③步;如为假,则转到第⑤步。 ③执行“语句序列”。 ④计算“表达式3”,转回第②步。 ⑤结束循环,执行for语句后面的第1条语句。 (3)说明: ①表达式1:设置初始条件,只执行一次,可以为零个,一个或多个变量设置初值(i=1),采用逗号分隔 ②表达式2:是循环条件表达式,用来判断是否继续循环,在每次执行循环体前先执行此表达式,决定是否继续执行循环。 ③表达式3:作为循环的调整,例如使循环变量增/减值,它是在执行完循环体后才进行的。 ④若循环体只有一条语句,则“{}”可省略。 (4)注意: ①“表达式1”可以省略,即不设置初值,但表达式1后的分号不能省略。例如: for(;i<=100;i++)。(为了能正常执行循环,应在for语句之前给循环变量赋以初值。) ②表达式2也可以省略,即不用表达式2来作为循环条件表达式,不设置和检查循环的条件。此时循环无终止地进行下去,也就是认为表达式2始终为真。 ③表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。 ④甚至可以将3个表达式都可省略,将无终止地执行循环体语句,无意义。 (5)应用举例:从键盘上输入10个整数,求其和。 main( ) { int i, num, sum; sum = 0; for(i=1; i<=10; i++) { scanf("%d", &num ); sum = sum + num; } printf("这10个整数的和为:%d", sum ); getch( );} 说明: 当求累加值时,存放累加值的变量sum的初值应该为0。 for括号中用两个分号分隔的三个表达式:“表达式1”只在循环开始时执行一次;“表达式2”是循环条件,在每一轮循环开始前进行计算,如果结果为真则执行循环体,否则退出for循环;“表达式3”用于循环变量的更新。 可以省略for语句括号中的一个或几个表达式,但不能省略分号。 2、循环的嵌套 应用举例:打印九九乘法表 main() { int i, j; for ( i = 1; i < 10; i++ ) {for ( j = 1; j <= i; j++ ) printf ( "%d*%d=%-3d ",i,j,i*j ); printf ( " " ); // 换行 } getch(); } 3、几种循环的比较 (1)3种循环都可以用来处理同一问题,一般情况下它们可以互相代替。 (2)在while循环和do…while循环中,只在while后面的括号内指定循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句(如i++,或i=i+1等)。 (3)for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。 (4)用while和do…while循环时,循环变量初始化的操作应在while和do…while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。 (5)while循环、do…while循环和for循环都可以用break语句跳出循环,用continue语句结束本次循环。 4、改变循环执行状态 (1)break语句 作用: break语句可以使程序跳出switch结构,也可以应用于循环结构中,使程序提前跳出循环,并结束循环,转移到循环后面的语句中去。 应用举例: 求不同半径的圆柱体的体积,只计算体积在100以下的圆柱体。 #define PI 3.14 main() { int r; float h;double v; printf("请输入圆柱体的高: "); scanf("%f",&h); for(r=1;r<=10;r++) { v=PI*r*r*h; if(v>100.0) break; printf("半径等于%d,体积等于%.2f ",r,v);} printf("此时r=%d ",r); getch();} (2)continue语句 作用: 程序跳过循环体中该语句后面的所有语句,提前结束本轮循环,直接进入下一轮循环。 与break的区别: continue语句只是结束本轮循环,而不是结束整个循环;break语句是结束整个循环。 应用举例: 要求输出100~200中不能被3整除的数。 #include <stdio.h> int main() { int n; for (n=100;n<=200;n++) { if (n%3==0) continue; printf("%d ",n); } printf(" "); getch(); } (3)break语句和continue语句的区别 5、循环结构程序应用 例题1: 求Fibonacci(斐波那契)数列的前40个数。这个数列有如下特点: 第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即该数列为1,1,2,3,5,8,13,…,用数学方式表示为: #include <stdio.h> int main() { int f1=1,f2=1; int i; for(i=1; i<=20; i++) //每个循环输出2个月的数据,故只需循环20次 { printf("%12d %12d ",f1,f2); //输出已知的两个月的兔子数 if(i%2==0) printf(" "); f1=f1+f2; //计算出下一个月的兔子数,并存放在f1中 f2=f2+f1; //计算出下两个月的兔子数,并存放在f2中 } } [真题练讲] 1.(2008年湖南高考真题)程序改错题,不得增行或删行。下列程序的功能是采用简单插入的排序方法,随机产生10个整数,按从小到大的顺序排列。在程序中有2处错误,请标记并改正。 L1 #include<conio.h> L2 #include <stdio.h> L3 #include <math.h> L4 main() L5 {int i,j,a[11]; L6 for(i=1;i<11;i++) L7 a[i]=rand(); L8 for(i=2;i<11;i++) L9 {a[0]=a[i]; L10 for(j=i-1;j>=1;j--) L11 if(a[0]<a[j]) L12 a[j-1]=a[j]; L13 else L14 continue; L15 a[j+1]=a[0]; L16 for(i=1;i<11;i++) L17 printf("%d ",a[i]); L18 } L19 getch();} 【答案】(1) L3 #include <stdlib.h> (2) L14 break; 2.(2008年湖南高考真题)程序改错题,不得增行或删行。列程序的功能是求分数序列:89/55,-55/34,34/21,-21/13,13/8 …的前8项之和。程序中有2处错误,请标记并改正。 L1 #include<conio.h> L2 #include <stdio.h> L3 main() L4 { int i,flag=1; L5 float a=144,b=89,s=0,t; L6 for(i=1;i<=8;i++) L7 { s=s+a/b; L8 flag=-flag; L9 t=b; L10 a=a-b; L11 a=t; L12 } L13 printf("%5.1f",s); L14 getch();} 【答案】(1) L5 float a=89,b=55,s=0,t; (2) L7 { s=s+flag*(a/b); 3.(2011年湖南高考真题)单项选择题。C语言中,以下语句能跳过循环体中未执行的语句,接着执行本循环下一次迭代的语句是( ) A.空语句 B.break语句 C.return语句 D.continue语句 【答案】D 4.(2012年湖南高考真题)程序填空题。30人参观博物馆共花50美元,其中成年男子门票为3美元/人,成年女子2美元/人,小孩1美元/人。编程输出成年男子、成年女子和小孩人数的所有组合。 题目分析如下: 设x,y,z分别代表成年男子、成年女子和小孩人数。按题目要求,可得下面方程: x+y+z=30 (1) 3x+2y+z=50 (2) 用程序求此不定方程的非负整数解,可先通过(2)-(1)式得: 2x+y=20 (3) 由(3)式可知,x变化范围是________①_________ 根据以上分析编写程序如下: #include<stdio.h> main() { int x,y,z; /*x,y,z分别代表成年男子、成年女子、小孩人数*/ printf("Men Women Chlidren "); for(x=0; ② ;x++) { _______③_______;/*按照(3)式根据x求y*/ ________④_______;/*由(1)式求得z*/ if(3*x+2*y+z==50) /*当前得到的一组解是否满足式(2)*/ printf("%d %d %d ",x,y,z); } } 【答案】①0~10 ②x<=10 ③y=20-2*x ④z=30-x-y 5.(2013年湖南高考真题)程序填空题。民警小张在某个案件中带回4个嫌疑人A,B,C,D,其中有一位是小偷,现在小张分别对4个嫌疑人进行询问: A说:我不是罪犯; B 说:C是罪犯; C说:D是罪犯;D说:我不是罪犯而且B也不是罪犯。 已知其中3人说的是真话,1人说的是假话,请根据以上信息帮助小张找出罪犯。 #include <stdio.h> #include <stdlib.h> main(){ int i; char who='A'; int isFound=0; for(i=0;____①_____;i++){ int sum=0; who=_____②______; if(who!='A') sum++; if(who!='C') sum++; if(who!='D') sum++; if(_____③_____) sum++; if(_____④_____){ printf("罪犯是%c ",who); isFound=1; } } If(!isFound) Printf("没有找到符合条件的人"); } 【答案】 ①i<4 ②‘A’+i ③who!=‘D’&&who!=‘B’ ④sum==3 6.(2014年湖南高考真题)阅读程序,写出运行结果:_________________ #include <conio.h> #include <stdio.h> main() { int i,j; for(i=0;i<5;i++) for(j=1;j<10;j++){ if(j==6) break; if(i<3) continue; } printf("j=%d ",j); printf("i=%d ",i); getch(); } 【答案】j=6 i=5 7.(2015年湖南高考真题)阅读程序,写出运行结果:_________________ #include <conio.h> #include <stdio.h> main() { int i=0,a=0; while(i<30) { for( ; ; ) if(i%10==0) break; else i--; i+=11; a+=i; } printf("%d",a); getch(); } 【答案】63 8.(2016年湖南高考真题)程序填空题。以下程序的功能是:从键盘输入班级学生的成绩,计算学生成缋的平均分,并输出高于平均分的学生成绩,输入负数表示输入结束,班级人数不超过100人。 int main() { float x[ 100],sum=0.0,ave,s; int n=0,i; printf("Enter mark: "); scanf("%f",&s); while(s>=0.0 &&n<100) { sum=_____①____; x[n]= s; ______②_____ ; scanf("%f",&s); } ave=sum/n; printf("Output: "); printf("ave=%f ",ave); for(i=0; ______③_____ : i++) if(_____④_____) printf("%f ",x[i]); return 0; } 【答案】①sum+s ②n++ ③i<n ④x[i]>ave [限时练习] 1.(2016年湖南高考真题)程序改错题。下面程序的功能是打印如图所示的图形。以下程序只允许修改两行。 L1 #include <math.h> L2 #include <stdio.h> L3 int main( ) L4 { int i,j,k,b; L5 for(i=l;i<=5;i++) L6 { b=3-i; L7 for(j=b;j>0;j- -) L8 printf(" "); L9 for(k=5-b;k>0;k- -) L10 printf("*"); L11 printf(" "); L12 } L13 return 0; L14 } 【答案】 (1)L6 { b=abs(3-i); (2)L9 for(k=5-2*b;k>0;k- -) 2.(2019年湖南高考真题)程序填空题。下面程序功能是统计5个同学成绩(1~100间的整数)中低于平均成绩的人数并输出,请补全以下代码。 #include "stdio. h" main( ) { int i,count=0; ______①______; float ave=0.0; printf("input 5 scores: "); for(i=0;i<5;i++) { _______②_______; ave+=score[i]; }_____③_____; for(i=0;i<5;i++) if(_____④_______) count++; printf("%2d",count); } 【答案】①int score[5] ②scanf(“%d”,&score[i]) ③ave/=5 ④score[i]<ave 3.(2023年湖南高考真题)阅读程序,写出运行结果:_____________ #include <conio.h> #include <stdio.h> main( ){ int a=2,b=1,c=1; for(;a;) { b+=a; a-=++c; } printf("%d,%d,%d",a,b,c); getch(); } 【答案】0,3,2 4.(2023年湖南高考真题)程序填空题。有n盏灯,编号为1~n;k个人,k≤n≤100,第1个人把所有灯打开,第2个人按下所有编号为2倍数的灯开关(这些灯将关掉),第3个人按下所有编号为3倍数的灯开关(关掉的灯将打开,开着的灯将关闭),依次类推。问最后有哪些灯开着?下面程序的功能是:输入n和k,输出开着的灯编号。例如,有7盏灯,3个人,则输出“1-5-6-7”。 #include" stdio.h" #include"string.h" #define maxn 101 int a[maxn]={0}; int main() {int i,j,k,n,_____①_____ printf("n="); scanf("%d",&n); printf("k="); scanf("%d",&k); for(i=1;i<=k;i++) for(j=i;j<=n;j++) if(______②_____) ______③______ for(i=1;i<=n;i++) if(______④______) { if(first) _______⑤______ else printf("-"); printf("%d",i);} printf(" "); return 0;} 【答案】①first=1; ②j%i==0; ③a[j]=!a[j]; ④a[i]==1 ⑤first=0; 5.(2023年湖南高考真题)程序改错题。下面程序功能是计算如下级数,直到最后一项的绝对值小于〖10〗^(−6)。以下程序只允许修改两行。 L1 #include"stdio.h" L2 int main() L3 { L4 double sum=0.0; L5 int i; L6 for(i=0;;i++) L7 { L8 double term=1/(i*2+1); L9 if(i%2==0) L10 sum+=term; L11 else L12 sum-=term; L13 if(term<le-6) L14 continue; L15 } L16 printf("%.6f",sum); L17 return 0; L18 } 【答案】(1) L8 double term=1.0/(i*2+1); (2) L14 break; 6.(2022年湖南高考真题)程序填空题。学校有近千名学生,在操场上排队,5人一行余2人,7人一行余3人,3人一行余1人,编写一个程序求该校的学生人数,并输出该人数。 #include <stdio.h> main() { int i; for(i=900;i<=1100;______①______) { if(_______②______&&i%7==3&&i%3==1) { printf("%d ",______③_____); ________④________ } } } 【答案】①i++ ②i%5==2 ③i ④break; 7.(2025年湖南一轮联考题)程序填空题。编程实现以下功能:判断从键盘上输入的10个数(要求输入的数据都不相同)是否有序。 示例 1:12345678910 是升序 示例2:999 863 752 632 522 412 332 212 123 0 是降序 示例3:1 3 2 4 6 5 10 13 78 100 是无序 # include <stdio.h> int main( ) { int a[10]; int flag1=1; ______①______ int i,j; for(i=0;i<10;i++) scanf("%d",a+i); for(i=0;i<9;i++) { for(j=0;j<10-1-i;j++) { if(a[j]>a[j+1]){ _______②_______ } if(______③______) { flag2=0; } } if(flag1==1||flag2==2) ________④_______ } if(flagl==1)printf("是升序"); else if(flag2==2)printf("是降序"); else printf("是无序"); return 0; } 【答案】①int flag2=2; ②flag1=0; ③a[j]<a[j+1] ④break; 8.(2025年湖南一轮联考题)程序改错题。下列程序的功能是输入若干个整数(不超过100个),以-1标记输入结束,输出其中的最大数。以下程序只允许修改两行。 L1 #include<stdio.h> L2 #define MAX_SIZE 100; L3 int main( ) { L4 int numbers[MAX_SIZE]; L5 int num,count=0 ; L6 int i; L7 int max; L8 while(count<MAX_SIZE){ L9 scanf("%d",&.num); L10 if(num==-1){ L11 break; L12 } L13 numbers[count++]=num; L14 } L15 if(count==0){ L16 printf("Error! "); L17 return 0; L18 } L19 max=numbers[0]; L20 for(i=1;i<count;i++){ L21 if(numbers[i]<max) L22 { L23 max=numbers[i]; L24 } L25 } L26 printf("%d",max); L27 return 0; L28 } 【答案】)L2 #define MAX_SIZE 100 L21 if(numbers[i]>max) 9.(2024年湖南三轮联考题)阅读程序,写出运行结果:_____________ #include <conio.h> #include <stdio.h> int main() { long f1,f2; int i; f1=f2=1; for(i=1;i<=3;i++) { printf("%ld,%ld",f1,f2); f1=f1+f2; f2=f1+f2; } getch(); } 【答案】1,12,35,8 10.(2016年湖南二轮联考题)阅读程序,写出运行结果:_____________ #include <conio.h> #include <stdio.h> int main() { int i,b,k=0; for(i=1;i<=5;i++) {b=i%2; while(b-->=0) k++; } printf("%d,%d",k,b); getch(); } 【答案】8,-2 [内容小结] 一、for循环 • 一般形式:for(初始化表达式; 条件表达式; 更新表达式) { 循环体语句; }。 • 流程图:先执行初始化表达式,再判断条件表达式,若为真(非0),执行循环体,然后执行更新表达式,之后再次判断条件;若为假(0),退出循环。 • 执行过程:初始化循环变量→判断条件→执行循环体→更新循环变量→重复判断条件,直到条件不满足退出。 • 应用举例:计算1到100的和,可写为for(int i = 1, sum = 0; i <= 100; i++) { sum += i; }。 二、循环的嵌套 指for、while、do...while这3种循环互相嵌套的结构,用于处理更复杂的重复操作场景,比如打印九九乘法表,就可通过外层循环控制行数,内层循环控制列数来实现。 三、几种循环的比较 • for循环:适合已知循环次数的情况,初始化、条件判断、更新在一处,结构紧凑。 • while循环:先判断条件,再执行循环体,循环次数可能为0,适合条件控制的循环。 • do...while循环:先执行循环体,再判断条件,循环体至少执行一次,适合至少执行一次的场景。 四、改变循环执行的状态 • break语句:用于强制退出当前所在的循环,不再执行循环中break之后的语句,若在多重循环里,只退出当前层循环。 • continue语句:跳过当前循环体中continue之后的语句,直接进入下一次循环的条件判断。 学科网(北京)股份有限公司 $

资源预览图

专题6:for循环、循环的嵌套(讲义)-《编程语言基础—C语言》(高等教育出版社第5版)高考备考讲练测(湖南省)
1
专题6:for循环、循环的嵌套(讲义)-《编程语言基础—C语言》(高等教育出版社第5版)高考备考讲练测(湖南省)
2
专题6:for循环、循环的嵌套(讲义)-《编程语言基础—C语言》(高等教育出版社第5版)高考备考讲练测(湖南省)
3
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。