引例:请根据以下情况,编写相应程序
某公司财务部每天接受1000笔帐户的汇入。每接受一笔汇款,将汇款钱数加入到总额之中。到达规定的次数时,输出汇款总额。
6.1 三种循环结构
6.1.1 while语句
一般形式:while(表达式)语句
作用:实现“当型”循环,当表达式成立时,执行语句。
执行过程:
例:输入四个数并求和,要求一次只能加一个数。
循环程序设计的三要素:
1. 变量初值,尤其是循环变量的初值;
2. 循环条件;
3. 循环体语句,即:反复执行的操作;
例2 求n!。
main( )
{ double t;
int i, n;
scanf("%d",&n);
t=1; i=1;
while(i<=n)
{ t=t*i;
i++;
}
printf("%e\n", t);
}
例3: 求1到100之间的奇数之和,偶数之积。
6.1.2 do-while语句
#include "math.h"
main( )
{ int s;
float n, t, pi;
t=1; pi=0; n=1; s=1;
do
{ pi=pi+t;
n=n+2;
s=-s;
t=s/n;
} while (fabs(t)>=1e-4);
printf("pi=%f\n",4*pi);
}
main( )
{
float sum=0,t;
int n=1;
do
{ t=1.0/(n*(n+1));
sum=sum+t;
n++;
} while(t>=1e-3);
printf("sum=%f\n", sum);
}
while循环与do_while循环小结
1. 循环体内必须有使循环趋于终止的条件。
2. 注意循环初值与循环条件。
3. do_while 循环的循环体至少执行一次, while循环的循环体可能一次也不执行。
例6:编程序,求一批非零整数中的偶数、奇数的平均值。用零作为终止标记。
main( )
{ int x, s1=0, s2=0, i=0, j=0;
float av1=0, av2=0;
scanf("%d", &x);
while (x!=0)
{ if (x%2==0) { s1=s1+x; i++;}
else { s2=s2+x ; j++;}
scanf("%d", &x);
}
if (i!=0)
{av1=s1*1.0/i; printf(“t1=%7.2f \n" ,av1);}
if ( j!=0)
{av2=s2*1.0/j; printf(“t2=%7.2f \n" ,av2);}
}
例7:任意十个数,打印它们中的最大数与最小数。
§6.1.3 for 语句
上图是动态图,截图出来的结果有所改变,以及部分看不到。可以自己推断出里面的内容。
3. 说明 :
1)表达式1可省,但分号不能省 ;
2)若表达式2省略,循环条件永远为真 ;
3)表达式3也可省略,但应设法保证循环正常结束 ;
例 2: 求1!+2!+3!+......+20!
例3:任意十个数,打印它们中的最大数 与最小数。
main( )
{ int x, max, min, i=1; scanf("%d", &x);
max=x; min=x;
for(i=1;i<=9;i++)
{ scanf("%d",&x);
if(x>max) max=x;
if(x<min) min=x;
}
printf("max=%d, min=%d\n",max,min);
}
注:
1.尽量避免用实型变量控制循环次数。
2.在循环体内尽量避免改变循环变量的值, 否则将难以予知循环次数。
§6.2 循环的嵌套
概念 :一个循环体内又包含另一个完整的循环结构 。
例4: 打印乘法99表
main( )
{
int i, j;
printf("\n");
for(i=1;i<10;i++)
{
for(j=1;j<10;j++) printf("%4d",i*j);
printf("\n");
}
}
main( )
{int i, j;
for(i=1;i<10;i++)
{for(j=1;j<10;j++)
printf("%2d*%1d=%-3d", i, j, i*j);
printf("\n");
}
}
main( )
{int i, j;
for(i=1;i<10;i++)
{ for(j=1;j<=i;j++)
printf("%2d*%1d=%-3d",j,i,i*j);
printf("\n");
}
}
方法 1:
方 法 2:
main( )
{int k1, k2, k3, i;
for (k3=1;k3<=9;k3++)
for (k2=0;k2<=9;k2++)
for (k1=0;k1<=9;k1++)
{ i=k3*100+k2*10+k1;
if(i==k1*k1*k1+k2*k2*k2+k3*k3*k3)
printf("%4d",i);
}
}
几种循环的比较
1. 四种循环一般可互相代替,但不提倡使用goto型循环 ;
2. while和do-while循环的循环体中应包括使循环趋于结束的语句。
3. for循环可以在表达式3中包含使循环趋于结束的语句,甚至可以将循环体中的操作全部放到表达式3中,因此for语句功能更强,完全可以代替while循环 。
4. 用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成,而for语句可在表达式1中给出 ;
5. while和for循环是先判断表达式,后执行语句,而do-while循环是先执行语句,后判断表达式 ;
6. 对while、do-while和for循环,可以用break跳出循环,用continue语句结束本次循环,而对goto和if构成的循环不能用break和continue语句进行控制 。
§6.3 break 和continue
一、break语句
作用:1)从循环体内跳出循环体,即提前结束循环, 接着执行循环下面的语句;break语句只能用于循环语句和switch语句。
二、continue 语句
1.作用:结束本次循环,即跳过循环体中下面尚未执行的语句,接着执行下一次是否执行循环的判定。
2.break语句和continue语句的区别是 :
1)continue语句只结束本次循环,不终止整个循环的执行;
2)break语句是终止整个循环的执行,不再进行条件判断。
§6.4 程序举例
例1:从键盘上任意输入一个正整数,判断其是否为素数。
素数:除了1和它本身之外没有其他因子的数。
方法1:设置标志位
方法2:判断循环时候正常结束
例2:求100-200之间的所有素数及素数的个数。
main( )
{ int i, n=0, k, m;
for(m=100;m<=200;m++)
{k=1;
for(i=2;i<=m-1;i++)
if(m%i==0) k=0;
if(k)
{ printf("%5d",m); n++;
if(n%10==0) printf("\n");}
}
printf(" n=%d\n",n); }
main( )
{ int i, m, n=0;
for(m=100; m<=200; m++)
{ for(i=2; i<=m-1; i++)
if(m%i==0) break;
if(i==m)
{ printf("%5d",m);
n++;
if(n%10==0) printf("\n");
}
}
printf(" n=%d\n",n);
}
例3:求Fibonacci数列:1,1,2,3,5,8,... ...的前40个数 。
main( )
{ long int f1 , f2 , f3;
int i=1;
f1=1; f2=1;
printf("%12ld%12ld",f1,f2);
for( i=3; i<=40; i++)
{ f3=f1+f2; printf("%12ld",f3);
f1=f2;
f2=f3;
if(i%4==0) printf("\n");
}
}
例4: 找出10~1200之间各个位数字之和能被 5整除的所有数。
main( )
{ int i, m, s, k=0;
for(i=10;i<=1200;i++)
{ m=i; s=0;
do
{s=s+m%10;
m=m/10;
}while(m>0);
if (s%5==0)
{ printf("%5d",i);
k++;
if (k%10==0) printf("\n");
}
}
}
#include <math.h>
main( )
{ float x, x1, f, f1;
x1=1.5;
do
{ x=x1;
f=2*x*x*x-4x*x+3*x-6;
f1=6*x*x-8*x+3;
x1=x-f/f1;
} while (fabs(x-x1)>=1e-5);
printf("%7.4f \n",x1);
}
例6: 找出1~1000之间的全部同构数。
同构数: 一个数等于它的平方数的右端。
如:5的平方是25
25的平方是625
例7: 编程找出1000之内的所有完数。
完数:一个数恰好等于它的因子之和。 例如:6的因子为1,2,3,而6=1+2+3,因此6是完数。
main( )
{ int i, n, s;
for (n=2;n<=1000;n++)
{ s=0;
for (i=1;i<=n/2;i++)
if (n%i==0) s=s+i;
if (n==s)
{ printf("%d its factors are %d",n,1);
for (i=2;i<=n/2;i++)
if (n%i==0) printf(",%d",i);
}
}
例8.输入两个正整数m和n,求其最大公约 数和最小公倍数。
辗转相除法求最大公约数:
首先将 m除以 n(m>n)得余数 r,再用余数r去除原来的除数,得新的余数,重复此过程直到余数为 0时停止,此时的除数就是m和n的最大公约数。
求 m和 n的最小公倍数:
m和 n的积除以 m和 n 的最大公约数。
main( )
{ int m,n,r,p,gy,gb;
scanf("%d%d",&m,&n);
if(m<n) {p=m;m=n;n=p;}
p=m*n;
r=m%n;
while(r!=0)
{ m=n;n=r;r=m%n; }
gy=n;
gb=p/n;
printf("gy=%d,gb=%d\n",gy,gb);
}
例9:简单图案打印