null第5章 循环结构程序设计第5章 循环结构程序设计 在许多问题中都需要用到循环结构,如要求计算全校每个学生的平均成绩,计算两个正整数的最大公约数和最小公倍数等都需要用到循环控制。C语言中有三种循环语句,分别是while语句、do…while语句和for语句。 null 5.1 while循环语句
5.2 do…while循环语句
5.3 for循环语句
5.4 循环的嵌套
5.5 循环的退出
5.6 用goto语句构成循环
5.7 循环结构程序设计举例
5.1 while循环语句 5.1 while循环语句 while循环语句是用来实现“当型”循环结构的。它的特点是先判断
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
达式,后执行语句。
格式:
while(表达式)
语句;
该语句的执行顺序是:先计算表达式的值,再判断其值是否为“真”(即非0)。若结果为“真”,则执行语句;此过程重复执行,直到表达式的值为“假”(即为0)时,结束循环。其
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
图和N-S图分别如图5-1和5-2所示。 null表达式为真语句表达式语句图5.1 while循环结构流程图图5.2 while循环结构N-S图假真null说明:(1)重复执行的语句被称为循环体,表达式被称为循环表达式。
(2)因为while循环语句是当型循环结构,所以循环体有可能一次也不执行。
(3)循环体可以是任何语句,但应有使循环趋于结束的语句。 null例[5-1]求1-100之间所有奇数和
#include
void main()
{ int i, sum=0;
i = 1;
while (i<=100)
{ sum+=i;
i=i+2;
}
printf(“\n%d”, sum);
}{}内复合语句构成循环体循环条件null运行结果:2500注意:循环体如果包括一个以
上的语句,应该用花括号括起
来,以复合语句出现。 null #include "stdio.h"
main()
{ int i=1,n=0,sum=0,x;
float aver;
while(i<=10)
{scanf("%d",&x);
if(x>=50)
printf("please input again");
nullelse
{ sum+=x;
i++;}
}
aver=sum/10;
printf("aver=%f",aver);
}
null程序运行结果10↙12↙-13↙3↙9↙-6↙40↙31↙0↙23↙
aver=10.0
注意:(1)“↙”表示回车符,起到结束每
个数据输入的作用。
(2)如果循环体不是空语句,则
while的括号后面不加分号。 5.2 do…while循环语句do…while循环语句的特点是先执行,后判断。
格式:
do
语句
while(表达式);
该语句的执行顺序是:首先执行一次循环语句,然后计算表达式的值。若结果为“真”(即非0),则再次执行循环体。此过程重复执行,直到表达式的值为“假”(即为0)时,循环结束。其流程图和N-S图分别如图5-3和5-4所示。 5.2 do…while循环语句null表达式为真语句表达式语句真假图5-3 do…while循环结构流程图 图5-4 do…while循环结构N-S图 null【例5.3】分别用while循环语句和do…while循环语句实现10以内自然数的和的求解,并做相应的比较。
#include "stdio.h"
main()
{
int sum=0,i;
scanf("%d",&i);
while(i<=10)
{ 程序运行结果:1↙
sum+=i; sum=55
i++; 再运行一次:
} 11
printf("%d",sum); sum=0
}
null#include "stdio.h"
main()
{
int sum=0,i;
scanf("%d",&i);
do
{
sum+=i; 程序运行结果:1
i++; sum=55
}while(i<=10); 再运行一次:
11
printf("%d",sum); sum=11
}
null比较:
① do…while语句最后的分号不可少,但while语句花括号后不可有分号。
② 当循环条件第一次判断条件就为真时,while和do…while语句在执行过程中没有什么区别;而当循环条件第一次判断条件就为假时,while语句一次也不执行,而do…while语句至少执行一次。null【例5.4】计算x的值使1+4+7+10+13+…+x的和小于200,求出x的值。
程序如下:
#include "stdio.h"
main()
{ int x=1,sum=1;
do
{ x=x+3;
sum+=x;
}while(sum<=200);
printf("x=%d ",x);
}运行结果:34注意:循环体中要有使
循环趋于结束的语句,
否则会导致死循环。
5.3 for循环语句
C语言中for循环语句的使用最为灵活:
不仅可以用于循环次数已经确定的情况
而且可以用于循环次数不确定的情况,
它完全可以代替while循环。
5.3 for循环语句
5.3 for循环语句
格式:for(表达式1;表达式2;表达式3)语句;
该语句的执行顺序是:
先计算表达式1,接着计算表达式2,若表达式2的值为非0,则执行循环体;然后计算表达式3,再计算表达式2。若表达式2的值仍为非0,则继续执行循环体,否则退出循环。
其流程图和N-S图分别如图5-5和5-6所示。
5.3 for循环语句
null语句计算表达式3计算表达式1表达式2假真计算表达式1表达式2为真语句计算表达式3 图5-5 for循环结构流程图 图5-6 for循环结构N-S图 null说明:
(1)当表达式1或表达式2省略时,其后的分号不能省略。
(2)循环体中要有使循环趋于结束的语句。
【例5.5】计算n!的值。
程序如下:
#include "stdio.h"
main()
{ int mup=1,i,n;
scanf("%d ",&n);
for(i=1;i<=n;i++)mup*=i;
printf(“mup=%d”,mup); }null运行程序并输入:5↙ 程序运行结果:mup=120 注意:若循环体不是空语句,
不能在for语句的圆括号后加
分号。 null【例5.6】输出Fibonacci数列的前20个数。该数列具有两个特点:第一个特点是前两个数都是1;第二个特点是从第3个数开始,每个数都是其前两个数之和。
程序如下:null#include "stdio.h"
main()
{long int n1,n2;
int i;
n1=1; n2=1;
for ( i=1; i<=10; i++)
{
printf("%10ld %10ld",n1,n2);
if (i%2==0) printf("\n");
n1=n1+n2;
n2=n2+n1; }
}null运行结果如图5-7所示: 图5-7 例5.6运行结果 注意:循环10次,每次输
出一对数。每行输出4个数。 null一个循环体内又包含另一个完整的循环结构称为循环的嵌套。
① while() ② do ③ for(;;)
{… {… {
while() do for(;;)
{…} {…} {…}
} while(); }
} while() ; 5.4 循环的嵌套 null④ while() ⑤ for(;;) ⑥ do
{… {… {
do while() …
{…} {} for(;;)
while(); … {}
… } }while();
}
说明:(1)嵌套的循环控制变量一般不应同名,以免造成
混乱。
(2)循环嵌套要注意正确地使用缩进式
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
写格式来
明确循环嵌套的层次关系,以增加程序的可读性。null【例5.7】全班有20个学生,每个学生考5门课程,要求分别统计出每个学生各门课的平均成绩。null分析:
首先考虑求一个学生各门课的平均成绩,
设置循环控制变量i控制课程数,其变化从1到5,每次增量为1。
每个学生的处理过程都一样,因此只需对上述流程重复执行20遍即可。
设置循环变量j控制学生人数,其变化从1到20,每次增量也为1。 null 程序如下:
#include "stdio.h"
main()
{ int i,j,score,sum;
float aver;
j=1;
while(j<=20)
{ sum=0;
for(i=1;i<=5;i++)
{ printf("Enter No.%d the score %d:",j,i);
scanf("%d",&score);
sum=sum+score; }
aver=sum/5.0
printf("No.%d aver=%f\n",j,aver);
j++; }
}
nullprintf("Enter No.%d the score %d:",j,i);
scanf("%d",&score);
sum=sum+score; }
aver=sum/5.0
printf("No.%d aver=%f\n",j,aver);
j++; }
}
null程序运行部分结果如图5-8所示。 注意:外层循环应“完全包含”内层循环,不能发生交叉。null【例5.8】在1~5中取出3个整型数,输出其和能被4整除的个数。 程序如下:
#include "stdio.h"
main()
{ int i,j,k,n=0;
for(i=1;i<=5;i++)
for(j=i+1;j<=5;j++)
for(k=j+1;k<=5;k++)
if((i+j+k)%4==0)
{ n++; printf("i=%d j=%d k=%d \n",i,j,k);}
printf("n=%d\n ",n); }null运行结果如图5-9所示。 注意:通过本题掌握
三重for循环的用法。 5.5 循环的退出 循环的退出有break语句、continue语句和goto语句,这是三种常见的循环退出语句。
5.5.1 break语句
5.5.2 continue语句
5.5 循环的退出 nullbreak语句可以用来实现从循环体内跳出的功能,即提前结束循环。
格式:break;
该语句的功能是:
执行break语句,结束整个包含它的最内层循环。
说明:
(1)break语句只能用于switch语句或循环语句中。
(2)在嵌套的循环结构中使用时,break语句只能跳出包含它的最内层循环,不能同时跳出多层循环。
5.5.1 break语句 null【例5.9】在200以内的正整数中,找出既是15的倍数又是7的倍数的最大值。
程序如下:
#include "stdio.h"
main()
{ int i;
for(i=200;i>=0;i--)
if(i%15==0&&i%7==0)break;
printf("the result is i=%d",i);
}运行结果:the result is i=105 注意:等于号“==”和
赋值号“=”的区别。 null【例5.10】找出100~200之间第一个能被16整除的数。
程序如下:
#include "stdio.h"
main()
{ int i=100;
while(i<=200)
{ if(i%16==0)
{ printf("%d ",i); break; }
else
i++; }
}运行结果:112null【例5.11】输入5个学生的百分制成绩,分别输出其对应的等级(90~100为A,89~70为B,69~60为C,低于60为D)。
程序如下:
#include "stdio.h"
main()
{ int a,i=1;
char y;
while(i<=5)
{ scanf("%d",&a);
switch(a/10)
null{ case 10:
case 9:y='A';break;
case 8:
case 7:y='B';break;
case 6:y='C';break;
default:y='D';break;
}
printf("y=%c\n",y);
i++;}
}
运行结果:72
y=B注意:break语句在
switch语句中的用法。 nullcontinue语句的作用:
是结束本次循环,即跳过循环体中下面尚未执行的语句。
格式:
continue;
该语句的执行顺序是:执行continue语句,结束本次循环,判断是否继续循环。 5.5.2 continue句 null说明:(1)continue语句只能用于循环语句中。
(2)continue语句和break语句都实现了程序执行方向上的无条件转移,但是continue语句只结束本次循环,而不是终止整个循环的执行;break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。
null【例5.12】输入10个整数,输出其中负数的个数及所有负数的和。
分析:本题要求统计出负数的个数,并计算其和。定义一个整型变量sum用来存放所有负数的累加和,再定义一个整型变量num用来存放负数的个数。
程序如下:
#include "stdio.h"
main()
{
int i,sum=0,num=0,x;
printf("input 10 numbers:");
null for(i=0;i<10;++i)
{ scanf("%d",&x);
if(x>=0) continue;
sum+=x;
num++; }if(num) printf("num=%d,sum=%d",num,sum);
else
printf("num is 0");
}null程序运行结果:
input 10numbers:-3↙1↙3↙-1↙-4↙6↙-7↙9↙0↙-14↙
num=5,sum=-29nullgoto语句是无条件转移语句,它的作用是无条件转移。
格式:goto 语句标号;
说明:
goto语句和if语句配合使用,可实现循环功能。
5.6 用goto语句构成循环
null【例5.13】从键盘输入10个整数,求其累加和。可用goto语句和if语句配合实现。
程序如下:
main()
{
int i=1,sum=0,x;
loop:if(i>10)goto end;
printf("enter a data:");
scanf("%d",&x);
sum+=x;
i++;
goto loop;
end: printf("sum=%d",sum);
} null程序运行结果:
enter a data:3↙
enter a data:5↙
enter a data:2↙
enter a data:4↙
enter a data:10↙
enter a data:30↙
enter a data:15↙
enter a data:18↙
enter a data:20↙
enter a data:22↙
sum=129说明:loop和end都是语句标号。null5.7 循环结构程序设计举例【例5.14】求1~100之间的全部素数。
分析:(1)素数求解可采用如图5-10所示的算法:
先求出数m的平方根k,然后让该数m被2到k除。
输入m求m的平方根ki=2当i<=km能被i整除?是否用break结束循环i=i+1i>k? 是否 输出m是素数输出m不是素数null 如果m能被2~k之间的任何一个整数整除,则提前
结束,说明该数不是素数,此时的i必然小于或等
于k。
如果m不能被2~k之间的任何一个整数整除,则不
提前结束循环,在结束循环后,i=k+1,说明该数是
素数。
(2)本题用一个嵌套的for循环即可实现其功能,
内层循环用来判断是否是素数,外层循环产生1~
100的自然数。
null程序如下:
#include "stdio.h"
#include"math.h" main()
{
int k,m,i,n=0; for(m=1;m<=100;
m=m+2)
{ k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)break;
if(i>k)
{printf("%2d",m);n++;}
if(n%10==0) printf(“\n”);}
printf("\nn=%d\n",n);
}null程序运行结果:
1 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97
n=25 null【例5.15】将原文转换为密文。
通常在互联网上传送信息时,为保证安全,发送者先按一定的规律将原文转换为密文,然后发送给接收者,接收者收到密文后,再将密文按约定的规律译回原文。
例如,转换规律为:字母转换为其后第6个字母,非字母不变。null分析:
(1)先判断该字符是否是大写字母或者是小写字母,若是,则将其值加6(变成其后的第6个字母)。
(2)若加6之后字符值大于'Z'或'z',则表示原来的字母在'T'或't'之后,应按图5-11所示的规律将它转换为'A'~'F'(或'a'~'f')之一。方法是使其减26。 null图5-11 转换
规则
编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf
示意图 null程序如下:
#include
void main()
{ char ch;
while ((ch=getchar())!='\n')
{if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{ ch=ch+6;
if(ch>'Z'&&ch<='Z'+6||ch>'z')ch=ch-26;}
printf("%c",ch);
}
}null输入“I am a student.”后,程序运行结果如图5-12所示。 图5-12 例5.15运行结果 null例:打印图形(矩形)
#include
void main()
{ int i, j;
for (i=1;i<=4;i++)
{for (j=1;j<=10;j++)
printf(“*”);
printf(“\n”)
}
}
打几行每行打几列打完一行换行
**********
**********
**********
**********i=1
2
3
4j12345678910null例6-2:打印图形(平行四边形)
#include
void main()
{ int i, j,k;
for (i=1;i<=4;i++)
{ for (k=1;k<=i;k++)
printf(“ ”);
for (j=1;j<=10;j++)
printf(“*”);
printf(“\n”)
}
}
打几行每行打几列打完一行换行每行前空多少
**********
**********
**********
**********null例6-3:打印图形(三角形)
#include
void main()
{ int i, j,k;
for (i=0;i<=3;i++)
{ for (k=1;k<=10-i;k++)
printf(“ ”);
for (j=0;j<=2*i;j++)
printf(“*”);
printf(“\n”)
}
}打几行每行打几列打完一行换行每行前空多少
*
***
*****
*******null【例5.16】百马百瓦问题。有100匹马,驮100块瓦,大马驮3块,小马驮2块,两个马驹驮1块。问大马、小马、马驹各多少?编程列出所有可能的驮瓦方案。
分析:设大马、小马、马驹各为x、y、z只,根据题目要求,可以用下列方程表示:
x+y+z=100
3x+2y+z/2=100
这是一个不定方程,未知数多于方程数,此题有若干个解。要解此不定方程应先固定一个变量的值,然后求其他两个值。即对其余两个变量的各可能值一一测定,看它是否满足方程。显然这是一个穷举问题。利用穷举法,只要将各种可能的组合一一测试,将符合条件的组合输出即可。null程序如下:
#include "stdio.h"
main()
{ int x,y,z;
for(z=98; z>=2;z=z-2)
for(y=50; y>=1; y--)
for(x=0; x<=33; x++)
if(z+x+y==100&&3*x+2*y+z/2==100)
printf("x=%2d,y=%2d,z=%2d\n",x,y,z);
}null程序运行结果如图5-13所示。 图5-13 例5.16运行结果 null【例5.17】小猴吃桃问题。有一天小猴摘下了若干个桃子,当即吃掉一半,还不过瘾,又多吃了一个;第二天接着吃了剩下的桃子的一半后又多吃一个;以后每天都吃尚存桃子的一半零一个,到第10天早上要吃时只剩下一个了。问小猴第一天共摘下了多少个挑子?
分析:这是一个“递推”问题,先从最后一天推出倒数第二天的桃子,再从倒数第二天的桃子推出倒数第三天的桃子…… 。
设第n天的桃子为x,它是n-1天的桃子数的一半减l个,即:
xn=xn-1-1
那么n-1天的桃子数为:
xn-1=(xn+1)×2 (递推公式)
已知第10天的桃子数x10为1,根据递推公式可得第9天的桃子数x9为4,……。 null程序如下:
#include "stdio.h"
main()
{
int i,x;
x=1; /*第10天的桃子数*/
for(i=9; i>=1;i--)
{ x=(x+1)*2 ;
printf( "i=%2d,x=%d\n",i,x); } /*第i天的桃子数为x只*/
}null程序运行后显示结果如图5-14所示。 图5-14 例5.17运行结果 null习 题 一、选择题
1.设int n=1,则执行循环“while(n++<5);”后n的值
是:
A.6 B.5 C.1 D.-264
2.执行语句“for(i=0;i++<3;)prinf(” %d“,i);”
后,程序输出为:
A.2345 B.012 C.123 D.234
null
3.在下述程序中,判断ij)
{ printf("%d",s);
break;}
s+=i;} }
A.4 B.7 C.5 D.6 null4.下列程序的输出结果是:
#include "stdio.h"
main()
{ int x=0,y=5,z=3;
while(z- -&&++x<50)
y--;
printf("%d,%d,%d\n ", x,y,z); }
A 3,2,0 B.3,2,-1 C.4,3,-1 D.5,-2,-5null5.以下程序的功能是:按顺序读入10名学生4门课程的成绩,计算出每位学生的平均分并输出,程序如下:
main()
{ int n,k;
float score,sum,ave;
sum=0.0;
for(n=1;n<=10;n++)
{ for(k=1;k<=4;k++)
{ scanf("%f",&score); sum+=score; }
ave=sum/4.0;
printf("NO%d:%f\n",n,ave);
}
}null上述程序运行后结果不正确,调试中发现有一条语句出现在程序中的位置不正确。这条语句是:
A.sum=0.0;
B.sum+=score
C.ave=sum/4.0;
D.printf("NO%d:%f\n",n,ave);null6.以下程序中,while循环的循环次数是:
main()
{ int i=0;
while(i<10)
{ if(i<1) continue;
if(i==5) break;
i++;
}
......
}
A.1 B.10
C. 6 D.死循环,不能确定次数 null二、填空题
1.下面程序的功能是:计算1~10之间的奇数之和与偶数之和,将该程序补充完整。
#include "stdio.h"
main()
{ int a,b,c,i;
a=c=0;
for(i=0;i<=10;i+=2)
{ a+=i;
;
c+=b;
}
printf("偶数之和=%d\n ",a);
printf("奇数之和=%d\n ",c-11); } null2.执行下面程序段后,x和i的值分别是 和 。
main()
{ int x,i;
for(i=1,x=1;i<=20;i++)
{ if(x>=10)break;
if(x%2==1)
{ x+=5;continue;}
x-=3;
}
}null3.程序运行后的输出结果是 。
main()
{ int x=l5;
while (x>10&&x<50)
{ x++;
if(x/3) { x++;break; }
else continue;
}
printf("%d\n",x);null4.有以下程序
#include
main()
{ char c;
while((c=getchar())!='?')
putchar(--c); }
程序运行时,如果从键盘输入:Y?N?<回车>,则输出结果为 。null5.程序的输出结果是 。
#include
main()
{ int i=0,a=0;
while(i<20)
{ for(;;)
{ if((i%10)==0) break;
else i--; }
i+=11; a+=i;
}
printf("%d\n",a); } null三、读程题
给出以下程序的输出结果
1. #include
main()
{ int x,i;
for(i=1;i<=100;i++)
{ x=i;
if(++x%2==0)
if(++x%3==0)
if(++x%7==0)
printf("%d ",x);} }null2. #include
main()
{ int i,b,k=0;
for(i=1;i<=5;i++)
{ b=i%2;
while(b--==0)k++;
}
printf("%d,%d ",k,b);
}null3. #include
main()
{ int s,i;
for(s=0,i=1;i<3;i++,s+=i);
printf("%d\n",s);
}null4. #include
main()
{ int i=10, j=0;
do
{ j=j+i; i--;}
while(i>2);
printf("%d\n",j);
}
null5. #include
main()
{ int n1,n2;
scanf("%d",&n2);
while(n2!=0)
{ n1=n2%10;
n2=n2/10;
printf("%d",n1);
}
}
程序运行后,如果从键盘上输入1234,则输出结果为 。 null四、编程题
1.从键盘输入一批整数,最后一个数为0,编程找出其中的最大数和最小数,并输出。
2.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
3.求下列分数序列的前20项之和。
4.打印图形。
*
* * *
* * * * *
* * *
*null5.打印图形。
1
123
12345
1234567
123456789null实验五 循环结构程序设计 【实验目的】
1.掌握循环结构的执行过程。
2.熟练掌握正确使用while、do…while、for循环语句和break、continue退出循环的方法。
3.掌握循环结构的嵌套。 null1.针对求解10的阶乘,做如下练习。
(1)输入、调试并运行以下程序:
#include
main()
{ int i,t=1;
for(i=1;i<=10;i++)
t=t*i;
printf("10!=%d",t);
}null(2)对上述程序做如下修改:
#include
main()
{ int i=1,t=1;
while (i<=10)
{ t*=i;
i++;
}
printf("10!=%d",t);
}null(3)调试、运行该程序,并比较两种循环方法的
区别和联系。 null2.输出一张乘法口诀表。
要求:
(1)参考下面的程序编程完成其功能。
(2)查看将参考程序中第5行for(y=1;y<=9;y++)改为for(y=1;y<=x;y++)后再运行结果有什么不同?
参考程序如下:null#include
main()
{ int x,y;
for(x=1;x<=9;x++)
{
for(y=1;y<=9;y++)
printf(" %3d*%d=%2d",x,y,x*y);
printf("\n");
}
} null3.下面程序的功能是:计算x以内最大的5个能被12或15整除的自然数之和,x 的值由键盘输入。调试并改正下面程序中的错误。
参考程序如下:null#include
main()
{ int x,m=0,n=0;
printf("x=");
scanf("%d",&x);
while(n<5)
{ if(x%12=0|| x%15=0)
{ m+=x;
n++;
x--;
}
printf("sum=%d",m);
}null4.编程实现以下功能:
(1)计算s=1-3+5-7+9…-99+101。
(2)计算s=3!+6!+9!+…+18!。
(3)输出前30个素数,每行输出6个。
(4)输入1行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
(5)输入两个正整数m和n,求其最大公约数和最小公倍数。null2.输出一张乘法口诀表。
要求:
( 1 ) 参考下面的程序编程完成其功能。
(2)查看将参考程序中第5行for(y=1;y<=9;y++)改为for(y=1;y<=x;y++)后再运行结果有什么不同?
参考程序如下:null#include
main()
{ int x,y;
for(x=1;x<=9;x++)
{
for(y=1;y<=9;y++)
printf(" %3d*%d=%2d",x,y,x*y);
printf("\n");
}
}