c语言ASCII码排序

ASCII码排序

Problem Description
输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。

Input
输入数据有多组,每组占一行,有三个字符组成,之间无空格。

Output
对于每组输入数据,输出一行,字符中间用一个空格分开。

Sample Input
qweasdzxc

Sample Output
e q w
a d s
c x z

#include<stdio.h>
main()
{ char a,b,c,t;
int x,y,z;
while(scanf("%c%c%c",&a,&b,&c)!=EOF);
{
x=int(a);
y=int(b);
z=int(c);
while(x<y&&y<z&&x<z);
{
if(x>y)
{t=a;a=b;b=t;}
if(x>z)
{t=a;a=c;c=t;}
if(y>z)
{t=b;b=c;c=t;}
}
printf("%c %c %c\n",a,b,c);
}
}
用C++
总是wrong answer
我的问题是在“输入数据有多组”,望高手指点迷津! 第三位回答者的写法还是在杭电的ACM上没通过,还是WA。杭电网站是acm.hdu.edu.cn.还有这里我打错了Sample Input
qweasdzxc
应为qwe
asd
zxc
感谢NEV_CC我解决了输入数据有多组,但出现答案每次输会有变化!!
#include<stdio.h>
main()
{ char a,b,c,t;
int x,y,z;
while(scanf("%c%c%c",&a,&b,&c)!=EOF)
{
x=int(a);
y=int(b);
z=int(c);
while(x<y&&y<z&&x<z);
{
if(x>y)
{t=a;a=b;b=t;printf("%c %c %c\n",a,b,c);}
if(x>z)
{t=a;a=c;c=t;printf("%c %c %c\n",a,b,c);}
if(y>z)
{t=b;b=c;c=t;printf("%c %c %c\n",a,b,c);}
}
x=0;y=0;z=0;
printf("%c %c %c\n",a,b,c);
}
}
回答三楼的NEU_CC。我要在程序不结束的情况下一组一组输

思路:就是求三个字符按照ASCII码顺序进行排序输出,三个字符排序可以先求出三个数中的最大值和最小值,再把三个字符相加减去最大和最小的就是中间字符。

参考代码:

#include<stdio.h>
main()
{   char a,b,c,max,min;
    while(scanf("%c%c%c",&a,&b,&c)!=EOF)
    {
     max=(a>b?a:b)>c?(a>b?a:b):c;
     min=(a<b?a:b)<c?(a<b?a:b):c;
   printf("%c %c %c\n",min,a+b+c-min-max,max);
    }
}
/*
输出:
qweasdzxc
e q w
a d s
c x z
*/
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-19
#include<stdio.h>

void main()
{
char a,b,c,t;
int x,y,z;

while(scanf("%c%c%c",&a,&b,&c)==EOF); //这里修改了判断,否则不能执行下面的程序
{
x=int(a);
y=int(b);
z=int(c);

while(x<y&&y<z&&x<z);
{
if(x>y)
{
t=a;a=b;b=t;
}

if(x>z)
{
t=a;a=c;c=t;
}

if(y>z)
{
t=b;b=c;c=t;
}
}

printf("%c %c %c\n",a,b,c);
}
}

另外,你的程序只能判断前三位,即qwe,因为scanf的时候,只有a,b,c接收字符,所以不能判断后面的asdzxc.
还有,这个程序可以改进,可以去掉第一层while(scanf("%c%c%c",&a,&b,&c)==EOF);直接写成scanf("%c%c%c",&a,&b,&c);就可以了。

你想一次输入
qwe
asd
zxc
后,然后显示
ewq
dsa
cxz
还是一步一步的,输入qwe后,显示ewq,再输入asd后,显示dsa,最后输入zxc后,显示cxz???

#include<stdio.h>

void main()
{
char a,b,c,t;
int x,y,z;

//while(scanf("%c%c%c",&a,&b,&c) != EOF);
for (;;)
{
scanf("%c%c%c",&a,&b,&c);
x=int(a);
y=int(b);
z=int(c);

while(x<y&&y<z&&x<z);
{
if(x>y)
{
t=a;a=b;b=t;
}

if(x>z)
{
t=a;a=c;c=t;
}

if(y>z)
{
t=b;b=c;c=t;
}
}

printf("%c %c %c\n",a,b,c);
}
}

你看看这样的程序呢?试验一下,是你想要的结果,但是我没有使用while(XXX!=EOF),这个还没有想明白。本回答被提问者采纳
第2个回答  2019-02-15
这个问题是一类典型的问题:读取之前的回车符错误。
输入函数存在一个缓冲区,输入函数每次都会从输入缓冲区读数。同时,scanf()与getchar
()函数有一个相同的特点,就是输入完毕必须敲回车键才算完成输入。而getch(),getche()是
不需要回车键作为结束的。然而,只要输入缓冲区没有清空,所有字符包括回车都会记录在
输入缓冲区。如果没有将缓冲区清空,若下次调用scanf()与getchar()函数读取字符,则问
题就出现了,因为回车本身就是字符。
比如在这个程序中楼主会发现第一次输“qwe<回车>”,答案是“e
q
w”,但是第二次输
“ads<回车>”后,却出现了“<回车>
a
d”,却没有“s”,第三次输入“cxz<回车>”,则
更奇怪得出现了“<回车>
c
s”和“<回车>
x
z”。
因为根据你的输入依次是“qwe<回车>ads<回车>cxz<回车>”,输入缓冲区没有清空,每次读
三个,将<回车>也读入,对其进行排序难道不是这个结果吗?
要想改对,只要加一个fflush(stdin);清空输入缓冲区就解决了!
看程序:
#include<stdio.h>
int
main()
{
char
a,b,c,t;
int
x,y,z;
while(scanf("%c%c%c",&a,&b,&c)!=EOF)
{
fflush(stdin);
x=(int)a;
//楼主这有些语法错误,我已经改过来了
y=(int)b;
z=(int)c;
if(x>y)
{
t=a;
a=b;
b=t;
}
if(x>z)
{
t=a;
a=c;
c=t;
}
if(y>z)
{
t=b;
b=c;
c=t;
}
printf("%c
%c
%c\n",a,b,c);
}
return
0;
}
第3个回答  2008-02-01
/******************用这个试一下,你还得加看见回车就输入完毕*********/
#include<iostream.h>
#include<conio.h>
#include<string.h>

void swap(char x,char y,char z)
{char t;
while(x<y&&y<z&&x<z);
{
if(x>y)
{t=x;x=y;y=t;}
if(x>z)
{t=x;x=z;z=t;}
if(y>z)
{t=y;y=z;z=t;}
}
cout<<x<<" "<<y<<" "<<z<<" "<<endl;
}

void main()
{ char a[30];

for(int i=0;i<30;i++)
cin>>a[i];

int k=0;
for(int j=k;j<strlen(a)/3;j++)
{swap(a[j],a[j+1],a[j+2]);
k+=3;
}
}
第4个回答  2008-02-01
while(x<y&&y<z&&x<z);
{
if(x>y)
{t=a;a=b;b=t;}
if(x>z)
{t=a;a=c;c=t;}
if(y>z)
{t=b;b=c;c=t;}
}
这里改成这样试试:
while(1){
if(x>y){t=a;a=b;b=t};
if(x>z){t=a;a=c;c=t};
if(y>z){t=b;b=c;c=t};
break;
}
相似回答