C语言第四章-循环结构程序设计_第1页
C语言第四章-循环结构程序设计_第2页
C语言第四章-循环结构程序设计_第3页
C语言第四章-循环结构程序设计_第4页
C语言第四章-循环结构程序设计_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章循环结构程序设计本章要点:自增自减运算符复合赋值运算符逗号运算符和逗号表达式while语句do…while语句for语句常用算法例4-1水仙花数的判定问题题目要求:输入一个整数,判断是不是水仙花数。水仙花数是指一个3位数,百位、十位、个位数字的立方和等于该数本身。例如:153=13+53+33例4-1程序#include<stdio.h>voidmain(){ inti,a,b,c; printf("输入一个三位数整数:\n"); scanf("%d",&i); if(i<100||i>999)

{printf("输入错误!\n");} else

{ a=i/100; b=i%100/10; c=i%10; if(i==a*a*a+b*b*b+c*c*c)

{printf("%d是水仙花数\n",i); } else

{printf("%d不是水仙花数\n",i);} }}例4-1扩展

求所有的水仙花数a=i/100;b=i%100/10;c=i%10;if(i==a*a*a+b*b*b+c*c*c) {printf("%d是水仙花数\n",i); }else

{printf("%d不是水仙花数\n",i);问题分析:以上语句为水仙花数的判断,求解所有的水仙花数,那么i的取值范围从100到999,对于i的每一次取值,都进行水仙花数的判断,那么,上述语句那么是需要重复执行的。程序设计中,可以通过循环结构来实现这一功能。4.1循环概述循环是在循环条件为真时计算机反复执行的一组指令〔循环体〕。

循环结构两大要素:循环条件p:结束循环的条件表达式循环体A:循环执行的语句或语句组C语言可实现循环的语句:for语句while语句do~while语句4.2for语句一般形式:for(表达式1;表达式2;表达式3){

循环体语句}

循环体语句可以是单条语句也可以是复合语句。

建议无论循环体有几条语句,一律都加大括号{}。执行流程:for(表达式1;表达式2;表达式3){

循环体语句}循环体语句for语句一般应用形式:for(循环变量赋初值;循环条件;循环变量增值){ 循环体语句;}for语句通常用于计数控制用专门的循环变量来计算循环的次数,循环变量的值在每次执行完循环体各语句后递增,到达预定循环次数时那么终止循环,继续执行循环结构后的语句。

如果每次循环完后,循环变量的值加1,该怎么表示呢?

i=i+1;

还有没有其他表示形式呢?4.3自增、自减运算符++、--作用:使变量值加1或减1类型前缀:++i=>i=i+1

--i=>i=i-1后缀:

i++=>i=i+1

i--=>i=i-1说明:++、--不能用于常量和表达式,如5++,(a+b)++结合方向:自右向左优先级:-++------->*/%----->+-

(2)(3)(4)使用原那么:(1)增量运算符单独使用时,前缀形式和后缀形式的结果是一样的。inta=1,b=1;a++;++b;printf(“%d,%d”,a,b);//2,2使用原那么:(2)增量运算符作为表达式的一局部时,前缀形式和后缀形式的执行过程是不一样的。前缀++i,--i(先执行i+1或i-1,再使用i值〕k=++i;i=i+1;

k=i;printf(“%d”,++i);i=i+1;printf(“%d”,i);后缀i++,i--(先使用i值,再执行i+1或i-1〕k=i++;k=i;i=i+1;

printf(“%d”,i++);printf(“%d”,i);i=i+1;

例:a=3;b=5;c=(++a)*b;a=3;b=5;c=(a++)*b;//c=20,a=4//c=15,a=4优点:自增、自减运算生成的代码效率更高。存在的问题:过多的增1和减1运算混合会产生什么结果呢?可读性差:例如:〔n++)+(n++)不同的编译器产生的运行结果不同。

良好的编程风格提倡:在一行语句中,一个变量只出现一次增量、减量运算符。例4-1扩展

程序#include<stdio.h>voidmain(){ inti,a,b,c; for(i=100;i<1000;i++) { a=i/100; b=i%100/10; c=i%10; if(i==a*a*a+b*b*b+c*c*c) { printf("%d是水仙花数\n",i); }

}}关于for循环的几点说明for语句中表达式可以局部或全部省略,但两个“;”不能省略。当省略表达式2时,因为缺少循环条件的判断,会形成无限循环。for语句中的表达式可以是任意有效的C语言表达式。表达式2一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。for(;(c=getchar())!='\n';)printf("%c",c);例4-2累加求和问题求:1+2+3+……+100#include<stdio.h>voidmain(){inti,sum=0;

