#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define true 1
#define false 0
/* struktury */
typedef struct Sprinter
{
char imie[20];
char nazwisko[20];
int wiek;
int czas;
int miejsce;
struct Sprinter *next;
struct Sprinter *prev;
} Baza;
Baza *sprinterzy = NULL;
/* znakowe */
char * kopiuj(char *od_str, char *do_str) {
char *temp = do_str;
while (*od_str != '\0')
*temp++ = *od_str++;
*temp = '\0';
return do_str;
}
int porownaj_ciagi (char n1[20], char n2[20]) {
int k=0;
for (k=0;k<20;k++) {
if (n1[k] != n2[k]) {
return false;
} else if (n1[k] == n2[k] && n1[k] == 0) {
break;
}
}
return true;
}
void dodaj_char(char nazw[20],char *pole)
{
char temp[20];
int i,k;
int litery; /* zmienna pomocnicza */
for (i=0;i<20;i++)
temp[i] = 0;
do
{
k=0;
fflush(stdin);
printf("Podaj %s \n",pole);
fgets(temp,21,stdin);
fflush(stdin);
if(isspace((unsigned char)temp[0]) !=0)
{
printf("Blednie podany lancuch znakowy. Prosze wpisac ponownie.\n");
litery=0;
}
else
{
for(i=0;i<21;i++)
{
if(isalpha((unsigned char)temp[i]) != 0 || temp[i] == 46)
{
k++;
}
else if(isspace((unsigned char)temp[i]) != 0)
{
litery=1;
break;
}
else if(isdigit((unsigned char)temp[i]) != 0 || (temp[i]>57 && temp[i]<66) || (temp[i]>90 && temp[i]<97) || (temp[i]>122) || (temp[i]>32 && temp[i]<46) || (temp[i]==47))
{
printf("Blad. Wpisano nieprawidlowy znak. Nalezy ponownie wpisac tekst.\n");
litery=0;
break;
}
}
}
if(k>19)
{
printf("Wprowadzono za dlugi lancuch znakowy. Prosze wpisac ponownie.\n");
litery=0;
}
}while(litery==0);
if( temp[ 0 ] > 96 && temp[ 0 ] < 123 )
temp[ 0 ] -= 32;
nazw[0] = temp[0];
for(i=1;i<k;i++)
{
if( i > 0 && temp[ i ] > 64 && temp[ i ] < 91 )
temp[i] += 32;
nazw[i]=temp[i];
}
nazw[k] = 0;
}
int dodaj_int(char * pole, int maksymalna)
{
char tmp[20],tmp2[20];
int i,liczba,k,koniec;
do
{
liczba=-1;
k=0;
fflush(stdin);
printf("Podaj %s (co najwyzej %d-cyfrowy) :\n",pole,maksymalna);
scanf("%s",tmp);
koniec = 0;
for(i=0;i<20;i++)
{
if(!koniec && tmp[i]>47 && tmp[i]<58)
{
k++;
tmp2[i]=tmp[i];
}
else
koniec = 1;
if (koniec)
tmp2[i] = 0;
}
if(k>0 && k<=maksymalna)
liczba=atoi(tmp2);
else if (k<=0)
printf("Blad, ciag za krotki, prosze podac ponownie.\n");
else
printf("Blad, ciag za dlugi, prosze podac ponownie.\n");
} while (liczba < 0);
return liczba;
}
int dodaj_miejsce () {
return dodaj_int("miejsce w stawce",3);
}
int dodaj_czas () {
return dodaj_int("czas",8);
}
int dodaj_wiek () {
return dodaj_int("wiek",2);
}
/* obsluga bazy sprinterow */
Baza * tworz_baze_w (char imie[20], char nazwisko[20], int wiek, int miejsce, int czas) {
Baza *nowy;
nowy = (Baza*)malloc(sizeof(Baza));
kopiuj (imie,nowy->imie);
kopiuj (nazwisko,nowy->nazwisko);
nowy->wiek = wiek;
nowy->miejsce = miejsce;
nowy->czas = czas;
return nowy;
}
Baza * tworz_baze (Baza *lista) {
char im[20],naz[20];
int wiek,miejsce,czas;
dodaj_char(im,"imie sprintera");
dodaj_char(naz,"nazwisko spritnera");
wiek=dodaj_wiek();
czas=dodaj_czas();
printf ("\nI:[%s]\nN:[%s]\n",im,naz);
miejsce=dodaj_miejsce();
return tworz_baze_w(im,naz,wiek,miejsce,czas);
}
void wstaw_baze(Baza *nowy, Baza **lista)
{
Baza *poczatek = *lista;
if(poczatek != NULL)
{
nowy->next = poczatek;
nowy->prev = NULL;
poczatek->prev = nowy;
}
else
{
nowy->next = NULL;
nowy->prev = NULL;
}
*lista = nowy;
}
Baza * znajdz_baze_w (Baza *lista, char im[20], char naz[20], int wiek, int czas) {
Baza *biezacy;
biezacy = lista;
while(biezacy!=NULL)
{
if(porownaj_ciagi(biezacy->imie,im) && porownaj_ciagi(biezacy->nazwisko,naz) &&
(biezacy->czas)==czas)
{
return biezacy;
}
biezacy=biezacy->next;
}
return NULL;
}
Baza * znajdz_baze (Baza *lista, int numer) {
int k;
Baza *biezacy;
biezacy = lista;
k=1;
while(biezacy!=NULL && k<numer)
{
biezacy=biezacy->next;
k++;
}
return biezacy;
}
int wycofaj_baze(Baza **lista, Baza * baza)
{
if (baza != NULL) {
if (baza->prev != NULL)
(baza->prev)->next=baza->next;
if (baza->next != NULL)
(baza->next)->prev=baza->prev;
if (baza == *lista)
*lista = baza->next;
return 0;
} else
return -1;
}
int usun_baze(Baza **lista, Baza * baza)
{
int ret = wycofaj_baze(lista,baza);
if (ret == 0)
free(baza);
return ret;
}
void zmien_baze(Baza *lista, Baza *baza, char n_im[20], char n_naz[20], int n_wiek, int n_czas, int n_miejsce)
{
if (baza != NULL) {
kopiuj(n_im,baza->imie);
kopiuj(n_naz,baza->nazwisko);
baza->czas = n_czas;
baza->wiek = n_wiek;
baza->miejsce = n_miejsce;
}
}
void czysc_baze(Baza **head)
{
if (*head != NULL)
{
if((*head)->next!=NULL)
czysc_baze(&((*head)->next));
free(*head);
*head = NULL;
}
}
void zapisz(char *nazwa,Baza *head)
{
Baza *tmp;
FILE *plik;
if( (plik = fopen(nazwa,"w") ) == NULL )
{
printf("\n Blad. Nie ma takiego pliku\n");
exit(0);
}
else
{
tmp=head;
while(tmp!=NULL)
{
fprintf(plik,"%s\t",tmp->imie);
fprintf(plik,"%s\t",tmp->nazwisko);
fprintf(plik,"%d\t",tmp->wiek);
fprintf(plik,"%d\t",tmp->czas);
fprintf(plik,"%d\n",tmp->miejsce);
tmp=tmp->next;
}
fclose(plik);
}
}
/* obsluga menu */
void wyswietl_baze(Baza *head)
{
Baza * biezacy = head;
int n = 0;
if (biezacy == NULL) {
printf("Brak wpisow w bazie.\n");
return;
}
printf ("numer\timie\tnazwisko\twiek\tczas\tmiejsce\n");
while(biezacy!=NULL)
{
n++;
printf ("%d\t%s\t%s\t\t%d\t%dm\t%d\t%d\n",n,biezacy->imie, biezacy->nazwisko, biezacy->wiek, biezacy->czas, biezacy->miejsce);
biezacy=biezacy->next;
}
}
void wyswietlWszystko () {
printf ("====================\n");
printf ("BAZA:\n");
wyswietl_baze(sprinterzy);
printf ("====================\n");
}
void dodajBaze ()
{
Baza * baza;
printf ("Dodawanie nowego wpisu do bazy danych.\n");
wstaw_baze(baza,&sprinterzy);
printf ("Dodawanie wpisu zakończone.\n");
}
Baza * wybierzBaze ()
{
char ciag[3];
char im[20],naz[20];
int wiek,miejsce,czas;
int znak;
int n,cm = 0;
printf ("Wybierz sposob wyboru bazy 1 - po danych, 2 - po numerze:\n");
fflush(stdin);
while (cm == 0) {
scanf("%s",&ciag);
if ((ciag[0] == 49 || ciag[0] == 50) && ciag[1] == 0) {
cm = ciag[0]-48;
} else
printf ("Bledny wybor, podaj ponownie.\n");
}
switch (cm)
{
case 1: dodaj_char(im,"imie sprintera");
dodaj_char(naz,"nazwisko spritnera");
wiek=dodaj_wiek();
czas=dodaj_czas();
return znajdz_baze_w(sprinterzy,im, naz, wiek, czas);
case 2: n=dodaj_int("numer",3);
return znajdz_baze(sprinterzy,n);
default: return NULL; /* to nie powinno sie wywolac */
}
}
void edytujBaze ()
{
Baza * baza;
char im[20],naz[20];
int wiek,miejsce,czas;
printf ("Zmiana wpisu bazy danych.\nWybierz wpis.\n");
baza = wybierzBaze ();
if (baza == NULL)
{
printf ("Blad: nie udalo sie zmienic wpisu - brak wybranego wpisu do zmiany\n");
return;
}
printf ("Wybierz nowe wartosci.\n");
dodaj_char(im,"imie sprintera");
dodaj_char(naz,"nazwisko spritnera");
wiek=dodaj_wiek();
czas=dodaj_czas();
miejsce=dodaj_miejsce();
zmien_baze(sprinterzy, baza, im, naz, wiek, czas, miejsce);
printf ("Zmieniono wpis");
}
void usunBaze ()
{
int wartosc,ret;
Baza * baza;
printf ("Usuwanie wpisu bazy.\nWybierz wpis.\n");
baza = wybierzBaze ();
if (baza == NULL)
{
printf ("Blad: nie udalo sie usunac wpisu - brak wybranego wpisu do usuniecia\n");
return;
}
usun_baze (&sprinterzy, baza);
printf ("Usunieto wpis.\n");
}
void czyscBaze ()
{
char znak;
fflush(stdin);
printf("Czy jestes pewny, ze chcesz wyczyscic baze?\n [t] - czysci baze\n");
znak=getchar();
if(znak=='t') {
czysc_baze(&sprinterzy);
}
}
int czyNapewnoKoniec ()
{
char znak;
fflush(stdin);
printf("Czy jestes pewny, ze chcesz zakonczyc program?\n [t] - konczy program, dowolny inny klawisz kontynuuje program\n");
znak=getchar();
if(znak=='t')
return 1;
else
return 0;
}
void zapiszDoPliku () {
char plik[20];
dodaj_char(plik,"nazwa pliku");
zapisz(plik,sprinterzy);
}
int main(void)
{
char ciag[3];
int znak;
int n=0,k=0,l=0,cM;
int koniec = 0;
do{
fflush(stdin);
cM=0;
wyswietlWszystko(n);
printf("\nWitam w programie zarzadzajacym baza wynikow w zawodach.\n");
printf(" d) Dodaj zawodnika\n");
printf(" e) Usun zawodnika\n");
printf(" f) Modyfikuj zawodnika\n");
printf(" h) Czysc baze\n");
printf(" i) Zapisz do pliku\n");
printf(" k) Koniec\n");
do
{
scanf("%s",&ciag);
if (ciag[0] >= 97 && ciag[0] <= 107 && ciag[1] == 0)
cM = 1;
}while(cM!=1);
znak = ciag[0] - 96;
switch(znak)
{
case 4: dodajBaze();
break;
case 5: usunBaze();
break;
case 6: edytujBaze();
break;
case 8: czyscBaze();
break;
case 9: zapiszDoPliku ();
break;
case 11: koniec = czyNapewnoKoniec ();
break;
}
}while(!koniec);
return 0;
}