信息奥赛一本通1185:单词排序(OJ题目描述有问题)

1185:单词排序

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 3474 通过数: 1685
【题目描述】
输入一行单词序列,相邻单词之间由1个或多个空格间隔,请按照字典序输出这些单词,要求重复的单词只输出一次。(区分大小写)

【输入】
一行单词序列,最少1个单词,最多100个单词,每个单词长度不超过50,单词之间用至少1个空格间隔。数据不含除字母、空格外的其他字符。

【输出】
按字典序输出这些单词,重复的单词只输出一次。

【输入样例】
She wants to go to Peking University to study Chinese
【输出样例】
Chinese
Peking
She
University
go
study
to
wants

这题表述有问题,题目说是一行单词序列,但是我编程序接收一行单词序列时,样例都能过,自己输入英文句子,也能过。提交时所有点都是“答案错误”(看我的程序一代码)。后来,问了别人,别人告诉我,是要接收多行单词,把程序改了一下,反复接收一行单词,并记录,就过了。(看我的程序二代码)
区别就是把getline(cin,danci)放在while循环中,反复接收单词序列,直到文件结束,停止接收(因为测试OJ是通过文件进行输入输出的)。

希望后面的人不要跟我一样被题目描述坑了哦。

程序一(所有点提示答案错误):

//1185:单词排序
#include
#include
#include
using namespace std;
char a[101][51];
int len,i,k=0,j;
string danci;

void paixu(char a[101][51],int start,int end) //自定义排序函数,对字二维符串数组排序
{
	char tmp[51];
	int i,j;
	for(i=end-1;i>=1;i--)
	{
		for(j=start;j<=i;j++)
		{
			if(strcmp(a[j],a[j+1])>0) //如果字典序逆序,则交换 
			{
				strcpy(tmp,a[j]); //将a[j]字符串复制到临时字符串tmp中 
				strcpy(a[j],a[j+1]);
				strcpy(a[j+1],tmp);
			}
		}
		
	}
	return;
 } 
int main()
{
	bool flag=false;//是否遇到一个新单词,false表示没有遇到,true表示遇到了 
	memset(a,0,sizeof(a));
	getline(cin,danci);//接收单词序列,碰到换行结束,可以接收空格 
	danci=" "+danci+" ";//在单词序列前后加空格
	len=danci.length();

	j=0;
	for(i=0;i

程序二(所有点通过):

//1185:单词排序
#include
#include
#include
using namespace std;
char a[101][51];
int len,i,k=0,j;
string danci;

void paixu(char a[101][51],int start,int end) //自定义排序函数,对字二维符串数组排序
{
	char tmp[51];
	int i,j;
	for(i=end-1;i>=1;i--)
	{
		for(j=start;j<=i;j++)
		{
			if(strcmp(a[j],a[j+1])>0) //如果字典序逆序,则交换 
			{
				strcpy(tmp,a[j]); //将a[j]字符串复制到临时字符串tmp中 
				strcpy(a[j],a[j+1]);
				strcpy(a[j+1],tmp);
			}
		}
		
	}
	return;
 } 
int main()
{
	bool flag=false;//是否遇到一个新单词,false表示没有遇到,true表示遇到了 
	memset(a,0,sizeof(a));
	while(getline(cin,danci))//反复接收单词序列(接收多行单词序列),碰到换行结束,可以接收空格 
	{
	danci=" "+danci+" ";//在单词序列前后加空格
	len=danci.length();
	j=0;
	for(i=0;i

你可能感兴趣的:(C++)