for(i=1;i<=100;i++)

{

sum=sum+

i;

}printf("%d",sum);}为什么sum=sum+i能实现累加?sum=0的作用是什么?4.4复合赋值运算符复合赋值运算符种类:+=-=*=/=%=

含义:exp1op=exp2exp1=exp1opexp2a+=3a=a+3x*=y+8x=x*(y+8)x%=3x=x%3#include<stdio.h>voidmain(){inti,sum=0;

for(i=1;i<=100;i++)

{

sum+=i;

}printf("%d",sum);}如何求1+3+5+…+99?for(i=1;i<=99;i+=2)for(i=1;i<=99;i=i+2)for(i=1;i<=99;i+2)对吗?如何快速计算1+2+3+…+100?i<jsum=sum+

i+j;程序#include<stdio.h>voidmain(){inti,j,sum=0;for(i=1,j=100;i<j;i++,j--)

{

sum=sum+i+j;

}

printf("%d\n",sum);}4.5逗号运算符和逗号表达式形式:表达式1,表达式2,……表达式n结合性:从左向右优先级:15逗号表达式的值:等于表达式n的值例a=3*5,a*4,a+5//a=15,表达式值20说明:多数情况下,并不使用整个表达式的值更常见的是分别得到各表达式的值——顺序求值运算符主要用在循环语句中,同时对多个变量赋初值等累加型算法假设设i为循环变量,s为前n项累加之和,那么程序的根本结构为:s=0;for(i=1;i<=n;i++){s=s+通项;}累加型问题的根本算法【累加型】类型诸如□+□+□+□+……+□+□

求其前n项之和的编程题。要点:和初始化为0或第一项关键是寻找累加和的构成规律〔通项〕1.寻找累加项与循环变量之间的关系2.寻找累加项前后项之间的关系累加项和循环变量有关例4-3累乘求积问题求n!:n!=1×2×3×……×n#include<stdio.h>voidmain(){inti,n,p=1;printf("inputn:\n");scanf("%d",&n);for(i=1;i<=n;i++){

p=p*i;}printf("p=%d\n",p);}阶乘型问题的根本算法【阶乘型】类型诸如□×□×□×□×……×□×□

求其前n项之积的编程题。阶乘型算法假设设i为循环变量,p为前n项相乘之积,那么程序的根本结构为:p=1;for(i=1;i<=n;i++){p=p*通项;}注意:乘积要初始化为14.6while和do…while语句一般形式:while(表达式)

{

循环体语句;}

一、while语句执行流程:for语句和while语句比较:例求#include<stdio.h>voidmain(){

inti,sum=0;

i=1;while(i<=100){

sum=sum+i;

i++;}printf("%d",sum);}循环初值循环变量增值循环条件注意:循环体中应有使循环趋向于结束的语句。无限循环:while(1)

{

循环体;

}注意:无限循环中,通过在循环体中加break语句对循环进行控制。#include<stdio.h>voidmain(){ inti=1;while(1) /*循环表达式始终为真*/ { printf("%d*%d=%d\n",i,i,i*i);

i++; if(i>10) break; /*i>10时,break语句跳出循环*/ }}

二、do…while语句一般形式:do{

循环体语句;}while(表达式);执行流程:while语句和do…while语句比较:特点:先执行循环体,后判断表达式,至少执行一次循环体特点:先判断表达式,后执行循环体,循环体有可能一次也不执行例while和do…while比较#include<stdio.h>void

main(){inti,sum=0;scanf("%d",&i);do

{sum=sum+i;

i++;}while(i<=10);printf("%d",sum);}#include<stdio.h>void

main(){inti,sum=0;scanf("%d",&i);

while(i<=10)

{sum=sum+i

;

i++;}printf("%d",sum);}运行情况如下:运行情况如下:

11sum=55sum=55运行情况如下:运行情况如下:

1111sum=11sum=0;当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。否那么,二者结果不相同(指二者具有相同的循环体的情况)。三、选择循环的一般原那么循环次数已知计数控制的循环for语句循环次数未知由给定条件控制条件控制的循环while语句循环体至少要执行一次do…while语句输入n个数,求它们的和。#include<stdio.h>voidmain(){inti,m,n,sum=0;printf("inputn:\n"); scanf("%d",&n);for(i=1;i<=n;i++)

