BAZA DANYCH - Ansi C - PLZ HELP :/

0

Potrzebuję nagłej pomocy :-o, do srody musze miec skonczony program "BAZA PŁYT CD" w jezyku ANSI C, baza na liscie dwukierunkowej, czytanie z pliku, zapis, sortowanie itd.

MAM PROSBĘ, czy ktokolwiek posiada kod zrodlowy (DO JĘZYKA C, nie c++) takiej bazy? Czy tez moze wie gdzie znalezc.

PROSZĘ O INFO :/, mam malo czasu, a od tego zalezy moje zaliczenie.

W internecie nie potrafilem znalezc nic poza bazami w C++, a one duzo sie roznia od tych z C.

BŁAGAM O POMOC! (jezeli ktos posiada taki kod zrodlowy, lub podobnej bazy, w jezyku czystym c prosze o wyslanie na wwwkuba(malpa)poczta.onet.pl )

0

struct datalist{
datalist* nx;
datalist* pr;
char* nazwa;
char* sciezka;
char* opis;
};

struct cd{
cd* nx;
cd* pr;
int cdnr;
datalist* dl;
}*baza=0; // =NULL

// struktura bazy: lista list

odwolujesz sie (ansi c) np.:

(*baza).nx // zamiast baza->nx
(baza).dl // baza->dl
(
((baza).nx)).nx // baza->nx->nx
(
((*baza).dl)).opis // baza->dl->opis

Do przydzielania i zwalniania uzywasz funkcji malloc()/realloc()/free , a nie new i delete. Tablic nie opisuję ( zamiast tablica[index] piszesz ((tablica+index)) ), bo takiej struktury tu nie masz. Zamiast strumieni (klas) używasz albo uchwytów z io, albo FILE z stdio. I tyle. Każdy program napisany w cpp (o ile nie ma klas, czy struktur z metodami) mozna przetłumaczyć na ansi... Może o jeszcze czyms (częściowo) absoletnym zapomniałem.

// sorki masz tablice :] char* ;p
((((*baza).dl)).opis+index) // baza->dl->opis[index]

0

Tego sie szczerze mowiac obawialem :), nie sposob teraz znalezc programy napisane w C, a na uczelni jeszcze istnieje "stadium" w ktorym trzeba przerabiac ten material (ale na co i po co :/)...

Najwiekszy problem mam z tymi tablicami char'ow, w pascalu i c++ bez problemu biore stringi i reszta staje sie prosta, ale w C jest trudniej :(, podobnie wlasnie róznica z new i malloc, gdzie new tworzy od razu element np. strukture, a malloc daje wskaznik na wolna pamiec, aaaa jednym slowem wiecej babraniny :/, a dla mnie czarna magia.

Teraz mam cale swieta z glowy, czeka mnie pisanie bazy danych :(.

Thx 4 help anyway :), ALE JAKBY KTOS NATRAFIL NA TEGO POSTA i mial gdzies takowa baze lub namiary na nia to BARDZO prosze o info, bo nie jestem pewien czy dam rade...

P.S. chiba ze trafilby sie jakis mocno zaawansowany programista, dla ktorego napisanie 1 czy 2 funkcji nie robi problemu, ustawilo by mnie funkcja czytania/zapisu z/do pliku binarnego i funkcja wykorzystujaca malloc/free (np. dodawanie elem. do listy dwukierunkowej) + deklaracje uzytych zmiennych (strukturka z 3 polami char i 2 wskaznikami next i prev). Dzieki temu reszte potrafilbym bez problemu analogicznie napisac.

0

Nikt za cibie nie napisze. Wszystko, co potrzebowałeś do pracy napisałem. Swoją drogą ciesz się, że musisz pisać w notacji ANSI, a nie np. K&R. I zapamiętaj C++ i C to cały czas ten sam język.

Pracowitych swiąt.

0

