第 4 章 循环结构程序设计
description
Transcript of 第 4 章 循环结构程序设计
1
第 4 章 循环结构程序设计
2
输出一行 10 个星号“ *” 语句是? printf(“**********\n”);
输出两行 10 个星号“ *” 语句是? printf(“**********\n”);
printf(“**********\n”);
问题的提出
3
输出 100行 10 个星号“ *” 语句是?
用循环结构解决
4
4.1 循环的概念
什么是循环?为什么要使用循环?
100
1n
y n问题 1 :
问题 2: 求学生平均成绩求学生平均成绩 分数相加后除以课数分数相加后除以课数
在许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。循环分为两种:无休止循环和有终止循环构成有效循环的条件:循环体和循环结束条件
5
本章将介绍的内容 4.1 for 语句 4.2 while 语句4.3 do - while 语句4.4 break语句和continue语句 4.5 循环语句的嵌套
6
4.1 for 语句
C 语言中的 for 语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while 语句。 【例 4.1】 for 语句的引例。
求 1+2+3+…+100 的值,并将其结果放在变量 sum 中。
P88P88
7
for(i=1;i<=100;i++) sum=sum+2;
sum=sum+1;sum=0;
不确定
sum
013sum=sum+3;
6
… …
sum=sum+100;
5050sum=sum+i;
规律是:表示为:for(i=1;i<=100;i++)
sum=sum+i;
是 for 语句!是 for 语句!
8
#include <stdio.h>main( ){ int i=0, sum=0; forfor ( i=1; i<=100; i++ ) sum=sum+i; printf("1+2+3+......+100=%d\
n",sum);}
运行结果: 1+2+3+......+100=5050
循环体关键字
for
9
for 语句的一般形式
for( 表达式 1; 表达式 2; 表达式 3 ) 循环体
注意此处不是“ ,”!
10
执行过程
表达式2
处理表达式 1
执行循环体非00
处理表达式3
for语句的执行过程: (1) 先求解表达式 1 。 (2) 求解表达式 2 ,若其值为真 ( 值为非 0),则执行 for
语句中指定的内嵌语句,然后执行下面第 (3)步。若为假( 值为 0),则结束循环,转到第 (5)步。
(3) 求解表达式 3 。 (4) 转回上面第 (2)步骤继续执行。 (5) 循环结束,执行 for语句下面的一个语句
11
for ( i = 1; i <= 100; i = i + 1 )
printf ( “**********\n” );
输出 100行 10 个星号“ *” 语句是? i++i++
12
讨论题 4.1
若要计算 2+4+6+…+100 的值如何书写 for 语句?
for ( i = 2; i <= 100; i = i + 2 )
13
讨论题 4.2 如何通过 for 循环计算
的值? 100
1
3
1
2
11
float t=1,sum=0;int i;
for ( i = 1; i <= 100; i = i + 1 ){ t=1/i;
sum=sum+t ; }
复合语句
14
【例 4.2 】键盘输入 10 个学生的成绩,输出各成绩和平均成绩。
编程点拨:确定两件事情
哪些语句重复执行哪些语句重复执行
执行多少次循环体执行多少次循环体 输入 10 个,重复 10次
scanf("%d",&score);scanf("%d",&score);printf("%d ",score);printf("%d ",score);
sum=sum+score; sum=sum+score;
15
printf("\n"); ave=(float)sum/10; printf("ave=%f\n",ave);}
用复合语句
循环体是循环体是33 条语句条语句
for( i=1; i<=10; i++) { scanf("%d",&score); printf("%d ",score); sum=sum+score; }
main( ){ int i=0,score=0, sum=0; float ave=0; printf("Input score:\n");
不必放在循环体内
16
Input score:95 100 65 45 60 89 78 80 83 7095 100 65 45 60 89 78 80 83 70ave=76.500000
运行结果如下:
17
【例 4.3 】在 3~100 之间所有 3 的倍数中,找出个位数为 2 的数。
编程点拨
用 用 i%10 i%10 表示个位表示个位数 数
3~1003~100内内 33 的倍数有的倍数有 3 6 9 … 993 6 9 … 99
for ( i=3; i<=100; i=i+3 ) for ( i=3; i<=100; i=i+3 )
if( i%10==2 ) … if( i%10==2 ) …
18
将最小的 3 的倍数 3 赋给 i
当 i 的值小于等于 100 时
输出 i 的值
i 个位数是 2 ?真 假
i 的值增 3
流程图
19
#include <stdio.h>main( ){ int i=0; for ( i=3; i<=100; i=i+3 ) if( i%10==2 ) printf("%4d",i); printf("\n");} 输出:输出:
按 4 个字符位输出整数
1212 4242 7272__
分支分支结构结构
循环结构循环结构顺序结构
用三种基本结构能用三种基本结构能写出所有复杂程序写出所有复杂程序
20
讨论题 4.3 若将例 4.3 的功能改为:找出十位或个位是 2 的所有三位数,程序应如何改写?
#include <stdio.h>main( ){ int i=0,j=0; for ( i=102; i<=999; i=i+3 ) { j=i%100; if((j/10==2) ||(j%10==2) ) /* 判断 10 位数是否是 2 */ printf("%4d",i);
printf("\n");}
for ( i=100; i<=999; i=i++ )
{ if(i%3==0) /* 若是 3 的倍数 */
21
【例 4.4 】输出 1!、 2!、 3!、……、 n! 其中 n!= 1×2×3×……×n n 的值从键盘输入
算法和求算法和求 1+2+…+1001+2+…+100 的算法类的算法类似似
但在本程序中但在本程序中 facfac 的初值为的初值为 11 ,不是,不是 00 。。
编程点拨
22
#include <stdio.h>main ( ){ int i=0,n=0; float fac=1.0; printf("Input n:"); scanf ( "%d", &n ); for ( i=1; i<=n; i++ )
{ fac=fac*i; printf( "%d!=%.0f\n",i,fac); }
}
若为若为 intint 型,求型,求 8!8!时开始出现溢出现时开始出现溢出现象 象 不能为不能为 0.0 0.0
只输出整数部分 只输出整数部分
23
运行结果如下:Input n:201!=12!=2…… 19!=12164509600422297620!=2432902023163674620
(注意,只保证前 6~7 位是准确的)
24
讨论题 4.4 如果要计算 21、 22、 23、…、 2n 的值,应如
何修改本程序? #include <stdio.h>main (){ int i=0,n=0; double fac=1.0; printf("Input n:"); scanf ( "%d", &n ); for ( i=1; i<=n; i++ )
{ fac=fac*2; printf("2^%d=%.0f\n",i,fac); }
}
若为若为 intint 型,求型,求 22ii
时开始出现溢出现时开始出现溢出现象 象
不能为不能为 0.0 0.0
只输出整数部分 只输出整数部分
25
课堂练习修改例 4.4 中的程序,计算 1!+2!+3!+ …+n! 的值。修改例 4.4 中的程序,计算21、 22、 23 、…、 2n 的值。修改例 4.4 中的程序,计算21+22+23+ …+2n 的值。
1)
#include <stdio.h>
main()
{ int i=0,n=0;
double fac=1.0,sum=0.0;
printf(“Input n:”);
scanf(“%d”,&n);
for(i=1;i<=n;i++)
{ fac=fac*i;
sum=sum+fac }
printf(“1+2!+…+%d!=%.lf\n”,n,sum);
}
3)
#include <stdio.h>
main()
{ int i=0,n=0;
double fac=1.0,sum=0.0;
printf(" Input n: ");
scanf("%d ",&n);
for(i=1;i<=n;i++)
{ fac=fac*2;
sum=sum+fac; }
printf("2^1+2^2+…+2^%d!=%.lf\n",n,sum);
}
26
教学总结本次课的讲授内容是:1 .用循环解决问题的场合。2 . for 语句。3 .累加算法。4 .求平均值算法。5 .连乘算法。
27
作业• 完成未做完的课堂练习• 理解并运行例 4.5~4.8
预习例 4.9~例 4.15
28
【例 4.5 】在两行上分别按顺序和逆序输出 26 个英文大写字母。
在在 ASCIIASCII 码表中,字母按码表中,字母按 AA到到 ZZ 的顺序排的顺序排列列使用循环通过使用循环通过 AA 计算 计算
(即(即’’ AA’’+i+i,, i=0,1,2,…,25i=0,1,2,…,25 ))
编程点拨
29
#include <stdio.h>main ( ){ int i=0; }
for ( i=0; i<=25; i++ ) printf("%c ", 'A'+i);
for ( i=25; i>=0; i-- ) printf("%c ", 'A'+i);
printf("\n");
printf("\n");
顺序输出顺序输出
逆序输出逆序输出
注意位置注意位置
不是不是 i+i+++
30
【例 4.6】 从键盘输入 10 个数,求其中最大值。
编程点拨:
用例 3.6 中介绍的算法
数据较多,用循环结构
31
#include <stdio.h>main( ){ int a=0,max=0,i=0;
printf("\nmax=%d\n",max); }
scanf("%d",&a); printf("%d ",a);
printf("Input data:");输入第一个数并输出输入第一个数并输出max=a;第一个数存入第一个数存入 max max
输入后九个数并输出输入后九个数并输出for ( i=1; i<=9; i++ ) { scanf("%d",&a); printf("%d ",a); if ( max<a ) max=a;
}
运行时试最大值在 运行时试最大值在 最前最前 最后最后 中中间某一位置间某一位置的情况 的情况
思考:思考: 100100 个数中个数中求最大,如何修改?求最大,如何修改?
32
方法方法 22 ::#include <stdio.h>main( ){ int a=0,max=0,i=0; max=-32768; printf("Input data:"); for(i=1; i<=10; i++) { scanf("%d",&a);
printf("%d ",a); if(max<a) max=a;
} printf("\n"); printf("max=%d\n",max); }
33
【例4.7】求
100
1
4
1
3
1
2
11
for(i=1; i<=100; i++)for(i=1; i<=100; i++)
sum=sum+sum=sum+(float)(float)1/i; 1/i;
100
1
4
1
3
1
2
11
先思考:如何求
34
100
1
4
1
3
1
2
11
再思考:如何解决正负相间的问题再思考:如何解决正负相间的问题
for ( i=1; i<=100; i++ ) sum=sum+(float) 1 / i;
sign=1;
{ }
sign=-sign;
sign
sign=1sum=sum+1/1
i=1
sign=-1sum=sum-1/2
i=2
sign=1sum=sum+1/3i=3
… …
符号翻转符号翻转
35
完完整整程程序序
for ( i=1; i<=100; i++ ) { sum=sum+(float) sign/ i;
sign=-sign; }
printf("sum=%f\n",sum); }
#include <stdio.h>
main( )
{ int i=0,sign=1;
float sum=0.0;
运行结果sum=0.688172
36
讨论题 4.7 如何计算
的值? 100
1
98
1
8
1
6
1
4
1
2
1
for ( i=2; i<=100; i=i+2 ) { sum=sum+(float) sign/ i;
sign=-sign; }
printf("sum=%f\n",sum); }
#include <stdio.h>
main( )
{ int i=0,sign=1;
float sum=0.0;
运行结果sum=0.688172
37
【例 4.8 】输出斐波纳契( Fibonacci)级 数 1 、 1 、 2 、 3 、 5 、 8、 13、… 的前 30 项。
规律:前两项的值各为 1 ,从第 3 项起,每一项都是前两项的和。
要求:一行输出 6 项
38
求解过程
+
a b next 第 5 项+
+a b next 第 3 项
a b next 第 4项
a b next 第 6 项+
… …
1 1 2
8
1 23
2 35
3 5
next=a+b;a=b; b=next;
规律:
39
main( ){ int i=0,n=0; long a=0,b=0,next=0; }
a=b=1;printf("%10ld%10ld",a,b);
n=2;
处理前两项
for ( i=3; i<=30; i++ ) { next=a+b; a=b; b=next; }
处理后 28 项
printf("%10ld",next); n++; if ( n%6==0 ) printf("\n");
输出并控制换行
40
运行结果如下: 1 1 2 3 5 8
13 21 34 55 89 144
233 377 610 987 1597 2584
4181 6765 10946 17711 28657 46368
75025 121393 196418 317811 514229 832040
41
同一个问题,可能有多种算法在学习过程中,勤于思考,善于发现问题,编写出更优化的程序。以上循环共同点:容易确定循环次数for 语句一般用于循环次数已知的情况。如果次数事先不知,则常用 while 语句或 do-while 语句。
说明:说明:
42
4.2 while 语句【例 4.9 】从键盘输入若干个非0 数据,
求它们的和。用 0 结束循环的执行。
编程点拨:• 本题需要用循环结构•用 for 语句不方便• 下面用 while 语句
P97P97
43
#include <stdio.h>main( ){ int a=0,sum=0; printf("Input data:\n");
scanf("%d",&a); while ( a!=0 ) { printf("%4d",a); sum=sum+a; scanf("%d",&a); } printf("\nsum=%d\n",sum); }
进入循环前进入循环前先输入一个数 先输入一个数
当当 aa 为非为非 00 时,执行循环体 时,执行循环体 while关键字
44
第 1 次 运 行 :Input data:
Input data:
11 22 33 44 55 66 77 88 99 0 1 211 22 33 44 55 66 77 88
99sum=495
第 2 次运行:
0(空一行)
sum=0
Ctrl+Break强行结束执行
sum 的初值
45
while 语句的一般形式:
while ( 表达式 ) 循环体
46
执行过程
表达式 循环体非 0
0
47
【例 4.10 】用while 循环求 1+2+3+…+100 #include <stdio.h>main( ){ int ,sum=0; printf("sum=%d\n",sum);}
while ( i<=100 ) sum=sum+i;
i=1
i++;
{ }
不同循环语句之间可以相互转换
48
【例 4.11 】用公式
求 π 的近似值,直到最后一项的绝对值小于 10-4 为止。
7
1
5
1
3
11
4
49
编程点拨:
先计算 的近似值,再求 π 的近似值不易确定从第几项起,绝对值小于 10-4
本例用 while 语句
4
7
1
5
1
3
11
50
main ( ){ int , ; float pi=0,
pi=sum*4 ; printf("pi=%f\n",pi);}
#include <math.h> 加入一行
while ( )
{ }
fabs(next) >= 1e-4sum=sum+next
;
next=1,sum=0;
sign=-sign;
sign=1
i=i+2;
i=1
next=(float)sign/i;
fabs 是库函数 求绝对值
51
4.3 do-while 语句
do-while和while很相似
区别:while 先判断表达式的值,后执行循环体do-while 先执行循环体,再判断表达式
P100P100
返回
52
【例 4.12 】从键盘输入若干个非 0 数据,求它们的和。用 0 结束循环的执行 .
53
#include <stdio.h> main( ){ int a=0,sum=0; printf("Input data:\n"); do { scanf("%d",&a);
printf("%4d",a); sum=sum+a;
} while ( a!=0 ) ; printf("\nsum=%d\n",sum);}
不要丢不要丢
do 关键字
当当 aa 为非为非 00 时,执行循环时,执行循环体 体
54
第 1 次 运 行 :Input data:
Input data:
11 22 33 44 55 66 77 88 99 0 1 211 22 33 44 55 66 77 88 99
0sum=495
第 1 次运行:
00
sum=0 sum 的 初 值与 0 的和
55
do-while 语句的一般形式:
do 循环体 while ( 表达式 ) ;
56
执行过程
非0表达式
循环体
0
57
do-while 先执行一次循环体,后判断表达式 循环体至少被执行一次
while 先判断表达式,后执行循环体循环体有可能一次也不被执行
三种循环可以互相转换根据不同情况,选择具体循环
说明
58
如果为大写字母,则先转换为小写字母将 a 转换为 c
b 转换为 d ……… x 转换为 z y 转换为 a z 转换为 b
其它字符不变
【例 4.13 】从键盘输入的一串字符(用# 结束输入)按如下规则进行转换:
a b c d … x y z
59
编程点拨if ( ch>='A' && ch<='Z' )
ch=ch+32;
'y'和 'z' 通过 ch=ch+2; 后 ch>'z' if ( ch>'z') ch=ch-26;
大写转小写if ( ch>='a' && ch<='z' )
ch=ch+2; 小写转其后第二个字母
60
#include <stdio.h>main( ){ char ch='\0'; printf("Input data:\n"); do { ch=getchar( ); if ( ch>='A' && ch<='Z' )
ch=ch+32; if ( ch>='a' && ch<='z' ) { ch=ch+2;
if ( ch>'z') ch=ch-26; }
putchar( ch ); } while ( ch!='#');}
Input data:
UfYr'q 2 yLb 3?#what's 2 and 3?#
不希望输出用用 whilewhile 解决解决
61
#include <stdio.h>main( ){ char ch='\0'; printf("Input data:\n"); ch=getchar( ); while ( ch != '#' ) { if ( ch>='A' && ch<='Z' )
ch=ch+32; if ( ch>='a' && ch<='z' ) { ch=ch+2;
if ( ch>'z') ch=ch-26; }
putchar( ch ); ch=getchar( ); }}
不输出“不输出“ #” #”
62
4.4 break 语句和 continue语句
4.4.1 循环体中使用break语句
P103P103
返回
63
4.4.1 循环体中使用 break语句
结构化程序设计只有一个入口、一个出口 顺序、分支、循环结构满足其要求
为提高执行效率,常要提前终止循环 常用 break 语句实现提前终止循环
P103P103
64
【【例例 4.144.14】】 breakbreak 语句示例语句示例#include <stdio.h>main( ){ int i=0,sum=0; for ( i=1; i<=10; i++ ) { if ( i%3 == 0 ) break; sum=sum+i; } printf("i=%d,sum=%d\n",i,sum);}
运行结果:i=3,sum=3
break; 关键字
1和 2 的和 i≤10 说明
提前退出循环
65
执行过程i=1
i=i+1 i≤10假
真
sum=sum+i i%3==0
真
假
循环体
第 1 个出口
第 2 个出口输出 i和 sum 的值
66
请注意break 语句
只能在 switch 语句体和循环体内使用
功能是 提前退出本层的 switch 语句体或循环
体
67
【【例例 44..1515 】】判断从键盘输入的自然数判断从键盘输入的自然数 (大于 (大于 11 ),是不是素数。),是不是素数。
素数(质数) : 除了 1 和它本身外,没有 其它因子的大于 1 的整数。
例如2 3 13 17 23 等是素数
4 12 20 等不是素数
68
要判断 a 是不是素数,应该根据素数的定义,用 2 、 3 、…、 a-1 分别去除 a
如果其中有能整除 a 的数,则 a 不是素数
如果这些数都不能整除 a ,则 a 是素数
只要找到一个能整除 a 的数,就能断定 a不是素数,因此这时应提前退出循环
编程点拨
69
else
#include <stdio.h>main( ){ int i=0,a=0; printf("Input a(>1):"); scanf("%d",&a);
for ( i=2; i<=a-1; i++ ) if ( a%i==0 ) break;
if ( i>a-1 )
用 2、 3、…、 a-1去试 若找到因子提前退出
若真,说明正常退出,是素数
若假,说明提前退出,不是素数 printf("%d is a prime number.\
n",a);
printf("%d is not a prime number.\n",a); }
70
第 1 次运行:Input a(>1):1111 is a prime number.第 2 次运行:Input a(>1):1515 is not a prime
number.
运行情况
71
实际上要判断 a 是不是素数,只需用 2 、 3 、…、 [ ]去除 a 即可
程序改写如下:
a
72
#include <stdio.h>#include <math.h>main( ){ int i=0,a=0,end=0; printf("Input a(>1):");
scanf("%d",&a); end=sqrt(a); for ( i=2; i<=end; i++ ) if ( a%i==0 ) break; if ( i>end ) printf("%d is … \n", a); else printf("%d is not … \n", a);}
end 的值可以是
a-1、 a/2 、 a
更优化
73
4.4.2 循环体中使用 continue语句
P105P105
74
【【例例 4.164.16】】 continuecontinue 语句示例语句示例#include <stdio.h>main( ){ int i=0,sum=0; for ( i=1; i<=10; i++ ) { if ( i%3 == 0 ) continue; sum=sum+i; } printf("i=%d,sum=%d\n",i,sum);}
运行结果:i=11,sum=37
continue;
关键字 1 2 4 5 7 8 10
的和 i>10 说明正常退出循环
75
执行过程i=1
i=i+1 i≤10假
真
sum=sum+i
i%3==0真
假
循环体
没增加出口
输出 i和 sum 的值
76
break和 continue 的区别:
break 结束本层循环 continue 结束本次循环
77
课堂练习田径赛 2000米比赛需要在 400米的操场上跑 5圈。编写程序,每跑一圈(输入回车键表示跑了一圈),显示已跑的圈数。
#include <stdio.h>#include <stdlib.h> /*TC中 #include<conio.h>*/
main(){ int n=0; while(1) { printf("%d",n); getchar(); /* 输入回车键表示跑了一圈 */
system("cls"); /*在 TC中 clrscr();*/
n++; if(n>5) break; } }
78
教学总结
1 .while 语句。2 . do- while 语句。3 . break 语句。
79
作业1 .自学例 4.10 、例 4.12 、例 4.132 . P123 4、 11、 12
预习例 4.17 、例 4.19
80
习题讲解语句“ while(x%3) a++; ” 中的表达式 x%3 等价于
A、 x%3!=0 B、 x%3==0 C、 x%3==1 D、 x%3==2
B
A
1. 有以下程序段,则下面描述中正确的是 。int k=1;while(10) { k++; if(k) break; }A、 1 次也不执行循环体语句B 、执行 1 次循环体语句C 、执行 10 次循环体语句 D 、有语法错
81
2. 有以下程序:程序运行后的输出结果是 。main( ) { int x,n=0; for (x=0; x<=60; x++) if(x%2==0) if(x%3==0) if(x%5==0) n++; printf("%d\n",n); } A 、 3 B、 2 C、 0D 、 61
A
82
3. 有以下程序:程序运行后的输出结果是 。main(){ int i; for (i=1; i<=3; i++) switch(i%3) { case 0: printf("*");break; default: printf("#"); case 1: printf("&"); }} A 、 &#* B、 &#&*
C、 &#&*#& D 、有语法错误
B
83
4. 以下程序运行后的输出结果是 _________ 。main( ){ int a,num=16118,count=0; do { a=num%10; if(a==1) count++; num=num/10; } while(num);printf("count=%d",count);}
3
84
5. 运行以下程序后,从键盘输入 abcdef< 回车 > ,则程序输出的结果是 _______ 。#include <stdio.h>main(){ char ch; int n=0; ch=getchar( ); while(ch!='\n') { ++n ; ch=getchar( ); } printf("%d",n) ; }
6
85
以下程序运行后的输出结果是 ___________。main( ){ int i,s,t; s=0; for(i=1;i<=10; ++i) { if(i%2==0) t=t-i; else t=i; s=s+t; } printf( "s=%d",s);
}
S=20
86
4.5 循环语句的嵌套
一个循环体内又包含另一个完整的循环结构称为循环的嵌套。内嵌的循环中还可以嵌套 循环,这就是多层循环。三种循环 (while 循环、 do-while 循环和 for 循 环 ) 可以互相嵌套。
87
4.5 循环语句的嵌套
下面几种都是合法的形式:(1) while( ) (2) do (3) for(;;) {… {… { while( ) do for(;;) {…} {… } {… } } while( ); } } while( );
88
4.5 循环语句的嵌套(4) while( ) (5) for(;;) (6) do {… {… {… do{…} while( ) for(;;){ } while( ) { } … {…} … } } } while( )
89
4.5 循环语句的嵌套
【【例例 4.174.17 】】(( 11 ))输出以下内容:输出以下内容: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
P105P105
返回
90
分析:一行输出 10 个“ * ” 的语句是for ( j=1; j<=10; j++ ) printf("* "); 输出三行,每行输出 10 个“ *” 的语句是for ( j=1; j<=10; j++ ) printf("* ");printf("\n");for ( j=1; j<=10; j++ ) printf("* ");printf("\n");for ( j=1; j<=10; j++ ) printf("* ");printf("\n");
91
分析:一行输出 10 个“ * ” 的语句是for ( j=1; j<=10; j++ ) printf("* "); 输出三行,每行输出 10 个“ *” 的语句是
for ( i=1; i<=3; i++ ) { for ( j=1; j<=10; j++ ) printf("* "); printf("\n"); }
控制行数 控制行数 控制列数 控制列数
输出一行后换行 输出一行后换行
92
【【例例 4.174.17 】】(( 22 ))输出以下内容:输出以下内容:
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
93
#include <stdio.h>main( ){ int i=0,j=0; for ( i=1; i<=3; i++ ) { for ( j=1; j<=10; j++ )
printf("\n"); }}
printf("%3d",j);
每列上输出的值与 j 有关
94
【【例例 4.174.17 】】(( 33 ))输出以下内容:输出以下内容:
* * * * * *
95
#include <stdio.h>main( ){ int i=0,j=0; for ( i=1; i<=3; i++ ) { for ( j=1; ; j+
+ ) printf("* "); printf("\n");
}}
j<=i
每行输出的数量与 i 有关
96
在一个循环体内又包含另一个循环。称它为嵌套循环。for while do-while 可以互相嵌套
97
【【例例 44..1818 】】求求 11!!+2+2!!+3+3!!++……+20+20!!
例 4.4 中已介绍求 n! 的程序。为了求各阶乘之和,在求 n! 的程序段外面还要使用循环。
编程点拨
98
main( ){ int n=0,i=0; float fac=0,
sum=0;
printf("sum=%e\n",sum);}
for ( n=1; n<=20; n++ )
{
}
i=1; fac=1;do { fac=fac*i; i++; } while(i<=n);
sum=sum+fac;
求 n!
求各阶乘之和
运行结果: sum=2.56133e+18
可移吗?可移吗?
99
#include <stdio.h>main( ){ int n=0; float
printf("sum=%e\n",sum);}
for ( n=1; n<=20; n++ )
{ }
fac=1, sum=0;
n=1 fac=1!
sum=1!
fac= fac * n ;sum=sum+fac
;
n=2 fac=2!
sum=1!+2!n=3 fac=3
!sum=1!+2!
+3!……
本程序还可以不用嵌套循环
100
【【例例 4.194.19 】】输出所有两位素数输出所有两位素数 要求一行输出要求一行输出 1515 个素数。个素数。
当 a=10,11,…,99 时,逐个判断是不是素数,因此需要再套一个循环。
编程点拨
101
#include <math.h>main( ){ int i=0,a=0,end=0,n=0;
}
end=sqrt(a);for ( i=2; i<=end; i++ ) if ( a%i==0 ) break;if ( i>end ) { printf("%4d",a); n++; if ( n%15==0 ) printf("\
n"); }
for ( a=10; a<=99; a++ )
{
}
能改成 for ( a=11; a<=99; a=a+2 ) ?
判断a是否素数
aa在在 10~9910~99时时
102
本例是在范围内逐一变化 a 的值,再一一去试
使用逐个去试的方法——穷举法或枚举法
103
课堂练习 输入 7 个 1 至50 之间的整数,每输入一个数,打印出该值个数的 * 。如:输入10 ,输出 10个* 。
要求:输入的数一定是 1 至 50之间的数,否则,要求重新输入。
#include <stdio.h>main(){ int i=0,j=0,n=0; for(i=1;i<=7;i++) { printf(" input n- -%d: ",i); do { scanf(" %d ",&n) if(n>=1&&n<=50) break; else printf(“input again:”); } while(1); for(j=1;j<=n;j++) printf(" *" ); printf(" \n "); } }
104
以下程序段的输出结果是 。int i,j,k ;for (i=1; i<5; i=i+2 ) { k=1; for( j=i; j<5; j++)
k=k+j; }printf(" s=&d\n",k);
A、 s=1 B、 s=8 C、 s=18 D、 s=5
B
105
教学总结本次课的讲授内容是:1 .循环语句的嵌套。2 .完善贯穿实例。
106
作业P125 16、 18
预习4.7节 上机训练
107
上机实验(第 3 次实验)
完成训练 4.1完成训练 4.2完成训练 4.3完成训练 4.4
P120P120