Sortowanie struktury - baza

0

Witam!

Mam za zadanie stworzyć bazę pacjentów, która będzie miała możliwość wyświetlania według: rosnącej masy, wzrostu, wieku i alfabetycznie. Bazę zrobiłem. Dodaję pacjentów, zapisuję do pliku i wyświetlam, lecz mój problem polega na tym, że kompletnie nie umiem zrobić ostatniej części, czyli sortowania. Ktoś pomoże?

 
#include <stdio.h>
#include <stdlib.h>


typedef struct
{
char imie[20];
char nazwisko[20];
int wiek;
int wzrost;
float masa;
}pacjent ;
 
void pobierz_dane (pacjent *p1, int i, int *dodaj_kolejnego_pacjenta )
{
i=i-1;
printf("\rPodaj imie pacjenta: \n");
scanf("%s", &p1[i].imie);
printf("Podaj nazwisko pacjenta: \n");
scanf("%s",&p1[i].nazwisko);
printf("Podaj wiek: \n");
scanf("%d",&p1[i].wiek);
printf("Podaj wzrost (w centymetrach): \n");
scanf("%d",&p1[i].wzrost);
printf("Podaj mase: \n");
scanf("%f",&p1[i].masa);
printf("Czy chcesz dodac kolejnego pacjenta? Jesli nie zapisz baze i wyswietl ja. [1/0]\n");
scanf("%d", dodaj_kolejnego_pacjenta);
}

void zapisywanie_do_pliku(pacjent *p1, int liczba_pacjentow)
{
FILE *zapisz;
zapisz=fopen("pacjenci.txt","wt");
int k;

for(k=0;k<liczba_pacjentow;k++)
{
fprintf(zapisz,"%s %s %d %d %.2f\n", p1[k].imie, p1[k].nazwisko, p1[k].wiek, p1[k].wzrost, p1[k].masa);
}
printf("\nZapisano!\n");
fclose(zapisz);
}

void wyswietlanie_bazy(pacjent *p1, int liczba_pacjentow)
{

int k;
for(k=0;k<liczba_pacjentow;k++)
{
printf("%s %s %d %d %.2f\n", p1[k].imie, p1[k].nazwisko, p1[k].wiek, p1[k].wzrost, p1[k].masa);
}
}

void wczytanie_bazy(pacjent *p1, int liczba_pacjentow)
{
	FILE *wczytaj;
	int k;
	char zp;
	
	wczytaj=fopen("pacjenci.txt", "r");
	if(wczytaj==NULL)
	printf("plik jest pusty, lub nie istnieje");
   	while(zp!=EOF)
    {
     zp=fgetc(wczytaj);
     printf("%c", zp);
 	}
 	fclose(wczytaj);
}

void masa(int *tab, int liczba_pacjentow)
{
   int i, j, tmp, zmiana;
   for (i = 0;i<liczba_pacjentow;i++)
   {
      zmiana=0; 
      for (j=0;j<n-1-i;j++) 
      {
         if (tab[j]>tab[j+1])
         {
            tmp=p1[k].masa;
            p1[k].masa=p1[k+1].masa;
            p1[k+1].masa=tmp;
            zmiana=1;       
         }
      }
      if(!zmiana) break;
   }
}

int main ()
{
int rekord;
int baza_danych;
int dodaj_kolejnego_pacjenta=0;
pacjent *wsk;
int i=0;
int wybor;
int k=0;
int liczba_pacjentow=0;
int spr=1;
pacjent  p1;
	wsk=(pacjent *)malloc(sizeof(pacjent));
   while(1){
   printf("\nBaza danych\n");
   printf("\n[1] Dodaj pacjenta\n");
   printf("[2] Wyswietlenie listy pacjentow\n");
   printf("[3] Zapisz\n");
   printf("[4] Wczytaj\n");
   printf("[5] Wyswietlenie listy pacjentow wedlug rosnacej masy");
//   printf("[6] Wyswietlenie listy pacjentow wedlug rosnacego wzrostu");
//   printf("[7] Wyswietlenie listy pacjentow wedlug rosnacego wieku");
//   printf("[8] Wyswietlenie listy pacjentow w kolejnosci alfabetycznej");
   printf("[9] Wyjdz z programu\n ");
   scanf("%d", &baza_danych);
   switch (baza_danych){

  case 1:                             // WPROWADZANIE DANYCH NOWEGO PACJENTA
  {
  wybor=1;
  while(wybor)
  {
  if(rekord)
  {
  liczba_pacjentow = rekord;      
  }
  if(liczba_pacjentow==0){
  liczba_pacjentow++;
  }
  else{
  liczba_pacjentow++;
  wsk = (pacjent *)realloc(wsk, liczba_pacjentow * sizeof(pacjent)); 
  }
  pobierz_dane( wsk,  liczba_pacjentow, &dodaj_kolejnego_pacjenta );
  printf("%d", dodaj_kolejnego_pacjenta);
if(!dodaj_kolejnego_pacjenta)
  {
  wybor=0;     
  }
  }
  }break;
  case 2:                          // WYSWIETLANIE AKTUALNEJ BAZY PACJENTOW
  {      
  wyswietlanie_bazy(wsk, liczba_pacjentow);
  }break;
  case 3:                       // ZAPISYWANIE DO PLIKU DANYCH PACJENTOW
  {
  zapisywanie_do_pliku(wsk, liczba_pacjentow);
  
  }break;
  case 4:
  {
  wczytanie_bazy(wsk, liczba_pacjentow);
  }break;
  case 5:					//WYSWIETLENIE LISTY PACJENTOW WEDLUG ROSNACEJ MASY CIALA
  	{
  		masa();
	  }break;
//  case 6:					//WYSWIETLENIE LISTY PACJENTOW WEDLUG ROSNACEJ WZROSTU
//  	{
//  		wysokosc();
//	  }break;
//  case 7:					//WYSWIETLENIE LISTY PACJENTOW WEDLUG ROSNACEJ WIEKU
//  	{
//  		lata();
//	  }break;
//  case 8:					//WYSWIETLENIE LISTY PACJENTOW W KOLEJNOSCI ALFABETYCZNEJ
//  	{
//  		alfabet();
//	  }break;	  	
  case 9:                         // WYJSCIE Z PROGRAMU
  {
  return 0;
  }break;
   }
   }
   return 0;
   
}
3

http://www.cplusplus.com/reference/cstdlib/qsort/
Dla sortowania wg wieku analogicznie.


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct pacjent
{
	unsigned int masa;
	unsigned int wiek;
};

int sortujMasa(const void* a, const void *b)
{ 
        int masa0 = ((pacjent*)a)->masa;
        int masa1 = ((pacjent*)b)->masa;
	if( masa0 < masa1   ) return -1;
	if( masa0 == masa1 ) return 0;
	if( masa0 > masa1   ) return 1;
	return 0;
}
int main()
{
	srand(time(NULL));
	pacjent pc[10];
	for(int i=0;i<10;++i){
		unsigned int masa = rand() % 150 + 30;
		unsigned int wiek = rand() % 80 + 5;
		pc[i] = pacjent{masa, wiek};
	}
	qsort((void*)pc, 10, sizeof(pacjent), sortujMasa);
	for(int i=0;i<10;++i)
	{
		printf("%i %i\n", pc[i].masa, pc[i].wiek);
	}
}
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1