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
版权声明:本文标题:2010年计算机等级考试二级C语言上机习题汇总 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1713709404a647955.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论