12套C语言上机试题及参考答案 下载本文

第一套C语言上机试卷

一、改错题 【题目】

本程序计算并输出二维数组a的每一列最小元素的值及其行号、列号,整个数组a中最小元素的值及其行号、列号。含有错误的源程序为: #include\#define n 4 #define m 3

int a[n][m],s[m]; p(int j) {int k,i,x;

S[j]=x=a[0][j];i=0; for(k=1;k

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

main()

{int index[m],i,j,k; for(i=0;i

scanf(\&a[i][j]); for(j=0;j

printf(\ }

i=s[0];k=0;

for(j=1;j

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

printf(\}

注:调试程序时,可以随意输入测试数据,最后运行本程序时,必须从键盘输入下列数据: 6 4 16 9 7 13 8 18 15 5 12 19 【要求】:

1.将上述程序录入到文件 myf1.c中,然后根据题目的要求以及程序中语句之间的逻辑关系对程序中的错误进行修改。

2.改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理语句,但不能增加其他语句,也不能删去整条语句。

3.将改正后的源程序(文件名myf1.c)放在考试盘的根目录下,供阅卷用。 二、编程题

【题目】建立数组a[3][8],其中前两行元素产生方法是:

用初值x1=26及公式xi+1=(25*xi+357)24,产生一个数列:x1,x2,…,x16。其中x1~x8作为a的第一行元素;x9~x16作为a的第二行元素;第三行的元素值取前两行同列元素的最

大公约数。最后把数组a的元素写到文件myf2.out中,每写完a的一行元素要换行。 【要求】

1.将源程序取名为myf2.c 输出结果文件取名为myf2.out。

2.数据文件的打开、使用、关闭均按TURBO C文件操作实现。

3.源程序文件和运行结果文件均需放在考试盘的根目录下,供阅卷用。 4.不要将myf2.obj和myf2.exe保存到考试盘上。

第二套C语言上机试卷

一、改错题 【题目】

下面的程序判断一个正整数是否为降序数,再打印组成该整数的每个字符。

设正整数m=d0d1d2d3?d k-1,若满足d i >=d i+1,i=0,1,?,k-2,则m就是一个降序数,如21、433是两个降序数。

含有错误的源程序如下: #include void main()

{int num,k,di,n,isdec; long m;

char digit[10];

scanf(\&num); for(;num>0;num--) {n=0;isdec=1;k=0; scanf(\ while(m!=0) {di=m;

digit[n++]=m+’0’; *数字字符与相应数字的转换* m=m/10;

if(k<=di)k=di; else isdec=0; }

for(n--;n>=0;n--)

{putchar(digit[n]); putchar(' ');}*使用putchar要加#include* if(isdec)printf(\ else printf(\ } } 【要求】

1.将上述程序录入到文件myf1.c中,然后根据题目的要求以及程序中语句之间的逻辑关系对程序中的错误进行修改。

2.改错时,可以修改语句中的一部分内容,调整语句的次序,增加少量的变量说明或编译预处理命令,但不能增加其他语句,也不能删去整条语句。

3.改正后的源程序myf1.c保存在考试盘的根目录下,供阅卷用,否则不予评分。 二、编程题 【题目】

程序功能:将一字符串做压缩处理。 编程要求:

1.编写一个函数int compress (char s[ ]),将s中连续出现的多个相同字符压缩成一个字符,统计被删除的字符个数,并返回被删除的字符个数。

2.编写主函数main。从键盘上读入一行字符数据放入一个字符型数组中,调用compress函数对该字符数组中的字符做压缩处理,将压缩后的字符串写入结果文件myf2.out中。

3.用以下数据测试程序:

@@@@@@ I wwillll successful &&&&&& and you too !!!!!! ########## 【要求】

1.将源程序文件取名为myf2.c,输出结果文件取名为myf2.out。

2.数据文件的打开、使用和关闭均用C语言标准库中缓冲文件系统的文件操作函数实现。 3.源程序文件和运行结果文件均需保存在考试盘的根目录下,供阅卷用。 4.不要复制扩展名为OBJ和EXE的文件到考试盘上。

第三套C语言上机试卷

一、改错题 【题目】

下面的程序能够从键盘上接受一个含有空格的字符串(scsnf遇到空格就停止输入,应用gets),然后按照字典序对所有字符排序,再删除重复出现的字符。

含有错误的源程序如下: #include #include \void main()

{char str[100],*p,*q,*r,c; printf(\gets(str);

for(p=str;*p;p++) {for(q=r=p;*q;q++) if(*r>*q)r=q;

if(r!=p){c=*r;*r=*p;*p=c;} }

for(p=str;*p;p++)

{for(q=p;*p==*q;q++);

strcpy(p+1,q);*用strcmp要加#include* }

printf(\} 【要求】

1.将上述程序录入到文件myf1.c中,然后根据题目的要求以及程序中语句之间的逻辑关系对程序中的错误进行修改。

2.改错时,可以修改语句中的一部分内容,调整语句的次序,增加少量的变量说明或编译预处理命令,但不能增加其他语句,也不能删去整条语句。

3.改正后的源程序myf1.c保存在考试盘的根目录下,供阅卷用,否则不予评分。 二、编程题 【题目】

程序功能:将一个4×4二维数组中全部元素逆时针旋转90°。 编程要求如下:

1.编写函数int rotate (int a[4][4], int b[4][4]),将数组a中元素逆时针旋转90°后的元素保存在数组b中,计算b数组主对角线上全部元素之和作为函数的返回值。

2.编写主函数main,从键盘上读入16个数据放入一个二维数组中,调用rotate函数,将旋转后的二维数组全部元素按行写入到结果文件myf2.out中,最后将旋转后数组中主对角线上全部元素之和写入到结果文件myf2.out中。

3.使用以下测试数据:

旋转前: 旋转后: 1 5 9 13 13 14 15 16 2 6 10 14 9 10 11 12 3 7 11 15 5 6 7 8 4 8 12 16 1 2 3 4

【要求】

1.将源程序文件取名为myf2.c,输出结果文件取名为myf2.out。

2.数据文件的打开、使用和关闭均用C语言标准库中缓冲文件系统的文件操作函数实现。 3.源程序文件和运行结果文件均需保存在考试盘的根目录下,供阅卷用。 4.不要复制扩展名为OBJ和EXE的文件到考试盘上。

第四套C语言上机试卷

一、改错题 【题目】

使用Windows搜索工具在磁盘中查找文件时,在被查找的文件名文本框内允许出现含有通配符“*”和“?”的字符串,以达到搜索多个文件的目的,称这样一个字符串为模板。搜索的过程就是在已知的若干文件名字符串中查找与模板匹配的文件名。以下程序实现模板与字符串的匹配判断功能。给出一个模板pat及一个字符串str,模板中可能含有通配符“*”和“?”,其中“*”表示在该位置上有0个或多个任意字符,“?”表示在该位置上有一个任意字符。函数match对它们作匹配判断后,返回1表示匹配,返回0表示不匹配。例如,模板为“e*p?e”,若字符串为“example”,则两者是匹配的;若字符串为“europe”,则两者是不匹配的。

程序正确时,当输入的模板为“e*p?e”,若输入字符串为“example”时,则输出“e*p?e match example”;若输入字符串为“europe”时,则输出“e*p?e unmatch europe”。

含有错误的源程序如下: void match(char *pat,char str) {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; }

main()

{char a[10],b[10]; int yesno;

gets(a);gets(b); yesno=match(a,b);

printf(\} 【要求】

1. 将上述程序录入到文件myf1.c中,然后根据题目的要求以及程序中语句之间的逻辑关系

对程序中的错误进行修改。

2. 改错时,可以修改语句中的一部分内容,调整语句的次序,增加少量的变量说明或编译

预处理命令,但不能增加其他语句,也不能删去整条语句。

3. 改正后的源程序myf1.c保存在考试盘的根目录下,供阅卷用,否则不予评分。 二、编程题 【题目】

有一些十进制整数对ab和cd具有如下特性:ab×cd=ba×dc,其中,a、b是不同的数字且c、d也是不同的数字。例如:

12×42=21×24,12×63=21×36,12×84=21×48 请按如下要求编程:

1. 编写函数int inv(int x),完成将两位数x的个位与十位对换,返回对换后新的两位数。 2. 主函数中找出m、n取值在30~50之间,且满足等式:m*n=inv(m)*inv(n)的所有m、

n值,并按上述等式的格式写入到文件myf2.out中(每个等式一行,×可用*表示)。

【要求】

1. 将源程序文件取名为myf2.c,输出结果文件取名为myf2.out。 2. 数据文件的打开、使用和关闭等操作均用C语言标准库中缓冲文件系统的文件操作函数

实现。

3. 源程序文件和运行结果文件均需保存在考试盘的根目录下,供阅卷用。 4. 不要将myf2.obj和myf2.exe保存到考试盘上。

第五套C语言上机试卷

一、改错题 【题目】

某数列的前两项是3和2,其后续项根据前面最后两项的乘积,按下列规则生成: (1)若乘积为一位数,则该乘积即为数列的后续项;

(2)若乘积为两位数,则该乘积的十位数字和个位数字依次作为数列的两个后续项。例如:该数列的前10项为:3、2、6、1、2、2、4、8、3、2。

函数sum按要求生成数列的前n(n<50)项,存入首指针为pa的数组中,计算并返回前n项的和。

#include #define N 50

void sum(int n,int *pa) { 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

return total; }

main()

{ int tol,n,i,num[n]; do

{printf(\ scanf(\ }while(n<=2||n>=50); tol=sum(N,num); for(i=0;i

printf((i+1)%5?\ printf(\ printf(\}

【要求】

1.将上述源程序录入到文件 MYF1.C中,根据题目要求以及程序中语句间的逻辑关系对程序中的错误进行修改。

2.改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编

译预处理语句,但不能增加其他语句,也不能删去整条语句。

3.改正后的源程序MYF1.C必须放在考试盘的根目录下,供阅卷用。 二、编程题 【题目】

一个有符号整型数以字符串形式存放在字符数组a中,字符串中只会出现数字字符、“-”、“+”和空格。约定“-”和“+”只能出现在a[0]的位置。若a[0]位置的字符是“-”,则表示该整型数为负数,否则为正数。除a[0]外,其他位置还可能出现空格。试按下列要求编写程序:

1.编写函数int chang(char a[], int b[],int *n)按下列规则转换字符数组a中的字符串: (1) 整型变量sign存放数符,当整型数为正数时sign为0,为负数时 sign为1,函

数返回sign值;

(2) 整型数组b依次存放字符串a中出现的所有数字字符转换为对应的整型数后的

值(不包括数符);

(3) n指向的变量保存放入b数组的整型数的个数; (4) 字符串a中的空格忽略不计

如:字符串“ 20 3 ”转换后的结果是:sign=0,b=(2,0,3) 字符串“-3 3740”转换后的结果是:sign=1,b=(3,3,7,4,0)

2. 函数中输入二个字符串:“-2 35 1”,“+38 2 46”,分别调用函数chang做字符串转换,并将转换结果以例子给出的形式写到文件myt2.out中。 【要求】

1.将源程序文件取名为myf2.c 输出结果文件取名myf2.out。

2.数据文件的打开、使用、关闭等操作均用c标准库中的缓冲文件操作函数实现。 3.源程序文件和运行结果文件均须放在考试盘的根目录下,供阅卷用。 4.不要将myf2.obj和myf2.exe保存到考试盘上。

第六套C语言上机试题

一、改错题 【程序功能】

使用插入法将一个结构体数组中的数据按成员score的值从大到小排序。含有错误的源程序: #include #include #define N 5 struct student

{ char name[10]; int score;

} ;*定义结构体变量最后要加;* void sort(struct student stud[],int n) { int i,j;

struct student p;

for(i=1;i<=n-1;i++) { p=stud[i];

for(j=i-1;j>=0 && p.score>stud[j].score;j--) stud[j+1]=stud[j]; stud[j+1]=p; } }

void main()

{ struct student stud[N]={\ int i;

sort(stud,N);

printf(\

for(i=0;i

要求:

1. 把上述程序录入到文件myfl.c中,根据题目要求及程序中语句的逻辑关系对程序

中的错误进行修改。

2. 改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或预

编译处理命令,但不能增加其他语句,也不能删去整条语句。

3. 改正后的源程序(文件名myfl.c)保存在考试软盘的根目录中供阅卷使用,否则不

予评分。

二、编程题 【编程要求】

1. 编写函数int Replace_string(char line[],char str1[],char str2[]),其功能是:在line指向的字符串中查找str1指向的字符子串,若找到则用str2指向的字符串替换第一次出现在line中的str1字符子串,替换成功返回1,否则返回0。

2. 编写main函数,line字符串和str1字符串均用测试数据,从键盘输入考生本人准考证号(str2字符串),调用Replace_string函数,用str2字符串替换line中str1字符子串,并将替换后的line字符串保存到结果文件myf2.out中。最后将考生本人的准考证号字符串也保存到结果文件myf2.out中。

测试数据

测试数据:line字符串为“My EXAM_number is 0112404321.”,str1字符串为“0112404321” 运行结果:“My EXAM_number is 0112400123.”(0112400123为某考生的准考证号), My exam number is:0112400123(考生本人准考证号) 【要求】

1、 源程序文件名必须取为myf2.c,输出结果文件名为myf2.out。

2、 数据文件的打开、使用、关闭均用C语言标准库中缓冲文件系统的文件操作函数实现。 3、 源程序文件和运行结果文件均需保存在考试盘根目录中供阅卷使用。 4、 不要复制扩展名为.obj和.exe的文件到考试盘上。

第七套C语言上机试卷

一、改错题 【题目】

函数void sort(struct T items[],int low,int high)的功能是:对items结构数组中从下标low开始到high为止的所有数组元素按成员name以字典序排序,并输出排序后的结果。

含有错误的源程序如下: #include #include struct T

{char name [20],num[20]; };

void sort(struct T items[],int low,int high) {struct T temp; int k,j;

for(k=low;k

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

{temp=items[j];items[j]=items[j+1];items[j+1]=temp;} }

void main(void)

{struct T stu[5]={\ \ int k;

sort(stu,0,4);

printf(\ for(k=0;k<5;k++)

printf(\stu[k].name,stu[k].num); }

【要求】

1.将上述程序录入到文件myf1.c中,然后根据题目的要求以及程序中语句之间的逻辑关系对程序中的错误进行修改。

2.改错时,可以修改语句中的一部分内容,调整语句的次序,增加少量的变量说明或编译预处理命令,但不能增加其他语句,也不能删去整条语句。

3.改正后的源程序myf1.c保存在考试盘的根目录下,供阅卷用,否则不予评分。 二、编程题 【题目】

1. 编写函数 void count(char a[ ],char w[ ][10],int n,int b[ ])。其功能是:统计w指向的

数组中n个单词在a指向的字符串中各自出现的次数(将非字母字符看做单词分隔符),并将统计结果依次保存在b指向的数组中。

2. 编写main函数。采用数组初始化方式将以下测试数据(原数列)保存在数组中,

调用count函数作统计,将统计结果(所有单词以及各自出现的次数)保存到结果文件myf2.out中。最后将考生本人的准考证号字符串也保存到结果文件myf2.out中。

例如,测试数据为

a中字符串:\ w中的单词:\则输出结果为

this:1,that:1,is:2,a:1,an:1,book:1

my exam number is:0112400123(考生本人的准考证号)

【要求】

1.将源程序文件取名为myf2.c,输出结果文件取名为myf2.out。

2.数据文件的打开、使用和关闭均用C语言标准库中缓冲文件系统的文件操作函数实现。 3.源程序文件和运行结果文件均需保存在考试盘的根目录下,供阅卷用。 4.不要复制扩展名为OBJ和EXE的文件到考试盘上。

第八套C语言上机试题

一、改错题

【题目】从键盘输入十个字符串,从中求出最长的一个字符串,并将该串及其长度送入MYF1.OUT中。含有错误的源程序为: #include main( )

{int i ,maxlen,len;

char inline[10][100],maxline[100]; FILE *fp;

if((fp=fopen(\ EXIT(1); for(i=0;i <10;i ++) {gets(inline[i]);

fprintf(fp, \ } maxlen =0

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

{strlenth(inline[i ],&len); if(len>maxlen)

strcpy(maxline,inline[i ]),maxlen=len; }

fprintf(fp, \fclose(fp); }

strlenth(char *p, int *len) {*len=0;

while (p[len]!= '\\0')++len; }

【要求】

1. 将上述程序录入到文件myf1.c中,然后根据题目的要求以及程序中语句之间的逻辑关系对程序中的错误进行修改。

2. 改错时,可以修改语句中的一部分内容,调整语句的次序,增加少量的变量说明或编译预处理命令,但不能增加其他语句,也不能删去整条语句。

3. 改正后的源程序myf1.c保存在考试盘的根目录下,供阅卷用,否则不予评分;并将输入的字符串和运行结果以myf1.out为文件名也保存在考试盘的根目录下。 二、编程题

【题目】计算自然数e和圆周率π的值,e精确到小数点后6位。 求e的近似值的计算公式为:

e=1+1/1!+1/2!+1/3!+……+1/n!+……(n=0,1,2,3,…) 求π/2的近似值的计算公式为:

?2??2?n???2?n??? 224466?????????2?n?1??2?n?1?133557 其中n =1,2,3,……,取n=1000时的π值。

【要求】

1. 将源程序文件取名为myf2.c,程序运行的结果保存于myf2.out文件中。

2. 数据文件的打开、使用和关闭等操作均用C语言标准库中缓冲文件系统的文件操作函数实现。

3. 源程序文件和运行结果文件均需保存在考试盘的根目录下,供阅卷用。 4. 不要将myf2.obj和myf2.exe保存到考试盘上。

第九套C语言上机试题

一、改错题

【题目】函数check检查给定的字符串s中左圆括号与右圆括号的个数是否匹配,若两者个数匹配则函数返回值为0,若左括号数大于右括号数则返回两者差值的负值,否则返回两者差值的正值。 #include main()

{char a[100]; int i;

a=\ i=check(a);

printf(\

int check(s) char *s;

{int left,right; left=0,right=0; while(s='\\0')

{if(*s= ='(')left++; if(*s= =')')right++; s++; }

if(left>right)return(left-right); else if(left

1.将上述程序录入到文件myf1.c中,然后根据题目的要求以及程序中语句之间的逻辑关系对程序中的错误进行修改。

2.改错时,可以修改语句中的一部分内容,调整语句的次序,增加少量的变量说明或编译预处理命令,但不能增加其他语句,也不能删去整条语句。

3.改正后的源程序myf1.c保存在考试盘的根目录下,供阅卷用,否则不予评分。 二、编程题

【题目】在直角坐标系统中,直线方程y=ax+b和圆方程x2+y2=r2,两者之间有三种情况:直线和圆不相交,相切,相交于两点。 令4(a2r2+r2-b2)=t1,则有:

(1)当t1<0时,直线与圆不相交,输出:\(2)当t1=0时,直线与圆相切,输出切点的坐标:

x1??2ab y1=ax1+b 22(a?1)(3)当t1>0时,直线与圆相交,输出两个交点的坐标:

x1??2ab?t1 y1=ax1+b 22(a?1)?2ab?t1 y2=ax2+b

2(a2?1)x2?方程的系数要求:

系数a ,b , r分别取以下值

3 4 5 【要求】

1.将源程序文件取名为myf2.c,输出结果保存在文件myf2.out中。

2.数据文件的打开、使用和关闭均用C语言标准库中缓冲文件系统的文件操作函数实现。 3.源程序文件和运行结果文件均需保存在考试盘的根目录下,供阅卷用。 4.不要复制扩展名为OBJ和EXE的文件到考试盘上。

第十套C语言上机试题

一、改错题

【题目】输入一行字符串,把该字符串中的每一个字母串的首字母都换成大写字母,并输出转换后的字符串。如输入 good mor23ning!,则输出为Good Mor23Ning!。 注:字母串是以字母开头的字母序列(不区分大小写),即不同字母串之间用非字母隔开。 #include

int change(char *c,int flag)

{if(flag= =0 &&(*c<='z'&&*c>='a'||*c<='Z'&&*c>='A')) {if(*c<='z'&&*c>='a') *c=*c-'a'+’A’; return 1;}

else if(flag= =1 &&!(*c<='z'&&*c>='a'||*c<='Z'&&*c>='A')) return 0; return flag; } main()

{int flag=0; char c;

for(;(c=getchar())!='\\n';) {flag=change(&c,flag); putchar(c); }

putchar('\\n'); } 【要求】

1.将上述程序录入到文件myf1.c中,然后根据题目的要求以及程序中语句之间的逻辑关系对程序中的错误进行修改。

2.改错时,可以修改语句中的一部分内容,调整语句的次序,增加少量的变量说明或编译预处理命令,但不能增加其他语句,也不能删去整条语句。

3.改正后的源程序myf1.c保存在考试盘的根目录下,供阅卷用,否则不予评分。 二、编程题

【题目】用筛选法求100以内的素数。算法为:

1.用一个一维数组a,其初值为:2,3,4,5,6,7,8,9,??,100; 2.对每一元素a[i](i=1,2,……,99),若a[i]不等于0,则从该元素的后一个元素开始,凡是a[i]倍数的数组元素均不是素数(置为0); 3.数组a中不为0的元素,均为素数。 【要求】

1.将源程序文件取名为myf2.c,输出结果保存在文件myf2.out中。

2.数据文件的打开、使用和关闭均用C语言标准库中缓冲文件系统的文件操作函数实现。 3.要求每一行输出5个素数。

4.源程序文件和运行结果文件均需保存在考试盘的根目录下,供阅卷用。 5.不要复制扩展名为OBJ和EXE的文件到考试盘上。

第十一套C语言上机试题

一、改错题 【题目】

下面的程序读入一串字符(以“#”结束),将长度最长的单词、该单词的长度以及未在该单词中出现的字母输出(若这样的单词多于一个,则只取第一个)。假定串中只含小写字母和其他非字母字符,把由非字母字符隔开的字母串叫做单词,而不管它是否有意义。

含有错误的源程序如下: #include #define max 100 emptys(char *ss) {int i;

for(i=0;i<26;i++) ss[i]=' '; }

stringcopy(char *s,char *t,int n) {int i;

for(i=0;i

main()

{char x,s1[26],s2[26]; int length,i;

char a[max],b[max]; length=0; i=0; emptys(s1); do{x=getchar();

if((x>='a')&&(x<='z')) {a[i++]=x; s1[x-97]=x;} else

{if(i>length)

{stringcopy(s1,s2,26); stringcopy(a,b,100); length=i; }

emptys(s1); i=0; }

}while(x!='#');

for(i=0;i

if(s2[x-97]==' ')printf(\ putchar('\\n'); } 【要求】

1.将上述程序录入到文件myf1.c中,然后根据题目的要求以及程序中语句之间的逻辑关系对程序中的错误进行修改。

2.改错时,可以修改语句中的一部分内容,调整语句的次序,增加少量的变量说明或编译预处理命令,但不能增加其他语句,也不能删去整条语句。

3.改正后的源程序myf1.c保存在考试盘的根目录下,供阅卷用,否则不予评分。 二、编程题 【题目】

编程完成以下功能:读入任意多个正整数(“0”作为结束标记),然后将其中恰好含有三个相同数字(另一个数字与它们不同)的四位数写到文件myf2.out中。调试时必须依次输入下列正整数:1211、2、2323、2333、4443、1111、0。 【要求】

1.将源程序文件取名为myf2.c,输出结果文件取名为myf2.out。

2.数据文件的打开、使用和关闭等操作均用C语言标准库中缓冲文件系统的文件操作函数实现。

3.源程序文件和运行结果文件均需保存在考试盘的根目录下,供阅卷用。 4.不要将myf2.obj和myf2.exe保存到考试盘上。

第十二套C语言上机试题

一、改错题 【题目】

计算机所能表示与处理的数的有效数字位数是有限的。例如,在字长32位的计算机上运行的程序中可处理的整数的最大值是4294967295。对于求阶乘n!,当n较大时,会产生溢出。为了完成高精度阶乘运算,可以用一个整型数组存放一个参加运算的操作数,其中每个数组元素存放十进制表示的正整数的一个数字位。下列函数fact中,kc表示进位,若当计算至m[MAX-1]时仍有进位,视为溢出,函数返回0,否则返回1。

例如,程序正确时,能计算并输出7!,值为5040,15! 值为1307674368000。 含有错误的源程序如下: #define MAX 200 int fact(int n,int *m) {int i,j,k,kc; m[0]=1;

for(i=2;i<=n;i++) {kc=0;

for(j=0;j

if(kc!=0) return 0; else return 1; }

main()

{int a[MAX],i,n;

printf(\ scanf(\d\

for(i=0;i

if(!fact(n,a)) printf(\ else

{i=MAX-1;

while(a[i]==0) i--; for(;i>=0;i--)

printf(\ }

printf(\【要求】

1.将上述程序录入到文件myf1.c中,然后根据题目的要求以及程序中语句之间的逻辑关系对程序中的错误进行修改。

2.改错时,可以修改语句中的一部分内容,调整语句的次序,增加少量的变量说明或编译

预处理命令,但不能增加其他语句,也不能删去整条语句。

3.改正后的源程序myf1.c保存在考试盘的根目录下,供阅卷用,否则不予评分。 二、编程题 【题目】

编程要求如下:

1.编写函数void fun(char xx[ ])。其功能是:在xx所指向字符串中的所有数字字符之前分别插入1个字符“$”。例如,如果xx所指向的字符串是“A1B23CD45”,则变换后的字符串应为“A$1B$2$3CD$4$5”。

2.编写主函数。输入一个含有数字字符的字符串“A1B23CD45”,调用函数fun对该字符串作变换,将变换后的字符串保存在文件myf2.out中。 【要求】

1.将源程序文件取名为myf2.c,输出结果文件取名为myf2.out。

2.数据文件的打开、使用和关闭等操作均用C语言标准库中缓冲文件系统的文件操作函数实现。

3.源程序文件和运行结果文件均需保存在考试盘的根目录下,供阅卷用。 4.不要将myf2.obj和myf2.exe保存到考试盘上。

答案:

第一套上机试题

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

#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列的最小元素的值*/ {int k,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

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

main()

{int index[m],i,j,k; for(i=0;i

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

printf(\ }

i=s[1];k=0; /*逻辑错,数组s中存放的是a数组中每一列的最小值,比较时应从数组的第0个元素开始,而下面的for循环是从第1个元素开始的,所以i=s[1]应改为i=s[0]*/ for(j=1;j

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

printf(\二、编程题 【分析】:本题的主要功能是建立一个3行8列的二维数组,并给其元素赋值,其中第1、2行的值可通过递推公式xi+1=(25*xi+357)24得到,第三行的值取前两行同列元素的最大公约数,所以编程时可用一个函数来实现求公约数的算法。

#include #include #define n 8

/*函数gcd实现求最大公约数的算法*/ gcd(int a,int b) {int c;

while(b!=0)

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

main()

{int i,j,x,a[3][n]; FILE *f;

if((f=fopen(\ {printf(\ x=26;

/*下面二重for循环实现给第1、2行数组元素赋值的功能*/ for(i=0;i<2;i++) for(j=0;j

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

/*下面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

fclose(f); }

第二套上机试卷

一、改错题

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

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

使用putchar函数必须在程序开头加上文件包含#include \;scanf语句中必须是地址序列,故scanf(\应改为scanf(\,且调式时注意将“num=”原样输入;某数字若转换为相应数字字符,应加上字符'0'或48(字符'0'的ASCII码值),故digit[n++]=m;应改为digit[n++]=m+'0';;最后输出时,n已在前面多加了一次,故而输出时应先减1,故for(;n>=0;n--)中第一个表达式应加上n--或--n或n=n-1。 【答案】①在程序开头加上#include \

②将原第五行的scanf(\改为scanf(\ ③将原第十一行的digit[n++]=m;改为digit[n++]=m+'0'; ④将原第十六行的for(;n>=0;n--)改为for(n--;n>=0;n--) 二、编程题

【知识点】字符串应用、数据文件的使用 【解析】注意,按要求必须调用函数,且使用数据文件完成输出。使用数据文件有5大步骤:①#include ,②用FILE *定义指针,③用fopen(\打开文件并赋值给指针,④用fprintf输出结果,⑤用fclose关闭文件。

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

字符'\\\\'才能表达字符\\;另外,文件的命名一定要严格按照规定处理,千万不要随便命名。 【参考答案】

#include \int compress(char s[]) {int n,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()

{char num[100]; int count=0; FILE *fp;

fp=fopen(\ gets(num);

count=compress(num);

fprintf(fp,\ printf(\ fclose(fp); } 运行结果如下:

@ I wil sucesful & and you to ! #

第三套上机试卷

一、改错题

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

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

本题要求“从键盘上接受一个含有空格的字符串”,scanf是做不到的,它遇到第一个空....格即认为读入完毕,故应替换成gets函数;程序中使用了strcpy函数,就必须在程序开头加上文件包含#include \;根据选择法升序排序要领,每次找到一个“更小的字符”由r指着,直到指向最小的为止,而不是修改r所指字符的值,故if(*r>*q)*r=*q;应改为if(*r>*q) r=q;;当r与p所指不同时,交换二者所指字符的值,即使得p所指字符为每次的最小,故应将if(r/=p)改为if(r!=p)。

【答案】①在程序开头加上文件包含#include \ ②将原第五行的scanf(\改为gets(str); ③将原第八行的*r=*q; 改为r=q; ④将原第九行的if(r/=p)改为if(r!=p) 二、编程题

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

【解析】 关于“二维数组应用”的题目,一般都要仔细观察,找出规律后再编程。本题中原数组的任意一个元素a[i][j]旋转后,位置处于b中第3-j行i列。注意,按要求必须调用函数,且使用数据文件完成输出。使用数据文件有5大步骤:①#include ,②用FILE *定义指针,③用fopen(\打开文件并赋值给指针,④用fprintf输出结果,⑤用fclose关闭文件。

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

字符'\\\\'才能表达字符\\;另外,文件的命名一定要严格按照规定处理,千万不要随便命名。 【参考答案】

#include \

int rotate(int a[4][4],int b[4][4]); main() {FILE *fp;

int i,j,x[4][4],y[4][4],s;

fp=fopen(\

if(fp= =NULL){printf(\ exit(1);} for(i=0;i<4;i++) for(j=0;j<4;j++)

scanf(\ s=rotate(x,y); for(i=0;i<4;i++) {for(j=0;j<4;j++)

fprintf(fp,\ fprintf(fp,\

}

fprintf(fp,\ fclose(fp); }

int rotate(int a[4][4],int b[4][4]) {int i,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; }

第四套上机试卷

一、改错题

含有错误的源程序如下:

void match(char *pat,char str) ① {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(\打开文件并赋值给指针,④用fprintf输出结果,⑤用fclose关闭文件。

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

字符'\\\\'才能表达字符\\;另外,文件的命名一定要严格按照规定处理,千万不要随便命名。 【参考答案】 #include

int inv(int x) {int y;

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

main()

{FILE *out; int i,j;

if((out=fopen(\= =NULL) {printf(\ for(i=30;i<50;i++) for(j=30;j<50;j++)

if((i/10!=i)&&(i*j= =inv(i)*inv(j))) /* i/10!=i确保十位与个位数字不同*/ fprintf(out,\ fclose(out); }

第五套上机试卷

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

#include #define N 50

void sum(int n,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

return total; }

main()

{ int tol,n,i,num[n]; /*属第一类错误。数组的声明不正确,数组的下标必须为常量或常量标识符。

应改为:num[N] 或 num[50] */

do

{ printf(\ scanf(\ }while(n<=2||n>=50); tol=sum(N,num); /*属第二类错误。本题要求生成数列的前n(n<50)项,而N是常量。应改为:

sum(n,num) */

for(i=0;i

printf((i+1)%5?\ printf(\

printf(\

}

二、编程题 【分析】:编写程序时,通过按照题目的要求编程。main函数实现对文件的操作和数据的输入。

#include #define N 100

int chang(char a[],int b[],int *n) {int sign,k=-1,i; *n=0;

if(a[0]= ='-') sign=1; else sign=0;

for(i=0;a[i]!='\\0';i++) if(a[i]>='0'&&a[i]<='9') b[++k]=a[i]-'0'; *n=k;

return sign;} main()

{char str[N];

int num[N],i,j,sign,n; FILE *fp;

if((fp=fopen(\{printf(\exit(0);}

for(j=0;j<2;j++) {gets(str);

sign=chang(str,num,&n); fprintf(fp,\ fprintf(fp,\ for(i=0;i<=n;i++)

fprintf(fp,\ fprintf(fp,\ }

fclose(fp); }

第六套上机试题

一、改错题

含有错误的源程序: #include #include #define N 5 struct student

{ char name[10]; int score;

} ―――――――――――① void sort(struct student stud[],int n) { int i,j;

struct student p;

for(i=1;i

for(j=i-1;j>0 && p>stud[j];j--) ―――――――――――③ stud[j+1]=stud[j]; stud[j+1]=p; } }

void main()

{ struct student stud[N]={\ int i;

sort(stud,N);

printf(\

for(i=0;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(\改为printf(\二、编程题

【知识点】字符串操作、函数、文件 【解析】仔细阅读并分析【编程要求】。【编程要求1】已对函数Replace_string指定了函数名、函数类型、形参类型和个数,并详细说明了其功能。在line指向的字符串中查找str1指向的字符子串的关键语句是当“str1[j]= =line[loc]&&str1[j]!='\\0'”时继续循环查找,当 因“str1[j]!='\\0'”退出循环时,则找到str1指向的字符子串,此时用str2指向的字符串替换在

line中的str1字符子串,返回。【编程要求2】编写主函数主要功能要求是保存结果到数据文件、调用Replace_string函数、输入测试数据。这部分是最常规和基本的要求,必须掌握。 【参考答案】 #include #include

int Replace_string (char line[],char str1[],char str2[]) { int i=0,j,loc; char temp[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); return 1; } else i++; }

return 0; }

main()

{ FILE *fp;

char string[100]=\ char number[11]=\ fp=fopen(\ fprintf(fp,\ gets(num);

Replace_string (string,number,num); fprintf(fp,\

fprintf(fp,\ fclose(fp); }

第七套上机试卷

一、改错题

含有错误的源程序如下: #include #include struct T

{char name [20],num[20]; };

void sort(struct T items[],int low,int high) {struct T temp; int k,j;

for(k=low;k

for(j=low;jitems[j+1].name) ② {temp=items[j];items[j]=items[j+1];items[j+1]=temp;} }

void main(void)

{struct T stu[4]={\ ③ \ int k;

sort(stu,0,4);

printf(\ for(k=0;k<5;k++)

printf(\ ④ }

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

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

符合C语言的规定等,此类错误可通过调试(按F9键),根据提示进行改正。另一类是逻辑错误,程序调试已通过(报success),但运行结果不正确,此类错误的修改必须要理解程序后方能改正。

本题使用起泡法完成排序,①处j

j+1才取到high-k-1,例如,刚开始当k为0时,最后一个比较的元素下标为high-1,而实际上根据实参(值已为4)传递而来的最后一个元素的下标应为high,故①处应改为j

①j

②if(strcmp(items[j].name, items[j+1].name)>0) ③stu[5]

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

二、编程题

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

【解析】编程题的结果一般都是客观的,这样便于老师主观阅卷评分,虽然考生个人的准考

证号是各异的,对评阅老师却是可以通过所交磁盘标签直接观察到,故必须如实输入,不能直接套用题中例子。注意,按要求必须调用函数,且使用数据文件完成输出。使用数据文件有5大步骤:①#include ,②用FILE *定义指针,③用fopen(\打开文件并赋值给指针,④用fprintf输出结果,⑤用fclose关闭文件。

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

字符'\\\\'才能表达字符\\;另外,文件的命名一定要严格按照规定处理,千万不要随便命名。 【参考答案】 #include #include #include

void count(char a[],char w[][10],int n,int b[]) {int i=0,j,k=0;char s[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

if(strcmp(s,w[j])= =0){b[j]++;break;} k=0; /*让s重新存放另一个单词*/ } } }

main() {FILE *fp;

char line[80]=\/*按要求初始化,用二维字符数组的一行存放一个单词便于后面比较处理*/ int c[6]={0},m;

count(line,word,6,c);fp=fopen(\ if(fp= =NULL){printf(\ for(m=0;m<6;m++)fprintf(fp,\

fprintf(fp,\注意输入实际准考证号*/ .. fclose(fp); }

第八套C语言上机试题

一、改错题

①将原第六行的if(fp= =fopen(\ EXIT(1);中第一个等号= =改为赋值号=

②将原第十二行的strlenth(inline[i ],len);改为strlenth(inline[i ],&len); ③将原第十九行的strlenth(char p, int len)改为strlenth(char *p, int *len) ④将原第二十行的len=0;改为*len=0; 二、编程题

#include #include main( )

{int i ,k;float e1,e,fat,pa=1,term=1,j=2; FILE *fp;

if((fp=fopen(\e1=1;e=2;fat=2;i=3; while(fabs(e-e1)>1e-6) {e1=e; e+=1.0/fat; fat*=i ++; }

for(k=1;k<=1000;k++) {term=j/(2*k-1)*j/(2*k+1); pa*=term; j+=2; }

fprintf(fp,\fprintf(fp,\fclose(fp); }

第九套C语言上机试题

一、改错题

①将原第五行的a=\改为strcpy(a,\②在程序开头加上#include \

③将原第十三行的while(s='\\0')改为while(*s='\\0') ④将原第十八行中的>改为< ⑤将原第十九行中的<改为> 二、编程题

#include #include main()

{float a,b,r,x1,y1,x2,y2,t1; FILE *fp;

fp=fopen(\ printf(\输入系数:\

scanf(\ t1=4*(a*a*r*r+r*r-b*b); printf(\ if(fabs(t1)<1e-4)

{x1= -2*a*b/2/(a*a+1); y1=a*x1+b;

printf(\ fprintf(fp,\ } else

if(t1>0)

{x1=(-2*a*b-t1)/2/(a*a+1); y1=a*x1+b;

x2=(-2*a*b+t1)/2/(a*a+1); y2=a*x1+b;

printf(\ fprintf(fp,\ } else

{printf(\ fprintf(fp,\ fclose(fp); }

第十套C语言上机试题

一、改错题

①原第四行的c=c-'a';改为*c=*c-'a'+'A';

②原第六行的else if(flag= =1 &&(*c<='z'&&*c>='a'||*c<='Z'&&*c>='A'))中的&&后加上逻辑非运算符!

③原第七行的return 1;改为return 0;

④原第十四行的flag=change(c);改为flag=change(&c,flag); 二、编程题

#include #include main()

{int i,j,line,a[101]; FILE *fp;

if((fp=fopen(\ {printf(\ exit(1); }

for(i=2;i<101;i++)a[i]=i; for(i=0;i

if((a[j]%a[i])= =0)a[j]=0; for(i=2,line=0;i<101;i++) if(a[i]!=0)

{fprintf(fp,\ line++;

if(line%5= =0)fprintf(fp,\ }

fclose(fp); }

第十一套C语言上机试题

一、改错题

①将原第三行的emptys(char ss)改为emptys(char * ss)

②将原第九行的for(i=0;i

③将原第二十九行的for(i=0;i

#include main()

{int x,a,b,c,d; FILE *f;

if((f=fopen(\

{printf(\ scanf(\ while(x!=0)

{a=x/1000; b=x00/100; c=x0/10; d=x;

if((a= =b)+(a= =c)+(a= =d)+(b= =c)+(b= =d)+(c= =d)= =3) if(x>999) fprintf(f,\ scanf(\ }

fclose(f); }

第十二套C语言上机试题

一、改错题

①将原第二行的int fact(int n)改为int fact(int n,int m[ ]) ②将原第九行的kc=kc/10;改为kc=k/10;

③将原第十九行的scanf(\改为scanf(\%d\④将原第二十二行的if(fact(n,a))改为if(!fact(n,a)) 二、编程题

#include #include #include void fun(char xx[]) {int len,i,j=0,k; len=strlen(xx); while(xx[j])

if(isdigit(xx[j])) {for(i=len;i>=j;i--) xx[i+1]=xx[i]; xx[j]='$'; j+=2; len++; } else j++;} main()

{char s[80]; FILE *fp;

if((fp=fopen(\ {printf(\ scanf(\ fun(s);

fprintf(fp,\ fclose(fp); }