南开上机版.docx
- 文档编号:29382736
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:120
- 大小:47.61KB
南开上机版.docx
《南开上机版.docx》由会员分享,可在线阅读,更多相关《南开上机版.docx(120页珍藏版)》请在冰豆网上搜索。
南开上机版
一、替换字符。
1、函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS10.DAT中。
替代关系:
f(p)=p*11mod256(p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果原字符的ASCII值是偶数或计算后f(p)值小于等于32,则该字符不变,否则将f(p)所对应的字符进行替代。
部分源程序已给出,原始数据文件存放的格式是:
每行的宽度均小于80个字符。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#include
unsignedcharxx[50][80];
intmaxline=0;/*文章的总行数*/
intReadDat(void)
voidWriteDat(void)
voidencryptChar()
{}
voidmain()
{clrscr();
if(ReadDat()){
printf(\"数据文件ENG.IN不能打开!
\\n\\007\");
return;}
encryptChar();
WriteDat();}
intReadDat(void)
{FILE*fp;
inti=0;
unsignedchar*p;
if((fp=fopen(\"eng.in\",\"r\"))==NULL)return1;
while(fgets(xx[i],80,fp)!
=NULL)
{p=strchr(xx[i],'\\n');
if(p)*p=0;
i++;}
maxline=i;
fclose(fp);
return0;}
voidWriteDat(void)
{FILE*fp;
inti;
fp=fopen(\"ps10.dat\",\"w\");
for(i=0;i {printf(\"%s\\n\",xx[i]); fprintf(fp,\"%s\\n\",xx[i]);} fclose(fp);} 注: 在ReadDat()函数中由于fgets()函数读入数据时没有读入字符串结束符'\0',因而用while()循环在xx数组每一行未尾将换行符'\n'替换成结束符'\0'。 编写的函数如下: 该函数的基本算法是——让字符指针pf指向每一行的开头然后逐一往后移动,在移动过程中按要求进行转换。 *pf=*pf/2*2用于判断是否为偶数。 if()条件语句用于控制不替代字符。 voidencryptChar() {inti; char*pf; for(i=0;i {pf=xx[i]; while(*pf! =0) {if(*pf==*pf/2*2||*pf*11%256<32) {pf++;continue;} *pf=*pf*11%256; pf++;} } } voidencryptChar() {inti,j,t; for(i=0;i {for(j=0;j {t=xx[i][j]*11%256; if(t<=32||xx[i][j]%2==0)continue; xx[i][j]=t; } } } 3、函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS8.DAT中。 替代关系: f(p)=p*11mod256(p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果原字符是小写字母或计算后f(p)值小于等于32,则该字符不变,否则将f(p)所对应的字符进行替代。 部分源程序已给出。 原始数据文件存放的格式是: 每行的宽度均小于80个字符。 请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。 #include unsignedcharxx[50][80]; intmaxline=0;/*文章的总行数*/ intReadDat(void) voidWriteDat(void) voidencryptChar() {} voidmain() {clrscr(); if(ReadDat()){ printf(\"数据文件ENG.IN不能打开! \\n\\007\"); return;} encryptChar(); WriteDat();} intReadDat(void) {FILE*fp; inti=0; unsignedchar*p; if((fp=fopen(\"eng.in\",\"r\"))==NULL)return1; while(fgets(xx[i],80,fp)! =NULL) {p=strchr(xx[i],'\\n'); if(p)*p=0; i++;} maxline=i; fclose(fp); return0;} voidWriteDat(void) {FILE*fp; inti; fp=fopen(\"ps8.dat\",\"w\"); for(i=0;i printf(\"%s\\n\",xx[i]); fprintf(fp,\"%s\\n\",xx[i]); } fclose(fp);} voidencryptchar() {inti; char*pf; for(i=0;i {pf=xx[i]; while(*pf! =0) {if(*pf>='a'&&*pf<='z'||*pf*11%256<32) {pf++;continue;} *pf=*pf*11%256; pf++;} } } voidencryptChar() {inti,j,t; for(i=0;i for(j=0;j {t=xx[i][j]*11%256; if(t<=32||xx[i][j]>='a'&&xx[i][j]<='z') continue; xx[i][j]=t;} } 9、函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS2.DAT中。 替代关系: f(p)=p*13mod256(p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果计算后f(p)值小于等于32或其ASCII值是偶数,则该字符不变,否则将f(p)所对应的字符进行替代。 部分源程序已给出。 原始数据文件存放的格式是: 每行的宽度均小于80个字符。 请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。 #include unsignedcharxx[50][80]; intmaxline=0;/*文章的总行数*/ intReadDat(void) voidWriteDat(void) voidencryptChar() {} voidmain() {clrscr(); if(ReadDat()){ printf(\"数据文件ENG.IN不能打开! \\n\\007\"); return;} encryptChar(); WriteDat();} intReadDat(void) {FILE*fp; inti=0; unsignedchar*p; if((fp=fopen(\"eng.in\",\"r\"))==NULL)return1; while(fgets(xx[i],80,fp)! =NULL) {p=strchr(xx[i],'\\n'); if(p)*p=0; i++;} maxline=i; fclose(fp); return0;} voidWriteDat(void) {FILE*fp; inti; fp=fopen(\"ps2.dat\",\"w\"); for(i=0;i printf(\"%s\\n\",xx[i]); fprintf(fp,\"%s\\n\",xx[i]);} fclose(fp);} voidencryptchar() {inti; char*pf; for(i=0;i {pf=xx[i]; while(*pf! =0) {if(*pf%2==0||*pf*13%256<32) {pf++;continue;} *pf=*pf*11%256; pf++;} } } voidencryptChar() {inti,j,t; for(i=0;i {for(j=0;j {t=xx[i][j]*13%256; if(t<=32||t%2==0)continue; xx[i][j]=t;} } } 27、函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数ConverCharD(),其函数的功能是: 以行为单位把字符串中的所有小写字母改写成该字母的上一个字母,如果是字母a,则改写成字母z。 大写字母仍为大写字母,小写字母仍为小写字母,其他字符不变。 最后把已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT4.DAT中。 例: 原文: Adb.Bcdzaabck.LLhj 结果: Aca.Bbcyzzabj.LLgi原始数据文件存放的格式是: 每行的宽度均小于80个字符,含标点符号和空格。 部分源程序已给出。 请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。 #include charxx[50][80]; intmaxline=0;/*文章的总行数*/ intReadDat(void) voidWriteDat(void) voidConverCharD(void) {} voidmain() {clrscr(); if(ReadDat()){ printf(\数据文件ENG.IN不能打开! \\n\\007\); return;} ConverCharD(); WriteDat();} intReadDat(void) {FILE*fp; inti=0; char*p; if((fp=fopen(\IN.DAT\,\r\))==NULL)return1; while(fgets(xx[i],80,fp)! =NULL){ p=strchr(xx[i],'\\n'); if(p)*p=0; i++;} maxline=i; fclose(fp); return0;} voidWriteDat(void) {FILE*fp; inti; fp=fopen(\OUT4.DAT\,\w\); for(i=0;i printf(\%s\\n\,xx[i]); fprintf(fp,\%s\\n\,xx[i]);} fclose(fp);} 注: *(p-1)=(*(p-1)-'a'+26-1)%26+'a'该表达式是求出小写字母*(p-1)的前一个字母的算法。 如果是求大写字母则将'a'改成'A'即可,如果是求前4个字母(a换成w等)则将-1改成-4,如果是求后面的字母则将减号改成加号即可。 在该题中由于while(*p++)判断完后p向后移动一个字符,因而在if()中要用*(p-1)转换前一个字符。 voidconvertchard(void) {char*p; inti; for(i=0;i {p=xx[i]; while(*p++) if(islower(*(p-1)))*(p-1)=(*(p-1)-'a'+26-1)%26+'a';} } 30、下列程序的功能是: 把s字符串中的所有字母改写成该字母的下一个字符,字母z改写成字母a。 要求大写字母仍为大写字母,小写字母仍为小写字母,其他字符不做改变。 请编写函数chg(char*s)实现程序的要求,最后调用函数readwriteDat()把结果输出到文件out.dat中。 例如: s字符串中原有的内容为: Mn.123Zxy,则调用该函数后,结果为No.123Ayz。 部分源程序已给出。 请勿改动主函数main()和输出数据函数writeDat()的内容。 #include voidreadwriteDAT(); voidchg(char*s) {} main() {chara[N]; clrscr(); printf(\Enterastring: \);gets(a); printf(\Theoriginalstringis;\);puts(a); chg(a); printf)(\Thestringaftermodified: \); puts(a); readwriteDAT();} viodreadwriteDAT() {inti; chara[N]; FILE*rf,*wf; rf=fopen(\in.dat\,\r\); wf=fopen(\out.dat\,\w\); for(i=0;i<10;i++){ fscanf(rf,\%s\,a); chg(a); fprintf(wf,\%s\\n\,a);} fclose(rf); fclose(wf);} 注: 该题的思路比较明显,先判断是否是'z'或'Z',若是则转成相应的'a'或'A',否则再判断是不是字母(已除'z'或'Z')。 voidchg(char*s) {inti,j,k; k=strlen(s); for(i=0;i {if(s[i]=='z'//s[i]=='Z') s[i]-=25; elseif(isalpha(s[i])) s[i]+=1;} } 73、函数READDAT()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组XX中;请编制函数CONVERTCHARA(),其函数功能是: 以行为单位把字符串中的所有小写字母改写成该字母的下一个字母,如果是字母Z,则改写成字母A.大写字母仍为大写字母,小写字母仍为小写字母,其他字符不变.把已处理的字符串仍按行重新存入字符串数组XX中,最后调用函数WRITEDAT()把结果XX输出到文件OUT.DAT中.例: 原文: Adb.Bcdzaabck.LLhj 结果: Aec.Bdeabbcdl.LLik原始数据文件存放的格式是: 每行的宽度均小于80个字符,含标点符号和空格. #include"stdio.h"#include"string.h"#include"conio.h" charxx[50][80]; intmaxline=0; intreaddat(void); voidwritedat(void); voidconvertcharA(void) {} voidmain() {clrscr(); if(readdat()) {printf("Can'topenthefileENG.IN! \n"); return;} convertcharA(); writedat();} intreaddat(void) {FILE*fp; inti=0; char*p; if((fp=fopen("in.dat","r"))==NULL) return1; while(fgets(xx[i],80,fp)! =NULL) {p=strchr(xx[i],'\n'); if(p) *p=0; i++;} maxline=i; fclose(fp); return0;} voidwritedat(void) {FILE*fp; inti; fp=fopen("out3.dat","w"); for(i=0;i {printf("%s\n",xx[i]); fprintf(fp,"%s\n",xx[i]);} fclose(fp);} /*注: 注意本题中不能将第一个if()的else去掉,若不用else则经过第一个if()后原来字符'z'变成了'a',当再经过第二个if()时又将已变成'a'的字符改成了'b',即实际上字母'z'变成了字母'b',这是不行的*/ voidconvertcharA(void) {char*p; inti; for(i=0;i {p=xx[i]; while(*p) {if(*p=='z')*p='a'; elseif(*p>='a'&&*p<'z')*p=*p+1; p++;} } } 二、字符串左右排序和比较 2、函数ReadDat()实现从文件in.dat中读取20行数据存放到字符串数组xx中(每行字符串长度均小于80)。 请编制函数jsSort(),其函数的功能是: 以行为单位对字符串按给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件out.dat中。 条件: 从字符串中间一分为二,左边部分按字符的ASCII值升序排序,排序后左边部分与右边部分进行交换。 如果原字符串长度为奇数,则最中间的字符不参加处理,字符仍放在原位置上。 例如: 位置012345678源字符串 dcbahgfe432198765 则处理后字符串hgfeabcd876591234部分源程序已给出。 请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。 #include charxx[20][80]; voidjsSort() {} voidmain() {readDat(); jsSort(); writeDat();} readDat() {FILE*in; inti=0; char*p; in=fopen(\"in.dat\",\"r\"); while(i<20&&fgets(xx[i],80,in)! =NULL) {p=strchr(xx[i],'\\n'); if(p)*p=0; i++;} fclose(in);} writeDat() {FILE*out(); inti; clrscr(); out=fopen(\"out.dat\",\"w\"); for(i=0;i<20;i++) {printf(\"%s\\n\",xx[i]); fprintf(out,\"%s\\n\",xx[i]);} fclose(out);} 注: 先采用冒泡法对左边部分进行升序排序,然后将排序后的左半与右半按对应位进行 调换。 voidjsSort() {inti,strl,half,j,k; charch; for(i=0;i<20;i++) {strl=strlen(xx[i]); half=strl/2; for(j=0;j for(k=j+1;k if(xx[i][j]>xx[i][k]) {ch=xx[i][j];xx[i][j]=xx[i][k];xx[i][k]=ch;} for(j=half-1,k=strl-1;j>=0;j--,k--) {ch=xx[i][j];xx[i][j]=xx[i][k];xx[i][k]=ch;} } } 4、函数ReadDat()实现从文件in.dat中读取20行数据存放到字符串数组xx中(每行字符串长度均小于80)。 请编制函数jsSort(),其函数的功能是: 以行为单位对字符串按给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件out.dat中。 条件: 从字符串中间一分为二,左边部分按字符的ASCII值降序排序,排序后左边部分与右边部分进行交换。 如果原字符串长度为奇数,则最中间的字符不参加处理,字符仍放在原位置上。 例如: 位置 0 1 2 3 4 5 6 7 8源字符串 abcdhgfe 123498765则处理后字符串hgfedcba876594321 部分源程序已给出。 请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。 #include charxx[20][80]; voidjsSort() {} voidmain() {readDat(); jsSort(); writeDat();} readDat() {FILE*in; inti=0; char*p; in=fopen(\"in.dat\",\"r\"); while(i<20&&fgets(xx[i],80,in)! =NULL) {p=strchr(xx[i],'\\n'); if(p)*p=0; i++;} fclose(in);} writeDat() {FILE*out(); inti; clrscr(); out=fopen(\"out.dat\",\"w\"); for
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 南开 上机