admin 管理员组

文章数量: 1086019


2024年4月21日发(作者:xor校验算法)

2010年计算机等级考试二级C语言上机习题汇总

一、改错题

【分析】:改错题的错误一般可分为两类,一类是语法错误,这类错误可通过调试程序

改正,较容易;另一类是逻辑错误,这类错误程序能运行,但结果不正确,这类错误相对较

难,修改前必须要看懂和理解程序。

#include"stdio.h"

#define n 4 #define m 3 /*语法错,#define m 3需另起一行*/

int a[n][m],s[m];

p(int j)/*此函数的功能为:找出a数组中第j列的最小元素的值及行号,函数成功运行

后,i中即为j列的最小元素的行号,s[j]中即为j列的最小元素的值*/

{intk,i,x;

x=a[0][j];i=0; /*逻辑错,从函数的功能可知,a[0][j]也应赋值给s[j],所以x=a[0][j]应改

为s[j]=x=a[0][j]*/

for(k=1;k

if(a[k][j]

{i=k;s[j]=x=a[k][j];}

return i;

}

main()

{int index[m],i,j,k;

for(i=0;i

for(j=0;j

scanf("%d",a[i][j]);/*语法错,但编译时不会报错,scanf语句的一般形式为scanf(格式控

制,地址表列),所以a[i][j]应改为&a[i][j])*/

for(j=0,j

{index[j]=p[j];

printf("a[%d,%d]=%dn",index[j],j,s[j]);

}

i=s[1];k=0; /*逻辑错,数组s中存放的是a数组中每一列的最小值,比较时应从数组的

第0个元素开始,而下面的for循环是从第1个元素开始的,所以i=s[1]应改为i=s[0]*/

for(j=1;j<>

if(s[j]

{i=s[j];k=j;}

printf("min=a[%d,%d]=%d",index[k],k,i); }

二、编程题

【分析】:本题的主要功能是建立一个3行8列的二维数组,并给其元素赋值,其中第

1、2行的值可通过递推公式xi+1=(25*xi+357)%1024得到,第三行的值取前两行同列元素的

最大公约数,所以编程时可用一个函数来实现求公约数的算法。

#include

#include

#define n 8

/*函数gcd实现求最大公约数的算法*/

gcd(inta,int b)

{int c;

while(b!=0)

{c=a%b;a=b;b=c;}

return a;

}

main()

{inti,j,x,a[3][n];

FILE *f;

if((f=fopen("d:","w"))= =NULL)

{printf("Create File Failed!n");exit(0);}

x=26;

/*下面二重for循环实现给第1、2行数组元素赋值的功能*/

for(i=0;i<2;i++)

for(j=0;j

{a[i][j]=x;x=(25*x+357)%1024;}

/*下面for循环通过调用gcd函数实现给第3行数组元素赋值的功能*/

for(j=0;j

a[2][j]=gcd(a[0][j],a[1][j]);

/*下面for循环实现按题目所给格式输出二维数组的功能*/

for(i=0;i<3;i++)

{for(j=0;j<>

fprintf(f,"n");

}

fclose(f); }

2010年计算机等级考试二级C语言上机习题(2)

一、改错题

【知识点】整数数位处理、数字字符与相应数字的转换、程序调式

【解析】程序中的错误一般可以分为两类,一类是语法错误,即程序中有拼写错误,书

写不符合C语言的规定等,此类错误可通过调试(按F9键),根据提示进行改正。另一类是

逻辑错误,程序调试已通过(报success),但运行结果不正确,此类错误的修改必须要理解程

序后方能改正。

使用putchar函数必须在程序开头加上文件包含#include "stdio.h";scanf语句中必须是地

址序列,故scanf("num=%d",num);应改为scanf("num=%d",&num);,且调式时注意将“num=”

原样输入;某数字若转换为相应数字字符,应加上字符'0'或48(字符'0'的ASCII码值),故

digit[n++]=m%10;应改为digit[n++]=m%10+'0';;最后输出时,n已在前面多加了一次,故而输

出时应先减1,故for(;n>=0;n--)中第一个表达式应加上n--或--n或n=n-1。

【答案】①在程序开头加上#include "stdio.h"

②将原第五行的scanf("num=%d",num);改为scanf("num=%d",&num);

③将原第十一行的digit[n++]=m%10;改为digit[n++]=m%10+'0';

④将原第十六行的for(;n>=0;n--)改为for(n--;n>=0;n--)

二、编程题

【知识点】字符串应用、数据文件的使用

【解析】注意,按要求必须调用函数,且使用数据文件完成输出。使用数据文件有5

大步骤:①#include ,②用FILE *定义指针,③用fopen("A:","w")打开文件并赋值

给指针,④用fprintf输出结果,⑤用fclose关闭文件。

【注意】fopen("A:","w")中盘符A:后要加双斜杠表示根目录,因为C语言用

转义字符''才能表达字符;另外,文件的命名一定要严格按照规定处理,千万不要随便命名。

【参考答案】

#include "stdio.h"

int compress(char s[])

{intn,k=0,count=0;

if(s[0]!=NULL) n=k+1;

while(s[n]!=NULL)

{if(s[k]= =s[n]){n++;count++;}

else {s[++k]=s[n];n++;}

}

s[++k]='0';

return count;

}

main()

{charnum[100];

int count=0;

FILE *fp;

fp=fopen("A:","w");

gets(num);

count=compress(num);

fprintf(fp,"%s",num);

printf("%d",count);

fclose(fp); }

运行结果如下:

@ I wilsucesful& and you to ! #

2010年计算机等级考试二级C语言上机习题(3)

一、改错题

【知识点】选择法排序、指针与字符串、程序的调试

【解析】程序中的错误一般可以分为两类,一类是语法错误,即程序中有拼写错误,书

写不符合C语言的规定等,此类错误可通过调试(按F9键),根据提示进行改正。另一类是

逻辑错误,程序调试已通过(报success),但运行结果不正确,此类错误的修改必须要理解程

序后方能改正。

本题要求“从键盘上接受一个含有空格的字符串”,scanf是做不到的,它遇到第一个空

格即认为读入完毕,故应替换成gets函数;程序中使用了strcpy函数,就必须在程序开头加

上文件包含#include "string.h";根据选择法升序排序要领,每次找到一个“更小的字符”由r指

着,直到指向最小的为止,而不是修改r所指字符的值,故if(*r>*q)*r=*q;应改为if(*r>*q) r=q;;

当r与p所指不同时,交换二者所指字符的值,即使得p所指字符为每次的最小,故应将if(r/=p)

改为if(r!=p)。

【答案】①在程序开头加上文件包含#include "string.h"

②将原第五行的scanf("%s",str);改为gets(str);

③将原第八行的*r=*q; 改为r=q;

④将原第九行的if(r/=p)改为if(r!=p)

二、编程题

【知识点】二维数组的应用、数据文件的使用

【解析】关于“二维数组应用”的题目,一般都要仔细观察,找出规律后再编程。本题中

原数组的任意一个元素a[i][j]旋转后,位置处于b中第3-j行i列。注意,按要求必须调用函

数,且使用数据文件完成输出。使用数据文件有5大步骤:①#include ,②用FILE *定义

指针,③用fopen("A:","w")打开文件并赋值给指针,④用fprintf输出结果,⑤用

fclose关闭文件。

【注意】fopen("A:","w")中盘符A:后要加双斜杠表示根目录,因为C语言用

转义字符''才能表达字符;另外,文件的命名一定要严格按照规定处理,千万不要随便命名。

【参考答案】

#include "stdio.h"

int rotate(int a[4][4],int b[4][4]);

main()

{FILE *fp;

inti,j,x[4][4],y[4][4],s;

fp=fopen("A:","w");

if(fp= =NULL){printf("Can't create file !");

exit(1);}

for(i=0;i<4;i++)

for(j=0;j<4;j++)

scanf("%d",&x[i][j]);

s=rotate(x,y);

for(i=0;i<4;i++)

{for(j=0;j<4;j++)

fprintf(fp,"%d ",y[i][j]);

fprintf(fp,"n");

}

fprintf(fp,"sum=%dn",s);

fclose(fp);

}

int rotate(int a[4][4],int b[4][4])

{inti,j,s=0;

for(i=0;i<4;i++)

for(j=0;j<4;j++)

b[3-j][i]=a[i][j];

for(i=0;i<4;i++) s+=b[i][i];

return s; }

2010年计算机等级考试二级C语言上机习题(4)

一、改错题

含有错误的源程序如下:

void match(char *pat,charstr) ①

{char *p=pat,*q=str;

int i=0; ②

while((*p!=NULL)&&(*q!=NULL))

if(*p= =*q||*p= ='?')p++,q++;

else if(*p= ='*')

{p++;

while(*q!=*p&&*q!=NULL)q++;

}

else i=0;break; ③

if(*p!=NULL||*q!=NULL)i=0;

return i;

}

}

【知识点】字符串处理、程序的调试

【解析】程序中的错误一般可以分为两类,一类是语法错误,即程序中有拼写错误,书

写不符合C语言的规定等,此类错误可通过调试(按F9键),根据提示进行改正。另一类是

逻辑错误,程序调试已通过(报Success),但运行结果不正确,此类错误的修改必须要理解

程序后方能改正。

程序中用到系统预设的符号常量NULL,又未加“文件包含”处理,按F9后即编译时系

统会报错,故应在最前面加上include 或将以下全部NULL改为0。函数match分明有返回

值,故系统也会报错,应将void改为int;变量i的作用是:当匹配时取值1,否则取值0,

根据③处,易于发现i初值应取1,故②处应改为i=1,当发现不匹配时,立即置为0,并跳

出循环,此两句应是一个整体,应构成复合语句。②③均为逻辑错误。

【答案】(1)在最前面加上include 或将以下全部NULL改为0

(2)加下划线的部分改为:

①int match(char *pat, char *str)

②i=1

③{ i=0;break;}

二、编程题

【知识点】穷举法、数据文件的使用

【解析】将30~50之间的每一个数都进行判断,就不会有遗漏。注意,按要求必须调用

函数,且使用数据文件完成输出。使用数据文件有5大步骤:①#include ,②用FILE *定

义指针,③用fopen("A:","w")打开文件并赋值给指针,④用fprintf输出结果,⑤用

fclose关闭文件。

【注意】fopen("A:","w")中盘符A:后要加双斜杠表示根目录,因为C语言用

转义字符''才能表达字符;另外,文件的命名一定要严格按照规定处理,千万不要随便命名。

【参考答案】

#include

intinv(int x)

{int y;

y=x/10+x%10*10; /*此句可将某两位正整数的十位与个位数字换位*/

return y;

}

main()

{FILE *out;

inti,j;

if((out=fopen("A:","w"))= =NULL)

{printf("Open file failed!n");exit(1);}

for(i=30;i<50;i++)

for(j=30;j<50;j++)

if((i/10!=i%10)&&(i*j= =inv(i)*inv(j))) /* i/10!=i%10确保十位与个位数字不同*/

fprintf(out,"%d*%d=%d*%dn",i,j,inv(i),inv(j));

fclose(out); }

2010年计算机等级考试二级C语言上机习题(5)

一、改错题

【分析】:对于改错题的程序中的错误一般可分为两类,一类是语法错误,程序中的语

句不符合C语言的语法,拼写错误,这类的错误可通过调试程序改正。另一类是逻辑错误,

程序调试已通过,但运行结果不正确,这类错误的修改必须要看懂和理解程序。

#include

#define N 50

void sum(intn,int *pa)

/*属第一类错误。若声明为void类型,则该函数没有返回值,但程序要求返回前n的

和,所以类型声明不正确,应改为:int或去掉*/

{ int count, total,temp;

*pa=3;*++pa=2;

total=5; count=2;

while(count++

{ temp=*(pa-1)**pa;

if(temp<10)

{ total+=temp; *(++pa)=temp;

}

else

{*++pa=temp/10;

total+=*pa;

if(count


本文标签: 程序 错误 函数 文件 数据文件