2012年10月14日江苏省高校计算机等级考试二级C语言上机题(C02)及其解答_张柏雄
- 格式:doc
- 大小:48.31 KB
- 文档页数:5
【上机题命题评述】2012年10月14日C01套编程试题是求三位数的水仙花数及其反序数分别存入数组a和b。
为本作者于2011年6月15日在豆丁网上发布的“★预测江苏省计算机C语言等级考试的八道上机编程题_张柏雄.doc”的第六题“六、水仙花数题”,阅者可参考该文。
2012年10月14日C02套编程试题是求反素数,比较简单。
网上对反素数定义为:
定义之一:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。
.本编程题即以此为据。
定义之二就认为是绝对素数。
例如17和71等
江苏省高等学校非计算机专业学生
计算机基础知识和应用能力等级考试上机试卷(2012秋)
二级C语言(试卷代号C02)
(本试卷完成时间70分钟)
一、改错题(16分)
【程序功能】
string数组内存放了若干个字符串,以下程序从中找出最长的字符串(如果有多个长度相同且为最长的字符串,则约定第一个为最长的字符串),并在该字符串中的每个数字字符前插入一个空格。
例如,如果string数组中的字符串为“A1B23CD45”、“EF2G34”、“ER45DF678”、“985GHJ211FGH”,则最长的字符串为“985GHJ211FGH”,插入空格后该字符串变为“ 9 8 5G HJ 2 1 1FGH”。
函数maxstr的功能是在存放于ss数组中的m个字符串中查找最长的字符串,函数返回最长字符串所在的数组行的行下标。
函数insert的功能是在str数组中所存放的字符串内每个数字字符前插入一个空格。
【测试数据与运行结果】
测试数据:“A1B23CD45”、“EF2G34”、“ER45DF678”、“985GHJ211FGH”
屏幕输出:The maxstring: 985GHJ211FGH
The changestring:9 8 5G HJ 2 1 1FGH
【含有错误的源程序】
以下源程序已保存在T盘myf1.c文件内,考生可直接打开该文件测试程序。
#include<ctype.h>
#include<string.h>
#include<stdio.h>
#include<conio.h>
#define M 4
#define N 80
int maxstr(char (*ss)[N],int m);
{ int i,len,maxlen,n;
maxlen=strlen(ss[0]);
n=0;
for(i=0;i<m;i++)
{ len=strlen(ss[i]);
if(len>maxlen)
{ maxlen=len;
n=i;
}
}
return n;
}
void insert(char str[])
{ int i,j=0,len=strlen(str);
while(str[j])
if(isdigit(str[j]))
{ for(i=len;i>=j;i--)
str[i+1]=str[i];
str[j]=’’;
j+=3;
len++;
}
else j++;
}
int main()
{ int n;
char string[][N]={"A1B23CD45","EF2G34","ER45DF678","985GHJ211FGH"};
n=maxstr(string,M);
printf("The maxstring:%s\n",string[n]);
insert(string[]);
printf("The changestring:%s\n",string[n]);
getch();
return 0;
}
【要求】
1.打开T盘中myfl.c文件或将上述程序录入到myf1.c文件中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。
2.改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其它语句,也不能删去整条语句。
3.改正后的源程序(文件名myfl.c)保存在T盘的根目录中供阅卷使用,否则不予评分。
二、编程题(24分)
【程序功能】
求10~200内的的所有反素数并按每行5个的形式输出。
对于任意大于2的正整数x,若当0<i<x时都有g(i)<g(x),则称x为反素数(其中g(i)代表i的约数个数,g(x)代表x 的约数个数)。
例如:由于g(1)=1、g(2)=2、g(3)=2、g(4)=3、g(5)=2、g(6)=4、g(7)=2、g(8)=4,因此4和6是反素数,3、4、5、7、8则不是反素数。
【编程要求】
1、编写函数int fun(int *a)。
函数功能:将10~200范围内的所有反素数依次存储到a指向的数组中,函数返回反
素数的个数。
算法提示:编写函数int g(int n)求一个整数n的约数的个数。
2、编写函数main()。
函数功能:声明一个一维数组a,,用数组a作实参调用fun函数,按每行5个数的形式输出
a数组中的数据到屏幕及数据文件myf2.out中。
最后将考生本人的准考证号输出到文件myf2.out中。
【测试数据与运行结果】
屏幕输出:12 24 36 48 60
120 180
【要求】
1.源程序文件名为myf
2.c,输出结果文件名为myf2.out。
2.数据文件的打开、使用、关闭均用C语言标准库中文件操作函数实现。
3.源程序文件和运行结果文件均需保存到T盘上,供阅卷使用。
4.不要复制扩展名为obj和exe的文件到T盘上。
【改错题解答:myf1.c】
#include<string.h>
#include<stdio.h>
#include<conio.h>
#define M 4
#define N 80
int maxstr(char ss[][N],int m) /*1、int maxstr(char *s[N],int m);去掉分号;2、(*ss)[N]错误*/
{ int i,len,maxlen,n;
maxlen=strlen(ss[0]);
n=0;
for(i=0;i<m;i++)
{ len=strlen(ss[i]);
if(len>maxlen)
{ maxlen=len;
n=i;
}
}
return n;
}
void insert(char str[])
{ int i,j=0,len=strlen(str);
while(str[j])
if(isdigit(str[j]))
{ for(i=len;i>=j;i--)
str[i+1]=str[i];
str[j]=' ';
j+=2; /*3、j+=3;程序逻辑错误,只需移2步*/
len++;
}
else j++;
}
int main()
{ int n;
char string[][N]={ "A1B23CD45 ", "EF2G34 ", "ER45DF678 ", "985GHJ211FGH "};
n=maxstr(string,M);
printf("The maxstring:%s\n",string[n]);
insert(string[n]); /*4、实参是具体值或数组首地址,此处是具体数组string[n]*/
printf("The changestring:%s\n",string[n]);
getch();
return 0;
}
【编程题解答:myf2.c】
此题比较简单。
#include <stdio.h>
#include <stdlib.h> /*主函数exit(0);需要*/
#include <conio.h> /*主函数getch();需要*/
#define P 10 /*为设计通用程序,设置常量P=20和K=200*/
#define K 200
#define N 20
int fun(int *a)
{ int i,j=0;
for(i=P;i<=K;i++)
if(g(i)) a[j++]=i;
return j;
}
int g(int n) /*求一个整数n的约数的个数*/
{ int i,j,gi=0,gx=0,gimax=0;
for(i=1;i<n;i++) /*求一个整数1~n-1的约数个数的最大值*/
{ gi=0;
for(j=1;j<n;j++)
if(i%j==0) gi++;
if(gimax<gi) gimax=gi;
}
for(i=1;i<=n;i++) /*求一个整数n的约数的个数*/
if(n%i==0) gx++;
if(gx>gimax) return n;
else return 0;
}
void main()
{ int i,a[N],n; FILE *fp;
if((fp=fopen("myf2.out","w"))==NULL) {printf("\nCan't open the file!"); exit(0);} n=fun(a);
for(i=0;i<n;i++)
{ if(i%5==0) {printf("\n");fprintf(fp,"\n");}
{ printf("%4d",a[i]);fprintf(fp,"%4d",a[i]);}
}
printf("\nMy number is:1230107123\n"); fprintf(fp,"\nMy number is:1230107123\n");
fclose(fp);
getch();
}。