1 / 31

第五章

第五章. 循环结构程序设计 (一). sum=1+2+…+100;. 思考. 求 1 ~ 100 的累加和。. sum=sum+n;. 分析. 换一种思路:. 首先设置一个累计器 sum ,其初值为 0 ,利用 sum += n 来计算( n 依次取 1 、 2 、 …… 、 100 ),只要解决以下 3 个问题即可: ( 1 )将 n 的初值置为 1 ; ( 2 )每执行 1 次“ sum += n;” 后, n 增 1 ; ( 3 )当 n 增到 101 时,停止计算。此时, sum 的值就是 1 ~ 100 的累计和。.

floyd
Download Presentation

第五章

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第五章 循环结构程序设计 (一)

  2. sum=1+2+…+100; 思考 求1~100的累加和。 sum=sum+n; 分析 换一种思路: 首先设置一个累计器sum,其初值为0,利用sum += n来计算(n依次取1、2、……、100),只要解决以下3个问题即可: (1)将n的初值置为1; (2)每执行1次“sum += n;”后,n增1; (3)当n增到101时,停止计算。此时,sum的值就是1~100的累计和。

  3. 主要内容 一、goto语句 二、while语句 三、do-while语句 四、for语句 五、break、continue语句 六、几种循环的比较

  4. 一、goto语句 标号的定名规则与变量名相同。 作用:使系统转向标号所在的语句行执行。 格式 goto 语句标号 使用goto语句与分语句配合构成循环结构,实现求1~100的累加和。 举例 #include <stdio.h> void main() { int n=1, sum=0; loop: sum += n; n++; if (n<=100) goto loop; printf(“sum=%d\n”, sum); } P106 (1) 与if 语句一起构成循环结构。 (2) 不符合结构化程序设计原则,一般不用。 说明

  5. 当表达式值为真 表达式 假 循环体语句 真 循环体语句 N-S图表示 二、while语句 P107 格式 while (表达式) 循环体语句 含义 当表达式为真(非0值)时,执行while语句中的内嵌语句。 执行过程 ? 1、循环体如果包含一个以上的语句,必须使用复合语句形式。 2、在循环体中,必须有使循环条件趋向于不满足(假)的语句。 3、先判断表达式,后执行语句。 说明

  6. i=1 sum=0 当i<=10 sum=sum+i i++ 输出sum 二、while语句 举例 求1~10的累加和。 #include <stdio.h> void main() { int i,sum; i=1; sum=0; while (i<=10) { sum=sum+i; i++; } printf(“sum=%5d\n”,sum); } sum= 55 1 求1~5的累加和. 2 求1~10的奇数和. 3 求1~10的偶数和. ? 思考 1、如果去掉循环体中的大括号,执行过程将会怎样变化? 2、在循环体中,使循环条件趋向于不满足(假)的语句是哪条?

  7. 循环体语句 循环体语句 真 表达式 假 当表达式值为真 N-S图表示 三、do-while语句 P108 do 循环体语句 while (表达式); 格式 含义 执行do-while语句中的内嵌语句,直到表达式为假(0)才跳出循环。 至少执行一次 执行过程 ? 说明 1、循环体如果包含一个以上的语句,必须使用复合语句形式。 2、在循环体中,必须有使循环条件趋向于不满足(假)的语句。 3、先执行循环体语句,后判断表达式的值。

  8. i=1 sum=0 sum=sum+i i++ 当i<=10 (直到i>10) 输出sum 三、do-while语句 举例 求1~10的累加和。 #include <stdio.h> void main() { int i,sum; i=1; sum=0; do { sum=sum+i; i++; } while (i<=10); printf(“sum=%5d\n”,sum); } sum= 55 思考 1、如果去掉循环体中的大括号,执行过程将会怎样变化? 2、在循环体中,使循环条件趋向于不满足(假)的语句是哪条?

  9. 此程序的功能? 三、do-while语句 举例 while和do-while循环的比较。 #include <stdio.h> void main() { int i,sum; scanf(“%d”,&i); while(i<=10) { sum=sum+i; i++; } printf(“sum=%d\n”,sum); } #include <stdio.h> void main() { int i,sum; scanf(“%d”,&i); do { sum=sum+i; i++; } while(i<=10) printf(“sum=%d\n”,sum); } 什么情况下两者结果相同? 输出: 输入:1 sum=55 sum=55 输入:11 P109 输出: sum=0 sum=11

  10. 求解表达式1 表达式2 假 真 循环体语句 求解表达式3 四、for语句 P110 格式 for (表达式1;表达式2;表达式3) 语句 for (循环变量赋初值;循环条件;循环变量增值) 语句 执行过程 (1)先求解表达式1; (2)求解表达式2,若其值为真,则 执行循环体语句,然后执行第(3)步;若为假,则结束循环,转到第(5)步; (3)求解表达式3; (4)转向步骤(2); (5)循环结束,执行for语句下面的一个语句。

  11. sum=0 for i=1 to10 sum=sum+i 输出sum 四、for语句 举例 求1~10的累加和。 #include <stdio.h> void main() { int i,sum; sum=0; for (i=1;i<=10;i++) sum=sum+i; printf(“sum=%5d\n”,sum); } sum= 55 1 求1~5的累加和. 2 求1~10的奇数和. 3 求1~10的偶数和. ?

  12. 求解表达式1 求解表达式1 表达式2 假 表达式2 假 真 真 循环体语句 循环体语句 循环体语句 求解表达式3 求解表达式3 表达式1省略 表达式2省略 表达式3省略 四、for语句 三个表达式都可以省略。 说明 for (表达式1;表达式2;表达式3) 语句

  13. 四、for语句 表达式1可以省略,但其后的分号不可以省略。 说明 i=1; for(; i<=10;i++) sum=sum+i; for(i=1; i<=10;i++) sum=sum+i; 1 没有循环结束条件,构成了死循环 ? 2 for (i=1;;i++) sum=sum+i; 3 for (i=1;i<=10 ;) { sum=sum+i; i++; } for(i=1; i<=10;i++) sum=sum+i;

  14. 四、for语句 表达式1和表达式3可以同时省略,此时等同于while语句。 说明 for( ;i<=10 ; ) { sum=sum+i; i++; } while(i<=10) { sum=sum+i; i++ ; } 4 5 for( ; ; ) sum=sum+i; while (1) sum=sum+i; for(sum=0,i=1;i<=100,i++) sum=sum+i; 表达式1和表达式3可以是与循环变量无关的表达式。 6 建议:for语句中只放与 循环控制有关的语句。 7 表达式2一般是关系表达式,也可以是数值或字符表达式。

  15. 五、break\continue语句 while (表达式1) {… if (表达式2) break; … } 格式 while (表达式1) {… if (表达式2) conitue; … } 结束本次循环 结束整个循环 举例 … ... sum=0; for (i=1;i<=10;i++) { if (i>5) break; sum=sum+i; } printf(“sum=%5d\n”,sum); … ... … ... sum=0; for (i=1;i<=10;i++) { if (i<=5) continue; sum=sum+i; } printf(“sum=%5d\n”,sum); … ...

  16. 六、几种循环语句的比较 说明 1、 三种循环语句在处理循环问题时,一般可以相互替代。 2、 对于循环次数固定的问题,用for语句实现比较简单。 3、 对于循环次数不确定的问题,可用while语句或do-while语句实现。 4、 while语句:先判断,后执行。 do-while语句:先执行,后判断。

  17. 作业 P120: 6.1, 6.2 其中, 6.1, 6.2是实验

  18. 循环结构程序设计 (二) 18

  19. 主要内容 一、循环嵌套 二、循环结构程序设计举例 19

  20. for i=1 to 4 for j=1 to 4 输出i*j 换行 一、循环嵌套 概念 一个循环体内又包含另一个完整的循环结构,称为循环嵌套。 举例 打印乘法口诀表。 1 2 3 4 2 4 6 8 3 6 9 12 4 8 12 16 #include <stdio.h> void main() { int i,j; for (i=1;i<=4;i++) { for (j=1;j<=4;j++) printf(“%4d”,i*j); printf(“\n”); } } i=1, j=1 1*1 j=2 1*2 j=3 1*3 j=4 1*4 i=2, j=1 2*1 j=2 …… i=3 i=4 20

  21. 一、循环嵌套 思考1 1 2 4 3 6 9 4 8 12 16 #include <stdio.h> void main() { int i,j; for (i=1;i<=4;i++) { for (j=1;j<=i;j++) printf(“%4d”,i*j); printf(“\n”); } } 21

  22. 一、循环嵌套 思考2 #include <stdio.h> void main() { int i,j; for (i=1;i<=4;i++) { for (j=1;j<=5-i;j++) printf(“%4d”,i*j); printf(“\n”); } } 1 2 3 4 2 4 6 3 6 4 22

  23. 一、循环嵌套 思考3 #include <stdio.h> void main() { int i,j; for (i=1;i<=4;i++) { for (j=1;j<=4-i;j++) printf(“%4c”,’ ‘); for (j=5-i;j<=4;j++) printf(“%4d”,i*j); printf(“\n”); } } 4 6 8 6 9 12 4 8 12 16 23

  24. 一、循环嵌套 思考4 1 2 3 4 4 6 8 9 12 16 #include <stdio.h> void main() { int i,j; for (i=1;i<=4;i++) { for (j=1;j<=i-1;j++) printf(“%4c”,’ ‘); for (j=i;j<=4;j++) printf(“%4d”,i*j); printf(“\n”); } } 24

  25. 思考:使用那一种循环控制语句? 二、程序举例 例1 利用公式:/4=1-1/3+1/5-1/7+… 求的近似值,直到某一项的绝对值小于10-6为止。 #include <stdio.h> #include <math.h> void main() { int s; float n,t,pi; t=1;pi=0;n=1.0;s=1; while((fabs(t))>1e-6) {pi=pi+t; n=n+2; s=-s; t=s/n;} pi=pi*4; printf("pi=%10.6f\n",pi); } pi=1-1/3+… 输出4* pi s=1(-1) n=1,3,5,7… t=s/n 25

  26. 二、程序举例 P116 #include <stdio.h> void main() { long int f1,f2; int i; f1=1;f2=1; for(i=1;i<=20;i++) { printf("%12ld%12ld",f1,f2); if(i%2==0) printf("\n"); f1=f1+f2; f2=f2+f1; } } 1 1 2 3 5 8 13 21 34 55 89 144 … … 例2 求Fibonacci数列的前40个数。 特点:第1、2个数为1、1。从第三个数开始,该数是其前面两个数之和。 F1=1 (n=1) F2=2 (n=2) Fn=Fn-1+Fn-2 (n>=3) 26

  27. 二、程序举例 例3 判断m是否为素数。 素数(质数): 只能被1和它本身整除的数。 判别方法: 57:若2~56之间的每一个数都除不开56,则56为素数,否则56不是素数。 m, k=m-1,i=2~k : 若每一个 i 的值都除不开m,则m为素数,否则m不是素数。 k=m-1; k=[m/2];[(m+1)/2]; k=[sqrt(m)];[sqrt(m+1)] flag=1; k=m-1; for (i=2;i<=k;i++) if (m%i=0) flag=0; if (flag==1) printf(“yes!”); else printf(“no!”); k=m-1; for (i=2;i<=k;i++) if (m%i=0) break; if (i>=k+1) printf(“yes!”); else printf(“no!”); 27

  28. for m=101 to 200 ①判断m是否为素数 ②若m是素数,则输出并统计个数n. ③每输出10个素数,换行 二、程序举例 例3 输出 101~200之间的全部素数。 #include <stdio.h> #include <math.h> void main() { int m,k,i,n=0; for(m=101;m<=200;m=m+2) { k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0) break; if(i>=k+1) { printf("%d ",m); n=n+1; } if(n%10==0) printf("\n"); } printf("\n"); } 28

  29. 二、程序举例 例4 译密码。输入一行字符,输出其相应的密码。(119页) 译码规律:将字母变成其后的第4个字母,非字母字符不变。 #include <stdio.h> void main() { char c; while((c=getchar())!='\n') { if((c>'a'&&c<='z')||(c>'A'&&c<='Z')) { c=c+4; if((c>'Z'&&c<='Z'+4)||c>'z') c=c-26; } printf("%c\n",c); } } 29

  30. 作业 P120: 6.4, 6.8, 6.6, 6.11 30

More Related