题目前带★号的是在2004年4月份上机考试中被考生们所确定了的上机题。 题目前带☆号的是在2004年9月份上机考试中被考生们所确定了的上机题。 题目中所提示的“无忧id xx”指的是2004年上半年版无忧模拟系统中的固定抽题序号 题目中所提示的“捷成id xx”指的是2004年上半年版捷成模拟系统中的固定抽题序号 ***************************************************************************************** 题目1(无忧 id 14、id 27(提供isp()函数;捷成id 23题) 请编写一个函数jsvalue(int m,int k,int xx[]),该函数的功能是:将大于整数m且紧靠m的k个素数存入数组xx传回。 最后调用函数writedat()读取10组数据,分别得出结果且把结果输出到文件out.dat中。 部分源程序存在文件prog1.c中。 例如:若输入17 5 则应输出:19,23,29,31,37。 请勿改动主函数main()和写函数writedat()的内容。 #include #include void readwritedat(); int isp(int m) { int i; for(i=2;i if(m % i==0)return 0; return 1; } void num(int m,int k,int xx[]) { int s=0; for(m=m+1;k>0;m++) if(isp(m)) { xx[s++]=m; k--;} } main() { int m,n,xx[1000]; clrscr(); printf('/nplease enter two integers:'); scanf('%d%d',&m,&n); num(m,n,xx); for(m=0;m printf('%d ',xx[m]); printf('/n'); readwritedat(); } void readwritedat() { int m,n,xx[1000], i; file *rf,*wf; rf=fopen('in.dat','r'); wf=fopen('out.dat','w'); for(i=0;i<10;i++){ fscanf(rf,'%d %d',&m,&n); num(m,n,xx); for(m=0;m } fclose(rf); fclose(wf); } 无忧id 14题(无isp()函数) #include void jsvalue(int m,int k,int xx[]) { int i,j,s=0; for(i=m+1;k>0;i++) { for(j=2;j if(i%j==0) break; if(i==j) { xx[s++]=i; k--;} } } main() { int m,n,zz[100]; printf('/n请输入两个整数:'); scanf('%d%d',&m,&n); jsvalue(m,n,zz); for(m=0;m printf('/n'); writedat(); } writedat() { int m,n,zz[100],i; file *in,*out; in=fopen('in.dat','r'); out=fopen('out.dat','w'); for(i=0;i<10;i++){ fscanf(in,'%d%d',&m,&n); jsvalue(m,n,zz); for(m=0;m fprintf(out,'/n'); } fclose(in); fclose(out); } 另一解法: void num(int m,int k,int xx[]) { int n=0,data=m+1; while(n if(isp(data)) xx[n++]=data; data++;} } ★题目2(无忧 id 143 整数排序题) 已知数据文件in.dat中存有200个四位数,并已调用读函数readdat()把这些数存入数组a中,请考生编制一函数jsval(),其功能是:如果四位数各位上的数字均是0或2或4或6或8,则统计出满足此条件的个数cnt,并把这些四位数按从大到小的顺序存入数组b中。最后main( )函数调用写函数writedat()把结果cnt以及数组b中符合条件的四位数输出到out.dat文件中。 注意:部分源程序存在文件prog1.c中。 程序中已定义数组:a[200],b[200],已定义变量:cnt 请勿改动数据文件in.dat中的任何数据、主函数main()、读函数readdat()和写函数writedat()的内容。 #include #define max 200 int a[max], b[max], cnt = 0 ; void jsval() { int i,j,qw,bw,sw,gw; for(i=0;i { qw=a[i]/1000; bw=a[i]/100; sw=a[i]0/10; gw=a[i]; if(qw&&qw%2==0&&bw%2==0&&sw%2==0&&gw%2==0) b[cnt++]=a[i]; } for(i=0;i for(j=i+1;j if(b[i]} void readdat() { int i ; file *fp ; fp = fopen('in.dat', 'r') ; for(i = 0 ; i < max ; i++) fscanf(fp, '%d', &a[i]) ; fclose(fp) ; } void main() { int i ; readdat() ; jsval() ; printf('满足条件的数=%d/n', cnt) ; for(i = 0 ; i < cnt ; i++) printf('%d ', b[i]) ; printf('/n') ; writedat() ; } writedat() { file *fp ; int i ; fp = fopen('out.dat', 'w') ; fprintf(fp, '%d/n', cnt) ; for(i = 0 ; i < cnt ; i++) fprintf(fp, '%d/n', b[i]) ; fclose(fp) ; } ★☆题目3(无忧 id 133题;捷成id 59、99字符串位置倒置题) 函数readdat( )实现从文件in.dat中读取一篇英文文章存入到字符串数组xx中;请编制函数stror( ),其函数的功能是:以行为单位依次把字符串中所有小写字母o左边的字符串内容移到该串的右边存放,然后把小写字母o删除,余下的字符串内容移到已处理字符串的左边存放,之后把已处理的字符串仍按行重新存入字符串数组xx中。最后main()函数调用函数writedat()把结果xx输出到文件out5.dat中。 例如:原文:n any field.yu can create an index you have the correct record. 结果:n any field. yu can create an index rd. yu have the crrect rec 原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。 注意:部分源程序存放在文件prog1.c中。 请勿改动主函数main()、读数据函数readdat()和输出数据函数writedat()的内容。 #include #include #include char xx[50][80] ; int maxline = 0 ; /* 文章的总行数 */ int readdat(void) ; void writedat(void) ; void stror(void) {int i,righto,j,s,k; char tem[80]; for(i=0;i for(j=strlen(xx[i])-1;j>=0;j--) { k=0; memset(tem,0,80); /*初始化字符串数组tem*/ if(xx[i][j]=='o') /*如果当前字符为'o',进入以下语句*/ {righto=j; /*则将此字符中位置j的值赋给righto*/ for(s=righto+1;s tem[k++]=xx[i][s]; /*从righto的下一跳开始将其后所有的字符都存入到tem中*/ for(s=0;s if(xx[i][s]!='o') tem[k++]=xx[i][s]; /*将不是字符'o'的字符全存入到tem中*/ strcpy(xx[i],tem); /*将当前已处理的字符重新存入当前行xx*/ } else continue; } } void main() { clrscr() ; if(readdat()) { printf('数据文件in.dat不能打开!/n/007') ; return ; } stror() ; writedat() ; }
int readdat(void) { file *fp ; int i = 0 ; char *p ; if((fp = fopen('in.dat', 'r')) == null) return 1 ; while(fgets(xx[i], 80, fp) != null) { p = strchr(xx[i], '/n') ; if(p) *p = 0 ; i++ ; } maxline = i ; fclose(fp) ; return 0 ; } void writedat(void) { file *fp ; int i ; clrscr() ; fp = fopen('out5.dat', 'w') ; for(i = 0 ; i < maxline ; i++) { printf('%s/n', xx[i]) ; fprintf(fp, '%s/n', xx[i]) ; } fclose(fp) ; } 解法二: void stror(void) { int i; char a[80],*p; for(i=0;i { p=strchr(xx[i],'o'); while(p) { memset(a,0,80); memcpy(a,xx[i],p-xx[i]); strcpy(xx[i],p+1); strcat(xx[i],a); p=strchr(xx[i],'o'); } } } 解法三: void stror(void) { int i,j; char yy[80],*p; for(i=0; i for(j=0; j if(xx[i][j]=='o') { p=&xx[i][j+1]; strcpy(yy,p); /*将指针p所指向的字符串拷贝到字符串yy中去*/ strncat(yy,xx[i],j); /*将字符串xx[i]中前j个字符连接到yy中*/ strcpy(xx[i],yy); /*将字符串yy重新拷贝到字符串xx[i]中去*/ j=0; /* 开始下一次的扫描。*/ } } 相关库函数解释: char *strncat(char *dest, const char *src, size_t maxlen) 功能:将字符串src中前maxlen个字符连接到dest中 相关头文件:string.h char *strcpy(char *dest, const char *src) 功能:将字符串src拷贝到字符串dest中去 相关头文件:string.h ★☆题目4(无忧id 24题 捷成id 9 字符串单词倒置题) 函数readdat()实现从文件in.dat中读取一篇英文文章存入到字符串数组xx中,请编制函数strol(),其函数的功能是:以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组xx中,最后调用函数writedat()把结果xx输出到文件out6.dat中。 例如:原文:you he me i am a student. 结果:me he you student a am i 原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。 部分源程序存在文件prog1.c中。 请勿改动主函数main()、读数据函数readdat()和输出数据函数writedat()的内容。 #include #include #include #include char xx[50][80]; int maxline=0;/*文章的总行数*/ int readdat(void); void writedat(void); /*在无忧及捷成版模拟系统中都通过测试(输入文件句末有标点的在输出文件中句前有空格*/ void strol(void) { int i,j,k,s,m,strl; char str[80]; for(i=0;i { strl=strlen(xx[i]); memset(str,0,80); /*初始化这字符串数组str*/ s=k=0; for(j=strl-1;j>=0;j--) /*从当前字符串尾部开始向前倒序循环,实现题意要求的倒排*/ { if(isalpha(xx[i][j])) k++; /*如果当前字符是字母a~z或a~z,则k加一*/ else { for(m=1;m<=k;m++) /*否则将长度为k的单词顺序存入到字符串数组str中,s值加1*/ str[s++]=xx[i][j+m]; k=0; /*将k值清0,以方便下一个单词的长度计数*/ } if(!isalpha(xx[i][j])) str[s++]=' '; /*如果当前字符不是字母a~z或a~z,则以空格代之存入到字符串数组str中,s值加一*/ } for(m=1;m<=k;m++) /*此时的k值为当前字符串中第一个单词的长度,但在上一个for循环中没能存入到字符串数组str中,所以在这里将其存入到str中*/ str[s++]=xx[i][j+m]; str[s]='/0'; /*在当前行尾加0以标记此行的结束*/ strcpy(xx[i],str); /*将倒排好的当前字符串重新存回到当前行xx中*/ } } void main() { clrscr(); if(readdat()){ printf('数据文件in.dat不能打开!/n/007'); return; } strol(); writedat(); } int readdat(void) { file *fp; int i=0; char *p; if((fp=fopen('in.dat','r'))==null) return 1; while(fgets(xx[i],80,fp)!=null){ p=strchr(xx[i],'/n'); if(p)*p=0; i++; } maxline=i; fclose(fp); return 0; } void writedat(void) { file *fp; int i; clrscr(); fp=fopen('out6.dat','w'); for(i=0;i printf('%s/n',xx[i]); fprintf(fp,'%s/n',xx[i]); } fclose(fp); } 捷成版模拟系统中的解法 /*在无忧模拟系统中没通过测试(输入文件句末有标点的在输出文件中句前无空格*/ void strol(void) { int i, j ; char word[21], yy[80], zz[80], *p ; for(i = 0 ; i < maxline ; i++) { p = xx[i] ; j = 0 ; memset(word, 0, 21) ; memset(yy, 0, 80) ; while(*p) { if(isalpha(*p)) { word[j++] = *p++ ; if(*p) continue ; } strcpy(zz, yy) ; sprintf(yy, '%s %s', word, zz) ; j = 0 ; memset(word, 0, 21) ; while(*p && (!isalpha(*p))) p++ ; } strcpy(xx[i], yy) ; } } 另一解法(): /*在无忧及捷成版模拟系统中都通过测试(输入文件句末有标点的在输出文件中句前有空格*/ void strol(void) { int i,j,m; char str[80]; for(i=0;i { m=strlen(xx[i]); memset(str,0,80); for(j=m-1;j>=0;j--) if(!isalpha(xx[i][j])) { strcat(str,xx[i]+j+1); strcat(str,' '); xx[i][j]='/0'; } strcat(str,xx[i]); strcpy(xx[i],str); } } 实际上机考试时上面几种解法都可以采用。 ★☆题目5(无忧id 8整数排序题) 在文件in.dat中有200个正整数,且每个数均在1000至9999之间。函数readdat()读取这200个数存放到数组aa中。请编制函数jssort(),其函数的功能是:要求按每个数的后三位的大小进行升序排列,然后取出满足此条件的前10个数依次存入数组bb中,如果后三位的数值相等,则按原先的数值进行降序排列。最后调用函数writedat()把结果bb输出到文件out.dat中。 例:处理前 6012 5099 9012 7025 8088 处理后 9012 6012 7025 8088 5099 部分源程序存在文件prog1.c中。 请勿改动主函数main()、读数据函数readdat()和输出数据函数writedat()的内容。 #include #include #include int aa[200],bb[10]; void jssort() { int i,j,data; for(i=0;i<199;i++) for(j=i+1;j<200;j++) if(aa[i]00>aa[j]00||aa[i]00==aa[j]00&&aa[i] {data=aa[i];aa[i]=aa[j];aa[j]=data;} for(i=0;i<10;i++) bb[i]=aa[i]; } void main() { readdat(); jssort(); writedat(); } readdat() { file *in; int i; in=fopen('in.dat','r'); for(i=0; i<200; i++) fscanf(in,'%d,',&aa[i]); fclose(in); } writedat() { file *out; int i; clrscr(); out=fopen('out.dat','w'); for(i=0; i<10; i++){ printf(' %d',bb[i]); fprintf(out,'%d/n',bb[i]); } fclose(out); } 题目10(无忧id 68 替换字符题) 函数readdat()实现从文件in.dat中读取一篇英文文章存入到字符串数组xx中,请编制函数convertchara(),其函数的功能是:以行为单位把字符串中的所有小写字母改写成该字母的下一个字母,如果是字母z,则改写成字母a。大写字母仍为大写字母,小写字母仍为小写字母,其他字符不变。把已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数writedat()把结果xx输出到文件out1.dat中。 例:原文:adb.bcdza abck.llhj 结果:aec.bdeab bcdl.llik 原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。 部分源程序存在文件prog1.c中。 请勿改动主函数main()、读数据函数readdat()和输出数据函数writedat()的内容。 #include #include #include char xx[50][80]; int maxline=0;/*文章的总行数*/ int readdat(void); void writedat(void); void convertchara(void) { int i,j; for(i=0;i { for(j=0;j if(xx[i][j]=='z') xx[i][j]='a'; else if(xx[i][j]>='a'&&xx[i][j]<='y') xx[i][j]+=1; } } void main() { clrscr(); if(readdat()){ printf('数据文件in.dat不能打开!/n/007'); return; } convertchara(); writedat(); } int readdat(void) { file *fp; int i=0; char *p; if((fp=fopen('in.dat','r'))==null) return 1; while(fgets(xx[i],80,fp)!=null){ p=strchr(xx[i],'/n'); if(p)*p=0; i++; } maxline=i; fclose(fp); return 0; } void writedat(void) { file *fp; int i; clrscr(); fp=fopen('out1.dat','w'); for(i=0;i printf('%s/n',xx[i]); fprintf(fp,'%s/n',xx[i]); } fclose(fp); }
|