C语言程序设计第五版谭浩强 第七章答案

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/gjggj/article/details/92415602

C语言程序设计第五版谭浩强著 第七章答案

1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。
如有问题欢迎下方留言评论

  #include<stdio.h>
    void main(void)
    {
        int maxgy(int x,int y);
        int mingb(int x,int y);
        int a,b;
        printf("输入两个整数:\n");
        scanf("%d%d",&a,&b);
        printf("最大公约数为:%d\n",maxgy(a,b));
        printf("最小公倍数为:%d\n",mingb(a,b));
     } 
     int maxgy(int x,int y)
        {
            int z; 
            while(y!=0)
            {
                z=x%y;
                x=y;
                y=z;
            }
            return x;
        }
        int mingb(int x,int y)
        {
            int z;
            z=x*y/maxgy(x,y);
            return z;
        }

C语言程序设计第五版谭浩强著 第七章答案
2.求方程式ax2+bx+c=0的根,用3个函数分别求当:b2-4ac大于0,等于0,和小于0时的根并输出结果。从主函数输入a,b,c的值。

#include<stdio.h>
#include<math.h>
#define disc b*b-4*a*c
double x1,x2;
void m(float a,float b,float c)
{
    printf("方程式有两个不相等的实根:\n");
    x1=(-b+sqrt(disc))/(2*a);
    x2=(-b-sqrt(disc))/(2*a);
    printf("方程式的根是:%.2lf\t%.2lf",x1,x2);
}
void n(float a,float b,float c)
{
    printf("方程式有两个相等的实根:\n");
    x1=x2=(-b)/(2*a);
    printf("方程式的根是:%.2lf\t%.2lf",x1,x2);
}
void f(float a,float b,float c)
{
    printf("方程式没有实根");
}
main()
{
    float a,b,c;
    printf("请输入a,b,c的值:\n");
    scanf("%f%f%f",&a,&b,&c);
    if(disc>0) m(a,b,c);
    else if(disc==0) n(a,b,c);
    else f(a,b,c);
}

C语言程序设计谭浩强著
3.写一个判断素数的函数,在主函数输入一个整数,输出是否为素数的信息。

#include<stdio.h>
#include<math.h>
int sushu(int a)
{
    int i,k=sqrt(a);
    for(i=2;i<=k+1;i++)
    if(a%i==0)break;
    if(i<k+1) return 0;
    else return 1;
}
void main()
{
    int a,b;
    printf("请输入一个整数:\n");
    scanf("%d",&a);
    b=sushu(a);
    if(b) printf("%d是一个素数\n",a);
    else printf("%d不是一个素数\n",a);
}

4.写一函数,使给定一个3*3的二维整型数组转置,即行列互换。

#include<stdio.h>
int exchange(b)
int b[3][3];
{
    int i,j,t;
    for(i=0;i<3;i++)
    for(j=0;j>=i&&j<3-i;j++)
    {
        t=b[i][j];b[i][j]=b[j][i];b[j][i]=t;
    }
}
main()
{
    int i,j,a[3][3];
    printf("请输入3*3整形数组:\n");
    for(i=0;i<3;i++)
    for(j=0;j<3;j++)
    scanf("%d",&a[i][j]);
    printf("原数组:\n");
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        printf("%5d",a[i][j]);
        printf("\n");
    }
    printf("\n");
    exchange(a);
    printf("行列互换:\n");
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        printf("%5d",a[i][j]);
        printf("\n");
    }
}

5.写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。

include<stdio.h>
#include<string.h>
char fanxu(b)
char b[100];
{
    int i,j,t;
    char c[100];strcpy(c,b);
    t=strlen(b);
    for(i=0,j=t-1;j>-1;i++,j--)
    b[i]=c[j];

}
main()
{
    char a[100],i;
    gets(a);
    fanxu(a);
    puts(a);
}

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

#include<stdio.h>
void lianjie(char a[],char b[])
{
    char c[20];
    int i,j;
    for(i=0;a[i]!='\0';i++) c[i]=a[i];
    for(j=0;b[j]!='\0';j++) c[i+j]=b[j];
        c[i+j+1]='\0';
    printf("连接后:\n");
    puts(c);
}
main()
{
    char a[10],b[10];
    printf("输入两个字符串:\n");
    gets(a);
    gets(b);
    lianjie(a,b);
}

