2022年C语言新答案 .pdf
第三章习题编程:(1)有一函数:编写一程序,输入X,输出 Y值。#include int main() double x,y; scanf(%lf,&x); if(x=1.0&x10) y=2*x-11; else y=3*x-11; printf(%lfn,y); return 0; ( 2 ) 从键盘上输入 3个整数,求最小的数。#include int main() double x,y,z,min; scanf(%lf%lf%lf,&x,&y,&z); if(xy) min=y; else min=x; if(minz) min=z; printf(min=%lfn,min); return 0; ( 3 ) 输入某人的出生日期,计算并显示其出生的当天是星期几。#include int main() int y,m,d,flag,s=0,w,i; scanf(%d%d%d,&y,&m,&d); flag=(y%4=0&y%100!=0|y%400=0); w=(y-1)*365+(y-1)/4-(y-1)/100+(y-1)/400)%7; for(i=1;i2) s=s+1; s=(w+s)%7; if(s=0) printf(星期日 n); else printf(星期%dn,s); return 0; ( 4 )企业发放的奖金根据利润提成:利润低于或等于10万元时,奖金可提成 10% ;利润高于 10万元低于 20万元时,低于 10万元的部分按 10%提成,高于 10万元的部分可提成 7.5%;20万到40万之间时,高于 20万元的部分可提成 5%;40万到 60万之间时,高于 40万元的部分可提成 3%;60万到 100万之间时,高于 60万元的部分可提成 1.5% ;高于100万元时,超过 100万元的部分按 1%提成。从键盘输入当月利润,求应发放奖金总数。#include int main() float p,r; scanf(%f,&p); if(p10&p20&p40&p60&p100) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 25 页 - - - - - - - - - r=10*0.1+10*0.075+20*0.05+20*0.03+40*0.015+(p-100)*0.01; printf(%fn,r); return 0; ( 5 ) 输入字符,并以回车结束。将其中的小写字母转换成大写字母,而其他字符不变。#include int main() char c; while(c=getchar()!=n) if(c=a&c=z) c=c-32; putchar(c); return 0; ( 6 ) 输入一个正整数,求它的所有素数因子。#include int main() int m,k=2; printf(输入一个正整数 :n); scanf(%d,&m); while(km) if(m%k=0) printf(%4d,k); m=m/k; else k+; printf(%4dn,m); return 0; ( 7 ) 从键盘输入正整数 a,求 s=a+aa+aaa+ +a a#include int main() int a,n,s=0,p=0,i; scanf(%d %d,&n,&a); for(i=1;i=n;i+) p=p*10+a; s=s+p; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 25 页 - - - - - - - - - printf(%dn,s); return 0; ( 8 ) 输出用 09这10个数字能组成的三位数#include int main() int i,j,k; for(i=1;i=9;i+) for(j=0;j=9;j+) for(k=0;k=9;k+) printf(%5d,100*i+10*j+k); return 0; ( 9 ) 用二分法求方程在区间( -10,10)之间的根 #include #include int main() float a=-10,b=10,x,f1,f2,f; f1=(2*a-4)*a+3)*a)-6; f2=(2*b-4)*b+3)*b)-6; do x=(a+b)/2; f=(2*x-4)*x+3)*x)-6; if(f*f1=1e-6); printf(%6.2fn,x); return 0; (10 ) 编写一个程序,计算的近似值#include 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 25 页 - - - - - - - - - #include int main() int n=2; double eps,t,s=0,x; scanf(%lf %lf,&x,&eps); t=x; s=t; while(fabs(t)=eps) t=-t*(2*n-3)*x*x/(2*n-2); s=s+t/(2*n); n+; printf(%d,%lfn,n,s); return 0; (11 ) 取出一个无符号的十进制整数中所有奇数数字,按原来的顺序组成一个新的数#include int main() unsigned long s,t=0,p=1; scanf(%u,&s); while(s!=0) if(s%10)%2!=0) t=t+(s%10)*p; p=p*10; s=s/10; printf(%un,t); return 0; 第四章编程输入一无符号整数,求所有数位上数字之和#include unsigned int fun(unsigned int); int main() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 25 页 - - - - - - - - - unsigned int s; scanf(%u,&s); printf(%un,fun(s); return 0; unsigned int fun(unsigned int s) unsigned int p=0; while(s!=0) p=p+s%10; s=s/10; return p; ( 2 ) 求一元二次方程的根,用 3个函数分别求判别式大于0,等于 0和小于 0时的根,并输出结果。主函数中输入系数a、b、c#include #include #include void f1(float,float,float,float); void f2(float,float,float,float); void f3(float,float,float,float); int main() float a,b,c,d; scanf(%f %f %f,&a,&b,&c); if(a=0) printf(不是一元二次方程 n); exit(0); d=b*b-4*a*c; if(d0) f1(a,b,c,d); else if(d=0) f2(a,b,c,d); else f3(a,b,c,d); return 0; void f1(float a,float b,float c,float d) float x1,x2; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 25 页 - - - - - - - - - x1=(-b+sqrt(d)/(2*a); x2=(-b-sqrt(d)/(2*a); printf(%.2f ,%.2fn,x1,x2); void f2(float a,float b,float c,float d) float x1,x2; x1=-b/(2*a); x2=-b/(2*a); printf(%.2f ,%.2fn,x1,x2); void f3(float a,float b,float c,float d) float x1,x2; x1=-b/(2*a); x2=sqrt(-d)/(2*a); printf(%.2f+i*%.2fn,x1,x2); printf(%.2f-i*%.2fn,x1,x2); ( 3 ). 用递归方法求 n解勒让德多项式的值,其递推公式为:#include double p(int,double); int main() int n; double x; do scanf(%d,&n); while(n0); scanf(%lf,&x); printf(%lfn,p(n,x); return 0; double p(int n,double x) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 25 页 - - - - - - - - - double pn; if(n=0) pn=1; else if(n=1) pn=x; else pn=(2*n-1)*x*p(n-1,x)-(n-1)*p(n-2,x)/n; return pn; ( 4 )计算银行存款余额和利息:假设银行存款季度利息是5.3%,根据输入的原始数据计算利息和账户余额,并以表格的形式输出每个季度的利息和账户余额。要求写两个函数,一个用来计算利息和余额,一个用来输出#include #define RATE 0.053 double fun(float); void display(float,int); int main() float dep; int season; scanf(%f %d,&dep,&season); display(dep,season); return 0; double fun(float d) return d*RATE; void display(float d,int s) int i; printf(季度利息余额n); printf(-n); for(i=1;i=s;i+) printf(%-4d %-.2f %-.2fn,i,fun(d),fun(d)*i+d); printf(-n); ( 5 ) 利用函数求,直到,并把计算结果作为函数返回值。 #include double fun(void); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 25 页 - - - - - - - - - int main() printf(%lfn,fun(); return 0; double fun(void) double s=0; int n=1; while(double)(2*n-1)/(2*n)*(2*n)1e-4) s=s+(double)(2*n-1)/(2*n)*(2*n); n+; return s; ( 6 ) 设w是一个大于 10的无符号整数,若 w是n(n=2 )位的整数,函数求出w的低n-1位的数作为函数的返回值。如w=5923 ,则函数返回值位 923 #include int fun(int); int main() int w; scanf(%d,&w); printf(%dn,fun(w); return 0; int fun(int w) int n=1,p=1,m; m=w; while(m10) m=m/10; p=p*10; n+; return w%p; 第五章编程( 1 ) 用循环将 a34 的第一行与第三行对调#include int main ( ) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 25 页 - - - - - - - - - int a34 = 0, 2,9,7, 5,13,6,8, 27,11,1,3 ; int i,j,temp; for(i=0,j=0;j4;j+) temp = a2-ij; a2-ij = aij; aij = temp; for(i=0;i3;i+) for(j=0;j4;j+) printf(%3d,aij); printf(n); return 0; ( 2 )编程实现显示如下形式的数字:#include int main ( ) static int a66; int i,j,t=1; for(i=0;i6;i+) t = i+1; for(j=0;ji+1;j+) aij=t-; for(i=0;i6;i+) for(j=0;j6;j+) printf(” %3d” ,aij); printf(“ n ” ); return 0; (3) 编程实现求两个矩阵相乘#include #define M 3 #define N 4 #define R 5 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 25 页 - - - - - - - - - int main( ) static int aMN,bNR,cMR; int i,j,k; printf(Matrix a:n); for( i = 0; i M; i+ ) for( j = 0; j N; j+ ) scanf( %d,&aij ); printf(Matrix b:n); for( i = 0; i N; i+ ) for( j = 0; j R; j+ ) scanf( %d,&bij ); for( i = 0; i M; i + ) for( j = 0; j N; j+ ) for( k = 0; k R; k+) cik += aij*bjk; for( i = 0; i M; i+ ) for( j = 0; j R; j+ ) printf( %3d,cij ); printf(n); return 0; ( 4 ) 输入5个整数,并存放在数组中,找出最大数与最小数所在的下标位置,并把两者对调,然后输出调整后的 5个数#include #define M 5 int main( ) static int aM; int i,max = -1,min = 100,maxi,mini,temp; for( i = 0; i M; i+ ) scanf( %d,&ai ); /099间的值for( i = 0; i M; i+ ) if( max ai ) min = ai; mini = i; temp = amaxi; amaxi = amini; amini = temp; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 25 页 - - - - - - - - - for( i = 0; i M; i+ ) printf( %3d,ai ); return 0; ( 5 )编写一个函数计算具有NROWS行和NCOLS列的二维数组中指定列的平均值以及数组各行的和的最小值#include #define M 3 #define N 4 int main( ) static int aMN; int max = -1,sumcol=0,sumrow=0; int i,j,maxi,col; for( i = 0; i M; i+ ) sumrow = 0; for( j = 0; j N; j+ ) scanf( %d,&aij ); sumrow += aij; if ( max 0); scanf(%d,&col); for( i = 0; i M; i + ) sumcol += aicol-1; printf(The %dth rows sum is max, max=%dn,maxi+1,max); printf(The %dth columns sum=%dn,col,sumcol); return 0; ( 6 ) 输入一段文字统计文字中指定字符的个数#include #define M 81 int main( ) static char strM; int i,count = 0; char ch; gets(str); fflush(stdin); /清空输入缓冲区,以便读入字符数据printf(Which character will be found?); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 25 页 - - - - - - - - - ch = getchar(); for( i = 0; i strlen(str); i+ ) if( ch = stri ) count+; printf( The number of character %c is %dn,ch,count ); ( 7 ) 编写程序实现:用二维数组表示10同学的 5门课程成绩以均分作为排序依据,降序排列成绩表 以柱状图输出指定课程的成绩分布#include #include #define N 10 #define M 5 void enter_scores(void); void sort_scores(int scoreM, int averageN3); void disp_scores(int scoreM); void histogram(int n, int scoreM); void printchar(int n); static int scoreNM; static int averN3; /第 1列为均值,第 2列原始顺序,第 3列为均值逆序int main() int course; enter_scores(); printf(n=Oringenal Score Start=n); disp_scores(score); printf(n=Oringenal Score End=n); printf(n=Sorted Score Start=n); sort_scores(score,aver); printf(n=Sorted Score End=n); printf(nWhich class will be statisticed?n); scanf(%d,&course); histogram(course, score); system(Pause); return 0; /*输入成绩 */ void enter_scores() int i, j; for(i=0; iN; i+) for(j=0; jM; j+) scanf(%d,&scoreij); averi0 += scoreij; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 25 页 - - - - - - - - - for( i = 0; i N; i+ ) for ( j = 1; j 3; j+ ) averij = i; /*成绩排序 . */ void sort_scores(int scoreM, int averageN3) int i,j,t; int temp,tempindex; for( i = 0; i N - 1; i+ ) for( j = 0; j N - 1 - i; j+ ) if ( averagej0 averagej+10 ) temp = averagej0; averagej0 = averagej+10; averagej+10 = temp; tempindex = averagej2; averagej2 = averagej+12; averagej+12 = tempindex; printf(n Score1 Score2 Score3 Score4 Score5n); for( i = 0; i N; i+ ) t = averagei2; for( j = 0;j M; j+ ) printf(%8d, scoretj); printf(n); /*输出成绩 */ void disp_scores(int scoreM) int i, j; printf(n Score1 Score2 Score3 Score4 Score5n); for( i = 0; i N; i+ ) for( j = 0;j M; j+ ) printf(%8d, scoreij); printf(n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 25 页 - - - - - - - - - void printchar(int n) int i; for (i = 0; i n; +i) putchar(*); void histogram(int course, int scoreM) int i,temp; int segs5 = 0; int scN; for( i = 0; i N; i+ ) sci = scoreicourse; for (i = 0; i N; i+)/*统计各分段人数 */ temp = (int)sci/10; segs temp6?0:temp-5+; /*成绩/10,将成绩分段 */ printf(nSegment Numbern); for (i = 0; i 5; i+) /*输出直方图,每段的人数 */ printf(%3d: %5d| , (i+1)*10+50, segsi); printchar(segsi); putchar(n); putchar(n); ( 8 ) 编写程序寻找输入字符串中字符值大的字符,并统计其位置和出现的次数#include #define M 81 int main( ) static char strM; int i,count = 0; char ch = 0; gets(str); for( i = 0; i strlen(str); i+ ) if( ch stri ) ch = stri; for( i = 0; i strlen(str); i+ ) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 25 页 - - - - - - - - - if( ch = stri ) count+; printf( max = %c ,count = %dn,ch,count ); return 0; 第六章名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 25 页 - - - - - - - - - 1 ) 定义 3个整数及指向整数的指针,仅用指针方法按由小到大的顺序输出#include int main() int a=3,b=7,c=2; int *ptra = &a,*ptrb = &b,*ptrc = &c; int temp; printf(a=%d,b=%d,c=%dn,a,b,c); printf(*ptra=%d,*ptrb=%d,*ptrc=%dn,*ptra,*ptrb,*ptrc); if ( *ptra *ptrb ) temp = *ptra; *ptra = *ptrb; *ptrb = temp; if ( *ptra *ptrc ) temp = *ptra; *ptra = *ptrc; *ptrc = temp; if ( *ptrb *ptrc ) temp = *ptrb; *ptrb = *ptrc; *ptrc = temp; printf(a=%d,b=%d,c=%dn,a,b,c); printf(*ptra=%d,*ptrb=%d,*ptrc=%dn,*ptra,*ptrb,*ptrc); return 0; ( 2 ) 输入 10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换,写三个函数: 1、输入 10个数; 2、进行处理; 3、输出 10个数。所有函数的参数均用指针#include #include void inputdata(int a,int n); void process(int a,int n); void outputdata(int a,int n); int main() int a10,n=10; inputdata(a,n); outputdata(a,n); process(a,n); outputdata(a,n); system(Pause); return 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 25 页 - - - - - - - - - int i; for( i = 0; i n; i+ ) scanf(%d,a+i); void outputdata(int *ptr,int n) int i; printf(n=OutPut Data Start=n); for( i = 0; i n; i+ ) printf(%4d,*ptr+); printf(n=OutPut Data End=n); void process(int *ptr,int n) int i,maxi,mini; int max=-1,min=101; for( i = 0; i n; i+ ) if ( max *(ptr+i) ) min = ptri; mini= i; if ( mini != 0) ptr0 = ptrmini; i=ptr0; ptrmini = i; if (maxi != n-1) i = ptrn-1; ptrn-1 = ptrmaxi; ptrmaxi = i; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 25 页 - - - - - - - - - if (maxi = 0 & mini = n-1) i = ptrmaxi; ptrmaxi = ptrmini; ptrmini = i; ( 3 )编写一个求字符串的函数(参数用指针),在主函数中输入字符串,并输出其长度。#include int strLength (char *); int main() static char str81; gets(str); printf(string %s length:%3dn,str,strLength(str) ; system(Pause); return 0; int strLength (char *s) char *p=s; while (*p) p+ ; return (p-s) ; ( 4 ) 编写一个函数(参数用指针)将3*3 矩阵转置#include #define M 3 #define N 4 void Transpose (int (*a)N,int (*T)M); int main( ) static int aMN,TNM; int i,j; for( i = 0; i M; i+ ) for( j = 0; j N; j+ ) scanf( %d,&aij ); printf(n=Oringinal Matrix Start=n); for( i = 0; i M; i + ) for( j = 0; j N; j+ ) printf( %4d,aij ); printf(n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 25 页 - - - - - - - - - printf(n=Oringinal Matrix End=n); Transpose(a, T); printf(n=Transpose Matrix Start=n); for( i = 0; i N; i + ) for( j = 0; j M; j+ ) printf( %4d,Tij ); printf(n); printf(n=Transpose Matrix End=n); return 0; void Transpose (int (*a)N,int (*T)M) int i,j; for( i = 0; i N; i+ ) for( j =0; j M; j+ ) Tij = aji; ( 5 ) 编写函数原型为 int strcmp(char *s1,char *s2);的函数,该函数实现两个字符串的比较#include int main() static char source81,target81; int result; gets(source); gets(target); result = Strcmp(source,target); if (result) if( result 0 ) printf(%s %sn,source,target); else printf(%s = %sn,source,target); return 0; int Strcmp(char *s,char *t) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 25 页 - - - - - - - - - while (*s & *t & (*s = *t) s+; t+; return *s - *t; ( 6 ) 利用指向行的指针变量求5*3数组各行元素之和#include #define M 5 #define N 3 int sum (int *a); int main( ) static int aMN; int i,j; for( i = 0; i M; i+ ) for( j = 0; j N; j+ ) scanf( %d,&aij ); for( i = 0; i M; i + ) printf(Row %d sum: %3dn, i, sum(ai); return 0; int sum (int *ptr) int i,result = 0; for( i = 0; i N; i+ ) result += *(ptr+i); return result; 第八章有10 个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生数据,要求打印出3门课总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课的成绩、平均分数)#include #include #define N 10 #define M 3 struct stu char name15; char num6; float scoreM; float aver; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 21 页,共 25 页 - - - - - - - - - studentN; /*说明结构体变量 */ struct stu findmax(struct stu student); void input(struct stu student); void output(struct stu student); int main() struct stu temp; input(student); output(student); temp = findmax(student); printf(Max is:n); printf(%15s%8s%7.2f%7.2f%7.2f%7.2f,temp.name,temp.num, temp.score0,temp.score1,temp.score2, temp.aver/M); system(Pause); return 0; struct stu findmax(struct stu student) float max = 0.0; int i,maxi; for(i=0; iN; i+) if(max studenti.aver) max = studenti.aver; maxi = i; return studentmaxi; void input(struct stu student) int i,j; printf(input data:n); for( i=0;iN;i+) scanf(%s %s,studenti.name,studenti.num); studenti.aver = 0; for( j=0;jM;j+) scanf(%f, &studenti.scorej); studenti.aver += studenti.scorej; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 22 页,共 25 页 - - - - - - - - - void output(struct stu student) int i,j; for( i=0;iN;i+) printf(%15s%8s,studenti.name,studenti.num); for( j=0;jM;j+) printf(%7.2f, studenti.scorej); printf(%7.2fn,studenti.aver/M); 第九章有5个学生,每个学生有 3门课的成绩,从键盘输入数据(包括学号、姓名、三门课成绩),分别写出满足下面要求的成绩:1、 计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件student.txt中2、 对学生成绩平均成绩排序后,将原有数据和计算出的平均分数存放在磁盘文件sort.txt中3、 对排序后的数据再插入一个学生的成绩,将原有数据和计算出的平均分数存放在磁盘文件sort2.txt中#include #define N 5 #define M 3 struct stu char name15; char num6; float scoreM; float