C程式設計(第五版)譚浩強 著——第五章 回圈結構程式設計 書後題答案

2020-08-08 20:33:39

1.請畫出例5.6中給出的3個程式段的流程圖。
在这里插入图片描述
2.請補充例5.7程式,分別統計當「fabs(t)>=1e-6」和「fabs(t)>=1e-8」時執行回圈體的次數。

#include<stdio.h>
#include<math.h>
void main()
{
    int sign=1;//符號
    int count=0;//計數
    double pi=0.0,n=1.0,term=1.0;//pi多項式,n分母,term當前項
    while(fabs(term)>=1e-6)//fabs(term)>=1e-8
    {
        pi+=term;
        n+=2;
        sign=-sign;
        term=sign/n;
        count++;
    }
    pi*=4;
    printf("pi=%10.6f count=%d\n",pi,count);
    //printf("pi=%10.8f count=%d\n",pi,count);
}

在这里插入图片描述
在这里插入图片描述
3.輸入兩個正整數m和n,求其最大公約數和最小公倍數。

#include<stdio.h>
void main()
{
    int m,n,t,p;//t,p中間變數
    printf("請輸入兩個正整數m和n:");
    scanf("%d%d",&m,&n);
    p=m*n;
    while(n!=0)
    {
        t=m%n;
        m=n;
        n=t;
    }
    printf("最大公約數=%d\n",m);
    printf("最小公倍數=%d\n",p/m);
}

在这里插入图片描述
4.輸入一行字元,分別統計出其中英文字母、空格、數位和其它字元的個數。

#include<stdio.h>
void main()
{
    int c1=0,c2=0,c3=0,c4=0;//分別統計四種字元的數量
    printf("請輸入字串:");
    for(char a;(a=getchar())!='\n';)//加括號,關係運算符的優先順序大於賦值運算子
    {
        if((a>='A'&&a<='Z')||(a>='a'&&a<='z'))
            c1++;
        else if(a==' ')
            c2++;
        else if(a>='0'&&a<='9')
            c3++;
        else
            c4++;
    }
    printf("英文字母的個數=%d\n空格的個數=%d\n數位的個數=%d\n其他字元的個數=%d\n",c1,c2,c3,c4);
}

在这里插入图片描述
5.求Sn=a+aa+aaa+…+aa…a之值,其中a是一個數字,n表示a的位數,n由鍵盤輸入。例如:2+22+222+2222+22222(此時n=5)

#include<stdio.h>
void main()
{
    int a,n,t=0,S=0;//中間量t
    printf("Please input a&n:");
    scanf("%d%d",&a,&n);
    for(int i=0;i<n;i++)
    {
        t=t*10+a;
        S+=t;
    }
    printf("Sn=%d\n",S);
}

在这里插入图片描述
6.求1!+2!+3!+4!+…+20!。

#include<stdio.h>
void main()
{
    float n=1,sum=0;//定義成int型產生溢位
    for(int i=1;i<=20;i++)
    {
        n*=i;
        sum+=n;
    }
    printf("sum=%f\n",sum);
}

在这里插入图片描述
7.求(1+2+…+100)+(1^ 2+2^ 2+…+50^ 2)+(1/1+1/2+…+1/10)。

#include<stdio.h>
void main()
{
    int n2,s1=0,s2=0;
    float n3,s3=0.0,s;
    for(int i=1;i<=100;i++)
    {
        s1+=i;
        if(i<=50)
        {
            n2=i*i;
            s2+=n2;
        }
        if(i<=10)
        {
            n3=1.0/(float)i;
            s3+=n3;
        }
    }
    s=s3+(float)s2+(float)s1;
    printf("s=%f\n",s);
}

在这里插入图片描述
8.輸出所有的「水仙花數」,所謂「水仙花數」是指一個3位數,其各位數位立方和等於該數本身。例如,153是水仙花數。

#include<stdio.h>
void main()
{
    int a,b,c;//分別存放個位、十位、百位
    for(int i=100;i<=999;i++)
    {
        a=i%10;
        b=(i%100)/10;
        c=i/100;
        if(a*a*a+b*b*b+c*c*c==i)
            printf("%d ",i);
    }
}

在这里插入图片描述
9.一個數如果恰好等於它的因子之和,這個數就稱爲「完數」。例如,6的因子爲1,2,3,而6=1+2+3,因此6是「完數」。程式設計找出1000之內的所有完數,並按下面 下麪格式輸出其因子:
6 its factors are 1,2,3

#include<stdio.h>
void main()
{
    for(int i=2;i<=1000;i++)
    {
        int sum=1;//因子的和
        for(int j=2;j<=i/2;j++)
        {
            if(i%j==0)
                sum+=j;
        }
        if(i==sum)
        {
            printf("%d its factors are 1",i);
            for(int j=2;j<=i/2;j++)
            {
                if(i%j==0)
                    printf(",%d",j);
            }
            printf("\n");
        }
    }
}

在这里插入图片描述
10.有一個分數序列,求出這個數列的前20項之和。
2/1,3/2,5/3,8/5,13/8,21/13,…

