注意:部分源程序存放在prog1.c中请勿改动主函数main()和输出数据函数writeDAT()的内容。
函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按行优先把所有的小写字母替换成它前面的字母其它不变,a换成z,例如:Aabm.() 输出 Azal.() 最后调用函数WriteDat()把结果xx输出到文件PS10.DAT中。
部分源程序已给出,原始数据文件存放的格式是:每行的宽度均小于80个字符。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
以下是引用片段:
#include #include #include #include unsigned char xx[50][80]; int maxline=0;/*文章的总行数*/ int ReadDat(void) void WriteDat(void) void encryptChar() { } void main() { clrscr(); if(ReadDat()){ printf("数据文件ENG.IN不能打开!/n/007"); return; } encryptChar(); WriteDat(); } int ReadDat(void) { FILE *fp; int i=0; unsigned char *p; if((fp=fopen("eng.in","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; fp=fopen("ps10.dat","w"); for(i=0;i printf("%s/n",xx[i]); fprintf(fp,"%s/n",xx[i]); } fclose(fp); } |
解:
以下是引用片段:
void encryptChar() |
2、函数ReadDat()的功能是实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中;请编制函数StrChar JR();该函数的功能是:以行为单位把字符串中的所有字符的ASCII值右移4位,然后把右移后的字符ASCII值再加上原字符的ASCTT值,得到新的字符仍存入原字符串对应的位置上。最后把已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件OUT8.DAT中。
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
注意:部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
试题程序:
以下是引用片段:
#include |
#p#副标题#e#
3、已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)几部分组成。其中:金额=单价*数量可计算得出。函数ReadDat()的功能是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品代码从大到小进行排列,若产品代码相同,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT10.DAT中。
注意:部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
试题程序:
以下是引用片段:
#include #include #include #include #include #define MAX 100 typedef struct{ char dm[5]; /*产品代码*/ char mc[11]; /*产品名称*/ int dj; /*单价*/ int sl; /*数量*/ long je; /*金额*/ }PRO; PRO sell[MAX]; void ReadDat(); void WriteDat(); void SortDat() { } void main() { memset(sell,0,sizeof(sell)); ReadDat(); SortDat(); WriteDat(); } void ReadDat() { FILE *fp; char str[80],ch[11]; int i; fp=fopen("IN.DAT","r"); for(i=0;i<100;i++){ fgets(str,80,fp); memcpy(sell[i].dm,str,4); memcpy(sell[i].mc,str+4,10); memcpy(ch,str+14,4);ch[4]=0; sell[i].dj=atoi(ch); memcpy(ch,str+18,5);ch[5]=0; sell[i].sl=atoi(ch); sell[i].je=(long)sell[i].dj*sell[i].sl; } fclose(fp); } void WriteDat() { FILE *fp; int i; fp=fopen("OUT10.DAT","w"); for(i=0;i<100;i++){ fprintf(fp,"%s %s %4d %5d %101d/n",sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je); } fclose(fp); } -------------------------------------------------------------------------------- void SortDat( ) {int I,j; PRO xy; for(I=0;I<99;I++) for(j=I+1;j<100;j++) if(sell[I].dm {xy=sell[I]; sell[I]=sell[j]; sell[j]=xy;} else if(sell[I].dm==sell[j].dm) if(sell[I].je {xy=sell[I]; sell[I]=sell[j]; sell[j]=xy;} } |
4、已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)四部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品代码从大到小进行排列,若产品代码相同,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT8.DAT中。
部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
以下是引用片段:
#include #include #include #include #include #define MAX 100 typedef struct{ char dm[5]; /*产品代码*/ char mc[11]; /*产品名称*/ int dj; /*单价*/ int sl; /*数量*/ long je; /*金额*/ }PRO; PRO sell[MAX]; void ReadDat(); void WriteDat(); void SortDat() { } void main() { memset(sell,0,sizeof(sell)); ReadDat(); SortDat(); WriteDat(); } void ReadDat() { FILE *fp; char str[80],ch[11]; int i; fp=fopen(/"IN.DAT/",/"r/"); for(i=0;i<100;i++){ fgets(str,80,fp); memcpy(sell[i].dm,str,4); memcpy(sell[i].mc,str+4,10); memcpy(ch,str+14,4);ch[4]=0; sell[i].dj=atoi(ch); memcpy(ch,str+18,5);ch[5]=0; sell[i].sl=atoi(ch); sell[i].je=(long)sell[i].dj*sell[i].sl; } fclose(fp); } void WriteDat(void) { FILE *fp; int i; fp=fopen(/"OUT8.DAT/",/"w/"); for(i=0;i<100;i++){ fprintf(fp,/"%s %s %4d %5d %101d//n/", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je); } fclose(fp); } |
#p#副标题#e#
注:该题的冒泡法与11题不同。
以下是引用片段:
void SortDat() |
5、下列程序的功能是:在三位整数(100至999)中寻找符合条件的整数并依次从小到大存入数组中;它既是完全平方数,又是两位数字相同,例如144、676等。请编制函数实现此功能,满足该条件的整数的个数通过所编制的函数返回。最后调用函数writeDat()把结果输出到文件out.dat中。请勿改动主函数main()和写函数writeDat()的内容。
#p#副标题#e# 以下是引用片段: #include int jsvalue(int bb[]) { } main { int b[20],num; num=jsvalue(b); writeDat(num,b); } writeDat(int num,int b[]) { FILE *out; int i; out=fopen(/"out.dat/",/"w/"); fprintf(out,/"%d//n/",num); for(i=0;i fclose(out); } -------------------------------------------------------------------------------- |
int jsvalue(int bb[]) { int i,j,k=0,g,s,b; for(i=100;i<=999;i++) { g=i%10; s=i/10%10; b=i/100; if((i==(int)sqrt(i)*(int)sqrt(i))&&(g==s//s==b//b==g)) bb[k++]=i; } return k; } int jsvalue(int bb[]) { int i,k=0; for(i=100;i<=999;i++) if((int)sqrt(i)*(int)sqrt(i)==i && (i/100==i%10 || i/100==i/10%10 || i/10%10==i%10)) bb[k++]=i; return k; } |
6、设有n个人围坐一圈并按顺时针方向从1到n编号, 从第s个人开始进行1到m的报数, 报数到第m个人, 此人出圈, 再从他的下一个人重新开始1到m的报数, 如此进行下去直到所有的人都出圈为止。
#p#副标题#e#
现要求按出圈次序, 每10人一组, 给出这n个人的顺序表。请考生编制函数Josegh()实现此功能并调用函数WriteDat()把结果p输出到文件JOSE.OUT中。
设 n = 100, s = 1, m = 10.
(1) 将1到n个人的序号存入一维数组p中;
(2) 若第i个人报数后出圈, 则将p[i]置于数组的倒数第i个位置上, 而原来第i+1个至倒数第i个元素依次向前移动一个位置;
(3) 重复第(2)步直至圈中只剩下p[1]为止。
注意: 部分源程序存放在PROG1.C中。
请勿改动主函数main()和输出数据函数WriteDat()的内容。
初始化:
以下是引用片段:
#include #define N 100 #define S 1 #define M 10 int p[100], n, s, m ; void WriteDat(void) ; void Josegh(void) { } void main() { m = M ; n = N ; s = S ; Josegh() ; WriteDat() ; } void WriteDat(void) { int i ; FILE *fp ; fp = fopen("jose.out", "w") ; for(i = N - 1 ; i >= 0 ; i--) { printf("%4d ", p[i]) ; fprintf(fp, "%4d", p[i]) ; if(i % 10 == 0) { printf("/n") ; fprintf(fp, "/n") ; } } fclose(fp) ; } |
本题评析:
参考答案及其注释如下:
以下是引用片段:
void Josegh(void) { int i,j,s1,w; s1 = s; for(i = 1; i <= n; i++) p[i-1] = i; /*初始化赋值*/ for(i = n; i>=1; i--) { s1 = (s1 + m - 1)%i; if(s1 == 0)s1 = i; w = p[s1 - 1]; for(j = s1; j < i; j++) p[j - 1] = p[j]; p[i - 1] = w; } } |
7、计算500-800区间内素数的个数cnt,并按所求素数的值从大到小的顺序,再计算其间隔减、加之和,即第1个素数-第2个素数+第三个素数-第4个素数+第5个素数……的值sum.请编写函数countvalue()实现程序的要求;最后main()函数调用函数writeDAT()把结果cnt和sum,输出到文件OUT11.DAT中。
以下是引用片段:
#include<stdio.h> -------------------------------------------------------------------------------------- |
void countvalue() { int i,j,k,l; k=0; l=1; for (i=800;i>=500;i--) { for (j=2;j<=i/2;j++) { if ((i%j)==0) { k=1; break; } } if ((k==0)&&(l==1)) { sum=sum+i; l=2; cnt++; continue; } if ((k==0)&&(l==2)) {sum=sum-i; l=1; cnt++; } k=0; } } --------------------------------------------- void countvalue() {int i,j; for(i=800;i>=500;i--) {for(j=2;j if(!(i%j)) break; if(j==i) { cnt++; if(cnt%2) sum+=i; else sum-=i; } } } |