只是一个免责声明:在C编程方面,我是一个完整的菜鸟,这可能很容易让人感到尴尬,但我自己也没想到,也没有找到任何有用的东西。无论如何,下面这个程序应该把名字(最后,第一)和年龄放入数组,然后按字母顺序排列。我遇到的问题是创建一种并行数组,以便按字母顺序排序后将年龄与各自的名称相匹配。有没有人有什么建议?我想某种方式将年龄数组绑定到我定义的函数中,但我仍然无法绕过它。提前谢谢!
#include <stdio.h>
#include <string.h>
#define NAME_LENGTH 50
#define MAX_NAMES 50
int alpha_first(char *list[], int min_sub, int max_sub);
void select_sort_str(char *list[], int n);
int
main(void)
{
int i = 0;
int numpeople;
char names[MAX_NAMES][NAME_LENGTH] = { 0 };
char ages[MAX_NAMES][NAME_LENGTH] = { 0 };
char skip_line;
char *alpha[MAX_NAMES] = { 0 };
printf("Enter number of people <0..50>\n> ");
scanf("%d", &numpeople);
do
{
scanf("%c", &skip_line);
}
while (skip_line != '\n');
for(i = 0; i < numpeople; ++i)
{
printf("Enter name %d (lastname, firstname) ", i+1);
gets(names[i]);
printf("Enter age %d: ", i+1);
gets(ages[i]);
}
for(i = 0; i < numpeople; ++i)
{
alpha[i] = names[i];
select_sort_str(alpha, numpeople);
}
printf("\n\n%-30s\n\n", "Original List");
for (i = 0; i < numpeople; ++i)
printf("%-30s\n", names[i]);
printf("\n\n%-30s\n\n", "Alphabetical Order");
for (i = 0; i < numpeople; ++i)
printf("%-30s\n", alpha[i]);
return 0;
}
int
alpha_first(char *list[],
int min_sub, int max_sub)
{
int first, i;
first = min_sub;
for (i = min_sub + 1; i <= max_sub; ++i)
if (strcmp(list[i], list[first]) < 0)
first = i;
return (first);
}
void
select_sort_str(char *list[], int n)
{
int fill, index_of_min;
char *temp;
for (fill=0; fill<n-1; ++fill)
{
index_of_min = alpha_first(list, fill, n - 1);
if (index_of_min != fill)
{
temp = list[index_of_min];
list[index_of_min] = list[fill];
list[fill] = temp;
}
}
}
答案 0 :(得分:3)
使用结构:
typedef struct
{
char *first_name;
char *last_name;
int age;
} person;
创建数组时,创建一个person
的数组;创建一个新的person
,填写其字段,将其添加到您的数组中。现在,您可以在一个漂亮的小包装中获得所需的所有数据。
答案 1 :(得分:0)
计算机科学中的大多数问题都是通过引入额外的间接层来解决的。
在这种情况下,请注意select_sort_str()
正在排序指向字符串的指针数组。假设您构造一个索引值数组,初始化为0
.. numpeople-1
,然后将这些索引排序为相应名称的顺序。因此,在alpha_first()
中,以及char* list[]
,我们也需要int index[]
,然后进行比较:
if (strcmp(list[index[i]], list[index[first]]) < 0)
,类似select_sort_str()
,您不会在list[]
中交换index[]
中的条目。然后以alpha顺序读取条目,使用额外的间接级别:
names[index[i]]