Сортировка массива структур - 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); // сортировка по годам
Объяснение кода листинга программы
- В функции
compare_by_nameсравниваются поля структур, помеченные какимя автора - В функции
compare_by_yearсравниваются поля структур, помеченные какгод издания - Функция
qsortиспользуется для сортировки массива структур. Она принимает в качестве аргументов:base- указатель на начало массива структурbase_size- размер массива структурsizeof(BIBLIOTEKA)- размер одной структуры в памятиcompare_by_name- функция сравнения, которая определяет порядок сортировки по полямимя автораcompare_by_year- функция сравнения, которая определяет порядок сортировки по полямгод издания