[C++] Program do tworzenia baz danych

0

Witam,

Mam do napisania taki program:

Napisać program umożliwiający tworzenie prostej bazy danych. Baza danych może zawierać wiele
tzw. tabel złożonych z nazwanych kolumn różnego typu. Każda tabela ma nazwę, a nazwy oraz
typy kolumn są określane podczas tworzenia tabeli. Zaimplementować możliwość tworzenia kolumn
zawierających ciągi znaków, daty oraz liczby o stałej, ustalonej precyzji (np 2 miejsca po przecinku).
Program powinien umożliwiać:
• Tworzenie tabel o dowolnej liczbie kolumn,
• Usuwanie tabel,
• Dodawanie wierszy (rekordów) do tabel,
• Wyszukiwanie wierszy w tabelach wg warunku nałożonego na kolumnę (warunek może być
typu <, >, <=, >= oraz ==,
• Usuwanie wierszy na podstawie kryterium nałożonego na kolumnę,
• Modyfikacja wartości w wierszach.
• Zapis i odczyt danych do pliku binarnego.

To mój pierwszy tego typu projekt. Mam pewien pomysł ale chciałbym zasięgnąć jeszcze waszej opinii.

Napiszę sobie 3 klasy: Baza, Tabela i Kolumna.
W Bazie będę miał spis wszystkich Tabel, które wchodzą w jej skład oraz nazwę pliku z ustawieniami Bazy. Podczas otwierania Bazy będę wczytywał wszystkie dane z pliku.
Przy tworzeniu obiektu typu Tabela będę tworzył odpowiednią liczbę obiektów typu kolumna (tyle ile zawiera Tabela). Dane w kolumnach (konkretne wiersze) będą przechowywane w postaci list jednokierunkowych (lub dwukierunkowych). W pliku przechowującym ustawienia Tabeli będę miał zapisane czy dana kolumna ma przechowywać dane tekstowe czy może wartości liczbowe i na tej podstawie będą tworzone te odpowiednie listy.

Trochę chaotycznie to opisałem ale mam nadzieję, że mnie zrozumiecie.
Może macie jakieś inne pomysły jak stworzyć taki program? Na pewno można to zrobić łatwiej...
Nie chodzi mi o konkretne rozwiązania ale o naprowadzenie na właściwą drogę.

0

Nie możesz skorzystać z gotowego silnika i tylko oprogramować interfejs? Jeśli nie to osobiście wykonałbym ten projekt w oparciu o xml :)

0

Nie mogę...to jest projekt na programowanie obiektowe więc raczej gotowy silnik nie wchodzi w grę.

Chodzi mi raczej o samą ideę, czy dobrze myślę jak to zrobić ? A jeśli nie to jak mogę to zmienić (zrobić łatwiej) ?

0
Maniekas napisał(a)

W pliku przechowującym ustawienia Tabeli będę miał zapisane czy dana kolumna ma przechowywać dane tekstowe czy może wartości liczbowe i na tej podstawie będą tworzone te odpowiednie listy.

na moje oko cały pomysł na bazę danych nie jest zły tylko w tym miejscu chyba użyłbym klasy szablonowej (template) jeśli chodzi o implementację klasy odpowiadającej za kolumny.
Wówczas nie będziesz musiał zapisywać jakie dane ma przechowywać dana kolumna tylko będzie Ci na to jednoznacznie wskazywała nazwa klasy.

0

To jest baza za którą dostałem 6 :d
wiem ze nie jest zgodna z tym co pisałeś ale można zaliczyć do bazy danych :D

#include <cstdlib>
#include <iostream>
#include <fstream> // bliblioteka plików
#include <dirent.h>// biblioteka od folderów (menu1)
using namespace std;
struct
      {
            string imie;
            string nazwisko;
            int wiek;
            int waga;
            int wzrost;           
            union
            {
                 char *kobieta;
                 char *Mezczyzna;
            }plec;               
      }dane;