7.写一函数,将一个字符串中的元音字母复制到另一字符串,然后输出。

    #include<stdio.h>
    char copy(char c[],char d[])
    {
        int i,j=0;
        for (i=0;c[i]!='\0';i++)
            if(c[i]==97||c[i]==101||c[i]==105||
            c[i]==111||c[i]==117||c[i]==65||
            c[i]==69||c[i]==73||c[i]==85) 
        {
            d[j]=c[i];
            j++;
        }
    }
  void  main() 
    {
        char a[10],b[10];
        printf("输入一个字符串:\n");
        gets(a);
        copy(a,b);
        printf("输出元音字母的字符串:\n");
        puts(b);
    }

C语言程序设计第五版谭浩强著 第七章答案
8.写一个函数,输入一个4位数字,要求输出这数字字符,但每两个数字间空一个空格。如 输入1990,应输出“1 9 9 0”.

#include<stdio.h>
void f(int n)
{
    int a,b,c,d;
    a=n/1000;//千位 
    b=(n-a*1000)/100;//百位 
    c=(n-a*1000-b*100)/10;//十位 
    d=n-a*1000-b*100-c*10;//个位
    printf("输出4位数数字字符:\n");
    printf("%d %d %d %d\n",a,b,c,d); 
}
main()
{
    int n;
    printf("输入一个4位数字:\n");
    scanf("%d",&n);
    f(n);
}

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

#include<string.h>
#include<stdio.h>
char f(a1,b1)
char a1[100];
int b1[4];
{
    int j;
    for (j=0;a1[j]!='\0';j++) //字符串中字符不为空字符时继续执行下一位
    {
    if(a1[j]>=65&&a1[j]<=90||a1[j]>=97&&a1[j]<=122) b1[0]++;//这是大小写字母的条件
       else if(a1[j]>=48&&a1[j]<=57) b1[1]++; //数字的条件
          else if(a1[j]==32) b1[2]++; //空格的条件
             else b1[3]++;//其他字符的条件
    }
}

main() 
{
    char a[100];
    static int i,b[4];//b[4]是字母 数字 空格 其他 个数的数组
    gets(a);
    f(a,b);//函数调用
    printf("字母   数字   空格   其他字符\n");
    for (i=0;i<4;i++)
        printf("%-8d",b[i]);
}

10.写一个函数,输入一行字符,将此字符串中最长的单词输出。

#include<stdio.h>
#include<string.h>
#define M 100
char maxword(p)
char p[M]; 
{
    int q,j,x,z,count;
    //单词起始地址,结束地址,循环变量,中间变量,最长单词长度
    int q_z,j_z;
    q=0,j=0,count=0;
    for (x=0;x<strlen(p);x++) 
    {
        z=0;
        q_z=x;
        //在字符串长度内循环定义单词起始地址
        while(p[x]!=' '&&p[x]!='\0') 
        {
            z++;
            x++;
            //字符不为空格和空字符时字母自加,指向下一个字母
        }
        j_z=x-1;
        //结束下标减去一个空字符字节
        if(z>count) //如果第一个单词>max单词长度 
        {
            count=z;
            //则把第一个单词赋值给max单词长度,循环比较
            q=q_z;
            j=j_z;
        }
    }
    printf("字符串中最长的单词为:\n");
    for (x=q;x<=j;x++)
             putchar(p[x]);
    //max单词起始,结束地址已求出,输出
}
main() 
{
    char str[M];
    printf("输入一行字符串:\n");
    gets(str);
    maxword(str);
}

谭浩强C语言程序设计第五版答案
11.写一个函数,用“气泡法”对输入的10个字符按由小到大顺序排列。

