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 27. 06. 2009 11:26

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

šablona třídy (funkce), spojový seznam

Ahoj,

chtěla bych poprosit zda by mi někdo nezkontroloval tento kód a napsal co je dobře/špatně.

Děkuji

Code:

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

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 27. 06. 2009 18:53

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

Re: šablona třídy (funkce), spojový seznam

ještě tohle, kdyby někdo měl chvilku (do zítra, pak už mi bude jedno):

Code:

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

Code:

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

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 29. 06. 2009 19:43 — Editoval gladiator01 (29. 06. 2009 20:51)

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

Re: šablona třídy (funkce), spojový seznam

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.


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

 

#4 09. 07. 2009 21:32

jardasmid
Příspěvky: 65
Reputace:   
 

Re: šablona třídy (funkce), spojový seznam

IMHO letmo jsem koukl a špatně je např. toto:

Code:

//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! :-)

Code:

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

 

#5 10. 07. 2009 16:40

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

Re: šablona třídy (funkce), spojový seznam

jo děkuji, ale už to je jedno, viz. předchozí příspěvek.


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