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
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.
/*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; }
/*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; }
/*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&); };
Offline
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.
Offline
Zdravím. Problém je asi tady:
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
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:
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
Ve Film::Film a Zakaznik::Zakaznik jsou blbosti typu
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
Děkuji, ještě se ale nejspíš ozvu. :)
Offline