1
第六章 循环结构程序设计主讲 福州大学数学与计算机学院 韩晓芸
E-mail,hxy@fjtv.net
第六章 循环结构程序设计
2
第六章 循环结构程序设计
第一节 引例
第二节 while语句
第三节 do-while语句
第四节 for语句
第五节 循环的嵌套
第六节 break和 continue语句第六章 循环结构程序设计
3
第一节 引例例 1 编程计算 1+2+..,+10
这是一个典型的循环结构程序,i从 1开始每次增加 1,然后累加到一个称之为累加器的变量中,累加操作当 i≤ 10时一直进行。
main( )
{ int i=1,sum=0;
while(i<=10)
{ sum=sum+i;
i++;
}
printf("%d\n",sum);
}
第六章 循环结构程序设计
4
第二节 while语句
格式,while(表达式 ) 语句 ;
功能,while语句用来实现,当型,循环
执行过程,首先判断表达式,当表达式的值为非 0时,反复执行 while中的语句。
第六章 循环结构程序设计
5
第二节 while语句
注意事项
1) 当条件满足时,执行一次 {},执行到 }则返回
while语句开始下一次。
2) 如果 第一次条件就不满足,循环则一次都不作,直接结束 。执行 }后的语句。
3) 循环体中应有 使循环趋向结束 的语句。
4) 一些变量的赋值操作要 在 while的前面 完成。
5) 循环体如果 包含一个以上的 语句,应用 花括弧 括起来。
第六章 循环结构程序设计
6
例 2 计算 10!=1*2*3…*10
main( )
{int i=1;long fac=1;
while(i<=10)
{ fac*=i;
i++;
}
printf("%ld\n",fac);
}
第六章 循环结构程序设计
7
例 3 计算 1+1/2+…+1/10
main( )
{ int i=1;float sum=0;
while(i<=10)
{sum=sum+1.0/i;
i++;}
printf("%f\n",sum);
}
第六章 循环结构程序设计
8
例 4 计算 1-1/2+1/3+…+1/9 -1/10
解法一:
main( )
{int i=1,sign=1;float sum=0;
while(i<=10)
{sum=sum+1.0/i*sign;
i++;
sign=-sign;}
printf("%f\n",sum);
}
第六章 循环结构程序设计
9
解法二:
main( )
{int i=1;float sum=0;
while(i<=10)
{sum=sum+1.0/i;
sum=sum-1.0/(i+1);
i+=2;}
printf("%f\n",sum);
}
第六章 循环结构程序设计
10
解法三:
main( )
{int i=1;float sum=0;
while(i<=10)
{if(i%2==0)
sum=sum-1.0/i;
else
sum=sum+1.0/i;
i++;}
printf("%f\n",sum);
}
第六章 循环结构程序设计
11
解法四:
main( )
{int i=1;float sum1=0,sum2=0;
while(i<=10)
{ sum1=sum1+1.0/i;
i=i+2;}
i=2;
while(i<=10)
{ sum2=sum2+1.0/i;
i=i+2;}
printf("%f\n",sum1-sum2);
}
第六章 循环结构程序设计
12
第三节 do-while语句
格式,do 语句
– while(表达式 );
功能,do-while语句用来实现,直到型,循环
执行过程,先 无条件执行一次语句,然后 再判断表达式,当表达式的值为非 0时,返回,再执行该语句。 一般,while结构和 do- while结构实现时可以相互转换 。
第六章 循环结构程序设计
13
例 5 用 do-while语句计算 1+2+…+10
main( )
{ int i=1,sum=0;
do
{ sum=sum+i;
i++;}
while(i<=10);
printf("%d",sum);
}
第六章 循环结构程序设计
14
例 6,编写满足 1+2+3+…+ n<500中 最大的 n,并求其和的程序。
main( )
{int n=0,sum=0;
do
{++n;
sum+=n;}
while (sum<500);
printf("n=%dsum=%d\n",n-1,sum-n);
}
第六章 循环结构程序设计
15
第四节 for语句
格式:
for(表达式 1;表达式 2;表达式 3) 语句
执行过程,首先计算表达式 1的值,给循环变量赋初值,然后测试表达式 2的值,若其值非 0,
则执行循环体语句,执行循环体一次后再计算表达式 3的值,自动修改循环变量的值,返回再测试表达式 2的值,直到表达式 2的值为 0(假 )
退出循环。 三个表达式都可以省略。
第六章 循环结构程序设计
16
第四节 for语句
for语句的一般形式可以改写为如下的
while循环的形式,
表达式 1;
while(表达式 2)
{语句;
表达式 3; }
第六章 循环结构程序设计
17
第四节 for语句说明:
(1)for语句一般形式中的,表达式 1”可以省略,
不过 若省略了,其后的分号不能省略,且应在 for语句之前给循环变量赋初值。
例如,i=1;
for (;i<=10;i++) sum=sum+i;
for (i=1;i<=10;i++) sum=sum+i;
就相当于,
第六章 循环结构程序设计
18
第四节 for语句说明:
(2) 如果表达式 2省略 (其后分号不能省 ),即不判断循环条件,循环无终止地执行下去。例如:
for (i=1;;i++) sum=sum+i;
就相当于,
i=1;
while (1)
{sum=sum+i;
i++;}
第六章 循环结构程序设计
19
第四节 for语句说明:
(3) 表达式 3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。 例如:
for (i=1;i<=100;)
{sum=sum+i; i++;}
相当于,
for (i=1;i<=100; i++; )
sum=sum+i;
第六章 循环结构程序设计
20
第四节 for语句说明:
(4) 可以省略表达式 1和表达式 3,只有表达式 2,
即只给循环条件。如:
i=1;
for (;i<100;) {sum=sum+i; i++;}
就相当于
i=1;
while (i<100)
{sum=sum+i; i++;}
第六章 循环结构程序设计
21
例 7 用 for语句计算 1+2+...+10
main( )
{int i,sum=0;
for(i=1; i<=10; i++)
sum=sum+i;
printf("%d",sum);
}
main( )
{ int i=1,sum=0;
while(i<=10)
{ sum=sum+i;
i++;
}
printf("%d",sum);
}
第六章 循环结构程序设计
22
例 8 计算 10!=1*2*3…*10
main( )
{int i;
long fac=1;
for(i=1;i<=10;i++)
fac*=i;
printf("%ld",fac);
}
第六章 循环结构程序设计
23
例 9 求 ∑n! (即求 1!+2!+3!+,.,+20! )
#include,stdio.h”
void main ( )
{ double s=0,t=1 ;
int n;
for (n =1 ; n<=20; n++)
{ t=t*n ; s=s+t ; }
printf (“1!+2! +3!+,.,+20 !=%e\n”,s ) ;
}
第六章 循环结构程序设计
24
第五节 循环的嵌套
一个循环体内又包含另一个完整的循环结构,
称为 循环的嵌套 。内嵌的循环中还可以嵌套循环,这就是 多重循环 。例如,
for(i=1;i<=3;i++)
{...
for(j=1;j<=5;j++)
{...}
… }
第六章 循环结构程序设计
25
三种循环可以相互嵌套,如:
while()
{...
while()
{...}
…
}
while()
{...
do
{...}
while()
…
}
for()
{...
do
{...}
while()
…
}
while()
{...
for()
{...}
…
}
第六章 循环结构程序设计
26
void main ( )
{ int i,j,k ; char space=;
for (i =1; i<=6; i++ )
{ for (j =2 ; j<=i ; j++)
printf (“%c”,space ) ;
for (k=1 ; k<=6 ; k++)
printf (“%c”,?*?) ;
printf (“\n” ) ; } }
例 10 输出以下图形第六章 循环结构程序设计
27
void main ( )
{ int i,j,k ;
for (i=1; i<=4; i++)
{for (j=1; j<=4-i; j++)
printf (,” ) ;
for (k=1; k<=2*i-1; k++)
printf (“*” ) ;
printf (“\n” ) ; }
for (i =3; i>=1; i--)
{for (j=1; j<=4-i; j++)
printf (,” ) ;
for (k=1; k<=2*i-1; k++)
printf (“*” ) ;
printf (“\n” ) ; } }
例 11,
输出以下图形第六章 循环结构程序设计
28
1
2 4
3 6 9
4 8 12 16
5 10 15 20 25
6 12 18 24 30 36
7 14 21 28 35 42 49
8 16 24 32 40 48 56 64
9 18 27 36 45 54 63 72 81 程序例 12 打印乘法,九九表,
第六章 循环结构程序设计
29
例 12 程序编写如下:
main( )
{ int i,j;
for(i=1;i<=9;i++)
{ for(j=1;j<=i;j++)
printf("%4d",i*j);
printf("\n");
}
}
第六章 循环结构程序设计
30
第六节 break和 continue语句
break语句:
break语句用于循环语句和 switch语句,作用是跳出循环和 switch 语句,提前结束循环。
例如,while()
{..,
if()
break;
...}
第六章 循环结构程序设计
31
main( )
{int m,i,j; scanf("%d",&m); j=m-1;
for (i=2; i<=j; i++)
if (m%i==0) break;
if (i>=j+1)
printf ("%d is a prime number",m);
else
printf ("%d is not a prime number",m);}
例 13 输入一个整数 m,判断是否是素数 。
第六章 循环结构程序设计
32
#include,math.h”
main( )
{int m,i,j,n=0;
for (m=101; m<200; m=m+2)
{ j=sqrt(m);
for (i=2; i<=j; i++)
if (m%i==0) break;
if (i>=j+1) {printf ("%6d ",m);n=n+1;}
if (n%10==0) printf(“\n”);}
printf(“\n”);}
例 14 求 100-200之间的全部素数。
第六章 循环结构程序设计
33
continue语句,continue语句类似于 break语句,
但不是退出循环,而是 跳过本次循环体下面未执行的语句,接着执行下一次循环的迭代 。 如:
while( )
{ …
if ( )
continue;
… }
第六章 循环结构程序设计
34
例 15 把 100~200之间不能被 3整除的数输出 。
#include,stdio.h”
main( )
{int n;
for (n=100;n<=200;n++)
{ if (n%3==0)
continue;
printf(“%d”,n);}
}
第六章 循环结构程序设计
35
例 16 使用 continue语句示例
main( )
{int n;
while (1)
{scanf("%d",&n);
if (n%2==1)
{printf("I am sad"); continue;}
break;}
printf("Thanks,I needed that!");
}
第六章 循环结构程序设计
36
例 17 用近似公式求 e≈1+1/1!+1/2!+…+1/n!
分析,设 term分别代表求和公式中的每一项,则第
i项总可以用第 i-1项推算出来,即 term=term/i。
main()
{int i,n; float e=1.0,term=1.0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{term/=i; e+=term;}
printf("%f\n",e);}
第六章 循环结构程序设计
37
例 18 破译密码。按以下规律翻译密码:
将每一个字母变成它后面的字母,如将 A变成 B,Z
变成 A,非字母字符不变,‘ !’作为电文结束标志。
main()
{char ch;
while ((ch=getchar( )) != '!')
{ if ((ch>='a' && ch<='z') || (ch>='A' && ch<='Z'))
if (ch=='z') ch='a';
else if (ch=='Z') ch='A';
else ch=ch+1;
printf("%c",ch);} }
第六章 循环结构程序设计
38
例 19,公鸡每只 5元,母鸡每只 3元,小鸡 3只一元,问一百元买一百只鸡有几种解法。
枚举法,一一列举各种可能的情况并判断哪一种情况是符合要求的解。
main()
{int x,y,z;
for(x=0; x<=19; x++)
for(y=0;y<=33-x; y++)
{ z=100-x-y;
if (z%3==0 && 5*x+3*y+z/3==100)
printf("x=%d y=%d z=%d",x,y,z); }}
第六章 循环结构程序设计
39
例 20,求 fibonacci数列的前 40个数。
分析,设当前项为 f,前一项为 f1,前二项为 f2。
首先根据 f1和 f2推出 f,再将 f2作为 f1,f作为 f2,
再推出 f,如此一直递推下去:
1 1 2 3 5
第一次 f1 + f2 → f
↓ ↓
第二次 f1 + f2 → f
↓ ↓
第三次 f1 + f2 → f
第六章 循环结构程序设计
40
递推法,是指在一个数的序列值中,下一项的值是在前一项的基础上推算出来的,即下一项对前一项有某种依赖关系。
main()
{int i; long f,f1=1,f2=1;
printf("\n"); printf("%12ld%12ld",f1,f2);
for(i=3;i<=40;i++)
{f=f1+f2;
printf("%12ld",f);
if(i%4==0) printf("\n");
f1=f2; f2=f; }}
第六章 循环结构程序设计
41
对 例 20进行简化,只设两个变量 f1和 f2。递推过程如下:
1 1 2 3 5
第一次 f1 + f2 → f1
↓ ↓
第二次 f2 + f1 → f2
↓ ↓
第三次 f1 + f2 → f1
第六章 循环结构程序设计
42
程序改变为如下:
main()
{int i; long f1=1,f2=1;
printf("\n");
for(i=1;i<=20;i++)
{printf("%12ld%12ld",f1,f2);
f1=f1+f2;
f2=f2+f1;
if(i%2==0) printf("\n");}
}
第六章 循环结构程序设计
43
例 21,用 П/4 ≈1 -1/3 + 1/5 –1/7+...求 П
的近似值,直到最后一项绝对值小于 10–6为止。
#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=%12.6f \n”,pi ) ; }
第六章 循环结构程序设计
44
例 22,求两个自然数的最大公约数,最小公倍数
void main ( )
{ int a,b,p,t ;
scanf (“%d,%d”,&a,&b) ;
if (a<b) {t=a; a=b; b=t; }
p=a*b;
while (b !=0)
{t=a%b ; a=b ; b=t ;}
printf (“最大公约数为,%d”,a);
printf (“最小公倍数为,%d\n”,p/a); }
第六章 循环结构程序设计
45
例 23,孙子定理亦称韩信点兵说,一个数用 3除余 2,用 5除余 3,用 7除余 2,求该数。
void main ( )
{ int i=0,j=0 ;
do
{ i++;
if ( i%3==2 && i%5==3 && i%7==2 )
j=1; }
while (j!=1 ) ;
printf (“i=%d \n”,i ) ; }
第六章 循环结构程序设计
46
例 24,对输入的一正整数 a( a在 1到 9之间),
求 Sn=a+aa+aaa+.,+aaa.,a,( 10个 a),
例 a=3,则 S=3+33+333+.,+333.,3
void main ( )
{ int a,i; double sn=0,tn ;
scanf (“%d”,&a );
printf (,\n a=%d \n”,a ) ; tn=a;
while (i <=10 )
{sn=sn+tn ; tn=tn*10+a; ++i; }
printf (“sn=%lf\n”,sn ) ;}
第六章 循环结构程序设计
47
例 25,打印 100~1000之间所有的水仙花数,即其各位 数字的立方之和等于其本身的数。
例,153=1^3+5^3+3^3
void main ( )
{ int i,j,k,n ; printf (“sxhs is:” );
for (n =100;n<1000;n++)
{i=n/100; j=n/10-i*10; k=n%10;
if (i*100+j*10+k == i*i*i+j*j*j+k*k*k )
printf (“%6d”,n);}
printf (“\n”); }
第六章 循环结构程序设计
48
例 26,输出以下图形,
void main ( )
{ int i,j,k,m;
for (i=1; i<=5; i++)
{ printf (“\n” ) ;
for (j=1 ; j<=5-i ; j++)
printf (,”) ;
for (k=1 ; k<=i ; k++)
printf (“%d,,k) ;
for (m=i-1 ; m>=1 ; m--)
printf (“%d,,m) ; }
第六章 循环结构程序设计
49
例 26,输出以下图形,
for (i=4; i>=1; i--)
{ printf (“\n” ) ;
for (j=1 ; j<=5-i ; j++)
printf (,”) ;
for (k=1 ; k<=i ; k++)
printf (“%d,,k) ;
for (m=i-1 ; m>=1 ; m--)
printf (“%d,,m) ; }
printf (“\n” ) ; }
第六章 循环结构程序设计
50
例 27,用 100元换成 5元,1元,0.5元,共 100
张,且 每种不少于 1张,有多少种组合?
void main ( )
{ int i,j,k,sum=0 ; float rbs=0.0;
for (i=1;i<=100;i++)
for (j=1;j<=100;j++)
for (k=1;k<=100;k++)
{ sum=i + j + k ;
rbs=5*i + j + 0.5*k ;
if ((sum==100) &&( rbs ==100 ))
printf (“5元 ---%d,1元 ---%d,
0.5元 ---%d\ n”,i,j,k ) ; } }
第六章 循环结构程序设计
51
为减少循环次数,事实上最多换 11张 5元,程序可以改进为,
void main ( )
{ int i,j ;
for (i =1;i<=11;i++)
for (j =1;j<=93– I;j++)
if ( 5*i + j + 0.5 * ( 100- i – j )==100 )
printf (“5元 ---%d,1元 ---%d,
0.5元 ---%d\ n”,i,j,100 –i –j );
}
第六章 循环结构程序设计主讲 福州大学数学与计算机学院 韩晓芸
E-mail,hxy@fjtv.net
第六章 循环结构程序设计
2
第六章 循环结构程序设计
第一节 引例
第二节 while语句
第三节 do-while语句
第四节 for语句
第五节 循环的嵌套
第六节 break和 continue语句第六章 循环结构程序设计
3
第一节 引例例 1 编程计算 1+2+..,+10
这是一个典型的循环结构程序,i从 1开始每次增加 1,然后累加到一个称之为累加器的变量中,累加操作当 i≤ 10时一直进行。
main( )
{ int i=1,sum=0;
while(i<=10)
{ sum=sum+i;
i++;
}
printf("%d\n",sum);
}
第六章 循环结构程序设计
4
第二节 while语句
格式,while(表达式 ) 语句 ;
功能,while语句用来实现,当型,循环
执行过程,首先判断表达式,当表达式的值为非 0时,反复执行 while中的语句。
第六章 循环结构程序设计
5
第二节 while语句
注意事项
1) 当条件满足时,执行一次 {},执行到 }则返回
while语句开始下一次。
2) 如果 第一次条件就不满足,循环则一次都不作,直接结束 。执行 }后的语句。
3) 循环体中应有 使循环趋向结束 的语句。
4) 一些变量的赋值操作要 在 while的前面 完成。
5) 循环体如果 包含一个以上的 语句,应用 花括弧 括起来。
第六章 循环结构程序设计
6
例 2 计算 10!=1*2*3…*10
main( )
{int i=1;long fac=1;
while(i<=10)
{ fac*=i;
i++;
}
printf("%ld\n",fac);
}
第六章 循环结构程序设计
7
例 3 计算 1+1/2+…+1/10
main( )
{ int i=1;float sum=0;
while(i<=10)
{sum=sum+1.0/i;
i++;}
printf("%f\n",sum);
}
第六章 循环结构程序设计
8
例 4 计算 1-1/2+1/3+…+1/9 -1/10
解法一:
main( )
{int i=1,sign=1;float sum=0;
while(i<=10)
{sum=sum+1.0/i*sign;
i++;
sign=-sign;}
printf("%f\n",sum);
}
第六章 循环结构程序设计
9
解法二:
main( )
{int i=1;float sum=0;
while(i<=10)
{sum=sum+1.0/i;
sum=sum-1.0/(i+1);
i+=2;}
printf("%f\n",sum);
}
第六章 循环结构程序设计
10
解法三:
main( )
{int i=1;float sum=0;
while(i<=10)
{if(i%2==0)
sum=sum-1.0/i;
else
sum=sum+1.0/i;
i++;}
printf("%f\n",sum);
}
第六章 循环结构程序设计
11
解法四:
main( )
{int i=1;float sum1=0,sum2=0;
while(i<=10)
{ sum1=sum1+1.0/i;
i=i+2;}
i=2;
while(i<=10)
{ sum2=sum2+1.0/i;
i=i+2;}
printf("%f\n",sum1-sum2);
}
第六章 循环结构程序设计
12
第三节 do-while语句
格式,do 语句
– while(表达式 );
功能,do-while语句用来实现,直到型,循环
执行过程,先 无条件执行一次语句,然后 再判断表达式,当表达式的值为非 0时,返回,再执行该语句。 一般,while结构和 do- while结构实现时可以相互转换 。
第六章 循环结构程序设计
13
例 5 用 do-while语句计算 1+2+…+10
main( )
{ int i=1,sum=0;
do
{ sum=sum+i;
i++;}
while(i<=10);
printf("%d",sum);
}
第六章 循环结构程序设计
14
例 6,编写满足 1+2+3+…+ n<500中 最大的 n,并求其和的程序。
main( )
{int n=0,sum=0;
do
{++n;
sum+=n;}
while (sum<500);
printf("n=%dsum=%d\n",n-1,sum-n);
}
第六章 循环结构程序设计
15
第四节 for语句
格式:
for(表达式 1;表达式 2;表达式 3) 语句
执行过程,首先计算表达式 1的值,给循环变量赋初值,然后测试表达式 2的值,若其值非 0,
则执行循环体语句,执行循环体一次后再计算表达式 3的值,自动修改循环变量的值,返回再测试表达式 2的值,直到表达式 2的值为 0(假 )
退出循环。 三个表达式都可以省略。
第六章 循环结构程序设计
16
第四节 for语句
for语句的一般形式可以改写为如下的
while循环的形式,
表达式 1;
while(表达式 2)
{语句;
表达式 3; }
第六章 循环结构程序设计
17
第四节 for语句说明:
(1)for语句一般形式中的,表达式 1”可以省略,
不过 若省略了,其后的分号不能省略,且应在 for语句之前给循环变量赋初值。
例如,i=1;
for (;i<=10;i++) sum=sum+i;
for (i=1;i<=10;i++) sum=sum+i;
就相当于,
第六章 循环结构程序设计
18
第四节 for语句说明:
(2) 如果表达式 2省略 (其后分号不能省 ),即不判断循环条件,循环无终止地执行下去。例如:
for (i=1;;i++) sum=sum+i;
就相当于,
i=1;
while (1)
{sum=sum+i;
i++;}
第六章 循环结构程序设计
19
第四节 for语句说明:
(3) 表达式 3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。 例如:
for (i=1;i<=100;)
{sum=sum+i; i++;}
相当于,
for (i=1;i<=100; i++; )
sum=sum+i;
第六章 循环结构程序设计
20
第四节 for语句说明:
(4) 可以省略表达式 1和表达式 3,只有表达式 2,
即只给循环条件。如:
i=1;
for (;i<100;) {sum=sum+i; i++;}
就相当于
i=1;
while (i<100)
{sum=sum+i; i++;}
第六章 循环结构程序设计
21
例 7 用 for语句计算 1+2+...+10
main( )
{int i,sum=0;
for(i=1; i<=10; i++)
sum=sum+i;
printf("%d",sum);
}
main( )
{ int i=1,sum=0;
while(i<=10)
{ sum=sum+i;
i++;
}
printf("%d",sum);
}
第六章 循环结构程序设计
22
例 8 计算 10!=1*2*3…*10
main( )
{int i;
long fac=1;
for(i=1;i<=10;i++)
fac*=i;
printf("%ld",fac);
}
第六章 循环结构程序设计
23
例 9 求 ∑n! (即求 1!+2!+3!+,.,+20! )
#include,stdio.h”
void main ( )
{ double s=0,t=1 ;
int n;
for (n =1 ; n<=20; n++)
{ t=t*n ; s=s+t ; }
printf (“1!+2! +3!+,.,+20 !=%e\n”,s ) ;
}
第六章 循环结构程序设计
24
第五节 循环的嵌套
一个循环体内又包含另一个完整的循环结构,
称为 循环的嵌套 。内嵌的循环中还可以嵌套循环,这就是 多重循环 。例如,
for(i=1;i<=3;i++)
{...
for(j=1;j<=5;j++)
{...}
… }
第六章 循环结构程序设计
25
三种循环可以相互嵌套,如:
while()
{...
while()
{...}
…
}
while()
{...
do
{...}
while()
…
}
for()
{...
do
{...}
while()
…
}
while()
{...
for()
{...}
…
}
第六章 循环结构程序设计
26
void main ( )
{ int i,j,k ; char space=;
for (i =1; i<=6; i++ )
{ for (j =2 ; j<=i ; j++)
printf (“%c”,space ) ;
for (k=1 ; k<=6 ; k++)
printf (“%c”,?*?) ;
printf (“\n” ) ; } }
例 10 输出以下图形第六章 循环结构程序设计
27
void main ( )
{ int i,j,k ;
for (i=1; i<=4; i++)
{for (j=1; j<=4-i; j++)
printf (,” ) ;
for (k=1; k<=2*i-1; k++)
printf (“*” ) ;
printf (“\n” ) ; }
for (i =3; i>=1; i--)
{for (j=1; j<=4-i; j++)
printf (,” ) ;
for (k=1; k<=2*i-1; k++)
printf (“*” ) ;
printf (“\n” ) ; } }
例 11,
输出以下图形第六章 循环结构程序设计
28
1
2 4
3 6 9
4 8 12 16
5 10 15 20 25
6 12 18 24 30 36
7 14 21 28 35 42 49
8 16 24 32 40 48 56 64
9 18 27 36 45 54 63 72 81 程序例 12 打印乘法,九九表,
第六章 循环结构程序设计
29
例 12 程序编写如下:
main( )
{ int i,j;
for(i=1;i<=9;i++)
{ for(j=1;j<=i;j++)
printf("%4d",i*j);
printf("\n");
}
}
第六章 循环结构程序设计
30
第六节 break和 continue语句
break语句:
break语句用于循环语句和 switch语句,作用是跳出循环和 switch 语句,提前结束循环。
例如,while()
{..,
if()
break;
...}
第六章 循环结构程序设计
31
main( )
{int m,i,j; scanf("%d",&m); j=m-1;
for (i=2; i<=j; i++)
if (m%i==0) break;
if (i>=j+1)
printf ("%d is a prime number",m);
else
printf ("%d is not a prime number",m);}
例 13 输入一个整数 m,判断是否是素数 。
第六章 循环结构程序设计
32
#include,math.h”
main( )
{int m,i,j,n=0;
for (m=101; m<200; m=m+2)
{ j=sqrt(m);
for (i=2; i<=j; i++)
if (m%i==0) break;
if (i>=j+1) {printf ("%6d ",m);n=n+1;}
if (n%10==0) printf(“\n”);}
printf(“\n”);}
例 14 求 100-200之间的全部素数。
第六章 循环结构程序设计
33
continue语句,continue语句类似于 break语句,
但不是退出循环,而是 跳过本次循环体下面未执行的语句,接着执行下一次循环的迭代 。 如:
while( )
{ …
if ( )
continue;
… }
第六章 循环结构程序设计
34
例 15 把 100~200之间不能被 3整除的数输出 。
#include,stdio.h”
main( )
{int n;
for (n=100;n<=200;n++)
{ if (n%3==0)
continue;
printf(“%d”,n);}
}
第六章 循环结构程序设计
35
例 16 使用 continue语句示例
main( )
{int n;
while (1)
{scanf("%d",&n);
if (n%2==1)
{printf("I am sad"); continue;}
break;}
printf("Thanks,I needed that!");
}
第六章 循环结构程序设计
36
例 17 用近似公式求 e≈1+1/1!+1/2!+…+1/n!
分析,设 term分别代表求和公式中的每一项,则第
i项总可以用第 i-1项推算出来,即 term=term/i。
main()
{int i,n; float e=1.0,term=1.0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{term/=i; e+=term;}
printf("%f\n",e);}
第六章 循环结构程序设计
37
例 18 破译密码。按以下规律翻译密码:
将每一个字母变成它后面的字母,如将 A变成 B,Z
变成 A,非字母字符不变,‘ !’作为电文结束标志。
main()
{char ch;
while ((ch=getchar( )) != '!')
{ if ((ch>='a' && ch<='z') || (ch>='A' && ch<='Z'))
if (ch=='z') ch='a';
else if (ch=='Z') ch='A';
else ch=ch+1;
printf("%c",ch);} }
第六章 循环结构程序设计
38
例 19,公鸡每只 5元,母鸡每只 3元,小鸡 3只一元,问一百元买一百只鸡有几种解法。
枚举法,一一列举各种可能的情况并判断哪一种情况是符合要求的解。
main()
{int x,y,z;
for(x=0; x<=19; x++)
for(y=0;y<=33-x; y++)
{ z=100-x-y;
if (z%3==0 && 5*x+3*y+z/3==100)
printf("x=%d y=%d z=%d",x,y,z); }}
第六章 循环结构程序设计
39
例 20,求 fibonacci数列的前 40个数。
分析,设当前项为 f,前一项为 f1,前二项为 f2。
首先根据 f1和 f2推出 f,再将 f2作为 f1,f作为 f2,
再推出 f,如此一直递推下去:
1 1 2 3 5
第一次 f1 + f2 → f
↓ ↓
第二次 f1 + f2 → f
↓ ↓
第三次 f1 + f2 → f
第六章 循环结构程序设计
40
递推法,是指在一个数的序列值中,下一项的值是在前一项的基础上推算出来的,即下一项对前一项有某种依赖关系。
main()
{int i; long f,f1=1,f2=1;
printf("\n"); printf("%12ld%12ld",f1,f2);
for(i=3;i<=40;i++)
{f=f1+f2;
printf("%12ld",f);
if(i%4==0) printf("\n");
f1=f2; f2=f; }}
第六章 循环结构程序设计
41
对 例 20进行简化,只设两个变量 f1和 f2。递推过程如下:
1 1 2 3 5
第一次 f1 + f2 → f1
↓ ↓
第二次 f2 + f1 → f2
↓ ↓
第三次 f1 + f2 → f1
第六章 循环结构程序设计
42
程序改变为如下:
main()
{int i; long f1=1,f2=1;
printf("\n");
for(i=1;i<=20;i++)
{printf("%12ld%12ld",f1,f2);
f1=f1+f2;
f2=f2+f1;
if(i%2==0) printf("\n");}
}
第六章 循环结构程序设计
43
例 21,用 П/4 ≈1 -1/3 + 1/5 –1/7+...求 П
的近似值,直到最后一项绝对值小于 10–6为止。
#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=%12.6f \n”,pi ) ; }
第六章 循环结构程序设计
44
例 22,求两个自然数的最大公约数,最小公倍数
void main ( )
{ int a,b,p,t ;
scanf (“%d,%d”,&a,&b) ;
if (a<b) {t=a; a=b; b=t; }
p=a*b;
while (b !=0)
{t=a%b ; a=b ; b=t ;}
printf (“最大公约数为,%d”,a);
printf (“最小公倍数为,%d\n”,p/a); }
第六章 循环结构程序设计
45
例 23,孙子定理亦称韩信点兵说,一个数用 3除余 2,用 5除余 3,用 7除余 2,求该数。
void main ( )
{ int i=0,j=0 ;
do
{ i++;
if ( i%3==2 && i%5==3 && i%7==2 )
j=1; }
while (j!=1 ) ;
printf (“i=%d \n”,i ) ; }
第六章 循环结构程序设计
46
例 24,对输入的一正整数 a( a在 1到 9之间),
求 Sn=a+aa+aaa+.,+aaa.,a,( 10个 a),
例 a=3,则 S=3+33+333+.,+333.,3
void main ( )
{ int a,i; double sn=0,tn ;
scanf (“%d”,&a );
printf (,\n a=%d \n”,a ) ; tn=a;
while (i <=10 )
{sn=sn+tn ; tn=tn*10+a; ++i; }
printf (“sn=%lf\n”,sn ) ;}
第六章 循环结构程序设计
47
例 25,打印 100~1000之间所有的水仙花数,即其各位 数字的立方之和等于其本身的数。
例,153=1^3+5^3+3^3
void main ( )
{ int i,j,k,n ; printf (“sxhs is:” );
for (n =100;n<1000;n++)
{i=n/100; j=n/10-i*10; k=n%10;
if (i*100+j*10+k == i*i*i+j*j*j+k*k*k )
printf (“%6d”,n);}
printf (“\n”); }
第六章 循环结构程序设计
48
例 26,输出以下图形,
void main ( )
{ int i,j,k,m;
for (i=1; i<=5; i++)
{ printf (“\n” ) ;
for (j=1 ; j<=5-i ; j++)
printf (,”) ;
for (k=1 ; k<=i ; k++)
printf (“%d,,k) ;
for (m=i-1 ; m>=1 ; m--)
printf (“%d,,m) ; }
第六章 循环结构程序设计
49
例 26,输出以下图形,
for (i=4; i>=1; i--)
{ printf (“\n” ) ;
for (j=1 ; j<=5-i ; j++)
printf (,”) ;
for (k=1 ; k<=i ; k++)
printf (“%d,,k) ;
for (m=i-1 ; m>=1 ; m--)
printf (“%d,,m) ; }
printf (“\n” ) ; }
第六章 循环结构程序设计
50
例 27,用 100元换成 5元,1元,0.5元,共 100
张,且 每种不少于 1张,有多少种组合?
void main ( )
{ int i,j,k,sum=0 ; float rbs=0.0;
for (i=1;i<=100;i++)
for (j=1;j<=100;j++)
for (k=1;k<=100;k++)
{ sum=i + j + k ;
rbs=5*i + j + 0.5*k ;
if ((sum==100) &&( rbs ==100 ))
printf (“5元 ---%d,1元 ---%d,
0.5元 ---%d\ n”,i,j,k ) ; } }
第六章 循环结构程序设计
51
为减少循环次数,事实上最多换 11张 5元,程序可以改进为,
void main ( )
{ int i,j ;
for (i =1;i<=11;i++)
for (j =1;j<=93– I;j++)
if ( 5*i + j + 0.5 * ( 100- i – j )==100 )
printf (“5元 ---%d,1元 ---%d,
0.5元 ---%d\ n”,i,j,100 –i –j );
}