Sortowanie struktury - bazy według masy, wzrostu, wieku


(Ma7ras1) #1

Witam! Mam do wykonania bazę pacjentów, która będzie miała możliwość wyświetlania według rosnącej masy, wzrostu, wieku i alfabetycznie według nazwiska. Bazę zrobiłem. Jest możliwość zapisu i wczytania z pliku. Jednak nie umiem zrobić sortowania. Pomoże ktoś? Oto mój kod:

#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);
}

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));
	int tablica[10];
   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
  	{
	  }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;
   
}

(enedil) #2

Sortowanie - najlepiej chyba QuickSort - https://en.wikipedia.org/wiki/Quicksort


(kostek135) #3

@OP


(Ma7ras1) #4

Dzięki. Spróbuje to zrobić.


(Ostaszewianin) #5

A po co QuickSort? Nie masz do posortowania setek czy tysięcy danych? Do kilku danych wystarczy Ci zwykłe sortowanie bąbelkowe. Nie zauważysz różnicy przy działaniu programu. Dodatkowo program zajmnie Ci więcej pamięci, bo stos będzie zawieral więcej adresów  wywołań danej funkcji rekursywnej.


(Ma7ras1) #6

Spróbowałem to quicksortem, ale wczytuje mi dane, a nie sortuje ich. Wiecie, dlaczego?

 

#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_.imie);_

printf(“Podaj nazwisko pacjenta: \n”);

scanf("%s",&p1_.nazwisko);_

printf(“Podaj wiek: \n”);

scanf("%d",&p1_.wiek);_

printf(“Podaj wzrost (w centymetrach): \n”);

scanf("%d",&p1_.wzrost);_

printf(“Podaj mase: \n”);

scanf("%f",&p1_.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);

}

 

int my_compare (const void * a, const void * b)

{

    int _a = *(int*)a;

    int _b = *(int*)b;

    if(_a < _b) return -1;

    else if(_a == _b) return 0;

    else return 1;

}

 

void sortujmasa(pacjent *p1, int liczba_pacjentow)

{

int i;

    int k;

    int *tablica;

 

    tablica= malloc(k *sizeof(int) );

 

for(k=0;k<liczba_pacjentow;k++)

{

printf("%.2f\n", p1[k].masa);

}

    puts("\n\n");   //przerwa miedzy liczbamy podanymi a liczbami wyswietlonymi

 

    qsort(tablica, k, sizeof(int), my_compare);

 

for(i=0; i<k; ++i)

        printf("%d\n", tablica_);_

 

    return 0;

}

 

void sortujwzrost(pacjent *p1, int liczba_pacjentow)

{

int i;

    int k;

    int *tablica;

 

    tablica= malloc(k *sizeof(int) );

 

for(k=0;k<liczba_pacjentow;k++)

{

printf("%.2f\n", p1[k].masa);

}

    puts("\n\n");   //przerwa miedzy liczbamy podanymi a liczbami wyswietlonymi

 

    qsort(tablica, k, sizeof(int), my_compare);

 

for(i=0; i<k; ++i)

        printf("%d\n", tablica_);_

 

    return 0;

}

void sortujwiek(pacjent *p1, int liczba_pacjentow)

{

int i;

    int k;

    int *tablica;

 

    tablica= malloc(k *sizeof(int) );

 

for(k=0;k<liczba_pacjentow;k++)

{

printf("%.2f\n", p1[k].masa);

}

    puts("\n\n");   //przerwa miedzy liczbamy podanymi a liczbami wyswietlonymi

 

    qsort(tablica, k, sizeof(int), my_compare);

 

for(i=0; i<k; ++i)

        printf("%d\n", tablica_);_

 

    return 0;

}

 

void sortujalfabet(pacjent *p1, int liczba_pacjentow)

{

int i;

    int k;

    int *tablica;

 

    tablica= malloc(k *sizeof(int) );

 

for(k=0;k<liczba_pacjentow;k++)

{

printf("%.2f\n", p1[k].nazwisko);

}

    puts("\n\n");   //przerwa miedzy liczbamy podanymi a liczbami wyswietlonymi

 

    qsort(tablica, k, sizeof(int), my_compare);

 

for(i=0; i<k; ++i)

        printf("%d\n", tablica_);_

 

    return 0;

}

 

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\n");

   printf("[6] Wyswietlenie listy pacjentow wedlug rosnacego wzrostu\n");

   printf("[7] Wyswietlenie listy pacjentow wedlug rosnacego wieku\n");

   printf("[8] Wyswietlenie listy pacjentow w kolejnosci alfabetycznej wedlug nazwiska\n");

   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

  {

  sortujmasa(wsk, liczba_pacjentow);

 }break;

  case 6: //WYSWIETLENIE LISTY PACJENTOW WEDLUG ROSNACEJ WZROSTU

  {

  sortujwzrost(wsk, liczba_pacjentow);

 }break;

  case 7: //WYSWIETLENIE LISTY PACJENTOW WEDLUG ROSNACEJ WIEKU

  {

  sortujwiek(wsk, liczba_pacjentow);

 }break;

  case 8: //WYSWIETLENIE LISTY PACJENTOW W KOLEJNOSCI ALFABETYCZNEJ

  {

  sortujalfabet(wsk, liczba_pacjentow);

 }break;  

  case 9:                         // WYJSCIE Z PROGRAMU

  {

  return 0;

  }break;

   }

   }

   return 0;

   

}


(Ostaszewianin) #7

Tak wiem - przez bezmyślne kopiowanie kodu.

 

Wywal to sortowanie Qsort i:

 

Napisz procedurę soerowania bąbelkowego z parametrami ‘tab’ typu struktura, rozmiar tej struktury, i dodatkowym parametrem, abyś nie robił 500 róznych procedur dla tego samego.

 

void sortuj(pacjent *p1, rozmiar, param)

 

 

Wykorzystaj if lub case do porównywania i zamiany liczb w zależności od parametru param. Załóż że param=0, to sortowanie alfabetyczne;param<0, wzroście; param=1, masie; param>1, wieku

 

 

i popraw ten kod, bo panuje tam chaos


(pio_95) #8

Na pisanie własnej procedury sortowania bym się nie upierał, bo to robi się dla każdego typu sortowania raz w życiu - żeby wiedzieć dokładnie, jak działa.