C语言上机问题:在线等答案!为什么中间变量要定义成整型?

函数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) ;
},请问。此题中为什么中间变量要定义成整型,定义成无符号整型为什么错?

第1个回答  2012-09-25
应该是不同的数据类型之间的运算数据截取的问题,你如果定义成无符号整型,赋值符号右边的运算结果如果是一个带符号整型的话,赋值的时候就会自动截取,从带符号的截取到不带符号的会出现数据错误,把符号位也算成值了,所以出错。追问

问题是我定义的这个中间变量(取余运算后)不可能为负数,所以我认为定义成无符号整型和有符号整型应该都可以,也就是你所说的“赋值符号右边的运算结果如果是一个带符号整型的话”不成立啊

追答

会成立呀,因为这句话f(p)=p*11 mod 256中,赋值符号右边的正负号是跟p的值有关的。

第2个回答  2012-09-22
有符号整型变量把数据的最高位作为符号位使用, 因此能表示数的正负;
表示范围: 对于16位的变量为: -32368<=变量<=32367

无符号整型变量把数据的最高位仍作为数据位使用, 因此不能表示负数,
表示范围: 对于16位的变量为: 0<=变量<=65535追问

问题是我定义的这个中间变量(取余运算后)不可能为负数,所以我认为定义成无符号整型和有符号整型应该都可以,请问我的理解错哪了,谢谢

本回答被网友采纳
第3个回答  2012-09-24
有符号的可以表示正负,二进制的第一位表示正负;而无符号不能表示负数,你的问题就是这个中间变量存在负数情况,只能使用有符号了追问

问题是我定义的这个中间变量(取余运算后)不可能为负数,所以我认为定义成无符号整型和有符号整型应该都可以,请问我的理解错哪了,谢谢

追答

你要验证下,是不是你中间结果已经越界了,越界之后就有很大差异了

相似回答