【字符串】PTA试题——英文单词排序 (25分)
题干如下:
本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。
输入格式:
输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。
输出格式:
输出为排序后的结果,每个单词后面都额外输出一个空格。
输入样例:
blue
red
yellow
green
purple #
输出样例:
red blue green yellow purple
.
.
.
本题需要解决以下几个问题:
**①如何一直输入字符串直到输入#为止:**使用死循环while(1),后满足一定条件便跳出循环(break语句)的方法。此题的条件显然是if(str[i][0]==’#’)。
**②如何对字符串进行排序:**对于初学者来说,首先学习的排序是“冒泡排序”,那如何对字符串进行基于长度的“冒泡排序”呢?这里,我们需要使用strlen函数和strcpy函数:(这两个函数均在头文件<string.h>中)
(1)strlen函数:统计字符串的长度。统计空格,不统计末位’\0’。
(2)strcpy函数:即复制函数。strcpy(a,b)的作用可以简单理解为将b中的字符串复制到a中(注意:b字符串的末位’\0’也会被复制,也就是说a完全变成了b)。
由于是对字符数组的复制,函数需要传递指针,则括号内只需要写数组名(首元素地址)就可以了。
**以前我们学过数字大小的冒泡排序,其中交换两数的部分通过temp暂存变量配合来实现。现在对字符串进行交换也是如此。
(temp是另外创建的一维字符数组)
if (strlen(str[k-1])>strlen(str[k]))
{
strcpy(temp,str[k]);
strcpy(str[k],str[k-1]);
strcpy(str[k-1],temp);
}
解决了上述问题,我们就可以写程序了:
#include<stdio.h>
#include<string.h>
int main(void)
{
char str[20][11];
int i=0;
while (1)
{
scanf("%s",str[i]);
if (str[i][0]=='#')
break;
i++; //i同时也记录了有几个单词
}
int len=i; //用len记录i,增加程序的可读性
int j,k;
char temp[11];
for (j=0; j<=len-1; j++) //对字符串进行冒泡排序
{
for (k=0; k<len-j; k++)
{
if (strlen(str[k-1])>strlen(str[k]))
{
strcpy(temp,str[k]);
strcpy(str[k],str[k-1]);
strcpy(str[k-1],temp);
}
}
}
for (j=0; j<=len-1; j++)
{
printf("%s ",str[j]);
}
return 0;
}
更多推荐
所有评论(0)