3.4 循环控制语句
循环控制结构(又称重复结构)是程序中的另一个基本结构。在实际问题中,经常需要进行大量的重复处理,循环结构可以使我们只写很少的语句,而让计算机反复执行,从而完成大量类同的计算。
C语言提供了while语句、do . . . while语句和for语句实现循环结构。
3.4.1 while语句
while语句是当型循环控制语句,一般形式为:
while <表达式> 语句;
语句部分称为循环体,当需要执行多条语句时,应使用复合语句。
while语句的流程图见图3 - 8,其特点是先判定,后执行,若条件不成立,有可能一次也不执行。
[例3 - 11] 求n!
分析: n!= n* (n - 1)*(n - 2)* .. 2*1, 0 ! = 1。即S0= 1,Sn= Sn - 1* n。可以从S0开始,依次
求出S1、S2、. . . Sn。
统一令S等于阶乘值, S的初值为0!= 1;变量i为计数器, i从1变到n,每一步令S = S * i,则最终S中的值就是n!。
流程图见图3 - 9
[例3-12] 利用格里高利公式求p :
p/4 = 1 - 1/3 + 1/5 - 1/7 + ...
直到最后一项的绝对值小于等于1 0- 6为止。
程序如下:
# include <stdio.h>
# include <math.h>
{
main( )
{
double e,p i ;
long int n,s ;
t = 1.0;
n = 1;
s = 1;
pi = 0.0;
while (fabs(t)>=1e-6)
{
p i = p i + t ;
n = n + 2 ;
s = -s;
t = (float)(s) / (float)(n);
}
pi = pi * 4;
printf(" pi = %lf\n" ,pi);
}
运行结果为:
pi = 3.141591
本题中,将多项式的每一项用t表示, s代表符号,在每一次循环中,只要改变s、n的值,就可求出每一项t。
一般情况下, w h i l e型循环最适合于这种情况:知道控制循环的条件为某个逻辑表达式的值,而且该表达式的值会在循环中被改变,如同例3 - 1 2的情况一样。
3.4.2 do... while 语句
在C语句中,直到型循环的语句是do . . . while ,它的一般形式为:
do 语句while <表达式>
其中语句通常为复合语句,称为循环体。
d o. . .while 语句的流程图见图3 - 1 0
3.4.5 程序应用举例
[例3-18] 验证哥德巴赫猜想:任一充分大的偶数,可以用两个素数之和表示,例如:
4 = 2 + 2
6 = 3 + 3
....
98 = 19 + 79
哥德巴赫猜想是世界闻名的数学难题,至今未能在理论上得到证实,自从计算机出现后,人们就开始用计算机去尝试解各种各样的数学难题,包括费马大定理、四色问题、哥德巴赫猜想等,虽然计算机无法从理论上严密地证实它们,而只能在很有限的范围内对其进行检验,但也不失其意义。费马大定理已于1 9 9 4年得到证实,而哥德巴赫猜想这枚数学王冠上的宝石,至今无人能及。
分析:我们先不考虑怎样判定一个数是否为素数,而从整体上对这个问题进行考虑,可以这样做:读入一个偶数n,将它分成p和q,使n = p + q。怎样分呢?可以令p从2开始,每次加1,而令q = n - p,假如p、q均为素数,则正为所求,否则令p = p + q再试。
其基本算法如下:
1) 读入大于3的偶数n。
2) P=1
3) do {
4) p=p+1;q = n-p ;
5) p是素数吗?
6) q是素数吗?
7) } while p、q有一个不是素数。
8 ) 输出n = p + q。
为了判明p、q是否是素数,我们设置两个标志量flagp和flagq,初始值为0,若p是素数,令flagp = 1,若q是素数,令flagq = 1,于是第7步变成:
7) } while (flagp*flagq==0);
再来分析第5、第6步,怎样判定一个数是不是素数呢?
素数就是除了1和它自身外,不能被任何数整除的整数,由定义可知:
2、3、5、7、11、1 3、1 7、1 9等是素数;
1、4、6、8、9、1 0、1 2、1 4等不是素数;
要判定i是否是素数,最简单的办法是用2、3、4、⋯⋯i-1这些数依次去除i,看能否除尽,若被其中之一除尽,则i不是素数,反之,i是素数。
但其实,没必要用那么多的数去除,实际上,用反证法很轻易证实,假如小于等于i的平方根的数都除不尽,则i必是素数。于是,上述算法中的第5步、第6步可以细化为:
第5)步p是素数吗?
flagp = 1 ;
for (j=2;j<=[sqrt(p)];j++)
if p除以j的余数= 0
{ flagp=0;
break; }
第6 )步q是素数吗?
f l a g q = 1 ;
for (j=2;j<=[sqrt(q)];j++)
if q除以j的余数= 0
{ flagq=0;
break; }
程序如下:
#include <math.h>
#include <stdio.h>
main( )
{
int j,n,p,q,f l a g p ,f l a g q ;
printf("please input n :");
scanf(" %d",& n ) ;
if (((n%2)!=0)||(n<=4))
printf("input data error!\n");
else
{
p = 1 ;
do {
p = p + 1 ;
q = n - p ;
flagp = 1 ;
for( j = 2; j < = (int)(floor(sqrt((double)(p)))); j++)
{
if ((p%j)==0)
{
flagp = 0 ;
break;
}
}
flagq = 1;
for (j=2;j<=(int)(floor(sqrt((double)(q))));j++)
{
if ((q%j)==0)
{
flagq = 0;
break;
}
}
} while (flagp*flagq==0);
printf("%d = %d + %d \n" ,n,p,q );
}
}
程序运行结果如下:
please input n : 8
8 =3+5
please input n : 98
98 =19+79
please input n : 9
input data error!
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |