Witam
Miałem za zadanie stworzenie prostej bazy danych w C. Uporałem się ze wszystkim i przy dzieleniu kodu na pliki mam problemy. Przed podziałem program kompiluje się bez nawet ostrzeżeń, natomiast po podziale jest masa błędów.
Gdyby ktoś wiedział co jest nie tak w tym.
Usunąłem większą cześć kodu głównego pliku, aby nie było aż tak wiele scrolowania. Oczywiście najpierw wybrałem stworzenie projektu, a później po kolei dodawałem kolejne pliki do projektu. Błędy pojawiają się w pliku obliczeniowe.c w linijce: "el_listy *wsk=poczatek;" a dalej to już jest ich pełno. Zupełnie tak, jakby w innych plikach nie było "widać" struktury.
główny plik:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "obliczeniowe.h"
#include "obsluga.h"
typedef struct element
{
struct element *next; //wskaznik do nastepnego elementu na liscie
char *imie;
char *nazwisko;
char *kierunek;
int rok;
int nr_albumu;
int wiek;
} el_listy;
el_listy *dodaj;
el_listy *poczatek=NULL; // wskazniki do poczatku i konca listy
el_listy *koniec=NULL;
int lp = 0;
obliczeniowe.h
#ifndef obliczeniowe_h
#define obliczeniowe_h
void wyszukiwanie(int w);
void sortowanie(int z);
#endif
obliczeniowe.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "obliczeniowe.h"
void wyszukiwanie(int w)
{
int i=0,p,blad;
char check[20];
char ch[20];
fprintf(stdout, "\n\n Podaj szukana wartosc: ");
if(w==3 || w==5 || w==6) //w zaleznosci jaka opcje wybralismy bedziemy wczytywac albo int albo char
while(fscanf(stdin, "%d", &p) != 1) //dopóki nie uda się wczytać
{
czerwony();
fprintf(stdout, " Bledne wprowadzenie danych. \n");
bialy();
fprintf(stdout, " Podaj szukana wartosc: ");
while((blad = getchar()) != '\n' && blad != EOF);
}
if(w==1 || w==2)
fscanf(stdin, "%s",&check);
if(check[0]>96 && check[0]<123)
check[0]=check[0]-32;
if(w==4)
fscanf(stdin, "%s",&ch);
if(ch[0]>64 && ch[0]<91)
ch[0]=ch[0]+32;
el_listy *wsk=poczatek;
while(wsk->next!=NULL)
{
switch(w)
{
case 1:
{
if(strcmp(poczatek->imie, check) != 0) //sprawdzamy czy glowa listy jest szukanym elementem, jesli nie usuwamy ja
{
el_listy *usuwany=poczatek;
poczatek=usuwany->next;
free(usuwany); //zwalniamy pamiec
wsk=poczatek;
}
if(strcmp(wsk->next->imie, check) != 0) // to samo dla pozostałych elementów
{
el_listy *usuwany=wsk->next;
wsk->next=usuwany->next;
free(usuwany); //zawlniamy pamiec
}
else
wsk=wsk->next;
} break;
case 2:
{
if(strcmp(poczatek->nazwisko, check) != 0)
{
el_listy *usuwany=poczatek;
poczatek=usuwany->next;
free(usuwany);
wsk=poczatek;
}
if(strcmp(wsk->next->nazwisko, check) != 0)
{
el_listy *usuwany=wsk->next;
wsk->next=usuwany->next;
free(usuwany);
}
else
wsk=wsk->next;
} break;
case 3:
{
if(poczatek->wiek!=p)
{
el_listy *usuwany=poczatek;
poczatek=usuwany->next;
free(usuwany);
wsk=poczatek;
}
if(wsk->next->wiek!=p)
{
el_listy *usuwany=wsk->next;
wsk->next=usuwany->next;
free(usuwany);
}
else
wsk=wsk->next;
} break;
case 4:
{
if(strcmp(poczatek->kierunek, ch) != 0)
{
el_listy *usuwany=poczatek;
poczatek=usuwany->next;
free(usuwany);
wsk=poczatek;
}
if(strcmp(wsk->next->kierunek, ch) != 0)
{
el_listy *usuwany=wsk->next;
wsk->next=usuwany->next;
free(usuwany);
}
else
wsk=wsk->next;
} break;
case 5:
{
if(poczatek->rok!=p)
{
el_listy *usuwany=poczatek;
poczatek=usuwany->next;
free(usuwany);
wsk=poczatek;
}
if(wsk->next->rok!=p)
{
el_listy *usuwany=wsk->next;
wsk->next=usuwany->next;
free(usuwany);
}
else
wsk=wsk->next;
} break;
case 6:
{
if(poczatek->nr_albumu!=p)
{
el_listy *usuwany=poczatek;
poczatek=usuwany->next;
free(usuwany);
wsk=poczatek;
}
if(wsk->next->nr_albumu!=p)
{
el_listy *usuwany=wsk->next;
wsk->next=usuwany->next;
free(usuwany);
}
else
wsk=wsk->next;
} break;
}
}
}
void sortowanie(int z)
{
int i=0,j,min,b,l=1; // zmienne pomocnicze
el_listy tab[lp],a; // tworzymy tablice z liczba rowna liczbie rekordow w bazie
el_listy *wsk=poczatek;
while(wsk!=NULL)
{
tab[i].imie=wsk->imie; // przypisujemy kolejnym indeksom w tablicy kolejne pola na liscie
tab[i].nazwisko=wsk->nazwisko; // dzieki temu bedziemy mielei łatwy dostep do kazdego elementu na liscie co ułatwi sortwoanie
tab[i].wiek=wsk->wiek;
tab[i].kierunek=wsk->kierunek;
tab[i].rok=wsk->rok;
tab[i].nr_albumu=wsk->nr_albumu;
wsk=wsk->next;
i++;
}
czerwony();
fprintf(stdout, "\n\n Lp. Imie Nazwisko Wiek Kierunek Rok Nr albumu \n");
bialy();
for(i=0;i<lp;i++) // sortujemy metoda przez wybieranie
{
min=i;
for(j=i;j<lp;j++)
{
switch(z) // w zaleznosci jaka opcje wybralismy sortujemy wedlug dowolnego pola
{
case 1:
{
if(strcmp(tab[min].imie,tab[j].imie)>0)
min=j;
} break;
case 2:
{
if(strcmp(tab[min].nazwisko,tab[j].nazwisko)>0)
min=j;
} break;
case 3:
{
if(tab[min].wiek>tab[j].wiek)
min=j;
} break;
case 4:
{
if(strcmp(tab[min].kierunek,tab[j].kierunek)>0)
min=j;
} break;
case 5:
{
if(tab[min].rok>tab[j].rok)
min=j;
} break;
case 6:
{
if(tab[min].nr_albumu>tab[j].nr_albumu)
min=j;
} break;
}
}
a=tab[i];
tab[i]=tab[min];
tab[min]=a;
}
for(i=0;i<lp;i++,l++) //wypisujemy posortowana baze
{
fprintf(stdout, "\n%3d. %13s %13s %5d %15s %5d %10d", l, tab[i].imie,tab[i].nazwisko, tab[i].wiek, tab[i].kierunek, tab[i].rok, tab[i].nr_albumu);
}
}
obsluga.h
#ifndef obsluga_h
#define obsluga_h
void wczytywanie();
void zapis();
#endif
obsluga.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "obsluga.h"
void wczytywanie()
{
FILE *plik;
plik=fopen("baza.txt","r"); //otwiera pli baza.txt, "r"-tylko do odczytu
char im[20];
char naz[20];
char kier[20];
int r, nra,w;
koniec=NULL; // koniec ustawiamy na początku
if(plik==NULL) // jesli nie ma pliku przerywamy funkcje
return;
while(feof(plik)==0)
{
dodaj=malloc(sizeof(el_listy));
fscanf(plik,"%s",im);
if(im[0]>96 && im[0]<123)
im[0]=im[0]-32;
dodaj->imie=malloc( sizeof(char) * strlen(im));
strcpy( dodaj->imie, im );
fscanf(plik,"%s",naz);
if(naz[0]>96 && naz[0]<123)
naz[0]=naz[0]-32;
dodaj->nazwisko=malloc( sizeof(char) * strlen(naz));
strcpy( dodaj->nazwisko, naz );
fscanf(plik,"%d",&w);
dodaj->wiek=w;
fscanf(plik,"%s",kier);
if(kier[0]>64 && kier[0]<91)
kier[0]=kier[0]+32;
dodaj->kierunek=malloc( sizeof(char) * strlen(kier));
strcpy( dodaj->kierunek, kier );
fscanf(plik,"%d",&r);
dodaj->rok=r;
fscanf(plik,"%d",&nra);
dodaj->nr_albumu=nra;
dodaj->next=NULL;
if (koniec == NULL)
poczatek = koniec = dodaj;
else
{
koniec->next = dodaj;
koniec = dodaj;
}
}
fclose(plik);//zamykamy plik
}
void zapis()
{
int lp = 1;
FILE *plik;
plik=fopen("baza.txt","w"); //otwiera pli baza.txt, "r"-tylko do odczytu
el_listy *wsk=poczatek; // wskaznik ustawiamy na poczatek listy
while(wsk!=NULL)
{
fprintf(plik, "%13s", wsk->imie); // zapisujemy do pliku kolejne pola
fprintf(plik, "%13s", wsk->nazwisko);
fprintf(plik, "%5d", wsk->wiek);
fprintf(plik, "%15s", wsk->kierunek);
fprintf(plik, "%5d", wsk->rok);
fprintf(plik, "%10d", wsk->nr_albumu);
wsk=wsk->next;
lp++;
}
fclose(plik); //zamykamy plik
}