baza danych c++

Odpowiedz Nowy wątek
2011-09-21 16:46
0

Witam, jestem uczniem klasy IV technikum informatycznego i narobiłem sobie lekkich zaległości byłbym bardzo wdzięczny jeżeli ktoś mógłby opisać/ wytłumaczyć ten o to program co w którym momencie się dzieje. Za najlepsze wytłumaczenie oferuję doładowanie o kwocie 5/10 zł. Liczę na waszą pomoc

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

struct Slownik
{
    int numer;         ///   numer w bazie
    string pol;
    string ang;

};

void
dodaj_do_bazy(char *in,Slownik *s,int n)

{

ofstream plik;

plik.open(in);
for(int i=0;i<n;++i)

{

s[i].numer = i+1;

plik<<s[i].numer<<endl;

cout<<
"Podaj slowko polskie :\n";

cin>>s[i].pol;

plik<<s[i].pol<<endl;

cout<<
"Podaj slowko angielskie :\n";

cin>>s[i].ang;
if (i==n-1)

plik<<s[i].ang;
else

plik<<s[i].ang<<endl;
//plik<<"\n\n";

}

plik.close();

}

///funkcja liczaca rozmiar tablicy struktur 
///do ktorej wpisujemy dane

int rozmiar(char *in)
{
    string pol, ang;
    int numer;

    ifstream plik;
    plik.open(in);
    int rozm = 0;

    while(!plik.eof())
    {
        plik>>numer;
        plik>>pol;
        plik>>ang;

        rozm += 1;
    }

    plik.close();
    return rozm;
}

///funkcja wyciagajaca z pliku wyrazy do tablicy struktur
void zpliku(char *in,Slownik *s,int n)
{
    ifstream plik;
    plik.open(in);

    for(int i=0;i<n;++i)
    {
        plik>>s[i].numer;
        plik>>s[i].pol;
        plik>>s[i].ang;
    }
}

/// funkja wypisujaca wszystkie wyrazy na ekran

void wypisz(Slownik *s,int n)
{
    for(int i=0;i<n;++i)
    {
        cout<<"Nr."<<s[i].numer<<endl;
        cout<<"Slowko polskie :             "<<s[i].pol<<endl;
        cout<<"Slowko angielskie :          "<<s[i].ang<<endl;

        cout<<"-----------------------------------\n";
    }
}

void pol_ang(Slownik *s,int n)
{
  string wzor;

  bool k = 0;
  cout << "polsko - angielski" << endl;
  cout << "wpisz szukane slowo: "; cin >> wzor;

 for(int i=0;i<n;++i)
  {
    if(wzor == s[i].pol)
    {
      cout << s[i].pol << " - " << s[i].ang;
      cout << "\n";
      k = 1;
    }
  }
  if(k == 0) cout << "nie ma takiego slowa w bazie\n";
}

void ang_pol(Slownik *s,int n)
{
  string wzor;

  bool k = 0;
  cout << "angielsko - polski" << endl;
  cout << "wpisz szukane slowo: "; cin >> wzor;

 for(int i=0;i<n;++i)
  {
    if(wzor == s[i].ang)
    {
      cout << s[i].ang << " - " << s[i].pol;
      cout << "\n";
      k = 1;
    }
  }
  if(k == 0) cout << "nie ma takiego slowa w bazie\n";
}

