Poniższy program opiera się wyłącznie na wprowadzaniu typu char. Co zrobić, zeby numer telefonu można było wpisywać tylko numerycznie? Wiem, ze char akceptuje wszystko ale mi chodzi o to, zeby inne znaki niz cyfry były odrzucane przez program.
/* * * * * * * * * * * * * 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 */
/* * * * * * * * * * * * * * Komentarz ogolny * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Nazwa: KSIAZKA TELEFONICZNA wersja ANSI-C 0.8d (DOS/UNIX) *
* Autor: Piotr Grabowski [email protected] www.kursc.prv.pl *
* Opis: Program umozliwia wprowadzanie, wyszukiwanie, *
* usuwanie, sortowanie oraz przechowywanie w pliku *
* danych o numerach telefonicznych *
* Data: 10.2000 *
* Copyright: public domain *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * Makrodefinicje i definicje struktur * * * * * * * */
/* starsze kompilatory */
#ifndef EXIT_SUCCESS
#define EXIT_SUCCESS 0
#endif
#ifndef EXIT_FAILURE
#define EXIT_FAILURE 1
#endif
#define MAX 30 /* Maksymalna liczba wpisow w bazie danych */
#define INPUT 4 /* Maksymalna dlugosc wprowadzanego indeksu */
#define FALSE 0
#define TRUE 1
#define DOS /* Wybierz syst. oper.: DOS lub UNIX (ANSI - zaden) */
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 */
} 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 zachowaj_baze(void); /* Zapisuje baze danych do pliku */
int wczytaj_baze(void); /* Laduje baze z pliku do pamieci */
void sortuj_baze(void); /* Sortuje baze wg pola personalia */
void info(void); /* Wyswietla 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)
{
#ifdef DOS
system("cls");
#elif UNIX
system("clear");
#else
#define ROWS 40
for (int i = 0; i < ROWS; i++)
printf("\n"); /* Wyswietl puste linie */
#undef ROWS
#endif
}
void /*inline*/ potwierdzenie(void)
{
#ifdef DOS
printf("\n ");
system("pause");
#else
printf("\n Nacisnij ENTER, aby kontynuowac...");
while (getchar() != '\n');
#endif
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Glowna funkcja int main(void) *
* *
* zadania: wyswietlanie glownego menu programu; *
* wywolywanie odpowiednich funkcji - *
* modulow programu. *
* *
* argumenty przekazywane: brak *
* argumenty zwracane do systemu: kod pomyslnego *
* zakonczenia programu (EXIT_SUCCESS) *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int main(void)
{
char wybor;
do /* Petla do-while musi wykonac sie przynajmniej raz */
{
/* Menu glowne programu */
wyczysc_ekran();
printf("\n KSIAZKA TELEFONICZNA wersja ANSI-C 0.8d \n\n");
printf(" [1] Wyswietl wszystkie wpisy w bazie \n\n"
" [2] Przedstaw informacje o osobie \n\n"
" [3] Znajdz wpis w bazie danych \n\n"
" [4] Dodaj wpis do bazy danych \n\n"
" [5] Usun wpis z bazy \n\n"
" [6] Zachowaj baze danych \n\n"
" [7] Zaladuj baze danych \n\n"
" [8] Sortowanie bazy danych \n\n"
" [9] Informacje o programie \n\n"
" [0] Wyjscie \n\n");
/* Pobierz dane od uzytkownika */
printf(" Twoj wybor: ");
wybor = getchar();
fflush(stdin); /* Wyczysc bufor klawiatury */
wyczysc_ekran();
/* Wywolanie funkcji w zaleznosci od wyboru uzytkownika */
switch (wybor)
{
case '1' : wszystkie_wpisy();
break;
case '2' : dane_osoby();
break;
case '3' : szukaj_wpisu();
break;
case '4' : dodaj_wpis();
break;
case '5' : usun_wpis();
break;
case '6' : zachowaj_baze();
break;
case '7' : wczytaj_baze();
break;
case '8' : sortuj_baze();
break;
case '9' : info();
break;
case '0' :
break;
default :
{
printf("\n Nie ma takiej opcji! \n");
potwierdzenie();
}
break;
}
} while (wybor != '0');
printf("\n ZAMYKANIE PROGRAMU \n");
potwierdzenie();
return EXIT_SUCCESS;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Funkcja int wszystkie_wpisy(void) *
* *
* zadania: wyswietlanie wszystkich wpisow w bazie *
* *
* argumenty przekazywane: brak *
* argumenty zwracane : kod zakonczenia: *
* EXIT_SUCCESS (sukces) : baza danych nie jest pusta *
* lub *
* EXIT_FAILURE (niepowodzenie): w bazie nie ma zadnych wpisow *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
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");
potwierdzenie();
return EXIT_FAILURE;
}
/* Wyswietl wszystkie osoby wraz z numerami ich indeksow */
for (i = 0; i < numer; i++)
{
printf("\n %d %s", i+1, baza[i].personalia);
/* Zatrzymaj program po zapelnieniu ekranu */
if ((i + 1)%10 == 0)
{
potwierdzenie();
wyczysc_ekran();
}
}
printf("\n Koniec danych \n");
potwierdzenie();
return EXIT_SUCCESS;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Funkcja int dane_osoby(void) *
* *
* zadania: wyswietlanie informacje o wpisie *
* odpowiadajacemu podanemu indeksowi *
* *
* argumenty przekazywane: brak *
* argumenty zwracane : kod zakonczenia: *
* EXIT_SUCCESS (sukces) : podany indeks istnieje w bazie *
* lub *
* EXIT_FAILURE (niepowodzenie): podany indeks jest niepoprawny *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int dane_osoby(void)
{
char wpis[INPUT]; /* Tekst wpisany przez uzytkownika */
int index; /* Wpis do prezentacji */
printf("\n PREZENTOWANIE DANYCH \n");
printf("\n Wprowadz indeks osoby: ");
index = atoi(gets(wpis)); /* Konwersja typu danych */
if (index < 1 || index > numer) /* Nie ma takiego indeksu! */
{
printf("\n Indeks nie jest poprawny! \n");
potwierdzenie();
return EXIT_FAILURE;
}
/* Drukuj dane na ekranie */
printf("\n Nazwisko i imie: %s", baza[index - 1].personalia);
printf("\n Miejscowosc: %s", baza[index - 1].adres);
printf("\n Telefon: %s", baza[index - 1].telefon);
potwierdzenie();
return EXIT_SUCCESS;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Funkcja int szukaj_wpisu(void) *
* *
* zadania: wyszukanie informacje w bazie - *
* podanego nazwiska lub miejscowosci *
* *
* argumenty przekazywane: brak *
* argumenty zwracane : kod zakonczenia: *
* EXIT_SUCCESS (sukces) : znaleziono minimum jeden wpis *
* lub *
* EXIT_FAILURE (niepowodzenie): nic nie zostalo znalezione *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int szukaj_wpisu(void)
{
char szukana[30]; /* Szukane nazwisko lub miejscowosc */
int index, k = 0; /* Zmienne pomocnicze */
printf("\n WYSZUKIWANIE INFORMACJI W BAZIE \n");
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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
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();
return EXIT_FAILURE;
}
printf("\n To wszystkie wpisy jakie znaleziono! \n");
potwierdzenie();
return EXIT_SUCCESS;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Funkcja int dodaj_wpis(void) *
* *
* zadania: dodawanie nowego wpisu do bazy danych *
* *
* argumenty przekazywane: brak *
* argumenty zwracane : kod zakonczenia: *
* EXIT_SUCCESS (sukces) : dodano nowe informacje do bazy *
* lub *
* EXIT_FAILURE (niepowodzenie): baza nie zostala zmieniona *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int dodaj_wpis(void)
{
printf("\n DODAWANIE WPISU DO BAZY DANYCH \n");
if (numer >= MAX) /* Baza danych jest pelna! */
{
printf("\n Baza danych jest pelna! \n");
potwierdzenie();
return EXIT_FAILURE;
}
/* 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);
/* 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();
return EXIT_FAILURE;
}
/* Do kazdego pola dodaj znacznik konca lini */
strcat(baza[numer].personalia, "\n");
strcat(baza[numer].adres, "\n");
strcat(baza[numer].telefon, "\n");
numer++; /* Zwieksz liczbe wpisow o jeden */
printf("\n Wpis zostal dodany do bazy danych! \n");
potwierdzenie();
return EXIT_SUCCESS;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Funkcja int usun_wpis(void) *
* *
* zadania: usuwanie wpisu z bazy danych *
* *
* argumenty przekazywane: brak *
* argumenty zwracane : kod zakonczenia: *
* EXIT_SUCCESS (sukces) : usunieto informacje z bazy *
* lub *
* EXIT_FAILURE (niepowodzenie): baza nie zostala zmieniona *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int usun_wpis(void)
{
char wpis[INPUT]; /* Tekst wpisany przez uzytkownika */
int kasuj_nr; /* Wpis do usuniecia */
printf("\n USUWANIE WPISU Z BAZY \n");
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();
return EXIT_FAILURE;
}
/* 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();
return EXIT_SUCCESS;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Funkcja int zachowaj_baze(void) *
* *
* zadania: zapisywanie bazy danych do pliku telefony.dbs *
* *
* argumenty przekazywane: brak *
* argumenty zwracane : kod zakonczenia: *
* EXIT_SUCCESS (sukces) : baza zostala zapisana *
* lub *
* EXIT_FAILURE (niepowodzenie): baza nie zostala zapisana *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int zachowaj_baze(void)
{
FILE *PlikBazy; /* Wskaznik do pliku bazy */
int i; /* Zmienna pomocnicza */
char znak;
printf("\n ZAPISYWANIE DANYCH DO PLIKU telefony.dbs \n");
printf("\n Jestes pewien? [T]ak/[N]ie ");
znak = getchar();
fflush(stdin);
if (toupper(znak) != 'T')
{
printf("\n Baza danych nie zostala zapisana \n");
potwierdzenie();
return EXIT_FAILURE;
}
PlikBazy = fopen("telefony.dbs", "w" ); /* Otworz do pisania */
/* Nie mozna otworzyc pliku telefony.dbs! */
if (PlikBazy == NULL)
{
printf("\n Nie mozna otworzyc pliku bazy danych! \n");
potwierdzenie();
return EXIT_FAILURE;
}
/* 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);
}
printf("\n Baza danych zostala zachowana! \n");
potwierdzenie();
return EXIT_SUCCESS;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Funkcja int wczytaj_baze(void) *
* *
* zadania: wczytywanie bazy danych z pliku telefony.dbs *
* *
* argumenty przekazywane: brak *
* argumenty zwracane : kod zakonczenia: *
* EXIT_SUCCESS (sukces) : baza zostala zapisana *
* lub *
* EXIT_FAILURE (niepowodzenie): baza nie zostala zapisana *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int wczytaj_baze(void)
{
FILE *PlikBazy; /* Wskaznik do pliku bazy */
int i; /* Zmienna pomocnicza */
printf("\n WCZYTYWANIE DANYCH Z PLIKU telefony.dbs \n");
/* Otworz plik tylko do odczytu */
PlikBazy = fopen("telefony.dbs", "r");
/* Nie mozna otworzyc pliku telefony.dbs!*/
if (PlikBazy == NULL)
{
printf("\n Nie mozna otworzy pliku bazy danych! \n");
potwierdzenie();
return EXIT_FAILURE;
}
/* 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();
return EXIT_FAILURE;
}
/* 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);
}
printf("\n Baza danych zostala zaladowana! \n");
potwierdzenie();
return EXIT_SUCCESS;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Funkcja void sortuj_baze(void) *
* *
* zadania: Sortowanie babelkowe pol *
* personalia z tablicy baza *
* *
* argumenty przekazywane: brak *
* argumenty zwracane : brak *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void sortuj_baze(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);
chaos = TRUE;
}
}
}
printf("\n Baza danych zostala posortowana! \n");
potwierdzenie();
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Funkcja void info(void) *
* *
* zadania: prezentowanie informacji o programie *
* *
* argumenty przekazywane: brak *
* argumenty zwracane : brak *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void info(void)
{
printf("\n INFORMACJE O PROGRAMIE \n");
printf("\n Nazwa: Ksiazka telefoniczna wersja ANSI-C 0.8d"
"\n Autor: Piotr Grabowski [email protected] www.kursc.prv.pl"
"\n Opis: Program umozliwia wprowadzanie, usuwanie,"
"\n wyszukiwanie, sortowanie oraz przechowywanie"
"\n w pliku danych o numerach telefonicznych"
"\n Data: 10.2000"
"\n Licencja: public domain \n");
printf("\n Jeszcze do zrobienia: \n"
"\n 1) Wybor pliku do zapisu"
"\n 2) Opcja programu - pomoc \n");
printf("\n Poprawiono juz do tej wersji: \n"
"\n 1) Blad zwiazany z buforem klawiatury"
"\n 2) Bledy zapisu i odczytu danych z pliku"
"\n 3) Wiele innych niedociagniec... \n");
potwierdzenie();
}
/* * * * * * * * * * * * KONIEC PLIKU telefony.c * * * * * * * * * */