{

printf("inputm:\n");

scanf("%d",&m);

sum=sum+m;

}printf("sum=%d\n",sum);}输入一批数,输入0作为结束标志,求它们的和。#include<stdio.h>voidmain(){inti,m,sum=0;printf("inputm:\n");scanf("%d",&m);while(m!=0){

sum=sum+m;

printf("inputm:\n");

scanf("%d",&m); }printf("sum=%d\n",sum);}例4-4判断质数〔素数〕题目要求:输入一个整数m,判断是否为质数。什么是质数?只能被1和它本身整除的数〔1除外〕,如:2,3,5,7,11,13……思路:m依次被2,3,…m-1整除,如果都除不尽那么为质数,只要有一个能除尽,那么不是质数。例4-4程序#include<stdio.h>voidmain(){inti,m;printf("inputm:\n");scanf("%d",&m);for(i=2;i<=m-1;i++){

if(m%i==0)

printf("%d不是质数",m);

else

printf("%d是质数",m);}}有问题吗?例4-4程序#include<stdio.h>voidmain(){inti,m;printf("inputm:\n");scanf("%d",&m);for(i=2;i<=m-1;i++){

if(m%i==0)

printf("%d不是质数",m);}

printf("%d是质数",m);}还有问题吗?4.7循环控制语句

一、break语句功能:在循环语句和switch语句中,终止并跳出循环体或开关体一般形式为:break;说明:break只能终止并跳出最近一层的结构Break只能用于循环语句和switch语句中在循环语句中,break语句一般都是与if语句一起使用。while(表达式1){

语句组1 if(表达式2)break;

语句组2}例4-4程序#include<stdio.h>voidmain(){inti,m;printf("inputm:\n");scanf("%d",&m);for(i=2;i<=m-1;i++){

if(m%i==0)

{printf("%d不是质数",m);

break;}}

printf("%d是质数",m);}还有问题吗?质数的判断应该在循环结束后方法一:利用循环变量的值#include<stdio.h>voidmain(){inti,m;printf("inputm:\n");scanf("%d",&m);for(i=2;i<=m-1;i++){

if(m%i==0)break;}

if(i==m){printf("%d是质数",m);}else{ printf("%d不是质数",m);}}方法二:利用标记变量〔推荐〕#include<stdio.h>voidmain(){inti,m,flag=0;printf("inputm:\n");scanf("%d",&m);for(i=2;i<=m-1;i++){

if(m%i==0)

{flag=1;

break;}}

if(flag==1){printf("%d不是质数",m);}else{ printf("%d是质数",m);}}例4-4优化程序#include<stdio.h>#include<math.h>voidmain(){inti,m,k,flag;printf("inputm:\n");scanf("%d",&m);

flag=0;k=sqrt(m);for(i=2;i<=k;i++){

if(m%i==0)

{flag=1;

break;}

}

if(flag==0){printf("%d是质数",m);}else{printf(“%d不是质数",m);}}

二、continue语句功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断如:

while(表达式1) {

语句组1

if(表达式2)continue;

语句组2 }

说明:continue语句使用应该注意的问题〔1〕continue语句只能用在循环语句中。〔2〕一般都是与if语句一起使用。continue语句只结束本次循环,而不是终止整个循环的执行。而break语句那么是结束整个循环过程,不再判断执行循环的条件是否成立。例求输入的十个整数中正数的个数及其平均值#include<stdio.h>main(){inti,a,num=0;floatsum=0;for(i=0;i<10;i++){scanf("%d",&a); if(a<=0)continue; num++; sum+=a;}printf("正数个数:%d\n",num);printf("正数平均值:%6.2f\n",sum/num);}if(a>0){num++;sum+=a;}

三、goto语句功能:无条件转移语句说明:限制使用goto语句goto语句一般格式:goto语句标号;

….…..标号:语句;4.8多重循环循环的嵌套三种循环可互相嵌套,层数不限外层循环可包含两个以上内循环,但不能相互交叉

for(;;)

{……

do

{……

}while();……

while()

{……

}…...}内循环外循环内循环嵌套循环的执行流程:外层循环执行1次,内层循环要完成所有的循环。例4-5图形输出#include<stdio.h>voidmain(){ inti,j; for(i=1;i<=5;i++) {

for(j=1;j<=i;j++)

printf("*");

printf("\n"); }}输出由星号构成的一个5行的直角三角形****************************************输出由星号构成的一个5行的等腰三角形#include<stdio.h>voidmain(){ inti,j; for(i=1;i<=5;i++) {

