二、语句执行过程 (1)计算作为循环控制条件表达式的值,得到逻辑真或假,假定用M表示。 (2)若M为真,则执行了一遍循环体,否则离开循环,结束整个while语句的执行。 (3)循环体的所有语句执行结束后,自动转向第(1)步执行。 三、格式举例 (1) i=0; while (i<> ++i; 功能:当i的值小于10,重复执行++i语句 (2) cin>>x; while(x<>) cin>>x; 功能:当输入的数据小于0时,重复读数据。 例4.5 求s=1 +2 +3……+n,当加到第几项时,s的值会超过1000? 程序如下: #include using namespace std; int main () { int n=0,s=0; while (s<> { ++n; s+=n; } cout<> return 0; } 例4.6 求两个正整数m,n的最大公约数。 分析:求两个整数的最大公约数可以采用辗转相除法。以下是辗转相除法的算法:分别用m,n,r表示被除数、除数、余数; 1)求m除以n的余数r; 2)当r!=0,执行第3)步;若r==0,则n为最大公约数,算法结束。 3)将n的值赋给m,将r的值赋给n;再求m除以n的余数r。 4)转到第2)步 #include using namespace std; int main () { int m,n,r; cin>>m>>n; r =m % n; while (r!=0) //也可以使用 while(r),c++中非0即真 { m=n; n=r; r=m % n; } cout<>最大公约数='<><> return 0; } 例4.7 编一程序求满足不等式1+1/2 + 1/3 …+1/n >=5的最小n值。 分析:此题不等式的左边是一个求和的算式,该和式中的数据项个数是未知的,也正是要求出的。对于和式中的每个数据项,对应的通式为1/i,i=1,2,…n。 所以可采用循环累加的方法来计算出它的值。设循环变量为i,它应从1开始取值,每次增加1,直到和式的值不小于5为止,此时的i值就是所求的n。设累加变量为s,在循环体内把1/i的值累加到s上。 根据以上分析,采用while循环编写出程序如下: #include using namespace std; int main () { int i=0; float s=0; while(s<5)>5)>当s的值还未超过5时 { ++i; s+=1.0/i; } cout<> return 0; } 例4.8 数据统计 输入一些整数,求出它们的最小值、最大值和平均值(保留3位小数)。输入保证这些数都是不超过1000的整数。 样例输入:2 8 3 5 1 7 3 6 样例输出:1 8 4.375 【参考程序】 #include int main() { int x,n=0,min,max,s=0; while (scanf('%d',&x)==1) { s+=x; if (x if (x>max) max=x; ++n; } printf('%d %d %.3lf\n',min,max,(double)s/n); return 0; } · 【优化程序】 · #include · #define INF 100000000 · int main() · { · int x,n=0,min=INF,max=-INF,s=0; · while(scanf('%d',&x)==1) · //scanf('%d',&x)!=EOF,如果没数据可读,scanf返回EOF · { · s+=x; · if (x · if (x>max) max=x; · ++n; · } · printf('%d %d%.3lf\n',min,max,(double)s/n); · return 0; · } 最后,我们来更仔细地研究一下输入输出。研究对象就是经典的“A+B”问题:输入若干对整数,输出每对之和。假设每个整数不超过109,一共不超过106个数对。 第1种方法是: #include int main() { int a,b; while(scanf('%d%d',&a,&b)==2) printf('%d\n',a+b); return 0; } 第2种方法也许更加常用(你再也不用记住%d、%lf等恼人的占位符了): #include using namespace std; int main() { int a,b; while(cin >> a >> b ) cout < a+b=""><> return 0; } · 【上机练习4.2】 · 1、用while循环完成如下3题: · ①求s=1+2+3+4+…+10 · ②求s=1+1/2+1/3+…+1/100 · ③计算n!,其中n由键盘输入。 · 2、输入任意的自然数A, B, 求A , B的最小公倍数。 · 3、小球从100高处自由落下,着地后又弹回高度的一半再落下。求第20次着地时, 小球共通过多少路程? · 4、Faibonacci数列前几项为: 0,1,1,2,3,5,8,…,其规律是从第三项起, 每项均等于前两项之和。求前30项,并以每行5个数的格式输出。 |
|