#include<stdio.h>
#define M 10
char paixu(char p[]) 
{
    int a,b;
    char t;
    for (a=M-1;a>0;a--) 
    {
        for (b=0;b<a;b++)
                         if(p[b]>p[b+1]) 
        {
            t=p[b];
            p[b]=p[b+1];
            p[b+1]=t;
        }
    }
    printf("输出排序后的字符:\n");
    for (b=0;b<M;b++) 
        printf("%4c",p[b]);
}
main() 
{
    char str[M];
    int i=0;
    printf("输入10个字符"); 
    for (;i<M;i++)
    scanf("%c",&str[i]);
    paixu(str);
}

12.用牛顿迭代法求根。方程为ax3+bx2+cx+d=0 系数a,b,c,d的值依次为1,2,3,4, 由主函数输入。求x在1附近的一个实根。求出根后由主函数输出。

#include <stdio.h>
#include <math.h>
int main()
{float solut(float a,float b,float c,float d);
 float a,b,c,d;
 printf("input a,b,c,d:");
 scanf("%f,%f,%f,%f",&a,&b,&c,&d);
 printf("x=%10.7f\n",solut(a,b,c,d));
 return 0;
}
float solut(float a,float b,float c,float d)
{float x=1,x0,f,f1;
 do
   {x0=x;
    f=((a*x0+b)*x0+c)*x0+d;
    f1=(3*a*x0+2*b)*x0+c;
    x=x0-f/f1;
   }
 while(fabs(x-x0)>=1e-3);
 return(x);
}

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

#include <stdio.h>
float p(int x,int n)
{
       float t,t1,t2;
       if(n= =0) return 1;
       else if(n= =1) return x;
       else
       {
              t1=(2*n-1)*x*p(x,(n-1));
              t2=(n-1)*p(x,(n-2));
              t=(t1-t2)/n;
              return t;
}
}
int main()
{
       int x,n;
       printf(“input two int (x and n):”);
       scanf(“%d%d”,&x,&n);
       printf(“%.2f\n”,p(x,n));
       return 0;
}

1

14.输入10个学生5门课成绩,分别用函数实现下列功能
1、 计算每个学生平均分;

2、 计算每科平均分 ;

3 、找出五十个分数中最高分,和对应的学生和课程;

4、求出平均分方差:σ=1/n∑xi2-(∑xi/n)2,xi为某一学生的平均分。

#include<stdio.h>
#include<string.h>
#define N 10
float a_stu[N];
int average1(int str1[][5],int m,int n);
int average2(int str1[][5],int m,int n);
int average3(int str1[][5],int m,int n);
int average4(int str1[][5],int m,int n);
int main()
{
    int str[10][5]={{87,88,92,67,78},{88,86,87,98,90},{76,75,65,65,78},{67,87,60,90,67},
    {77,78,85,64,56},{76,89,94,65,76},{78,75,64,67,77},{77,76,56,87,85},{84,67,78,76,89},
    {86,75,64,69,90}};
    int i,j;
    printf("每个学生的平均成绩\n"); 
    average1(str,10,5);  
    printf("每门课的平均成绩\n"); 
    average2(str,10,5); 
    average3(str,10,5); 
    printf("某个学生的平均成绩的偏差\n"); 
    average4(str,10,5);   
    return 0;

}
int average1(int str1[][5],int m,int n)//单个学生的平均成绩 
{
    int i,j;

    float average1;
    for(i=0;i<m;i++)
    {
        float sum=0;
      for(j=0;j<n;j++)
      {
        sum+=str1[i][j];

      }  
        a_stu[i]=sum/n;
        printf("%.2f\n",a_stu[i]); 
    }

}

int average2(int str1[][5],int m,int n)//单门课的平均成绩 
{
    int i,j;

    float average2;
    for(j=0;j<n;j++)
    {
        float sum=0;
      for(i=0;i<m;i++)
      {
        sum+=str1[i][j];

      }  
        average2=sum/m;
        printf("%.2f\n",average2); 
    }

}
int average3(int str1[][5],int m,int n)
{
    int max=str1[0][0];
    int p,k,i,j;
    for(i=0;i<10;i++)
    {   
      for(j=0;j<5;j++)
        if(str1[i][j]>max)
        {
            max=str1[i][j];
            k=i+1;
            p=j+1;
        } 

    }
    printf("最高分对应的学生和课程\n"); 
    printf("max=%d,k=%d,p=%d\n",max,k,p);
} 
int average4(int str1[][5],int m,int n)//某个学生的平均偏差 
{
    int i;
    float sum1=0,sum2=0;
    float average4;
    for(i=0;i<m;i++)
    {


        sum1+=a_stu[i];
        sum2+= a_stu[i]*a_stu[i];
        average4=sum2/m-(sum1/m)*(sum1/m);

    }
    printf("%.2f\n",average4); 

}