for(j=1;j<=5-i;j++)printf(“”);for(j=1;j<=2*i-1;j++) printf("*"); printf("\n"); }}例4-6输出九九乘法表#include<stdio.h>voidmain(){ inti,j; for(i=1;i<=9;i++) { for(j=1;j<=i;j++) printf("%d*%d=%-4d",j,i,i*j); printf("\n"); }}ij1*1=11*2=22*2=41*3=32*3=63*3=9……1*9=92*9=183*9=274*9=36……9*9=81循环结构常见错误for语句中,用逗号分隔三个表达式for(i=1,i<10,i++){

sum+=i;}for语句表达式

圆括号后面加分号for(i=1;i<10;i++);{

sum+=i;}循环结构常见错误while语句中表达式

圆括号后面加分号while(i<10);{

sum+=i;

i++;}do…while语句中while后面忘记加分号do{

sum+=i;

i++;}while(i<10)循环结构常见错误循环语句中循环体是复合语句时忘记加大圆括号while(i<10)sum+=i;

i++;循环开始前,未将计数器变量、和变量和乘积变量初始化。例4-7阶乘的累加和问题求∑n!=1!+2!+3!…+n!

〔n由键盘输入〕外循环为累加型内循环为阶乘型程序:#include<stdio.h>voidmain(){inti,j,n;floats,p;printf("请输入n=");scanf("%d",&n);s=0;for(i=1;i<=n;i++){

p=1;for(j=1;j<=i;j++)

p=p*j;

s=s+p;}printf("Sum=%.0f\n",s);}在同一个循环中先阶乘,后累加s=0;p=1;for(i=1;i<=n;i++){p=p*i;

s=s+p;}例4-8穷举法把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出。百元买百鸡:用一百元钱买一百只鸡。公鸡5元/只,母鸡3元/只,小鸡1元/3只。分析:设公鸡为x只,母鸡为y只,小鸡为z只。x+y+z=1005x+3y+z/3=100这是个不定方程——三元一次方程组问题〔三个变量,两个方程〕#include<stdio.h>voidmain(){intx,y,z;for(x=0;x<=100;x++)

for(y=0;y<=100;y++)

for(z=0;z<=100;z++)

{

if(x+y+z==100&&5*x+3*y+z/3.0==100)

printf("cocks=%d,hens=%d,chickens=%d\n",x,y,z);

}}结果:x=0,y=25,z=75x=4,y=18,z=78x=8,y=11,z=81x=12,y=4,z=84讨论

要进行101×101×101=1030301次运算。

令z=100-x-y只进行101×101=10201次运算#include<stdio.h>voidmain(){intx,y,z;for(x=0;x<=100;x++)for(y=0;y<=100;y++){z=100-x-y;if(5*x+3*y+z/3.0==100)printf(“cocks=%d,hens=%d,chickens=%d\n",x,y,z);}}

取x<=19,y<=33只进行20×34=680次运算例4-9逆序输出正整数给定一个正整数,判断是几位数。#include<stdio.h>voidmain(){ longn,num=0; scanf("%ld",&n); while(n>0) { n=n/10; num++; } printf("%d",num);}给定一个正整数,要求将其逆序输出。#include<stdio.h>voidmain(){ longn,m=0; scanf("%ld",&n); while(n>0) { m=m*10+n%10; n=n/10; } printf("%ld",m);}例4-10求最大公约数输入两个数a和b,输出它们的最大公约数•输入:1218•输出:6方法一:枚举法1.设i为2;2.如果a和b都能被i整除,那么记下这个i3.i加1后重复第2步,直到i等于a或b;4.那么,曾经记下的最大的可以同时整除a和b的i就是最大公约数。#include<stdio.h>voidmain(){ inta,b,i,min,gcd; scanf("%d%d",&a,&b);

if(a>b)

{min=b; } else

{min=a; } for(i=1;i<=min;i++)

{

if(a%i==0&&b%i==0)

{gcd=i;} } printf(“%d和%d的最大公约数是%d\n",a,b,gcd);}方法二:辗转相除法原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。1.a÷b,令r为所得余数〔0≤r<b〕假设r=0,算法结束;b即为答案。2.互换:置a←b,b←r,并返回第一步#include<stdio.h>voidmain(){ intoriga,origb,a,b,temp; scanf("%d%d",&a,&b); origa=a; origb=b; if(a<b)

{ temp=a;a=b;b=temp; }

while(b!=0) {

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论