第5章 循环结构程序设计 习题

作者在 2011-10-26 13:32:05 发布以下内容

5.1 请画出例5.6中给出的3个程序段的流程图

/*
时间:2011年10月21日10:54:29
*/
# include <stdio.h>

int main()
{
    int i,j,n=0;
    for(i=1;i<=4;i++)
    {
        for(j=1;j<=5;j++,n++)
        {
            if(0==n%5)
            {
                printf("\n");
            }
            printf("%d\t",i*j);
        }
    }
    printf("\n");
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————

1       2       3       4       5
2       4       6       8       10
3       6       9       12      15
4       8       12      16      20
Press any key to continue
————————————
*/

 

 

/*
时间:2011年10月21日11:44:06
*/
# include <stdio.h>

int main()
{
    int i,j,n=0;
    for(i=1;i<=4;i++)
    {
        for(j=1;j<=5;j++,n++)
        {
            if(0==n%5)
            {
                printf("\n");
            }
            if(3==i && 1==j)
            {
                break;
            }
            printf("%d\t",i*j);
        }
    }
    printf("\n");
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————

1       2       3       4       5
2       4       6       8       10

4       8       12      16      20
Press any key to continue
————————————
*/

 

 

/*
时间:2011年10月21日11:44:06
*/
# include <stdio.h>

int main()
{
    int i,j,n=0;
    for(i=1;i<=4;i++)
    {
        for(j=1;j<=5;j++,n++)
        {
            if(0==n%5)
            {
                printf("\n");
            }
            if(3==i && 1==j)
            {
                continue;
            }
            printf("%d\t",i*j);
        }
    }
    printf("\n");
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————

1       2       3       4       5
2       4       6       8       10
6       9       12      15
4       8       12      16      20
Press any key to continue
————————————
*/

 

 

5.2 请补充例5.7程序,分别统计当“fabs(t)>=1e-6和“fabs(t)>=1e-8“时执行循环体的次数

/*
时间:2011年10月24日11:36:47
题目:习题5-2
*/
# include <stdio.h>
# include <math.h>

int main()
{
    int sign=1;
    double pi=0.0,term;
    int n=0;
    
    while(fabs(term)>=1e-8)
    {
        ++n;
        term = 1.0/(2*n-1)*sign;
        pi += term;
        sign = -sign;
    }
    pi *= 4;
    printf("pi的近似值是%lf\n",pi);
    printf("循环体循环了%d次\n",n);
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
fabs(term)>=1e-6
pi的近似值是3.141595
循环体循环了500001次
Press any key to continue
-------------------------
fabs(term)>=1e-8
pi的近似值是3.141593
循环体循环了50000001次
Press any key to continue
————————————
*/

 

5.3 输入两个正整数mn,求其最大公约数和最小公倍数

/*
时间:2011年10月24日12:13:07
题目:习题5-3 输入两个正整数m和n,求其最大公约数和最小公倍数
备注:最小公约数(Least Common Multiple)简写为LCM;最大公约数(greatest common divisor,简写为gcd
*/
# include <stdio.h>

int lcm (int x,int y);
int gcd (int x,int y);

int main()
{
    int a,b;
    int t;
    
    printf("输入两个正整数:");
    scanf("%d%d",&a,&b);
    
    if(a>b)
    {
        t=a;
        a=b;
        b=t;
    }
    
    printf("最小公倍数是%d\n",lcm(a,b));
    printf("最大公约数是%d\n",gcd(a,b));
    
    return 0;
}

//求最小公倍数
int lcm (int x,int y)
{
    int n=1;
    int lcm;
    for(lcm=x;0!=lcm%y;++n)
    {
        lcm = n*x;
    }
    return (lcm);
}
//求最大公约数
int gcd (int x,int y)
{
    
    int t;
    while(x!=0)
    {
        t = y%x;
        y = x;
        x = t;
    }
    return(y);
}
/*
在VC++6.0中的输出结果为:
————————————
输入两个正整数:12 18
最小公倍数是36
最大公约数是6
Press any key to continue
————————————
*/

 

5.4 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数

/*
时间:2011年10月24日13:48:26
题目:习题5-4 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数
*/
# include <stdio.h>

int main()
{
    int space=0;
    int number=0;
    int letters=0;
    int other=0;
    char c;
    printf("输入一串字符:");
    
    
    while((c=getchar())!='\n')
    {
        if((65<=c && c<=90) || (97<=c && c<=122))
        {
            ++letters;
        }
        else if(32==c)
        {
            ++space;
        }
        else if(48<=c && c<=57)
        {
            ++number;
        }
        else
        {
            ++other;
        }
    }
    
    printf("空格有%d个\n",space);
    printf("数字有%d个\n",number);
    printf("字母有%d个\n",letters);
    printf("其他字符有%d个\n",other);
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入一串字符:Bccn 2011.11.24
空格有1个
数字有8个
字母有4个
其他字符有2个
Press any key to continue
————————————
*/

 

5.5 Sn=a+aa+aaa+。。。aaaaa(na,)其中a是一个数字,n表示a的位数,例如:2+22+222+2222+22222

/*
时间:2011年10月24日14:09:19
题目:习题5-5 求Sn=a+aa+aaa+。。。aaaaa(n个a,)其中a是一个数字,n表示a的位数
*/
# include <stdio.h>

int main()
{
    int a,n;
    int sn=0;
    int term=0,i;
    
    printf("输入a和n的值:\n");
    printf("a=");
    scanf("%d",&a);
    printf("n=");
    scanf("%d",&n);
    
    for(i=1;i<=n; ++i)
    {
        term = 10*term + a;
        sn += term;
    }
    
    printf("当a=%d,n=%d时,sn=%d\n",a,n,sn);
    
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入a和n的值:
a=2
n=5
当a=2,n=5时,sn=24690
Press any key to continue
————————————
*/

 

5.6 1+2+3+…..+20!

/*
时间:2011年10月24日14:39:40
题目:求1!+2!+3!+…..+20!
*/
# include <stdio.h>

double factoria (int x);

int main()
{
    int max=20;
    int i;
    double sn=0;    //注意这里用double型
    
    for (i=1; i<=max; ++i)
    {
        sn += factoria(i);
    }
    printf("sn=%22.15e\n",sn);
    return 0;
}

double factoria (int x)
{
    int i;
    double factoria=1;
    
    for(i=1; i<=x; ++i)
    {
        factoria *= i;
    }
    return (factoria);
}
/*
在VC++6.0中的输出结果为:
————————————
sn=2.561327494111820e+018
Press any key to continue
————————————
*/

 

5.7

/*
时间:2011年10月28日13:12:51
题目:习题5-7
备注:原来编的效率不高,看坛友ppfly的代码后修改。
参考:
http://bbs.bccn.net/thread-353512-1-1.html
*/
# include <stdio.h>

int main ()
{
    int i;
    double sum1=0,sum2=0,sum3=0;
    
    for(i=1; i<=100; ++i)
    {
        sum1 += i;
        if(i<=50)
        {
            sum2 += i*i;
        }
        if(i<=10)
        {
            sum3 += 1.0/i;
        }
        
    }
    printf("sn=%lf\n",sum1+sum2+sum3);
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
sn=47977.928968
Press any key to continue
————————————
*/

 

5.8 输出所有的水仙花数

/*
时间:2011年10月24日17:00:12
题目:习题5.8 输出所有的水仙花数(3位)
*/
# include <stdio.h>
# include <math.h>

bool IsNarcissus (int number);
int n=3;   //这里只求3位数的水仙花数

int main()
{
    int i;
    for(i=pow(10,n-1); i<pow(10,n); ++i)
    {
        if (IsNarcissus (i))
        {
            printf("%d \n",i);
        }    
    }
    return 0;
}

bool IsNarcissus (int number)
{
    int sum=0;
    int x=number;
    while(x!=0)
    {
        sum += pow((x%10),n);
        x /= 10;
    }
    if (sum == number)
    {
        return true;
    }
    else
    {
        return false;
    }
}
/*
在VC++6.0中的输出结果为:
————————————
153
370
371
407
Press any key to continue
————————————
*/

 

5.9 编程序找出1000以内所有完数

/*
时间:2011年10月25日14:43:51
题目:习题5.9 编程序找出1000以内所有完数
备注:要求输出格式为6 its factors are 1,2,3
*/
# include <stdio.h>

bool IsPerfectNumber (int val,int * pArr);

int main()
{
    int i,k=0;
    int a[100]={0};
    for(i=2;i<1000;++i)
    {
        if(IsPerfectNumber(i,a))
        {
            printf("%d its factors are 1",i);
            for(k=0; k<7; ++k)
            {
                if(a[k]!=0)
                {
                    printf(",%d",a[k]);
                }
            }
            printf("\n");
        }
    }
    return 0;
}

bool IsPerfectNumber (int val,int * pArr)
{
    int i,j,k=0;
    int sum = 1;
    for(j=2;j<=val;++j)
    {
        if(j==val || val%j!=0)
        {
            continue;
        }
        else
        {
            sum += j;
            *(pArr+k)=j;
            ++k;
        }
    }
    if (sum == val)
    {
        return true;
    }
    else
    {
        for(i=0; i<=k; ++i)
        {
            *(pArr+i)=0;
        }
        return false;
    }
}
/*
在VC++6.0中的输出结果为:
————————————
6 its factors are 1,2,3
28 its factors are 1,2,4,7,14
496 its factors are 1,2,4,8,16,31,62,124
Press any key to continue
————————————
*/

 

5.10 有一个分数数列 2/1,3/2,5/3,8/5,13/8,21/13…求前20项的和

/*
时间:2011年10月25日15:09:21
题目:习题5.10 求分数数列前20项和
备注:分数数列为2/1,3/2,5/3,8/5,13/8...
*/
# include <stdio.h>

int main()
{
    int i,n=20;
    double a=2,b=1,sum=0;
    double t;
    
    for(i=1; i<=n; ++i)
    {
        sum += a/b;
        t = a;
        a += b;
        b = t;
    }
        printf("前20项和为%lf\n",sum);
    
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
前20项和为32.660261
Press any key to continue
————————————
*/

 

5.11 有一个球从100高落下,每次反弹一半,求第10次落地时经过多长距离,第10次反弹多高

/*
时间:2011年10月25日15:30:44
题目:习题5.11 有一个球从100米高落下,每次反弹一半,求第10次落地时经过多长距离,第10次反弹多高
*/
# include <stdio.h>

int main()
{
    double sum = 100.0;
    double high = sum/2;
    int n;
    
    for(n=2; n<=10; ++n)
    {
        sum += 2*high;
        high /= 2;
    }
    printf("第10次落地时小球经过%lf米,第10次反弹的高度是%lf米\n",sum,high);
    
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
第10次落地时小球经过299.609375米,第10次反弹的高度是0.097656米
Press any key to continue
————————————
*/

 

5.12猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了

一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天

剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个

桃子。

/*
时间:2011年10月25日15:44:20
题目:习题5.12 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了
      一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天
      剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个桃子。
*/
# include<stdio.h>

int main()
{
    int peach=1;
    int day;
    
    for(day=9; day>0; --day)
    {
        peach =2*(peach+1);
    }
    printf("第1天猴子摘了%d个桃子\n",peach);
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
第1天猴子摘了1534个桃子
Press any key to continue
————————————
*/

 

5.13 用迭代法求平方根

/*
时间:2011年10月25日16:08:06
题目:习题5.13 用迭代法求平方根
公式:Xn+1=(Xn+a/Xn)/2
要求:两次求出的x的差的绝对值小于1e-5
*/
# include <stdio.h>
# include <math.h>

int main()
{
    double a;
    double x0,x1=1;
    
    printf("输入a的值:");
    scanf("%lf",&a);
    
    do
    {
        x0 = x1;
        x1=(x0+a/x0)/2;
    }
    while(fabs(x1-x0)>=1e-5);
    printf("%lf的平方根是%lf\n",a,x1);
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入a的值:2
2.000000的平方根是1.414214
Press any key to continue
————————————
*/

 

5.14 用牛顿迭代法求下面方程在1.5附近的根 2X^3-4X^2+3X-6=0

/*
时间:2011年10月26日8:55:22
题目:用牛顿迭代法求下面方程在1.5附近的根 2X^3-4X^2+3X-6=0
*/
# include <stdio.h>
# include <math.h>

int main()
{
    double x0,x1=1.5;
    double fx,fd;

    do
    {
    x0=x1;
    fx=((2*x0-4)*x0+3)*x0-6;
    fd=(6*x0-8)*x0+3;
    x1=x0-fx/fd;
    }
    while(fabs(x1-x0)>=1e-5);

    printf("方程在1.5附近的根是%lf\n",x1);
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
方程在1.5附近的根是2.000000
Press any key to continue
————————————
*/

 

5.15 用二分法求下面方程在(-10

《C程序设计》学习 | 阅读 15187 次
文章评论,共3条
edwardflee(作者)
2011-10-27 08:36
1
<div class="quote"><span class="q"><b>SG9795</b>: 你好,我也是学C语言的,我今年刚进入大学,刚才我看了你的题,真的很好,我的QQ:979587494,麻烦你把你这篇《第5章 循环结构程序设计 习题》给我发过来,好吗</span></div>抱歉,没有备份,有需要直接拷贝走就可以啦。不过这是我学习的时候自己练习编的,不是标准答案。贴到这里是为了让高手看到后帮我指出里面错误的。
runningfly
2011-10-29 10:11
2
我也刚学c语言,太受益了
好学青年
2011-11-08 22:28
3
游客请输入验证码