一、改错题
1.随机输入10个数,选出其中最小数。程序如下:
main()
{int i,min,a[10];
printf(\"input 10 numbers:\\n\");
for(i=0;i<=10;i++) /*$ERROR1$*/for(i=0;i<10;i++) or for(i=0;i<=9;i++)
scanf(\"%d\/*$ERROR2$*/ scanf(\"%d\
min=a[0];
for(i=1;i<10;i++)
if(a[i] } 2.不用strcat函数,将键盘输入的两个字符串连接起来形成一个新串。 main() {char s1[50],s2[20]; int I,j=0; printf(\"Enter string No.1:\\n\"); gets(s1); printf(\"Enter string No.2:\\n\"); scanf(\"%s\/*$ERROR1$*/scanf(\"%s\ for(i=0;s1[i]!=0;i++); /*$ERROR2$*/ for(i=0;s1[i]!='\\0';i++) while((s1[i++]= =s2[j])!='\\0'); /*$ERROR3$*/while((s1[i++]=s2[j++])!='\\0') printf(\"\\n New string:%s\\n\ } 3.下列程序的功能是:根据整型形参n,计算如下公式的值 A1=1,A2=1/(1+A1),A3=1/(1+A2)……,An=1/(1+An-1)例如:若n=10,则输出A10为0.617977。 #include \"stdio.h\" int fun(int n) /*$ERROR1$*/float fun(int n) {float a=0; /*$ERROR2$*/float a=1; int i; for(i=2;i<=n;i++) a=1/(1+a); return a; } main() {int n; printf(\"\\n Please Enter a value of n\"); scanf(\"%d\ printf(\"A%d=%f\\n\/*$ERROR3$*/ printf(\"A%d=%f\\n\ 4.让计算机出10道100以内的整数加法题,让学生回答。回答正确时,计算机提示\"正确\",错误时提示\"错误\",并统计做对的题数。程序如下: #include main() {int a,b,c,i,n=0; radomize(); for(i=0;i<10;i++) {a=random(100); b=random(100); printf(\"%4d\\n\printf(\"=\\n\"); printf(\"?\"); scanf(\"%d\/*$ERROR1$*/ scanf(\"%d\ if(c=a+b) /*$ERROR2$*/ if(c= =a+b) {printf(\"right\\n\"); n=n+1;} else printf(\"wrong\\n\");} printf(\"Right Total=%d!\ } 5.下面程序的功能是输出字符串. Main() {char *a[]={English\ char**p; int j=0; p=a; for(;j<=4;j++) /*$ERROR1$*/for(;j<4;j++)||for(;j<=3;j++) ||for(;j<4;j=j+1)||for(;j<=3;j=j+1) printf(\"%s\\n\printf(\"%s\\n\或{printf(%s\\n\ } 6.下面程序先打印所给的前三个字符串,然后再打印前三个字符串的首字符.请找出程序中的错误. Main() {char alpha[5]={\"a\/*$ERROR1$*/ /*char *alpha[5]= {\"a\ int i; p=alpha; for(i=0;i<3;i++,p++) printf(\"%s\/*$ERROR2$*/ printf(\"%s\ printf(\"\\"); p=p-3; for(i=0;i<3;i++,p++) printf(%c\,*p); /*$ERROR3$*/ printf(\"%c\\ printf(\"\\n\"); } 7.以下程序分别在a数组和b数组中放入an+1和bn+1个由小到大的有序数,程序把两个数组中的数按由小到大的顺序归并到c数组中. #include main() {int a[10]={1,2,5,8,9,10},an=5; int b[10]={1,3,4,8,12,18},bn=5; int i,j,c[20],max=9999; a[an]=b[bn]=max; /*$ERROR1$*/ a[an+1]=b[bn+1]=max; i=j=k=0; While((a[i]!=max&&b[j]!=max)) /*$ERROR2$*/ while((a[i]!=max)||(b[j]!=max)) if(a[i]Else{c[k]=b[k];k++;j++} /*$ERROR3$*/ else{c[k]=b[j];k++;j++;} For(i=0;i Printf(\"\\n\");} 8. 以下程序是将输入的十进制数转换为二进制数输出. #include main() {int y,i=0,j,a[16]; scanf(\"%d\ do {a[i]=y%2; a[i++]=y/2; /*$ERROR1$*/a[i++]=y%2; y/=2; } while(y>=0); /*$ERROR2$*/while(y)或while(y>0) for(j=i;j>=0;j--) /*$ERROR3$*/ for(j=i-1;j>=0;j--) printf(\"%d\j]); printf(\"\\n\"); } 9. 以下程序判断输入的字符串是否是\" 回文\"(即顺读和倒读都一样,例如:LEVEL). #include #include main() {char s[81]; int i,j,n; get(s); n=strlen(s); i=0; j=n; While(s[i]= =' ')i++; While(s[j]= =' ')j--; While(i } /*$ERROR1$*/j=n-1; /*$ERROR2$*/while(i int fun(int k) {int m=0,mc=0; while ((k>=13)||(mc<10)) /*$ERROR1$*/ while((k>=13)&&(mc<10)) {if((k%13= =0)&&(k%17= =0)) /*$ERROR2$*/ if((k%13= =0)||(k%17= =0)) {m+=k; mc++;} k++; /*$ERROR3$*/ k--; return(m); } main() {printf(\"%d\\n\ } 11.以下程序将输入的数字字符序列转化成一个整数. #include #include main() {char c[10]; int i=0,j; long k=0; gets(c); j=strlen(c); for(;i k=k*10+c[i]; /*$ERROR2$*/k=k*10+c[i]-'0'; printf(\"k=%d\\n\/*$ERROR3$*/ printf(\"k=%ld\\n\ } 12.以下程序计算200以内的其平方具有回文性质的正整数的数目如:11^2=121,111^2=12321 #include sqrtes(int x) { int s,y; s=x*x; y=0; while(s) {y=y*10+s/10; /*$ERROR1$*/ y=y*10+s%10; s=s%10; } /*$ERROR2$*/ s=s/10; if(y=x*x) return 1; /*$ERROR3$*/ if(y= =x*x) return 1; else return 0; } main() { int n,count=0; for(n=10;n<200;n++) if(sqrtes(n)) {count++; printf(\"n=%3d,n*n==%d\\n\ printf(\"count=%d\\n\ } 13.以下程序将十进制正整数n转换成十六进制数,并存入字符串str中. Main() {unsigned n,h; int i=0; printf(\"input a decimal Number to n:\"); scanf(\"%d\ do {h=n/16; /*$ERROR1$*/ {h=n%16; str[i++]=(h<=9)?h+'0':h+'A'-10; n=n%16; /*$ERROR2$*/ n=n/16; } while(n); for(--i;i>=0;) printf(\"%s\/*$ERROR3$*/ printf(\"%c\ printf(\"\\n\"); } 14.以下程序能够将字符串str1和字符串str2 合并成一个新字符串str3. #include main() {char str1[30],str2[20],str[60]; int i=0,j=0; printf(\"Enter first string:\"); gets(str1); printf(\"Enter second string:\"); gets(str2); while(str1[i]) str[i]=str1[i];i++; /*$ERROR1$*/ while(str1[i]){str[i]=str1[i],i++} while(str2[j])str[i++]=str2[j];j++; /*$ERROR2$*/ while(str2[j]){str[i++]=str2[j];j++;} str[i]=\"0\"; /*$ERROR3$*/ str[i]='0'; printf(\"str=%s\\n\ } 15.以下程序实现字符串反向存储. Main() {char str[70],ch,*p,*temp; printf(\"Enter string to str:\"); scanf(\"%s\ p=str; temp=str; while(temp) temp++; /*$ERROR1$*/ while(*temp) temp++; *temp--; /*$ERROR2*/ temp--; while(p>temp) /*$ERROR3$*/ while(p printf(\"string=%s\\n\ } 二、填空题 1.计算学生的平均成绩和不及格的人数. Struct stu { int num; char *name; char sex; float score; }; main() { ______ student[5]={ {101,\"Li ping\ {102,\"Zhang ping\ {103,\"He feng\ {104,\"Cheng ling\ {105,\"Wang ming\ }; /*$BLANK1$*//* struct stu*/ int i,c=0; float ave,s=0; for(i=0;i<5;i++) { s+=_____; /*$BLANK2$*//*student[i].score;*/ if(____<60) c++; /*$BLANK3$*//* student[i].score*/ } ave=s/5; printf(\"average=%f\\n count=%d\\n\ } 2.完善程序,使5×5数组的对角线元素为1,其它为0,即输出5×5的对角矩阵. #include main() {int j,k,a[5][5]; for(j=0;j<5;j++) for(k=0;k<5;k++) {if(___) /*$BLANK1$*//* k= =j*/ _____ /*$BLANK2$*//* a[j][k]=1*/ else_____ ; /*$BLANK3$*//* a[j][k]=0*/ } for(j=0;j printf(\"\\n\"); }} 3.编制函数acopy(), 将数组a的内容复制到b数组中(以-999作结束标志),程序未完成,请填空. #include void acopy(____) /*$BLANK1$*//* void acopy(int a[],int b[])*/ {int i=0; while(a[i]!=-999) {____ ; /*$BLANK2$*//* b[i]=a[i]*/ i++;} b[i]=a[10];} main() {static int a[]={1,3,5,7,9,2,4,6,8,10,-999}; int b[80],i=0; ____ ; /*$BLANK3$*//*acopy(a,b) */ while(b[i]!=-999) printf(\"%d\ 4.以下程序用函数的递归调用打印n的阶乘值,请填空. Long fac(int n) { long f; if(n<0) printf(\"n<0,data error\"); else if(n= =0||n= =1) f=1; else f=____ /*$BLANK1$*//* else f=n*fac(n-1);*/ ______ ; } /*$BLANK2$*//* return(f);*/ main() {int n; long y; printf(\"input a integer number:\"); scanf(\"%d\ y=____ ; /*$BLANK3$*//* y=fac(n);*/ printf(\"%d!=%ld\ } 5.有一个3×4的矩阵,要求编程以求出其中最大的那个元素,以及它所在的行号和列号.程序如下: main() {int i,j,row,col,max; static int a[3][4]={{3,5,1,8},{6,4,11,7},{9,3,10,2}}; max=___ ; /*$BLANK1$*//*a[0][0] */ for(i=0;i<3;i++) for(j=0;j<4;j++) if(___________) /*$BLANK2$*/ /*a[i][j]>max*/ {max=_______; /*$BLANK3$*/ /*max=a[i][j]*/ row=i; col=j; } 6.删除一个字符串中的某个特定字符(设本例中要删除的特定字符为s)。 main() {char a[]=\"this is a book\"; char c='s'; int i,j=0; for(i=0;a[i]!=_____;i++) /*$BLANK1$*/ /*'\\0'*/ if(a[i]!=______) /*$BLANK2$*/ /*c*/ a[j++]=a[i]; ______='\\0'; /*$BLANK3$*/ /*a[j]*/ printf(\"%s\ } 7.用冒泡法对10个数排序(从小到大),,程序如下: main() {int a[11]; int i,j,t; printf(\"Enter 10 numbers:\\n\"); for(i=1;i<11;i++) scanf(\"%d\/*$BLANK1$*/ /*&a[i]*/ printf('\\n\"); for(j=1;j<=9;j++) for(i=1;i<=____;i++) /*$BLANK2$*/ /*10-j*/ if(___________) /*$BLANK3$*/ /*a[i]>a [i+1]*/ {t=a[i];a[i]=a[i+1];a[i+1]=t;} printf(\"The sorted numbers:\\n\"); for(i=1;i<11;i++) printf(\"%d\ } 8.以下程序中,主函数调用了LineMax函数,实现N行M列的二维数组中,找出每一行上的最大值。 #define N 3 #define M 4 void linemax(int a[N][M]) {int i,j,p;{for(k=0;k<5;k++) printf(\"%d\j][k]);