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;
}
.