int main(int argc,char **argv)
{
    cout<<argc<<endl;
    cout<<argv[1]<<endl;
    cout<<"     =======================================================\n";
    cout<<"     ========================SLOWNIK========================\n";
        cout<<"     ======================BAZA DANYCH======================\n";
    cout<<"     =======================================================\n";

    int znak;

    ///przykladowa nazwa bazy danych

    argv[1] = "baza.txt";

    do
    {
    cout<<"     1. Utworz baze danych (plik)                wcisnij - 1\n";
    cout<<"     2. Dopisz nowe slowo                        wcisnij - 2\n";
    cout<<"     3. Pokaz wszystkie slowa w slowniku         wcisnij - 3\n";
        cout<<"     4. Slownik pol - ang                        wcisnij - 4\n";
    cout<<"     5. Slownik ang - pol                        wcisnij - 5\n";
    cout<<"     6. Usuwanie wybranego slowa                 wcisnij - 6\n";

    cout<<"     -------------------------------------------------------\n";
    cout<<"     Wyjdz z programu                          wcisnij - 0\n";
    cout<<"     -------------------------------------------------------\n";

    cin>>znak;

    switch(znak)
    {
        case 1:
        {
            int n;
            cout<<"Ile slowek wprowadzasz do bazy ?\n";
            cin>>n;
            Slownik *s = new Slownik [n];
            dodaj_do_bazy(argv[1],s,n);
            delete [] s;
            break;
        }
        case 2:
        {

            int ile;
            cout<<"Ile slowek dopisujesz do bazy ?\n";
            cin>>ile;
            int roz = rozmiar(argv[1])+ile;
            int rozm = rozmiar(argv[1]);

            Slownik *s = new Slownik [roz];
            zpliku(argv[1],s,rozm);

            for(int i=rozm;i<roz;++i)
            {
                s[i].numer = i+1;
                cout<<"Podaj slowko polskie :\n";
                cin>>s[i].pol;
                cout<<"Podaj slowko angielskie :\n";
                cin>>s[i].ang;

            }

            ofstream plik;
            plik.open(argv[1]);
            for(int i=0;i<roz;++i)
            {
                plik<<s[i].numer<<endl;
                plik<<s[i].pol<<endl;
                if (i==roz-1)
                   plik<<s[i].ang;
                else
                    plik<<s[i].ang<<endl;
                //plik<<"\n\n";
            }
            plik.close();
            delete [] s;
            break;
        }
        case 3:
        {
            cout<<"Słowa w slowniku :\n\n";

            int n = rozmiar(argv[1]);
            Slownik *s = new Slownik [n];
            zpliku(argv[1],s,n);
            wypisz(s,n);

            delete [] s;
            break;
        }

      case 4 :{

            int n = rozmiar(argv[1]);
            Slownik *s = new Slownik [n];
            zpliku(argv[1],s,n);
            pol_ang(s,n);

            delete [] s;
            break;

          }

      case 5 :{

            int n = rozmiar(argv[1]);
            Slownik *s = new Slownik [n];
            zpliku(argv[1],s,n);
            ang_pol(s,n);

            delete [] s;
            break;

          }
      case 6: {
           int n=rozmiar(argv[1]);
           Slownik *s = new Slownik[n];
           zpliku(argv[1],s,n);
           cout<<"Ktore slowo chcesz usunac?\n";
           string slowo;
           cin>>slowo;
           ofstream plik;
           plik.open(argv[1]);
           int c=0;
           for (int i=0;i<n;i++)
           {
               if ((slowo!=s[i].pol) and (slowo!=s[i].ang))
               {
                c+=1;
                plik<<c<<endl;
                plik<<s[i].pol<<endl;
                if ((i==n-1) or (c==n-1))
                plik<<s[i].ang;
                else
                plik<<s[i].ang<<endl;
                }
           }
           break;
           delete [] s;
      }

        case 0:
        {
            cout<<"Zakonczono prace z baza danych\n";

            break;
        }
    }
    }while(znak != 0);

    return 0;
}
A jak ty to sobie wyobrażasz, uważasz, że ktoś Ci komentarze będzie pisał przy każdej linijce? - ujemny 2011-09-21 18:13
ej, podał wynagrodzenie, powinny lecieć plusy :D - krwq 2011-09-22 01:39
Nom kuszące strasznie, ale swoją drogą dziwne, że w czwartej klasie ma takie rzeczy u mnie było trochę ciekawiej. - ujemny 2011-09-22 10:33

Pozostało 580 znaków

2011-09-22 11:07
0

masz dwie pierwsze dwie funkcje, na reszte nie mam sily (szybciej bym to od poczatku napisal i mialbys 3x mniej kodu):

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

// struktura (rekord) przechowujacy dane
struct Slownik
{
  int numer;
  string pol;
  string ang;
};

