Отсортировать структуру по одному из полей - C (СИ) (69570)
Формулировка задачи:
Не получается сделать сортировку, уже много чего перепробовал, помогите пожалуйста
#define _CRT_SECURE_NO_WARNINGS #include <sys/stat.h> #include <memory.h> #include <fcntl.h> #include <io.h> #include <stdio.h> #include <string.h> #include <conio.h> #include <windows.h> #include <locale.h> struct uchs { char klass[20]; int year; char name[20]; int str; char rasp[150]; }; int main() { int i; int s; struct uchs arr[100]; //100 ГґГ*ìèëèé Г¬Г*êñèìóì int count_uch = 0; //Г±Г·ГҐГІГ·ГЁГЄ ГґГ*ìèëèé int d = 8; //int j, k; int a = 0; int fh = _open("file.dat", _O_RDWR | _O_BINARY); //ïðîâåðÿåì, Г±ГіГ№ГҐГ±ГІГўГіГҐГІ ëè ГґГ*éë if (fh == -1) { //åñëè Г*ГҐ Г±ГіГ№ГҐГ±ГІГўГіГҐГІ, ñîçäГ*ГҐГ¬ fh = _creat("file.dat", _S_IREAD | _S_IWRITE); if (fh == -1) return 1; } //ïîêГ* Г*ГҐ ГЄГ®Г*ГҐГ¶ ГґГ*éëГ* ñ÷èòûâГ*ГҐГ¬ ГЁГ*ГґГі Гў Г¬Г*Г±Г±ГЁГў ñòðóêòóð while (!_eof(fh)) { _read(fh, &arr[count_uch], sizeof arr[count_uch]); count_uch++; //óâåëè÷èâГ*ГҐГ¬ Г°Г*çìåðГ*îñòü Г¬Г*Г±Г±ГЁГўГ* Г*Г* 1 Г± ГЄГ*æäûì Г±Г·ГЁГІГ*Г*Г*ûì ýëåìåГ*òîì } do { setlocale(LC_ALL, "Rus"); system("cls"); //î÷èñòêГ* ГЅГЄГ°Г*Г*Г* printf("1: ÄîáГ*ГўГЁГІГј Г§Г*ГЇГЁГ±Гј\n2: Âûâåñòè ГЁГ*ôîðìГ*öèþ Г® ГўГ±ГҐГµ ГіГ·ГҐГ*ГЁГЄГ*Гµ\n 3: îòñîðòèðîâГ*ГІГј:\n0: Г‡Г*êðûòü ïðîãðГ*ììó\nÂûáåðèòå ГЇГіГ*ГЄГІ: "); scanf("%d", &d); switch (d) //ìåГ*Гѕ { case 1: { setlocale(LC_ALL, "Rus"); //äîáГ*âëåГ*ГЁГҐ Г*îâîé Г§Г*ГЇГЁГ±ГЁ printf("Ââåäèòå èìÿ/ГґГ*ìèëèþ: "); fflush(stdin); gets(arr[count_uch].name); printf("Ââåäèòå ГЄГ«Г*Г±Г± ГіГ·ГҐГ*ГЁГЄГ*: "); fflush(stdin); gets(arr[count_uch].klass); printf("Ââåäèòå ñêîëüêî ëåò ГіГ·ГҐГ*ГЁГЄГі: "); fflush(stdin); scanf("%d", &arr[count_uch].year); printf("Ââåäèòå ñêîëüêî äåГ*ГҐГЈ Г*Г* ГЄГ*ðòî÷êå Гі ГіГ·ГҐГ*ГЁГЄГ*: "); fflush(stdin); scanf("%d", &arr[count_uch].str); printf("Ââåäèòå Г°Г*Г±Г±ГЇГЁГ±Г*Г*ГЁГҐ ГіГ·ГҐГ*ГЁГЄГ*: "); fflush(stdin); gets(arr[count_uch].rasp); count_uch++; break; } case 2: {setlocale(LC_ALL, "Rus"); for (i = 0; i<count_uch; i++) { printf("\%s \n%s \n%d \n%d\n%s\n", arr[i].name, arr[i].klass, arr[i].year, arr[i].str, arr[i].rasp); } _getch(); break; } case 3: { printf("Ñïèñîê îòñîðòèðîâГ*Г*!"); for (int i = 0; i < sizeof (arr[count_uch].year); i++) { for (int j = 0; j < sizeof (arr[count_uch].year); j++) { if (arr[i].year > arr[j].year) { uchs s_arr = arr[count_uch]; arr[i] = arr[j]; arr[j] = s_arr; } } } _getch(); break; } } } while (d != 0); return 0; }
Решение задачи: «Отсортировать структуру по одному из полей»
textual
Листинг программы
case 7: { printf("Список отсортирован!"); for (int i = 0; i < count_uch - 1; i++) { for (int j = 0; j < count_uch - 1 - i; j++) { if (arr[i] > arr[j]) { uchs s_arr = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = s_arr; } } } _getch(); break; }
Объяснение кода листинга программы
Код выполняет сортировку массива структур uchs
по одному из полей. Структура uchs
содержит поля id
и name
.
- В случае 7, код выводит сообщение
Список отсортирован!
. - Затем, в цикле, код проходит по всем элементам массива, начиная с 0 и до count_uch - 1.
- В каждой итерации внутреннего цикла, код сравнивает текущий элемент с каждым последующим элементом и, если текущий элемент больше следующего, меняет их местами.
- Код продолжает проходить по всем элементам массива до тех пор, пока не будет выполнено условие завершения цикла.
- После завершения цикла, код ожидает нажатия клавиши для продолжения работы программы.
- Если условие сортировки не выполнено, код продолжает выполнение до тех пор, пока не будет выполнено условие сортировки.
- После завершения цикла, код завершает работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д