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
Stránky: 1
Ahoj,
chtěla bych poprosit zda by mi někdo nezkontroloval tento kód a napsal co je dobře/špatně.
Děkuji
#include<iostream> using namespace std; //Napište šablonu třídy Prvek, z jejichž instancí může být vytvořen spojový //seznam hodnot typu T. template <class T> class Prvek { public: T hodn; Prvek *dalsi; Prvek(T s, Prvek *d) { hodn=s; dalsi=d; } }; //a) //napište šablonu funkce, která do výstupního proudu os vypíše hodnoty //ze spojového seznamu s. template <class T> ostream& vypis(ostream & os, Prvek<T>* s) { while(s!=0) { os << s->hodn << " "; s=s->dalsi; } //cout << endl; return os; } //b) //napište šablonu funkce jejímž výsledkem je počet prvků spojového seznamu s. template <class T> int pocetPrvku(Prvek<T>* s) { int pp=0; while (s != NULL) { pp++; s = s->dalsi; } cout << pp; } //c) //napište šablonu funkce, která vytvoří spojový seznam z n prvků pole p //tak, že hodnoty ve spojovém seznamu mají stejné pořadí, jako v poli p. template <class T> Prvek<T>* vytvor(T* p, int n) { Prvek<T> *s; n=sizeof(p); for(int i=n; i>0; i--) { s=new Prvek<T>(p[i],s); } return s; } //d) //napište šablonu funkce, která vypíše hodnoty ze seznamu s v opačném pořadí (použijte rekurzi). template <class T> void vypisObracene(Prvek<T>* s) { while(s) { cout << s->hodn << " "; s=s->dalsi; } vypisObracene(s); } //e) //napište šablonu funkce, která ze seznamu s odstraní všechny prvky, jejichž //hodnota je stejná s hodnotou předcházejícího prvku a vrátí ukazatel na upravený seznam. template <class T> Prvek<T>* odstranDuplicity(Prvek<T>* s) { Prvek<T> *pom, *pr=0, *ak=s; while (ak!=0) { if((ak->hodn == pr->hodn)) { pom=ak->dalsi; delete ak; if(pr) pr->dalsi=pom; else // když není předchozí prvek s=pom; ak=pom; } else { pr=ak; ak=ak->dalsi; } } return s; } //f) //napište šablonu funkce, která hodnoty ze spojového seznamu s uloží do dynamicky //vytvořeného pole. Ukazatel na pole bude výsledkem funkce. template <class T> T* vytvorPole(Prvek<T>* s) { int n=pocetPrvku(s); char *p; p=new char [n]; for(int i=0; i<n; i++) { p[i]=s->hodn; s=s->dalsi; } return p; } //h) //napište šablonu funkce, která vytvoří spojový seznam hodnot obsažených //v seznamu s, ale v opačném pořadí. template <class T> Prvek<T>* vytvorObraceny(Prvek<T>* s) { Prvek<T> *o; while(s) { o=new Prvek<T>(s->hodn,o); s=s->dalsi; } return o; } //i) //napište šablonu funkce, která ze seznamu s odstraní všechny prvky, //jejichž hodnota je x a vrátí ukazatel na upravený seznam. template <class T> Prvek<T>* odstranX(Prvek<T>* s, T x) { Prvek<T> *pom, *pr=0, *ak=s; while (ak!=0) { if((ak->hodn == x)) { pom=ak->dalsi; delete ak; if(pr) pr->dalsi=pom; else // když není předchozí prvek s=pom; ak=pom; } else { pr=ak; ak=ak->dalsi; } } return s; } //j) //napište šablonu funkce, která vytvoří spojový seznam obsahující jeho //prvky s výjimkou těch, které mají hodnotu x. Ukazatel na první prvek nového seznamu je výsledkem funkce. template <class T> Prvek<T>* bezX(Prvek<T>* s, T x) { Prvek<T> *o; while(s) { if(s->hodn!=x) { o=new Prvek<T>(s->hodn,o); s=s->dalsi; } } return o; }
Offline
ještě tohle, kdyby někdo měl chvilku (do zítra, pak už mi bude jedno):
/* 1. Napište třídu realizující datový typ „fronta hodnot různých typů“ pomocí spojového seznamu. Operace: - konstruktor - destruktor - vložení hodnoty x na konec fronty metodou insert - výběr prvního prvku fronty metodou first - odebrání prvního prvku fronty metodou remove - výpis prvků fronty přetíženým operátorem << [b]Třídu napište tak, aby použití kopírujícího konstruktoru a operátoru přiřazení znamenalo chybu při překladu. - [/b] tohle nevim jak zařídit Napište třídy potřebné k tomu, aby do fronty bylo možné vložit hodnoty typu int a char. */ #include<iostream> using namespace std; class Prvek { public: virtual void print(ostream &) const=0; friend ostream & operator<<(ostream &s, const Prvek &p) { p.print(s); return s; } }; class Fronta { struct Elem { Prvek *hodn; Elem *dalsi; Elem(Prvek *h, Elem *d) { hodn=h; dalsi=d; } }; public: Elem *celo, *volny; Fronta() { celo=0; volny=0; } ~Fronta() { while(celo) { Elem *tmp = celo; celo=celo->dalsi; delete celo; } } void insert (Prvek *p); Prvek *remove(); bool isEmpty() const { return celo==NULL; } friend ostream & operator<<(ostream &s, const Fronta &f); }; class Cislo: public Prvek { int hodn; public: Cislo(int h) { hodn = h; } virtual void print(ostream & s) const { s << hodn; } }; class Znak: public Prvek { char hodn; public: Znak(char h) { hodn = h; } virtual void print(ostream & s) const { s << hodn; } };
#include<iostream> using namespace std; #include "1-zk.h" void Fronta::insert(Prvek *p) { Elem *pom = new Elem(p,NULL); if(volny) volny->dalsi=pom; else celo=pom; volny=pom; } Prvek *Fronta::remove() { Prvek *p = celo->hodn; Elem *pom = celo; celo=celo->dalsi; if(!celo) volny=NULL; delete pom; return p; } ostream& operator<<(ostream &s, Fronta& f) { //Fronta::Elem *pom=f.celo; while(f.celo) { s << *f.celo->hodn << endl; f.celo=f.celo->dalsi; } return s; } int main() { Fronta f; Znak z('z'); Cislo c(9); f.insert(new Cislo(3)); f.insert(new Znak('a')); f.insert(&z); f.insert(&c); cout << "Vypis zasobniku" << endl; cout << f; cout << "Odebirani ze zasobniku" << endl; while(!f.isEmpty()) cout << *f.remove() << endl; system("pause"); return 0; }
Offline
Děkuji za pomoc s příkladama během semestru. Tohle už nepotřebuji (u zkoušky jsem jako naschval měla jediný příklad, který jsem si nepřipravila, naštěstí spolužák pomohl) zkoušku jsem udělala.
Offline
IMHO letmo jsem koukl a špatně je např. toto:
//c) //napište šablonu funkce, která vytvoří spojový seznam z n prvků pole p //tak, že hodnoty ve spojovém seznamu mají stejné pořadí, jako v poli p. template <class T> Prvek<T>* vytvor(T* p, int n) { Prvek<T> *s; n=sizeof(p); for(int i=n; i>0; i--) { s=new Prvek<T>(p[i],s); } return s; }
sizeof(p) je totiž sizeof(T*), což může být např 4 na 32bit systému nebo 8 na 64bit systému. Není to stejné jako počet prvků v poli. To ti ale přece udává vstupní argument "n", takže není přece důvod to n přepisovat. A to přidávání máš taky nějak divně. A používat int pro adresaci a určování velikosti je ošklivost a měli by se za to trhat hlavy! :-)
template <class T> Prvek<T>* vytvor(T* p, int n) { if (n <= 0) return 0; Prvek<T> *vysledek, *prvek; vysledek = prvek = new Prvek<T>(p[0], 0); for (int i = 1; i < n; ++i) { prvek = prvek->dalsi = new Prvek<T>(p[i], 0); } return vysledek; }
Offline
jo děkuji, ale už to je jedno, viz. předchozí příspěvek.
Offline
Stránky: 1