函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件

admin2010-01-11  34

问题 函数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)所对应的字符进行替代。
   原始数据文件存放的格式是:每行的宽度均小于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()
   {
   }
   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,80,fp)!=NULL)
      {
          p=strchr(xx,’\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);
         fprintf(fp,"%s\n",xx);
      }
      fclose(fp);
   }

选项

答案void encryptChar() { int i; char *pf; for(i=0;i<maxline;i++) { pf=xx[i]; while(*pr!=0) { if(*pf*11%256>130||*pf*11%256<=32); else *pf=*pf*11%256; pf++; } } }

解析 该程序属于对字符串处理类型的题目,考核的知识点为:
   (1)按给定关系计算字符的新ASCII值;
   (2)根据条件进行判断;
   (3)根据判断的结果进行替换。
   本题的解题思路是:先将数组中的元素逐个进行计算,若计算后的结果满足题目中的条件则不进行替换,直接对下一个元素进行判断,否则按给定的替换关系进行替换,替换关系在题目中已经给出。
   程序的流程是:首先调用ReadDat()函数,把数据读入到数组xx中,然后调用函数encryptChar()对数据进行处理后,由WriteDat()函数写回文件ps1.dat中去。
   答案解析如下:
   void encryptChar()
   {
     int i;
     char *pf;    /*定义字符型指针pf*/
     for(i=0;i<maxline;i++)
     {
       /*遍历文章的所有行*/
         pf=xx
      /*将二维数组第i行首地址赋给指针变量*/
         while(*pf!=0)
         {
      /*pf的内容不为0时进入循环*/
      if(*pf*11%256>130||*pf*11%256<=32);    /*判断如果*pf*11%256大于130或不大于32时,就执行一条空语句*/
      else
          *pf=*pf*11%256;    /*否则就将pf所指的字符改为*pf*11%256后的值*/
      pf++;   /*指向下一个字符*/
      }
   }
}
转载请注明原文地址:https://jikaoti.com/ti/Qrc7FFFM
0

最新回复(0)