循环结构.docx
- 文档编号:12220286
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:17
- 大小:24.83KB
循环结构.docx
《循环结构.docx》由会员分享,可在线阅读,更多相关《循环结构.docx(17页珍藏版)》请在冰豆网上搜索。
循环结构
循环结构
一、循环的分类
1、计数型循环:
事先知道循环的次数。
非计数型循环:
事先不知道循环的次数。
2、当型循环:
“先判断、后执行”,循环体可以最少执行0遍。
直到型循环:
“先执行,后判断”,循环体至少执行1遍。
二、while语句(当型)
1、格式:
while(表达式)
循环体语句
2、功能:
3、说明:
(1)“表达式”通常是关系或逻辑表达式,可以是任意表达式。
(2)“循环体语句”可以是一个以分号结束的语句,或是一个复合语句。
(3)这是“当型循环”,循环体可能执行0遍。
(4)“循环体语句”中通常必须有使得“表达式”不成立的操作。
即不允许出现死循环。
执行时若出现死循环,用
Ctrl+Break键终止程序的执行,再修改。
4、基本算法二:
累加
例:
1+2+3+……+100,求出该式子的和。
main()
{ints,i;
s=0;i=1;
while(i<=100)
{s=s+i;
i=i+1;}
printf(“1+2+…+100=%d\n”,s);
}
【结论】
①出循环时,i的值是101,比最后一个合法取值(终值)大1。
②把本题中的s称为“累加器”,它以“s=s+……”形式出现在循环中,所以该式称为“累加式”。
累加器在进入循环前一定要获得合适的初值,通常是0。
③本题中i是特殊的累加器,每次增1,又称“计数器”。
此题i还有一个兼职:
它在做通项的同时还兼职控制循环的次数。
又称“循环控制变量”。
三、do……while循环(直到型循环)
1、格式:
do
循环体语句
while(表达式);
2、功能:
3、说明:
(1)整个语句以“;”结束。
(2)循环体语句只能是一个语句。
当含多个语句分量时,必须用{}括成复合语句。
4、改写“1+2+……+100”
main()
{ints,i;
s=0;i=1;
do{s=s+i;
i=i+1;
}while(i<=100);
printf(“1+2+…+100=%d\n”,s);
}
例2、求
main()
{inti,t;
floats;
s=0.0;
i=1;t=1;
while(i<=99)
{s=s+1.0/i*t;
t=(-1)*t;
i=i+2;
}
printf(“1-1/3+…=%f\n”,s);
}
四、for语句(擅长于计数型循环)
1、格式:
for(表达式1;表达式2;表达式3)
语句
2、功能:
3、说明:
(1)“语句”即循环体(语句),只能是一个语句(由分号结束的单个语句或一个复合语句)。
(2)for后的()内有3个表达式,由2个分号分隔。
可以省略任意多个表达式,但分号不可以省。
(3)“表达式1”通常用来给循环控制变量等赋初值,“表达式2”通常为关系或逻辑表达式,“表达式3”通常给循环控制变量等增值。
4、改写“1+2+……+100”
main()
{ints,i;
for(s=0,i=1;i<=100;i++)
s=s+i;
printf(“%d\n”,s);
}
【省略各表达式:
】
main()
{ints,i;
s=0;i=1;
for(;;)
{s=s+i;i++;
if(i>100)break;}
printf(“%d\n”,s);
}
五、几个重要算法
1、穷举法
对所有的可能性进行判断,一旦符合条件立即处理(输出或存储等)。
例1:
求出所有的“水仙花”数,即这样的三位正整数:
其每个数位上数字的立方和等于该数本身。
比如:
153=13+53+33。
【法一:
一重循环】
main()
{intx,b,s,g;/*b-百位数字*/
for(x=100;x<=999;x++)
{b=x/100;
s=x/10%10;
g=x%10;
/*任何一个非负整数的个位数字%10*/
if(g*g*g+s*s*s+b*b*b==x)
printf(“%d\n”,x);
}
}
【结论:
计数型循环,循环次数=
循环控制变量的终值即最后一个合法取值,初值为其第一个合法取值,步长即循环控制变量每次增加的那个值。
】
【法二:
三重循环】
main()
{intb,s,g;
for(b=1;b<=9;b++)/*时针*/
for(s=0;s<=9;s++)/*分针*/
for(g=0;g<=9;g++)/*秒针*/
if(b*b*b+s*s*s+g*g*g==100*b+10*s+g)
printf("%d\n",100*b+10*s+g);
}
【补充:
循环的嵌套】
(1)外循环变化得慢,内循环变化得快。
若外循环独立执行的次数为x次,内循环独立执行的次数为y次,则核心语句被执行x×y次。
(2)外循环必须完整地套住内循环。
例2、用100元购买麦当劳(5元/份)、肯德基(7元/份),恰巧用完,问共有几种买法?
main()
{intm,k;
for(m=0;m<=20;m++)
for(k=0;k<=14;k++)
if(7*k+5*m==100)
printf(“M:
%d,K:
%d\n”,m,k);
}
例3、将1元人民币兑换成分币(1分、2分、5分),共有多少种兑换法?
输出每一种兑换法。
2、整数各数位上数字的获取
例1:
任意读入正整数,然后依次输出其低位到高位上的每一位数字。
main()
{longx;
do
scanf(“%ld”,&x);
while(x<=0);
while(x!
=0)
{printf(“%d\n”,x%10);
x=x/10;
}
}
例2:
任意读入一个整数,然后依次输出其低位到高位上的每一位数字及其符号位,但是,是0则不输出符号位。
main()
{longx;longy;
charfh;
scanf(“%ld”,&x);y=x;/*保留原值*/
if(x<0)
{fh='-';x=-x;}
else
fh='+';
do
{printf(“%d\n”,x%10);
x=x/10;
}while(x!
=0);
if(y!
=0)
printf(“%c\n”,fh);
}
3、迭代法
例1:
猴子吃桃问题。
某猴子某天摘了若干只桃子,它吃了一半,不过瘾,又多吃了1只;第二天,吃了一半,不过瘾,再多吃了1只……到第10天,发现只剩1只,问第一天摘了多少只桃子?
main()
{intpeach=1,day=10;
day--;/*想求第9天的桃子数*/
while(day>=1)
{peach=(peach+1)*2;
day--;
}
printf("Firstday:
%d\n",peach);
}
【结论:
迭代法的特征,类似于本题的peach变量,该变量不停地被新值(由原值变化而来)替代,直到该变量获得最终所求即终止。
】
main()
{intpeach=1,day=10;
day--;/*想求第9天的桃子数*/
while(day>=1)
{peach=(peach+1)*2;
printf("%dday:
%d\n",day,peach);
day--;
}
}
【for循环改写】
main()
{intpeach=1,day=10;
for(day=9;day>=1;day--)
{peach=(peach+1)*2;
printf("%dday:
%d\n",day,peach);
}
}
4、“辗转相除法”求两个正整数的最大公约数
main()
{intx,y,r;
scanf("%d%d",&x,&y);
r=x%y;
while(r!
=0)
{x=y;
y=r;
r=x%y;}
printf("%d\n",y);
}
【改写:
让“r=x%y;”只出现一次。
】
main()
{intx,y,r;
scanf("%d%d",&x,&y);
do
{r=x%y;
x=y;
y=r;
}while(r!
=0);
printf("%d\n",x);
}
【法三:
09春的一道题】不好!
!
!
main()
{intx,y,r;
scanf("%d%d",&x,&y);
while(y!
=0)
{r=x%y;
x=y;
y=r;
}
printf("%d\n",x);
}
5.素数(质数)判断
【数学定义:
只能被1和自身整除的大于1的整数。
】
【法一:
紧扣数学定义。
“大于1的整数若不能被2到自身减1整除,就叫素数。
”】
main()
{intx;intk;
do{printf(“Inputx>1!
\n”);
scanf(“%d”,&x);
}while(x<=1);
for(k=2;k<=x-1;k++)
if(x%k==0)break;
if(k==x)
printf(“%dissushu\n”,x);
else
printf(“%disnotsushu\n”,x);
}
【小技巧:
定义一个“逻辑型”变量,
实际上就定义一个整型变量(取值0或1),表示假和真,即条件不成立、成立。
】
main()
{intx;intk;intflag;
do{printf(“Inputx>1!
\n”);
scanf(“%d”,&x);
}while(x<=1);
flag=1;
/*总是假设x就是素数。
*/
for(k=2;k<=x-1;k++)
if(x%k==0){flag=0;break;}
if(flag==1)
printf(“%dissushu\n”,x);
else
printf(“%disnotsushu\n”,x);
}
【法二:
缩小判断范围,改为“2-自身的一半”】
main()
{intx;intk;intflag=1;
do{printf(“Inputx>1!
\n”);
scanf(“%d”,&x);
}while(x<=1);
for(k=2;k<=x/2;k++)
if(x%k==0){flag=0;break;}
if(flag)
printf(“%dissushu\n”,x);
else
printf(“%disnotsushu\n”,x);
}
【用while循环改写】
main()
{intx,k;
scanf(“%d”,&x);
k=2;
while(x%k!
=0)k++;
if(k==x)
printf(“%dissushu\n”,x);
else
printf(“%disnotsushu\n”,x);
}
【法三:
继续缩小判断范围到“2-”】
#include
main()
{intx,k,flag=1;
scanf(“%d”,&x);
for(k=2;k<=sqrt(x);k++)
if(x%k==0){flag=0;break;}
if(falg!
=0)
printf(“%dissushu\n”,x);
else
printf(“%disnotsushu\n”,x);
}
【补充:
】
break语句和continue语句:
(1)break语句只能出现在循环语句和switch中,用于提前跳出所在语句。
通常在if语句的控制下。
(2)continue语句只能出现在循环语句中,通常在if语句的控制下,一旦执行到continue语句,则本次循环中其后的语句不再执行,转而下一轮循环。
例如:
输出100以内所有3的倍数。
main()
{intx;
for(x=1;x<=100;x++)
{if(x%3!
=0)continue;
printf(“%d\n”,x);
}
}
6.累乘(基本算法)
例1、求n!
(n>=0的整数)。
设n=10,改写成10!
=1×2×3…×10。
main()
{longjc;
intn;intk;
scanf("%d",&n);
/*n>=0,注意n不能大*/
jc=1;
for(k=1;k<=n;k++)
jc=jc*k;
printf("%ld\n",jc);
}
main()
{floatjc;
intn;intk;
scanf("%d",&n);
jc=1;
for(k=1;k<=n;k++)
jc=jc*k;
printf("%20.0f\n",jc);
}
【累乘的算法要领:
累乘器在进入循环前,必须获得初值,通常为1;累乘式“jc=jc*……”必须出现在循环中。
注意不能溢出!
】
●算法分为“数值型”算法和“非数值型”算法两大类。
“数值型”算法主要用来解决较难的数学计算问题。
比如:
级数计算(展开式的求解)、求高次方程的根、求定积分等。
7.级数计算(展开式的求解)
关键在于描述出“通项”:
法一:
直接法。
即利用项次直接描述通项。
法二:
间接法(又称递推法),利用前项求后项。
例如:
计算1+1/2!
+1/3!
+…+1/n!
+…
的和(当某项的值小于10-6时终止)。
【法一:
直接法】
main()
{floats,t;/*t代表通项*/
intk;/*k代表项次*/
s=0.0;k=1;
t=1;/*让t先获得第一项的值*/
while(t>=1e-6)
{s=s+t;
k++;/*k加1后成下一项项次*/
/*以下复合语句求k!
*/
{longf;inti;
f=1;
for(i=1;i<=k;i++)f=f*i;
}
t=1.0/f;
}
printf(“%f\n”,s);
}
【法二:
间接法】
main()
{floats,t;
intk;
s=0.0;k=1;
t=1.0;
while(t>=1-6)
{s=s+t;
k++;
t=t/k;/*求下一项*/
}
printf(“%f\n”,s);
}
【补充】变量的定义一般集中在函数的最前面,其作用域为整个函数。
还可以定义在复合语句的最前面,其作用域为整个复合语句。
数据文件
将输出结果保存到记事本等格式的文本文件中。
方便查看运算结果。
#include
main(){inty,e,w;intn=0;
FILE*fp;
fp=fopen("D:
\\my\\fb.txt","w");
……if(y+2*e+5*w==100){n++;
{printf("%d,%d,%d\n",y,e,w);
fprintf(fp,"%d,%d,%d\n",y,e,w);}}
{printf("%d\n",n);fprintf(fp,"%d\n",n);}
fclose(fp);}
【说明】
(1)因为用到系统函数fopen、fclose、fprintf,所以要加头文件“stdio.h”(标准输入输出)。
(2)定义一个文件指针变量:
FILE*变量名;
(3)在定义后,即用fopen打开一个可以写入的文件(”w”),注意路径分隔符一定要用双斜杠(转义字符)。
fopen("盘符\\路径\\文件主名.文本类型","w"),将返回值(函数值)赋给文件指针变量。
(4)将用printf往屏幕上书写的结果也输出到文件指针变量所指的文件中(方便查看)。
fprintf专门将结果输出到文件中,格式一般与printf一样。
(5)在主函数之前,用
fclose(指针变量);
关闭文件(以便保存到外存中)。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 循环 结构