4章 循环结构
【练习 4-1】在例 4-1 程序中,如果对 item 赋初值 0,运行结果是什么?为 什么?如果将精度改为 10-3,运行结果有变化吗?为什么?
解答:
如果对item赋初值0,则程序运行结果是pi=0,因为item为0时不满 足 while 循环的执行条件,即不执行循环,故 pi 值为 0。如果将精度改为 10-3,运行结果会有变化,因为精度改变意味着 while 循环的条件改变,精度 变大使得while循环次数减少,必然影响到n的值。
【练习 4-2】 运行例 4-2程序时,如果将最后一个输入数据改为-2,运行结 果有变化吗?如果第一个输入数据是 -1,运行结果是什么?为什么? 解答:
如果将最后一个输入数据改为-2,运行结果没有变化,因为最后一个负数是 一结束标志,不进行统计,故任意一个负数都可以。如果第一个输入数据是-1, 运行结果是:Grade averageis 0,因为第一个输入就是-1,则while循环条件 不成立,不执行循环体。
【练习4-3】序列求和(1-1/4+1/7-1/10+1/13-1/16+…):输入一个正实数eps, 计算序列1-1/4+1/7-1/10+1/13-1/16+…的值,精确到最后一项的绝对值小于 eps (保留6位小数)。试编写相应程序。
解答:
#include <stdio.h>
#include <math.h>
int main(void)
{
int denominator, flag;
double item, s,eps;
printf(“Input eps:”);
scanf(“%lf”,&eps);
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=1; "。
【练习4-5】例4-4程序中的第915行可以用下列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 的正整数,分别是被猜数 mynumber和允许猜测的最大次数n,再输入你所猜的数yournumber,与被猜数 mynumber进行比较,若相等,显示猜中,;若不等,显示与被猜数的大小关系, 最多允许猜n次。如果1次就猜出该数,提示“Bingo!”;如果3次以内猜到该 数,则提示“Lucky You!”;如果超过3次但不超过n次猜到该数,则提示“Good Guess!”;如果超过n次都没有猜到,则提示“Game Over";如果在到达n次之 前,用户输入了一个负数,也输出“Game Over”,并结束程序。试编写相应程序。 解答:
#include<stdio.h> int main(void) {
int mynumber,n,yournumber,i;
printf("Input mynumber:");
scanf("%d",&mynumber);
printf("Input n:");
scanf("%d",&n);
for(i=1;i<=n;i++){
printf("Input yournumber:");
scanf("%d",&yournumber);
if(i==1&&yournumber==mynumber){
printf("Bingo!");break; }
if((i==2||i==3)&&yournumber==mynumber){
printf("Lucky you!");break;}
if((i>3&&i<=n)&&yournumber==mynumber){
printf("Good Guess!");break;}
if((i==n&&mynumber!=yournumber)||mynumber<0||yournumber<0){ printf("Game Over!");break;}
}
return 0;
}
【练习4-7】求e的值:输入1个正整数n,计算下式求出e的值(保留2位 小数),要求使用嵌套循环。试编写相应程序。
e =1 + 1/1!+1/ 2!+1/ 3!+…+1/n!
解答:
#include<stdio.h>
int main(void)
{
int i, j, n;
double e, t;
printf("Input n:");
scanf("%d", &n);
e = 1;
for (i = 1; i <= n; i++){
t=1;
for(j=1;j<=i;j++)
t = t * j;
e = e + 1.0/t;
}
printf("e = %0.2f\n", e);
return 0;
}
【练习4-8】运行例4-8的源程序1时,如果先输入0,即输入数据个数n=0, 表示不再输入任何成绩,运行结果是什么?如何修改程序以应对这种情况? 解答:
当输入数据个数n = 0时,由于在for循环外首先得输入一个成绩,故程 序仍将等待输入第一个人的成绩,这与输入个数n = 0矛盾,可修改如下: #include <stdio.h>
int main(void) {
int i, mark, max, n;
printf("Enter n:");
scanf ("%d", &n);
if (n>0) {
printf("Enter %d marks: ", n);
scanf ("%d", &mark);    /* 读入第一个成绩 */
max = mark;    /* 假设第一个成绩是最高分 */
for (i = 1; i < n; i++ ){
scanf ("%d", &mark);
if (max < mark) max = mark;
}
printf("Max = %d\n", max);
}
return 0;
}
【练习 4-9】运行例 4-8 的源程序 2时,如果输入的第一个数就是负数,表示 不再输入任何成绩,运行结果是什么?如何修改程序以应对这种情况? 解答:
当输入的第一个数就是负数时,将不执行 while 循环,程序运行结果就是 输出所输入的负数。
【练习4-10】出最小的值:输入一个正整数n,再输入n个整数,输出最小 值。试编写相应程序。continue语句执行过程
解答:
#include <stdio.h>
int main(void)
{
int i , min, n, x;
printf("inputr n: ");
scanf("%d", &n);
printf("input numbers: ");
scanf("%d", &x);
min = x;
for (i = 1; i < n; i++){
scanf("%d", &x);
if (min > x) min = x;
}
printf("min = %d\n", min);
return 0;
}
【练习4-11】统计素数并求和:输入2个正整数m和n (1WmWnW500),统计 并输出m和n之间素数的个数以及这些素数的和。素数就是只能被1和自身整 除的正整数,1 不是素数,2 是素数。试编写相应程序。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。