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