Сортировка массива структур - C (СИ) (76005)

Узнай цену своей работы

Формулировка задачи:

Ребят помогите пожалуйста с сортировкой структуры,не понимаю как ее сделать(
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <locale.h>
#define MAX 100
struct BIBLIOTEKA
{
    char AVTOR[20];
    char NAZVA[20];
    int YEAR[20];
    int NOMER;
    int STRANICU;
};  
long filesize(FILE *f)
{
    long c,l;
    c=ftell(f);
    fseek(f,0,SEEK_END);
    l=ftell(f);
    fseek(f,c,SEEK_SET);
    return(l-c);
}
 
void init_base(FILE *f,BIBLIOTEKA base[],int base_size)
{
    int size=0;
    
    BIBLIOTEKA res;
    if(f!=NULL)
        while(!feof(f)&&filesize(f)>=sizeof(res))
        {
            fread(&res,sizeof(res),1,f);
            base[size]=res;
            size++;
        }
    else
        size=0;
        base_size=size;
}
 
void close_base(FILE *f,BIBLIOTEKA base[],int base_size)
{
    fclose(f);
    f=fopen("base.txt","wb");
    fwrite(base,sizeof(BIBLIOTEKA),base_size,f);
    fclose(f);
}
 
void print_res(BIBLIOTEKA res,int numr)
{
    printf("\n\nZapis%d:\n",numr);
    printf("AVTOR:%s\n",res.AVTOR);
    printf("NAZVA:%s\n",res.NAZVA);
    printf("YEAR:%d\n",res.YEAR);
    printf("NOMER:%d\n",res.NOMER);
    printf("STRANICU:%d\n",res.STRANICU);
 
}
 
void view_recs(BIBLIOTEKA base[],int base_size)
{
    int i;
    for(i=0;i<base_size;i++)
        print_res(base[i],i);
    getch();
}
 
void change_res(BIBLIOTEKA base[],int base_size)
{
    int num=base_size;
    BIBLIOTEKA res;
    view_recs(base,base_size);
    printf("\n\nVvedit nomer zapisi:"); scanf("%d",&num);
    printf("zapis%d\n\n",num);
    printf("AVTOR:");   scanf("%s",&res.AVTOR);
    printf("NAZVA:");   scanf("%s",&res.NAZVA);
    printf("YEAR:");    scanf("%d",&res.YEAR);
    printf("NOMER:");   scanf("%d",&res.NOMER);
    printf("STRANICU:");scanf("%d",&res.STRANICU);
    base[num]=res;
}
 
void search_res(BIBLIOTEKA base[],int base_size)
{
    char ch;
    BIBLIOTEKA res;
    int numr;
    int f=1;
    do
    {
        puts("\n\nVvidit nomer polya:");
        puts("1-AVTOR");
        puts("2-NAZVA");
        puts("3-YEAR");
        puts("4-NOMER");
        puts("5-STRANICU");
        puts("");
        ch=getch();
    }
    while(ch<'1'||ch>'5');
    switch(ch)
    {
        case '1':
            {
                printf("AVTOR \n"); scanf("%s", &res.AVTOR );
            } break;
        case '2':
            {
                printf("Vvedit NAZVA \n"); scanf("%s", &res.NAZVA );
            } break;
        case '3':
            {
                printf("Vvedit YEAR \n");scanf("%d", &res.YEAR);
            } break;
        case '4':
            {
                printf("Vvedit NOMER \n"); scanf("%d",&res.NOMER);
            } break;
        case '5':
            {
                printf("Vvedit STRANICU \n"); scanf("%d", &res.STRANICU);
            } break;
        
    }
    for(numr=0 ; numr < base_size ; numr++ )
    {
        switch(ch)
        {
            
            case '1':
                if(strcmp(base[numr].AVTOR,res.AVTOR)==0)
                {
                    print_res(base[numr],numr);
                    f=0;
                }
                break;
                case '2':
                if(strcmp(base[numr].NAZVA,res.NAZVA)==0)
                {
                    print_res(base[numr],numr);
                    f=0;
                }
                break;
 
                case '3':
                    if(base[numr].YEAR==res.YEAR)
                {
                    print_res(base[numr],numr);
                    f=0;
                }
                break;
            case '4':
                if(base[numr].NOMER==res.NOMER)
                {
                    print_res(base[numr],numr);
                    f=0;
                }
                break;
 
            case '5':
                if(base[numr].STRANICU==res.STRANICU)
                {
                    print_res(base[numr],numr);
                    f=0;
                }
                break;
                
        }
    }
    if(f==1)
        puts("ne nayden");
    getch();
}
 
void add_res(BIBLIOTEKA base[],int &base_size)
{
    BIBLIOTEKA res;
    puts("Vvedit zapis:");
    printf("AVTOR:"); scanf("%s",&res.AVTOR);
    printf("NAZVA:");  scanf("%s",&res.NAZVA);
    printf("YEAR:");  scanf("%d", &res.YEAR);
    printf("NOMER:");scanf("%d",&res.NOMER);
    printf("STRANICU:");scanf("%d",&res.STRANICU);
    base[base_size]=res;
     base_size++;
}
 
void delete_res(BIBLIOTEKA base[],int  &base_size)
{
    int numr,i;
    printf("Vvedit nomer zapisi:"); scanf("%d",&numr);
    if(numr<0||numr> base_size)
        puts("Zapis ne naydena");
    else
    {
        for(i=numr;i< base_size;i++)
            base[i]=base[i+1];
            base_size=base_size-1;
    }
}
 
char main_menu(BIBLIOTEKA base[],int &base_size)
{
    char ch;
    do
    {
        puts("");
        puts("1-Change");
        puts("2-Find");
        puts("3-Add");
        puts("4-Delete");
        puts("5-Viev");
        puts("ESC-Exit");
        ch=getch();
    } 
    while((ch>'5'||ch<'1')&&ch!=27);
    switch(ch)
    {
        case '1':change_res(base,base_size); break;
        case '2':search_res(base,base_size); break;
        case '3':add_res(base, base_size); break;
        case '4':delete_res(base, base_size); break;
        case '5':view_recs(base, base_size); break;
    }
    return ch;
}
int main()
{
    
    BIBLIOTEKA base[MAX];
    int base_size=0;
    FILE *f;
    f=fopen("base.txt","r+");
    init_base(f,base,base_size);
    while(main_menu(base,base_size)!=27);
    close_base(f,base,base_size);
return 0;
}

Решение задачи: «Сортировка массива структур»

textual
Листинг программы
int compare_by_name(const void *arg1, const void *arg2);
 
qsort(base,base_size,sizeof(BIBLIOTEKA),compare_by_name); // сортировка по именам авторов
qsort(base,base_size,sizeof(BIBLIOTEKA),compare_by_year); // сортировка по годам

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

  1. В функции compare_by_name сравниваются поля структур, помеченные как имя автора
  2. В функции compare_by_year сравниваются поля структур, помеченные как год издания
  3. Функция qsort используется для сортировки массива структур. Она принимает в качестве аргументов:
    • base - указатель на начало массива структур
    • base_size - размер массива структур
    • sizeof(BIBLIOTEKA) - размер одной структуры в памяти
    • compare_by_name - функция сравнения, которая определяет порядок сортировки по полям имя автора
    • compare_by_year - функция сравнения, которая определяет порядок сортировки по полям год издания

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


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

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

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