当前位置 : 主页 > 编程语言 > 其它开发 >

C程序设计(谭浩强)第五版课后题答案 第七章

来源:互联网 收集:自由互联 发布时间:2022-05-30
大家好,这篇文章分享了C程序设计(谭浩强)第五版第七章课后题答案,所有程序已经测试能够正常运行,如果小伙伴发现有错误的的地方,欢迎留言告诉我,我会及时改正!感谢大家
大家好,这篇文章分享了C程序设计(谭浩强)第五版第七章课后题答案,所有程序已经测试能够正常运行,如果小伙伴发现有错误的的地方,欢迎留言告诉我,我会及时改正!感谢大家的观看!!! 1、写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输人。
#include <stdio.h>
int k,l;
int main()
{
    int i,j;
    int m1(int,int);
    int m2(int,int);
    int m=i*j;
    printf("请输入两个要求的数: \n");
    scanf("%d %d",&i,&j);

    if(i<j)
    {
        int t;
        t=j;
        j=i;
        i=t;
    }

    k=m1(i,j);
    l=m2(i,j);

    printf("最大公约数是%d\n",k);
    printf("最小公倍数是%d\n",l);
    return 0;
}
int m1(int i,int j)
{
    int c;
    while(c=i%j){
        i=j;
        j=c;
    }
    return j;
}
int m2(int i,int j)
{
    return i*j/k;
}

 

2、求方程 ${ax}^2+bx+c=0$的根,用3个函数分别求当:$b^2-4ac$大于0、等于0和小于0时的根并输出结果。从主函数输入a,b,c的值。

 

#include<stdio.h>
#include<math.h>
float g1,g2,p;
void main()
{
    float a,b,c;
    float m1(float,float);
    float m2(float,float);
    float m3(float,float);
    printf("请输入方程的参数: \n");
    scanf("%f %f %f",&a,&b,&c);

    p=b*b-4*a*c;
    if(p>0)
    {
        m1(a,b);
        printf("方程的根是x1=%f,x2=%f\n",g1,g2);
    }

    if(p==0) 
    { 
        m2(a,b);
        printf("方程的根是x=%f=%f\n",g1,g2);
    }
    if(p<0) 
    {
        m3(a,b);
        printf("方程的根是x1=%f+%fi,x2=%f-%fi\n",g1,g2,g1,g2);
    }
}
float m1(float a,float b)
{
    g1=(-b+sqrt(p))/2*a;
    g2=(-b-sqrt(p))/2*a;
}
float m2(float a,float b)
{
    g1=-b/2*a;
    g2=-b/2*a;
}
float m3(float a,float b)
{
    g1=-b/2*a;
    g2=sqrt(-p)/2*a;
}

 

 

3、写一个判素数的函数,在主函数输人一个整数,输出是否为素数的信息
#include<stdio.h>
void main()
{
    int a,flag;
    int m1(int);
    printf("请输入一个数: \n");
    scanf("%d",&a);
    flag=m1(a);
    if(flag==1)
        printf("%d不是一个素数\n",a);
    else
        printf("%d是一个素数\n",a);
}
int m1(int x)
{
    int i,j=0,g=x/2;
    for(i=2;i<g;i++)  //i把1排除,直接从2开始,不要为0,不然程序崩溃
        if(x%i==0)
            j=1;
    return j;
}

 

 

4、写一个函数,使给定的一个3X3的二维整型数组转置,即行列互换。 注意:

进行数组的行列互换,其关键在于数组互换的表达式 a[i] [j] = a[j] [i];

其次在循环的时候,内层循环不能到达最大列,需要根据此时是第几行的交换来决定循环的次数,否则有可能数组行列交换之后最后又交换回原来的形状了

 

#include<stdio.h>
#define N 3
void main()
{
    int i,j,a[N][N]={0};
    void m1(int a[N][N]);
    printf("请输入一个%dx%d数组: \n",N,N);
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            scanf("%d",&a[i][j]);
    m1(a);
    
    printf("置换后的数组为:\n");    
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
            printf("%d",a[i][j]);
        printf("\n");
    }
    printf("\n");
}
void m1(int a[N][N])
{
    int i,j;
    for(i=0;i<N;i++)
        for(j=i;j<N;j++)
        {
            int t;
            t=a[i][j];
            a[i][j]=a[j][i];
            a[j][i]=t;
        }
}

 

 

