Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 17. 05. 2009 11:43 — Editoval gladiator01 (18. 05. 2009 14:27)

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

seznam dvd - c++

Ahoj, mohl by mi někdo poradit?

Dělám databázi dvd, vytvořím si objekt a ten poté uložím do pole, když pole vypisuji tak se mi ale vypíše jen poslední záznam víckrát, příkládám zdroják,mohl by mi někdo říci kde dělám chybu nebo navrhnout nějakej lepší způsob jak úkol vyřešit?

Děkuji.


Code:

/*dvd.cpp*/
#include <iostream>
#include"dvd.h"
#include <cstring>
using namespace std;

int Film::pocetDVD = 0;
int Zakaznik::pocetZakazniku = 0;

DVD::DVD(char *jm, char *pr)
{                        
   strcpy(jmeno, jm); 
   strcpy(prijmeni, pr);
}
Film::Film(int iF, char *naz, char *jm, char *pr, int d): DVD(jm, pr)
{
  idF=iF=pocetDVD++;
  strcpy(nazev, naz);
  delka=d; 
}
Zakaznik::Zakaznik(int iVF, int iZ, char *jm, char *pr, int dv, char *naz): DVD(jm, pr)
{
  idZ=iZ=pocetZakazniku++;
  idVF=iVF;
  datumVypujceni=dv;
  strcpy(nazev, naz);
}

ostream& DVD::vypis(ostream& os) const 
{ 
  os << jmeno << " "<< prijmeni;
  return os;
}

// výpis údajů o filmu
ostream& Film::vypis(ostream& os) const 
{
   os << idF << ": " << "Nazev: " << nazev << ", Rezie: ";
   DVD::vypis(os);
   os << ", Delka: " << delka << " min";

   return os;
}

//výpis údajů o zákazníkovi
ostream& Zakaznik::vypis(ostream& os) const 
{
   os << idZ << ": ";
   DVD::vypis(os);
   os << ", Datum vypujceni: " << datumVypujceni << endl;
   os << "\tNazev vypujceneho filmu: " << nazev << ", ID filmu: " << idVF;
   return os;
}

//Vlozi film   
void Init::vloz(DVD *z)
{
   if(pocetDVD<maxPocet)
       DVDPole[pocetDVD++] = z;
}

ostream& operator<< (ostream& os, const Init& f)
{
  cout << "vypisuji DVD:" << endl;
  for (int i=0; i<f.pocetDVD; i++) 
     f.DVDPole[i]->vypis(os)<<endl;
     
  return os;
}

Code:

/*main.cpp*/

#include <iostream>
#include<fstream>
#include"dvd.h"

using namespace std;

int main()
{
  int id, idF, volba,pocetDVD=0;
  char jmeno[25], prijmeni[36], nazev[50];
  int delka, datumVypujceni;
  Film F(idF,nazev,jmeno,prijmeni, delka); 
  Init f(10), z(10);
    
  cout  << endl;
  cout << ">> Klara Hlavacova ************* DATABAZE DVD **************** 8. kvetna 2009 <<";
  ofstream vystup("dvd.bin", ios::out|ios::binary);
  if (vystup.fail()) 
  {
      cout << "Nelze vytvorit soubor dvd.bin\n" << endl;
      system("PAUSE");
      exit(1);
  }
  while(volba!=7)
  {   
    cout  << endl <<"********************************************************************************" << endl << endl ;
    cout << "1-Vypis vsech filmu <> 2-Vypis vypujcenych filmu <> 3-Vypis nevypoujcenych filmu" << endl;
    cout << "  4-vlozeni noveho filmu <> 5-vypujceni filmu <> 6-vraceni filmu <> 7-konec" << endl << endl;
    cout << "--------------------------------------------------------------------------------\n";

    cout << "Zadejte cislo operace: ";
    cin >> volba;
    
  switch(volba)
  {
    //*************************************************************
    case 1:
    {
       cout << f;
       break;
    } 
    //*************************************************************
    case 2:
    break;
    //*************************************************************
    case 3:
    break;
    //*************************************************************
    case 4:
    {  //Film F(idF, "Andrej Rubljov","Andrej","Tarkovskij", 165);       
       int n;
       cout << "Zadej pocet filmu, ktere chces vlozit: ";
       cin >> n;
       for(int i=0; i<n; i++)
       {
         cout << "ZADEJ UDAJE O FILMU: " << endl;
         cout << "Nazev filmu (vice slov oddelit potrzitkem): "; cin >> nazev;
         cout << "Jmeno a prijmeni rezisera: (s mezerou): ";     cin >> jmeno >> prijmeni;                              
         cout << "Delka: ";                                      cin >> delka;
      
         cout <<"------VKLADAM DVD-----" << endl << endl;
         Film F(idF,nazev,jmeno,prijmeni, delka); 
         f.vloz(&F);
       }  
       break;
    }
    //*************************************************************
    case 5:
    {
       //Zakaznik Z(1,id, "Jan","Novak", 20080605, "Andrej Rubljov"); 
       cout << "ZADEJ UDAJE O ZAKAZNIKOVI: " << endl;
       cout << "Jmeno a prijmeni (s mezerou): ";               cin >> jmeno >> prijmeni;                            
       cout << "Datum vypujceni: ";                            cin >> datumVypujceni;
       cout << "Nazev filmu (vice slov oddelit potrzitkem): "; cin >> nazev;
       cout << "id filmu: ";                                   cin >> idF;

       cout <<"------VYPUJCUJI DVD-----" << endl << endl;
       
       Zakaznik Z(idF,id, jmeno,prijmeni, datumVypujceni, nazev); 
       z.vloz(&Z);
       break;
    }
    case 6:
          break;
    //*************************************************************
    default: exit(0); 
   }  
  }
  vystup.close();  
    
  cout << endl;
  system("pause");
  return 0;
}

