把从键盘上键入的一串数字和正负号转换成等价的数字值,并打印出来.

数组‘
题目:把从键盘上键入的一串数字和正负号转换成等价的数字值,并打印出来.
程序:
main()
{
int i,sign;
char s[5];
long int n;
sign=1;
for(i=0;i<5;i++)
s=getcher( );
i=0;
if(s=='+'||s=='-')
sign=(s[i++]=='+')?1:-1;
for(n=0;s>='0'&&s<='9';i++)
n=10*n+s-'0';
n=n*sign;
printf("the value is %ld\n",n);

我所存在的问题:对:
if(s=='+'||s=='-')
sign=(s[i++]=='+')?1:-1;
for(n=0;s>='0'&&s<='9';i++)
n=10*n+s-'0';
n=n*sign;
理解不了.换言之就是还不理解它的算法.那位高手指点一二?谢谢了@

}

你这程序应该有问题吧,首先,你定义的是s[5]这个字符数组,然后用s=getcher();这个s应该改成一个字符型数据char s;,而不应该定义s[5];再有,是getchar而不是cher;它是表示接收从键盘输入的,赋给字符s
if(s=='+'||s=='-')这个是条件所接收的字符为'+'或为'-'中间的||是逻辑或。
sign=(s[i++]=='+')?1:-1这句的?:是一个条件运算符,如果?前面的条件成立,则值为1否则值为-1,注意,条件运算符的优先级比赋值运算符的高,所以,将最后的值赋值给sign这句的意思应该是这样的,就是先判断
(s[i++]=='+')是否成立,成立,sign=1;
不成立sign=-1;这句也应该改成sign=(s=='+')?1:-1;
for(n=0;s>='0'&&s<='9';i++)
n=10*n+s-'0';
这个循环语句是将字符型的数字转成整型数字的,
s-'0'这个就是得到的整型的数字,但是,由于可能不止有一位数字,所以,用循环,如果接收到的s>='0'&&s<='9'就说明接收到的是字符型的数字,就要转换,给你举个例子:字符串“12”先接到‘1’就将'1'-'0'得到的是整型的n=n*10+s-'0',n初值为0,接收后n=1,他们是ascii相减,然后接收下个数据'2'还在'0'-'9'之间,所以,执行n=n*10+s-'0'这时侯n=1就是刚才接收的十位上的1,然后再加上个位上的2,同理,只要接收的是字符的数据,就这样走下去。n=n*sign,刚才那个条件语句用来判断正负的,如果是正的话sign=1,否则sing=-1刚才讲过的。最后得到的,就是转后的了。
当然,如果你定义用char s[5]的话,你的
for(i=0;i<5;i++)
s=getcher( );
这句改一下也成;
把下面的句改成s[i]=getchar();
这样也行的,如果像我上面说的那种改法,你要设置一个循环的,做往下接收数据的判断,针对你的程序,今天早上我又看了一下,像下面这种改法是最好的。
温馨提示:内容为网友见解,仅供参考
第1个回答  2007-12-06
'+'在C++中还可以这样用?
初学,..又学习到东西啦,.
谢谢.

把从键盘上键入的一串数字和正负号转换成等价的数字值,并打印出来.
这个循环语句是将字符型的数字转成整型数字的,s-'0'这个就是得到的整型的数字,但是,由于可能不止有一位数字,所以,用循环,如果接收到的s>='0'&&s<='9'就说明接收到的是字符型的数字,就要转换,给你举个例子:字符串“12”先接到‘1’就将'1'-'0'得到的是整型的n=n*10+s-'0',n...

excel表中,如何把日期数转换成月份数呢?
1、打开电脑,找到需要修改的Excel表格,点击并进入。2、进入之后,选中需要修改的表格区域。3、选中之后,点击图示位置的“数据”,进入下一页面。4、进入之后,点击“分列”,进入下一页面。5、进入之后,选择“分隔符号”,点击“下一步”。6、进入下一页面之后,选择“日期”,点击“完成”即可。

关于汇编语言矩阵
; 功能:键盘输入一个指定位数(N)的十进制数字,将其转换成二进制数并保存在指定的内存单元。; 输足N位的,自动结束输入;不足N位的,回车结束输入。; 由于限定最大数据类型为字,所以,数字位数最多:5,最大无符号数:65536; 约定:直接回车,视为数字0; 入口:@@Digits=数字位数;di=保存输入的数字首地址; @@Typ...

请求DOS全套的命令符及解说
光标置位:与上面的光标定位转义序列等价。 ESC[PnA 光标上移:向上按指定的行数移动光标,所在列数不变.如果光标已在顶行,ANSI.SYS忽略该序列。 ESC[PnB 光标下移:按指定的行数向下移动光标数行,且保持所在列数不变.如果光标已在底行,ANSI.SYS忽略此序列。 ESC[PnC 光标前移:按指定的列数向前移动光标数列,且...

把从键盘上键入的一串数字和正负号转换成等价的数字值,并打印出来.
这个循环语句是将字符型的数字转成整型数字的,s-'0'这个就是得到的整型的数字,但是,由于可能不止有一位数字,所以,用循环,如果接收到的s>='0'&&s<='9'就说明接收到的是字符型的数字,就要转换,给你举个例子:字符串“12”先接到‘1’就将'1'-'0'得到的是整型的n=n*10+s-'0',n...

相似回答