// procedura dodajaca tlumaczenia wyrazow pol-ang (rekord) do bazy
// poza tym funkcja ta, poza tym ze ma zapisywac te rekordy rowniez
// prosi uzytkownika zeby te rekordy dodal (taki gratis niepotrzebny)
// parametry:
// in - plik do ktorego jest zapisany rekord (dlaczego ten parametr nazywa sie in to ja nie wiem)
// s - tablica rekordow
// n - ilosc dodawanych rekordow
void dodaj_do_bazy(char* in, Slownik* s, int n)
{
  // strumien (plik) wyjsciowy - czyli taki do ktorego bedzie zapis do ktorego beda zapisywane rekordy
  ofstream plik;

  // przypisanie strumieniowi fizycznego pliku na dysku (otwarcie do zapisu)
  plik.open(in);

  // petla, ktora wykonuje czynnosci po kolei na kazdym rekordzie
  // aktualnie przetwarzany rekord to 's[i]', a numer przetwarzanego rekordu
  // liczony od 0 to 'i'
  for (int i=0; i<n; ++i)
    {
      // przypisanie numeru aktualnemu rekordowi,
      // wczesniej napisalem ze i przechowuje numer liczony od 0,
      // ktos przypisuje tuaj numerowi numer liczony od 0
      // nie bede komentowal sensownosci tego pola, bo nie wiem czemu to ma sluzyc
      s[i].numer = i+1;

      // zapisanie do strumienia (pliku) numeru oraz znaku konca linii (entera)
      // endl poza dodaniem nowej linii powoduje rowniez ze strumien jest automatycznie zapisany na dysku (flush)
      // co zupelnie nie ma sensu z tego powodu ze bedzie to tylko spowalniac
      plik << s[i].numer << endl;

      // wtf
      // funkcja powinna zapisac do bazy a nie prosic o podanie slowka
      // a jesli juz ma tak dzialac to po co ta tablica w parametrze
      // kolejna bezsensowna rzecz...
      cout << "Podaj slowko polskie :\n";

      // zapisanie wprowadzonego (w konsoli) przez uzytkownika wyrazu polskiego do pola pol aktualnego rekordu
      // czyli dalsza czesc tej bezsensownosci
      cin >> s[i].pol;

      // zapisanie do strumienia rekordu pol aktualnego rekordu, czyli tego wprowadzonego przez uzytkownika
      // w koncu ktos robi to co powinien od samego poczatku
      plik << s[i].pol << endl;

      // prosba o podanie slowka angielskiego wypisana na konsoli
      // ta funkcja mija sie z celem...
      cout << "Podaj slowko angielskie:\n";

      // zapisanie do pola 'ang' aktualnie przetwarzanego rekordu slowka angielskiego
      cin >> s[i].ang;

      // jesli jest to ostatni rekord
      if (i==n-1)
        // to zapisz slowko angielskie bez entera na koncu
        plik << s[i].ang;
      else
        // jesli nie (jest ostatni) to zapisz slowko z enterem na koncu
        plik << s[i].ang << endl;
      // (to nie ma sensu)
    }

  // zapisuje jeszcze nie przeslane dane ze strumienia do pliku
  // oraz zamyka strumien (plik), przez co nie jest on juz skojarzony z plikiem
  plik.close();

}

// komentarz do opisu funkcji
///funkcja liczaca rozmiar tablicy struktur
///do ktorej wpisujemy dane

// liczy ile slowek jest w pliku
// parametr in oznacza nazwe pliku w ktorym jest baza
int rozmiar(char* in)
{
  // zmienne tymczasowe, ktore beda przechowywac wczytane slowka oraz numer rekordu
  string pol, ang;
  int numer;

  // strumien wejsciowy (plik odczytywany)
  ifstream plik;

  // otwarcie pliku / skojarzenie strumienia z plikiem
  plik.open(in);

  // zmienna ktora bedzie przechowywac ile rekordow udalo sie juz wczytac
  int rozm = 0;

  // dopoki nie koniec pliku
  while (!plik.eof())
    {
      // wczytuj numer, wyraz polski, wyraz angielski
      plik>>numer;
      plik>>pol;
      plik>>ang;

      // zwiekszenie ilosci wczytanych rekordow
      rozm += 1;
    }

  // ta petle mozna bylo zrobic tak i dzialalaby tak samo:
  // while(!plik.eof())
  //   plik >> numer >> pol >> ang;
  // rozm = numer;

  // zamkniecie pliku (plik po otwarciu jest w systemie w pewien sposob blokowany
  // i to jest moment w ktorym go odblokowujemy)
  plik.close();

  // zwrocenie rozmiaru
  return rozm;
}

░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2011-09-22 12:07
1

Napisane od nowa (wyszlo jednak 2x krocej)

#include <iostream>
#include <string>
#include <fstream>
#include <map>

using namespace std;

typedef map<string,string> Tlumaczenia;

class Slownik
{
public:
  Tlumaczenia pol_ang,ang_pol;

