baza danych c++

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;
}
 
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;
}
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;
}

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