C语言程序设计(第3版)何钦铭-颜-晖-第4章-循环结构
第4章循环结构 【练习4-1]在例4-1程序中,如果对item赋初值0,运行结果是什么?为 什么?如果将精度改为IO:运行结果有变化吗?为什么? 解答: 如果对item赋初值0,则程序运行结果是pi=0,因为item为0时不满 足while循环的执行条件,即不执行循环,故pi值为0o如果将精度改为 10-3,运行结果会有变化,因为精度改变意味着while循环的条件改变,精度 变大使得while循环次数减少,必然影响到兀的值。 【练习4-2] 运行例4-2程序时,如果将最后一个输入数据改为-2,运行结 果有变化吗?如果第一个输入数据是-1,运行结果是什么?为什么? 解答: 如果将最后一个输入数据改为-2,运行结果没有变化,因为最后一个负数是 一结束标志,不进行统计,故任意一个负数都可以。如果第一个输入数据是-1, 运行结果是:Grade average is 0,因为第…个输入就是T,则while循环条件 不成立,不执行循环体。 【练习4-3】序列求和(1-1/4+1/7-1/10+1/13-1/16+…):输入一个正实数eps, 计算序列1T/4+1/7-1/10+1/13-1/16+…的值,精确到最后…项的绝对值小于 eps (保留6位小数)。试编写相应程序。 解答: ttinclude ttinclude int main(void) { int denominator, flag; double item, s, eps; printf( u eps:“); scanf( “%lf” , flag 二 1; denominator 二 1 ; item = 1. 0; s = 0; while(fabs (item) >= eps) { item 二 flag * 1. 0 / denominator; s = s + item; flag 二-flag; denominator 二 denominator +3; } printf ( “s 二 %f\n” , s); return 0; } 【练习4-4】如果将例4-3程序中的do-while语句改为下列while语句,会 影响程序的功能吗?为什么?再增加一条什么语句,就可以实现同样的功能? while(number != 0) ( number 二 number / 10; count ++; } 解答: 会有影响,因为当输入数据number为0时,上述while循环将不执行, count值仍为0,故输出为0,不符合题目要求。可增加一条if语句来解决上 面的问题,在while循环前加上语句“if ( number==0) count=l;“。 【练习4-5】例4-4程序中的第9〜15行可以用下列for语句替代吗?为什 么? for( i = 2; i〈= m/2; i++) if( m%i == 0 ) printf(〃No!\n〃); else printf(〃%d is prime number!\n〃,m); 解答: 不能代替,因为只用一个数来除不足以判断该数是否是素数。 【练习4-6]猜数字游戏:先输入2个不超过100的正整数,分别是被猜数 my numb er和允许猜测的最大次数n,再输入你所猜的数your numb er,与被猜数 my numb er进行比较,若相等,显示猜中,;若不等,显示与被猜数的大小关系, 最多允许猜n次。如果1次就猜出该数,提示“Bingo!”;如果3次以内猜到该 数,则提示“Lucky You! ” ;如果超过3次但不超过n次猜到该数,则提示“Good Guess!” ;如果超过n次都没有猜到,则提示“Game Over“;如果在到达n次之 前,用户输入了一个负数,也输出“Game Over“,并结束程序。试编写相应程序。 解答: #include int main(void) { int mynumber, n, yournumber, i; printf (^ mynumber:^); scanf (〃%d〃,femynumber); printf (“ n:〃); scanf (〃%d〃, for (i=l;i3break;} if((i==n} } return 0; } 【练习4-7】求e的值:输入1个正整数n,计算下式求出e的值(保留2位 小数),要求使用嵌套循环。试编写相应程序。 1/1!+1/ 2!+1/ 3!+・・・+l/n! 解答: #include int main(void) { int i, j, n; double e, t; printf (“ n: 〃); scanf (〃%d〃, e = 1; for (i = 1; i 0) { printf (“Enter %d marks: 〃,n); scanf (〃%d〃,/* 读入第一个成绩 */ max二mark;/*假设第一个成绩是最高分*/ for (i = l; i < n; i++ ) { scanf (〃%d〃, if (max < mark)