#include<stdio.h>
void main()
{
    float term,sum=0.0;//term每項,sum和
    int f1=1,f2=2,t;
    for(int i=0;i<20;i++)
    {
        term=(float)f2/(float)f1;
        sum+=term;
        t=f1;//1、2
        f1=f2;//2、3
        f2=t+f2;//3、5
    }
    printf("sum=%f\n",sum);
}

在这里插入图片描述
11.一個球從100m高度落下,每次落地後反彈回原高度的一半,再落下,再反彈。求它在第10次落地時共經過多少米,第10次反彈多高。

#include<stdio.h>
void main()
{
    float h=100.0,s=100.0;//h代表高度 s代表路程
    for(int i=0;i<10;i++)
    {
        if(i>=1)
            s+=2*h;
        h/=2;
    }
    printf("第10次落地時共經過%f米\n第10次反彈高度爲%f米\n",s,h);
}

在这里插入图片描述
12. 猴子吃桃問題。猴子第1天摘下若幹個桃子,當即吃了一半,還不過癮,又多吃了一個。第2天早上又將剩下的桃子吃掉一半,又多吃了一個。以後每天早上都吃了前一天剩下的一半零一個。到第10天早上再想吃時,就只剩一個桃子了。求第一天共摘多少個桃子。

#include<stdio.h>
void main()
{
    int n=1;//表示桃子的總數
    for(int i=0;i<9;i++)
    {
        n=(n+1)*2;
    }
    printf("第一天一共摘了%d個桃子\n",n);
}

在这里插入图片描述
13.用迭代法求x=根號a。求平方根的迭代公式爲
Xn+1=1/2(Xn+a/Xn)
要求前後兩次求出的x的差的絕對值小於10^(-5)

#include<stdio.h>
#include<math.h>
void main()
{
    double a,x0,x1;
    printf("Please input a:");
    scanf("%lf",&a);
    x0=a/2;
    x1=(x0+a/x0)/2;
    while(fabs(x1-x0)>=1e-5)
    {
        x0=x1;
        x1=(x0+a/x0)/2;
    }
    printf("%lf的平方根爲%lf\n",a,x1);
}

在这里插入图片描述

14.用牛頓迭代法求下面 下麪方程在1.5附近的根:
2x^3 - 4x^2 + 3x - 6 = 0

#include<stdio.h>
#include<math.h>
void main()
{
    double x0,x1,f,f1;
    x0=1.5;
    f=((2*x0-4)*x0+3)*x0-6;
    f1=(6*x0-8)*x0+3;
    x1=x0-f/f1;
    while(fabs(x1-x0)>=1e-5)
    {
        x0=x1;
        f=((2*x0-4)*x0+3)*x0-6;
        f1=(6*x0-8)*x0+3;
        x1=x0-f/f1;
    }
    printf("1.5附近的實根爲%lf\n",x1);
}

在这里插入图片描述

15.用二分法求下面 下麪方程在(-10,10)的根:
2x^3 - 4x^2 + 3x - 6 = 0

#include<stdio.h>
#include<math.h>
void main()
{
    double x0,x1,x2,f0,f1,f2;
    do{
        printf("enter x1&x2:");
        scanf("%lf%lf",&x1,&x2);
        f1=((2*x1-4)*x1+3)*x1-6;
        f2=((2*x2-4)*x2+3)*x2-6;
    }while(f1*f2>0);
    do{
        x0=(x1+x2)/2;
        f0=((2*x0-4)*x0+3)*x0-6;
        if(f0*f1<0)
        {
            x2=x0;
            f2=f0;
        }
        else
        {
            x1=x0;
            f1=f0;
        }
    }while(fabs(f0)>=1e-5);
    printf("%lf",x0);
}

在这里插入图片描述

16.輸出以下圖案:

   *
  ***
 *****
*******
 *****
  ***
   *
#include<stdio.h>
void main()
{
    int i,j,k;
    for(i=0;i<4;i++)
    {
        for(j=0;j<=2-i;j++)
        {
            printf(" ");
        }
        for(k=0;k<2*i+1;k++)
        {
            printf("*");
        }
        printf("\n");
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<i+1;j++)
        {
            printf(" ");
        }
        for(k=0;k<5-2*i;k++)
        {
            printf("*");
        }
        printf("\n");
    }
}

在这里插入图片描述

17。兩個乒乓球隊進行比賽,各出3人。甲隊爲A,B,C3人,乙隊爲X,Y,Z3人。以抽籤決定比賽名單。有人向隊員打聽比賽的名單,A說他不和X比,C說他不和X,Z比,請程式設計序找出3對賽手的名單。

#include<stdio.h>
void main()
{
    for(char i='X';i<='Z';i++)
    {
        for(char j='X';j<='Z';j++)
        {
            if(i!=j)
            {
                for(char k='X';k<='Z';k++)
                {
                    if(i!=k&&j!=k)
                    {
                        if(i!='X'&&k!='X'&&k!='Z')
                        {
                            printf("A--%c\nB--%c\nC--%c\n",i,j,k);
                        }
                    }
                }
            }
        }
    }
}

在这里插入图片描述