Сортировка массива структур по полю - C (СИ)
Формулировка задачи:
Здравствуйте!
Условие:
Нужно отсортировать массив структур по одному полю (по "фамилия автора"). Использую сортировку пузырьком. Не могу придумать, как поменять местами номера элементов в структуре (library[j] и library[j+1])... Вылазят следующие ошибки:
Пример моей реализации (с ошибками):
Учусь на первом курсе и работаю в Visual C++ 6.0, строго не судите.
Заранее большое спасибо!
Для книг, хранящихся в библиотеке, задаются регистрационный номер книги, автор, название, год издания, издательство, количество страниц. Вывести список книг с фамилиями авторов в алфавитном порядке, изданных после заданного года.
error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'struct main::strc' (or there is no acceptable conversion)
error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'struct main::strc *' (or there is no acceptable conversion)
fatal error C1004: unexpected end of file found
Error executing cl.exe.
#include <iostream.h>
#include <string.h>
int main() {
int i,j,n;
struct strc { // Создаем структуру с требуемыми полями
int number;
char author[100];
char title[100];
int year;
char publisher[100];
int pages;
};
cout << "Enter the number of books: "; cin >> n; // Вводим требуемый размер
cout << endl;
strc *library = new strc[n]; // Динамически создаем массив структур
strc *tmp = new strc[0]; // Временная структура (причина ошибки?)
for(i=0;i<n;i++) { // Заполняем массив структур
cout << "Book number " << i+1 << endl;
cout << "Registration number: "; cin >> library[i].number;
cout << "Author: "; cin >> library[i].author;
cout << "Title: "; cin >> library[i].title;
cout << "Year: "; cin >> library[i].year;
cout << "Publisher: "; cin >> library[i].publisher;
cout << "Pages: "; cin >> library[i].pages;
cout << endl;
}
for(i=0;i<n-1;i++) { // Сортировка массива структур по строке с именем автора
for(j=0;j<n-1;j++) {
if (strcmp(library[j+1].author,library[j].author) > 0) {
tmp = library[j+1]; // Тут ошибка
library[j+1] = library[j];
library[j] = tmp; // И тут ошибка
}
/* Тут будет вывод */
delete []library;
return 0;
}Решение задачи: «Сортировка массива структур по полю»
textual
Листинг программы
{tmp = library[i];
library[i] = library[j];
library[j] = tmp;
}
Объяснение кода листинга программы
В представленном коде выполняется сортировка массива структур по полю. Однако, для полноценного понимания необходимо знать контекст, в котором используется данный код. Список действий:
- Создается временная переменная
tmpтипа, соответствующего типу элементов массиваlibrary. - В
tmpзаписывается значение элемента массиваlibraryс индексомi. - Значение элемента массива
libraryс индексомiзаменяется на значение элемента массиваlibraryс индексомj. - Значение элемента массива
libraryс индексомjзаменяется на значение временной переменнойtmp. Таким образом, происходит перестановка элементов массиваlibraryтаким образом, что элемент с нужным значением поля перемещается на нужную позицию в массиве. Поскольку код представлен без контекста, точные значения переменныхi,jиtmpнеизвестны. Также неизвестно, какая именно структура сортируется и по какому полю происходит сортировка.