310 likes | 483 Views
第五章. 循环结构程序设计 (一). 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 的累计和。.
E N D
第五章 循环结构程序设计 (一)
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的累计和。
主要内容 一、goto语句 二、while语句 三、do-while语句 四、for语句 五、break、continue语句 六、几种循环的比较
一、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) 不符合结构化程序设计原则,一般不用。 说明
当表达式值为真 表达式 假 循环体语句 真 循环体语句 N-S图表示 二、while语句 P107 格式 while (表达式) 循环体语句 含义 当表达式为真(非0值)时,执行while语句中的内嵌语句。 执行过程 ? 1、循环体如果包含一个以上的语句,必须使用复合语句形式。 2、在循环体中,必须有使循环条件趋向于不满足(假)的语句。 3、先判断表达式,后执行语句。 说明
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、在循环体中,使循环条件趋向于不满足(假)的语句是哪条?
循环体语句 循环体语句 真 表达式 假 当表达式值为真 N-S图表示 三、do-while语句 P108 do 循环体语句 while (表达式); 格式 含义 执行do-while语句中的内嵌语句,直到表达式为假(0)才跳出循环。 至少执行一次 执行过程 ? 说明 1、循环体如果包含一个以上的语句,必须使用复合语句形式。 2、在循环体中,必须有使循环条件趋向于不满足(假)的语句。 3、先执行循环体语句,后判断表达式的值。
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、在循环体中,使循环条件趋向于不满足(假)的语句是哪条?
此程序的功能? 三、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
求解表达式1 表达式2 假 真 循环体语句 求解表达式3 四、for语句 P110 格式 for (表达式1;表达式2;表达式3) 语句 for (循环变量赋初值;循环条件;循环变量增值) 语句 执行过程 (1)先求解表达式1; (2)求解表达式2,若其值为真,则 执行循环体语句,然后执行第(3)步;若为假,则结束循环,转到第(5)步; (3)求解表达式3; (4)转向步骤(2); (5)循环结束,执行for语句下面的一个语句。
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的偶数和. ?
求解表达式1 求解表达式1 表达式2 假 表达式2 假 真 真 循环体语句 循环体语句 循环体语句 求解表达式3 求解表达式3 表达式1省略 表达式2省略 表达式3省略 四、for语句 三个表达式都可以省略。 说明 for (表达式1;表达式2;表达式3) 语句
四、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;
例 四、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一般是关系表达式,也可以是数值或字符表达式。
五、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); … ...
六、几种循环语句的比较 说明 1、 三种循环语句在处理循环问题时,一般可以相互替代。 2、 对于循环次数固定的问题,用for语句实现比较简单。 3、 对于循环次数不确定的问题,可用while语句或do-while语句实现。 4、 while语句:先判断,后执行。 do-while语句:先执行,后判断。
作业 P120: 6.1, 6.2 其中, 6.1, 6.2是实验
循环结构程序设计 (二) 18
主要内容 一、循环嵌套 二、循环结构程序设计举例 19
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
一、循环嵌套 思考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
一、循环嵌套 思考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
一、循环嵌套 思考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
一、循环嵌套 思考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
思考:使用那一种循环控制语句? 二、程序举例 例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
二、程序举例 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
二、程序举例 例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
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
二、程序举例 例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
作业 P120: 6.4, 6.8, 6.6, 6.11 30