Сортировка массива структур - 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
- функция сравнения, которая определяет порядок сортировки по полямгод издания
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д