Я пробовал 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;
}
Это должно помочь с алгоритмом пузырьковой сортировки: https://www.softwaretestinghelp.com/bubble-sort/
Я бы склонялся к std::sort
и функции сравнения. Но я также думаю, что тег С++ не подходит к этому вопросу.
Здесь много чего происходит, поэтому давайте разберемся, что не так и что делать, не давая вам ответов напрямую. «Самое простое» решение — это то, что предлагает sweenish, используя std::sort и функцию сравнения, но если вам нужно реализовать сортировку самостоятельно, вот грубая разбивка шагов, которые вам нужно предпринять, не предоставляя вам всю реализацию.
Разные баги
Обмен
Во-первых, функция подкачки значительно облегчит вам жизнь. Мы можем просто поменять местами, используя массив и индексы двух элементов. Самый простой способ — использовать временную переменную, хотя вы также можете использовать замену 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, но в следующей строке все еще есть ошибка. Не могли бы вы помочь? Я думаю, что у меня синтаксическая ошибка, которую я не могу понять
После того, как вы исправите сортировку, эта часть будет неправильной:
printf (printf("
может быть, это опечатка??