2006年9月全國等級考試三級c語言上機題庫(八)

★☆題目8(無憂id 83 字元替換題)

函式readdat()實現從檔案eng.in中讀取一篇英文文章,存入到字元串數組xx中;請編制函式encryptchar(),按給定的替代關係對數組xx中的所有字元進行替代,仍存入數組xx的對應的位置上,最後調用函式writedat()把結果xx輸出到檔案ps1.dat中。
替代關係:f(p)=p*11 mod 256(p是數組中某一個字元的ascii值,f(p)是計算後新字元的ascii值),如果計算後f(p)值小於等於32或大於130,則該字元不變,否則將f(p)所對應的字元進行替代。部分源程式存在檔案prog1.c中。原始數據檔案存放的格式是:每行的寬度均小於80個字元。
請勿改動主函式main()、讀數據函式readdat()和輸出數據函式writedat()的內容。
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>

unsigned char xx[50][80];
int maxline=0;/*文章的總行數*/

int readdat(void);
void writedat(void);

void encryptchar()
{ int i,j;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
if(xx[i][j]*11%256<=32||xx[i][j]*11%256>130) continue;
else xx[i][j]=xx[i][j]*11%256;
}

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("ps1.dat","w");
for(i=0;i<maxline;i++){
printf("%s\n",xx[i]);
fprintf(fp,"%s\n",xx[i]);
}
fclose(fp);
}
解法二:
void encryptchar()
{ int i,j,k;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
{ k= xx[i][j]*11%256;
if(k<=32||k>130) continue;
else xx[i][j]=k;
}
}

解法三:
void encryptchar()
{ int i,j;
unsigned char ch;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
{ ch=xx[i][j]*11%256;
if(ch<=32||ch>130) continue;
else xx[i][j]=ch;
}
}

解法四:
void encryptchar()
{ int i,j;
char *p;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
{ p=xx[i][j]*11%256;
if(p<=32||p>130) continue;
else xx[i][j]=p;
}
}

解法五:
void encryptchar()
{ int i;
char *pf;
for(i=0;i<maxline;i++)
{ pf=xx[i];
while(*pf!=0)
if(*pf*11%256<=32||*pf*11%256>130) pf++;
else *pf++=*pf*11%256;
}
}