5、写一个函数,使输人的一个字符串按反序存放,在主函数中输入和输出字符串。
#include<stdio.h>
#include<string.h>
#define N 100
void main()
{
    char a[N]={0};
    void m1(char a[]);
    printf("请输入一个字符串: \n");
    scanf("%s",a);
    printf("逆序前的字符串为:%s\n",a);
    m1(a);
    printf("逆序后的字符串为:%s\n",a);
}
void m1(char a[N])
{
    char t;
    int i,j;
    for(i=0,j=strlen(a)-1;i<j;i++,j--)
    {    
        t=a[i];
        a[i]=a[j];
        a[j]=t;
    }
}

 

6、写一个函数,将两个字符串连接。

 

#include <stdio.h>
#define N 80
int main()
{ 
    char a[N]={0},b[40]={0};
    void m1(char a[],char b[]);
    printf("请输入字符串1: \n");
    gets(a);
    printf("请输入字符串2: \n");
    gets(b);
    
    m1(a,b);
    printf("拼接后的字符串是%s\n",a);
    return 0;
}
void m1(char a[],char b[])
{
    int i=0,j=0,m;
    while(a[i]!='\0')
        i++;
    m=i;
    while(b[j]!='\0')
    {
        a[m]=b[j];
        m++;
        j++;
    }
}

 

 

7、写一个函数,将一个字符串中的元音字母复制到另一字符串,然后输出。
#include <stdio.h>
#define N 80
int main()
{ 
    char a[N]={0},b[40]={0};
    void m1(char a[],char b[]);
    printf("请输入字符串: \n");
    gets(a);    
    m1(a,b);
    printf("字符串里的元音字母是%s\n",b);
    return 0;
}
void m1(char a[],char b[])
{
    int i=0,j=0;
    while(a[i]!='\0')
    {
        if(a[i]=='a'||a[i]=='e'||a[i]=='i'||a[i]=='o'||a[i]=='u'||a[i]=='A'||a[i]=='E'||a[i]=='I'||a[i]=='O'||a[i]=='U')
        {
            b[j]=a[i];
            j++;
        }
        i++;
    }
    b[j]='\0';
}

 

 

8、写一个函数,输人一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格。如输人1990,应输出“1 9 9 0”。
#include <stdio.h>
#define N 4
int main()
{ 
    char a[N]={0};
    void m1(char a[]);
    printf("请输入%d位数字字符串: \n",N);
    gets(a);    
    m1(a);
    return 0;
}
void m1(char a[])
{
    int i=0,j=0;
    for(i=0;i<N;i++)
    {
        printf("%c",a[i]);
        if(i<N-1) printf("  ");
    }
    printf("\n");
}

 

 

9、编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输人字符串以及输出上述的结果。

 

#include <stdio.h>
#define N 100
int main()
{
    void m1(char c[]);
    char c[N]={0};
    printf("请输入要查询的文字: \n");
    gets(c);                //记得不能用scanf,其不会收录空格
    m1(c);
    return 0;
}
void m1(char c[])
{
    int i;
    int a=0,A=0,num=0,space=0,other=0;
    for(i=0;i<N && c[i]!='\0';i++)
    {
         if('a'<=c[i] &&c[i]<='z') a++;
         else if('A'<=c[i] &&c[i]<='Z') A++;
         else if('0'<=c[i] &&c[i]<='9') num++;
         else if(c[i]==' ') space++;
         else other++;
    }
    printf("小写字母的个数为%d\n",a);
    printf("大写字母的个数为%d\n",A);
    printf("数字的个数为%d\n",num);
    printf("空格的个数为%d\n",space);
    printf("其他字符的个数为%d\n",other);
}

 

 

10、写一个函数,输人一行字符,将此字符串中最长的单词输出。
#include <stdio.h>
#include<string.h>
#define N 100
int main()
{
    void m1(char c[]);
    char c[N]={0};
    printf("请输入要查询的字符串: \n");
    gets(c);                //记得不能用scanf,其不会收录空格
    m1(c);
    return 0;
}
void m1(char c[])
{
    int i,j=0,k=0,m,n,max=0;
    char b[N]={0};
    for(i=0;i<strlen(c);i++)
    {
         if(c[i]==' '||c[i+1]=='\0')
         {
             if(max<(k-j))
             {
                 max=(k-j);
                 m=j;
                 n=k;
             }
             k++;
             j=k;
         }
         else
             k++;
    }
    printf("字符串中最长单词为:\n");
    for(i=m;i<=n;i++)
        printf("%c",c[i]);
    printf("\n");
}

 

11、写一个函数,用“起泡法”对输人的10个字符按由小到大顺序排列。
#include <stdio.h>
#include<string.h>
#define N 100
int main()
{
    void m1(char c[]);
    char c[N]={0};
    printf("请输入要排序的字符串: \n");
    gets(c);                //记得不能用scanf,其不会收录空格
    m1(c);
    printf("排序后的字符串为%s\n",c);
    return 0;
}
void m1(char c[])
{
    int i,j,n=strlen(c);
    for(i=0;i<n-1;i++)
         for(j=0;j<n-1-i;j++)
             if(c[j+1]<c[j])
             {
                char t;
                t=c[j];
                c[j]=c[j+1];
                c[j+1]=t;
             }
}

 

 

