Baza danych [ANSI C]

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
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAXLINE 30
  5.  
  6.  
  7.  
  8.  
  9. /* Struktury */
  10. struct baza {
  11. char *imie;
  12. char *nazwisko;
  13. char *tytul;
  14. int rok;
  15. struct baza *nastepny;
  16. };
  17.  
  18. /*wskaznik do struktury glownej*/
  19. struct baza *nowy; /*dla nowego wpisu */
  20. struct baza *pierwszy=NULL;
  21. struct baza *ostatni=NULL;
  22.  
  23.  
  24.  
  25. wstaw() /*funkcja dodaje wpis do bazy*/
  26. {
  27.  
  28. char imie[MAXLINE];
  29. char nazwisko[MAXLINE];
  30. char tytul[MAXLINE];
  31. int rok;
  32.  
  33. nowy=malloc(sizeof(struct baza)); /*przydziela pamiec dla nowego wpisu*/
  34.  
  35. printf("podaj imie autora:\\n");
  36. scanf("%s",&imie);
  37. nowy->imie=malloc(strlen(imie)+1); /*strlen() oblicza dlugosc lancucha znakow az do napotkania \\0*/
  38. strcpy(nowy->imie,imie); /* strcpy (strTo, strFrom).Funkcja kopiuje tekst z tablicy strFrom do tablicy strTo.
  39. Funkcja kopiuje znak po znaku od początku, aż do końca tablicy lub znaku \'\\0\', który też kopiuje.
  40. Funkcja zwraca wskaźnik na strTo.*/
  41.  
  42. printf("podaj nazwisko autora:\\n");
  43. scanf("%s",&nazwisko);
  44. nowy->nazwisko=malloc(strlen(nazwisko)+1);
  45. strcpy(nowy->nazwisko,nazwisko);
  46.  
  47. printf("podaj tytul ksiazki:\\n");
  48. scanf("%s",&tytul);
  49.  
  50. nowy->tytul=malloc(strlen(tytul)+1);
  51. strcpy(nowy->tytul,tytul);
  52.  
  53. printf("podaj rok wydania ksiazki:\\n");
  54. scanf("%d",&rok);
  55. nowy->rok=rok;
  56. nowy->nastepny=NULL;
  57.  
  58. if(pierwszy==NULL){
  59. pierwszy=ostatni=nowy;
  60. return 0;
  61. }
  62.  
  63. ostatni->nastepny=nowy;
  64. ostatni=nowy;
  65. }
  66.  
  67. /*wskStr->pole - wybór pola ze struktury – zwraca wartość wybranego pola*/
  68.  
  69.  
  70. void wypisz() {
  71. int i=0;
  72. struct baza * tmp=pierwszy; /*tmp - na "tymczasowe" dane */
  73.  
  74.  
  75. while(tmp!=NULL) { /* jesli baza nie jest pusta to wykonaj petle */
  76. i++;
  77. printf("wpis nr %d:\\n", i);
  78. printf("Imie autora: %s\\n",tmp->imie);
  79. printf("Nazwisko autora: %s\\n",tmp->nazwisko);
  80. printf("Tytul ksiazki: %s\\n",tmp->tytul);
  81. printf("Rok wydania: %d\\n",tmp->rok);
  82. printf("\\n");
  83. tmp=tmp->nastepny; /* przesuwamy wsk aż znajdziemy ostatni element */
  84. }
  85.  
  86. }
  87.  
  88. void szukaj_ksiazki()
  89. {
  90. struct baza *tmp=pierwszy;
  91. char tytul[MAXLINE];
  92. int znaleziono=0;
  93.  
  94.  
  95.  
  96. printf("wpisz tytul szukanej ksiazki:\\n");
  97. scanf("%s",&tytul);
  98. while(tmp!=NULL){ /*jesli pamiec nie jest pusta, to wykonaj petle*/
  99. if(strcmp(tmp->tytul,tytul)==0){ /*strcmp () porownuje 2 napisy */
  100. printf("Imie autora: %s\\n",tmp->imie);
  101. printf("Nazwisko autora: %s\\n",tmp->nazwisko);
  102. printf("Tytul ksiazki: %s\\n",tmp->tytul);
  103. printf("Rok wydania: %d\\n",tmp->rok);
  104. printf("\\n");
  105. znaleziono=1;
  106.  
  107. }
  108.  
  109. tmp=tmp->nastepny; /* przesuwamy wsk aż znajdziemy ostatni element */
  110. }
  111. if(znaleziono==0) /* jesli nie znaleziono to poinformuj! */
  112. printf("Niestety ksiazki nie znaleziono\\n");
  113.  
  114. }
  115.  
  116.  
  117.  
  118. void zapisz()
  119. {
  120. char s[MAXLINE]; /*zmienna trzymajaca nazwe pliku*/
  121. FILE * f; /*wskaznik do pliku*/
  122.  
  123.  
  124.  
  125.  
  126. printf("Podaj nazwe pliku: ");
  127. scanf("%s", s);
  128. f=fopen(s, "w"); /*"w" - otwarcie pliku do zapisu*/
  129.  
  130. nowy = pierwszy;
  131. while(nowy != NULL) { /*jesli wpis nie jest pusty to zapisz do pliku*/
  132. fprintf(f, " %s\\n", nowy->imie);
  133. fprintf(f, " %s\\n", nowy->nazwisko);
  134. fprintf(f, " %s\\n", nowy->tytul);
  135. fprintf(f, " %d\\n", nowy->rok);
  136.  
  137. nowy = nowy -> nastepny; /* przesuwamy wsk aż znajdziemy ostatni element */
  138. }
  139. fclose(f); /*zamknij plik*/
  140. }
  141.  
  142.  
  143. void czytaj_plik() {
  144. char s[MAXLINE];
  145. FILE * f; /*wskaznik do pliku*/
  146. struct baza * tmp;
  147. int i;
  148.  
  149. printf("Podaj nazwe pliku: ");
  150. scanf("%s", s);
  151. f=fopen(s, "r"); /* "r" - otwarcie pliku do odczytu */
  152.  
  153. while(!feof(f)) { /* feof-Funkcja zwraca wartość niezerową jeżeli napotka koniec pliku tekstoweg*/
  154. tmp= calloc(1, sizeof(struct baza));
  155.  
  156. tmp->imie=calloc(30, 1); /*calloc(size_t nmeb, size_t size); czyli dlugosc 30 i rozmiar 1,
  157. przydziela pamięć dla nmeb elementów o rozmiarze size każdy i zeruje przydzieloną pamięć.
  158. nmeb - liczba elementów, dla których ma być przydzielona pamięć
  159. size - rozmiar (w bajtach) pamięci do zarezerwowania bądź rozmiar pojedynczego elementu
  160. calloc zwraca wskaźnik do nowo przydzielonego bloku pamięci, jeżeli przydzielanie pamięci się powiodło*/
  161. fscanf(f, "%s\\n", s);
  162. strcpy(tmp->imie, s);
  163.  
  164. tmp->nazwisko=calloc(30, 1);
  165. fscanf(f, "%s\\n", s);
  166. strcpy(tmp->nazwisko, s); /* strcpy (strTo, strFrom).Funkcja kopiuje tekst z tablicy strFrom do tablicy strTo.
  167. Funkcja kopiuje znak po znaku od początku, aż do końca tablicy lub znaku \'\\0\', który też kopiuje.
  168. Funkcja zwraca wskaźnik na strTo.*/
  169.  
  170. tmp->tytul=calloc(30, 1);
  171. fscanf(f, "%s\\n", s);
  172. strcpy(tmp->tytul, s);
  173.  
  174. fscanf(f, "%d\\n", &i);
  175. tmp->rok=i;
  176.  
  177. tmp->nastepny=NULL;
  178. if(pierwszy==NULL){
  179. pierwszy=ostatni=tmp;
  180.  
  181. }
  182. else {
  183. ostatni->nastepny=tmp;
  184. ostatni=tmp;
  185. }
  186.  
  187. }
  188.  
  189. fclose(f); /*zamknij plik*/
  190. }
  191.  
  192. void menu()
  193. {
  194. int zn;
  195. zn = 1;
  196. while(zn != 0)
  197. {
  198.  
  199. printf("\\nCo chcesz robic ?\\n\\n");
  200. printf("1 - Dodaj nowa ksiazke do bazy\\n");
  201. printf("2 - Wypisz baze\\n");
  202. printf("3 - Wyszukaj ksiazke w bazie\\n");
  203. printf("4 - Wczytaj baze z pliku .txt\\n");
  204. printf("5 - Zapisz baze do pliku .txt\\n");
  205. printf("0 - Wyjscie z programu\\n\\n");
  206. scanf("%d", &zn);
  207. printf("\\n");
  208. switch (zn)
  209. {
  210. case 1 : wstaw(); break;
  211. case 2 : wypisz(); break;
  212. case 3 : szukaj_ksiazki(); break;
  213. case 4 : czytaj_plik(); break;
  214. case 5 : zapisz(); break;
  215. }
  216. }
  217. }
  218.  
  219.  
  220. int main(int argc, char *argv[])
  221. {
  222. menu();
  223. return 0;
  224. }

Komentarze

Popularne posty z tego bloga

[c++] Lista wskaznikowa

[c++] słowniki - haszowanie - haszowanie otwarte

[ANSI C][LINUX] Wysyłanie i obsługa sygnałów