函数ReadDat()实现从文件IN.DAT中读取一篇英文文章,存入到无符号字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,其替代值仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件OUT.DAT中。
替代关系:f(p)=p*11 mod 256, mod为取余运算,p是数组xx中某一个字符的ASCII值,f(p)是计算后无符号的整型值(注意:中间变量定义成整型变量),如果原字符是大写字母或计算后f(p)值小于等于32,则该字符不变,否则用f(p)替代所对应的字符。
注意:部分源程序存放在PROG1.C中,原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格,并也按此替代关系进行处理.
请勿改动主函数main()、读函数ReadDat()和输出函数WriteDat()的内容。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
unsigned char xx[50][80] ;
int maxline = 0 ; /* 文章的总行数 */
int ReadDat(void) ;
void WriteDat(void) ;
void encryptChar()
{
/* 第i行内容已作为字符串存入xx[i]为起始地址的存储单元内 */
/* 请使用中间变量来存放替代关系处理后的值val */
/* 例如: val = (xx[i][j] * 11) % 256 ; */
/* 该提示仅供解题参考,考生也可用其他方法解题 */
unsigned int val ;
}
void main()
{
if(ReadDat()) {
printf("数据文件IN.DAT不能打开!\n\007") ;
return ;
}
encryptChar() ;
WriteDat() ;
}
int ReadDat(void)
{
FILE *fp ;
int i = 0 ;
unsigned char *p ;
if((fp = fopen("K:\\k61\\35000216\\in.dat", "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("K:\\k61\\35000216\\out.dat", "w") ;
for(i = 0 ; i < maxline ; i++) {
printf("%s\n", xx[i]) ;
fprintf(fp, "%s\n", xx[i]) ;
}
fclose(fp) ;
},请问。此题中为什么中间变量要定义成整型,定义成无符号整型为什么错?
问题是我定义的这个中间变量(取余运算后)不可能为负数,所以我认为定义成无符号整型和有符号整型应该都可以,也就是你所说的“赋值符号右边的运算结果如果是一个带符号整型的话”不成立啊
追答会成立呀,因为这句话f(p)=p*11 mod 256中,赋值符号右边的正负号是跟p的值有关的。
问题是我定义的这个中间变量(取余运算后)不可能为负数,所以我认为定义成无符号整型和有符号整型应该都可以,请问我的理解错哪了,谢谢
本回答被网友采纳问题是我定义的这个中间变量(取余运算后)不可能为负数,所以我认为定义成无符号整型和有符号整型应该都可以,请问我的理解错哪了,谢谢
追答你要验证下,是不是你中间结果已经越界了,越界之后就有很大差异了