» »

[C++][Naloga] Strukture - izpis po abecednem redu

[C++][Naloga] Strukture - izpis po abecednem redu

wat56 ::

Spet nov dan in nova naloga :)

Prosim vas za pomoč.
Problem pa je sledeč:

Napišite program, ki vodi evidenco o N izdelkih različnih proizvajalcev pohištva.
Na zalogi je več vrst pohištva (omara, miza, vitrina, postelja, kuhinjska miza, pisalna miza,...).
O vsaki vrsti pohištva so podani naslednji podatki: šifra pohištva, vrsta pohištva, naziv proizvajalca,
zaloga (število kosov) in cena kosa. Program naj za vsako vrsto pohištva izpiše ceno kosa
in število kosov v skladišču, ter celotno ceno te vrste pohištva (število kosov * cena).
Izpis naj bo urejen po abecednem vrstnem redu.

Uporabil sem te tri strukture:

enum vrsta_pohistva 
{
	 omara=1, 
	 miza, 
	 vitrina, 
	 postelja, 
	 kuhinjskamiza, 
	 pisalnamiza
};
     
struct eno_pohistvo  //Podatki enega pohistva: sifra, zaloga, cena, ime, naziv proizvajalca in vrsta
{      
       vrsta_pohistva vrsta;
       int sifra;
       int zaloga;
       int cena;
       char ime;
       char naziv_proiz;
       void vnesi();  //funkcija za vnos enega pohistva, kjer vnasam zgornje podatke
       void izpisi();  
       
};

struct pohistva   //tukaj pa je razred, za vsa pohistva.
{
	int stevilo;
     //int index;
	eno_pohistvo oprema[56];
	void vpisi();
	void izpisi();
        int sort1 (int sp, int zg); 
  	void zamenjaj (eno_pohistvo& oprema1, eno_pohistvo& oprema2);
	void uredi();
};


Nasel sem kar nekaj resitev, vendar jih ne znam implementirat.

Ena resitev, je recimo uporaba strcmp?

Zanima me tudi, kako naj sortiram ce uproabljam enum? Ker v tem priemru pac uporabnik izbere pohistvo iz seznama (torej pritisne 1 za omaro itd... in ce bi zelel potem sortirat s pomocjo strcmp je edina varjanta, da poleg tega da izbere pohistvo iz seznama, vnese hkrati z podatki (kolicina , cena..) , se ime tipa char. Vendar sem spet pri problemu, kako implementirati strcmp, da bo delovalo z mojimi strukturami.

Druga resitev je da odstranim enum. Torej mora uporabnik vnesti Ime kot char. (spet problemi z implementacijo funkcij, za sortiranje)

Najraje pa bi uporabil enum.
(ni pa nujno :) )

Najlepsa hvala za vaso pomoc.


se par izsekov kode:

