Отсортировать структуру по одному из полей - 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.
- В каждой итерации внутреннего цикла, код сравнивает текущий элемент с каждым последующим элементом и, если текущий элемент больше следующего, меняет их местами.
- Код продолжает проходить по всем элементам массива до тех пор, пока не будет выполнено условие завершения цикла.
- После завершения цикла, код ожидает нажатия клавиши для продолжения работы программы.
- Если условие сортировки не выполнено, код продолжает выполнение до тех пор, пока не будет выполнено условие сортировки.
- После завершения цикла, код завершает работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д