  void clear()
    {
      pol_ang.clear();
      ang_pol.clear();
    }
  void dodaj(const string& pol, const string& ang)
    {
      pol_ang[pol] = ang;
      ang_pol[ang] = pol;
    }
  void usun_pl(const string& pol)
    {
      Tlumaczenia::iterator it = pol_ang.find(pol);
      if (it==pol_ang.end())
        return;
      ang_pol.erase(it->second);
      pol_ang.erase(pol);
    }
  size_t size() { return pol_ang.size(); }
  void wczytaj(const string& nazwapliku)
    {
    clear();
    ifstream plik(nazwapliku);
    if (plik.fail())
      return;
    string pol,ang;
    while (!plik.eof())
      {
        plik >> pol >> ang;
        dodaj(pol,ang);
      }
    plik.close();
  }
  bool zapisz(const string& nazwapliku)
  {
    ofstream plik(nazwapliku);
    if (plik.fail())
      return false;
    for (Tlumaczenia::iterator it = pol_ang.begin(); it!=pol_ang.end(); ++it)
      plik << it->first << "\t" << it->second << "\n";
    return true;
  }
  void wypisz()
  {
    if (size()==0)
      {
        cout << "Slownik jest pusty!" << endl;
        return;
      }

    cout << "Polskie\tAngielskie\n";
    for (Tlumaczenia::const_iterator it = pol_ang.begin(); it!=pol_ang.end(); ++it)
      cout << it->first << "\t" << it->second << "\n";
    cout << endl;
  }
};

int main()
{
  cout<<"     =======================================================\n";
  cout<<"     ========================SLOWNIK========================\n";
  cout<<"     ======================BAZA DANYCH======================\n";
  cout<<"     =======================================================\n";
  Slownik slownik;
  string line;

  bool koniec = false;
  while (!koniec)
    {
      cout<<"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
      cout<<"     1. Zapisz baze danych                       wcisnij - 1\n";
      cout<<"     2. Wczytaj baze danych                      wcisnij - 2\n";
      cout<<"     3. Dopisz nowe slowo                        wcisnij - 3\n";
      cout<<"     4. Usuwanie wybranego slowa                 wcisnij - 4\n";
      cout<<"     5. Pokaz wszystkie slowa w slowniku         wcisnij - 5\n";
      cout<<"     6. Slownik pol - ang                        wcisnij - 6\n";
      cout<<"     7. Slownik ang - pol                        wcisnij - 7\n";
      cout<<"     -------------------------------------------------------\n";
      cout<<"     0. Wyjdz z programu                         wcisnij - 0\n";
      cout<<"     -------------------------------------------------------\n";

      int znak;
      cin >> znak;
      cin.ignore();

      switch (znak)
        {
          case 0: koniec = true; break;
          case 1:
            {
              string nazwa;
              cout << "Podaj nazwe pliku: ";
              getline(cin,nazwa);
              if (slownik.zapisz(nazwa))
                cout << "Baza zostala zapisana!\n";
              else
                cout << "Blad podczas zapisu!\n";
              break;
            }
          case 2:
            {
              string nazwa;
              cout << "Podaj nazwe pliku: ";
              getline(cin,nazwa);
              slownik.wczytaj(nazwa);
              cout << "Odczytano " << slownik.size() << " tlumaczen.\n";
              break;
            }
          case 3:
            {
              string pol,ang;
              cout << "Podaj slowko polskie: ";
              cin >> pol;
              cout << "Podaj slowko angielskie: ";
              cin >> ang;
              slownik.dodaj(pol,ang);
              cout << "Slowko zostalo dodane.\n";
              break;
            }
          case 4:
            {
              string pol;
              cout << "Podaj slowko polskie: ";
              cin >> pol;
              slownik.usun_pl(pol);
              cout << "Usunieto.\n";
              break;
            }
          case 5:
            {
              slownik.wypisz();
              break;
            }
          case 6:
            {
              string pol;
              cout << "Podaj slowko polskie: ";
              cin >> pol;
              Tlumaczenia::iterator it = slownik.pol_ang.find(pol);
              if (it==slownik.pol_ang.end())
                cout << "Podanego wyrazu nie ma w slowniku.\n";
              else
                cout << "Ang: " << it->second << "\n";
              break;
            }
          case 7:
            {
              string ang;
              cout << "Podaj slowko angielskie: ";
              cin >> ang;
              Tlumaczenia::iterator it = slownik.ang_pol.find(ang);
              if (it==slownik.ang_pol.end())
                cout << "Podanego wyrazu nie ma w slowniku.\n";
              else
                cout << "PL: " << it->second << "\n";
              break;
            }
          default: cout << "Nieprawidlowa opcja!\n";
        }
      if (znak!=0)
        {
          if (znak!=1 && znak!=2 && znak!=5)
            cin.ignore();
          cout << "Nacisnij ENTER, aby kontynuowac..." << endl;
          getline(cin,line);
        }
    }

  return 0;
}

░█░█░█░█░█░█░█░█░█░█░█░
Ty chyba się nudzisz :) - MiL 2011-09-22 12:12
nie, ale czasami muszę coś odmóżdżającego zrobić na pobudkę :P - krwq 2011-09-22 12:13
A może on dostał ten kod i musi tamten znać :D - xeo545x39 2011-09-22 14:06

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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