void eno_pohistvo::vnesi()
{
	int odgovor;
cout << "Vnesi vrsto pohistva! " << endl;
	cout << "Omara...........[1]" << endl;
	cout << "Miza............[2]" << endl;
	cout << "Vitrina.........[3]" << endl;
	cout << "Postelja........[4]" << endl;
	cout << "Kuhinjska miza..[5]" << endl;
	cout << "Pisalna miza....[6]" << endl;
    cout << "Izbor :"; 
    cin >> odgovor;
	if (odgovor==1)	
	{
      vrsta=omara;
	  
	}
     else
     if (odgovor==2)
	 {
       vrsta=miza;
         .
         .
         .

//---------------------------------------------------------------------


void pohistva::vpisi()
{
	cout << "Stevilo razlicnih vrst pohistva: ";
	cin >> stevilo;
	cout << endl;
	for (int i=0; i<stevilo; i++)	
	{
		     oprema[i].vnesi();
	         cout << endl << endl;
	}
	
	
}

wat56 ::

Bom kar prilepil celo kodo, v kateri so ze implementirane metode za sortiranje, vendar sortiranje ne deluje.
Ko izpisem zadevo, po tem ko sem sortiral, se zaporedje ne spremeni, edina razlika je da se vrednosti (kolicina, cena..) pri prvemu elementu postavijo na 0.

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <fstream>
#include <cstdlib>
#include <iomanip>
using namespace std;

enum vrsta_pohistva 
{
	 omara=1, 
	 miza, 
	 vitrina, 
	 postelja, 
	 kuhinjskamiza, 
	 pisalnamiza
};
     
struct eno_pohistvo  //Podatki enega pohistva: sifra, zaloga, cena, ime, naziv proizvajalca in vrsta
{      
       vrsta_pohistva vrsta;
       int sifra;
       int zaloga;
       int cena;
       char ime;
       char naziv_proiz;
       void vnesi();  //funkcija za vnos enega pohistva, kjer vnasam zgornje podatke
       void izpisi();  
       
};

struct pohistva   //tukaj pa je razred, za vsa pohistva.
{
	int stevilo;
	int index;
	eno_pohistvo oprema[56];
	void vpisi();
	void izpisi();
        int sort1 (int sp, int zg); 
  	void zamenjaj (eno_pohistvo& oprema1, eno_pohistvo& oprema2);
	void uredi();
};



//---------------------------METODE----ZA----PRVO----STRUKTURO--------------------------------------------


void eno_pohistvo::vnesi()
{
	int odgovor;
	
	cout << "Vnesi vrsto pohistva! " << endl;
	cout << "Omara...........[1]" << endl;
	cout << "Miza............[2]" << endl;
	cout << "Vitrina.........[3]" << endl;
	cout << "Postelja........[4]" << endl;
	cout << "Kuhinjska miza..[5]" << endl;
	cout << "Pisalna miza....[6]" << endl;
        cout << "Izbor :"; 
        cin >> odgovor;
	if (odgovor==1)	
	{
      vrsta=omara;
	  
	}
     else
     if (odgovor==2)
	 {
       vrsta=miza;
	   ime=miza;
	 }
     else
     if (odgovor==3)
	 {
	   vrsta=vitrina;
	   ime=vitrina;
	 }
     else
     if (odgovor==4)
	 {
       vrsta=postelja;
	   ime=postelja;
	 }
     else
     if (odgovor==5)
	 {
	   vrsta=kuhinjskamiza;
	   ime=kuhinjskamiza;
	 }
     else
     if (odgovor==6)
	 {
       vrsta=pisalnamiza;
	   ime=pisalnamiza;
	 }
	   //tukaj priredimo spremenljivki ime, vrsto pohištva (s tem poskrbimo za izpis imena)
	
	

	 cout <<" Vnesi sifro pohistva..................:";
         cin >> sifra;	
	 cout << endl;	
         cout <<" Vnesi zalogo pohistva.................:";
         cin >> zaloga;
	 cout << endl;
         cout <<" Vnesi cena pohistva...................:";
         cin >> cena;
	 cout << endl;
         cout <<" Vnesi naziv proizvajalca pohistva.....:";
         cin >> naziv_proiz;
	 cout << endl;
}



void eno_pohistvo::izpisi()
{
	 int vs=0;

     cout << setw(15) << endl;
	 if (vrsta==omara)	   
      cout << "Omara";

	 else
     if (vrsta==miza)	
      cout <<"Miza";
 
     else
     if (vrsta==vitrina)	
      cout << "Vitrina";
	 
     else
     if (vrsta==postelja)	
      cout << "Postelja";
	 
     else
     if (vrsta==kuhinjskamiza)	
      cout << "Kuhinjska miza";
	  
     else
     if (vrsta==pisalnamiza)	
      cout<< "Pisalna miza";
	 
      cout << setw(15) << cena;
      cout << setw(20) << zaloga;
      vs=zaloga*cena;
      cout << setw(15) << vs;
}

//---------------------------------------------------------------------------------------------------



void pohistva::vpisi()
{
	cout << "Stevilo razlicnih vrst pohistva: ";
	cin >> stevilo;
	cout << endl;
	for (int i=0; i<stevilo; i++)	
	{
		 oprema[i].vnesi();
	         cout << endl << endl;
	}
	
	
}


void pohistva::izpisi()
{
	          cout << setw(15) << "Vrsta pohistva"
		  << setw(15) << "Cena"
		  << setw(20) << "Stevilo kosov"
		  << setw(20) << "Skupna cena"
		  << endl;
  	          for(int x=0; x<stevilo; x++)
		  oprema[x].izpisi();
}


int pohistva::sort1 (int sp, int zg)    
{
    int max=sp;
    for ( int i=sp+1; i<=zg; i++ )	
      if (oprema[i].ime > oprema[max].ime)
        max=i;
	
    return max;
}

void pohistva::zamenjaj (eno_pohistvo& oprema1, eno_pohistvo& oprema2)
{
     eno_pohistvo vmesnik=oprema1;
     oprema1=oprema2;
     oprema2=vmesnik;
}


void pohistva::uredi()
{
for (int i=stevilo; i>=1; i--)
{
    int max=sort1(0,i);
    if (max!=i)
    zamenjaj (oprema[i], oprema[max]);
}
}

int main()
{
int odg;
pohistva element;
element.vpisi();
do
{

cout << endl << endl;
cout <<"Izpis .............[1]"<< endl;
cout <<"Uredi po abecedi...[2]"<< endl;
cout <<"Izhod iz programa..[0]"<< endl;

cin >> odg;
cout << endl << endl;
	  
      switch (odg)
      {
         
         case 1:
                 element.izpisi();
                 break; 
        case 2:
	         element.uredi();
		 break;
	  }
			 
}
while (odg!=0);
return 0;
}  

Zgodovina sprememb…

  • spremenilo: wat56 ()

wat56 ::

Oziroma pozabite na tista dva posta zgoraj.

Odločil sem se da bom nalogo naredil s podatkovnimi strukturami.

Algoritem, ki ga zelim uporabiti je bubble sort.
Zdaj me pa zanima, kako naj naredim zamenjavo dveh struktur?

void uredi_mehurcno(pohistvo* pomozni)
{
     pohistvo* vmesni=pomozni;
     pohistvo* zamenjava;
     int st_elementov=0;
     while (vmesni!='\0')     //v tej zanki dobimo stevilo elementov v seznamu
     {
           st_elementov++;
           vmesni=vmesni->naslednji;
     }
     for (int i=1; i<st_elementov; i++)
     {
         vmesni=pomozni;
         while (vmesni->naslednji!='\0')
         {
//--------------------------------Ne znam resit te zamenjave-------------------------------------
               if ((vmesni->vrsta) < (vmesni->naslednji->vrsta))
               {
                  temp=vmesni->naslednji;
                  vmesni->naslednji=temp->naslednji;
                  temp->naslednji=vmesni;                
               }
               vmesni=vmesni->naslednji;
         }
     }
}



Ce kdo pozna resitev, ga lepo prosim, da mi jo pove.
Hvala

Gundolf ::

Ok najprej eno vprašanje. A standardno knjižnico smeš uporabljat (čeprav vidim da streame očitno lahko, imaš morda vseeno kako omejitev glede kontejnerjev in algoritmov)?

Zdaj pa direktno glede tise zamenjave elementov v tvojem sortu (recimo če lahko uporabiš std knjižnico, potem imaš tam že implementiran quicksort). Ena možnost je, da ne menjaš elementov linked liste (se pravi ne premetavaš pointerjev) ampak le vsebino dveh elementov linked liste. Druga rešitev (bolj optimalna, če je premikanje vsebine časovno potratno) je pa da si narišeš tiste tri (ja, trije so, ne dva) elemente liste, ki pri menjavi aktivno sodelujejo, in pogledaš kako je treba pointerje zamenjat.

npr. tole
[el.1 next] -> [el.2 next] -> [el.3 next] -> [el.4 next]
spreminjas v tole
[el.1 next] -> [el.3 next] -> [el.2 next] -> [el.4 next]
Za vse next pointerje se lepo vidi kam morajo kazat. Na pamet je tole vseeno malo preveč, če nimaš izkušenj ali pa neverjetne prostorske predstave (da si slikico v glavi predstavljaš). Pa ne pozabi preveriti možnosti, da el.1 ali el.4 ne obstajata (začetek ali konec liste).

wat56 ::

Glede uporabe algoritmov ni neke omejitve.
Zamenjavo ze razumem, vendar ne vem kako naj linkam, te strukture.
Grem delat naprej, morda pa mi bo uspelo :)

TBit ::

Primer verige:

obj1 --> obj2 --> obj3 --> obj4 -->null

Problem tvoje kode je v tem da ko menjas recimo objekt 2 in 3, ne veš kateri objekt kaže na objekt2. Zato bi moral prvo preiskati ceotno verigo, ter prvo ugotoviti ta objekt, da mu potem v nadaljevanju pravilno nastavis da naj kaže na objekt 3. Ker kolikor sm na hitro razbral iz tvoje kode, po končanju bi objekt1 se vedno kazal na objekt2.

Zato bi bilo smiselno da podaš strukturi, poleg kazalca v objektu (naslednji) še en kazalec, ki kaže na prejšnji objekt. S tem dobis strukturo, ki se da z lahkoto manipulirati.

Gundolf ::

Ok, potem pa ne izumljaj tople vode ampak uporabi std knjižnico (poglej če je na sticky topicu c++ povezave kakšen link na standard library reference, drugače je pa tule ena).

Uporabiš pa recimo strukturi list (ali raje vector) in string ter algoritem sort. Poanta je, da ne delaš svoje linked liste, ker že obstaja za tvoje potrebe zelo dobra implementacija, da ne pišeš buble sorta, ker že obstaja zelo dobra implementacija quicksorta itd.

wat56 ::

Ce se vrnem nazaj k prvi nalogi(tisti brez kazalcev) (ker delam obe verziji naloge)

ce pogledate moj prvi post v tej temi, vidite da sem uporabil enum.
Pod njo je struktura kjer imam definirano spremenljivko 'ime' tipa char.

struct eno_pohistvo  

{      
       vrsta_pohistva vrsta;
       int sifra;
       int zaloga;
       int cena;
       char ime[20];
       char naziv_proiz;
       void vnesi();  

       void izpisi();  
       
};



Pod njo pa se vidi izsek kode (funkcije za vnos vrste izdelka)

//Zanima me, kako naj naredim, da bo to delovalo.
 }
     else
     if (odgovor==6)
	 {
       vrsta=pisalnamiza;
      //namesto tega : cout << "Vstavi vrsto/ime pohistva";  cin >> ime;     bi rad naredil, da mi kar direktno vpise v spremenljivko 'ime'
      //nek string, v tem primeru 'pisalnamiza', da bom lahko kasneje sortiral po imenu.
      //ocitno na tak nacin ne gre :)
       ime="pisalnamiza";
	   
	 }
}

Error: incompatible types in assignment of `const char[13]' to `char[20]'

Zgodovina sprememb…

  • spremenilo: wat56 ()

kihc ::

Dej namesto char tabel uporabljat string (sej ti je že gundolf reku).
x

wat56 ::

Yeeey!
Zdj pa dela!
Uporabil sem string namesto char. Hvala vsem za pomoc.

Se se verjetno ogalsim :)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C++] vprašanja (strani: 1 2 3 4 5 6 7 8 9 )

Oddelek: Programiranje
44726470 (11016) aljazko1995
»

[C] čuden izpis iz txt dat. na zaslon

Oddelek: Programiranje
121609 (1346) l0g1t3ch
»

[NALOGA][C] - Sortiranje učencev

Oddelek: Programiranje
71258 (1111) m4r3
»

Programiranje v C++

Oddelek: Programiranje
352477 (1335) krneki0001
»

[C] Narascajoce sortiranje linearnega seznama

Oddelek: Programiranje
71766 (1655) Jebiveter

Več podobnih tem