为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

c5

2011-12-14 50页 ppt 494KB 23阅读

用户头像

is_343929

暂无简介

举报
c5null第5章 程序控制结构 第5章 程序控制结构 第5章 程序控制结构第5章 程序控制结构5.1 复合语句 5.2 条件控制语句 5.2.1  if 语句 5.2.2 switch 语句 5.3 循环控制语句 5.3.1 while语句 5.3.2 do-while 语句 5.3.3 for 语句 5.3.4 循环小结 5.4辅助控制语句 5.4.1 break与continue语句 5.4.2 goto语句 5.4.3 函数调用和return语句 5.5程序举例...
c5
null第5章 程序控制结构 第5章 程序控制结构 第5章 程序控制结构第5章 程序控制结构5.1 复合语句 5.2 条件控制语句 5.2.1  if 语句 5.2.2 switch 语句 5.3 循环控制语句 5.3.1 while语句 5.3.2 do-while 语句 5.3.3 for 语句 5.3.4 循环小结 5.4辅助控制语句 5.4.1 break与continue语句 5.4.2 goto语句 5.4.3 函数调用和return语句 5.5程序举例 5.5.1穷举 5.5.2迭代 5.1 复合语句5.1 复合语句可以用一对花括号{ }把一组说明和语句括在一起构成一个复合语句(也叫分程序),它的一般形式如下: { [数据说明部分;] 执行语句部分; } 复合语句在语法上等价于单个语句,可以用在单个语句可能出现的所有地方。 5.2 条件控制语句 5.2 条件控制语句   选择结构分为if-else结构与switch-case结构。 5.2.1  if 语句    1.if语句的简单形式 if(达式) 语句 其中表达式不限于逻辑表达式或关系表达式,可以是各种表达式,如算术表达式等。当表达式的值为非零时,结果为“真”;当表达式的值为零时,结果为“假”。5.2.1 if 语句5.2.1 if 语句例5-1 判断一个数是偶数还是奇数。源程序如下: #include int main(void) { int n,rem; printf("enter a number:"); scanf("%d",&n); rem=n%2; if (rem==0) printf("the number %d is an even number\n",n); if (rem!=0) printf("the number %d is an odd number!\n",n); return 0; }if-else结构 if-else结构 if-else结构的基本形式是: if(表达式) 语句1 else 语句2 当表达式的结果为真(非零)时,执行语句1,执行完后跳到下一语句。当表达式的结果为假(零)时,执行语句2,执行完后顺序执行下一语句。if-else结构if-else结构例5-1可以改写为: #include int main(void) { int n,rem; printf("enter a number:"); scanf("%d",&n); rem=n%2; if (rem= =0) printf(“the number %d is an even number\n”,n); else printf(“the number %d is an odd number!\n”,n); return 0; }if-else结构if-else结构例5-2 例1-1的程序实现,即输入三个数,然后输出其中最大的数。 #include int main(void) { int num1,num2,num3,max; printf("Please input three numbers:"); scanf("%d,%d,%d",&num1,&num2,&num3); //输入三个整数 if (num1>num2) //比较num1和num2,将大的数赋给max max=num1; else max=num2; if (num3>max) //比较num3和max,将大的数赋给max max=num3; printf("The three numbers are:%d,%d,%d\n",num1,num2,num3); printf("max=%d\n",max); return 0; }else-if结构else-if结构else-if结构的形式如下: if(表达式1) 语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 …… …… else if(表达式n) 语句n else 语句n+1else-if结构else-if结构说明: (1)在else-if结构中,if语句…else if语句…else语句属于同一程序模块。每运行一次程序,仅有一个分支的语句能得到执行。 (2)各个表达式所表示的条件必须是互斥的,也就是说,只有条件1(表达式1)不满足时才会判断条件2,只有条件2也不满足时才会判断条件3,依次类推。只有所有条件都不满足时才执行最后的else语句。例如: if (salary>1000) //当salary>1000时,index取值为0.4 index=0.4; else if (salary>800) //当800600) //当600400) //当400 #include int main(void) { float x,y; printf("Enter x="); scanf("%f",&x); if (x>=4.0) y=y=1+x+x*x ; else if(x>=3.0) y=log10(x); else if(x>=2.0) y=x*x+exp(x); else if(x>=1.0) y=sqrt(x) +log(x); else y=1+x+x*x ; printf("x=%f ,y=%f\n",x,y); return 0; }if语句的嵌套 if语句的嵌套 C语言提供了一个简单:从内层开始,else总是与它上面最近的(未曾配对的)if配对。 if语句的嵌套if语句的嵌套例5-4 求一元二次方程ax2+bx+c=0的解。 分析:一元二次方程ax2+bx+c=0的根有以下几种情况: (1)当a=0且b=0时,方程无解; (2)当a=0,b≠0时,方程只有一个实根-c/b; (3)当a≠0时,方程的根为下式: 当b2-4ac≥0时方程有两个实根;当b2-4ac≤0时,方程有两个虚根。if语句的嵌套if语句的嵌套#include #include int main(void) { float a,b,c; scanf("%f,%f,%f",&a,&b,&c); if(a==0.0) if(b==0.0) printf("no answer due to input error\n"); else printf("the single root is %f\n",-c/b); if语句的嵌套if语句的嵌套 else { double disc,twoa,term1,term2; disc=b*b-4*a*c; twoa=2*a; term1=-b/twoa; term2=sqrt(fabs(disc))/twoa; if(disc<0.0) printf("complex root:\n real part=%f, imag part=%f\n", term1, term2); else printf("real root:\n root1=%f,root2=%f\n",term1+term2,term1-term2); } return 0; }if语句的嵌套if语句的嵌套用else-if结构改写例5-4,源程序如下: #include #include int main(void) { float a,b,c; scanf("%f,%f,%f",&a,&b,&c); if(a= =0.0&&b= =0.0) printf("no answer due to input error\n"); else if(a= =0.0&&b!=0.0) printf("the single root is %f\n",-c/b); if语句的嵌套if语句的嵌套 else if (a!=0.0) { double disc; float term1,term2; disc=b*b-4*a*c; term1=-b/(2*a); term2=sqrt(fabs(disc))/(2*a); if(disc<0.0) printf("complex root:\n real part=%f, imag part=%f\n", term1, term2); else printf("real root:\n root1=%f,root2=%f\n", term1+term2, term1-term2); } return 0; } if语句的嵌套if语句的嵌套例5-5 编程序判断某一年是否为闰年。 #include int main(void) { int year,leap=0; /* leap=0:预置为非闰年*/ printf("Please input the year:"); scanf("%d",&year); if (year % 4==0) { if (year % 100 != 0) leap=1; } if (year%400==0) leap=1; if (leap) printf("%d is a leap year.\n",year); else printf("%d is not a leap year.\n",year); return 0; }if语句的嵌套if语句的嵌套在if-else结构的嵌套应用中,嵌套在if 语句中的另一个 if 语句可以用逻辑运算符&&替换;嵌套在一个else子句中的if 语句可以用逻辑运算符 || 替换。因此例5-5可以改写为: #include int main(void) { int year; printf("请输入一个年份:\n"); scanf("%d",&year); if (year%4==0 && year%100!=0 || year%400==0) printf(" %d 是润年\n",year); else printf(" %d 不是润年\n",year); return 0; }5.2.1 if 语句语句可以是复合语句例 考虑下面程序的输出结果: #include void main() { int x,y; scanf(“%d,%d”,&x,&y); if(x>y) x=y; y=x; else x++; y++; printf(“%d,%d\n”,x,y); }Compile Error!5.2.1 if 语句5.2.2 switch 语句  5.2.2 switch 语句  switch语句的一般格式为: switch(表达式) { case 常量表达式1: 语句1; break; case 常量表达式2: 语句2; break; … case 常量表达式n: 语句n; break; default: 语句n+1; break; }switch 语句switch 语句例5-6 根据分数评定等级。 #include int main(void) { int score, grade; printf("Input a score(0~100): "); scanf("%d", &score); grade = score/10; //将成绩整除10,转化成switch语句中的case标号 switch (grade) { case 10: case 9: printf("grade=A\n"); break; //标号10和9,都执行本行的这条语句 case 8: printf("grade=B\n"); break; case 7: printf("grade=C\n"); break; case 6: printf("grade=D\n"); break; switch 语句switch 语句 case 5: case 4: case 3: case 2: case 1: case 0: printf("grade=E\n"); break; //标号5、4、3、2、1和0都执行本行的这条语句 default: printf("The score is out of range!\n"); //成绩超出范围时,提示出错 } return 0; } switch 语句switch 语句注意: switch后面圆括号中的表达式的类型,ANSI允许为任何类型,但Visual C++6.0只允许为整型、字符型或枚举类型。 case后面常量表达式的值必须互不相等,否则会出现互相矛盾的现象。其类型应该与switch后面表达式的类型相容。 case和常量表达式之间要有空格。 case和default出现可以在任何位置,其先后次序不影响执行结果,但习惯上将default放在switch-case结构的底部。 case提供了执行某一语句序列的入口,起着标号的作用;多个case可以执行同一语句序列。 每个case语句的结尾不要忘了加break,否则将导致多个分支重叠。 不要忘记最后的default分支。即使程序真的不需要default处理,也应该保留语句: default : break;null例: 输入年月日,输出是该年的第几天。(switch语句) void main() { int y,m,d; int day=0; printf("please input date(yy-mm-dd):\n"); scanf("%d-%d-%d",&y,&m,&d); switch(m){ case 1: day=d; break; case 2: day=31+d; break; case 3: day=31+28+d; break; case 4: day=31+28+31+d; break; case 5: day=31+28+31+30+d;break; case 6: day=31+28+31+30+31+d;break; case 7: day=31+28+31+30+31+30+d;break; case 8: day=31+28+31+30+31+30+31+d;break; case 9: day=31+28+31+30+31+30+31+31+d;break; case 10: day=31+28+31+30+31+30+31+31+30+d;break; case 11: day=31+28+31+30+31+30+31+31+30+31+d;break; case 12: day=31+28+31+30+31+30+31+31+30+31+30+d;break; default: if(m<0||m>12){ printf("input month is error!\n"); exit(0); } } if(m>=3&&y%4==0&&y%100!=0||y%400==0) day+=1; printf("%d\n",day); }null输入年月日,输出是该年的第几天。(switch语句) #include #include void main() { int y,m,d; int day=0; printf("please input date(yy-mm-dd):\n"); scanf("%d-%d-%d",&y,&m,&d); switch(m-1){ case 11: day+=30; case 10: day+=31; case 9: day+=30; case 8: day+=31; case 7: day+=31; case 6: day+=30; case 5: day+=31; case 4: day+=30; case 3: day+=31; case 2: if(y%4==0&&y%100!=0||y%400==0) day+=29; else day+=28; case 1: day+=31; break; default: if(m<0||m>12){ printf(“input month is error! \n”);exit(0); } } day+=d; printf("%d\n",day); }5.3 循环控制语句 5.3 循环控制语句 C语言提供了 while语句 do-while语句 for语句 来实现循环结构。  5.3.1 while语句5.3.1 while语句while循环语句的一般形式: while(表达式) 语句 例5-8 求1~100之和(while语句实现)。 #include int main(void) {     int i=1, sum=0;     while(i<=100) {   sum+=i; i++; /*循环变量增值*/ } printf("sum=%d\n",sum); return 0; }5.3.2 do-while 语句  5.3.2 do-while 语句  do-while语句的一般形式为: do 语句 while(表达式);do-while循环是先执行语句,然后对表达式求值。若值为真,则再次执行语句,如此反复执行,否则将结束循环。语句可以是简单语句,也可以是复合语句。 do-while 语句do-while 语句例5-9 求 1~100之和(do-while语句实现)。 #include int main(void) {     int i=0, sum=0;     do {         i++; /*循环变量增值*/         sum+=i;     } while(i<100);     printf("sum=%d\n",sum); return 0; }5.3.3 for 语句5.3.3 for 语句for语句是循环控制结构中使用最广泛的一种循环控制语句,特别适合已知循环次数的情况。它的一般形式为: for ( [表达式 1]; [表达式 2 ]; [表达式3] ) 语句 其中: 表达式1:一般为赋值表达式,给控制变量赋初值; 表达式2:关系表达式或逻辑表达式,循环控制条件; 表达式3:一般为赋值表达式,给控制变量增量或减量; 语句:循环体,当有多条语句时,必须使用复合语句。其执行过程如下:首先计算表达式1,然后计算表达式 2。若表达式2为真,则执行循环体;否则,退出 for循环,执行for循环后的语句。如果执行了循环体,则循环体每执行一次,都计算表达式3,然后重新计算表达式2,依此循环,直至表达式 2的值为假,退出循环。 for 语句for 语句 for语句的三个表达式都是可以省略的,但分号“;”绝对不能省略。for语句有以下几种格式: (1)for(; ;) 语句; (2)for(;表达式2;表达式3 ) 语句; (3)for(表达式1;表达式2;) 语句; (4)for(i=1,j = n; i < j; i ++,j - - ) 语句;for 语句for 语句例5-10 求 1~100之和(for语句实现)。 #include int main(void) { int i,sum=0; for (i=0;i<101;i++) sum+=i; printf("sum=%d\n",sum); return 0; }for 语句for 语句例5-11 打印九九乘法表。源程序如下: #include int main(void) { int i,j; for(i=1;i<10;i++) //输出标行 printf("%4d",i); printf("\n"); for(i=1;i<10;i++) //输出9个'-' printf("%4c",'-'); printf("\n"); for(i=1;i<10;i++) //外循环,控制行数 { for(j=1;j<10;j++) //内循环,控制列数 printf("%4d",i*j); //第i行j列的值 i*j printf("\n"); //每输出一行换行 } return 0; }5.3.4 循环小结5.3.4 循环小结 同一个问题,往往既可以用 while语句解决,也可以用 do-while或者for语句来解决,但在实际应用中,应根据具体情况来选用不同的循环语句。选用的一般原则是: (1) 如果循环次数在执行循环体之前就已确定,一般用 for语句。如果循环次数是由循环体的执行情况确定的,一般用 while语句或者do- while语句。 (2) 当循环体至少执行一次时,用 do-while语句,反之,如果循环体可能一次也不执行,则选用while语句。 C++/C循环语句中,for语句使用频率最高,while语句其次,do语句很少用。 三种循环语句for、while、do-while可以互相嵌套自由组合。但要注意的是,各循环必须完整,相互之间绝不允许交叉。 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨越循环层的次数。 ** 多重循环结构 ** 多重循环结构 一个循环体内又包含另一个完整的循环结构 三种循环可互相嵌套,层数不限 外层循环可包含两个以上内循环,但不能相互交叉(1) while() { …… while() { …… } …... }(2) do { …… do { …… }while( ); …... }while( );(3) while() { …… do { …… }while( ); ……. }(4) for( ; ;) { …… do { …… }while(); …… while() { …… } …... }嵌套循环的执行流程 嵌套循环的跳转nullvoid main() { int i=0,j; while(i<=5) { j=0; while(j<=i) { printf(“*”); j++; } i++; printf(“\n”); } }void main() { int i=0,j; for(i=0;i<=5;i++){ for(j=0;j<=i;j++) printf(“*”); printf(“\n”); } }void main() { int i=0,j; do { j=0; while(j<=i) { printf(“*”); j++; } i++; printf(“\n”); }while(i<=5); }例1:嵌套循环程序运行: * ** *** **** ***** ******null程序执行情况null2、编程序,输出n层,用字符“*”构成的“*”符塔。下图是5层“*”符塔。 #include void main() { int n,i,j; printf(“Please input n:\n”); scanf("%d",&n); for(i=1; i<=n; i++) { for(j=1; j<=n-i; j++) putchar(' '); // 输出第i行的n-i个空格 for(j=1; j<=2*i-1; j++) putchar('*'); // 输出第i行的2×i-1个“*”符 putchar('\n'); // 每行最后输出一个换行符 } }* *** ***** ******* ********* for(i=1; i<=n; i++) { 输出第i行的n-i个空格 输出第i行的2×i-1个* 输出换行符 }null3、编程题, 打印右图中的图形 #include void main() { int i,j; for(i=1;i<=4;i++) //图上半部分 { for(j=1;j<=8-2*i;j++) putchar(' '); for(j=1;j<=2*i-1;j++) printf("%c ",'*'); putchar('\n'); } for(i=3;i>=0;i--) //图下半部分 { for(j=1;j<=8-2*i;j++) putchar(' '); for(j=1;j<=2*i-1;j++) printf("%c ",'*'); putchar('\n'); } } * * * * * * * * * * * * * * * * * * * * * * * * *null4、 计算1!+2!+3!+…+10!。 #include void main() { int i,n; float s=0,y; //阶乘值较大,所以用float 型 for(n=1; n<=10; n++) { y=1; //保证每次进入内循环累乘的初值从1开始 for(i=1; i<=n; i++) //计算n! y*=i; //累乘 s+=y; //将y值即n!累加到s上 } printf("1!+2!+3!+…+10!=%e",s); } for(n=1; n<=10; n++) { 求出n! s+=n! }思 考 题思 考 题百钱买百鸡问题。公鸡5元1只,母鸡3元1只,小鸡1元买3只,问100元钱买100只,有几种买法? 提示:这是组合问题。首先确认公鸡、母鸡、小鸡的取值范围。公鸡数不会超过20只,母鸡数不会超过33只;另外,确定了公鸡、母鸡的数目后,小鸡的只数应该是:100-公鸡数-母鸡数。(求x+y+z=100, 5x+3y+z/3=100的解)null#include void main() { int cock,hen,chick; for(cock=0;cock<=100;cock++) for(hen=0;hen<=100;hen++) for(chick=0;chick<=100;chick++) if(cock*5+hen*3+chick/3==100&&cock+hen+chick==100) if(chick%3==0) printf(“cock=%d hen=%d chick=%d\n”, cock,hen,chick); }null程序执行情况null上述程序是个三重循环,做了大量的无用功,因公鸡数不会超过20只,母鸡数不会超过33只;另外,确定了公鸡、母鸡的数目后,小鸡的只数应该是: 100-公鸡数-母鸡数,程序修改如下:#include void main() { int cock,hen,chick; for(cock=0;cock<=20;cock++) for(hen=0;hen<=33;hen++) { chick=100-cock-hen; if(cock*5+hen*3+chick/3==100&&chick%3==0) printf(“cock=%d hen=%d chick=%d\n”, cock,hen,chick); } }null程序执行情况null搬砖问题。现有36块砖,假设男搬4,女搬3,要求一次全部搬完,问可以指定男、女各多少人?有几指定法? 程序分析:求不定方程 4*m+3*w=36的所有非负整数解。 #include void main() { int m,w,count=0; m=0; while(m<=9) //外层循环 { for(w=0; w<=12; w++) //内层循环 if((4*m+3*w)==36) //判断(m、w)是否一组解 { printf("men=%d women=%d\n",m,w); count++; break; //跳出内层for循环 } m++; } printf("count=%d",count); } 程序运行: men=0 women=12 men=3 women=8 men=6 women=4 men=9 women=0 count=4 5.4 辅助控制语句5.4 辅助控制语句1.break 语句 在 switch-case 结构中,break 语句可以使流程跳出该结构。 break 语句通常还用于循环结构中,当流程执行 break 语句时,从循环体内跳出循环体,提前结束循环。 nullbreak 语句在循环语句中的执行流程 break 语句break 语句例5-12 一球从100米高度自由落下,每次落地后反弹回原高度的一半,再落下。求它在第10次落地时共经过多少米?第10次反弹多高? #include int main(void) { float h=100.0, sum=0.0;      int n;      for( n=1; ; n++) {          sum += h;          h = h/2; //落地后反弹跳回原高度的一半          if( n= =10 ) break; //终止执行本循环          sum += h;      }      printf("共经过%f米,第10次反弹%f米\n",sum,h); return 0; }break 语句break 语句例5-13 找出100~200间的全部素数。 分析:所谓素数是除了1和它本身外没有其他因子的一个大于1的自然数。据此,只要判断2 ~ (m-1)都不是m的因子,就可判断m是素数。根据数学分析,可以进一步缩小2 ~ (m-1)的范围至2 ~ ;否则m不是素数。 #include #include int main( ) { int m,k,i,n=0; int prime; //以prime的真假来标记是否为素数 for(m=101;m<=200;m=m+2) //判别m是否为素数,m由101变化到200,增量为2 { prime=1; //循环开始时设prime为真,即先假定m为素数 k=(int)sqrt(m); //用k代表的整数部分 for(i=2;i<=k;i++) //此循环的作用是将m被2~除,检查是否能整除 if(m%i= =0) //如果能整除,表示m不是素数 { prime=0; //使prime变为假 break; //终止执行本循环 } if (prime) //如果m为素数 { printf("%5d",m); //输出素数m,字段宽度为5 n=n+1; //n用来累计输出素数的个数 } if(n%10= =0) printf("\n"); //输出10个数后换行 } printf("\n"); //最后执行一次换行 return 0; } for(n=101; n<=200; n++) { 判断n是否是素数 若n是素数,输出n }continue 语句 continue 语句 continue 语句的作用是结束本次循环,直接进行下一轮循环的判断。 该语句只能用在for、while、do-while语句中,常与if语句配合,起到加速循环的作用。 nullcontinue 语句在循环语句中的执行流程 continue 语句continue 语句例5-14 打印出100~200之间所有能被 7 整除的整数。 #include int main(void) {     int n;     for( n=100; n<=200; n++) {       if(n%7!=0) continue; //结束本次循环       printf("%5d ", n); } printf("\n"); return 0; }5.4.2 goto语句 5.4.2 goto语句 goto语句是一种无条件转移语句。 goto 语句的使用格式为: goto 标号; goto语句与if条件语句连用,当满足某一条件时,程序跳到标号处运行。 以下举例说明用goto 语句构成循环(不提倡使用)。5.4.2 goto语句 5.4.2 goto语句 例5-15 求 1~100之和(用if…goto实现)。 #include int main(void) {   int i=1, sum=0; loop: //标号     if(i<=100) { sum+=i;   i++;    goto loop; //程序执行流程转向标号loop处     } printf("sum=%d\n",sum); return 0; }5.4.3 函数调用和return语句5.4.3 函数调用和return语句 函数调用和函数返回也使程序执行流程发生改变。其中函数调用的功能使程序执行流程转向被调的函数体;而执行return语句则立即从所在的子函数中退出,返回到调用它的主调函数中去执行。 5.5 程序举例—5.5.1 穷举 5.5 程序举例—5.5.1 穷举 穷举算法是一种循环的实际应用。它的基本思想是:对问题的所有可能答案进行一一测试,直到找到正确答案或测试完全部可能答案。 例5-16 搬砖:共有36块砖,由36人搬,其中对成人的要求是:男的一次搬4块,女的一次搬3块;对小孩的要求是:两个小孩一次抬1块砖。要求一次搬完所有砖,问男人、女人、小孩各几人? 分析:设men为男人数,women为女人数,children为小孩数。根据题意,求解该题必须使下面的不定方程成立: men + women + children = 36 4 * men + 3 * women + children/2 = 36 进一步分析该题中的条件,可以确定三个变量的取值范围(穷举算法这一步不可忽视,它可以大大降低循环次数,从而提高程序执行效率): men的取值范围为0~8; women的取值范围为0~11; children的取值范围为0~36; 因为两个小孩抬1块砖,所以小孩数必须为偶数,即有children%2=0。#include int main(void) { int men=0,women,children; while(men<=8) { women=0; while(women<=11) { children=36-women-men; if(4*men+3*women+children/2==36&&children%2==0) { printf("\n men is %d",men); printf("\t women is %d",women); printf("\t children is %d\n",children); } women++; } men++; } return 0; }5.5.1 穷举5.5.1 穷举例5-17 著名的爱因斯坦阶梯问题。 设有一个阶梯,每步跨2阶,最后余1阶;每步跨3阶,最后余2阶;每步跨5阶,最后余4阶;每步跨6阶,最后余5阶;每步跨7阶,正好全部跨完。问该阶梯共有几级。 分析:设ladders表示阶梯数,根据题意,有下面条件存在: ①ladders%2=1 ②ladders%3=2 ③ladders%5=4 ④ladders%6=5 ⑤ladders%7=0 进一步分析,根据①,可知ladders为奇数;根据⑤,可知ladders为7的整数倍。因此ladders取值的步长为14。 5.5.1 穷举5.5.1 穷举#include int main(void) { int ladders=7; while ( ladders%3 !=2 || ladders%5 !=4 || ladders%6 !=5 ) ladders+=14; printf("flight of stairs=%d\n",ladders); return 0; }5.5.2 迭代5.5.2 迭代 迭代算法也是一种循环的实际应用。它的基本思想是:不断用新值取代变量的旧值,或由旧值递推出变量的新值。 例5-18 兔子繁殖问题。 著名的意大利数学家Fibonacci曾提出一个有趣的问题:有一对新生兔子,从第三个月开始繁殖,每个月都生产一对兔子。假设期间没有兔子死亡,那么一年后共有多少对兔子? 分析:人们发现每月的兔子数可列出如下: 1,1,2,3,5,8,13,21,34,…… 并把它称为Fibonacci数列。 算法如下:fib1=fib2=1 (1) fibn= fibn-1+ fibn-2 (n>=3) (2) 其中式(1)为赋初值,式(2)为该算法的迭代公式。用C语言来描述式(2)如下: fib = fib1+ fib 2; fib1= fib2; fib2= fib;5.5.2 迭代5.5.2 迭代#include int main(void) { int m; long fib,fib1=1,fib2=1; printf("%ld %ld",fib1,fib2); for ( m=3; m<=12; m++) { fib=fib1+fib2; fib1=fib2; fib2=fib; printf(" %ld",fib); } printf("\n"); return 0; }5.5.2 迭代5.5.2 迭代例5-19 猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,又多吃了一个。第二天,吃剩下的一半,又多吃了一个。以后每天都吃前一天剩下的一半加一个,到第6天只剩下了一个桃子。问:第一天共摘下多少桃子。 分析:设变量ft=1,为第6天的桃子数,则可反推出前一天的桃子数为ff=2×(ft+1);将ff赋给ft,即又可用公式ff=2×(ft+1)算出前两天的桃子数;如此,总计反推5次,就会得到问题的解。 #include int main(void) { int i=6,ft,ff; for(i=i-1,ft=1;i>0;i--) { ff=2*ft+1; ft=ff; } printf("%d\n",ff); return 0; }
/
本文档为【c5】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索