12、用牛顿迭代法求根。方程为$ax^3+bx^2 +cx+d=0$,系数a,b,c,d的值依次为1,2,3,4,由主函数输入。求x在1附近的一个实根。求出根后由主函数输出。
#include<stdio.h>
#include<math.h>
int main()
{
    double a,b,c,d,x0=0;
    double m(double a,double b,double c,double d);
    printf("请输入所要求方程的4个系数\n");
    scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
    x0=m(a,b,c,d);
    printf("根为%lf\n",x0);
    return 0;
}
double m(double a,double b,double c,double d)
{
    double x1,x2,x3,n;
    n=1;
    do
    {
        x1=n;
        x2=a*x1*x1*x1+b*x1*x1+c*x1+d;
        x3=3*a*x1*x1+2*b*x1+c;
        n=x1-(x2/x3);
    }while(fabs(n-x1)>1e-6);
    return n;
    
}

 

 

13.用递归方法求n阶勒让德多项式的值,递归公式为

在这里插入图片描述

 

#include<stdio.h>
#include<math.h>
int main()
{
    int n,x;
    double m(int n,int x);
    printf("请输入所要求方程的2个系数\n");
    scanf("%d%d",&n,&x);
    printf("根为%.2lf\n",m(n,x));
    return 0;
}
double m(int n,int x)
{
    double sum;
    if(n==0)
        sum=1.0;
    if(n==1)
        sum=x;
    if(n>1)
        sum=((2*n-1)*x-m(n-1,x)-(n-1)*m(n-2,x))/n;
    return sum;    
}

 

14、输人10个学生5门课的成绩,分别用函数实现下列功能: ①计算每个学生的平均分; ②计算每门课的平均分; ③找出所有50个分数中最高的分数所对应的学生和课程; ④计算平均分方差: $\sigma =\frac{1}{n}\sum x_{i}^{2}-\left ( \frac{\sum x_{i}}{n} \right )^{2}$ 其中,xi为某一学生的平均分。

 

#include<stdio.h>
#define M 10
#define N 5
float aver_stu[M]={0};
int main()
{
    int i,j;
    int m,n;
    float score[M][N]={0};
    float AverStu(int m,int n,float score[M][N]);
    float AverSour(int m,int n,float score[M][N]);
    float Max(int m,int n,float score[M][N]);
    float Mean(int m,int n,float score[M][N]);
    printf("请输入学生数量和科目数量:");
    scanf("%d%d",&m,&n);
    for(i=0;i<m;i++)
    {
        printf("请输入第%d名学生的各科成绩:\n",i+1);
        for(j=0;j<n;j++)
            scanf("%f",&score[i][j]);
    }
    printf("每个学生的平均分是:\n");
    AverStu(m,n,score);
    printf("每门课的平均分是:\n");
    AverSour(m,n,score);
    printf("最高的分数对应的学生和课程是:\n");
    Max(m,n,score);
    printf("平均分方差是:");
    Mean(m,n,score);
    return 0;
}
float AverStu(int m,int n,float score[M][N])
{
    int i,j;
    float sum;
    for(i=0;i<m;i++)
    {
        sum=0.0;
        for(j=0;j<n;j++)
            sum+=score[i][j];
        aver_stu[i]=sum/n;    
    }
    for(i=0;i<m;i++)
            printf("%.2f ",aver_stu[i]);
    printf("\n");
}
float AverSour(int m,int n,float score[M][N])
{
    int i,j;
    float sum=0.0,aver;
    for(i=0;i<n;i++)
    {
        sum=0.0;
        for(j=0;j<m;j++)
            sum+=score[j][i];
        aver=sum/m;
        printf("%.2f ",aver);
    }
    printf("\n");
}
float Max(int m,int n,float score[M][N])
{
    int i,j,stu,sour;
    float max=0.0;
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
            if(max<=score[i][j])
            {
                max=score[i][j];
                stu=i+1;
                sour=j+1;
                printf("最高分是%.2f,是第%d名同学的第%d门课\n",max,stu,sour);
            }
    
}
float Mean(int m,int n,float score[M][N])
{
    int i;
    float mean=0.0,m1=0.0,m2=0.0;
    for(i=0;i<m;i++)
        m1+=aver_stu[i]*aver_stu[i];
    m1=m1/m;
    for(i=0;i<m;i++)
        m2+=aver_stu[i];
    m2=(m2/n)*(m2/n);
    mean=m1-m2;
    printf("%.2f\n",mean);
}

 

