全国计算机等级考试---三级上机题型示例一

一、替换字符<o:p></o:p>

1题 函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS10.DAT中。   替代关系:f(p)=p*11 mod 256 (p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果原字符的ASCII值是偶数或计算后f(p)值小于等于32,则该字符不变,否则将f(p)所对应的字符进行替代。<o:p></o:p>

  部分源程序已给出,原始数据文件存放的格式是:每行的宽度均小于80个字符。<o:p></o:p>

  请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。 <o:p></o:p>

#include<stdio.h></stdio.h><o:p></o:p>

#include<string.h></string.h><o:p></o:p>

#include<conio.h></conio.h><o:p></o:p>

#include<ctype.h></ctype.h><o:p></o:p>

unsigned char xx[50][80];<o:p></o:p>

int maxline=0;/*文章的总行数*/<o:p></o:p>

int ReadDat(void)<o:p></o:p>

void WriteDat(void)<o:p></o:p>

void encryptChar()<o:p></o:p>

{<o:p></o:p>

<o:p></o:p>

}<o:p></o:p>

void main()<o:p></o:p>

{<o:p></o:p>

clrscr();<o:p></o:p>

if(ReadDat()){<o:p></o:p>

printf("数据文件ENG.IN不能打开!\n\007");<o:p></o:p>

return;  }<o:p></o:p>

encryptChar();<o:p></o:p>

WriteDat();    }<o:p></o:p>

int ReadDat(void)<o:p></o:p>

{  FILE *fp;<o:p></o:p>

int i=0;<o:p></o:p>

unsigned char *p;<o:p></o:p>

  if((fp=fopen("eng.in","r"))==NULL) return 1;<o:p></o:p>

while(fgets(xx[i],80,fp)!=NULL){<o:p></o:p>

p=strchr(xx[i],'\n');<o:p></o:p>

if(p)*p=0;<o:p></o:p>

i++;  }<o:p></o:p>

maxline=i;<o:p></o:p>

fclose(fp);       <o:p></o:p>

  return 0;<o:p></o:p>

}<o:p></o:p>

void WriteDat(void)<o:p></o:p>

{<o:p></o:p>

FILE *fp;<o:p></o:p>

int i;<o:p></o:p>

fp=fopen("ps10.dat","w");<o:p></o:p>

for(i=0;i<o:p></o:p>

printf("%s\n",xx[i]);<o:p></o:p>

fprintf(fp,"%s\n",xx[i]);<o:p></o:p>

}<o:p></o:p>

fclose(fp);<o:p></o:p>

}<o:p></o:p>

------------------------------------------------------------------<o:p></o:p>

注:在ReadDat()函数中由于fgets()函数读入数据时没有读入字符串结束符'\0',因而用while()循环在xx数组每一行未尾将换行符'\n'替换成结束符'\0'。编写的函数如下:该函数的基本算法是——让字符指针pf指向每一行的开头然后逐一往后移动,在移动过程中按要求进行转换。*pf%2==0用于判断是否为偶数。if()条件语句用于控制不替代字符。<o:p></o:p>

解法1:<o:p></o:p>

void encryptChar()<o:p></o:p>

{<o:p></o:p>

int i;<o:p></o:p>

char *pf;<o:p></o:p>

for(i=0;i行循环*/<o:p></o:p>

{pf=xx[i];               /*每行字符个数*/  <o:p></o:p>

while(*pf!=0)<o:p></o:p>

{if(*pf%2==0||*pf*11%256<32)<o:p></o:p>

{pf++;continue;}         <o:p></o:p>

*pf=*pf*11%256;<o:p></o:p>

pf++;<o:p></o:p>

}}}<o:p></o:p>

<o:p></o:p>

解法2:<o:p></o:p>

void encryptChar()<o:p></o:p>

{<o:p></o:p>

int i,j,t;<o:p></o:p>

for(i=0;i<o:p></o:p>

{<o:p></o:p>

for(j=0;j<o:p></o:p>

{<o:p></o:p>

t=xx[i][j]*11%256;<o:p></o:p>

if(t<=32 || xx[i][j]%2==0) continue;<o:p></o:p>

xx[i][j]=t;<o:p></o:p>

}}}<o:p></o:p>

2、函数READDAT()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组XX中;请编制函数CONVERTCHARA(),其函数功能是:以行为单位把字符串中的所有字母改写成该字母的下一个字母,如果是字母Z,则改写成字母A.大写字母仍为大写字母,小写字母仍为小写字母,其他字符不变.把已处理的字符串仍按行重新存入字符串数组XX中,最后调用函数WRITEDAT()把结果XX输出到文件OUT.DAT中.<o:p></o:p>

例:原文:Adb.Bcdza<o:p></o:p>

abck.LLhj<o:p></o:p>

结果:Aec.Bdeab<o:p></o:p>

bcdl.LLik<o:p></o:p>

原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格.<o:p></o:p>

/* 注:注意本题中不能将第一个if()的else去掉,若不用else则经过第一个if()后原来字符'z'变成了'a',当再经过第二个if()时又将已变成'a'的字符改成了'b',即实际上字母'z'变成了字母'b',这是不行的。*/<o:p></o:p>

void convertcharA(void)<o:p></o:p>

{<o:p></o:p>

char *p;<o:p></o:p>

int i;<o:p></o:p>

for(i=0;i<o:p></o:p>

{p=xx[i];<o:p></o:p>

while(*p)<o:p></o:p>

{if(*p=='z') *p='a';<o:p></o:p>

else if(*p>='a'&&*p<'z') *p=*p+1;<o:p></o:p>

if(*p=='Z') *p='A';<o:p></o:p>

else if(*p>='A'&&*p<'Z') *p=*p+1;<o:p></o:p>

p++;  <o:p></o:p>

}}}<o:p></o:p>

<o:p></o:p>

3、函数READDAT()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组XX中;请编制函数CHA(),其函数功能是:以行为单位把字符串中的第一个字符的ASCII值加第二个字符的ASCII值,得到第一个新字符,第二个字符的ASCII值加第三个字符的ASCII值,得到第二个新字符,依此类推一直处理到最后第二个字符,最后一个字符的ASCII值加原第一个字符的ASCII值,得到最后一个新的字符,得到的新字符分别存放在原字符串对应的位置上。最后把已处理的字符串逆转后按行重新存入字符串数组XX中,最后调用函数WRITEDAT()把结果XX输出到文件OUT9.DAT中.原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格.<o:p></o:p>

/* 注:本题中内嵌的for()循环只改变第一个字符到倒数的第二个,其中倒数最后一个<o:p></o:p>

字符用最后一个语句来改变(它已不在for()循环中)。*/<o:p></o:p>

void ShA(void)<o:p></o:p>

{<o:p></o:p>

int i,j;<o:p></o:p>

char t1;<o:p></o:p>

for(i=0;i<o:p></o:p>

{t1=xx[i][0];<o:p></o:p>

for(j=0;xx[i][j+1]!='\0';j++)<o:p></o:p>

      xx[i][j]=xx[i][j]+xx[i][j+1];<o:p></o:p>

  xx[i][j]=xx[i][j]+t1;    /*注意:当xx[i][j+1]!='\0'这个条件不满足时,j的值已经为字符串的最后一位的下标值了*/<o:p></o:p>

}}

你可能感兴趣的:(算法,F#,J#,FP)