Code:

/*dvd.h*/
#include <iostream>
using namespace std;

class DVD
{     
     char jmeno[25];
     char prijmeni[36];
   public:  
      DVD(char *jm, char *pr);
      virtual ostream& vypis(ostream&) const;
};

class Film :public DVD
{
     int idF;
     char nazev[25];
     int delka;
     static int pocetDVD;
   
   public:
     Film(int iF, char *naz, char *jm, char *pr, int d);
     virtual ostream& vypis(ostream&) const;
};

class Zakaznik :public DVD
{
     int idZ;
     int idVF;
     int datumVypujceni;
     char nazev[25];
     static int pocetZakazniku;
   
   public:
     Zakaznik(int iVF, int iZ, char *jm, char *pr, int dv, char *naz);
     virtual ostream& vypis(ostream&) const;
};

class Init
{
     DVD **DVDPole;
     int pocetDVD;
     int maxPocet;
    
   public:
     Init(int MP=10)
     {
        maxPocet = MP;
        DVDPole = new DVD*[MP];
        pocetDVD = 0;
     }
     void vloz(DVD* z);
     void odeber(DVD *z);
     //void vypis(Init f);
     friend ostream& operator<<(ostream&, const Init&);
};

Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#2 18. 05. 2009 20:40

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: seznam dvd - c++

Já vim, že poslední dobou jsem žádala o radu až moc často, ale nemohl by se na to přece jenom někdo podívat.  Děkuji.


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#3 19. 05. 2009 14:23

jardasmid
Příspěvky: 65
Reputace:   
 

Re: seznam dvd - c++

Zdravím. Problém je asi tady:

Code:

void Init::vloz(DVD *z)
{
   if(pocetDVD<maxPocet)
       DVDPole[pocetDVD++] = z;
}

Ve funkci main vytvoříš na zásobníku film a ten pak vkládáš pomocí ukazatele

Code:

Film F(idF,nazev,jmeno,prijmeni, delka); 
f.vloz(&F);

Po tom, co skončí for je objekt ze zásobníku odstraněn a ukazatel ukazuje na neplatné místo. Ve Windows (předpokládám, že se jedná o Windows, protože tam voláš příkaz "pause") to často program přežije a pak ukazuje blbosti. Ten film je tedy třeba vytvořit pomocí operátoru new:

Code:

Film *f = new Film(idF,nazev,jmeno,prijmeni, delka);
f.vloz(f);

Pak ale nastává nutnost alokovanou paměť uvolnit. Na konci života by tedy Init v destruktoru měl projít položky a zavolat na ně "delete".

Možná je problém ještě někde, ale tohle mě praštilo do očí hned.


Jestli můžeš, doporučuji použít std::string místo char. Máš tam totiž přednastavené velikosti "bufferů" a nikde si nehlídáš, jestli ti do nich nikdo necpe víc. Se std::string to nehrozí, ten se "zvětší" sám na požadovanou velikost.

Taky doporučím std::vector na uchovávání položek a nedoporučím používání statických proměnných. Počet dvd pak můžeš zjistit přes velikost std::vectoru.

----------------------
Jarda

Offline

 

#4 19. 05. 2009 14:38

jardasmid
Příspěvky: 65
Reputace:   
 

Re: seznam dvd - c++

Ve Film::Film a Zakaznik::Zakaznik jsou blbosti typu

Code:

idF=iF=pocetDVD++;

To iF už nikde nepoužiješ, tak je zbytečné mu něco přiřazovat. Navíc to není reference, takže pokud tím bylo myšleno, že se to nastaví zpátky do toho intu ve funkci main (ze zdrojáku to tak vypadá), tak je třeba místo "int iF" dát do argumentů "int& iF", nebo "int* iF", pokud radši ukazatele.

Offline

 

#5 19. 05. 2009 15:22

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: seznam dvd - c++

Děkuji, ještě se ale nejspíš ozvu. :)


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson