Сортировка по номеру группы - C (СИ)
Формулировка задачи:
имеется проблема, никак не могу разобрать в чём ошибка
сортировка по среднему баллу (по убыванию) работает нормально, а вот сортировка по номеру группы (по возрастанию) никак не получается реализовать, вернее сортировка происходит, но потом программа зависает, а должна выводить меню с выбором дальнейших действий, как это делается при сортировке среднего балла
вроде всё выложил
критике буду только рад
struct marks { int physics; int math; int inform; int chemistry; }; struct students { char name[50]; char surname[50]; char middlename[50]; int date; int group; struct marks mark; double sredn; };void vvod6(students*,int); void vivod6(students*,int); void sort(students*,int); void sredn6(students*,int); void main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); int laba,i=1,x; while(i>0) { printf("\t\t\t\tМеню\n1. Лабораторная работа №1: Линейный вычислительный процесс\n2. Лабораторная работа №2: Реализация развлетвляющихся алгоритмов\n3. Лабораторная работа №3: Реализация циклических алгоритмов\n4. Лабораторная работа №4: Обработка одномерных массивов\n5. Лабораторная работа №5: Обработка двухмерных динамических массивов. Функции пользователя\n6. Лабораторная работа №6: Дополнительное задание. Обработка структур с использованием файлов\n7. Выход\n\n"); printf("Введите ваш выбор: "); scanf("%d",&laba); menu(&laba); printf("1. Продолжить выполнение лабораторных работ\n2. Выход\n"); printf("\nВведите ваш выбор: "); scanf("%d",&x); switch(x) { case 1: break; case 2: exit(0); break; default: break; } } } void laba6(struct students*x) { printf("\n\t\t\t\tЛабораторная работа №6:\n"); int n; printf("Введите количество студентов= "); scanf("%d",&n); x=(struct students*)calloc(n,sizeof(struct students*)); if(!x) { printf("Ошибка памяти\n"); exit(0); } vvod6(x,n); sredn6(x,n); sort(x,n); vivod6(x,n); free(x); }void sort(struct students*x,int n) //сортировка { struct students y; int z,i,j; printf("1. Сортировка по среднему баллу\n2. Сортировка по номеру группы\n3. Сортировка по алфавиту\n4. Сортировка по возрасту\n"); printf("\nВведите ваш выбор: "); scanf("%d",&z); switch(z) { case 1: //Сортировка по среднему баллу { for(j=1;j<=n;j++) { for(i=0;i<n-1;i++) { if (x[i].sredn<x[i+1].sredn) { y=x[i]; x[i]=x[i+1]; x[i+1]=y; } } } } break; case 2: //Сортировка по номеру группы { for(j=1;j<=n;j++) { for(i=0;i<n-1;i++) { if(x[i].group>x[i+1].group) { y=x[i]; x[i]=x[i+1]; x[i+1]=y; } } } } break; case 3: //Сортировка по алфавиту { for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(strcmp(x[i].surname,x[j].surname)<0) { y=x[i]; x[i]=x[j]; x[j]=y; } } } } break; case 4: //Сортировка по возрасту { for(j=1;j<=n;j++) { for(i=0;i<n-1;i++) { if(x[i].date>x[i+1].date) { y=x[i]; x[i]=x[i+1]; x[i+1]=y; } } } } break; default: break; } }void vvod6(struct students*x,int n) { for(int i=0;i<n;i++) { printf("\n\tВведите данные %d-ого студента\nВведите фамилию= ",i+1); scanf("%s",&x[i].surname); printf("Введите имя= "); scanf("%s",&x[i].name); printf("Введите отчество= "); scanf("%s",&x[i].middlename); printf("Введите год рождения= "); scanf("%d",&x[i].date); printf("Введите номер группы= "); scanf("%d",&x[i].group); printf("Введите оценку по физике= "); scanf("%d",&x[i].mark.physics); printf("Введите оценку по математике= "); scanf("%d",&x[i].mark.math); printf("Введите оценку по инфаорматике= "); scanf("%d",&x[i].mark.inform); printf("Введите оценку по химии= "); scanf("%d",&x[i].mark.chemistry); printf("\n\n"); } }void vivod6(struct students*x,int n) { for(int i=0;i<n;i++) printf("\t\t\tСтудент %d\nФамилия: %s\nИмя: %s\nОтчество: %s\nГод рождения: %d\nНомер группы: %d\nСредний балл: %.2lf\n\n\n",i+1,x[i].surname,x[i].name,x[i].middlename,x[i].date,x[i].group,x[i].sredn); }void sredn6(struct students*x,int n) { for(int i=0;i<n;i++) x[i].sredn=(x[i].mark.physics+x[i].mark.math+x[i].mark.inform+x[i].mark.chemistry)/4.; }
и ещё вопрос про сортировку по алфавиту. она работает только с английским языком, как можно реализовать поддержку русского ещё?
Решение задачи: «Сортировка по номеру группы»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> typedef int (*CMP) (const void*, const void*); struct foo { int i; char c; }; void sort(void*, size_t, size_t, CMP); #define SIZE 5 /* comparison function for ints */ int icmp(const void* a, const void* b) { int ia = *(const int*) a; int ib = *(const int*) b; if(ia < ib) return -1; if(ib < ia) return 1; return 0; } /* comparison function for foos (reverse order on `i' field) */ int fcmp_i(const void* a, const void* b) { const struct foo* fa = (const struct foo*) a; const struct foo* fb = (const struct foo*) b; /* compare on integer fields */ if(fa->i < fb->i) return 1; if(fb->i < fa->i) return -1; return 0; } /* comparison function for foos (order on `c' field) */ int fcmp_c(const void* a, const void* b) { const struct foo* fa = (const struct foo*) a; const struct foo* fb = (const struct foo*) b; /* compare on integer fields */ if(fa->c < fb->c) return -1; if(fb->c < fa->c) return 1; return 0; } void print_int(const char* prompt, int* arr, size_t sz) { size_t i; if(prompt != NULL) puts(prompt); for(i = 0; i < sz; ++i) printf("%d ", arr[i]); putchar('\n'); } void print_foo(const char* prompt, struct foo* arr, size_t sz) { size_t i; if(prompt != NULL) puts(prompt); for(i = 0; i < sz; ++i) printf("{%d, `%c'} ", arr[i].i, arr[i].c); putchar('\n'); } int main(void) { size_t i; struct foo farr[SIZE]; int iarr[SIZE]; srand(time(NULL)); for(i = 0; i < SIZE; ++i) { iarr[i] = rand() % 21; farr[i].i = rand() % 11; farr[i].c = rand() % ('z' - 'a' + 1) + 'a'; } print_int("Integer array before sorting:", iarr, SIZE); sort(iarr, SIZE, sizeof(int), icmp); print_int("Integer array, sorted ascending:", iarr, SIZE); print_foo("Array of foos before sorting:", farr, SIZE); sort(farr, SIZE, sizeof(struct foo), fcmp_i); print_foo("Array of foos, sorted descending on `i' field:", farr, SIZE); sort(farr, SIZE, sizeof(struct foo), fcmp_c); print_foo("Array of foos, sorted ascending on `c' field:", farr, SIZE); exit(0); } void sort(void* base, size_t nmemb, size_t size, CMP cmp) { size_t i, j; unsigned char* base_ptr = (unsigned char*) base; unsigned char* temp = malloc(size); for(i = 0; i < nmemb; ++i) { for(j = nmemb - 1; j > i; --j) { int cmp_result = cmp(base_ptr + j * size, base_ptr + (j - 1) * size); if(cmp_result < 0) { memcpy(temp, base_ptr + (j - 1) * size, size); memcpy(base_ptr + (j - 1) * size, base_ptr + j * size, size); memcpy(base_ptr + j * size, temp, size); } } } free(temp); }
Объяснение кода листинга программы
- Объединение данных и функций, которые работают с сортировкой массивов целых чисел и структур типа foo.
- Включаются заголовочные файлы: stdio.h, stdlib.h, string.h, time.h.
- Определяется тип данных для функции сравнения и сама функция сравнения для сортировки массива целых чисел и структур типа foo.
- Определяется структура foo.
- Определяются функции вывода на экран массива целых чисел и структур типа foo.
- В функции main создаются массивы целых чисел и структур типа foo, заполняются случайными значениями и выводятся на экран.
- Массивы передаются в функцию сортировки, которая производит сортировку по заданному полю структуры foo.
- В конце программы вызывается функция exit(0), которая завершает работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д