内容正文:
专题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之后的语句,直接进入下一次循环的条件判断。
学科网(北京)股份有限公司
$