第一篇:高教c语言程序设计(2011版)课后编程题答案
第三章顺序结构
3.30 编写程序,把560分钟换算成用小时和分钟表示,然后进行输出。※程序如下※
main(){
int hour,minute;hour=560/60;minute=560%60;
printf(“hour=%d,minute=%d”,hour,minute);}
3.31 编写程序,输入两个整数:1500和350,求出它们的商数和余数并进行输出。※程序如下※
#include
int num1,num2,i,j;/* 定义变量 i-商,j-余数 */ printf(“input num1 and num2:n”);scanf(“%d%d”,&num1,&num2);i=n }
3.32 编写程序,读入三个双精度数,求它们的平均值并保留此平均值小数点后一位数,对小数点后第二位数进行四舍五入,最后输出结果。
※程序如下※
main(){
double a,b,c,average=0;
printf(“input a,b,c(double):n”);scanf(“%lf%lf%lf”,&a,&b,&c);average=(a+b+c)/3;average=average*10;average=average+0.5;average=(int)average;average=average/10;
printf(“average=%lf”,average);} 3.33 编写程序,读入三个整数给a,b,c,然后交换它们中的数,把a中原来的值给b,把b中原来的值给c,把c中的值给a。※程序如下※
main(){
int a,b,c,t=0;
printf(“input a b c:n”);
scanf(“%d%d%d”,&a,&b,&c);t=c;c=b;b=a;a=t;
printf(“a=%d b=%d c=%d”,a,b,c);} 第四章选择结构
4.21 当a>0时,请将以下语句改写成switch语句。if(a<30)m=1;else if(a<40)m=2;else if(a<50)m=3;else if(a<60)m=4;else m=5;
※程序如下※
main(){ int a;
printf(“Enter a:n”);scanf(“%d”,&a);switch(a/10){
case 0: case 1:
case 2: printf(“m=1”);break;case 3: printf(“m=2”);break;case 4: printf(“m=3”);break;case 5: printf(“m=4”);break;default: printf(“m=5”);} }
4.22 编写程序,输入一位学生的生日(年:y0、月:m0、日:d0);并输入当前的日
期(年:y1、月:m1、日:d1);输出该生的实足年龄。
※程序如下※ 这道题仅做参考!!系统不一样无法运行!
main(){
int y0,y1,m0,m1,d0,d1,age=0;printf(“Your Birthday(yyyy-mm-dd):n”);scanf(“%d-%d-%d”,&y0,&m0,&d0);printf(“Current Date(yyyy-mm-dd):n”);scanf(“%d-%d-%d”,&y1,&m1,&d1);if(d1 printf(“nAge=%d”,age);} 4.23 编写程序,输入一个整数,打印出它是奇数还是偶数。 ※程序如下※ main(){ int i; printf(“input a integer:n”);scanf(“%d”,&i); if(i%2==0)/*条件判断*/ printf(“%d is a even”,i);else printf(“%d is a odd”,i);} —————————————————————————————————— 4.24 编写程序,输入a、b、c三个数,打印出最大者。 ※程序如下※ main(){ int a,b,c,max = 0; printf(“input(int)a b and c:n”);scanf(“%d%d%d”,&a,&b,&c);max = a; if(max —————————————————————————————————— 4.25 有一函数: 编写一程序,要求输入x的值,输出y的值。分别 (1)不嵌套的if语句(2)嵌套的if语句 (3)if_else语句(4)switch语句 ※程序如下※ 源程序一:(1)不嵌套的if语句 main(){ float x; printf(“input x:n”);scanf(“%f”,&x);if(x>-5&&x<0)printf(“y=%f”,x);if(x==0) printf(“y=%f”,x-1);if(x>0&&x<10)printf(“y=%f”,x+1);if(x<=-5||x>=10)printf(“input error”);} 源程序二:(2)嵌套的if语句 main(){ float x; printf(“input x:n”);scanf(“%f”,&x);if(x>-5&&x<10){ if(x==0)printf(“y=%f”,x-1);if(x<0)printf(“y=%f”,x);if(x>0)printf(“y=%f”,x+1);} if(x<=-5||x>=10)printf(“input error”);} 源程序三:(3)if_else语句 main(){ float x; printf(“input x:n”);scanf(“%f”,&x);if(x>-5&&x<10)if(x<0) printf(“y=%f”,x-1);else if(x==0)printf(“y=%f”,x);else printf(“y=%f”,x+1);else printf(“input error”);} 源程序四:(4)switch语句 */ main(){ int flag;float x; printf(“Enter x:n”);scanf(“%f”,&x); if(x>-5 &&x<0)flag=-1;if(x==0)flag=0; if(x>0 &&x<10)flag=1;switch(flag){ case-1: printf(“y=%f”,x);break;case 0: printf(“y=%f”,x-1);break;case 1: printf(“y=%f”,x+1);break;} }/* 第五章循环结构 三、编程题 5.17 编写程序,求1-3+5-7+...-99+101的值。※程序如下※ main(){ int i,sum=0,s=1; for(i=1;i<=101;i+=2){ sum=sum+i*s; s=-s;/*控制符号交替变换*/ } printf(“sum=%d”,sum);} 5.18 编写程序,求e的值,e=1+1/1!+1/2!+1/3!+1/4!+...+1/n!(1)用for循环,计算前50项(2)用while循环,要求直至最后一项的值小于1e-4。※程序如下※ 源程序一:(1)用for循环实现 main(){ int i,n; double sum=1,t=1;printf(“input n:n”);scanf(“%d”,&n);for(i=1;i<=n;i++){ t=t*i;/* 实现阶乘*/ sum=sum+1/t;} printf(“e=%lf”,sum);} 源程序二:(2)用while循环实现 #include doubel sum=1,t=1; while(fabs(1.0/t)>1e-4)/* fabs求浮点型数据的绝对值 */ { t=t*i; sum=sum+1/t;i++;} printf(“e=%lf”,sum);} 5.19 编写程序,输出从公元1000年至2000年所有闰年的年号 每输出3个年号换一行。 判断公元年是否闰年的条件是: (1)公元年数如能被4整除,而不能被100整除,则是闰年。(2)公元年数能被400整除也是闰年。※程序如下※ main(){ int i,j=0; for(i=1000;i<=2000;i++){ if((i%4==0)&&(i%100!=0)||(i%400==0))/* 判断是否是闰年的条件 */ { printf(“&d ”,i);j++; if(j%3==0)/* 控制换行 */ printf(“n”);} } } 5.20 编写程序,打印以下图形: * *** ***** ******* ***** *** * ※程序如下※ #include int i,j; for(i=1;i<=7;i++)/*控制行数*/ { for(j=1;j<=7;j++)/*控制星数*/ { if((j<=fabs(4-i))||(j>7-fabs(4-i)))printf(“ ”);else printf(“*”)} printf(“n”);} } #include for(i=-3;i<=abs(i);i++) {for(j=0;j<=abs(i);j++)printf(“ ”); for(k=0;k<=7-abs(i);k++)printf(“*”);printf(“n”);} } 第六章字符型数据 6.21 请编写程序,输入一行字符(用回车结束),输出每个字符以及与之对应的ASCII代码值,每行输出三队.※程序如下※ #include int i=0;char ch; while((ch=getchar())!='n'){ printf(“%4c%4d”,ch,ch);i++; if(i%3==0)printf(“n”);} } 6.21 请编写程序,输入一行数字字符(用EOF结束),每个数字字符的前后都有空格。 请编程,把这一行中的数字转换成一个整数。例如,若输入: 2 4 8 3 则输出整数:2483 ※程序如下※ #include char ch; while((ch=getchar())!=EOF){ if(ch==' ')continue;else printf(“%c”,ch);} } 6.22 请编写程序统计输入的行数,输入用EOF结束输入。※程序如下※ #include char ch;int i=0; while((ch=getchar())!=EOF){ if(ch=='n')i++;} printf(“%d”,i);} 6.23 请编写程序统计输入的一行中小写字母的个数。 ※程序如下※ #include int i=0;char ch; while((ch=getchar())!='n'){ if((ch>='a')&&(ch<='z'))i++;} printf(“%d”,i);} 6.24 请编写输出以下图案的程序,图案的行数由输入的值确定。A BBB CCCCC DDDDDDD EEEEEEEEE ※程序如下※ #include int i,j,k,n; printf(“Enter n(integer):n”);scanf(“%d”,&n);for(i=1;i<=n;i++){ for(j=n;j>i;j--)printf(“ ”); for(k=1;k<=2*i-1;k++)printf(“%c”,64+i);printf(“n”);} } 第七章函数 7.14 以下fun函数用以判断n是否是素数,fun函数中有逻辑错,请调试改正。fun(int n){ int k,yes; for(k=2;k<=n/2;k++)if(n%k==0)return yes=0;return yes=1;} ※正确答案是: fun(int n){ int k,yes=1; for(k=2;k<=n/2;k++)if(n%k==0)return yes=0;return yes;} main(){ int n,yes; printf(“Enter n(int):n”);scanf(“%d”,&n);yes=fun(n); if(yes==1)printf(“%d is a prime”,n);else printf(“%d is not a prime”,n);} 7.15 编写函数 int mymod(int a, int b)用以求a被b除之后的余数。 ※程序如下※ #include int remainder;remainder=a%b;return remainder;} main(){ int a,b; printf(“Enter a b(int):n”);scanf(“%d%d”,&a,&b); printf(“余数=%d”,mymod(a,b));} 7.16 编写程序求:1-1/2+1/3-1/4+1/5-1/6+1/7-...1/n ※程序如下※ main(){ int n;float a; float sum(int n);scanf(“%d”,&n);a=sum(n); printf(“%10.5f”,a);} float sum(int n){ float s=0;int i,t=1; for(i=1;i s=s+1/i*t;t=-t;} return s;} 7.17 编写函数,根据整型形参m的值,计算如下公式的值。t=1-1/(2 x 2)-1/(3 x 3)-...-1/(m x m) 例如:若m=5,则应输出0.536389。 ※程序如下※ main(){ float t=1;float f2(int);int i,m; scanf(“%d”,&m);for(i=2;i<=m;i++)t=t-f2(i); printf(“t=%f”,t);} float f2(int m){ float s; s=1.0/(m*m);return s;} 7.18 编写函数用以求表达式x2-5x+4,x作为参数传给函数,调用此函数求: y1=22-5*2+4 y2=(x+15)2-5*(x+15)+4 y3=sin2x-5*sinx+4 ※程序如下※ #include float y; y=pow(x,2)-5*x+4;return y;} main(){ float x,y1,y2,y3;clrscr(); printf(“Enter x:n”);scanf(“%f”,&x); y1=fun(2); y2=fun((x+15));y3=fun(sin(x)); printf(“y1=%fny2=%fny3=%fn”,y1,y2,y3);} 第八章地址和指针 8.17 请编写函数,其功能是对传送过来的两个浮点数求出和值与差值,并通过形参传 送回调用函数。 ※程序如下※ #include *sum=a+b;*sub=a-b;} main(){ float a,b,sum,sub;/*定义变量sum求和,变量sub求差*/ printf(“Enter a b(float):n”);scanf(“%f%f”,&a,&b); sum_sub(a,b,&sum,&sub); printf(“sum=%f,sub=%f”,sum,sub);} 8.18 请编写函数,对传送过来的三个数选出最大和最小数,并通过形参传回调用函数。 ※程序如下※ #include *max = a;/* 假定a的值为最大,把a值赋给指针变量*max */ if(*max *min = a;/* 假定a的值为最小,把a值赋给指针变量*min */ if(*min>b)*min = b;if(*min>c)*min = c;} main(){ double a,b,c,max,min; printf(“Enter a b c(double):n”);scanf(“%lf%lf%lf”,&a,&b,&c);max_min(a,b,c,&max,&min); printf(“max=%lf,min=%lf”,max,min);} 第九章函数 9.27 输入一行数字字符,请用数组元素作为计数器来统计每个数字字符的个数.用下标为 0元素统计字符“1”的个数,下标为1的元素统计字符“2”的个数,...※程序如下※ #include while((ch=getchar())!='n')for(i=0;i<10;i++)if(i==ch-'0')if(i==0)a[9]++;else a[i-1]++;} main(){ int i,a[10]={0};count(a); for(i=0;i<10;i++) printf(“a[%d]=%dn”,i,a);} 9.28 编写函数,对具有10个整数的数组进行如下操作:从第n个元素开始直到最后一个元 素,依次向前移动一个位置.输出移动后的结果.※程序如下※ fun(int a[],int n){ int i; for(i=n;i<9;i++)a=a[i+1];} main(){ int a[10]={0,1,2,3,4,5,6,7,8,9},n,i;scanf(“%d”,&n);fun(a,n); for(i=0;i<9;i++)printf(“%d ”,a);} 9.29 编写函数把数组中所有奇数放在另一个数组中返回.※程序如下※ #include int i,j=0;for(i=0;i<10;i++)if(a%2==1)b[j++]=a;return(j);} main(){ int i,j,a[10],b[10];clrscr(); printf(“n****Enter 10 integer number:****n”);for(i=0;i<10;i++)scanf(“%d”,&a);j=fun(a,b); printf(“****Output the odd arrage***:n”);for(i=0;i 9.30 编写函数对字符数组中的输入字母,按由大到小的字母顺序进行排序。 ※程序如下※ #include char a[20];int n;clrscr(); printf(“****The original alphabetic is****:n”);gets(a);n=strlen(a);alpha_sort(a,n);alpha_rout(a,n);} void alpha_sort(char a[],int n){ int i,j,p,t; for(j=0;j for(i=j+1;i t=a[j];a[j]=a[p];a[p]=t;} } } void alpha_rout(char a[],int n){ int i; printf(“n****The alphabetic of sorting is****:n”);for(i=0;i 9.31 输入若干有序数放在数组中。然后输入一个数,插入到此有序数列中,插入后,数组中的数仍然有序。请对以下三种情况运行你的程序,以便验证你的程序是否 正确。 (1)插在最前(2)插在最后(3)插在中间 ※程序如下※ #include void sort(int a[M],int b[M+1],int n){ int i; for(i=0;i if(a[0]>a[M-1]){ if(n else { if(n>a)b=a;else { b=n;break;} } } if(i for(;i main(){ int i,n,a[M],b[M+1];clrscr(); printf(“Enter ten integer number(be sorted):n”);for(i=0;i printf(“Enter a numbern”);scanf(“%d”,&n);sort(a,b,n); printf(“Result of insertn”);for(i=0;i<=M;i++)printf(“%d ”,b);} 9.32 编写函数把任意十进制整数转换成二进制数.提示:把十进制数不断除2除,余数放 在一个一维数组中,直到商数为零.在主函数中进行输出,要求不得按逆序输出.※程序如下※ #include int i=0,remainder;while(decimal>0){ remainder=decimal%2;decimal=decimal/2;a[i++]=remainder;if(decimal<2){ a=decimal;break;} } return(i);} main(){ int i,j,decimal,a[64]; printf(“Enter decimal number:n”);scanf(“%d”,&decimal);j=dec_bin(a,decimal);for(i=j;i>=0;i--)printf(“%d”,a);} 9.33 编写函数调用随机函数产生0到19之间的随机数,在数组中存入15个互不重复的整 数。要求在主函数中输出结果。若已定义x为int类型,调用随机函数步骤如下: #include “stdio.h” .x=rand()%20 /*产生0到19的随机数*/ ※程序如下※ #include int i=0,j,x,flag;while(i<15){ flag=1; x=rand()%20;for(j=0;j if(flag==1)a=x;i++;} } main(){ int i,a[15];clrscr();rand1(a); for(i=0;i<15;i++)printf(“%d ”,a);} 9.34 求任意方阵每行、每列、两对角线上元素之和。 ※程序如下※ #include void line_sum(int a[M][M],int a1[]){ int i,j,k; for(i=0,k=0;i a1[k]=0; for(j=0;j void column_sum(int a[M][M],int a2[]){ int i,j,k; for(i=0,k=0;i a2[k]=0; for(j=0;j void diagonal_sum(int a[M][M],int a3[]){ int i,j; for(i=0;i a3[0]+=a[j];if(i+j==M-1)a3[1]+=a[j];} } main(){ int i,j,a[M][M],a1[M],a2[M],a3[2]={0};clrscr();i=M; printf(“****Enter %d x %d phalanx****n”,i,i);for(i=0;i printf(“line%d=%dn”,i,a1);for(i=0;i printf(“column%d=%dn”,i,a2);for(i=0;i<2;i++) printf(“diagonal%d=%dn”,i,a3);} 9.35 求两个矩阵的和 #include void add(int a[M][M],int b[M][M],int c[M][M]){ int i,j; for(i=0;i for(j=0;j main(){ int i,j,k,a[M][M],b[M][M],c[M][M]={0};i=M;printf(“****Enter NO.1 Matrix(%d x %d)****n”,i,i);for(i=0;i printf(“****Enter NO.2 Matrix(%d x %d)****n”,i,i);for(i=0;i printf(“****Output result Matrix(%d x %d)****n”,i,i);for(i=0;i for(j=0;j 9.36 编写函数打印出以下形式的乘法九九表。** A MULTIPLICATION TABLE **(1)(2)(3)(4)(5)(6)(7)(8)(9) ---------------------------(1)1 2 3 4 5 6 7 8 9 (2)2 4 6 8 10 12 14 16 18(3)3 6 9 12 15 18 21 24 27(4)4 8 12 16 20 24 28 32 36(5)5 10 15 20 25 30 35 40 45(6)6 12 18 24 30 36 42 48 54(7)7 14 21 28 35 42 49 56 63(8)8 16 24 32 50 48 56 64 72(9)9 18 27 36 45 54 63 72 81 --------------------------- ※程序如下※ #include int i,j;clrscr(); printf(“** A MULTIPLICATION TABLE **n”);printf(“(1)(2)(3)(4)(5)(6)(7)(8)(9)n”); printf(“---------------------------n”);for(i=1;i<=9;i++){ printf(“t(%d)”,i);for(j=1;j<=9;j++)printf(“%4d”,i*j);printf(“n”);} printf(“---------------------------n”);} 9.37 调用随机函数为5 x 4的矩阵置100以内的整数,输出该矩阵,求出每行元素之和 并把和值最大的那一行与第一行上的元素对调。若已定义x为int类型,调用随机 函数步骤如下: #include “stdio.h” .x=rand()%100 /*产生0到100的随机数*/ ※程序如下※ #include int i,j; for(i=0;i<5;i++)for(j=0;j<4;j++,p++)*p=rand()%100;} void exchange(int a[5][4]){ int i,j,max,temp,b[5]={0};for(i=0;i<5;i++)for(j=0;j<4;j++)b+=a[j]; for(i=0;i<5;i++) if(b temp=a[j];a[j]=a[max][j];a[max][j]=temp;} } main(){ int i,j,a[5][4];clrscr();rand1(a); printf(“****The origient Matrix****n”);for(i=0;i<5;i++){ for(j=0;j<4;j++)printf(“%5d”,a[j]);printf(“n”);} exchange(a); printf(“****The exchange Matrix****n”);for(i=0;i<5;i++){ for(j=0;j<4;j++)printf(“%5d”,a[j]);printf(“n”);} } 9.38 调用随机函数为5 x 5 的矩阵置100以内的整数,输出该矩阵,然后逆置该矩阵。 即将第一列的元素放在第一行上、第二列的元素放在第二行上、其它依次类推。 ※程序如下※ #include int i,j; for(i=0;i<5;i++)for(j=0;j<5;j++,p++)*p=rand()%100;} void Reverse_Matrix(int a[5][5]){ int i,j,temp;for(i=0;i<5;i++)for(j=0;j temp=a[j];a[j]=a[j];a[j]=temp;} } main(){ int i,j,a[5][5];clrscr();Rand1(a); printf(“****The Result of rand()Function()****n”);for(i=0;i<5;i++){ for(j=0;j<5;j++)printf(“%5d”,a[j]);printf(“n”);} Reverse_Matrix(a); printf(“****The Result of Reverse Matrix Function()****n”);for(i=0;i<5;i++){ for(j=0;j<5;j++)printf(“%5d”,a[j]);printf(“n”);} } 第十章字符串 10.19 请编写函数mygets和myputs,其功能分别与gets和puts相同,函数中用getchar 和putchar读入和输出字符。 ※程序如下※ #include char ch; while((ch=getchar())!='n')*(p++)=ch;p[0]=0;} void myputs(char *p){ char ch; while(*p!=' ')putchar(*(p++));} main(){ char *s;clrscr();mygets(s);myputs(s);} 10.20 请编写函数,判断一字符串是否是回文。若是回文函数返回值为1;否则返回值 为0。回文是顺读和倒读都一样的字符串。 ※程序如下※ #include char a[200],*p;int i,j,flag=1;clrscr(); scanf(“%s”,a);p=a; j=strlen(a); for(i=0;i<=j/2;i++,j--)if(*(p+i)!=*(p+j-1)){ flag=0;break;} if(flag) printf(“Yes”);else printf(“No”);} 10.21 请编写函数,删除字符串中指定位置上的字符。删除成功函数返回被删字符;否 则返回空值。 ※程序如下※ #include if(n<=strlen(p))ch=*(p+n-1);else ch='0'; for(i=n-1;i main(){ int n;char *s;clrscr(); printf(“****The string is ****n”);gets(s); printf(“Enter n(0--%d)n”,strlen(s));scanf(“%d”,&n); printf(“****The deleted char is****n”);printf(“%c”,del(s,n));getch();} 第十一章对函数的进一步讨论 11.11 编写程序outch,程序读入一行字符,根据命令行中的参数进行不同的输出。若 有以下命令行: outch-2 程序对读入的一行字符输出最后两个字符。若有以下命令行: outch +6 程序对所读入的一行字符输出开头6个字符。若命令行中没有参数,则隐含规定 输出最后10个字符。为简单起见,命令行中的参数中只包含一位数字。 ※程序如下※ #include char s[64]; printf(“Enter a string:n”);gets(s); while(argc>0){ if(argc==1){ for(i=strlen(s)-10;i if(argv[1][0]=='-'){ for(i=strlen(s)-(argv[1][1]-'0');i if(argv[1][0]=='+'){ for(i=0;i<(argv[1][1]-'0');i++)printf(“%c”,s);break;} } } 11.12 请写递归函数,把输入的一个整数转换成二进制数输出。 ※程序如下※ #include static int i=0;if(n==0||n==1){ a=n;return i;} else { a[i++]=n%2; return dec_bin(n/2,a);} } main(){ int i,j,n,a[64]; printf(“Enter n(integer)n”);scanf(“%d”,&n);j=dec_bin(n,a);for(i=j;i>=0;i--)printf(“%d”,a);} 11.13 请用递归算法,求1+2+3+...n,n由键盘输入。 ※程序如下※ fun(int n){ int sum;if(n==1)return 1;else { sum=n+fun(n-1);return sum;} } main(){ int n,sum;clrscr(); printf(“Enter n(1+2+3+...+n):n”);scanf(“%d”,&n);sum=fun(n); printf(“sum=%d”,sum);} 11.14 请用递归函数,求裴波拉契级数,求n阶裴波拉契级数的公式如下。 ※程序如下※ #include long t; if(n==0||n==1)return 1;else { t=fac(n-1)+fac(n-2);return t;} } main(){ int n; printf(“Enter n :n”);scanf(“%d”,&n);printf(“%ld”,fac(n));} 第十三章编译预处理和动态存储分配 13.10 编写出一个宏定义MYALPHA(C),用以判断C是否是字母字符,若是得1,否则得0。 ※程序如下※ #include char ch;clrscr(); ch=getchar();if(MYALPHA(ch)) printf(“%c is a alpha”,ch);else printf(“%c is not a alpha”,ch);} 13.11 请写出一个宏定义swap(t,x,y)用以交换t类型的两个参数。提示:用复合语句的形式。 ※程序如下※ #include main(){ int a,b,t;clrscr(); printf(“Enter a and b:n”);scanf(“%d%d”,&a,&b);swap(t,a,b); printf(“a=%dnb=%d”,a,b);} 13.12 请编写程序,利用malloc函数开辟动态存储单元,存放输入的三个整数。然后按 从小到大的顺序输出这三个数。 ※程序如下※ #include void main(){ int *pData =(int*)malloc(sizeof(int)*3);int t; printf(“Please input three integral numbern”);scanf(“%d%d%d”,pData,pData+1,pData+2); for(int i=0;i<2;i++)for(int j=i+1;j<3;j++) if(*(pData+i)> *(pData+j)){ t = *(pData+j); *(pData+j)= *(pData+i);*(pData+i)= t;} printf(“%dt%dt%dn”,*pData,*(pData+1),*(pData+2));} 第十四章结构体、共用体和用户定义类型 14.12 设有以下结构类型说明:struct stud { char num[5],name[10];int s[4];double ave;}; 请编写: (1)函数readrec把30名学生的学号、姓名、四项成绩以及平均分放在一个结构 体数组中,学生的学号、姓名和四项成绩由键盘输入,然后计算平均分放 在结构体对应的域中。 (2)函数writerec输出30名学生的记录。 (3)main函数调用readrec函数和writerec函数,实现全部程序功能(注:不允 许使用全局变量,函数之间的数据全部使用参数传递)。 ※程序如下※ #include void readrec(struct stud *pStud, int num){ int i; printf(“tNumtNametS1tS2tS3tS4n”); for(i=0;i printf(“%d:t”,i); scanf(“%s%s%d%d%d%d”,pStud->num,pStud->name,&(pStud->s[0]), &(pStud->s[1]),&(pStud->s[2]),&(pStud->s[3])); pStud->ave=(pStud->s[0]+pStud->s[1]+pStud->s[2]+pStud->s[3])/4.0; pStud++;} } void writerec(struct stud *pStud, int num){ int i; printf(“tNumtNametS1tS2tS3tS4n”); for(i=0;i printf(“%d:”,i); printf(“t%st%st%dt%dt%dt%dt%lfn”,pStud->num,pStud->name, pStud->s[0],pStud->s[1],pStud->s[2],pStud->s[3],pStud->ave); pStud++;} } void main(){ struct stud student[STUDNUM];readrec(student,STUDNUM);writerec(student,STUDNUM);} 14.13 已知head指向一个带头节点的单向链表,链表中每个节点包含数据区域(data) 和指针域(next),数据域为整型。请分别编写函数,在链表中查找数据域值 最大的节点。 ※程序如下※ #include struct node { int data; struct node *next;}; struct node *SearchMax(struct node *head){ int max; struct node *pMaxNode,*pNode; pNode = head;pMaxNode = NULL;while(pNode!= NULL){ if(pNode->data > max || pMaxNode == NULL){ max = pNode->data;pMaxNode = pNode;} pNode = pNode->next;} return pMaxNode;} void main(){ struct node *head,*tail,*pNode;int data; printf(“Please input datanEnter 'Exit' to quit.n”); head = tail = NULL; while(scanf(“%d”,&data)> 0){ pNode =(struct node*)malloc(sizeof(struct node));pNode->data = data;pNode->next = NULL; if(head == NULL)head = tail = pNode;else { tail->next = pNode;tail = pNode;} } if(head!= NULL) printf(“Maxnimum data is %dn”, SearchMax(head)->data); while(head!= NULL){ pNode = head;head = head->next;free(pNode);} }*/ 《C语言程序设计教程》课后题答案 第一章 一选择题 1.A 2.B 3.C 4.D 5.B 6.C 二.填空题 1.程序 2.算法 3.main或主 4.编译 5.编译 6..obj 7.库函数 8.文本或ASCII码 三、编程题 1.参考代码如下: #include printf(“金n木n水n火n土n”);} 2.参考代码如下: #include scanf(“%d%d”,&a,&b); printf(“%d+%d=%dn”,a,b,a+b); printf(“%d-%d=%dn”,a,b,a-b); printf(“%d*%d=%dn”,a,b,a*b); printf(“%d/%d=%dn”,a,b,a/b);} 3.参考代码如下: #include float a,b,h,s; scanf(“%f%f%f”,&a,&b,&h); s=(a+b)*h/2; printf(“s=%fn”,s);} 第二章 一选择题 答案及分析: 1.B,略 2.A,-8在内存中是以补码(设两个字节)形式存储的 3.A,C语言有32个关键字(参见课本第18页),且C语言标识符是区分大小写字母的 4.A,略 5.D,八进制数据中不能出现数码8 6.B,字符常量应该用单引号括起来,答案D超出了ASCII取值范围(ASCII的取值范围为[0,255]) 7.C,该字符串中转义字符有三个:、22和 n,普通字符有三个:a、,和0,所以字符串长度为6 8.C,略 9.D,C语言没有read函数和%D格式符号,且scanf函数第二个形参为地址列表 10.B,根据题意,scanf函数输入数据时分隔符号不应该是逗号,应该是空格或回车符,且输入数据时分一行或几行均可 11.A,scanf函数中不允许出现%8.4,%6.2和%8这样的格式符号 12.C,既要保证5位小数位,还得保证整数位不变,这样数据12345.67800用10列不能完全显示出来,按C语言规定,12345.67800原样输出 13.B,printf函数中格式符号%d,%o,%x表示对应的整型数据分别按十进制,八进制和十六进制输出 14.C,按C语言规定,scanf函数形参双引号中,如果包含非格式符号,在输入数据时要求原样输入 二.填空题 答案及分析: 1.int float double(略) 2.65,89,printf函数中如果格式符号是%d,则输出相应字符的ASCII十进制数值 3.a=98,b=765.000000,c=4321.000000,scanf函数中的格式符号%2d%3f%4f,表示将键盘输入的数据9876543210按2,3,4位分割,然后再分别赋给变量a,b,c 4.scanf(“%lf%lf%lf”,&a,&b,&c);double类型的变量对应的格式符号是%lf 三、编程题 1.参考代码如下: #include int a=97; printf(“%cn”,a); printf(“%dn”,a); printf(“%on”,a); printf(“%xn”,a);} 程序分析:通过printf函数中不同的格式符号,即%c(字符),%d(十进制),%o(八进制),%x(十六进制)输出相应的值。2.参考代码如下: #include int h,m,minute; scanf(“%d:%d”,&h,&m); minute=h*60+m; printf(“minute=%dn”,minute);} 程序分析:输入形式为10:27,故scanf函数双引号中两个格式符号%d之间必须加入“:”。3.参考代码如下: #include float r=6371000,s,v; s=4*3.1415926*r*r; v=3.1415926*4/3*r*r*r; printf(“s=%fnv=%f”,s,v);} 程序分析:C语言中的π不代表3.1415926,可以用各种常量的形式体现出来。4.参考代码如下: #include int m100,m50,m20,m10,m5,m1,m; scanf(“%d”,&m); m100=m/100; m50=(m-m100*100)/50; m20=(m-m100*100-m50*50)/20; m10=(m-m100*100-m50*50-m20*20)/10; m5=(m-m100*100-m50*50-m20*20-m10*10)/5; m1=m-m100*100-m50*50-m20*20-m10*10-m5*5; printf(“%d元发工资,人名币各票面的张数为:n”,m); printf(“100元的张数:%dn”,m100); printf(“50元的张数:%dn”,m50); printf(“20元的张数:%dn”,m20); printf(“10元的张数:%dn”,m10); printf(“5元的张数:%dn”,m5); printf(“1元的张数:%dn”,m1);} 程序分析:人民币的面值分别为100元,50元,20元,10元,5元和1元,工资4367元除以100后得到的商就为100元张数,余数再除以50,得到的商为50元的张数,余数再除20,„„,以此类推就会得出人民币各面值相应的张数。5.参考代码如下: #include float r1,r2,r3,r; scanf(“%f%f%f”,&r1,&r2,&r3); r=r1*r2*r3/(r1*r2+r2*r3+r1*r3); printf(“三个电阻并联后的总电阻为%fn”,r);} 程序分析:首先将计算并联电阻值的公式变换一下;再就是考虑要保留小数位,故变量类型设置为实型,注意格式符号为%f。6.参考代码如下: #include int x,a,b,c,d,y; scanf(“%d”,&x); a=x%10; b=x/10%10; c=x/100%10; d=x/1000; y=a*1000+b*100+c*10+d; printf(“%d逆置各位数后的值为%dn”,x,y);} 程序分析:1234除以10的余数就是4,商再除以10的余数就是3,1234除以100再除以10取余就是2,1234除以1000就是1。也可以用其他的表达式求出各位数值,例如输入数据1234中的4,可以用公式a=x-d*1000-c*100-b*10来计算。7.参考代码如下: #include float F,C; printf(“请输入华氏温度:”); scanf(“%f”,&F); C=5.0/9*(F-32); printf(“华氏温度%f对应的摄氏温度为%fn”,F,C);} 程序分析:5/9的值为0,所以要写成5.0/9,5/9.0或5.0/9.0,还要注意变量类型为实型,且对应的格式符号为%f。8.参考代码如下: #include char ch1,ch2,ch3; printf(“请输入三个数字字符:”); scanf(“%c%c%c”,&ch1,&ch2,&ch3); printf(“将数字字符转换为数字%d,%d,%dn”,ch1-'0',ch2-48,ch3-'0');} 程序分析:通过键盘输入三个数字字符时要连续输入,不要加任何分隔符号,例如121等,另外,数字字符输出时遇到格式符号%d将输出相应数字字符的ASCII值,但任何一个数字字符的ASCII值减去字符0的ASCII值,再对应%d格式符号输出时,就是数字字符对应的数字,例如'2'-'0'=2。 9.不能得到指定的输出结果,参考代码如下: void main(){ int a, b, c,x, y; scanf(“%d%d%d”,&a,&b,&c); x=a*b; y=x*c; printf(“a=%d,b=%d,c=%dn”,a,b,c); printf(“x=%d,y=%dn”,x,y);} 程序分析:scanf(“%d,%d,%d”,a,b,c);scanf函数第二类形参是地址列表,所以语句改为scanf(“%d,%d,%d”,&a,&b,&c);而这个语句对应的键盘输入形式为2,3,4。为了满足题目要求,scanf语句改为scanf(“%d%d%d”,&a,&b,&c)。另外,printf函数双引号只能出现一对,且双引号中需要在相应的位置上添加a=等这样的字符串才能原样输出;还有整型变量对应格式符号是%d等。 第三章 一选择题 1.A 2.C 3.C 4.D 5.C 6.B 7.C 8.B 9.A 10.A 11.A 12.B 13.D 14.A 15.B 16.C 17.C 18.C 19.C 20.C 21.C 22.B 23.C 24.C 25.A 26.B 27.A 28.A 29.C 30.A 31.C 32.C 二.填空题 1.非零 零 2.passwarm 3.525252 4.fabs(x)>5 5.x%y==0 6.if((1<=x&&x<=10||200<=x&&x<=210)&&x%2==1)printf(“%d”,x);7.k=1 8.Right!1 Right!1 9.$$$ a=0 10.a=2,b=1 11.0 “%f%f” a=b;13.“%c”,&ch 'A'<=ch&&ch<='Z' ch 14.死循环 15.345 16.7 3-1 17.x>=0 x j%3!=0 24.b=i+1 25.8 5 2 26.d=1.0 k++ k<=n 三、编程题 1.参考代码如下: #include y=x;else if(x==0) y=x-1;else if(x>0&&x<10) y=x+1;printf(“y=%f”,y);} 2.参考代码如下: #include float a,b,c; printf(“请输入三角形三边的长度:n”); scanf(“%f%f%f”,&a,&b,&c); if(a+b>c&&b+c>a&&a+c>b) if(a==b&&a==c) printf(“该三角形是等边三角形n”); else if(a==b&&a!=c) printf(“该三角形是等腰三角形n”); else printf(“该三角形是一般三角形n”); else printf(“不能构成三角形n”);} 3.参考代码如下: #include float M,N,menoy; printf(“请输入购买金额:”); scanf(“%f”,&M); if(M<100) N=0; else if(M>=100&&M<200) N=1.5; else if(M>=200&&M<300) N=2.5; else if(M>=300&&M<400) N=3.5; else if(M>=400&&M<500) N=4.5; else if(M>=500&&M<600) N=5.5; else N=6; menoy=M*(1-N/100); printf(“实际支付金额:%f,返还的金额:%fn”,menoy,M-menoy);} 4.参考代码如下: #include float M,N,menoy; int in; printf(“请输入购买金额:”); scanf(“%f”,&M); in=M/100; switch(in) { case 0:N=0;break; case 1:N=1.5;break; case 2:N=2.5;break; case 3:N=3.5;break; case 4:N=4.5;break; case 5:N=5.5;break; default :N=6;break; } menoy=M*(1-N/100); printf(“实际支付金额:%f,返还的金额:%fn”,menoy,M-menoy);} 5.参考代码如下: #include float x,max; printf(“Enter a number:”); scanf(“%f”,&x); max=x; while(x>0) { printf(“Enter a number:”); scanf(“%f”,&x); if(x>max) max=x; } if(max>0) printf(“The largest number entered was %fn”,max);} 6.参考代码如下: #include float M,N,menoy; printf(“请输入购买金额:”); scanf(“%f”,&M); while(M>0) { if(M<100) N=0; else if(M>=100&&M<200) N=1.5; else if(M>=200&&M<300) N=2.5; else if(M>=300&&M<400) N=3.5; else if(M>=400&&M<500) N=4.5; else if(M>=500&&M<600) N=5.5; else N=6; menoy=M*(1-N/100); printf(“实际支付金额:%f,返还的金额:%fn”,menoy,M-menoy); printf(“请输入购买金额:”); scanf(“%f”,&M); } } 7.参考代码如下: #include float number,positivesum=0,negativesum=0,total=0; int i; for(i=1;i<=10;i++) { scanf(“%f”,&number); if(number>=0)positivesum+=number; else negativesum+=number; total+=number; } printf(“positive sum %f,negative sum %f,total %fn”,positivesum,negativesum,total);} 8.参考代码如下: #include int i,sum=0,k=1; for(i=1;i<=101;i+=2) { sum=sum+k*i; k=-k; } printf(“1-3+5-7+...-99+101=%dn”,sum);} 9.参考代码如下: #include float i,sum=0,k=1; for(i=1;k>=1e-4;i++) { sum=sum+k; k=k/i; } printf(“e=%fn”,sum);} 10.参考代码如下: #include float i,sum=0,n=2,d=1,temp; for(i=1;i<=20;i++) { sum=sum+n/d; temp=n; n=n+d; d=temp; } printf(“sum=%fn”,sum);} 11.参考代码如下: #include float apple,watermelon,pear; for(apple=1;apple<100;apple++) for(watermelon=1;watermelon<10;watermelon++) { pear=100-apple-watermelon; if(fabs(apple*0.4+watermelon*4+pear*0.2-40.0)<1e-6) printf(“apple:%.0f,watermelon:%.0f,pear:%.0fn”,apple,watermelon,pear); } } 12.参考代码如下: #include int i,j,k; for(i=1;i<10;i++) for(j=0;j<10;j++) for(k=0;k<10;k++) if(i*100+j*10+k==i*i*i+j*j*j+k*k*k) printf(“%dn”,i*100+j*10+k);} 或: #include int a,b,c,i; for(i=100;i<1000;i++) { a=i/100; b=i/10%10; c=i%10; if(i==(a*a*a+b*b*b+c*c*c)) printf(“%dn”,i); } } 13.参考代码如下: #include int a,b,c,d; for(a=1;a<10;a++) for(b=0;b<10;b++) for(c=0;c<10;c++) for(d=0;d<10;d++) if(a*1000+b*100+c*10+d==(a*10+b+c*10+d)*(a*10+b+c*10+d)) printf(“%dn”,a*1000+b*100+c*10+d);} 或: #include int a,b,c,d,i; for(i=1000;i<10000;i++) { a=i/1000; b=i/100%10; c=i/10%10; d=i%10; if(i==(a*10+b+c*10+d)*(a*10+b+c*10+d)) printf(“%dn”,i); } } 14.参考代码如下: #include int i,j; for(i=1;i<=4;i++)//先控制打印前4行 { for(j=1;j<=4-i;j++) printf(“ ”); for(j=1;j<=2*i-1;j++) printf(“*”); printf(“n”); } for(i=1;i<=3;i++)//再控制打印后3行 { for(j=1;j<=i;j++) printf(“ ”); for(j=1;j<=2*(4-i)-1;j++) printf(“*”); printf(“n”); } } 第四章 一选择题 1.A,如果没有给s[1]赋值,按C语言规定,s[1]下标变量中的数据是一个随机数 2.C,“China”字符串末尾还有一个 ,故占6个字节 3.D,scanf函数中格式符号若是%c,则把输入的第一个字符'1'赋给变量c,然后遇到格式符号%d,则把后续的23(遇到空格结束)赋值给变量i,遇到格式符号%s,则把后续的字符串“456”(遇到空格结束)赋值给变量s 4.D,C语言规定,数组在定义时就已经分配好了所占内存空间,所以int x[5]在内容中占的字节数为4*5=20 5.B,内层循环变量j每次都从0开始,使得在外层循环变量i每取一个值时,n[0]和n[1]的值都得重新计算 6.B,这是求十进制数18对应二进制数的程序,将每次18除以2得到的余数依次放到数组a[0]到a[4]中,最后按a[4]到a[0]这样的顺序输出 7.B,第一个for循环给a[0]到a[9]赋值为0到9,第二个for循环给p[0]到p[2]赋值为0,2,6,第三个for循环使k=k+p[0]*2+p[1]*2+p[2]*2=5+4+12=21 8.D,C语言规定,定义二维数组时不能省略第二维下标值,但可以省略第一维下标值 9.B,略 10.A,每行的第4列元素的值都为0 11.C,略 12.D,C语言规定,字符数组不能用s=“abcd”这样的赋值语句赋值 13.C,float类型的变量对应格式符号通常为%f,不是%d 14.A,每行的第3列元素的值均为0 15.D,略 16.C,A这种赋值形式无法放置字符串末尾的 ,B和D不符合C语言规定,即字符数组不能用s=“good”这样赋值语句赋值 17.A,这是字符数组str初始化的形式,str[0]到str[5]分别为字符s,t,r,i,n,g,str[6]到str[11]的值均为 ,函数strlen是统计字符串包含字符的个数,遇到 (不包括 )结束,所以str长度为6 18.C,x数组比y数组多了一个字符 19.A,数组名就是数组第一个元素的地址,所以scanf(“%s”,&s);中得删除数组名前面的& 20.D,puts和putchar函数只有一个参数,printf函数中格式符号%s应该对应的是数组名 21.D,程序功能是输出第2和第3个字符串 22.A,双层循环完成的功能是求s的值,s=(((a[0][0]*10+a[0][2])*10+a[1][0])*10+a[1][2]=(((6*10+3)*10+8)*10+5=6385 二.填空题 1.a=1234 b=5 答案分析:C语言规定,使用scanf函数通过键盘输入数据时,除了格式符号和转义字符,其他符号要原样输入。 2.Hello 答案分析:b[5]=0等于b[5]= ' ',是因为字符 的ASCII值就是0,而printf(“%sn”,b);的功能是输出字符串,但遇到空格或 等字符时结束输出,所以答案为Hello。 3.j<3;b[j][i]=a[i][j];i<3 答案分析:通过两个数组下标变量位置的变换来完成程序功能。 4.a[age]++ i=18;i<=25 答案分析:用数组a来存储每个年龄段的人数,并通过a[age]++来实现。5.c[i]=n%base;b[d] 答案分析:十进制整数转换为n进制采用的是除以n取余法,使用变量base存放某个进制的值,c数组存放每次计算的余数。最后一个for循环输出不同进制所对应的数码符号。6.break;i>=8 答案分析:如果找到某个数,则通过break语句终止循环。7.-850,2,0 答案分析:程序功能是查找并输出二维数组中最小值及其下标值。8.a[i]>b[j] i<3 j<5 答案分析:数组a和b的长度可以相等或不等,通过i<3或j<5来看哪个数组的值还没有放进c数组中。 9.a[i][j] j=0;j<4;j++ j==3 printf(“n”); 答案分析:用数组a最后一列,即第4列来保存每行的和,通过printf(“n”);语句来控制按3行来输出。10.fi 答案分析:略 11.GDABC 答案分析:略 12.s[i++] 答案分析:while(s[i])表示当s[i]中的字符不为 时进入循环体,否则退出while循环。 13.ahAMa 答案分析:通过scanf(“%s”,a);给字符数组赋值时遇到空格或回车符号将终止输入。程序功能是将字符串中的字符a,大写变成小写,小写变成大写,其他字符保持不变。14.LBLMNP 答案分析:执行strcat(a,b);语句后,a数组的值为“ABLMNP”,b数组的值为“LMNP”;在执行while(a[j++]!=0)b[j]=a[j];时,b[j]中的j值是前面a[j++]中j++执行后的值,即while循环首先执行b[1]=a[1]= 'B',然后是b[2]=a[2]= ' L',b[3]=a[3]= 'M',„„,b[0]中的字符保持不变,仍是' L'。15.' ' i++ 答案分析:因为while(str[i])是通过字符串末尾的 来判断字符串是否读取结束,所以字符数组str最后要有一个字符串结束符号 。16.b[j]=a[j][0];b[j]=a[j][k] 答案分析:用b数组存储每行中的最大字符,最终b[0]存放第一行字符中的最大字符,b[1] 存放第一行字符中的最大字符,„„。b[j]=a[j][0]的作用是在查找一串字符中最大字符前,先把这串字符第一个字符放到b[j]中,然后通过循环和条件判断来实现最大字符的查找。17.a[k++]=a[j] 答案分析:略 三、编程题 1.参考代码如下: #include int array[31],total=0; int i,j=1; for(i=0;i<30;i++) { array[i]=2*j; j++; total=total+array[i]; } array[30]=total/30; for(i=0;i<31;i++) printf(“%d,”,array[i]);} 答案分析:由于平均值要放在数组array的末尾,所以在定义数组时要多定义一个元素,即array[31]。另,为了保持数组类型一致性,故平均值也只取整数值。2.参考代码如下: #include int i,j,k,a[20],temp; srand(time(NULL)); for(i=0;i<20;i++) { a[i] = rand()% 101;//产生[0,100]之间的随机数,取整后赋给a[i] printf(“%d ”,a[i]); } printf(“n”); for(i=0;i<19;i++) { k=i; for(j=i+1;j<20;j++) if(a[j] if(k!=i)temp=a[i],a[i]=a[k],a[k]=temp; } for(i=0;i<20;i++) printf(“%d ”,a[i]);} 程序分析:略 3.参考代码如下: #include int i,maxi,a[30]; srand(time(NULL)); for(i=0;i<30;i++) { a[i] = rand()% 101; //产生[0,100]之间的随机数,取整后赋给a[i] printf(“%d ”,a[i]); } printf(“n”); maxi=0; for(i=1;i<30;i++)第二篇:《C语言程序设计教程》课后题答案