Języki Programowania cz. 2

Wykaz.c

#include <stdio.h>
#define ROZM 100
//wersja 10o (odwracanie)

typedef struct osoba{
 char imie[20];
 char nazwisko[20];
 int pensja[12]; // pensja w kolejnych miesiacach
} OSOBA;

FILE *plikWykazu;
int ilosc=0;
struct osoba *wykaz[ROZM];

void czekaj()
{
 printf("\n >> Wcisnij ENTER\n"); getchar();
}

// przesuwa wszystkie struktury o +1 w stostunku do pozycji "skad", na ktora trafi nowa strutra
// ktorej mijesce wskazala funkcja gdzieWstawic
void zrobMiejsce(int skad)
{
 int i;    
 if (ilosc == skad) return; // jezeli na ostatnie miejsce, to nie rozsuwaj nic

 for (i=ilosc; i>=skad; i--)
 {
 wykaz[i] = wykaz[i-1];
 }
}

int gdzieWstawic(struct osoba *x) // szuka na jaka pozycje najwczesniej mozna wstawic
{
 int i=0;
 int pensja = x->pensja[11]; //pensja

 while (i<ilosc)
 {        
 //jezeli nastepna pensja jest wieksza, wstaw strukture na jej miejsce i przesun reszte dalej
 if ( pensja > wykaz[i]->pensja[11] )
 {
 return i;    
 }
 else //jezeli tyle samo pensji
 if ( pensja == wykaz[i]->pensja[11] )
 {
 // jezeli nastepne nazwisko jest dalej w alfabecie
 if ( strcmp( wykaz[i]->nazwisko, x->nazwisko ) > 0 )
 {
 return i;
 }
 // jezeli nazwiska sa takie same, to wstaw za tym ktore juz istnieje
 // jezeli alfabetycznie nastepne nazwisko jest blizej w alfabecie,
 // to petla leci dalej i sprawdza nazwisko
 }

 i++;
 }

 return ilosc; // na ostatnie miejsce, jezeli petla nie wskazala innego
}

// drukuje plik

void drukuj()
{
 int i,j;
 for (i=0; i<ilosc; i++)
 {
 printf("%i. ",i+1);
 printf("%s %s\n  Pensje: ",wykaz[i]->nazwisko,wykaz[i]->imie);
 /*for(j=0; j<12; j++)
 {
 printf("%d: %d, ",j+1,wykaz[i]->pensja[j]);
 }*/
 printf("Grudzien: %d",wykaz[i]->pensja[11]);
 printf("\n");

 }
 printf("\n");
 czekaj();
}

//wczytywanie pliku

void czytajPlik()
{
 int gdzie=0,i=0;
 struct osoba o;

 plikWykazu = fopen("wykazPensja.txt","r");

 if (plikWykazu==NULL)
 {
 printf("blad odczytu");
 return;
 }

 int rozmOsoby = sizeof(struct osoba);
 while (ilosc<ROZM && fscanf( plikWykazu, "%s%s%d%d%d%d%d%d%d%d%d%d%d%d",o.nazwisko,o.imie,&o.pensja[0],&o.pensja[1],&o.pensja[2],&o.pensja[3],&o.pensja[4],&o.pensja[5],&o.pensja[6],&o.pensja[7],&o.pensja[8],&o.pensja[9],&o.pensja[10],&o.pensja[11])!=EOF )
 {
 gdzie = gdzieWstawic(&o);
 zrobMiejsce( gdzie );

 wykaz[gdzie]=(struct osoba *)malloc(sizeof(struct osoba));
 strcpy(wykaz[gdzie]->nazwisko,o.nazwisko);
 strcpy(wykaz[gdzie]->imie,o.imie);
 for(i=0; i<12; i++)
 {
 wykaz[gdzie]->pensja[i] = o.pensja[i];
 }
 ilosc++;
 }

 fclose(plikWykazu);
 printf("\n >> Dodano %i nowych pozycji !\n", ilosc);
 czekaj();
}

// zapisuje plik

void zapiszPlik()
{
 int i,j;
 plikWykazu = fopen("wykazPensja.txt","w");

 struct osoba o;
 int rozmOsoby = sizeof(struct osoba);

 for(i=0; i<ilosc; i++)
 {       
 fprintf(plikWykazu,"%s\n%s\n",wykaz[i]->nazwisko,wykaz[i]->imie);
 for(j=0; j<12; j++)
 {
 fprintf(plikWykazu,"%i\n",wykaz[i]->pensja[j]);
 }
 }
 fclose(plikWykazu);
 printf("\n >> Zapisano do pliku!\n");
 czekaj();
}

void wstaw()
{
 struct osoba o;
 int i;

 printf("Podaj nazwisko:");
 scanf("%s",&o.nazwisko);
 printf("Podaj imie:");
 scanf("%s",&o.imie);
 for(i=0; i<12; i++)
 {
 printf("Podaj pensje za miesiac %d:",i+1);
 scanf("%i",&o.pensja[i]);
 }
 getchar();

 int gdzie;
 gdzie = gdzieWstawic(&o);        
 zrobMiejsce( gdzie );    

 wykaz[gdzie]=(struct osoba*)malloc(sizeof(struct osoba));
 strcpy(wykaz[gdzie]->nazwisko, o.nazwisko);
 strcpy(wykaz[gdzie]->imie, o.imie);
 for(i=0; i<12; i++)
 {
 wykaz[gdzie]->pensja[i] = o.pensja[i];
 }

 ilosc ++;

 printf("\n >> Dodano: %s, na pozycje: %i\n", o.nazwisko,gdzie);
 czekaj();
}

/*void usun() // funkcja do usuwania
{
 int i=0,j,gdzie=0;

 printf("Podaj numer z zakresu 1 - %i:",ilosc);
 scanf("%i",&gdzie);
 gdzie --;
 getchar();

 for( i=0; i<ilosc; i++)
 {
 if ( i == gdzie )
 {
 // usuwanie
 printf("Usuwanie: %s, z pozycji %i\n", wykaz[i]->nazwisko, i+1);
 free(wykaz[i]);
 ilosc --;
 for (j=i; j<ilosc; j++)
 {
 wykaz[j] = wykaz[j+1];
 }
 }
 }
 czekaj();
}*/

void odwrocKolej()
{
 int i=0,j;
 struct osoba *temp;

 j = ilosc - 1;
 while ( j > i ) // petla dziala tak dlugo az j,i sie spotkaja
 {
 temp = wykaz[i];
 wykaz[i] = wykaz[j];
 wykaz[j] = temp;

 j--;
 i++;
 }
}

int main()
{
 char z;
 do
 {
 printf("\n\n c - czytaj z pliku wykazPensja.txt");
 printf("\n d - drukuj");
 printf("\n w - wstaw");
 //printf("\n u - usun");
 printf("\n o - odwroc kolejnosc");
 printf("\n z - zapisz do pliku wykazPensja.txt");
 printf("\n k - koniec");
 printf("\n wybor: ");

 fflush(stdin);    // wyczysc klawiature w razie czego
 z = getchar(); getchar();
 printf("\n");
 switch(z)
 {
 case 'c' : czytajPlik(); break;
 case 'd' : drukuj(); break;
 case 'w' : wstaw(); break;
 //case 'u' : usun(); break;
 case 'o' : odwrocKolej(); break;
 case 'z' : zapiszPlik(); break;
 }
 } while (z!='k');

 return 0;
}

.

Dodaj komentarz