int main(int argc, char *argv[])
{   
    int koniec=0;
    while(koniec==0)
    {
   int swit;
       cout<<"0. Wyswietlanie listy plikow"<<endl;
       cout<<"1. Wyswietlanie wszystkich danych"<<endl;
       cout<<"2. Odczyt Danych"<<endl;
       cout<<"3. Usuwanie danych"<<endl;
       cout<<"4. Edytowanie danych"<<endl;
       cout<<"5. Dodawanie danych"<<endl;
       cout<<"6. Koniec"<<endl;
cin>>swit;
switch(swit)
{
case  0:
      {
         DIR *dp;
         struct dirent *ep;
                dp = opendir (".\\");
                if (dp != NULL)
                {
                 string nazwa;
                 string pocz;
                 string roz;
                 int x1, x2;
                while (ep = readdir (dp))
                      {
                      nazwa = ep->d_name;
                      pocz = nazwa.substr(0,5);
                      if (pocz == "proj_")
                       {
                          x1 = nazwa.length()-3;
                            x2 = nazwa.length();
                              roz = nazwa.substr(x1,x2);
                                   if (roz == "txt")
                                   {
                                        cout << nazwa << endl;
                                   }     
                        }
                       }
                }
      }
cout<<"============================="<<endl;
 break;
 case  1:
      {
         char f;                                 
         DIR *dp;
         struct dirent *ep;
                dp = opendir (".\\");
                if (dp != NULL)
                {
                 string nazwa;
                 string pocz;
                 string roz;
                 int x1, x2;
                while (ep = readdir (dp))
                      {
                      nazwa = ep->d_name;
                      pocz = nazwa.substr(0,5);
                      if (pocz == "proj_")
                       {
                          x1 = nazwa.length()-3;
                            x2 = nazwa.length();
                              roz = nazwa.substr(x1,x2);
                                   if (roz == "txt")
                                   {
                                        cout<<nazwa<<endl;
                                        ifstream wys(nazwa.c_str());
                                        while(wys)
                                        {
                                        wys.get(f);
                                        if(wys)
                                        {
                                               cout<<f;
                                        }}
                                        cout<<endl<<"-=-=-=-=-=-=-=-=-"<<endl;                                                                     }     
                        }}
                }
      }
cout<<"============================="<<endl;
 break;
 case  2:
       {
          cout<<"Odczyt danych"<<endl;
          cout<<"jaki plik chcesz odczytac?"<<endl;
           string op;
           cin>>op;
           ifstream oplik(op.c_str());
           if(!oplik) {
             cout << "Nie mozna otworzyc pliku";
               }
                 char c;
                 while(oplik)
                   {
                     oplik.get(c);
                       if(oplik)
                         cout << c;
                           }
           oplik.close();
           cout<<endl;
cout<<"============================="<<endl;
       }       
       break;
 case  3:
       {
           string uplik;
           cout<<"Usuwanie pliku"<<endl;
           cout<<"Podaj pelna nazwe plik"<<endl;
           cin>>uplik;
           if( remove(uplik.c_str()) == -1 )
           perror( "Nie mozna usunac pliku" );
           else {
           printf( "Plik usuniety" ); }
cout<<"============================="<<endl;         
       }
       break;
 case  4:
       {       
       cout<<"Edytowanie danych"<<endl;
          cout<<"jaki plik chcesz edytowac? (nalezy podac pelna nazwe pliku)"<<endl;
           string ep;
           cin>>ep;       
            ifstream eplik(ep.c_str());
            if(!eplik) {
            cout << "Nie mozna otworzyc pliku";
      }
      else
      {
      cout<<"aktualne dane to:"<<endl;
      char c;
      while(eplik)
        {                 
         eplik.get(c);
         if(eplik)
         cout << c;
        }
  eplik.close();
  cout<<endl;
  cout<<"Zmiana danych"<<endl;
  cout<<endl<<"Podaj imie"<<endl;
                 cin>>dane.imie;
                 cout<<"Podaj nazwisko"<<endl;
                 cin>>dane.nazwisko;
                 cout<<"Podaj wiek"<<endl;
                 cin>>dane.wiek;
                 cout<<"Podaj wage"<<endl;
                 cin>>dane.waga;
                 cout<<"Podaj wzrost"<<endl;
                 cin>>dane.wzrost;
                 cout<<"Podaj plec 1-Mezczyzna 2-Kobieta"<<endl;
                 int a;
                 cin>>a;           
                 if(a==1)
                        {
                            dane.plec.Mezczyzna="Mezczyzna";
                        }

                      if (a==2)
                        {
                            dane.plec.kobieta="Kobieta";                           
                        }                     
                 ofstream eplik1(ep.c_str());
                 eplik1<<"Imie: "<<dane.imie<<endl;
                 eplik1<<"Nazwisko: "<<dane.nazwisko<<endl;
                 eplik1<<"Wiek: "<<dane.wiek<<endl;
                 eplik1<<"Waga: :"<<dane.waga<<endl;
                 eplik1<<"Wzrost: "<<dane.wzrost<<endl;
                 if(a==1)
                           {
                           eplik1<<"Plec: "<<dane.plec.Mezczyzna<<endl;
                           }                           
                      if (a==2)
                           {
                           eplik1<<"Plec: "<<dane.plec.kobieta<<endl;                           
                           }     
                 eplik1.close();
                 }
                 cout<<endl;
cout<<"============================="<<endl;
       }
       break;
 //--------------------------------------
 case  5:{   
       string spam = "proj_";
       string nazwa;
       string droz=".txt";
          cout<<"Dodawanie danych - wpisz dowolne slowo."<<endl;
          cout<<"Na podstawie tego słowa zostanie wygenerowana pelna nazwa pliku"<<endl;
          cout<< "przyklad: proj_PODANA_NAZWA.txt"<<endl;
                 FILE *plik;
             cin>>nazwa;
             spam += nazwa+=droz;
                        ifstream tplik(spam.c_str());
                        if(tplik) {
                                   cout << "Plik juz istnieje..."<<endl;
                                   tplik.close();
                                    }
                         else
                         {                         
                 ifstream plik(spam.c_str());                 
                 plik.close();
                 cout<<"Uzupelnianie pliku"<<endl<<"Podaj imie"<<endl;
                 cin>>dane.imie;
                 cout<<"Podaj nazwisko"<<endl;
                 cin>>dane.nazwisko;
                 cout<<"Podaj wiek"<<endl;
                 cin>>dane.wiek;
                 cout<<"Podaj wage"<<endl;
                 cin>>dane.waga;
                 cout<<"Podaj wzrost"<<endl;
                 cin>>dane.wzrost;
                 cout<<"Podaj plec 1-Mezczyzna   2-Kobieta"<<endl;
                 int a;
                 cin>>a;                               
                 if(a==1)
                        {
                            dane.plec.Mezczyzna="Mezczyzna";
                        }                           
                      if (a==2)
                        {
                            dane.plec.kobieta="Kobieta";                           
                        }                                       
                 ofstream zapis(spam.c_str());
                 zapis<<" Imie: "<<dane.imie<<endl;
                 zapis<<"Nazwisko: "<<dane.nazwisko<<endl;
                 zapis<<"Wiek: "<<dane.wiek<<endl;
                 zapis<<"Waga: :"<<dane.waga<<endl;
                 zapis<<"Wzrost: "<<dane.wzrost<<endl;
                 if(a==1)
                           {
                           zapis<<"Plec: "<<dane.plec.Mezczyzna<<endl;
                           }                           
                      if (a==2)
                           {
                           zapis<<"Plec: "<<dane.plec.kobieta<<endl;                           
                           }     
                 zapis.close();
                 cout<<"nazwa twojego nowego pliku to '"<<spam.c_str()<<"'"<<endl;
                 cout<<endl;
cout<<"============================="<<endl;
                      }
                 }                 
       break;
 case  6:{
       koniec=1;
       }
       break;
       }
}
} 

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