清华大学 c语言课本习题参考答案
- 格式:doc
- 大小:118.00 KB
- 文档页数:23
第1章习题参考答案1.单项选择题(1)A (2)C (3)D (4)C (5)B2.填空题(1)函数(2)主函数(main)(3)printf() , scanf()第2章习题参考答案1.单项选择题1-5 CBCCC 6-10 CDCDC 11-13 DBB 2.填空题(1)1(2)26(3)6 , 4 , 2(4)10 , 6(5)3.000000(6)双精度(double)(7)9(8)字欧阳与创编母,数字,下划线(9)13.700000(10)11(11)((m/10)%10)*100+(m/100)*10+m%10(12)0(13)10 ,9 ,11(15)(x<0&&y<0)||(x<0&&z<0)||(y<0||z<0)(16)double(17)x==0(18)sqrt(fabs(a-b))/(3*(a+b))(19)sqrt((x*x+y*y)/(a+b))第3章习题参考答案1.单项选择题1-5 CCCDD 6-10 BCDBC 11-15 BCBBB 16 A2.填空题(1)用;表示结束(2){ }(3)y=x<0?1:x==0?0:-1(4)y%4==0&&y%100!=0||y%400==0(5)上面未配对(6)default标号欧阳与创编(7)while ,do while ,for(8)do while(9)本次(10)本层3.阅读程序,指出结果(1)yes(2)*&(3)ABother(4)28 70(5)2,0(6)8(7)36(8)1(9)3,1,-1,3,1,-1(10)a=12 ,y=12(11)i=6,k=4(12)1,-24.程序填空(1)x:y, u:z(2)m=n , m!=0 ,m=m/10(3)t<eps , t*n/(2*n+1) , printf(“%lf\n”,2*s)(4)m%5==0 ,printf(“%d\n”,k)(5)cx=getchar() , cx!=front , cx(6)double s=0 , 1.0/k , %lf(7)s>=0 , s<gmin ,欧阳与创编5.编程题(1).#include <stdio.h>int main(){double x,y;scanf("%lf",&x);if(x<1)y=x;else if(x>=1.0&&x<10)y=2*x-11;elsey=3*x-11;printf("%lf\n",y);return 0;}(2).#include <stdio.h>int main(){double x,y,z,min;scanf("%lf%lf%lf",&x,&y,&z); if(x>y)min=y;elsemin=x;if(min>z)min=z;printf("min=%lf\n",min); return 0;}(3).#include <stdio.h> 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;i<=m;i++){switch(i){case 1:s=d;break;case 2:s=31+d;break;case 3:s=59+d;break;case 4:s=90+d;break;case 5:s=120+d;break; case 6:s=151+d;break; case 7:s=181+d;break; case 8:s=212+d;break; case 9:s=243+d;break; case 10:s=273+d;break; case 11:s=304+d;break; case 12:s=334+d;break;}}if(flag==1&&m>2)s=s+1;s=(w+s)%7;if(s==0)欧阳与创编printf("星期日\n");elseprintf("星期%d\n",s);return 0;}(4).#include <stdio.h>int main(){float p,r;scanf("%f",&p);if(p<=10)r=p*0.1;else if(p>10&&p<=20) r=10*0.1+(p-10)*0.075; else if(p>20&&p<=40) r=10*0.1+10*0.075+(p-20)*0.05;else if(p>40&&p<=60)r=10*0.1+10*0.075+20*0.0 5+(p-40)*0.03;else if(p>60&&p<=100)r=10*0.1+10*0.075+20*0.0 5+20*0.03+(p-60)*0.015; else if(p>100)r=10*0.1+10*0.075+20*0.0 5+20*0.03+40*0.015+(p-100)*0.01;printf("%f\n",r);return 0;}(5).#include <stdio.h>int main(){char c;while((c=getchar())!='\n') {if(c>='a'&&c<='z')c=c-32;putchar(c);}return 0;}(6).#include<stdio.h>int main(){int m,k=2;printf("输入一个正整数:\n");scanf("%d",&m);while(k<m)if(m%k==0){printf("%4d",k);m=m/k;}elsek++;printf("%4d\n",m);return 0;}(7).#include<stdio.h>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;}printf("%d\n",s);return 0;}(8).#include<stdio.h>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).#include<stdio.h>#include<math.h>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<0) {b=x;f2=f;}else{a=x;f1=f;}}while(fabs(f)>=1e-6);printf("%6.2f\n",x);return 0;}(10).#include<stdio.h>#include<math.h>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,%lf\n",n,s);return 0;}(11).#include<stdio.h>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("%u\n",t); return 0;}第4章习题参考答案1.单项选择题1-5 DDDBD 6-10 BADCD 11-14 BDAB2.填空题(1)2(2)嵌套,递归(3)全局变量,局部变量,静态变量,动态变量(4)auto , static , register , extern(5)外部变量(6)编译,运行3.阅读程序,指出结果(1)15(2)5(3)5,4,3(4)i=5i=2i=2i=4i=2(5)求水仙花数(6)-5*5*5(7)30(8)0 101 112 124.程序填空(1)float fun(float , float) , x+y,x-y , z+y,z-y(2)x , x*x+1(3)s=0 , a=a+b5.编程题(1).#include<stdio.h>unsigned int fun(unsignedint);欧阳与创编int main(){unsigned int s;scanf("%u",&s);printf("%u\n",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).#include<stdio.h>#include<stdlib.h>#include<math.h>voidf1(float,float,float,float); voidf2(float,float,float,float); voidf3(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(d>0)f1(a,b,c,d);else if(d==0)f2(a,b,c,d);elsef3(a,b,c,d);return 0;}void f1(float a,float b,float c,float d){float x1,x2;{x1=(-b+sqrt(d))/(2*a);x2=(-b-sqrt(d))/(2*a);printf("%.2f ,%.2f\n",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 ,%.2f\n",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*%.2f\n",x1,x 2);printf("%.2f-i*%.2f\n",x1,x2);}}(3).#include<stdio.h>double p(int,double);int main(){int n;double x;do{scanf("%d",&n);}while(n<0);scanf("%lf",&x);printf("%lf\n",p(n,x)); return 0;}double p(int n,double x) {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).#include<stdio.h>#define RATE 0.053double fun(float);void display(float,int);int main(){float dep;int season;scanf("%f %d",&dep,&seas on);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 %-.2f\n",i,fun(d),fun(d)*i+d);printf("----------------------欧阳与创编---------\n");}}(5).#include<stdio.h> double fun(void);int main(){printf("%lf\n",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).#include<stdio.h>int fun(int);int main(){int w;scanf("%d",&w);printf("%d\n",fun(w)); return 0;}int fun(int w){int n=1,p=1,m;m=w;while(m>10){m=m/10;p=p*10;n++;}return w%p;}欧阳与创编第5章习题参考答案1、选择题:1-5 C (B C) BBA 6-8 DDB2、填空题(1)0,9(2)float realArray[100],char strArray[16],int intArray[1000](3)运算符 sizeof(4) 6字节3、阅读程序,写出下面程序的运行结果(1) aabbcc dd(2) abcd(3)ahAMa(4)0010(5) 1 3 4 5(6)This is the title.Name 1 is RosalindaName 2 is ZekeThe biggest name alpabetically is ZekeBoth names are Rosalinda Zeke(7)0 0 0 0 0 0 0 00 1 2 3 4 5 6 70 2 5 6 8 10 748 140 3 6 9 12 15 18 210 4 8 12 16 20 24 280 5 10 15 20 177 30 350 6 12 18 24 30 36 420 7 14 21 28 35 42 494、程序填空(1) a[i][j] != a[j][i] , 1(2) 0, a[i] < a[mini] , maxi = i , a[maxi] = a[mini](3) int a[], int b[], b[i] = a[i], -999, arraycopy(a,b), b[i++] (4) a<sizeof(ch), if5、编程题(1)#include<stdio.h>int main ( ){1 int a[3][4] = {0, 2,9,7,5,13,6,8,27,11,1,3};int i,j,temp;for(i=0,j=0;j<4;j++){temp = a[2-i][j];a[2-i][j] = a[i][j];a[i][j] = temp;}for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%3d",a[i][j]);printf("\n");}return 0;}(2)#include<stdio.h>int main ( ){static int a[6][6];int i,j,t=1;for(i=0;i<6;i++){t = i+1;for(j=0;j<i+1;j++)a[i][j] = t--;}for(i=0;i<6;i++){for(j=0;j<6;j++)printf("%3d",a[i][j]);printf("\n");}return 0;}(3)#include <stdio.h>#define M 3#define N 4#define R 5int main( ){static int a[M][N],b[N][R],c[M][R]; int i,j,k;2 printf("Matrix a:\n");for( i = 0; i < M; i++ )for( j = 0; j < N; j++ )scanf( "%d",&a[i][j] );printf("Matrix b:\n");for( i = 0; i < N; i++ )for( j = 0; j < R; j++ )scanf( "%d",&b[i][j] );for( i = 0; i < M; i ++ )for( j = 0; j < N; j++ )for( k = 0; k < R; k++)c[i][k] += a[i][j]*b[j][k];for( i = 0; i < M; i++ ){for( j = 0; j < R; j++ )printf( "%3d",c[i][j] );printf("\n");}return 0;}(4)#include <stdio.h>#define M 5int main( ){static int a[M];int i,max = -1,min = 100,maxi,mini,temp; for( i = 0; i < M; i++ )scanf( "%d",&a[i] ); //0~99间的值for( i = 0; i < M; i++ ){if( max < a[i] ){max = a[i];maxi = i;}if( min > a[i] ){min = a[i];mini = i;}}temp = a[maxi];a[maxi] = a[mini];a[mini] = temp;for( i = 0; i < M; i++ )printf( "%3d",a[i] );return 0;}3(5)#include <stdio.h>#define M 3#define N 4int main( ){static int a[M][N];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",&a[i][j] );sumrow += a[i][j];}if ( max < sumrow ){max = sumrow;maxi = i;}}printf("which col sum will be caculated?(>0)");scanf("%d",&col);for( i = 0; i < M; i ++ )sumcol += a[i][col-1];printf("The %dth row's sum is max, max=%d\n",maxi+1,max); printf("The %dth column's sum=%d\n",col,sumcol);return 0;}(6)#include <stdio.h>#define M 81int main( ){static char str[M];int i,count = 0;char ch;gets(str);fflush(stdin); //清空输入缓冲区,以便读入字符数据printf("Which character will be found?");ch = getchar();for( i = 0; i < strlen(str); i++ )if( ch == str[i] )count++;printf( "The number of character '%c' is %d\n",ch,count );4 return 0;}(7)#include <stdio.h>#include <stdlib.h>#define N 10 //同学人数#define M 5 //课程数void enter_scores(void);void sort_scores(int score[][M], int average[N][3]);void disp_scores(int score[][M]);void histogram(int n, int score[][M]);void printchar(int n);static int score[N][M];static int aver[N][3]; //第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; i<N; i++) {for(j=0; j<M; j++){scanf("%d",&score[i][j]);aver[i][0] += score[i][j];}}for( i = 0; i < N; i++ )for ( j = 1; j < 3; j++ )5 aver[i][j] = i;}/* 成绩排序. */void sort_scores(int score[][M], int average[N][3]){int i,j,t;int temp,tempindex;for( i = 0; i < N - 1; i++ )for( j = 0; j < N - 1 - i; j++ )if ( average[j][0] < average[j+1][0] ){temp = average[j][0];average[j][0] = average[j+1][0];average[j+1][0] = temp;tempindex = average[j][2];average[j][2] = average[j+1][2];average[j+1][2] = tempindex;}printf("\n Score1 Score2 Score3 Score4 Score5\n"); for( i = 0; i < N; i++ ){t = average[i][2];for( j = 0;j < M; j++ ){printf("%8d", score[t][j]);}printf("\n");}}/* 输出成绩 */void disp_scores(int score[][M]){int i, j;printf("\n Score1 Score2 Score3 Score4 Score5\n"); for( i = 0; i < N; i++ ){for( j = 0;j < M; j++ )printf("%8d", score[i][j]);printf("\n");}}void printchar(int n){6 int i;for (i = 0; i < n; ++i) putchar('*');}void histogram(int course, int score[][M]){int i,temp;int segs[5] = {0};int sc[N];for( i = 0; i < N; i++ )sc[i] = score[i][course];for (i = 0; i < N; i++)/* 统计各分段人数 */{temp = (int)sc[i]/10;segs[ temp<6?0:temp-5]++; /* 成绩/10,将成绩分段 */}printf("\nSegment Number\n");for (i = 0; i < 5; i++) /* 输出直方图,每段的人数 */{printf("<%3d: %5d| ", (i+1)*10+50, segs[i]);printchar(segs[i]);putchar('\n');}putchar('\n');}(8)#include <stdio.h>#define M 81int main( ){static char str[M];int i,count = 0;char ch = 0;gets(str);for( i = 0; i < strlen(str); i++ )if( ch < str[i] )ch = str[i];for( i = 0; i < strlen(str); i++ )if( ch == str[i] )count++;printf( " max = '%c' ,count = %d\n",ch,count );return 0;}7第6章习题参考答案1、选择题:1-5 BBDDA 6-10 CCABD 11-15 CBCDA 16A2、填空题(1)常量,变量(2)指针(3)2(4)12,12(5)a[0],a[3]3、阅读程序,写出下面程序的运行结果(1)5(2)6(3) abcdefglkjih(4) 976531(5)5,9(6)2,4,5,7,6,0,11,9,7,3,(7)string_a=I am a teacher.string_b=You are a student.string_a=I am a teacher.string_b=I am a teacher.4、程序填空(1) *p != '\0', *p-'0', j—(2) i <strlen(str), j=i, k+1(3)a+i, (char)(n%10) + '0'(4)*pk = i, a,n,i+1,pk(5) s1++, *s2, s1=p5、编程题(1)#include <stdio.h>int main(){int a=3,b=7,c=2;int *ptra = &a,*ptrb = &b,*ptrc = &c;int temp;printf("a=%d,b=%d,c=%d\n",a,b,c);printf("*ptra=%d,*ptrb=%d,*ptrc=%d\n",*ptra,*ptrb,*ptrc); if ( *ptra > *ptrb ){temp = *ptra;*ptra = *ptrb;1 *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=%d\n",a,b,c);printf("*ptra=%d,*ptrb=%d,*ptrc=%d\n",*ptra,*ptrb,*ptrc); return 0;}(2)#include <stdio.h>#include <stdlib.h>void inputdata(int a[],int n);void process(int a[],int n);void outputdata(int a[],int n);int main(){int a[10],n=10;inputdata(a,n);outputdata(a,n);process(a,n);outputdata(a,n);system("Pause");return 0;}void inputdata(int a[],int n) //0~99之间的数{int i;for( i = 0; i < n; i++ )scanf("%d",a+i);}void outputdata(int *ptr,int n){int i;2 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) ){max = *(ptr+i);maxi= i;}if ( min > *(ptr+i) ){min = ptr[i];mini= i;}}if ( mini != 0){i = ptr[0];ptr[0] = ptr[mini];ptr[mini] = i;}if (maxi != n-1){i = ptr[n-1];ptr[n-1] = ptr[maxi];ptr[maxi] = i;}if (maxi == 0 && mini == n-1){i = ptr[maxi];ptr[maxi] = ptr[mini];ptr[mini] = i;}}(3)#include<stdio.h>3int strLength (char *);int main(){static char str[81];gets(str);printf("string "%s" length:%3d\n",str,strLength(str)) ; system("Pause");return 0;}int strLength (char *s){char *p=s;while (*p) p++ ;return (p-s) ;}(4)#include <stdio.h>#define M 3#define N 4void Transpose (int (*a)[N],int (*T)[M]);int main( ){static int a[M][N],T[N][M];int i,j;for( i = 0; i < M; i++ )for( j = 0; j < N; j++ )scanf( "%d",&a[i][j] );printf("\n======Oringinal Matrix Start=========\n");for( i = 0; i < M; i ++ ){for( j = 0; j < N; j++ )printf( "%4d",a[i][j] );printf("\n");}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",T[i][j] );printf("\n");}4 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++ )T[i][j] = a[j][i];}(5)#include <stdio.h>int main(){static char source[81],target[81];int result;gets(source);gets(target);result = Strcmp(source,target);if (result){if( result < 0 )printf("%s < %s\n",source,target);elseprintf("%s > %s\n",source,target);}elseprintf("%s = %s\n",source,target); return 0;}int Strcmp(char *s,char *t){while (*s && *t && (*s == *t)) {s++;t++;}return *s - *t;}(6)#include <stdio.h>5#define M 5#define N 3int sum (int *a)int main()。
《C程序设计》课外作业及参考答案说明:(1)章节顺序按照PowerPoint电子教案;(2)教材上的作业注明了章节和题号;(3)所用教材是《C程序设计(第二版)》谭浩强清华大学出版社;第一章C语言概述1.1 简答题:写出C语言的主要特点(教材习题1.1)。
1.2填空题:1.C语言与操作系统并称“栾生兄弟”。
2.C语言俗称为形式。
3.C源程序文件经过处理后产生目标文件,目标文件经处理后生成可执行文件。
1.3 单项选择题1. 以下说法中正确的是。
(A)C语言程序总是从第一个定义的函数开始执行(B)在C语言程序中,要调用的函数必须在main函数中定义(C)C语言程序总是main函数开始(D)C语言程序中的main函数必须放在程序的开始部分2. 以下正确的C标识符是。
(A)_125 (B)C# (C)C++ (D)A$1.4 多项选择题1. 以下关于C语言的说法中,错误的是。
(A)俗称为“低级语言的高级形式”,因此功能简单(B)不是结构化程序设计语言(C)可能直接访问内存(D)语法限制不严2. 以下标识符属于C语言关键字的有。
(A)integer (B)else (C)include (D)while第二章C语言基本数据类型、变量、常量与表达式2.1简答题1.求下面算术表达式的值。
(教材习题3.9)a)x+a%3*(int)(x+y)%2/4设x=2.5, a=7, y=4.7b)(float)(a+b)/2+(int)x%(int)y设a=2, b=3, x=3.5, y=2.52.写出下面程序的运行结果。
(教材习题3.10)main(){ int i, j, m, n;i=8; j=10; m=++i; n=j++;printf("%d,%d,%d,%d", i, j, m, n);}3.写出下面表达式运算后a的值,设原来a=12。
设a和n已定义为整型变量。
(教材习题3.12)a)a+=a b) a-=2 c) a*=2+3b)d) a/=a+a e) a%=(n%=2), n的值等于5 f) a+=a-=a*=a4.C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?2.2 填空题1. 写出下面各逻辑表达式的值。
《C语言程序设计》课后习题参考答案第1章C语言及程序设计概述1.单选题(1)A (2)B (3)A (4)B (5)C2.填空题(1)//,/*…*/(2)scanf()(3)printf()3.判断题(1)对(2)错(3)错(4)对第二章:数据类型运算符与表达式1.单选题(1)C (2)D (3)C (4)B (5)C (6)A (7)B (8)D (9)A(8)D(9)A(10)B(11)C(12)C(13)D(15)B(16)C(17)A(18)A(19)B(20)C(21)C(22)D(23)C(24)A(25)D(26)B(27)C(28)B(29)B(30)A2.填空题(1)sqrt(pow(y,x)+log10(y)) (2)36(3)6(4)3 3(6)36(7)int x=8,y=8;(8)1(9)E(10)6,7,8,9(11)6(12)66,96(13)240(14)1,1,-1,-1(15)5,2,6(16)1(17)!(18)2(19)(a>0&&a<101)&&(a%3==0||a%7==0) (20)A3.程序分析题(1)2 72 74 94 412 12116(3)100 d 68 D97 a 49 1 (4)0 1 0 1 (5)2 4 6 7-0.58 7046.587.5(6)33 12 113 13 082 32(7)618 30181814.改错题(1)①无初始赋值,不能输出②数据精度丢失③少“;”号④单字符变量不能保存字符串常量⑤不能连续初始化⑥非法标识符(2)short i=38000溢出PI=3.1416 常量不能修改值Printf(“%d”,x%y) %必须是整数a*=(b+c)/=d符合赋值左边不能是表达式第三章:算法概念与顺序结构程序设计1.选择题(1)D(2)B、D(3)D(4)B(5)C(6)A(8)C(9)B(10)D2.填空题.(1)一条语句;(2)小于左右(3)%%(4)输出项列表输出控制符(5)取地址取a的地址(6)从盘获取一个字符(7)大括号(8)f=68.00(9)n1=%d\n n2=%d(10)7,5,c=33.程序分析题.(1)i=100,c=a,f=1.234000(2)65535,65536(10)1234,123.5,12345.5第四章:选择结构程序设计(1)C (2)B (3)B (4)B (5)D (6)D (7)D (8)A (9)B (10)A (11)B (12)B (13)D (14)A (15)C (16)A (17)C (18)D (19)B (20)D (21)A(23)A(24)A2.填空题.(1)1(2)5 8 8(3)4 5 99(4)2(5)10 20 0(6)2 1(7)-4(8)3(9)No(10)25(11)45 45(12)0(13)5.5(14)13(15)3第五章:循环结构程序设计(1)C(2)A(3)D(4)B(5)D(6)B(7)A A或B(8)输出4444(9)B(10)A(11)B(12)C(13)A(14)B2.填空题.(1)r=m;m=n;n=rm%n(2)3(3)-5(4)i%3==2&&i%5==3&&i%7==2 j==5j!=k(6)int s=8,j=i+2k+i+j==8(7)8(8)k&&i<=500 k/10 continue第六章:数组1.选择题(1)B(2)C(3)D(4)D(5)B(6)C(7)B(8)A(9)A(10)D2.填空题.(1)按行序优先的原则(2)0 9(4)1 2(5)6(6)前者以回车后者以空格或回车作为间隔符(7)gets()(8)&a[i](9)char k -1(10)9 83.程序分析题.(1)1 3 7 15(2)0 0 0(3)读取输入字符串中数字字符(4)①if(str1==str2) (strcmp(str1,str2)==0)②&c1[0]③m[i][k-1]第七章:函数的调用1.选择题(1)B(2)C(3)C(4)A(6)D(7)D(8)D(9)B(10)D(11)A(12)A(13)B(14)B2.填空题.(1)有参无参(2)顺序类型(3)定义调用(4)①fmax(a,N) ②s[k]=s[p](5)①age(n-1)+2 ②age(5)(6)①prt(c,n-1) ②prt(…‟,n-i) ③prt(…*‟,2*i-1) 3.程序分析题.(1)h l o(2)3(3)2 6(4)5 25。
习题1参考答案一、单项选择题1. A2. C3. D4. B5. C、A6. C、B7. B8. D9. B 10. B二、填空题1.线性结构,非线性结构2.集合,线性,树,图3.一对一,一对多或多对多4. 时间,空间5. 前趋,一,后继,多6. 有多个7. 一对一,一对多,多对多8. O(2n)9. O(n)10. O(2n)11. O(log3n)12. 程序对于精心设计的典型合法数据输入能得出符合要求的结果。
13. 事后统计,事前估计三、算法设计题1. O(2n)2. O(2n)3. O(n3)4. O(n)5. O(n)习题2参考答案一、单项选择题1.A 2.A 3.D 4.C 5.D 6.A 7.B 8.B 9.C 10.A 11.D 12.B 13.C 14.B 15.C 16.C 17.B 18.D 19.C 20.A二、填空题1.线性2.n-i+1 3.相邻4.前移,前,后5.物理存储位置,链域的指针值6.前趋,后继7.顺序,链接8.一定,不一定9.线性,任何,栈顶,队尾,队头10.单链表,双链表,非循环链表,循环链表11.使空表和非空表统一;算法处理一致12.O(1),O(n)13.栈满,栈空,m,栈底,两个栈的栈顶在栈空间的某一位置相遇14.2、3;15.O(1)三、简答题1.头指针是指向链表中第一个结点(即表头结点)的指针;在表头结点之前附设的结点称为头结点;表头结点为链表中存储线性表中第一个数据元素的结点。
若链表中附设头结点,则不管线性表是否为空表,头指针均不为空,否则表示空表的链表的头指针为空。
2.线性表具有两种存储结构即顺序存储结构和链接存储结构。
线性表的顺序存储结构可以直接存取数据元素,方便灵活、效率高,但插入、删除操作时将会引起元素的大量移动,因而降低效率:而在链接存储结构中内存采用动态分配,利用率高,但需增设指示结点之间关系的指针域,存取数据元素不如顺序存储方便,但结点的插入、删除操作较简单。
习题 9一.选择题1. A2. A3. A4. A5.B6.C二编程题9.2 编写一函数,判断N×N矩阵是否为上三角阵。
上三角阵是指不含主对角线,下半三角都是0的矩阵。
#include <stdio.h>int fun(int x[][3],int n){int flag=1,i,j;for(i=1;i<n;i++)for(j=0;j<i;j++)if(x[i][j]!=0){flag=0;break;}return flag;}void main(){int a[3][3]={{1,4,5},{0,2,6},{0,0,3}};int result=fun(a,3);if(result==1)printf("此矩阵是上三角矩阵!\n");elseprintf("此矩阵不是上三角矩阵!\n");}9.3 有一个字符串,包含n个字符,将字符串从第i 个字符到第j个字符间的字符逆置。
程序代码:#include <stdio.h>#include <string.h>void invertsub(char *str,int i,int j){char *p,*q,c;int n=0;p=q=str;if(str==NULL)printf("str is NULL!\n");else if(i<=0||j>strlen(str))printf("i and j value error!\n");else {while(*p!='\0'&&n!=i-1){ p++;n++; }q=p;while(*q!='\0'&&n!=j-1){q++;n++;while(p<q){c=*p;*p++=*q;*q--=c;}}}void main(){char str[]="abcdefg";printf("%s\n",str);invertsub(str,2,5);printf("%s\n",str);}9.4 题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数.程序源代码:main(){int number[20],n,m,i;printf("the total numbers is:");scanf("%d",&n);printf("back m:");scanf("%d",&m);for(i=0;i<n-1;i++)scanf("%d,",&number[i]);scanf("%d",&number[n-1]);move(number,n,m);for(i=0;i<n-1;i++)printf("%d,",number[i]);printf("%d",number[n-1]);}move(array,n,m)int n,m,array[20];{int *p,array_end;array_end=*(array+n-1);for(p=array+n-1;p>array;p--)*p=*(p-1);*array=array_end;m--;if(m>0) move(array,n,m);}9.5 输入n个整数,将最小数与第一个数对换,把最大数与最后一个数对换程序源代码:main(){int number[10];input(number);max_min(number);output(number);}input(number)int number[10];{int i;for(i=0;i<9;i++)scanf("%d,",&number[i]);scanf("%d",&number[9]);}max_min(array)int array[10];{int *max,*min,k,l;int *p,*arr_end;arr_end=array+10;max=min=array;for(p=array+1;p<arr_end;p++)if(*p>*max) max=p;else if(*p<*min) min=p;k=*max;l=*min;*p=array[0];array[0]=l;l=*p;*p=array[9];array[9]=k;k=*p;return;}output(array)int array[10];{ int *p;for(p=array;p<array+9;p++)printf("%d,",*p);printf("%d\n",array[9]);}9.6 输入n个字符串,按由小到大顺序输出。
【习题1】一、简答题(在课本中寻找答案,略)1.1 C程序的基本结构包括哪些内容?1.2 如何定义标识符?1.3 输入格式、输出格式的组成包括哪些内容?1.4 C语言函数分为哪两类?1.5 计算表达式的值应该考虑哪些方面?1.6 上机调试程序的步骤如何?二、判断并改错1.7 C程序执行的入口是main()函数,所以main函数必须放在程序的开头。
错误:main函数可以放在程序的任何位置。
并不限定在程序的开头。
1.8 定义一个函数包括数据说明部分和执行语句部分,两者可以交叉出现。
错误:不可以交叉出现,数据说明部分在执行语句部分的前面。
1.9 编辑与编译不是一回事。
错误:不是一回事。
编辑完成源程序的输入和修改;编译是对源程序进行语法检查,如果无语法错误,则生成目标程序。
1.10 scanf("%d,%d",&x,&y);的正确输入格式:3,4<回车>。
正确1.11 注释内容太多会影响程序的执行效率。
错误:不会影响程序的执行效率。
因为在编译时,编译系统将注释内容删除或用空格代替,所以注释内容不会编译到目标程序中。
1.12 所有的数学公式可以直接出现在源程序中。
错误:数学公式需要转换成C语言能够接受的公式才能出现在源程序中。
三、编程题1.13 在屏幕上输出自己名字的拼音。
提示:中文名字叫“张三”,对应的拼音为“Zhang San”,输出用printf()函数。
1.14 输入圆的半径,求圆的周长,并将结果保留两位小数输出到屏幕上。
提示:定义圆的半径r,圆的周长:2*3.14*r,输出结果保留2位小数可以用%.2f1.15 输入两个整数,输出其中最大者。
提示:模仿例1.31.16 输入三个整数,输出其中最小者。
提示: min(min(a,b),c);【习题2】一、简答题(在课本中寻找答案,略)2.1 常量与变量的区别?2.2 C语言中的标识符的定义规则?2.3 变量为什么要“先定义,后使用”?2.4 字符常量'a'与字符串常量"a"有何区别?2.5 大小写字母转换的规则是什么?2.6 变量的具有哪三种属性?二、单项选择题2.7 C语言中,int型数据在内存中的存储形式是(D)。
数据结构(C语言版)清华大学出版社课后题1-5章答案第一章选择题1.A2.B3.C4.D5.B6.C第二章选择题1.A2.D3.D4.C5.A6.C7.B8.B9.D 10.D应用题1.应该选用链接存储表示。
如果才用顺序表示法,必须在一个连续的可用空间中为这N 个表分配空间。
初始时候因为不知道哪个表增长得快,必须平均分配空间。
在程序运行过程中,有的表占用的空间增长得快,有的表占用空间增长得慢,有的表很快就使用完了分配给它的空间,有的表才占用了少许空间,在进行元素的插入时候就必须成片的移动其他表的空间,以空出位置进行插入;在元素删除时为填补空白,也可能移动许多元素。
这个处理过程及其繁琐和低效。
如果采用链接存储,一个表的空间可以连续也可以不连续。
表的增长通过动态分配内存得以解决,只要存储器未满,就不会发生表溢出;表的收缩可以通过动态存储释放实现,释放的空间还可以在以后动态分配给其他的存储需求,非常灵活方便。
对于N个表(包括表的总数可能变化)共存的情形,处理十分简单快捷,插入、删除时间复杂度为O(1)。
所以才用链接存储表示较好。
2.一般来说,链式存储结构克服了顺序存储结构的三个缺点。
首先,插入、删除操作不需要移动元素,只修改指针;其次,不需要预先分配空间,可根据需要动态申请空间;其三,表容量只受到内存空间的限制。
其缺点是因为指针增加了空间开销,当空间不允许时,就不能克服顺序存储的缺点。
3.顺序结构时ai与ai+1的物理位置相邻,链表结构时两者的位置不要求一定相邻。
7.在顺序表中插入和删除一个节点需平均移动全表一半的节点。
具体的移动次数取决于所插入和删除的节点的位置i和全表的长度n这两个因素。
算法设计题1.分析:遍历整个顺序表,用k记录在x~y之间元素的个数,k的初始值为0。
对于当前遍历到的元素,若其值在x~y之间,则前移k个位置;否则执行++k。
这样每个不在x~y之间的元素仅仅移动一次,所以效率较高。
第1 章习题答案二、单项选择题1.A2.A3. C4.B5.A6.B7.B8. A三、填空题1. .C .CPP .OBJ .EXE2. 主3. #include<iostream >, using namespace std, #include<stdio.h>4. 顺序结构,选择结构,循环结构5.{, }, 函数说明, 函数执行,不能省略,void第2章习题答案一、单项选择题1.B2.B3.A4.C5. C6. A7.B8.C9. D 10. D11. B 12.A 13. B 14.C 15. D二、填空题1. x>20&&X<30||X<-1002. x>y或a>b3. 14. auto 、register 、static 与extern5. 函数体内.6. int float double7. 2 18. . 是最右边表达式的值9. 710. 先使用后自增,先自增后使用11.右结合12.变量的数据类型、变量的存储类型、变量名13.是否整除14.此之外全局变量,静态局部变量15.count三、写出程序运行结果1、2,12、6,8,6,73、n=14、15、n=-46、x=3,a=2,b=37、08、i=6,d=129、2147483647,-2147364810、x=3,y=5第3章习题答案一、单项选择题1.D2.B3.B4.C5.D6.D7.B8.B9.C 10.A二、写出程序运行结果1. 1202. s=633. 01234the loop break out.4. freight= 58800005. sum=1sum=3sum=9sum=33三、程序填空1. i++ i<=102. i<100 i%3!=03. x!=-1 x<min4. i++,2*i-1 \n5. i=1 j<=i i*j四、编程题1.void main(){char ch1;ch1=getchar();if(ch1>'0'&&ch1<'9')printf("这是一个阿拉伯数字,朋友再见!\n"); elseprintf("这不是一个阿拉伯数字,朋友再见!\n");2.main(){int x,y;scanf("%d",&x);if(x<0)y=x;elseif(x>=10)y=3*x-11;elsey=2*x-1;printf("\nx=%d,y=%d\n",x,y);3.main( ) {char grade;grade=getchar();switch(grade){ case 'A': printf(">=90"); break;case 'B': printf("80~89"); break;case 'C': printf("70~79");break;case 'D': printf("60~69"); break;case 'E': printf("0~59");4.void main(){char ch1;ch1=getchar();if(ch1>'a'&&ch1<'z')printf("这是一个英文大写字符,朋友再见!\n"); else if(ch1>'A'&&ch1<'Z')printf("这是一个英文小写字符,朋友再见!\n");5.void main(){int n,a,b,c;for(n=100;n<=999;n++){a=n/100;b=(n-a*100)/10;c=n%10;if(n==a*a*a+b*b*b+c*c*c)printf("%d,",n);6. main()int a,b,c,d,t;scanf("%d,%d,%d,%d",&a,&b,&c,&d);printf("\na=%d,b=%d,c=%d,d=%d\n",a,b,c,d); if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(a>d){t=a;a=d;d=t;}if(b>c){t=b;b=c;c=t;}if(b>d){t=b;b=d;d=t;}if(c>d){t=c;c=d;d=t;}printf("%d,%d,%d,%d",a,b,c,d);7. #include <math.h>main(){float e=1.0,t=1,n=1;while(fabs(1/t)>1e-6) {e=e+1/t; n=n+1; t=t*n; }printf("e=%f\n",e);8. main(){int i,j;for(i=1;i<=4;i++) {for(j=1;j<=i+30;j++) printf(" "); //定打印*的位置,打在屏幕中央,从第31列开始printf("*");for(j=1;j<=2*(4-i);j++)printf(" "); //两个*间的空位数printf("*");printf("\n");9. main(){ int i,a,b,c,n=0;for(i=100;i<=999;i++){a=i%100;c=i%10;b=i-a*100-c;if(i%11==0&&(a==b||b==c||c==a)){ printf("%d ",i); n+=1;10. main(){int d=0,a=2;float m,s=0;do{a=2*a;m=0.8*a;s=s+m;d++;}while(a<=100);printf("%f\n",s/d);第4习题答案一、A.D.A.B.A.D.B.B.B。
第1章习题一、选择题1、A2、D3、C4、D5、B6、C7、C8、B9、B 10、A二、填空题1、一,函数体2、main(主),main(主)3、编译,目标4、.c,.obj,.exe5、缩进,无影响,/* */三、程序分析题1、*****************Very good!*****************2、a=12,b=5a=17,b=223、r= 5.50,s=95.033098四、编程题1.用printf()函数在屏幕上输出自己的班级、学号、姓名。
#include"stdio.h"void main(){printf("班级:BX1109\n");printf("学号:111003530901\n");printf("姓名:王孟荣\n");}2.从键盘输入两个整数,计算它们的和、差、积、商,并在屏幕上输出结果。
#include<stdio.h>void main(){int x,y,a,b,c;float d;printf("Please Input Two Integers:\n");scanf("%d%d",&x,&y);a=x+y;b=x-y;c=x*y;d=1.0*x/y;printf("a=%d\nb=%d\nc=%d\nd=%f\n",a,b,c,d);}第2章习题一、选择题1~5 BCDCD6~10 DBBCA二、填空题1.单精度浮点型、双精度浮点型、字符型2.03.x%10*10+x/104.5.55.5.7 206.sin(sqrt(x*x))/(a*b)7.,8.1111011 173 7B9.3 310.3三、程序分析题1.7,8,102.1,33. 5 F4.(int)i=12, 12.505. 461579112四、编程题1.编写程序,求表达式c=21%9-(float)a+4/b*b的值,假设表达式中a和b 的值分别由键盘输入。
#include<stdio.h>void main( ){int a,b;float c;printf("Please input data a,b: ");scanf("%d%d",&a,&b);c=21%9-(float)a+4/b*b;printf("c=%5.2f\n", c);}2. 编写程序,从键盘输入两个整数存入变量a和b中,求a2-b2的值并输出。
#include<stdio.h>void main( ){int a,b,c;printf("Please input data a,b: ");scanf("%d%d",&a,&b);c=a*a-b*b;printf("c=%d\n", c);}第3章习题 一、选择题二、填空题1. 有穷性 确定性 可行性2. #3. 从终端(键盘)输入一个字符4. m d5. 97,g6. 123.456000, 123.46, 1237. 格式控制符不正确(输入数据时不能控制列宽和小数位数) 8. 63,63,77,3f 9. %f%f &x,&y10. <stdio.h> ch ch三、程序分析题1. c=112. a=123 f=4573. x=345y=3.460000 4. a=1,b=3 a=3,b=15. (题目需修改为:从键盘输入一个除a 和z 以外的小写字母)程序的功能:从键盘输入一个除a 和z 以外的小写字母,求出该字母对应的大写字母的前趋和后继字母,然后顺序输出此三个大写字母,每个字母所占列宽为3。
运行结果: 假如输入:f输出: E F G四、编程题1.编写程序,计算)(322b a bax ++=的值并输出(保留3位小数),其中a 、b 的值由键盘输入。
#include <stdio.h> #include<math.h> void main( ) { float a, b,x;scanf("%f%f", &a, &b);x=(a*a+b*b)/sqrt(3*(a+b));printf("x=%.3f\n",x);}2.编写程序,从键盘输入一个梯形的上底a、下底b和高h,输出梯形的面积s。
#include <stdio.h>#include<math.h>void main( ){ float a, b,h,s;scanf("%f,%f,%f", &a,&b,&h);s=(a+b)*h/2;printf("梯形面积s=%.2f\n",s);}3.编写程序,在屏幕上输入你姓名的第一个字母,显示出该字母以及下面的信息:Hello!This is a c program.My name is [第一个字母]#include <stdio.h>void main( ){char name;name=getchar();putchar(name);printf("\nHello!\n");printf("This is a c program.\n");printf("My name is %c\n",name);}第4章习题一、选择题二、填空题1. ! && ||2. 13. a b4. 15. 06. x%4= =0 && x%100!=0G:\7. 5 68. A9. x<0 || x>10 && x<5010. -1三、程序分析题1.No2.-23. 5324.#&5.(1)2(2)3CCa=2,b=2,c=4四、编程题1. 有一个函数如下:x2-2 (x<5)y= 3x+5 (5≤x<50)x-1x(x≥50)4编写程序,输入x的值,计算相应的y值输出(保留3位小数)。
#include<stdio.h>#include<math.h>void main(){ float x,y;scanf("%f", &x);if(x<5) y=x*x-2;else if(x<50) y=3*x+5;else y=x-sqrt(4*x-1);printf("x=%f, y=%.3f\n", x,y);}2.编写一个程序,根据输入的三角形的三条边判断是否能组成三角形,如果可以则输出它的面积和三角形类型(等边、等腰、直角、一般三角形)。
#include<stdio.h>#include<math.h>void main( ){ float a, b, c, s, area;scanf("%f,%f,%f", &a,&b,&c);if(a+b>c && b+c>a && a+c>b){ s=(a+b+c)/2;area=sqrt(s*(s*(s-a)*(s-b)*(s-c)));printf("area=%f\n",area);if(a==b && b==c)printf("等边三角形\n");else if(a==b || a==c || b==c)printf("等腰三角形\n");else if((a*a + b*b== c*c)||(a*a + c*c== b*b)||(b*b + c*c == a*a))printf("直角三角形\n");else printf("一般三角形\n");}else printf("不能组成三角形\n");}3.设奖金税率r有如下的要求(n代表奖金) :0 n<10005% 1000≤n<2000r=8% 2000≤n<300010% 3000≤n<600015% 6000≤n用switch多分支选择语句编写程序,输入奖金值,计算并输出相应的税率和实际应得奖金值。
#include<stdio.h>void main( ){ float n, r, s;int m;printf("请输入奖金值:");scanf("%f", &n);if(n>=6000) m=6;else m=n/1000;switch(m){ case 0: r=0; break;case 1: r=0.05; break;case 2: r=0.08; break;case 3:case 4:case 5: r=0.1; break;case 6: r=0.15; break;}s=n-r*n;printf("税率r=%.0f%%, 奖金值n=%.2f, 实际应得奖金值s=%.2f\n",r*100, n, s);}4. 从键盘输入任意4个数a、b、c、d,按照从大到小的顺序排列后重新输出。
#include<stdio.h>void main( ){ int a, b, c, d,t;scanf("%d,%d,%d,%d", &a,&b,&c,&d);if(a<b){t=a;a=b;b=t;}if(a<c){t=a;a=c;c=t;}if(a<d){t=a;a=d;d=t;}if(b<c){t=b;b=c;c=t;}if(b<d){t=b;b=d;d=t;}if(c<d){t=c;c=d;d=t;}printf("%d %d %d %d\n", a,b,c,d);}5. 给出一个不超过4位数的正整数,判断它是几位数,并按逆向输出各位数字。
例1234,输出为4321。
#include<stdio.h>void main( ){ int num,i,j,k,m;printf("输入一个少于4位的正整数:");scanf("%d",&num);if(num>=0 && num<=9999){ if(num>1000 && num<=9999){ printf("是一个4位数\n");m=num%10; /*求个位上的数字*/k=num/10%10; /*求十位上的数字*/j=num/100%10; /*求百位上的数字*/i=num/1000; /*求千位上的数字*/printf("逆序数为:%d%d%d%d\n",m,k,j,i);}else if(num>=100){ printf("是一个3位数\n");m=num%10; /*求个位上的数字*/k=num/10%10; /*求十位上的数字*/j=num/100; /*求百位上的数字*/printf("逆序数为:%d%d%d\n",m,k,j);}else if(num>=10){printf("是一个2位数\n");m=num%10; /*求个位上的数字*/k=num/10; /*求十位上的数字*/printf("逆序数为:%d%d\n",m,k);}else{printf("是一个1位数\n");printf("逆序数为:%d\n",num);}}else printf("是一个无效的数\n");}第5二填空题1. 循环switch2. 4,73. 64. # #5. 0 26. 187. 18. sum=809. c=getchar()n:m10.i %13= =0break三程序分析题1. output1:21 6output2: 5 6output3: 5 7 72. n=73. Max=18Min=34. 1*1=12*1=2 2*2=43*1=3 3*2=6 3*3=95. 0 1 2 31 2 3 0 2 3 0 1 3 0 1 2四、编程题1. 从键盘上输入若干字符,以按Enter 键结束,统计其中字符A 或a 的个数。