Как отсортировать массив или структуру с помощью указателей (а не индекса массива) без qsort()?

Я пробовал void BubbleSort, но он тоже не работает. Знаете ли вы, как я могу отсортировать массив с помощью указателей и на основе значений mark_lab? Таким образом, первыми должны быть элементы, которые имеют наибольшее значение mark_lab.

Обычно я получаю ошибку в операторе if из 1-го for(), однако, кажется, он написан правильно.

#include <stdlib.h>
#include <string.h>

    struct student{
    char name [20];
    char surname [20];
    char id_num [10]; 
    int mark_lab;
    int mark_test;
    };
int main(){
    int i;

    struct student st[] = {
        {"AA", "Pu", "1C666", 8, 9},
        {"RR",  "Ab","4DC33",5,7},
        {"AA", "Z","24C25", 10, 6},
        {"KK", "Oz","161RD", 9,10},
        {"EE", "Pre", "DC902", 7,8}
    }; 

  //to sort the array
   for (i=0;i<4;i++){ 
        if (stu[3]->mark_lab<stu[i]->mark_lab){
            stu[3]->name=stu[i]->name;
            stu[3]->surname=stu[i]->surname;
            stu[3]->id_num=stu[i]->surname;
            stu[3]->mark_lab=stu[i]->mark_lab;
            stu[3]->mark_test=stu[i]->mark_lab;
            
            stu[i]->name=stu[i+1]->name;
            stu[i]->surname=stu[i+1]->surname;
            stu[i]->id_num=stu[i+1]->surname;
            stu[i]->mark_lab=stu[i+1]->mark_lab;
            stu[i]->mark_test=stu[i+1]->mark_lab;
            
            stu[i+1]->name=stu[3]->name;
            stu[i+1]->surname=stu[3]->surname;
            stu[i+1]->id_num=stu[3]->surname;
            stu[i+1]->mark_lab=stu[3]->mark_lab;
            stu[i+1]->mark_test=stu[3]->mark_lab;
        }
    }
    
    //to print it on the screen
    for (i=0;i<4;i++){
        printf (printf("\nName: %s, Surname: %s, ID: %s, Lab_Mark: %d, Test Mark: %d",
         stu[i]->name, stu[i]->surname,stu[i]->id_num, stu[i]->mark_lab,stu[i]->mark_test);
    }

    return 0;
}

После того, как вы исправите сортировку, эта часть будет неправильной: printf (printf(" может быть, это опечатка??

drescherjm 14.12.2020 17:56

Это должно помочь с алгоритмом пузырьковой сортировки: https://www.softwaretestinghelp.com/bubble-sort/

drescherjm 14.12.2020 17:58

Я бы склонялся к std::sort и функции сравнения. Но я также думаю, что тег С++ не подходит к этому вопросу.

sweenish 14.12.2020 18:12
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
3
139
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь много чего происходит, поэтому давайте разберемся, что не так и что делать, не давая вам ответов напрямую. «Самое простое» решение — это то, что предлагает sweenish, используя std::sort и функцию сравнения, но если вам нужно реализовать сортировку самостоятельно, вот грубая разбивка шагов, которые вам нужно предпринять, не предоставляя вам всю реализацию.


Разные баги

  • Ваш массив называется «stu», но вы пытаетесь получить к нему доступ с именем «st». Ваш компилятор должен был немедленно предупредить вас (если вы вообще пытались это скомпилировать) об этой проблеме.
  • Вы пытаетесь получить доступ к элементам ученика, разыменовав структуру с помощью '->'. В вашем массиве хранятся студенты, а не выделенные в куче студенты *, поэтому вам нужно получить доступ с помощью '.' оператор, или malloc каждого студента в массиве.
  • drescherjm также указал на ваш printf(printf(ошибка
  • Лично я предпочитаю 'типизировать' свои структуры, но вам не обязательно этого делать.

Обмен

Во-первых, функция подкачки значительно облегчит вам жизнь. Мы можем просто поменять местами, используя массив и индексы двух элементов. Самый простой способ — использовать временную переменную, хотя вы также можете использовать замену XOR (что имеет свои особенности). Помните, что при использовании функции для изменения массива нам нужно передать массив по ссылке, так как массив хранится во фрейме стека функции main(), и мы хотим, чтобы изменения в наших функциях сохранялись, поэтому мы должны передать массив по ссылке ссылка. Подробнее об этом читайте здесь. Ваша функция подкачки должна выглядеть примерно так.

void swap(struct *students[], int idx_a, int idx_b) {
    struct student temp = *students[idx_a];
    *students[idx_a] = *students[idx_b];
    *students[idx_b] = temp;
}

Я заметил, что вы также устанавливаете struct id_num для фамилий. Если это то, что вы действительно должны делать, вам также нужно будет учитывать это в этой функции подкачки.


Сортировка

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

for (i = 0; i < 4; i++) {
    for ( j = 0; j < 4 - i - 1; j++) {
        if (st[j].mark_lab < st[j+1].mark_lab)
           swap(&st, j, j+1);
    }
}

Это должно помочь вам пройти большую часть пути. В будущем я настоятельно рекомендую скомпилировать этот код, прежде чем пытаться отлаживать или переходить к stackoverflow, поскольку компиляторы намного умнее нас с вами и дадут вам описательные объяснения многих ошибок, с которыми вы сталкиваетесь. Попробуйте скомпилировать с помощью «gcc -o [executable_name] [your_program.c]». Когда вы исправите свои ошибки времени компиляции, вы можете запустить с ./[executable_name], чтобы попытаться диагностировать любые ошибки времени выполнения, которые у вас могут быть.

В целом, я бы рекомендовал укрепить ваше понимание синтаксиса C и основ работы указателей и структур. Когда вы обнаружите, что пишете много строк избыточного кода, например большую часть тела вашего цикла for, прекратите писать код. Переоцените, что именно вы пытаетесь сделать, и попытайтесь найти более чистый способ сделать это.

Я пытаюсь использовать метод подкачки, но у меня возникает ошибка. Я отредактировал первую строку, написав struct student *stu, но в следующей строке все еще есть ошибка. Не могли бы вы помочь? Я думаю, что у меня синтаксическая ошибка, которую я не могу понять

Eli 21.12.2020 22:07

Другие вопросы по теме