【发布时间】:2021-01-26 20:04:41
【问题描述】:
我正在学习 C 编程并正在完成一项学校作业。询问老师或同龄人的可能性有限(由于电晕爆发和在家中的距离),我正在与您联系。非常感谢您的帮助。
我的挑战:编写一个程序,使用不同的函数对 11 个文本字符串按长度和字母顺序进行排序。告诉用户程序的限制是什么。
Desired output, for instance:
bc
bcb
bcebc
cbbcac
dbccac
(...)
首先,用户必须输入 11 个文本字符串。我已经用以下代码解决了这个问题:
#include <stdio.h>
#include <string.h>
#define NUMBER_OF_STRINGS 11
int main (void)
char textstrings[NUMBER_OF_STRINGS][15];
int i;
(...)
printf("Enter 11 textstrings, one by one:\n");
for(i=0;i<NUMBER_OF_STRINGS-1;i++)
{
printf("Enter string %d: ", i + 1);
gets(textstrings[i]);
}
现在我们在“textstrings[i]”中得到了我们的字符串,它们必须被排序和打印。我认为最好看的方法是为每个排序条件设置单独的函数。例如。 “长度”的单独函数,然后是“字母顺序”的另一个函数。我知道我应该使用“strlen”来比较长度,使用“strcmp”来比较字母顺序。
我也明白,按多个条件排序的策略是为每个返回比较函数的适当返回类型的条件编写比较表达式,并按照所需的排序顺序对它们进行评估,例如第一个长度,然后是字母。
这就是我迷路的地方......
但是,我确实理解按长度排序的逻辑可能如下所示:
char* temp;
int step
int length=20; //Not allowing text longer than 20 characters.
for(step=0;step<length-1;step++)
for(i=0;i<length-step-1;i++)
{
if(strlen(textstrings[i])>strlen(textstrings[i+1]))
{
temp=textstrings[i];
textstrings[i]=textstrings[i+1];
textstrings[i+1]=temp;
}
而且我也知道按字母顺序排序可能是这样的:
int k, m
for(k=0;k<=NUMBER_OF_STRINGS-1;k++)
{
for(m=k+1;m<=NUMBER_OF_STRINGS-1;m++)
if(strmcp(textstrings[k], textstrings[m])>0)
swap(textstrings[k], textstrings[m]);
}
where a swap function would look like:
void swap (char *s1, char *s2)
{
char tmp[20];
strcopy(temp,s1);
strcopy(s1,s2);
strcopy(s2,temp);
}
但是,我不知道如何编写比较表达式,也不明白可以在主函数中保留哪些代码,以及哪些单独的函数是合适的。一个理想的答案将包括一个示例代码来展示如何解决这个任务,因为我不仅仅是迷路了!
谢谢!
【问题讨论】:
-
您正在尝试的称为“冒泡排序”,是最慢和最简单的排序方式。如果您搜索冒泡排序 C 代码,您应该会找到大量示例。
-
永远不要使用
gets()。请改用fgets()。对于排序,我推荐使用qsort()。
标签: arrays c sorting string-length alphabetical-sort