Сортировка по номеру группы - 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);
}

Объяснение кода листинга программы

  1. Объединение данных и функций, которые работают с сортировкой массивов целых чисел и структур типа foo.
  2. Включаются заголовочные файлы: stdio.h, stdlib.h, string.h, time.h.
  3. Определяется тип данных для функции сравнения и сама функция сравнения для сортировки массива целых чисел и структур типа foo.
  4. Определяется структура foo.
  5. Определяются функции вывода на экран массива целых чисел и структур типа foo.
  6. В функции main создаются массивы целых чисел и структур типа foo, заполняются случайными значениями и выводятся на экран.
  7. Массивы передаются в функцию сортировки, которая производит сортировку по заданному полю структуры foo.
  8. В конце программы вызывается функция exit(0), которая завершает работу программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5
Похожие ответы