Siedzę po nocy i piszę swoj programik :], mam juz sporo, ale jest problem :-o, do tej pory mam napisane 2 funkcje z menu (1. dodaj element, 2. Pokaz/usun). Ale one nie działają :(, czy ktos widzi tutaj dlaczego? :(, jest to moj pierwszy program w c, do tej pory pisalem w pascalu i najprawdopodobniej bledem jest jakies male g...., ale nie wiem co :/.

#include <stdio.h>
#include <stdlib.h>

int getch(void);
void clrscr(void);
void gotoxy(int x, int y);
int UsunElement(struct OpisCD *glowa, struct OpisCD *temp);
void DodajElement(void);
int EdytujElement(struct OpisCD *temp);

struct OpisCD
  {
    char zespol[30];
    char nazwacd[30];
    int rok;
    char wytwornia[30];
    char pozyczony[30];
    char czas[30];
    struct OpisCD *nastepny, *poprzedni;
  };

struct OpisCD *glowa=NULL;
char sortowany;
int ilosc=0;

int PorownajElementy(char sortowany, struct OpisCD *wsk1, struct OpisCD *wsk2)
{
int i=0;
switch (sortowany)
        {
        case '1': if (wsk1->zespol < wsk2->zespol) i=1;
        break;
        case '2': if (wsk1->nazwacd < wsk2->nazwacd) i=1;
        break;
        case '3': if (wsk1->wytwornia < wsk2->wytwornia) i=1;
        break;
        case '4': if (wsk1->rok < wsk2->rok) i=1;
        break;
        }
return i;
}

int DodajDoPosortowanej(struct OpisCD *glowa, char zespol[30], char nazwacd[30],
                        int rok, char wytwornia[30], char pozyczony[30],
                        char czas[30])
{
struct OpisCD *temp, *dodawany;
int i, z;
dodawany = malloc(sizeof(struct OpisCD));
if (dodawany!=NULL) exit(0);

//for (i=0;i<30;i++)
{
dodawany->zespol[0] = zespol[0];
//dodawany->nazwacd = nazwacd;
//dodawany->wytwornia = wytwornia;
//dodawany->pozyczony = pozyczony;
//dodawany->czas = czas;
}
dodawany->rok = rok;

if (glowa==NULL)
{
        glowa = dodawany;
        dodawany->nastepny = NULL;
        dodawany->poprzedni = NULL;
}
else if (PorownajElementy(sortowany,dodawany,glowa)=='1')
{
        dodawany->poprzedni=NULL;
        dodawany->nastepny=glowa;
        glowa->poprzedni=dodawany;
        glowa=dodawany;
}
else
{
        temp=glowa;
        z=0;
        while ((temp->nastepny!=NULL) & (z=0))
        {
                temp=temp->nastepny;
                if (PorownajElementy(sortowany,dodawany,temp)=='1')
                {
                        temp->poprzedni->nastepny=dodawany;
                        dodawany->poprzedni=temp->poprzedni;
                        dodawany->nastepny=temp;
                        temp->poprzedni=dodawany;
                        z=1;
                }
        }
        if (z==0)
        {
                temp->nastepny=dodawany;
                dodawany->poprzedni=temp;
                dodawany->nastepny=NULL;
        }
}
ilosc=ilosc+1;
temp = NULL;
return 0;
}

int PokazUsun(void)
{
struct OpisCD *temp;
char putemp;
int numercd=1;
temp = glowa;
while (temp!=NULL)
{
        printf(" Numer CD: %d\n", numercd);
        printf(" Zespol: %s\n", temp->zespol);
        printf(" Nazwa CD:: %s\n", temp->nazwacd);
        printf(" Rok: %d\n", temp->rok);
        printf(" Wytwornia: %s\n", temp->wytwornia);
        printf(" Pozyczony: %s\n", temp->pozyczony);
        printf(" Czas Plyty: %s\n", temp->czas);
        gotoxy(62,13);
        printf("| Menu:          |\n"); gotoxy(62,14);
        printf("| P - poprzedni  |\n"); gotoxy(62,15);
        printf("| N - nastepny   |\n"); gotoxy(62,16);
        printf("| U - usun       |\n"); gotoxy(62,17);
        printf("| E - edytuj     |\n"); gotoxy(62,18);
        printf("| W - powrot     |\n"); gotoxy(62,19);
        printf("==================\n");
        putemp = getch();
        switch (putemp){
            case 'P', 'p':
                if ((temp->poprzedni)!=NULL)
                {
                        temp=temp->poprzedni;
                        numercd = numercd -11;
                }      break;
            case 'N', 'n':
                if ((temp->nastepny)!=NULL)
                {
                        temp=temp->nastepny;
                        numercd = numercd +1;
                }       break;
            case 'U', 'u':
                gotoxy(1,21);
                printf("Czy chcesz usunac element? (T/N)\n");
                putemp=getch();
                if ((putemp='t') || (putemp='T'))
                {
                        UsunElement(glowa,temp);
                        return 0;
                }
                gotoxy(1,21);
                printf("                                \n");
                break;
            case 'E', 'e': EdytujElement(temp); break;
            case 'W', 'w': temp = NULL; break;
        }
}
return 0;
}

int UsunElement(struct OpisCD *glowa, struct OpisCD *temp)
{
if (temp->poprzedni==NULL)
{
        glowa=temp->nastepny;
        if (temp->nastepny!=NULL)
                temp->nastepny->poprzedni=NULL;
}
else if (temp->nastepny==NULL)
{
        temp->poprzedni->nastepny=NULL;
}
else
{
        temp->poprzedni->nastepny=temp->nastepny;
        temp->nastepny->poprzedni=temp->poprzedni;
}
free(temp);
ilosc = ilosc-1;
return 0;
}

int EdytujElement(struct OpisCD *temp)
{
char roktemp[4];
gotoxy(1,21);
printf("Edycja istniejacego elementu.\n");
gotoxy(1,14);
printf("                                                            ");
gotoxy(1,14);
printf(" Zespol: ");
gets(temp->zespol);
printf("                                                            ");
gotoxy(1,15);
printf(" Nazwa CD: ");
gets(temp->nazwacd);
printf("                                                            ");
gotoxy(1,16);
printf(" Rok: ");
*roktemp='1';
while ((atoi(roktemp)<1900) || (atoi(roktemp)>2020))
{
        gotoxy(7,16);
        gets(roktemp);
        if ((atoi(roktemp)<1900) || (atoi(roktemp)>2020))
        {
                gotoxy(1,22);
                printf("Blad. Wpisz ponownie! (wartosc miedzy 1900 a 2020).");
        }
}
temp->rok=atoi(roktemp);
gotoxy(1,22);
printf("                                                            ");
gotoxy(1,17);
printf(" Wytwornia: ");
gets(temp->wytwornia);
printf("                                                            ");
gotoxy(1,18);
printf(" Pozyczony: ");
gets(temp->pozyczony);
printf("                                                            ");
gotoxy(1,19);
printf(" Czas plyty: ");
gets(temp->czas);
return 0;
}

int WczytajPlik(void)
{
FILE *plik;
char tmp[4], zespol[30], nazwacd[30], wytwornia[30], pozyczony[30], czas[30];
int rok, numer, i;

plik = fopen("baza.db","r");
if (plik == NULL)
{
        printf("\n   Nie mozna otworzy pliku bazy danych! \n");
        gets(tmp);
        return 0;
}
fscanf(plik, "%d\n", &numer);
	for (i = 0; i < numer; i++)
	{
		fgets(zespol, 30, plik);
		fgets(nazwacd, 30, plik);
		fgets(tmp, 30, plik);
                fgets(wytwornia, 30, plik);
		fgets(pozyczony, 30, plik);
		fgets(czas, 30, plik);
                rok=atoi(tmp);
                DodajDoPosortowanej(glowa,zespol,nazwacd,rok,wytwornia,pozyczony,czas);
	}
return 0;
}


void DodajElement()
{
char zespol[30], nazwacd[30], rok[30], wytwornia[30], pozyczony[30], czas[30];
int x;
puts("Dodawanie nowego elementu. \n");
printf("Nazwa zespolu: ");
gets(zespol);
printf("Nazwa plyty: ");
gets(nazwacd);
printf("Rok Wydania: ");
gets(rok);
while ((atoi(rok)<1900) | (atoi(rok)>2020))
{
        printf("Blad. Wpisz ponownie! (wartosc miedzy 1900 - 2020): ");
        gets(rok);
}
x=atoi(rok);
printf("Wytwornia: ");
gets(wytwornia);
printf("Pozyczony: ");
gets(pozyczony);
printf("Czas trwania plyty [min]: ");
gets(czas);
DodajDoPosortowanej(glowa,zespol,nazwacd,x,wytwornia,pozyczony,czas);
printf("Wpis Dodano");
}

int main(void)
{
char i;
sortowany='1';
WczytajPlik();
do
{
  clrscr();
  printf("Baza Plyt CD ver. 1.0                    Autor: Ja\n");
  printf("\n");
  printf("                                         Ilosc plyt w bazie:\n");
  printf("\n");
  printf("   Menu Glowne:\n");
  printf("   1.Dodaj element.\n");
  printf("   2.Pokaz/Edytuj/Usun elementy.\n");
  printf("   3.Sortuj baze.\n");
  printf("   4.Wyszukaj element.\n");
  printf("   5.Wyczysc baze.\n");
  printf("   6.Wyjscie\n");
  printf("================================================================================\n");
  i = getch();
  switch(i)
  {
    case '1': DodajElement();
    break;
    case '2': PokazUsun();
    break;
    case '3': printf("3Podales %c\n", i);
    break;
    case '4': printf("4Podales %c\n", i);
    break;
    case '5': printf("5Podales %c\n", i);
    break;
    case '6': printf("6Podales %c\n", i);
    break;
  }

i = getch();
}
while (i!='6');
return 0;
}

A druga sprawa to miejsce w kodzie, w funkcji dodajdoposortowanej, jak przypisac wartosci string[30] do struktura->string[30] :)? funkcja for po 1 znaku? czy jak? :/

Czy ktos potrafi powiedziec mi czemu program wiesza sie przy przegladaniu elementu (po uprzednim dodaniu), piszac ze jest NULL :/.

0

plz plz plz, jestem w kropce, wie ktos gdzie robie blad :/?

1 użytkowników online, w tym zalogowanych: 0, gości: 1