Może na coś komu się przydadzą jeszcze funkcje wczytujące z pliku i doń zapisujące:
void read(struct plyta *in,int *i){
FILE *plik;
char temp[30];
int k=1;
if((plik=fopen("dane.txt","r"))==NULL) printf("\nNie mozna otworzyc pliku\n\nKontynuuj:\n");
else {
(*i)++;
while(fgets(temp,sizeof(temp),plik)!=NULL)
{
in[*i].numer = *i;
if(temp[strlen(temp)-1]=='\n') temp[strlen(temp)-1]='\0';
if (k>4)
{
k=1;
(*i)++;
}
switch(k++)
{
case 1: strcpy(in[*i].autor,temp);
case 2: strcpy(in[*i].tytul,temp);
case 3: strcpy(in[*i].typ,temp);
case 4: strcpy(in[*i].uw,temp);
}
}
printf("\nDane zostaly wczytane pomyslnie.\n\nKontynuuj:\n");
}
fclose(plik);
}
void save(struct plyta *in,int i){
int k=1;
FILE *plik;
plik=fopen("dane.txt","w");
while (k<=i) {
fprintf (plik,"%s\n", in[k].autor);
fprintf (plik,"%s\n", in[k].tytul);
fprintf (plik,"%s\n", in[k].typ);
fprintf (plik,"%s\n", in[k].uw);
k++;
}
printf("\nDane zostaly zapisane.\n\n");
fclose(plik);
}Offline
******* **** ****
* ** * *** ** OTATNIK
* *** * ** * **
* * * ** * ** *********
* *** * ** * ** * *** *
* ** * ** *** *
******* **** ** * ELEFONICZNY
***
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
WYSWIETLANIE INFORMACJI:
[a] Wyswietl wpisy
[b] Szukaj
DODAJ/USUN WPISY:
[c] Dodaj wpis
[d] Usun wpis
[e] Usun wszystko
BAZA DANYCH:
[f] Zapisz zmiany w bazie danych
[g] Zaladuj ponownie baze danych
SORTOWANIE:
[h] Sortowanie wg personalii
[i] Sortowanie wg miejscowosci
[j] Sortowanie wg nr. telefonu
[k] Sortowanie wg adresu email
INNE:
[l] Informacje o programie
[m] Wyjscie
Twoj wybor:Moj programik hehe tzn jego efekt na ekranie dziala bez zarzutow:D
Kod źródłowy :
/* * * * * * * * * * * * * Pliki naglowkowe * * * * * * * * * * * * */
#include <stdio.h> /* Standardowe funkcje wejscia/wyjscia */
#include <string.h> /* Funkcje przetwarzania tekstu */
#include <stdlib.h> /* Makrodefinicje EXIT_SUCCESS i EXIT_FAILURE,
funkcja system */
#include <ctype.h> /* toupper */
/* * * * * * * * * Makrodefinicje i definicje struktur * * * * * * * */
#define MAX 30 /* Maksymalna liczba wpisow w bazie danych */
#define INPUT 4 /* Maksymalna dlugosc wprowadzanego indeksu */
#define FALSE 0
#define TRUE 1
typedef short int BOOL; /* Definicja relacji */
typedef struct /* Definicja typu strukturalnego telefony */
{
char personalia[50]; /* Nazwisko i imie, firma lub pseudonim */
char adres[50]; /* Miejscowosc */
char telefon[20]; /* Numer telefonu */
char email[30]; /* Email */
} telefony;
/* * * * * * * * * * * * * Prototypy funkcji * * * * * * * * * * * * */
void /*inline*/ wyczysc_ekran(void); /* Czysci ekran monitora */
void /*inline*/ potwierdzenie(void); /* Wyswietla komunikat koncowy */
int wszystkie_wpisy(void); /* Listuje wszystkie wpisy w bazie */
int dane_osoby(void); /* Prezentuje dany wpis */
int szukaj_wpisu(void); /* Przeszukuje baze */
int dodaj_wpis(void); /* Dodaje nowy wpis */
int usun_wpis(void); /* Usuwa wpis */
int usun_wszystko(void); /* Usuwa wszystkie wpisy */
int zachowaj_baze(void); /* Zapisuje baze danych do pliku */
int wczytaj_baze(void); /* Laduje baze z pliku do pamieci */
void sortuj_imie(void); /* Sortuje baze wg pola personalia */
void sortuj_miasto(void); /* Sortuje baze wg pola adres */
void sortuj_telefon(void); /* Sortowanie wg pola telefon */
void sortuj_email(void); /* Sortowanie wg pola email */
void info(void); /* Informacje o programie*/
/* * * * * * * * * * * * * Zmienne globalne * * * * * * * * * * * * */
telefony baza[MAX]; /* Zmienna strukturalna baza */
int numer = 0; /* Licznik wszystkich wpisow */
/* * * * * * * * * * * * * F u n k c j e * * * * * * * * * * * * * * */
void /*inline*/ wyczysc_ekran(void)
{
system("clear");
printf( " ******* **** ****\n"
" * ** * *** ** OTATNIK \n"
" * *** * ** * ** \n"
" * * * ** * ** ********* \n"
" * *** * ** * ** * *** *\n"
" * ** * ** *** * \n"
" ******* **** ** * ELEFONICZNY\n"
" ***\n"
" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ");
}
void /*inline*/ potwierdzenie(void)
{
getchar();
printf("\n Nacisnij dowolny klawisz aby kontynuowac...\n");
getchar();
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Glowna funkcja int main(void) *
* *
* zadania: wyswietlanie glownego menu programu; *
* wywolywanie odpowiednich funkcji - *
* modulow programu. *
* *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int main(void)
{
char wybor;
wyczysc_ekran();
wczytaj_baze();
do /* Petla do-while musi wykonac sie przynajmniej raz */
{
/* Menu glowne programu */
wyczysc_ekran();
printf( "WYSWIETLANIE INFORMACJI: \n"
" [a] Wyswietl wpisy \n"
" [b] Szukaj \n"
" DODAJ/USUN WPISY:\n"
" [c] Dodaj wpis \n"
" [d] Usun wpis\n"
" [e] Usun wszystko \n"
" BAZA DANYCH:\n"
" [f] Zapisz zmiany w bazie danych \n"
" [g] Zaladuj ponownie baze danych \n"
" SORTOWANIE:\n"
" [h] Sortowanie wg personalii \n"
" [i] Sortowanie wg miejscowosci\n"
" [j] Sortowanie wg nr. telefonu\n"
" [k] Sortowanie wg adresu email\n"
" INNE:\n"
" [l] Informacje o programie\n"
" [m] Wyjscie \n");
/* Pobierz dane od uzytkownika */
printf(" Twoj wybor: ");
wybor = getchar();
wyczysc_ekran();
/* Wywolanie funkcji w zaleznosci od wyboru uzytkownika */
switch (wybor)
{
case 'a' : wszystkie_wpisy();
break;
case 'b' : szukaj_wpisu();
break;
case 'c' : dodaj_wpis();
break;
case 'd' : usun_wpis();
break;
case 'e' : usun_wszystko();
break;
case 'f' : zachowaj_baze();
break;
case 'g' : wczytaj_baze();
break;
case 'h' : sortuj_imie();
break;
case 'i' : sortuj_miasto();
break;
case 'j' : sortuj_telefon();
break;
case 'k' : sortuj_email();
break;
case 'l' : info();
break;
case 'm' :
break;
default :
{
printf("\n Nie ma takiej opcji! \n");
potwierdzenie();
}
break;
}
} while (wybor != 'm');
printf("\n ZAMYKANIE PROGRAMU \n");
potwierdzenie();
system("clear");
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Funkcja int wszystkie_wpisy(void) *
* *
* zadania: wyswietlanie wszystkich wpisow w bazie *
* *
* argumenty przekazywane: brak *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int wszystkie_wpisy(void)
{
int i; /* Zmienna pomocnicza - indeks petli */
printf("\n WYKAZ WSZYSTKICH WPISOW \n");
if (numer == 0) /* Nie ma zadnego wpisu! */
{
printf("\n Baza danych jest pusta"
" lub nie zostala zaladowana z pliku! \n");
}
/* Wyswietl wszystkie osoby wraz z numerami ich indeksow */
else
{
for (i = 0; i < numer; i++)
{
printf("%d Nazwisko i imie: %s",i+1, baza[i].personalia);
printf(" Miejscowosc: %s", baza[i].adres);
printf(" Telefon: %s", baza[i].telefon);
printf(" e-mail: %s\n", baza[i].email);
/* Zatrzymaj program po zapelnieniu ekranu */
if ((i + 1)%10 == 0)
{
potwierdzenie();
wyczysc_ekran();
}
}
printf("\n Koniec danych \n");
}
potwierdzenie();
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Funkcja int szukaj_wpisu(void) *
* *
* zadania: wyszukanie informacje w bazie - *
* podanego nazwiska lub miejscowosci *
* *
* argumenty przekazywane: brak *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int szukaj_wpisu(void)
{
char szukana[30]; /* Szukane nazwisko lub miejscowosc */
int index, k = 0; /* Zmienne pomocnicze */
printf("\n WYSZUKIWANIE INFORMACJI W BAZIE \n");
getchar();
printf("\n Wprowadz nazwisko lub miejscowosc do wyszukania: ");
gets(szukana);
wyczysc_ekran();
for (index = 0; index < numer; index++)
{
/* Wyswietlanie informacji o wyszukanych wpisach */
if (strstr(baza[index].personalia, szukana)
|| strstr(baza[index].adres, szukana))
{
printf("\n Nazwisko i imie: %s", baza[index].personalia);
printf("\n Miejscowosc: %s", baza[index].adres);
printf("\n Telefon: %s", baza[index].telefon);
printf("\n Email: %s\n", baza[index].email);
printf("\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
k++;
/* Zatrzymaj program po zapelnieniu ekranu */
if (k%3 == 0)
{
potwierdzenie();
wyczysc_ekran();
}
}
}
if (k == 0) /* Brak rezultatow! */
{
printf("\n Nie znaleziono zadnego wpisu! \n");
potwierdzenie();
}
printf("\n To wszystkie wpisy jakie znaleziono! \n");
potwierdzenie();
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Funkcja int dodaj_wpis(void) *
* *
* zadania: dodawanie nowego wpisu do bazy danych *
* *
* argumenty przekazywane: brak *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int dodaj_wpis(void)
{
printf("\n DODAWANIE WPISU DO BAZY DANYCH \n");
getchar();
if (numer >= MAX) /* Baza danych jest pelna! */
{
printf("\n Baza danych jest pelna! \n");
potwierdzenie();
}
/* Pobierz od uzytkownika wszystkie informacje o osobie */
/* Sprawdz czy wpisy nie sa za dlugie */
do
{
printf("\n Nazwisko i imie: ");
gets(baza[numer].personalia);
if (strlen(baza[numer].personalia) > 48)
printf("\n Mozna wpisac maksymalnie 48 znakow! \n");
} while (strlen(baza[numer].personalia) > 48);
do
{
printf("\n Miejscowosc: ");
gets(baza[numer].adres);
if (strlen(baza[numer].adres) > 48)
printf("\n Mozna wpisac maksymalnie 48 znakow! \n");
} while (strlen(baza[numer].adres) > 48);
do
{
printf("\n Telefon: ");
gets(baza[numer].telefon);
if (strlen(baza[numer].telefon) > 18)
printf("\n Mozna wpisac maksymalnie 18 znakow! \n");
} while (strlen(baza[numer].telefon) > 18);
do
{
printf("\n Email: ");
gets(baza[numer].email);
if (strlen(baza[numer].email) > 35)
printf("\n Mozna wpisac maksymalnie 35 znakow! \n");
} while (strlen(baza[numer].email) > 35);
/* Nic nie wpisano w polu Nazwisko i imie lub Telefon */
if ((strlen(baza[numer].telefon) == 0)
|| (strlen(baza[numer].personalia) == 0))
{
printf("\n Wpis nie zostal dodany do bazy danych!"
"\n Musi zostac podane nazwisko i numer telefonu! \n");
potwierdzenie();
}
/* Do kazdego pola dodaj znacznik konca lini */
else
{
strcat(baza[numer].personalia, "\n");
strcat(baza[numer].adres, "\n");
strcat(baza[numer].telefon, "\n");
strcat(baza[numer].email, "\n");
numer++; /* Zwieksz liczbe wpisow o jeden */
printf("\n Wpis zostal dodany do bazy danych! \n");
}
potwierdzenie();
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Funkcja int usun_wpis(void) *
* *
* zadania: usuwanie wpisu z bazy danych *
* *
* argumenty przekazywane: brak *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int usun_wpis(void)
{
char wpis[INPUT]; /* Tekst wpisany przez uzytkownika */
int kasuj_nr; /* Wpis do usuniecia */
printf("\n USUWANIE WPISU Z BAZY \n");
getchar();
printf("\n Podaj indeks wpisu do usuniecia: ");
kasuj_nr = atoi(gets(wpis)); /* Konwersja typu danych */
/* Nie ma takiego wpisu! */
if ((kasuj_nr < 1) || (kasuj_nr > numer))
{
printf("\n Nie ma w bazie wpisu o takim indeksie! \n");
potwierdzenie();
}
else
{
/* Usuwanie - przeindeksowanie bazy */
while ((kasuj_nr - 1) < numer)
{
baza[kasuj_nr - 1] = baza[kasuj_nr];
kasuj_nr++;
}
numer--;
printf("\n Wpis zostal usuniety \n");
}
potwierdzenie();
}
int usun_wszystko(void)
{
int wpis; /* Tekst wpisany przez uzytkownika */
int kasuj_nr; /* Wpis do usuniecia */
printf("\n USUWANIE WSZYSTKICH WPISOW Z BAZY \n");
getchar();
wpis = numer;
kasuj_nr = wpis;
while (numer>0)
{
while ((kasuj_nr - 1) < numer)
{
baza[kasuj_nr - 1] = baza[kasuj_nr];
kasuj_nr++;
}
numer--;
printf("\n Wpis zostal usuniety \n");
}
potwierdzenie();
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Funkcja int zachowaj_baze(void) *
* *
* zadania: zapisywanie bazy danych do pliku telefony.dbs *
* *
* argumenty przekazywane: brak *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int zachowaj_baze(void)
{
FILE *PlikBazy; /* Wskaznik do pliku bazy */
int i; /* Zmienna pomocnicza */
char znak;
printf("\n ZAPISYWANIE DANYCH DO PLIKU telefony.txt \n");
getchar();
printf("\n Jestes pewien? [T]ak/[N]ie ");
znak = getchar();
if (toupper(znak) != 'T')
{
printf("\n Baza danych nie zostala zapisana \n");
potwierdzenie();
}
else
{
PlikBazy = fopen("telefony.txt", "w" ); /* Otworz do pisania */
/* Nie mozna otworzyc pliku telefony.dbs! */
if (PlikBazy == NULL)
{
printf("\n Nie mozna otworzyc pliku bazy danych! \n");
potwierdzenie();
}
/* Zapisz aktualna liczbe osob w bazie */
fprintf(PlikBazy, "%d\n", numer);
/* Zachowaj reszte danych */
for (i = 0; i < numer; i++)
{
fputs(baza[i].personalia, PlikBazy);
fputs(baza[i].adres, PlikBazy);
fputs(baza[i].telefon, PlikBazy);
fputs(baza[i].email, PlikBazy);
}
printf("\n Baza danych zostala zachowana! \n");
}
potwierdzenie();
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Funkcja int wczytaj_baze(void) *
* *
* zadania: wczytywanie bazy danych z pliku telefony.dbs *
* *
* argumenty przekazywane: brak *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int wczytaj_baze(void)
{
FILE *PlikBazy; /* Wskaznik do pliku bazy */
int i; /* Zmienna pomocnicza */
printf("\n WCZYTYWANIE DANYCH Z PLIKU telefony.txt \n");
/* Otworz plik tylko do odczytu */
PlikBazy = fopen("telefony.txt", "r");
/* Nie mozna otworzyc pliku telefony.dbs!*/
if (PlikBazy == NULL)
{
printf("\n Nie mozna otworzy pliku bazy danych! \n");
potwierdzenie();
}
/* Czytaj z pliku aktualna liczbe wpisow w bazie */
fscanf(PlikBazy, "%d\n", &numer);
if (numer > MAX)
{
printf("\n W bazie danych jest za duzo wpisow! \n");
potwierdzenie();
}
/* Czytaj reszte danych z pliku */
for (i = 0; i < numer; i++)
{
fgets(baza[i].personalia, 50, PlikBazy);
fgets(baza[i].adres, 50, PlikBazy);
fgets(baza[i].telefon, 20, PlikBazy);
fgets(baza[i].email, 35, PlikBazy);
}
printf("\n Baza danych zostala zaladowana! \n");
potwierdzenie();
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Funkcje void sortuj_xxxxx(void) *
* *
* zadania: Sortowanie babelkowe pol *
* personalia z tablicy baza *
* *
* argumenty przekazywane: brak *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void sortuj_imie(void)
{
char temp[50];
BOOL chaos = TRUE;
int i;
printf("\n SORTOWANIE BAZY DANYCH \n");
while (chaos != FALSE)
{
chaos = FALSE;
for (i = 0; i < (numer - 1); i++)
{
if (strcmp(baza[i].personalia, baza[i+1].personalia) == TRUE)
{
/* Personalia */
strcpy(temp, baza[i].personalia);
strcpy(baza[i].personalia, baza[i+1].personalia);
strcpy(baza[i+1].personalia, temp);
/* Adres */
strcpy(temp, baza[i].adres);
strcpy(baza[i].adres, baza[i+1].adres);
strcpy(baza[i+1].adres, temp);
/* Telefon */
strcpy(temp, baza[i].telefon);
strcpy(baza[i].telefon, baza[i+1].telefon);
strcpy(baza[i+1].telefon, temp);
/* Email */
strcpy(temp, baza[i].email);
strcpy(baza[i].email, baza[i+1].email);
strcpy(baza[i+1].email, temp);
chaos = TRUE;
}
}
}
printf("\n Baza danych zostala posortowana! \n");
potwierdzenie();
}
void sortuj_miasto(void)
{
char temp[50];
BOOL chaos = TRUE;
int i;
printf("\n SORTOWANIE BAZY DANYCH \n");
while (chaos != FALSE)
{
chaos = FALSE;
for (i = 0; i < (numer - 1); i++)
{
if (strcmp(baza[i].adres, baza[i+1].adres) == TRUE)
{
/* Personalia */
strcpy(temp, baza[i].personalia);
strcpy(baza[i].personalia, baza[i+1].personalia);
strcpy(baza[i+1].personalia, temp);
/* Adres */
strcpy(temp, baza[i].adres);
strcpy(baza[i].adres, baza[i+1].adres);
strcpy(baza[i+1].adres, temp);
/* Telefon */
strcpy(temp, baza[i].telefon);
strcpy(baza[i].telefon, baza[i+1].telefon);
strcpy(baza[i+1].telefon, temp);
/* Email */
strcpy(temp, baza[i].email);
strcpy(baza[i].email, baza[i+1].email);
strcpy(baza[i+1].email, temp);
chaos = TRUE;
}
}
}
printf("\n Baza danych zostala posortowana! \n");
potwierdzenie();
}
void sortuj_telefon(void)
{
char temp[50];
BOOL chaos = TRUE;
int i;
printf("\n SORTOWANIE BAZY DANYCH \n");
while (chaos != FALSE)
{
chaos = FALSE;
for (i = 0; i < (numer - 1); i++)
{
if (strcmp(baza[i].telefon, baza[i+1].telefon) == TRUE)
{
/* Personalia */
strcpy(temp, baza[i].personalia);
strcpy(baza[i].personalia, baza[i+1].personalia);
strcpy(baza[i+1].personalia, temp);
/* Adres */
strcpy(temp, baza[i].adres);
strcpy(baza[i].adres, baza[i+1].adres);
strcpy(baza[i+1].adres, temp);
/* Telefon */
strcpy(temp, baza[i].telefon);
strcpy(baza[i].telefon, baza[i+1].telefon);
strcpy(baza[i+1].telefon, temp);
/* Email */
strcpy(temp, baza[i].email);
strcpy(baza[i].email, baza[i+1].email);
strcpy(baza[i+1].email, temp);
chaos = TRUE;
}
}
}
printf("\n Baza danych zostala posortowana! \n");
potwierdzenie();
}
void sortuj_email(void)
{
char temp[50];
BOOL chaos = TRUE;
int i;
printf("\n SORTOWANIE BAZY DANYCH \n");
while (chaos != FALSE)
{
chaos = FALSE;
for (i = 0; i < (numer - 1); i++)
{
if (strcmp(baza[i].email, baza[i+1].email) == TRUE)
{
/* Personalia */
strcpy(temp, baza[i].personalia);
strcpy(baza[i].personalia, baza[i+1].personalia);
strcpy(baza[i+1].personalia, temp);
/* Adres */
strcpy(temp, baza[i].adres);
strcpy(baza[i].adres, baza[i+1].adres);
strcpy(baza[i+1].adres, temp);
/* Telefon */
strcpy(temp, baza[i].telefon);
strcpy(baza[i].telefon, baza[i+1].telefon);
strcpy(baza[i+1].telefon, temp);
/* Email */
strcpy(temp, baza[i].email);
strcpy(baza[i].email, baza[i+1].email);
strcpy(baza[i+1].email, temp);
chaos = TRUE;
}
}
}
printf("\n Baza danych zostala posortowana! \n");
potwierdzenie();
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Funkcja void info(void) *
* *
* zadania: prezentowanie informacji o programie *
* *
* argumenty przekazywane: brak *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void info(void)
{
printf("\n INFORMACJE O PROGRAMIE \n");
printf("\nNotatnik Telefoniczy:"
"\n Podstawy Programowania (PRM) - projekt 2"
"\n Program umozliwia wprowadzanie, usuwanie,"
"\n wyszukiwanie, sortowanie oraz przechowywanie"
"\n w pliku danych o numerach telefonicznych\n\n");
potwierdzenie();
}NALEZY JESZCZE DODAĆ PLIK telefony.txt (pusty)
))
Offline