计算机自考题库全国,全国计算机技术与软件技术资格

更新时间:2024-01-13 作者:用户投稿原创标记本站原创 点赞:12770 浏览:49121

2016年计算机等级考试二级C语言上机习题(1)一,改错题

【分析】:改错题的错误一般可分为两类,一类是语法错误,这类错误可通过调试程序改正,较容易,另一类是逻辑错误,这类错误程序能运行,但结果不正确,这类错误相对较难,修改前必须要看懂和理解程序.

#include"stdio.h"

#definen4#definem3/*语法错,#definem3需另起一行*/

inta[n][m],s[m],

p(intj)/*此函数的功能为:找出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<,N,K++)<,p>,

if(a[k][j]<,X)<,p>,

{i等于k,s[j]等于x等于a[k][j],}

returni,

}

main()

{intindex[m],i,j,k,

for(i等于0,i<,N,I++)<,p>,

for(j等于0,j<,M,J++)<,p>,

scanf("%d",a[i][j]),/*语法错,但编译时不会报错,scanf语句的一般形式为scanf(格式控制,地址表列),所以a[i][j]应改为&,a[i][j])*/

for(j等于0,j<,M,J++)<,p>,

{index[j]等于p[j],

printf("a[%d,%d]等于%d\n",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)<,p>,

{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

#definen8

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

gcd(inta,intb)

{intc,

while(b!等于0)

{c等于a%b,a等于b,b等于c,}

returna,

}

main()

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

FILE*f,

if((f等于fopen("d:\\temp\\1\\myf2.out","w"))等于等于NULL)

{printf("CreateFilemyf2.outFailed!\n"),exit(0),}

x等于26,

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

for(i等于0,i<,2,i++)

for(j等于0,j<,N,J++)<,p>,

{a[i][j]等于x,x等于(25*x+357)%1024,}

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

for(j等于0,j<,N,J++)<,p>,

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),}

2016年计算机等级考试二级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:\\myf2.out","w")打开文件并赋值给指针,用fprintf输出结果,用fclose关闭文件.

【注意】fopen("A:\\myf2.out","w")中盘符A:后要加双斜杠表示根目录,因为C语言用转义字符'\\'才能表达字符\,另外,文件的命名一定要严格按照规定处理,千万不要随便命名.

【参】

#include"stdio.h"

intpress(chars[])

{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',

returncount,

}

main()

{charnum[100],

intcount等于0,

FILE*fp,

fp等于fopen("A:\\myf2.out","w"),

gets(num),

count等于press(num),

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

printf("%d",count),

fclose(fp),}

运行结果如下:

@Iwilsuceul&,andyouto!#

2016年计算机等级考试二级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:\\myf2.out","w")打开文件并赋值给指针,用fprintf输出结果,用fclose关闭文件.

【注意】fopen("A:\\myf2.out","w")中盘符A:后要加双斜杠表示根目录,因为C语言用转义字符'\\'才能表达字符\,另外,文件的命名一定要严格按照规定处理,千万不要随便命名.

【参】

#include"stdio.h"

introtate(inta[4][4],intb[4][4]),

main()

{FILE*fp,

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

fp等于fopen("A:\\myf2.out","w"),

if(fp等于等于NULL){printf("Can'tcreatefilemyf2.out!"),

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等于%d\n",s),

fclose(fp),

}

introtate(inta[4][4],intb[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],

returns,}

2016年计算机等级考试二级C语言上机习题(4)一,改错题

含有错误的源程序如下:

voidmatch(char*pat,charstr)

{char*p等于pat,*q等于str,

inti等于0,

while((*p!等于NULL)&,&,(*q!等于NULL))

if(*p等于等于*q||*p等于等于'')p++,q++,

elseif(*p等于等于'*')

{p++,

while(*q!等于*p&,&,*q!等于NULL)q++,

}

elsei等于0,break,

if(*p!等于NULL||*q!等于NULL)i等于0,

returni,

}

}

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

【解析】程序中的错误一般可以分为两类,一类是语法错误,即程序中有拼写错误,书写不符合C语言的规定等,此类错误可通过调试(按F9键),根据提示进行改正.另一类是逻辑错误,程序调试已通过(报Success),但运行结果不正确,此类错误的修改必须要理解程序后方能改正.

程序中用到系统预设的符号常量NULL,又未加"文件包含"处理,按F9后即编译时系统会报错,故应在最前面加上include或将以下全部NULL改为0.函数match分明有返回值,故系统也会报错,应将void改为int,变量i的作用是:当匹配时取值1,否则取值0,根据处,易于发现i初值应取1,故处应改为i等于1,当发现不匹配时,立即置为0,并跳出循环,此两句应是一个整体,应构成复合语句.均为逻辑错误.

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

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

intmatch(char*pat,char*str)

i等于1

{i等于0,break,}

二,编程题

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

【解析】将30~50之间的每一个数都进行判断,就不会有遗漏.注意,按要求必须调用函数,且使用数据文件完成输出.使用数据文件有5大步骤:#include,用FILE*定义指针,用fopen("A:\\myf2.out","w")打开文件并赋值给指针,用fprintf输出结果,用fclose关闭文件.

