三级C语言程序设计上机考试习题集100.docx
全国计算机等级考试三级C语言程序设计上机考试习题集(2004年版)南开100题【终极无错版】2006年11月10日修订者:余费题目前带号的是在2004年4月份上机考试中被考生们所确定了的上机题。题目中所提示的“无忧id xx”指的是2004年上半年版无忧模拟系统中的固定抽题序号 题目中所提示的“捷成id xx”指的是2004年上半年版捷成模拟系统中的固定抽题序号题目1(无忧id 14、id27(提供isP()函数;捷成id 23题)请编写一个函数jsValue(int m,int k,int xx口),该函数的功能是:将大于整数m目.紧靠m的k个素数存入 数组XX传回。最后调用函数writeDat。读取10组数据,分别得出结果且把结果输出到文件out.dat中。部分源程序存在文件progl.c中。例如:若输入175则应输出:19, 23, 29, 31, 37,请勿改动主函数main。和写函数writeDat。的内容。#include <conio.h>#include <stdio.h>void readwriteDat();int isP(int m)int i;for(i=2;i<m;i+)if(m % i=0)return 0;return 1;void num(int mjnt k,int xx)int s=0;for(m=m+l ;k>0;m+)if(isP(m) xxs+=m; k;) )int m,n,xx1000;clrscr();printf(MnPlease enter two integers:M);scanf(,'%d%d",&m,&n);num(m,n,xx);for( m=0; m<n; m+)printf(M%d u,xxm);printf(MnH);readwriteDat();)void readwriteDat()(int m,n,xx1000, i;FILE *rf,*wf;rf=fopen(',in.dat,»Hr,');wf=fopen("out.dat","w");for(i=0;i< 10;i+) fscanf(rf,M%d %dM,&m,&n);num(m,n,xx);for(m=0;m<n;m+)fprintf(wf,n%d 'xxm);fprintf(wf;'nM);)fclose(rf);fclose(wf);)无忧id 14题(无isP()函数)#include <stdio.h>void jsValue(int mjnt k,int xx) int ij,s=O;for(i=m+l ;k>0;i+) for(j=2;j<i;j+)if(i%j=O) break;if(i=j) xxs+J=i; k-;)main() int m,n,zz100;primf(”n请输入两个整数:,scanf(H%d%dn,&m,&n);jsValue(m,n,zz);for(m=0;m<n;m+)printf(,%ci u,zzm);printf(MnH);writeDat();) writeDat() int m,n,zz100,i;FILE *in,*out;in=fopen(,in.dat",rn);out=fopen(,out.dat,',',w,');for(i=O;i< 10;i+) fscanf(in,"%d%d,',&m,&n);jsValue(m,n,zz);fbr(m=0;m<n;m+)fprintf(out,%d H,zzm);fprintf(out,”n");)fclose(in);fclose(out);题目2 (无忧id 143)已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat。把这些数存入数组a中,请考生 编制一函数jsVal(),其功能是:如果四位数各位上的数字均是0或2或4或6或8,则统计出满足此条 件的个数ent,并把这些四位数按从大到小的顺序存入数组b中。最后main()函数调用写函数writeDat() 把结果ent以及数组b中符合条件的四位数输出到OUT.DAT文件中。注意:部分源程序存在文件progl.c中。程序中已定义数组:a200, b200,已定义变量:ent请勿改动数据文件IN.DAT中的任何数据、主函数main。、读函数readDat。和写函数writeDat()的内 容。#include <stdio.h>#define MXX 200int aMAX, bMAX, ent = 0 ;void jsVaK) int ij,qw,bw,sw,gw;for(i=0;i<MAX;i+) qw=ai/1000; bw=ai/100%10;sw=ai% 100/10; gw=ai%10;if(qw&&qw%2=0&&bw%2=0&&sw%2=0&&gw%2=0) bcnt+=ai;)for(i=0;i<cnt-l;i+)for(j=i+l;j<cnt;j+)if(bi<bj) qw=bi; bi=bj; bj=qw;)void readDat()int i;FILE *fp;fp = fopen("in.dat”,T);for(i = 0;i< MAX ; i+) fscanf(fp, "%dn, &ai);fclose(fp);void main()readDat();jsVal();printf("满足条件的数=%dn* ent);for(i = 0 ; i < ent; i+) printf(M%d * bi);printf(MnH);writeDatO ;writeDat() (FILE *fp;int i;fp = fopen(Hout.datn, nwH);fprintf(fp, n%dn", ent);for(i = 0 ; i < ent; i+) fprintf(fp, "%dn”, bi);fclose(fp);L题目3 (无忧id 133题;捷成id 59、99题)函数ReadDal()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中;请编制函数StrOR(),其函数的功能是:以行为单位依次把字符串中所有小写字母。左边的字符串内容移到该串的右 边存放,然后把小写字母。删除,余下的字符串内容移到已处理字符串的左边存放,之后把已处理的字 符串仍按行重新存入字符串数组xx中。最后main。函数调用函数WriteDat。把结果xx输出到文件 OUT5.DAT 中。例如:原文:n any field.Yu can create an indexyou have the correct record.结果:n any field. Yu can create an index rd. yu have the crrect rec原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。注意:部分源程序存放在文件progl.c中。请勿改动主函数main。、读数立函数ReadDat。和输出数据函数WriteDatO的内容。#include <stdio.h>#include <string.h>#include <conio.h>char xx5080;int maxline = 0 ; /*文章的总行数*/int ReadDat(void);void WriteDat(void);void StrOR(void) int i,rightoj,s,k;char tem80;for(i=0;i<maxline;i+)for(j=strlen(xxi)-l;j>=0;j-)k=0; memset(tem,0,80);if(xxij='o') righto=j;for(s=righto+l;s<strlen(xxi);s+) temk+=xxis;for(s=0;s<righto;s+)if(xxis!=,o,)temk+=xxis; strcpy(xxi9tem);else continue;void main()(clrscr();if(ReadDat() printf("数据文件IN.DAT不能打开!n007");return ;)StrOR();WriteDat();int ReadDat(void)(HLE *fp;int i = 0 ;char *p ;if(fp = fopenCIN.DAT” Jr")= NULL) return 1 ;while(fgets(xxi, 80, fp) != NULL) p = strchr(xxi, *n');if(p) *p = 0 ;i+;)maxline = i;fclose(fp);return 0;void WriteDat(void)(FILE *fp;inti;clrscr();fp = fopen(nOUT5.DAT' Hwn);for(i = 0 ; i < maxline ; i+) printf("%sn", xxi);fprintf(fp, "%snn, xxi);)fclose(fp);)解法二:void StrOR(void) int i;char a80,*p;for(i=0;i<maxline;i+) p=strchr(xxi9(ov);while(p) memset(a,0,80);memcpy(a,xxi,p-xxi);strcpy(xxi,p+l);strcat(xxi,a);p=strchr(xxi,*o,);L题目4 (无忧id 24题捷成id 9题)函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数StrOLQ, 其函数的功能是:以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字 符串(应不含标点符号)仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文 件 OUT6.DAT 中。例如:原文:You He MeI am a student.结果:Me He Youstudent a am I原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。部分源程序存在文件progl.c中。请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。#include <stdio.h>#include <string.h>#include <conio.h>#include <ctype.h>char xx50Jl80J;int maxline=0;/*文章的总行数*/int ReadDat(void);void WriteDat(void);/*在无忧及捷成版模拟系统中都通过测试(输入文件句末有标点的在输出文件中句前有空格*/void StrOL(void) int ichar str80;for(i=0;i<maxline;i+) strl=strlen(xxi);memset(str,0,80);s=k=0;for(j=strl-l;j>=0;j-)if(isalpha(xxij) k+;else for(m=l ;m<=k;m+)strs+=xxij+ml;k=0;if(!isalpha(xxij) strs+=*for(m=l;m<=k;m+)strs+=xxij+m;strs=,0,;strcpy(xxi,str); void main()clrscr();if(ReadDat()primf("数据文件IN.DAT不能打开! n007H);return;)StrOL();WriteDat();int ReadDat(void)FILE *fp;int i=0;char *p;if(fp=fopen(nIN.DAT,',Y,)=NULL) return 1;while(fgets(xxi,80,fp)!=NULL)p=strchr(xxi,n,);if(p)*p=O;i+;)maxline=i;fclose(fp);return 0;void WriteDat(void)FILE *fp;int i;clrscr();fp=fopenC'OUT6.DATu;'wn);for(i=0;i<maxline;i+) printf(w%snH,xxi);fprinlf(fp/sn”,xxi);)fclose(fp);捷成版模拟系统中的解法/*在无忧模拟系统中没通过测试(输入文件句末有标点的在输出文件中句前无空格*/ void StrOL(void)nt i,j ;char word21, yy80, zz80, *p ;for(i = 0 ; i < maxline ; i+) P = xxi;j = 0 ;memset(word, 0, 21);memset(yy, 0, 80);while(*p) if(isalpha(*p) wordj+ = *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(xxij, yy); 题目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部分源程序存在文件progl.c中。请勿改动主函数main。、读数据函数ReadDat。和输出数据函数WriteDat。的内容。#include <stdio.h>#include <string.h>#include <conio.h>int aa200,bb10;void jsSort()int ij,data;for(i=0;i<199;i+)for(j=i+l ;j<200;j+)if(aai% 1000>aaj% 1000llaai% 1000=aaj% 1000&&aai<aaj) data=aai;aai=aaj;aaj=data;for(i=0;i<10;i+) bbi=aai; void main() (readDat(); jsSort(); writeDat();readDat()(FILE *in;int i;in=fopen("in.dat”,T);for(i=0; i<200; i+) fscanf(in/'%d;&aai);fclose(in);writeDat()(FILE *out;int i;clrscr();out=fopen(nout.dat","w'');for(i=0; i<10; i+)printf(M %dbbi);fprintf(out,"dn",bbi);)fclose(out);)题目6题目6:在文件in.dat中有200个正整数,且每个数均在1000至9999之间。函数ReadDat。读取这200 个数存放到数组aa中。请编制函数jsSort(),其函数的功能是:要求按每个数的后三位的大小进行降序排 列,然后取出满足此条件的前10个数依次存入数组b中,如果后三位的数值相等,则按原先的数值进行 升序排列。最后调用函数WrileDal。把结果bb输出到文件out.dat中。例:处理前 9012 5099 6012 7025 8088处理后 5099 8088 7025 60129012注意:部分源程序已给出。请勿改动主函数main。、读数据函数ReadDal。和输出数据函数WriteDal。的内容。#include<stdio.h>#include<string.h>#include<conio.h>int aa200,bb10;void jsSort()int ij,data;for(i=0;i<199;i+)forG=i+l;j<200;j+)if(aali%1000<aaj%1000llaai%1000=aa|jJ%1000&&aaliJ>aa|j) data=aai;aai=aaj;aa|j=data;for(i=0;i<10;i+) bbi=aai;void main()(readDat();jsSort();writeDat();system( "pause");readDat()HLE *in; int i;in=fopen(Min.datM,MrM);for(i=0; i<200; i+) fscanf(in;'%d,n,&aai);fclose(in); )writeDat()(FILE *out;int i;clrscr();out=fopen(Hout.datM,w,');for(i=0; i<10; i+)printf(Mi=%d,%dn",i+l,bbi);fprintf(outj%dn",bbi); )fclose(out);)题目7 (无忧id 15题)已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品 名称me(字符型10位),单价dj(整型),数量si(整型),金额je(长整型)五部分组成。其中:金额=单价*数 量计算得出。函数ReadDatO是读取这10。个销售记录并存入结构数组隧11中。请编制函数SortDat(),其 功能要求:按产品代码从大到小进行排列,若产品代码相同,则按金额从大到小进行排列,最终排列结 果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT6.DAT中。部分源程序存在文件progl.c中。请勿改动主函数main。、读数据函数ReadDat。和输出数据函数WriteDat。的内容。#include <stdio.h>#include <mem.h>#include <string.h>#include <conio.h>#include <stdlib.h>#define MAX 100typedef struct char dnf5; /*产品代码*/char/* 产品名称*/int dj/*单价*/int 4;/*数量*/long/*金额*/PRO;PRO sellMAX;void ReadDat();void WriteDat();void SortDat()int IJ;PRO xy;for(I=0;I<99;I+)forG=I+l;j<100;j+)if(strcmp(sellI.dm,sell|jJ.dm)<0llstrcmp(sellI.din9sellj.dm)=0&&sellIJ.je<sellj.je) xy=sellI; sell I=sellj; sellj=xy;void main() (memset(sell,0,sizeof(sell);ReadDat();SortDat();WriteDat();)void ReadDat()(FILE *fp;char str8O,chll;int i;fp=fopen("IN.DAT",“r");for(i=0;i< 100;i+)fgets(str,8O,fp);memcpy(selli.dm,str,4);memcpy(selli.mc,str+4,10);memcpy(ch,str+14,4);ch4=0;selli.dj=atoi(ch);memcpy(ch,str+18,5);ch5=0;selli.sl=atoi(ch);selli.je=(long)selli.dj*selli.sl;)fclose(fp);)void WriteDat(void)(FILE *fp;int i;fp=fopen(,'OUT6.DAT,';,wM);for(i=0;i<100;i+)printf(M%s %s %4d %5d %5dnn, selli.dm,selli.mc,selli.dj,selli.sl,selli.je);fprintf(fp,H%s %s %4d %5d %5dnH, selli.dm,selli.mc,selli.dj,selli.sl,selli.je);)fclose(fp);)题目8 (无忧id 83题)函数ReadDat。实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数 encryptCharO,按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最 后调用函数WriteDat()把结果xx输出到文件PS 1.DAT中。替代关系:f(p)=p*ll mod256 (p是数组中某一个字符的ASCH值,f(p)是计算后新字符的ASCH 值),如果计算后f(p)值小于等于32或大于130,则该字符不变,否则将f(p)所对应的字符进行替代。 部分源程序存在文件progl.c中。原始数据文件存放的格式是:每行的宽度均小于80个字符。请勿改动主函数main。、读数据函数ReadDat()和输出数据函数WriteDat。的内容。#include <stdio.h>#include <string.h>#include <conio.h>#include <ctype.h>unsigned char xx5080;int maxline=O;/*文章的总行数*/int ReadDat(void);void WriteDat(void);void encryptChar()int ij;for(i=0;i<maxline;i+)for(j=0;j<strlen(xxi);j+)if(xxiJ|jJ*ll%256<=32llxxiJLjJ*ll%256>130) continue;else xxij=xxij*ll%256;)void main()(clrscr();if(ReadDat()printf("数据文件ENG.IN不能打开! n007");return;)encryptChar();WriteDat();)int ReadDat(void)(FILE *fp;int i=0;unsigned char *p;if(fp=fopen(Meng.in,',',rM)=NULL) return 1;while(fgets(xxi,80,fp)!=NULL)p=strchr(xxiAn,);if(p)*p=O;i+;)maxline=i;fclose(fp);return 0;)void WriteDat(void)(FILE *fp;inti;fp=fopen(Hps 1 .datM,Mwn);for(i=0;i<maxline;i+)printf(M%snH,xxi);fprintf(fp,M%snH,xxi);fclose(fp);)题目9 (无忧id 28: id 124题;捷成id 16题)函数ReadDat。实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数 SortCharDO,其函数的功能是:以行为单位对字符按从大到小的顺序进行排序,排序后的结果仍按行重 新存入字符串数组xx中,最后调用函数writeDat。把结果xx输出到文件OUT2.DAT中。例:原文:dAe,BfC.CCbbAA结果:fedCBA.bbCCAA原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。部分源程序存在文件progl.c中。请勿改动主函数main。、读数据函数ReadDat()和输出数据函数writeDat()的内容。#include <stdio.h>#include <string.h>#include <conio.h>char xx50J80J;int maxline=0;/*文章的总行数*/int ReadDat(void);void WriteDat(void);void SortCharD(void)int IJ,k,strl;char ch;for(I=0;I<maxline;I+)strl=strlen(xxI);for(j=0;j<strl-l;j+)for(k=j+l;k<strl;k+)if(XXIU<XXIk)ch=xxIj; xxIj=xxIk; xxIk=ch;)void main()(clrscr();if(ReadDat()prinlf("数据文件IN.DAT不能打开! n007n);return;)SortCharDO;WriteDat();int ReadDat(void)FILE *fp;int i=0;char *p;if(fp=fopen(nIN.DAT";'r")=NULL) return 1;while(fgets(xxi,80,fp) !=NULL) p=strchr(xxi,n,);if(p)*p=O;i+;)maxline=i;fclose(fp);return 0;) void WriteDat(void)(FILE *fp;int i;fp=fopen(,OUT2.DAT',;'wM);for(i=0;i<maxline;i+) printf(M%sn",xxi);fprintf(fpJ%sW",xxi);)fclose(fp);题目10 (无忧id 68题)函数ReadDatO实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数 ConvertCharAO,其函数的功能是:以行为单位把字符串中的所有小写字母改写成该字母的下一个字母, 如果是字母z,则改写成字母a。大写字母仍为大写字母,小写字母仍为小写字母,其他字符不变。把已 处理的字符串仍按行重新存入字符串数组xx中,最后调用函数wrileDal。把结果xx输出到文件 OUT1.DAT 中。例:原文:Adb.Bcdzaabck.LLhj结果:Aec.Bdeabbcdl.LLik原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。部分源程序存在文件progl.c中。请勿改动主函数main。、读数据函数ReadDat。和输出数据函数writeDat。的内容。#include <stdio.h>#include <string.h>#include <conio.h>char xx5080;int maxline=0;/*文章的总行数*/int ReadDat(void);void WriteDat(void);void ConvertCharA(void)int ij;for(i=0;i<maxline;i+) for(j=0;j<strlen(xxi);j+) if(xxiIj=,z,) xxij='a' else if(xxij>='a'&&xxij<=,y') xxij+=l; void main() clrscr();if(ReadDat()primf("数据文件IN.DAT不能打开! n007H);return;)ConvertCharAO;WriteDat();int ReadDat(void)FILE *fp;int i=0;char *p;if(fp=fopen(nIN.DAT,;,r,)=NULL) return 1;while(fgets(xxi,80,fp)!=NULL)p=strchr(xxi,n,);if(p)*p=O;i+;)maxline=i;fclose(fp);return 0;void WriteDal(void)FILE *fp;int i;clrscr();fp=fopen(,OUTl.DAT";'wn);for(i=0;i<maxline;i+) printf(M%sn'xxi);fprintf(fjp;'%snM,xxi);)fclose(fp);L题目11(无忧id 93题)程序progl.c的功能是:把s字符串中的所有字母改写成该字母的下一个字母,字母z改写成字母a。要 求大写字母仍为大写字母,小写字母仍为小写字母,其它字符不做改变。请考生编写函数chg(char*s)实现程序要求,最后调用函数readwriteDAT()把结果输出到文件be 1 .out 中。例如:s字符串中原有的内容为:Mn.l23Zxy,则调用该函数后,结果为:No.l23Ayz。注意:部分源程序存在文件progl.c文件中。请勿改动主函数main()和输出数据函数readwriteDAT。的内容。#include <conio.h>#include <string.h>#include <stdio.h>#include <ctype.h>#define N 81 void readwriteDAT();void chg(char *s)while(*s)if(*s=,z,ll*s=,Z,) *s-=25; s+;else if(*s>=,a*&&*s<='y,) *s+=l;s+;else if(*s>=,A,&&*s<=*¥*) *s+=l;s+; else s+;main()(char aN;clrscr();printf("Enter a string : "); gets(a);printf(MThe original string is : *'); puts(a);chg(a);printf("The string after modified : ");puts (a);readwriteDAT();)void readwriteDAT()(int i;char aN;FILE *rf, *wf;rf=fopen(nbcl.inn, V);wf=fopen(Mbcl.outK, nwn);for(i = 0 ; i < 50 ; i+) fscanf(rf, w%sM, a);chg(a);fprintf(wf, n%sn' a);)fclose(rf);fclose(wf);)题目12 (无忧id 78题)一知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品 名称me(字符型10位),单价dj(整型),数量si(整型),金额je(长整型)五部分组成。其中:金额=单价*数 量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。清编制函数SortDat(),其 功能要求:按产品名称从小到大进行排列,若产品名称相等,则按金额从小到大进行排列,最终排列结果仍存入结 构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT5.DAT中。部分源程序存在文件progl.c中。请勿改动主函数main。、读数据函数ReadDat()和输出数据函数WriteDat。的内容。#include <stdio.h>#include <mem.h>#include <string.h>#include <conio.h>#include <stdlib.h>#define MAX 100typedef struct