我需要做的是读取N(下一个输入的数量),然后它将遵循以下模式:(名称)(年龄)(身高)我需要做的是打印2个列表。一个是新月的新月顺序,通过打印名称,然后按高度。一个例子是:
2
Carol, 33 1.85
Peter, 21 1.92
输出:
By age: Peter, Carol
By hight: Carol, Peter
现在,我不担心输出的确切格式或复制相同的顺序“功能”,我只是想让第一个工作,所以我可以只为copypaste的高度。我也不是真的担心优化,我只是想把重点放在我在这里做错了什么。 这是我到目前为止所得到的:
int main(int argc, char **argv){
char nomes[30][50], age_ord[30][50], alt_ord[30][50], aux[50];
int idade[30], n, i, j=1, aux2;
double altura[30];
scanf ("%d", &n);
for(i=0; i<n; i++){
scanf("%s %d %lf", nomes[i], &idade[i], &altura[i]);
}
for(i=0;i<n; i++){
strcpy(age_ord[i], nomes[i]);
strcpy(alt_ord[i], nomes[i]);
}
for(i=0; i<n; i++){ // ordenador de idade
j=1;
for(;i+j<=n;j++){
if(idade[i] > idade[i+j]){
strcpy(aux, nomes[i+j]);
strcpy(nomes[i+j], age_ord[i]);
strcpy(age_ord[i], aux);
aux2 = idade[i];
idade[i] = idade[i+j];
idade[i+j] = aux2;
}
}
}
printf("Por idade: ");
for(i=0; i<n; i++){
printf("%s, ", age_ord[i]);
}
return 0;
}
答案 0 :(得分:0)
嗨,我认为您的排序算法存在问题。
Pls Try this segment code:
for(i=0; i<n; i++){ // ordenador de idade
j=1;
for(;i+j<n;j++){
答案 1 :(得分:0)
我发现在这些情况下最好的做法就是代码。我已经扩充了您的数据,以更好地强调排序代码,并删除了逗号:
3
Carol 33 1.85
Peter 21 1.92
Claude 29 1.89
首先,在排序过程中,您不需要复制字符串。你可以随机播放指针或索引 - 下面我使用索引。我只是为了年龄而改写它 - 我会让你的副本&amp;按照你的建议粘贴高度:
#include <stdio.h>
int main(int argc, char **argv) {
char nomes[30][50];
int idade[30];
double altura[30];
int n, aux, age_ord[30], alt_ord[30];
// read N (the number of next inputs)
scanf("%d", &n);
// then it will follow the pattern: (name) (age) (height)
for (int i = 0; i < n; i++) {
scanf("%s %d %lf", nomes[i], &idade[i], &altura[i]);
age_ord[i] = alt_ord[i] = i; // initialize unsorted
}
for (int i = 1; i < n; i++) {
for (int j = 0; j < n - 1; j++) {
if (idade[age_ord[j]] > idade[age_ord[j + 1]]) {
aux = age_ord[j];
age_ord[j] = age_ord[j + 1];
age_ord[j + 1] = aux;
}
}
}
printf("Por idade: ");
for (int i = 0; i < n; i++) {
printf("%s ", nomes[age_ord[i]]);
}
printf("\n");
return 0;
}
一旦我们获得了排序的索引数组,为了获得输出,我们只需使用这些排序的索引来访问名称数组。此代码输出:
Por idade: Peter Claude Carol
你可以使用相同的嵌套循环来进行高度排序,你不需要复制它,只需在年龄之后添加if
高度语句。