Baza danych [ANSI C]
- Pobierz link
- X
- Inne aplikacje
tu program zaliczeniowy z którym miałem maaaaasę i jeszcze więcej kłopotów.
może nie jest napisany idealnie, brak mu parę rzeczy, no ale - działa :P
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define MAXLINE 30
- /* Struktury */
- struct baza {
- char *imie;
- char *nazwisko;
- char *tytul;
- int rok;
- struct baza *nastepny;
- };
- /*wskaznik do struktury glownej*/
- struct baza *nowy; /*dla nowego wpisu */
- struct baza *pierwszy=NULL;
- struct baza *ostatni=NULL;
- wstaw() /*funkcja dodaje wpis do bazy*/
- {
- char imie[MAXLINE];
- char nazwisko[MAXLINE];
- char tytul[MAXLINE];
- int rok;
- nowy=malloc(sizeof(struct baza)); /*przydziela pamiec dla nowego wpisu*/
- printf("podaj imie autora:\\n");
- scanf("%s",&imie);
- nowy->imie=malloc(strlen(imie)+1); /*strlen() oblicza dlugosc lancucha znakow az do napotkania \\0*/
- strcpy(nowy->imie,imie); /* strcpy (strTo, strFrom).Funkcja kopiuje tekst z tablicy strFrom do tablicy strTo.
- Funkcja kopiuje znak po znaku od początku, aż do końca tablicy lub znaku \'\\0\', który też kopiuje.
- Funkcja zwraca wskaźnik na strTo.*/
- printf("podaj nazwisko autora:\\n");
- scanf("%s",&nazwisko);
- nowy->nazwisko=malloc(strlen(nazwisko)+1);
- strcpy(nowy->nazwisko,nazwisko);
- printf("podaj tytul ksiazki:\\n");
- scanf("%s",&tytul);
- nowy->tytul=malloc(strlen(tytul)+1);
- strcpy(nowy->tytul,tytul);
- printf("podaj rok wydania ksiazki:\\n");
- scanf("%d",&rok);
- nowy->rok=rok;
- nowy->nastepny=NULL;
- if(pierwszy==NULL){
- pierwszy=ostatni=nowy;
- return 0;
- }
- ostatni->nastepny=nowy;
- ostatni=nowy;
- }
- /*wskStr->pole - wybór pola ze struktury – zwraca wartość wybranego pola*/
- void wypisz() {
- int i=0;
- struct baza * tmp=pierwszy; /*tmp - na "tymczasowe" dane */
- while(tmp!=NULL) { /* jesli baza nie jest pusta to wykonaj petle */
- i++;
- printf("wpis nr %d:\\n", i);
- printf("Imie autora: %s\\n",tmp->imie);
- printf("Nazwisko autora: %s\\n",tmp->nazwisko);
- printf("Tytul ksiazki: %s\\n",tmp->tytul);
- printf("Rok wydania: %d\\n",tmp->rok);
- printf("\\n");
- tmp=tmp->nastepny; /* przesuwamy wsk aż znajdziemy ostatni element */
- }
- }
- void szukaj_ksiazki()
- {
- struct baza *tmp=pierwszy;
- char tytul[MAXLINE];
- int znaleziono=0;
- printf("wpisz tytul szukanej ksiazki:\\n");
- scanf("%s",&tytul);
- while(tmp!=NULL){ /*jesli pamiec nie jest pusta, to wykonaj petle*/
- if(strcmp(tmp->tytul,tytul)==0){ /*strcmp () porownuje 2 napisy */
- printf("Imie autora: %s\\n",tmp->imie);
- printf("Nazwisko autora: %s\\n",tmp->nazwisko);
- printf("Tytul ksiazki: %s\\n",tmp->tytul);
- printf("Rok wydania: %d\\n",tmp->rok);
- printf("\\n");
- znaleziono=1;
- }
- tmp=tmp->nastepny; /* przesuwamy wsk aż znajdziemy ostatni element */
- }
- if(znaleziono==0) /* jesli nie znaleziono to poinformuj! */
- printf("Niestety ksiazki nie znaleziono\\n");
- }
- void zapisz()
- {
- char s[MAXLINE]; /*zmienna trzymajaca nazwe pliku*/
- FILE * f; /*wskaznik do pliku*/
- printf("Podaj nazwe pliku: ");
- scanf("%s", s);
- f=fopen(s, "w"); /*"w" - otwarcie pliku do zapisu*/
- nowy = pierwszy;
- while(nowy != NULL) { /*jesli wpis nie jest pusty to zapisz do pliku*/
- fprintf(f, " %s\\n", nowy->imie);
- fprintf(f, " %s\\n", nowy->nazwisko);
- fprintf(f, " %s\\n", nowy->tytul);
- fprintf(f, " %d\\n", nowy->rok);
- nowy = nowy -> nastepny; /* przesuwamy wsk aż znajdziemy ostatni element */
- }
- fclose(f); /*zamknij plik*/
- }
- void czytaj_plik() {
- char s[MAXLINE];
- FILE * f; /*wskaznik do pliku*/
- struct baza * tmp;
- int i;
- printf("Podaj nazwe pliku: ");
- scanf("%s", s);
- f=fopen(s, "r"); /* "r" - otwarcie pliku do odczytu */
- while(!feof(f)) { /* feof-Funkcja zwraca wartość niezerową jeżeli napotka koniec pliku tekstoweg*/
- tmp= calloc(1, sizeof(struct baza));
- tmp->imie=calloc(30, 1); /*calloc(size_t nmeb, size_t size); czyli dlugosc 30 i rozmiar 1,
- przydziela pamięć dla nmeb elementów o rozmiarze size każdy i zeruje przydzieloną pamięć.
- nmeb - liczba elementów, dla których ma być przydzielona pamięć
- size - rozmiar (w bajtach) pamięci do zarezerwowania bądź rozmiar pojedynczego elementu
- calloc zwraca wskaźnik do nowo przydzielonego bloku pamięci, jeżeli przydzielanie pamięci się powiodło*/
- fscanf(f, "%s\\n", s);
- strcpy(tmp->imie, s);
- tmp->nazwisko=calloc(30, 1);
- fscanf(f, "%s\\n", s);
- strcpy(tmp->nazwisko, s); /* strcpy (strTo, strFrom).Funkcja kopiuje tekst z tablicy strFrom do tablicy strTo.
- Funkcja kopiuje znak po znaku od początku, aż do końca tablicy lub znaku \'\\0\', który też kopiuje.
- Funkcja zwraca wskaźnik na strTo.*/
- tmp->tytul=calloc(30, 1);
- fscanf(f, "%s\\n", s);
- strcpy(tmp->tytul, s);
- fscanf(f, "%d\\n", &i);
- tmp->rok=i;
- tmp->nastepny=NULL;
- if(pierwszy==NULL){
- pierwszy=ostatni=tmp;
- }
- else {
- ostatni->nastepny=tmp;
- ostatni=tmp;
- }
- }
- fclose(f); /*zamknij plik*/
- }
- void menu()
- {
- int zn;
- zn = 1;
- while(zn != 0)
- {
- printf("\\nCo chcesz robic ?\\n\\n");
- printf("1 - Dodaj nowa ksiazke do bazy\\n");
- printf("2 - Wypisz baze\\n");
- printf("3 - Wyszukaj ksiazke w bazie\\n");
- printf("4 - Wczytaj baze z pliku .txt\\n");
- printf("5 - Zapisz baze do pliku .txt\\n");
- printf("0 - Wyjscie z programu\\n\\n");
- scanf("%d", &zn);
- printf("\\n");
- switch (zn)
- {
- case 1 : wstaw(); break;
- case 2 : wypisz(); break;
- case 3 : szukaj_ksiazki(); break;
- case 4 : czytaj_plik(); break;
- case 5 : zapisz(); break;
- }
- }
- }
- int main(int argc, char *argv[])
- {
- menu();
- return 0;
- }
- Pobierz link
- X
- Inne aplikacje
Komentarze
Prześlij komentarz