订购(语言C)

时间:2017-09-22 00:13:19

标签: c

我正在尝试从用户将要输入的数字(代码)中对结构进行排序,并且我正在使用冒泡排序。我希望程序打印按数字(代码)排序的所有数据,但它只对数字(代码)进行排序。有人可以帮我从数字(代码)中排序其他元素吗?

CODE:

#include locale.h  
#include stdio.h  
#include string.h  

int main(void) {  
    setlocale(LC_ALL, "Portuguese");  
    int aux = 0, i, j;  
    struct dados {  
        int codigo;  
        char titulo[40];  
    } livro[10];

    for (i = 0; i < 10; i++) {  
        printf("Código %d: ", i);
        scanf("%d", &livro[i].codigo);  
        fflush(stdin);  
        printf("Título %d: ", i);
        gets(livro[i].titulo);  
    }  
    for (i = 0; i < 10; i++) {  
        for (j = i + 1; j < 10; j++) {  
            if (livro[i].codigo > livro[j].codigo) {  
                aux = livro[i].codigo;  
                livro[i].codigo = livro[j].codigo;  
                livro[j].codigo = aux;  
            }  
        }  
    }  
    for (i = 0; i < 10; i++) {  
        printf("%d %s\n", livro[i].codigo, livro[i].titulo);  
    }  
}  

2 个答案:

答案 0 :(得分:2)

您的代码中存在多个问题:

  • #include行中存在语法错误。
  • 读取循环不正确:您没有检查scanf()的返回值,您使用过时的函数gets(),该函数只读取输入中scanf()留下的待处理换行符流。读入数组的数据不正确,行为可能未定义。
  • fflush(stdin);有未定义的行为。
  • 在排序循环中,您只交换codigo字段的值,而不是数组元素。您正在破坏数据。你应该交换结构。

以下是修改后的版本:

#include <locale.h>
#include <stdio.h>
#include <string.h> 

int main(void) {  
    setlocale(LC_ALL, "Portuguese");  // probably incorrect?
    int i, j;  
    struct dados {  
        int codigo;  
        char titulo[40];  
    } livro[10];

    for (i = 0; i < 10; i++) {  
        printf("Código %d: ", i);
        if (scanf("%d", &livro[i].codigo) != 1)
            return 1;
        printf("Título %d: ", i);
        if (scanf(" %39[^\n]", livro[i].titulo) != 1)
            return 1;
    }  
    for (i = 0; i < 10; i++) {  
        for (j = i + 1; j < 10; j++) {  
            if (livro[i].codigo > livro[j].codigo) {  
                struct dados aux = livro[i];  
                livro[i] = livro[j];  
                livro[j] = aux;  
            }  
        }  
    }  
    for (i = 0; i < 10; i++) {  
        printf("%d %s\n", livro[i].codigo, livro[i].titulo);  
    }
    return 0; 
}  

答案 1 :(得分:1)

你应该交换整个结构,而不仅仅是它的第一个成员:

for(unsigned i = 0; i < n_livros; i++)  
{  
    for(unsigned j = i + 1; j < n_livros; j++)  
    {  
        if(livro[i].codigo > livro[j].codigo)  
        {  
            struct dados aux = livro[i];  
            livro[i] = livro[j];  
            livro[j] = aux;  
        }  
    }  
}  

正如奥拉夫评论的那样,flush(stdin);是未定义的行为,只是不这样做 另请注意,gets()首先在C99中弃用,然后从C11中删除。您应该使用执行边界检查的函数,例如fgets()并始终检查其(和scanf())的返回值。