失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > C语言程序设计第五版谭浩强著 第7章习题以及答案 函数系列

C语言程序设计第五版谭浩强著 第7章习题以及答案 函数系列

时间:2022-05-31 04:52:15

相关推荐

C语言程序设计第五版谭浩强著 第7章习题以及答案 函数系列

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;}

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

#include<stdio.h>#include<math.h>#define disc b*b-4*a*cdouble 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);}

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;}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++;}}main() {char a[10],b[10];printf("输入一个字符串:\n");gets(a);copy(a,b);printf("输出元音字母的字符串:\n");puts(b);}

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 100char 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);}

11.写一个函数,用“气泡法”对输入的10个字符按由小到大顺序排列。

#include<stdio.h>#define M 10char 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;}

14.输入10个学生5门课成绩,分别用函数实现下列功能

1、 计算每个学生平均分;

2、 计算每科平均分 ;

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

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

#include<stdio.h>#include<string.h>#define N 10float 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语言程序设计第五版谭浩强著 第7章习题以及答案 函数系列》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。