1、江苏省高等高等学校非计算机专业学生计算机基础知识和应用能力等级考试上机试卷二级 C语言 (本试卷完成时间 70分钟)一、改错题(16分)【程序功能】 输入两个正确日期且年份在1900-9999范围内,计算并输出两个日期之间间隔的天数。例如:2008-8-1和2009-8-1之间间隔的天数为365。 提示:被4整除并且不能被100整除的年份是闰年,能被400整除的年份也是闰年,其他年份则是平年。【测试数据与运行结果】 显示:first date: 输入:1980-2-1显示:second date: 输入:2009-8-1输出:10774 days【含有错误的源程序】#include#defin
2、e leap(int y) (y)%4=0&(y)%100!=0|(y)%400=0)struct d int y,m,d; ;int days(struct d d1, struct d d2) int mon213=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31;int i; long td=0;for(i=d1.y;id2.y;i+) td=leap(i)?366:365;for(i=1;id1.m;i+) td- =monleap(d1.y)i;td-=d1.d-1;for(i=1;
3、id2.m;i+) td+=monleap(d2.y)i;td+=d2.d-1; return td;void main() struct d1,d2; puts(“n first date:”); scanf(“%d-%d-%d”,&d1.y,&d1.m,&d1.d); puts(“n second date:”); scanf(“%d-%d-%d”,&d2.y,&d2.m,&d2.d);printf(“%d days”,days(d1.y,d2.y); getch();【要求】1 将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。2 改错时,
4、可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其他语句 ,也不能删去整条语句。3 改正后的源程序(文件名为myf1.c)保存在T:盘根目录中功阅卷使用,否则不予评分。/*二 编程题(24分)【程序功能】 输入两个自然数P和Q(PQ),找出满足下列条件的整数组(K,M,N)。(1) PKMQ(2) K*K+M*M=N*N【编程要求】1.编写函数int chlm(int p,int q,int a 3)实现以下功能:查找K,M在p,q范围内取值且满足以上条件的所有整数组(K,M,N)。若找到则将这些整数组保存到a指向的数组中,函数返回找到的整数组的组数。若
5、找不到则函数返回0。2.编写函数main实现以下功能:声明二维数组a和变量p、q,输入两个自然数并保存到p和q中(pq),调用chlm函数在p,q范围内查找满足以上条件的整数组。若找不到则在屏幕上输出“out found”,否则将查找结果保存到a数组中,输出a数组数据到屏幕及文件myf2.out中。最后将考生本人的准考证号输出到文件myf2.out中。【测试数据与运行结果】输入: p=12 q=38输出12 16 2012 35 37 15 20 2515 36 39 16 30 3418 24 3020 21 2921 28 3524 32 4024 36 45*/2 江苏省高等高等学校非计
6、算机专业学生计算机基础知识和应用能力等级考试上机试卷二级 C语言 (本试卷完成时间 70分钟)/*一 改错题(16分)【程序功能】函数dtoh实现将参数num的值表示为一个十六进制形式的字符串,并将该字符串存储在一个动态申请的存储区内,函数返回动态存储区的起始地址。【测试数据及运行结果】输入:1234输出:4d2含有错误的源程序*/#include#includechar dtoh(unsigned num) char digits=”0123456789abcdef”; char *s; int n=0; unsigned un=num; while(un) n+; un/=16; s=(c
7、har*)malloc(n+1)*sizeof(char); if(s=null) printf (“Memory request failed!n”);exit(1); sn-=”0”;while(num) sn-=digitsnum/16; /*取一位十六进制数字字符*/ num/=16;return s;void main() char *p; unsigned n; scanf(“%u”,&n); p=dtoh(n); printf(“%s”,p);free(p); getch();【要求】1. 将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进
8、行修改。2. 改错时,可以修改语句中的一部内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其他语句,也不能删去整条语句。3. 改正后的源程序(文件名myf1.c)保存在T:盘根目录共阅卷使用,否则不予评分。二、编程题(24分)【程序功能】在给定的范围内查找并输出所有满足以下条件的整数对(a,b)及与(a,b)关联的反序数对(c,d):(1)a小于b:(2)a和b的十进制表示均是三位数且各位上的数字互不相同;(3)a的反序数(记作c)和b的反序数(记作d)也都是三位数并且ab等于cd。例如,与整数对(302,406)关联的反序数对是(203,604),302406=203604
9、因此(302,406)是满足上述条件的整数对。【编程要求】1. 编写函数int find(int x4,int m,int n)实现以下功能:若m和n的十进制表示不是三位数则函数返回0。否则,将取值在m,n范围内所有满足上述条件的整数对以及与这些整数对关联的反序数对保存到x指向的二维数组中,函数返回x数组中保存的数据行数。2. 编写函数main实现以下功能:声明一个100行4列的二维数组a,用a数组作实参调用find函数在300,450范围内查找,将找到的满足上述条件的整数对及关联的反序数对保存到a数组。按以下格式将a数组中数据输出到屏幕及文件myf2.out中。最后将考生本人准考证输出到文
10、件myf2.out中。【测试数据与运行结果】输出: 301*309=103*903 302*406=203*604 304*403=403*304 306*402=603*204 312*426=213*624 314*413=413*314 321*369=123*963 324*423=423*324 402*408=204*804 412*428=214*824【要求】1. 源程序文件为myf2.c,输出结果文件名myf2.out。2. 数据文件的打开、使用、关闭均使用C语言标准库中缓冲文件系统操作函数实现。3. 源程序文件和运行结果均需要保存T:盘根目录中供阅卷使用。4. 不要复制扩展
11、名为obj和exe的文件到T:盘中。4 江苏省高等高等学校非计算机专业学生计算机基础知识和应用能力等级考试上机试卷二级 C语言 (本试卷完成时间 70分钟)一、改错题(16分)【程序功能】对一个二维数组中的数据排序。排序规则如下:将整个数组中值最小的元素所在行调整为数组第1行(行下标为0),将除第1行外剩余行中值最小的元素所在行调整为数组第2行,将除第1、2行外剩余行中值最小的元素所在行调整为数组第3行,其他依此类推。【测试数据与运行结果】数组初始化数据: 输出:3 4 5 6 8 2 1 08 2 1 0 1 2 3 4 5 4 3 2 5 4 3 21 2 3 4 3 4 5 6【含有错误
12、的源程序】#include “stdio.h”int getmin(int a,int n) int i,min=a0; for(i=1;imin) min=ai; return min;void lineswap(int a,int b,int *n) int i, t; for(i=0;in;i+) t=ai; ai=bi; bi=t; void main() int a4=3,4,5,6,8,2,1,0,5,4,3,2,1,2,3,4,i,j; for(i=0;i3;i+) for(j=1;j4;j+) if(getmin(aj,4)getmin(ai,4) lineswap(aj,in
13、t ai,4); for(i=0;i4;i+) for(j=0;j4;j+)printf(“%d “,aij); printf”n”);getch();【要求】1. 将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。2. 改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其他语句 ,也不能删去整条语句。3. 改正后的源程序(文件名为myf1.c)保存在T:盘根目录中功阅卷使用,否则不予评分。二、编程题(24分)【程序功能】计算由两个整数生成的两个合法代码的码距。这里的合法代码定义为由16个二进制数字字
14、符组成的字符串。例如“0000000000100101”是一个合法代码。码距是指两个合法代码中对应位数字字符不同的位数。例如,合法代码”0000000000100101”和”0000000000001110”自又向左1、2、4、6位上具有不同数字字符,因此这两个合法代码的码距为4。【编程要求】1. 编写函数int hamming(int x,int y,chara ,char b )实现以下功能:先将形参x和y分别转换为2个合法代码并按从低位到高位的顺序分别保存2个合法代码到a和b指向的数组中(不足16位时高位补字符0)再计算a数组和b数组中的两个合法代码的码距,函数返回该码距。2. 编写函数
15、main 实现以下功能:声明字符数组a 、b和变量m、n,输入两个整数并保存到m和n中,若m、n的值在032767范围内则用m、n和数组a、b作实参调用hamming函数,计算由m和n生成的两个合法代码的码距,将a、b数组中存储的合法代码及这两个代码的码距输出到屏幕及文件myf2.out中。最后将考生本人的准考证输出到文件myf2.out中。.【测试数据与运行结果】输入:m=16 n=38输出: a:0000000000010000 b:0000000000001000 distance of 16 and 8 is 2【要求】1. 源程序文件为myf2.c,输出结果文件名myf2.out。2
16、 数据文件的打开、使用、关闭均使用C语言标准库中缓冲文件系统操作函数实现。3. 源程序文件和运行结果均需要保存T:盘根目录中供阅卷使用。4. 不要复制扩展名为obj和exe的文件到T:盘中。6 江苏省高等高等学校非计算机专业学生计算机基础知识和应用能力等级考试上机试卷二级 C语言 (本试卷完成时间 70分钟)一、改错题(16分)【程序功能】将一个实数转换为二进制科学计数法表示并输出。二进制科学记数法是指将一个绝对值大于2或者小于1的实数记为a2n形式,其中尾数a是用二进制表示的实数且1|a|2, 指数中的n是用二进制表示的整数。例 如:0.125的科学计算法表示是1.02-11若用B代表基数
17、2,则a2n可表示为aBn 的形式。例如,1.02-11表示1.0B-11。【测试数据与运行结果】第一次运行时输入:0 输出:0.0B0第二次运行时输入:0.125 输出:1.0B-11第三次运行时输入:315 输出:1.00111011B+1000【含有错误的源程序】#include void outBinary(int x) if(x/2) outBinary(x/2); printf(“%d”,x%2);void outFloatBinary(float x) int e=0; if(x=0) puts(0.0B0);return; if(x=2.0) e+;x/=2; while(x0
18、) printf(“B+”); outBinary(e); else printf(“B-”); outBinary(-e); printf(“n”);void main() float a;scanf(“%f”,&a); outFloatBinary(a);getch();【要求】1. 将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。2. 改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其他语句 ,也不能删去整条语句。3. 改正后的源程序(文件名为myf1.c)保存在T:盘根目录中功阅卷使用,否
19、则不予评分。二、编程题(24分)【程序功能】求3000以内的亲密数对.如果A的全部真因子(包括1,不包括A自身)之和等于B;B的全部真因子之和等于A,则称整数A和B为一对亲密数。【编程要求】1. 编写函数int frinum(long s2,long n)实现如下功能:找到2n分范围内的所有亲密数对,将这些亲密数对保存到s指向的二维数组中。返回函数s数组中存储的亲密数对的对数。2. 编写函数main 实现以下功能:声明二维数组s和变量n,输入一个正整数并保存到n中,用二维数组s和变量n作为实参调用frinum函数,将n以内的所有的亲密数对输出到屏幕及文件myf2.out中。最后将考生本人的准考
20、证输出到文件myf2.out.【测试数据与运行结果】输入: n=3000输出: (220,284) (1184,1210) (2620,2924)【要求】1. 源程序文件为myf2.e,输出结果文件名myf2.out。2. 数据文件的打开、使用、关闭均使用C语言标准库中缓冲文件系统的文件操作函数实现。3. 源程序文件和运行结果均需要保存T:盘根目录中供阅卷使用。4. 不要复制扩展名为obj和exe的文件到T:盘中。8 江苏省高等高等学校非计算机专业学生计算机基础知识和应用能力等级考试上机试卷二级 C语言 (本试卷完成时间 70分钟)一、改错题(16分)【程序功能】函数replace的功能是用s
21、2指向的字符串替换s1指向的字符串中第n个字符(下标为n-1)之后到第m个字符(下标为m-1)之前的m-n-1个字符组成的字串(mn+1)。例如,若s1指向的字符串为“abcd”、s2指向的字符串为“xyz”、n=1、m=3,则执行替换操作后s1指向的字符串为“axyzcd”。【测试数据与运行结果】显示: s1=qwertyuiop s2=zxc input n,m;输入: 1 9输出: qzxcop【含有错误的源程序】#include #includevoid replace(char s1,int n,int m,char s2) char s80 int i,j,len1,len2,le
22、n;len1=strlen(s1); len2=strlen(s2);if(mn+1&nlen1&m=len1) for(i=0;in;i+) si=s1i; for(j=0;jlen2;j+,i+) si=s2j; si=0; len=strlen(s);for(i=0;s1m-1+i!=0;i+) slen+i= s1m-1+i;slen+i=0;for(i=0;si!=0;i+) si=s1i; s1i=0;void main() char s180=” qwertyuiop”,s220=”zxc”; int n,m; puts(“s1=%s s2=%sn”,s1,s2); puts(“
23、input n,m:”); scanf(“%d%d”,n,m); replace(s1,n,m,s2); puts(s1); getch();【要求】1. 将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。2. 改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其他语句 ,也不能删去整条语句。3. 改正后的源程序(文件名为myf1.c)保存在T:盘根目录中功阅卷使用,否则不予评分。二、编程题(24分)【程序功能】用乌勒姆公式an=n2-n+41(n=1,2,m)生成一个数列的前m项并找出其中的回文数。
24、编程要求】1. 编写函数int numseq(long a,long b,int m)实现以下功能:用乌勒姆公式生成一个数列的前m项并保存到a指向的数组中,从a数组中找出所有回文数保存到b指向的数组中,函数返回b数组中回文数个数。2. 编写函数main 实现以下功能:声明一维数组a,b和变量m; 输入数列的项数并保存到m,用数组a、b和变量m作为实参调用numseq函数,将生成的数列前m项以及其中的回文数分别保存到a和b数组中;按每行10个数据的格式将a、b数组中的数据输出到屏幕及文件myf2.out中。最后将考生本人的准考证输出到文件myf2.out。【测试数据与运行结果】输入: m=20
25、输出: a:41 43 47 53 61 71 83 97 113 131 151 173 197 223 251 281 313 347 383 421 b:131 151 313 383【要求】1. 源程序文件为myf2.c,输出结果文件名myf2.out。2. 数据文件的打开、使用、关闭均使用C语言标准库中缓冲文件系统的文件操作函数实现。3. 源程序文件和运行结果均需要保存T:盘根目录中供阅卷使用。4. 不要复制扩展名为obj和exe的文件到T:盘中。10 江苏省高等高等学校非计算机专业学生计算机基础知识和应用能力等级考试上机试卷二级 C语言 (本试卷完成时间 70分钟)一、改错题(16
26、分)【程序功能】已知指针数组name保存了n个字符串的首地址。以下程序通过调整指针数组元素的值实现按字典序对n个字符串排序; 输出排序后指针数组各元素指向的字符串;删除指针数组中以元音字母开头的所有字符串首地址;输出指针数组各元素指向的字符串。【测试数据与运行结果】数组初始化数据: “Mary”,”George”,”Andy”,”Tom”,”Iris”输出: Andy George Iris Mary Tom George Mary Tom【含有错误的源程序】#include #include#includevoid sort(char*name,int n) char *ptr; int i
27、j,k;for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k=i) ptr=namei,namei=namek,namek=ptr; int delstr(char *name,int n) int i,j,k; char c,s5=A,E,O,I,U,*P; for(i=0;in;i+) p=namei; c=p;c=toupper(c); /*toupper(c):若c是小写则返回对应大写字母,否则返回c原值*/ for(k=0;k=5) for(j=i;jn-1;j+)namej=namej+1; n-;i-;return n;void print
28、char*name,int n) int i;for(i=0;in;i+)printf(“%s “,namei);printf(“n”);void main() int n=5; char *namen=“Mary”,”George”,”Andy”,”Tom”,”Iris”; sort(name,n); print (name,n); n=delstr(name,n); print(name,n); getch();【要求】1. 将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。2. 改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的
29、变量说明或编译预处理命令,但不能增加其他语句 ,也不能删去整条语句。3. 改正后的源程序(文件名为myf1.c)保存在T:盘根目录中功阅卷使用,否则不予评分。二、编程题(24分)【程序功能】输入两个正整数x和y(2x100,2y1000,找出所有满足下列条件的整数对(p,q):(1):p、q均为正整数;(2):p、q的最大公约数等于x且最小公倍数等于y。提示:p、q的最小公倍数等于(pq)/(p、q的最大公约数)。【编程要求】1. 编写函数int nucoup(int x,int y,int a2)实现如下功能:查找所有最大公约数是x并且2. 最小公倍数是y的整数对,若找到则保存这些整数对到a
30、指向的的数组中,函数返回找到的整数对的个数;若找不到则函数返回0。3. 编写函数main 实现以下功能:声明二维数组a变量x、y,输入两个整数并保存到x和y中,用x,y和a数组作为实参调用numcoup函数,若找不到满足以上条件的整数对则输出“not found”到屏幕,否则输出a数组中数据到屏幕及文件myf2.out中。最后将考生本人的准考证号输出到文件myf2.out。【测试数据与运行结果】输入: x=4 y=684输出: 4 68436 76 76 36684 4【要求】1. 源程序文件为myf2.e,输出结果文件名myf2.out。2. 数据文件的打开、使用、关闭均使用C语言标准库中缓
31、冲文件系统操作函数实现。3. 源程序文件和运行结果均需要保存T:盘根目录中供阅卷使用。4. 不要复制扩展名为obj和exe的文件到T:盘中。- 12 - 江苏省高等高等学校非计算机专业学生计算机基础知识和应用能力等级考试上机试卷二级 C语言 (本试卷完成时间 70分钟)一、改错题(16分)【程序功能】输入一个正确日期且年份在1900-9999范围内,计算并输出该日期是星期几。例如,若输入2008-8-8,应输出Fri(星期五)。提示:1900年1月1日是Mon(星期一)。能被4整除并且不能被100整除的年份是闰年,能被400整除的年份也是闰年,其他年份则是平年。【测试数据与运行结果】第一次运行
32、显示:input a date: 输入:1900-1-1 输出:Mon 第二次运行显示:input a date: 输入:2008-8-8输出:Fri 【含有错误的源程序】#include #define leap(y) (y)%4=0&(y)%400=0)|(y)%400=0)int week(int y,int m,int d) static int mon212=31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31; int yeard2=365,366,i; long td=0; for(i=19
33、00;iy;i+)td+=yeardleap(i); for(i=0;im;i+)td+=monleap(y)i; td+=d-1; return td%7.0;void main() int i,y,m,d; char wn7=Mon”,”Tue”,”Wed”,”Thu”,”Fri”,”Sat”,”Sun”; puts(“n input a date:”); scanf(“%d-%d-%d”,&y,&m,&d);puts(wn(week(y,m,d); getch();【要求】1. 将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。2. 改错时
34、可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编辑预处理命令,但不能增加其他语句 ,也不能删去整条语句。3. 改正后的源程序(文件名为myf1.c)保存在T:盘根目录中供阅卷使用,否则不予评分。二、编程题(24分)【程序功能】实现包含一个变元x的多项式合并同类项操作。用结构数组存储一个多项式(一个数组元素存储多项式的一项)。结构数组元素的数据类型定义如下:typedef struct double coe; /* 系数 */ int exp; /* 变元x的指数*/TERM;例如:将多项式-3x2+5x+0.5x2+x-1-2x按如下形式存储到一个结构数组中。 coe-350
35、51-1-2exp212101【编程要求】1. 编写函数int term(TERM a,TERM b,int n)实现以下功能:对a指向的数组中保存2. 的多项式实施合并同类项操作,n为a数组中多项式的项数。将合并同类项后得到的多项式保存到b指向的数组中。函数返回b数组中的多项式的项数。3. 算法提示:可以先对a数组按exp值排序后再做合并同类项操作。4. 编写函数main 实现以下功能:声明TERM型数组x和y,x数组用于保存合并同类项前多项式各项的系数和指数,y数组用于保存合并同类项后多项式各项的系数和指数。用x,y数组作为实参调用term函数。按所给输出格式将y数组中的数据输出到屏幕及
36、文件myf2.out中。最后将考生本人的准考证输出到文件myf2.out。【测试数据与运行结果】测试多项式:-3x2+5x+0.5x2+x-1-2x输出:-2.5x2+4.0x1-1.0【要求】1. 源程序文件为myf2.c,输出结果文件名myf2.out。2. 数据文件的打开、使用、关闭均使用C语言标准库中缓冲文件系统操作函数实现。3. 源程序文件和运行结果均需要保存T:盘根目录中供阅卷使用。4. 不要复制扩展名为obj和exe的文件到T:盘中。 2010年秋江苏二级C上机真题 江苏省高等学校非计算机专业学生 计算机基础知识和应用能力等级考试上机试卷(2010年秋) 二级C语言 (试卷代号C
37、01) (本试卷完成时间70分钟) 一、改错题(16分) 【程序功能】 查找介于n1与n2(On1n232768)之间所有满足下列条件的整数:(1)该数的十进 制表示中有且仅有两个相同的数字位;(2)该数是素数。 【测试数据与运行结果】 测试数据:n1=900 n2=1200 屏幕输出: 911 919 929 977 991 997 1009 1013 1019 1021 1031 1033 1051 1061 1091 1103 1109 1123 1129 1153 1163 1187 1193 【含有错误的源程序】 #inelude #include int validate(int
38、n) int i,j,k=0,num5=0,size=0; do numsize=n%10; n=n/10; size+; while(n0); for(i=0;isize-1;i+) for(j=i+1;j1) return 1; else return 0; int prime(int) int i; for(i=2;i=(int)sqrt(n);i+) if(n%i=0)retum 0; return 1; void main() int i,count=0,n1,n2; scanf(%d%d,&n1,&n2); for(i=n1;i=n2;i+) if(validate(int i)&prime(int i) count+; printf(%dt,i); if(count%8=0)printf(n); 【要求】 1. 将上述程序录入到文件myf1.C中,根据题目要求及程序中语句之间的逻辑关系对程序 中的错误进行修改。 2. 改错时,可以修改语句中的一部分内