题目:从键盘输入5个英文人名(例如Alice、Schwarzenegger等),按人名长短(字符个数)输出(按从短到长的顺序)。然后再将这5个人名按字符串大小从小到大排序后输出。
文章目录
方法一:使用二维数组
思路:
- 题目要求存储5个名字,很容易想到用二维字符数组来存储
- 将二维数组看成一维数组,每个元素存放姓名
- 用strlen函数求姓名的长度
- 按照题目要求进行排序
1. 按照名字长度进行排序
代码实现
#include<stdio.h>
#include<string.h>
void sort_str_bylen(char name[][20], int n)
{
int i, j;
//使用冒泡排序法 从小到大排序
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
if (strlen(name[j]) > strlen(name[j + 1]))//看成一维数组,数组有5个元素,每个元素长度是strlen(name[j]) 比较的就是每个元素的长度
{
//如果前面元素长度大于后面元素 则交换前后两元素的内容
//内容是字符串 不能用通常的“=”进行交换 需要用strcpy函数
strcpy(str, name[j]);
strcpy(name[j], name[j + 1]);
strcpy(name[j + 1], str);
}
}
}
}
int main()
{
char name[5][20];
char str[20];
for (i = 0; i < 5; i++)
gets(name[i]); //输入
sort_str_bylen(name,5); //排序
for (i = 0; i < 5; i++)
puts(name[i]); //输出
return 0;
}
2. 按照名字大小排序
代码实现
#include<stdio.h>
#include<string.h>
void sort_str_bysz(char name[][20], int n)
{
int i, j;
//使用冒泡排序法 从小到大排序
for (i = 0; i < n-1; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
if (strcmp(name[j], name[j + 1])>0)//看成一维数组,数组有5个元素,比较的是每个元素的长度
{
//如果前面元素大小大于后面元素 则交换前后两元素的内容
//内容是字符串 不能用通常的“=”进行交换 需要用strcpy函数
strcpy(str, name[j]);
strcpy(name[j], name[j + 1]);
strcpy(name[j + 1], str);
}
}
}
}
int main()
{
char name[5][20];
char str[20];
for (i = 0; i < 5; i++)
gets(name[i]); //输入
sort_str_bysz(name,5); //排序
for (i = 0; i < 5; i++)
puts(name[i]); //输出
return 0;
总结:
将字符串进行排序时,有两种排序方式,一种是按长度排序,另一种是按大小排序,核心思路都是将二维数组一维化,使用一维数组的排序方法,不同的是以什么方式比较两者大小?按长度排序需要用strlen函数,按大小排序需要用strcmp函数,这也是qsort函数需要注意的,另外字符串交换需要用strcpy函数
方法二:使用结构体
思路:
- 定义一个结构体数组,结构体成员是char name[]和int len
-
先将结构体数组每个元素的len成员排序(拿冒泡排序说明)
-
将len对应的name成员进行匹配
3. 重复步骤2 N-1次(N个元素)
4. 从结构体一号开始输出直到结构体五号
按照名字长度进行排序
代码实现
#include<string.h>
#include<stdio.h>
typedef struct NAME //实现思路一
{
char name[20];
int len;
}N;
void sort_struct_bylen(N* ps, int n)
{
int i, j;
int temp;
char str[20];
for (i = 0; i < n - 1; i++) //重复n-1次
{
for (j = 0; j < n - 1 - i; j++)
{ //比较len的大小
if ((ps + j)->len < (ps + j + 1)->len)//冒泡排序法 比较组字符串的长度
{
//实现思路2 实现len从小到大排序
temp = (ps + j)->len;
(ps + j)->len = (ps + j + 1)->len;
(ps + j + 1)->len = temp;
//实现思路2 将name与len匹配
strcpy(str, (ps + j)->name);
strcpy((ps + j)->name, (ps + j + 1)->name);
strcpy((ps + j + 1)->name, str);
}
}
}
}
int main()
{
N Name[5];
int i = 0;
for (i = 0; i < 5; i++)
{
gets(Name[i].name);
Name[i].len = strlen(Name[i].name);
}
sort_struct_bylen(Name, 5);
for (i = 0; i < 5; i++)
puts(Name[i].name); //思路4
return 0;
}
按照名字大小排序
#include<string.h>
#include<stdio.h>
typedef struct NAME //实现思路一
{
char name[20];
int len;
}N;
void sort_struct_bysz(N* ps, int n)
{
int i, j;
char str[20];
for (i = 0; i < n - 1; i++) //重复n-1次
{
for (j = 0; j < n - 1 - i; j++)
{ //比较len的大小
if (strcmp((ps + j)->name, (ps + j + 1)->name) > 0)//冒泡排序法 比较组字符串的大小
{ //思路2 此时无需len,直接由字符串大小的比较结果来确定name成员改不改变位置
strcpy(str, (ps + j)->name);
strcpy((ps + j)->name, (ps + j + 1)->name);
strcpy((ps + j + 1)->name, str);
}
}
}
}
int main()
{
N Name[5];
int i = 0;
for (i = 0; i < 5; i++)
gets(Name[i].name);
sort_struct_bysz(Name, 5);
for (i = 0; i < 5; i++)
puts(Name[i].name);//思路4
}
总结
使用结构体进行排序时若按名字长度排序,则先要将长度成员排序
len成员每进行一次排序,name成员就要和len匹配
若按名字大小排序时 直接用strcmp函数比叫name成员 大的往后放就行 此时与len成员无关