大家好,这篇文章分享了C程序设计(谭浩强)第五版第七章课后题答案,所有程序已经测试能够正常运行,如果小伙伴发现有错误的的地方,欢迎留言告诉我,我会及时改正!感谢大家
#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;
}