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、求方程 的根,用3个函数分别求当:大于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、用牛顿迭代法求根。方程为,系数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个分数中最高的分数所对应的学生和课程;
④计算平均分方差:
其中,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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探