Используя ведро сортировки рейтингов учащихся на основе их знаков


Проблема:

Н учащиеся имеют знаки и имена. Студенты ранга на основе их маркировки и печати их имена.


#include <stdio.h>
#include <assert.h>

struct student
{
    int marks;
    char name[50];
};

struct listnode
{
    struct student * data;
    struct listnode *next;
};

addtofrontoflist(struct listnode *listhead,struct student *node)
{
    //make a block of listnode.
    struct listnode bucketnode;
    bucketnode.data=node;

    struct listnode *tmp;
    tmp=listhead->next;
    listhead->next=&bucketnode;
    bucketnode.next=tmp;
}

bucket_sort(struct student array[],int n)
{
    struct listnode *buckets[n]; 
    int i,j;
    struct listnode *temp;
    for(i=0;i<n;i++)
    {
            buckets[i]=malloc(sizeof(struct listnode));
            assert(buckets[i]!=NULL);
    }

    for(i=0;i<n;i++)
    {
            addtofrontoflist(buckets[array[i].marks],&array[i]);
    }

    for(i=0;i<n;i++)
    {
            if(buckets[i]==NULL) continue;
            for(temp=buckets[i];temp!=NULL;temp++)
            printf("%d %s\n",temp->data->marks,temp->data->name);
    }
}

main()
{
    struct student array[5]={"1,one","2,two","2,two","4,four","1,one"};
    bucket_sort(array,5);
}


1377
8
задан 30 мая 2011 в 11:05 Источник Поделиться
Комментарии
2 ответа


  • Поскольку ваши функции имеют явные типы возвращаемых значений (и, наверняка, вы уже составили этот), вы должны быть реализации этого под старый стандарт C, что позволило неявные типы возвращаемых значений.

    Несмотря на это, я бы рекомендовал добавить явные типы возвращаемых значений для функций:


    • в Main() должна возвращать тип int , так как она должна возвращать целочисленное значение на основе программы выполнения решений (либо 0 при успехе или 1 ошибка). Однако, если он будет всегда выполнять успешно, то можно опустить возвращает 0 в конце.

    • Другие функции должны возвращать недействительными , так как они не возвращая ничего.


  • Вы можете typedef для вашей структурыS, чтобы избежать необходимости вводить структуру в другом месте.

  • Ты непоследовательно используя snake_case имен и все-строчные. Последнее не очень четкий, как составные слова должны быть разделены. Поскольку вы уже используете snake_case, просто использовать, что для всех переменных и имен здесь функции.

  • знаки , наверное, должен быть знак , что это всего лишь одной переменной. Но если студент должен иметь больше, чем один, то следы должно быть массивом. Кроме того, должны быть целочисленного типа, или может ли студент иметь десятичное значение в качестве знака? Это, конечно, будет зависеть от того, как вы хотите реализовать эту систему оценок.

  • Переменная J не заявил, в bucket_sort() не используется, поэтому она должна быть удалена. Вы должны иметь ваши предупреждения компилятора высоко, так что вы будете знать, когда это происходит.

  • Вы должны добавить пробел между операторами для удобства чтения. Ведение линий короче, не было бы столько пользы, как вы должны попробовать, чтобы не так много кода на одну строку.

    Например, один из ваших для петель:


    for(i=0;i<n;i++)

    будет выглядеть так:

    for (i = 0; i < n; i++)

    И Ваш массив:


    struct student array[5]={"1,one","2,two","2,two","4,four","1,one"};

    должны были его отдельные элементы:

    struct student array[5] = { "1,one", "2,two", "2,two", "4,four", "1,one" };

  • Я рекомендую иметь макрос на число учащихся:

    #define NUM_STUDENTS 5

    Вы можете использовать этот макрос для размер массива и все остальное, и в случае, если вы когда-нибудь понадобится, чтобы изменить это число, это будет сделано в одном месте.

    Кроме того, bucket_sort() больше не нужно брать размер.

    student array[NUM_STUDENTS] = { "1,one","2,two","2,two","4,four","1,one" };
    bucket_sort(array);

11
ответ дан 10 апреля 2014 в 04:04 Источник Поделиться

Во-первых, убедитесь, что код компилируется. Вы должны включить stdlib.ч для Танос. В зависимости от того, какой компилятор и библиотеки вы используете, это может все еще работать на вашей системе, но всегда содержат правильные заголовки для API вы используете.

После инициализации студенческого массива в основном неправильно. Ваш компилятор должен был вам тоже предупреждение об этом. Если нет, накачивать уровень предупреждений! Вы, вероятно, хотите вместо этого:

struct student array[5] = {{1, "one"}, {2, "two"}, {2, "two"}, {4, "four"}, {1, "one"}};

Также убедитесь, что вы указываете тип возвращаемого каждой функцией. Если вам не возвращают значения, сделать возвращаемый тип пустоту. Если вы не укажите функцию, которая по умолчанию возвращает тип int, и компилятор должен предупреждать о том, что вы выходите, не возвращая значение. (Обратите внимание на предупреждения!)

Другое дело с функциями, попробуйте назвать их должным образом, и убедитесь, что они делают то, что имя функции говорит. Ваша функция bucket_sort не делает то, что рекламируется. Он сначала преобразует массив студентов ведра, потом пытается отсортировать его, а затем печатает результат. Имя как print_students_sorted_by_mark() , вероятно, будет лучше. А еще лучше, вы могли бы хотеть разделить это на три функции.

Сортировка также выглядит сломанной, но я не смотрел внимательно на то, что сейчас.

В целом вы можете уделять больше внимания именования. Вы используете оба listnode и bucketnode/ведро для обозначения то же самое. Очистка именования и учета его в соответствие будет много значить для других читать ваш код, особенно в больших проектах.

4
ответ дан 25 июля 2011 в 06:07 Источник Поделиться