【注意】fopen("A:\\myf2.out","w")中盘符A:后要加双斜杠表示根目录,因为C语言用转义字符'\\'才能表达字符\,另外,文件的命名一定要严格按照规定处理,千万不要随便命名.

【参】

#include

intinv(intx)

{inty,

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

returny,

}

main()

{FILE*out,

inti,j,

if((out等于fopen("A:\\myf2.out","w"))等于等于NULL)

{printf("Openfilemyf2.outfailed!\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*%d\n",i,j,inv(i),inv(j)),

fclose(out),}

2016年计算机等级考试二级C语言上机习题(5)一,改错题

【分析】:对于改错题的程序中的错误一般可分为两类,一类是语法错误,程序中的语句不符合C语言的语法,拼写错误,这类的错误可通过调试程序改正.另一类是逻辑错误,程序调试已通过,但运行结果不正确,这类错误的修改必须要看懂和理解程序.

#include

#defineN50

voidsum(intn,int*pa)

/*属第一类错误.若声明为void类型,则该函数没有返回值,但程序要求返回前n的和,所以类型声明不正确,应改为:int或去掉*/

{intcount,total,temp,

*pa等于3,*++pa等于2,

total等于5,count等于2,

while(count++<,N)<,p>,

{temp等于*(pa-1)**pa,

if(temp<,10)

{total+等于temp,*(++pa)等于temp,

}

else

{*++pa等于temp/10,

total+等于*pa,

if(count

/*属第二类错误.若乘积为两位数,已把其十位数字作为数列的后续项,但若数列的个数没有超过n时,将该乘积个位数字作为数列的后续项.*++pa与*pa++不同,此处应为:*++pa*/

}

}

returntotal,

}

main()

{inttol,n,i,num[n],

/*属第一类错误.数组的声明不正确,数组的下标必须为常量或常量标识符.应改为:num[N]或num[50]*/

do

{printf("Inputn等于(2<,N<,50)"),<,p>,

scanf("%d",&,n),

}while(n<,等于2||n>,等于50),

tol等于sum(N,num),

/*属第二类错误.本题要求生成数列的前n(n<,50)项,而N是常量.应改为:sum(n,num)*/

for(i等于0,i<,N,I++)<,p>,

printf((i+1)%5"%5d":"%5d\n",num[i]),

printf("\n"),

printf("%d",tol),

}

2016年计算机等级考试二级C语言上机习题(6)一,改错题

含有错误的源程序:

#include

#include

#defineN5

structstudent

{charname[10],

intscore,

}―――――――――――

voidsort(structstudentstud[],intn)

{inti,j,

structstudentp,

for(i等于1,i<,>,

{p等于stud[i],

for(j等于i-1,j>,0&,&,p>,stud[j],j--)―――――――――――

stud[j+1]等于stud[j],

stud[j+1]等于p,

}

}

voidmain()

{structstudentstud[N]等于{"aaa",60,"bbb",90,"ccc",85,"ddd",65,"yyy",77},

inti,

sort(stud,N),

printf("sorteddata:\n"),

for(i等于0,i<,printf(%s\t%d\n,stud[i]),>,

}

【知识点】结构体,排序

【难点】插入法排序

【解析】本题是将未排序的数组元素采用插入排序方法进行排序,其思想是:从第2个元素开始,最初与第一个元素进行比较,由大到小排列在适当位置,成为排好序的数组元素一员.再依次将待排序的元素与前面已排好序的元素从后向前进行比较,如果大于该元素,则该元素向后移一位,直到待排序的元素小于已排好序的某一元素,则直接插入到该元素之后.直到待排序的元素全部完成为止.本程序的sort函数中i表示待排序的元素下标,j表示已排好序的元素下标.

【答案】(1)标号:}改为},(2)标号:for(i等于1,i

(3)标号:for(j等于i-1,j>,0&,&,p>,stud[j],j--)改为j>,等于0&,&,p.score>,stud[j].score,j--)

(4)标号:printf("%s\t%d\n",stud[i]),改为printf("%s\t%d\n",stud[i].name,stud[i].score),

二,编程题

【知识点】字符串操作,函数,文件

【解析】仔细阅读并分析【编程要求】.【编程要求1】已对函数Replace_string指定了函数名,函数类型,形参类型和个数,并详细说明了其功能.在line指向的字符串中查找str1指向的字符子串的关键语句是当"str1[j]等于等于line[loc]&,&,str1[j]!等于'\0'"时继续循环查找,当因"str1[j]!等于'\0'"退出循环时,则找到str1指向的字符子串,此时用str2指向的字符串替换在line中的str1字符子串,返回.【编程要求2】编写主函数主要功能要求是保存结果到数据文件,调用Replace_string函数,输入测试数据.这部分是最常规和基本的要求,必须掌握.

【参】

#include

#include

intReplace_string(charline[],charstr1[],charstr2[])

{inti等于0,j,loc,

chartemp[80],

while(i<,等于strlen(line)-strlen(str2))

{j等于0,loc等于i,

while(str1[j]等于等于line[loc]&,&,str1[j]!等于'\0')

{loc++,j++,}

if(str1[j]等于等于'\0')

{strcpy(temp,&,line[loc]),strcpy(&,line[i],str2),

i+等于strlen(str2),strcpy(&,line[loc],temp),

return1,

}

elsei++,

}

return0,

}

main()

{FILE*fp,

charstring[100]等于"MyEXAM_numberis0112404321.",

charnumber[11]等于"0112404321",num[11],

fp等于fopen("myf2.out","w"),

fprintf(fp,"%s\n",string),

gets(num),

Replace_string(string,number,num),

fprintf(fp,"%s\n",string),

fprintf(fp,"\nmyexamnumberis:%s\n","0112404321"),

fclose(fp),}

2016年计算机等级考试二级C语言上机习题(7)一,改错题

含有错误的源程序如下:

#include

#include

structT

{charname[20],num[20],

},

voidsort(structTitems[],intlow,inthigh)

{structTtemp,

intk,j,

for(k等于low,k<,HIGH,K++)<,p>,

for(j等于low,j<,>,

if(items[j].name>,items[j+1].name)

{temp等于items[j],items[j]等于items[j+1],items[j+1]等于temp,}

}

voidmain(void)

{structTstu[4]等于{"Wang","6723","Cai","2106","Zhang",

"5129","Chang","4512","An","6868"},

intk,

sort(stu,0,4),

printf("TheSortedArray:\n"),

for(k等于0,k<,5,k++)

printf("name:%s,num:%s\n",stu[k]->,name,stu[k]->,num),

}

【知识点】冒泡排序,结构体数组,程序的调试

【解析】程序中的错误一般可以分为两类,一类是语法错误,即程序中有拼写错误,书写不符合C语言的规定等,此类错误可通过调试(按F9键),根据提示进行改正.另一类是逻辑错误,程序调试已通过(报success),但运行结果不正确,此类错误的修改必须要理解程序后方能改正.

本题使用起泡法完成排序,处j<,HIGH-K-1等价与J<,等于HIGH-K-2,J最大取HIGH-K-2时,J+1才取到HIGH-K-1,例如,刚开始当K为0时,最后一个比较的元素下标为HIGH-1,而实际上根据实参(值已为4)传递而来的最后一个元素的下标应为HIGH,故处应改为J<,HIGH-K或J<,等于HIGH-K-1,此为逻辑错误.处均属于语法错误:字符串的比较不能使用关系运算符,要借助STRCMP函数,所赋值有5个,数组维数就必须大于等于5,STU[K]不是指针,不能用指向成员符描述成员.<,p>,

【答案】加下划线的部分改为:

j<,HIGH-K或J<,等于HIGH-K-1<,p>,

if(strcmp(items[j].name,items[j+1].name)>,0)

stu[5]

stu[k].name,stu[k].num

2016年计算机等级考试二级C语言上机习题(7)二,编程题

【知识点】字符串处理,函数调用,数据文件的使用

【解析】编程题的结果一般都是客观的,这样便于老师主观阅卷评分,虽然考生个人的准考证号是各异的,对评阅老师却是可以通过所交磁盘标签直接观察到,故必须如实输入,不能直接套用题中例子.注意,按要求必须调用函数,且使用数据文件完成输出.使用数据文件有5大步骤:#include,用FILE*定义指针,用fopen("A:\\myf2.out","w")打开文件并赋值给指针,用fprintf输出结果,用fclose关闭文件.

【注意】fopen("A:\\myf2.out","w")中盘符A:后要加双斜杠表示根目录,因为C语言用转义字符'\\'才能表达字符\,另外,文件的命名一定要严格按照规定处理,千万不要随便命名.

【参】

#include

#include

#include

voidcount(chara[],charw[][10],intn,intb[])

{inti等于0,j,k等于0,chars[10],

for(i等于0,a[i]!等于0,i++)

{if(isalpha(a[i]))s[k++]等于a[i],/*isalpha函数用于判断字符是否为字母*/

/*此句将连续字母组成的一个单词存放于s中,便于与二维数组中的某一行进行比较*/

else

{s[k]等于'\0',/*加上'\0'才能使s中存放的是字符串,才能使用strcmp函数进行比较*/

for(j等于0,j<,N,J++)<,p>,

if(strcmp(s,w[j])等于等于0){b[j]++,break,}

k等于0,/*让s重新存放另一个单词*/

}

}

}

main()

{FILE*fp,

charline[80]等于"thisisabook,thatisanapple",word[6][10]等于{"this","that","is","a","an","book"},

/*按要求初始化,用二维字符数组的一行存放一个单词便于后面比较处理*/

intc[6]等于{0},m,

count(line,word,6,c),fp等于fopen("A:\\myf2.out","w"),

if(fp等于等于NULL){printf("Can'topenfile"),exit(1),}

for(m等于0,m<,6,m++)fprintf(fp,"%s:%d",word[m],c[m]),

fprintf(fp,"\nmyexamnumberis:%s","0112400123"),/*注意输入实际准考证号*/

fclose(fp),

}

青年人网站计算机栏目编辑qnr./pc/

相关论文范文