练习网站:http://acm.hdu.edu.cn/ (账号:Taylent)
Problem : 2000 ( ASCII码排序 )
Problem Description:输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。
#include<stdio.h>
int main()
{
char a,b,c,tmp;
/*
scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF。
scanf("%d %d",&a,&b); 函数返回值为int型。如果a和b都被成功读入,那么scanf
的返回值就是2;如果只有a被成功读入,返回值为1;如果a和b都未被成功读入,返回值为0;
如果遇到错误或遇到end of file,返回值为EOF。end of file为Ctrl+z 或者Ctrl+d。
其中EOF的值为-1也就是说scanf返回值的取值范围是大于等于-1的整数只有返回值为EOF时
其取反的的值 即while循环的判断条件才为0 才能结束循环(-1的补码表示全是1,按位取反后全是0,即为假)
其它输入情况下(无论是否输入成功) while循环的判断条件为非0 即为真
*/
while(~scanf("%c%c%c",&a,&b,&c))
{
getchar();//用getchar()滤掉回车
if(a>b) tmp=a,a=b,b=tmp; //逗号表达式,简洁
if(a>c) tmp=a,a=c,c=tmp;
if(b>c) tmp=b,b=c,c=tmp;
printf("%c %c %c\n",a,b,c);
}
return 0;
}
补充知识点:在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
正整数的补码是其二进制表示,与原码相同;求负整数的补码,将其对应正数二进制表示所有位(包括符号位)取反后加1。