Сортировка по номеру группы - 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), которая завершает работу программы.