15、写几个函数:

输入10个职工的姓名和职工号;
按职工号由小到大顺序排序,姓名顺序也随之调整;
要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。

#include<stdio.h>
#include<string.h>
#define N 10
int main()
{
    int n,flag=1;
    int num[N];
    char c,name[N][10]={0};
    void in(int num[],char name[N][10]);
    void sort(int num[],char name[N][10]);
    void search(int n,int num[],char name[N][10]);
    
    in(num,name);
    sort(num,name);

    while(flag==1)
    {
        printf("请输入要查询的工号:");
        scanf("%d",&n);
        search(n,num,name);
        printf("是否继续查询(Y/N)?");
        getchar();  //消耗回车,不然回车会赋给c
        c=getchar();
        if(c=='n' || c=='N')
            flag=0;
    }

    return 0;
}
void in(int num[],char name[N][10])
{
    int i;
    for(i=0;i<N;i++)
    {
        printf("请输入名字:\n");
        gets(name[i]);
        printf("请输入工号:\n");
        scanf("%d",&num[i]);
        getchar();    //缓存输入工号后的回车,不然下次循环会使gets()收到回车,直接结束本次gets()
    }
}
void sort(int num[],char name[N][10])
{
    int i,min=num[0],t;
    char t1[10]={0};
    for(i=0;i<N;i++)
        if(min>num[i])
        {
            t=min;
            min=num[i];
            num[i]=t;
            strcpy(t1,name[i]);
            strcpy(name[i],name[min]);
            strcpy(name[min],t1);
        }
    printf("排序后的结果为:\n");
    for(i=0;i<N;i++)
        printf("%5d%10s\n",num[i],name[i]);
}
void search(int n,int num[N],char name[N][10])
{
    int left=0,right=N-1,mid,flag=0;
    while (left<right)
    {
        mid=(left+right)/2;
        if(n==num[mid])
        {
            flag=mid;
            break;
        }
        else if(n<num[mid])
            right=mid;
        else if(n>num[mid])
            left=mid+1;
    }
    printf("此人的名字是:%s\n",name[flag]);
}

 

16、写一个函数,输入一个十六进制数,输出相应的十进制数。
#include <stdio.h>
int main()
{
    int n;
    char a[10]={0};
    int trans(char a[]);
    printf("请输入字符串: \n");
    scanf("%s",a);
    n=trans(a);
    printf("0x%s=%d\n",a,n);
    return 0;
}
int trans(char a[])
{
    int i,j=0;
    for(i=0;a[i]!='\0';i++)
    {
        if(a[i]>='0' && a[i]<='9')
            j=j*16+a[i]-'0';
        if(a[i]>='a' && a[i]<='f')
            j=j*16+a[i]-'a'+10;
        if(a[i]>='A' && a[i]<='F')
            j=j*16+a[i]-'A'+10;
    }
    return j;
}

 

17、用递归法将一个整数n转换成字符串。例如,输人483,应输出字符串”483”。n的位数不确定,可以是任意位数的整数。
#include <stdio.h>
int main()
{
    int n;
    void trans(int);
    printf("请输入数字: \n");
    scanf("%d",&n);
    if(n<0)
    {
        putchar('-');    //输出负号字符,putchar()输出字符,负号要加单引号表示是个字符    
        putchar(' ');
        n=-n;            //负数翻转,然后把正数在函数中运行
    }
    trans(n);
    printf("\n");
    return 0;
}
void trans(int n)
{
    int i;
    if((i=n/10)!=0)   //判断i是否取到个数数了,若i不是个位数,则在递归中每次除以10
        trans(i);        //i不是个位数时,则递归,直至i变为个位数,然后执行putchar,函数结束,开始执行i为2位数时的putchar,依次按层执行
    putchar(n%10 + '0'); //最后内层都执行完后n取除10的余数即个位数输出数字字符,

}

 

18、给出年、月、日,计算该日是该年的第几天。
#include <stdio.h>
int main()
{
    int year,month,day,n;
    int f(int,int,int);
    printf("请输入年月日: \n");
    scanf("%d%d%d",&year,&month,&day);

    n=f(year,month,day);

    printf("%d月%d日是%d年的第%d天\n",month,day,year,n);
    return 0;
}
int f(int year,int month,int day)
{
    int day_tab[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    int i,sum=0;
    if(year%4==0 && year%100!=0 || year%400==0)
        day_tab[1]=29;
    for(i=1;i<month;i++)
        sum+=day_tab[i];
    sum+=day;
    return sum;
}

 

网友评论