C语言请帮一下忙^_^

其中为什么要加语句ch=xx[i][strlen(xx[i])-1];和xx[i][0]+=ch;这条语句(xx[i][j]=xx[i][j]>>=4+xx[i][j-1... 其中为什么要加语句ch = xx[ i ][ strlen(xx[ i ])-1];和xx[ i ][ 0 ] += ch;这条语句(xx[ i ][ j ] =xx[ i ][ j ]>>=4 + xx[ i ][ j-1 ];)算不算是正确的?
/*------------------------------------------------------------------------
题目100:函数READDAT()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组
XX中;请编制函数CHA(),其函数功能是:以行为单位把字符串中的最后一个字符的ASCII
值右移4位后加最后第二个字符的ASCII值,得到最后一个新的字符,最后第二个字符
的ASCII值右移4位后加最后第三个字符的ASCII值,得到最后第二个新的字符,依此类
推一直处理到第二个字符,第一个字符的ASCII值加原最后一个字符的ASCII值,得到
第一个新的字符,得到的新字符分别存放在原字符串对应的位置上。最后已处理的字
符串仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件
OUT10.DAT中。原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号
和空格。
注意:部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。
------------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <conio.h>

char xx[50][80] ;
int maxline = 0 ; /* 文章的总行数 */

int ReadDat(void) ;
void WriteDat(void) ;

void CharConvA(void)
{
int i,j,k;
char ch;
for(i = 0; i < maxline;i++){
ch = xx[ i ][ strlen(xx[ i ])-1];
for(j = strlen(xx[ i ])-1;j >0;j--){
xx[ i ][ j ] =xx[ i ][ j ]>>=4 + xx[ i ][ j-1 ];
}
xx[ i ][ 0 ] += ch;
}
}

void main()
{
clrscr() ;
if(ReadDat()) {
printf("数据文件IN.DAT不能打开!\n\007") ;
return ;
}
CharConvA() ;
WriteDat() ;
getchar() ;
}

int ReadDat(void)
{
FILE *fp ;
int i = 0 ;
char *p ;

if((fp = fopen("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 ;

clrscr() ;
fp = fopen("OUT10.DAT", "w") ;
for(i = 0 ; i < maxline ; i++) {
printf("%s\n", xx[i]) ;
fprintf(fp, "%s\n", xx[i]) ;
}
fclose(fp) ;
}

展开
 我来答
百度网友406ae28
推荐于2016-06-15 · TA获得超过326个赞
知道小有建树答主
回答量:115
采纳率:0%
帮助的人:0
展开全部
题目要求:“第一个字符的ASCII值加原最后一个字符的ASCII值,得到
第一个新的字符”,所以这里ch = xx[ i ][ strlen(xx[ i ])-1];是为了保存最后一个字符的原始值,用来和第一个字符相加

(xx[ i ][ j ] =xx[ i ][ j ]>>=4 + xx[ i ][ j-1 ];)是正确的。

附:C++ 运算符优先级列表 c语言的操作符共有15个优先级,如下:
Operators Associativity
() [] -> . left to right
! ~ ++ -- + - * (type) sizeof right to left
* / % left to right
+ - left to right
<< >> left to right
< <= > >= left to right
== != left to right
& left to right
^ left to right
| left to right
&& left to right
|| left to right
?: right to left
= += -= *= /= %= &= ^= |= right to left
, left to right
优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。
所有的优先级中,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。其它的都是从左至右结合。
具有最高优先级的其实并不算是真正的运算符,它们算是一类特殊的操作。()是与函数相关,[]与数组相关,而->及.是取结构成员。
其次是单目运算符,所有的单目运算符具有相同的优先级,因此在我认为的 真正的运算符中它们具有最高的优先级,又由于它们都是从右至左结合的,因此*p++与*(p++)等效是毫无疑问的。
接下来是算术运算符,*、/、%的优先级当然比+、-高了。
移位运算符紧随其后。
其次的关系运算符中,< <= > >=要比 == !=高一个级别,不大好理解。
所有的逻辑操作符都具有不同的优先级(单目运算符出外,!和~)
逻辑位操作符的"与"比"或"高,而"异或"则在它们之间。
跟在其后的&&比||高。
接下来的是条件运算符,赋值运算符及逗号运算符。
在C语言中,只有4个运算符规定了运算方向,它们是&&、| |、条件运算符及赋值运算符。
&&、| |都是先计算左边表达式的值,当左边表达式的值能确定整个表达式的值时,就不再计算右边表达式的值。如 a = 0 && b; &&运算符的左边位0,则右边表达式b就不再判断。
在条件运算符中。如a?b:c;先判断a的值,再根据a的值对b或c之中的一个进行求值。
赋值表达式则规定先对右边的表达式求值,因此使 a = b = c = 6;成为可能。
意法半导体(中国)投资有限公司
2023-06-12 广告
单片机,单片微型计算机。它是把中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、输入/输出端口(I/O)等主要计算机功能部件都集成在一块集成电路芯片上的微型计算机。单片机具有性能高、速度快、体积小、价格低、稳定可靠、应用... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式