15.写几个函数:

  1. 输入10个职工的姓名和职工号;

按职工号由小到大顺序排序,姓名顺序也随之调整;

要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。

#include <stdio.h>
#include <string.h>
void input (char na[][20], int nu[]);                 //定义输入函数
void sorts (char na[][20], int nu[]);                 //定义排序函数
void search (char na[][20], int nu[], int x);         //定义查找函数
int main()
{
    char name[10][20];
    int num[10], numb, i;
    input(name, num);                                 //调用输入函数
    sorts(name, num);                                 //调用排序函数
    for (i=0; i<10; i++){
        printf("%8s ", name[i]);
        printf("%d\n", num[i]);
    }
    printf("Input your number:");                     //输入一个职工号
    scanf("%d", &numb);
    search(name, num, numb);                          //调用查找函数
    return 0;
}
//输入函数
void input (char na[][20], int nu[])
{
    int i;
    for (i=0; i<10; i++){
        printf("Input No.%d name:", i+1);
        scanf("%s", na[i]);
        printf("Input No.%d number:", i+1);
        scanf("%d", &nu[i]);
    }
}
//排序函数
void sorts (char na[][20], int nu[])
{
    int i, j, temp;
    char tm[20];
    for (i=0; i<10; i++)
        for (j=i+1; j<10; j++){
            if (nu[i]>nu[j]){
                temp=nu[i];
                nu[i]=nu[j];
                nu[j]=temp;
                strcpy(tm, na[i]);
                strcpy(na[i], na[j]);
                strcpy(na[j], tm);
            }
        }
}
//查找函数
void search (char na[][20], int nu[], int x)
{
    int low, high, mid;
    low = 0;
    high = 9;
    while (low<=high){
        mid=(low+high)/2;
        if (x>nu[mid])
            low=mid + 1;
        else if (x<nu[mid])
            high=mid-1;
        else if (x==nu[mid]){
            printf("%s\n", na[mid]);
            break;
        }
    }
    if (x!=nu[mid])
        printf("No match!\n");
}

16.写一个函数,输入一个十六进制数,输出相应的十进制数。

#include<stdio.h>
#include<string.h>
main() 
{
    char a[100];
    int i,k,sum=0;
    printf("请输入十六进制数:\n");
    gets(a);
    for (i=strlen(a)-1,k=1;i>=0;i--) 
    {
        if(a[i]>='0'&&a[i]<='9')
            sum+=(a[i]-'0')*k; 
            else if(a[i]>='A'&&a[i]<='F')
               sum+=(a[i]-'A'+10)*k;
                else if(a[i]>='a'&&a[i]<='f')                                                                 
                  sum+=(a[i]-'a'+10)*k;
                     k*=16;                                                                         
    }
    printf("\n十六进制数%s转换成十进制数为:\n%d",a,sum);
}

17.用递归法将一个整数n转换成字符串。例如 输入483,应输出字符串“483”。n的倍数不确定,可以是任意倍数的整数。

#include <stdio.h>
int main()
{ void convert(int n);
  int number;
  printf("input an integer: ");
  scanf("%d",&number);
  printf("output: ");
  if (number<0)
    {putchar('-');putchar(' ');   /* 先输出一个‘-’号和空格 */
     number=-number;
    }
  convert(number);
  printf("\n");
  return 0;
}

void convert(int n)
{ int i;
  if ((i=n/10)!=0)
    convert(i);
  putchar(n%10+'0');
  putchar(32);
}

C语言程序设计第五版谭浩强 第七章答案

更多相关

谭浩强C语言程序设计第五版 第六章答案

猜你喜欢

转载自blog.csdn.net/gjggj/article/details/92415602
今日推荐