» »

Programiranje v C++

Programiranje v C++

krneki0001 ::

Rabil bi primer programa v C++, kjer bi imel eno trgovino, več prodajalcev in vsak prodajalec bi prodajal več izdelkov. Potreboval bi vpis prodajalca,takoj pri vpisu bi vpisal še njegove izdelke in tako za določeno število prodajalcev in določeno število izdelkov.
Na koncu pa izpis vseh prodajalcev z vsemi izdelki. Kako bi to naredil samo s strukturami v C++.

Gundolf ::

Kaj hočeš, da ti tule nekdo napiše program zate? Drugače ne vem kako naj ti odgovorim na vprašanje. Mogoče takole zelo na splošno.

Imaš class Trgovina in class Prodajalec;
Trgovina ima spremenljivko a la std::list<Prodajalec> seznamProdajalcev;
Prodajalec ima spremenljivko a la std::list<std::string> seznamIzdelkov;
Če z uporabnikom komuniciraš preko konzole potem uporabiš še std::cin in std::cout;

Zdaj pa veselo na delo.

krneki0001 ::

Premalo sem napisal.Treba je napisat program primitivno samo z structi in samo polja.

Recimo
struct prodajalec
{
char priimek_ime[20];
...
};

struct avto
{
znamka
letnik
ccm
kw
};

void prodajalec::vpisi_prodajalec()
.
.
.

krneki0001 ::

Znam to narest v pacsalu, cobolu, assemblerju, ne znam pa v C++, rabil bi pa za primerjavo, kok manj vrstic je to v c++, kot v pascalu, ker tam je kr neki pisanja.

OwcA ::

Če samo structi in polja, potem ni pretiranega smisla v uporabi C++. Poleg tega, čim tlačiš zraven metode (prodajalec::vpisi_prodajalec) tako ali tako uporabljaš funkcionalnost razredov, ne struct-ov.
Otroška radovednost - gonilo napredka.

Gundolf ::

Če znaš to v pascalu in poznaš C++ sintaxo, v čem je torej problem?

krneki0001 ::

Ni problema. Je že narejeno.

krneki0001 ::

Evo naletel sem na problem. Naredil sem cel komplet program prodaje avtomobilov, samo z statičnimi podatkovnimi strukturami. Sedaj bi rad pa to konvertiral v dinamične strukture(SEZNAME). Ker sem nekako začetnik(programiral sem v C-ju pred 14-imi leti, sedaj se pa na novo učim c++) in programiram v C++ šele 3 mesece mi to dela nemalo preglavic.

Del programa ki bi ga rad transformiral je tule.

//**********AVTO
struct Avto
{
char proizvajalec[MAX_DOLZINA_NIZA]; // proizvajalec avta
int letnik; // letnica proizvodnje
Datum prva_reg; // datume prve registracije
int km_prev; // prevoženi kilometri
int ccm; // kubiki motorja
int kw; // mo&egrave; motorja
int bendiz; // true - dizel / false - bencinar
};
//**********AVTOMOBILI
struct Avtomobili
{
Avto avtomobili[MAX_NIZ];
int st_prod_avtov;
void Vnesi_avto();
void Izpisi_avto();
void Dodaj_avto();
};

void Avtomobili::Vnesi_avto() //vnos avtomobila - vsi avtomobili enega prodajalca
{
.
.
.
}

void Avtomobili::Izpisi_avto() //izpis avtomobila - vsi avtomobili enega prodajalca
{
.
.
.
}

Ali lahko tukaj kdo pomaga, da bi prišlo nekako zakole?
struct Avto
{
char proizvajalec[MAX_DOLZINA_NIZA]; // proizvajalec avta
int ccm; // kubiki motorja
int kw; // moe motorja
void Vnesi_avto();
void Izpisi_avto();
Avto* naslednji;
Avto* prejsnji;
};

void vstavi_na_zacetek(Avto* &zacetek, Avto* &konec)
{
Avto* novi = new Avto;
novi->????(tukaj pride del, ki ga ne razumem) = Avto.Vnesi_avto();
novi->naslednji = zacetek;
novi->prejsnji = NULL;
if (zacetek==NULL)
konec = novi;
else
zacetek->prejsnji = novi;
zacetek=novi;
}

Gundolf ::

Jako veliko uporabne kode si izpisal tule...
Morda želiš napisati nekaj takega: novi->Vnesi_avto();

krneki0001 ::

In to je vse al kaj? Za to sem porabil zdele 2 uri, da sem tuhtal, kaj in kako.

Hvala.

P.S. Zakaj je veliko jako uporabne kode?

Gundolf ::

Zato ker iz te silne količine kode je bilo (vsaj meni) zelo težko ugotoviti kaj ti dela probleme - sem na vsaj tri druge stvari prej pomislil. Ampak ok, očitno se tudi znanje, koliko kode in koliko pojasnil podati, ko iščeš pomoč, do neke mere pridobi šele z izkušnjami. Tvoje vprašanje se recimo skrči na "kako kličem funkcijo, ki je del razreda" in zraven podana okrnjena definicija razreda ter okrnjena okolica od koder želiš funkcijo klicati.

Verjetno jaz malo preveč pričakujem od začetnikov, ki tule sprašujete, samo nekako se mi nikoli ni zdelo ravno umetnost predstaviti svojih problemov z ravno pravo mero konteksta, da bi me drugi razumeli. Saj veš, premalo pa bodo vsi le debelo gledali, preveč pa se bodo še tisti, ki se bodo nekako spravili prebrat zadevo popolnoma zmedli.

krneki0001 ::

Velja za v bodoče.


Ali mi sedaj lahko še poveš kako recimo sedaj naredim klic iz enega seznama da pokličem drug seznam.

void Prodajalec::Vpisi_prodajalec() // Vpisovanje veeih prodajalcev
{...
tukaj sedaj pride tisti klic iz tega seznama bi rad poklical seznam avtomobilov.
}

Program zgleda tako da imaš seznam prodajalcev in vsak posamezen prodajalec in podseznam avtomobilov.

Gundolf ::

Ne vem kako izgleda ta tvoj seznam avtomobilov znotraj Prodajalca.
Če je nekaj takega:
struct Prodajalec {
   Avtomobili avtomobili;   // moznost 1
   Avto* zacetek_seznama; // moznost 2
   ...
   void Vpisi_prodajalec();
   ...
};

void Prodajalec::Vpisi_prodajalec() {
   ...
   avtomobili.Vnesi_avto();  // moznost 1

   zacetek_seznama = new Avto;   // moznost 2
   zacetek_seznama->Vnesi_avto();
   ...
}

Tokrat je pa premalo podatkov, ne vem kakšen je Prodajalec in kakšen je seznam avtov v njem:P
Glede na tole:
> void Prodajalec::Vpisi_prodajalec() { // Vpisovanje večih prodajalcev
> tukaj sedaj pride tisti klic iz tega seznama bi rad poklical seznam avtomobilov.
> }
me pa malo skrbi, kako si ti predstavljaš vse skupaj. Prodajalec sam po sebi ni seznam, kvečjemu če vsebuje dejanski seznam prodajalcev (potem je ime edninsko razreda malce zgrešeno). Če pa nekje drugje narediš seznam prodajalcev, te pa to v tej funkciji prav nič ne zanima. V vsakem primeru delaš le na enem primerku Prodajalca naenkrat.

krneki0001 ::

Osnova je taka, da imam lahko neskončno prodajalcev. Vsak prodajalec ima pa seznam prodajanih avtomobilov. Seznama imam narejena, vendar me zanima kako pokličeš iz enega samega prodajalca seznam njegovih prodajanih avtomobilov. Seznam avtomobilov je v tistem postu, ko si mi odgovoril prejšnjič.

Torej ko moram vpisat enega prodajalca v seznam, moram vpisat še njegove avtomobile, ki so pa drugi seznam.

Gundolf ::

Ja seznam avtomobilov mora torej biti znotraj razreda Prodajalec. Ker ima vsak prodajalec svoj seznam.

krneki0001 ::

A to pomeni da moram narest seznam prodajalec in vanj vgraditi še podseznam avtomobili?
Kako pa to potem narediš?

Gundolf ::

Tako kot si strukturo Avto naredil tako, da lahko avtomobile povezuješ v seznam, tako naredi za strukturo Prodajalec (to verjetno že imaš).
Zdaj ne vem kje si mel dosedaj pospravljen seznam avtomobilov (v mainu ali globalno spremenljivko ali kaj bolj exotičnega), ampak to prestaviš v strukturo Prodajalec. Verjetno nekako tako:
struct Prodajalec {
   ...
   Avto* seznamAvtov;
}
...
int main {
   Prodajalec* seznamProdajalcev;
}

Če opaziš vzorec v zgorjnji kodi - tako kot je seznamProdajalcev definiran v main, tako naj bo seznam avtomobilov znotraj prodajalca.

Daj mi zdaj še razkrij, zakaj hočeš/moraš uporabljati le strukture in t.i. linked liste (sezname)? Ker tvoja sedanja koda je tako grda mešanica C in C++ da se te bog usmili, če to delaš iz lastnega veselja. Uporabljaš namreč totalen C, s tem da tvoje strukture vsebujejo tudi funkcije (edini C++ feature v tvoji kodi). IMHO, če nočeš/ne moreš normalnega C++ uporabljat, bi bilo lepše če bi še te funkcije pometal ven iz structov in kodo prekrstil v C.

krneki0001 ::

Sam delam kot programer v cobolu in assemblerju na mainframeu(S390 in ZOS kot sistem), zdej pa delam še fax ob delu in smo moral narest program(programiranje osnove v c++) za prodajalca avtomobilov brez seznamov samo statično, kar je zelo bedno. sedaj pa je treba to vse predelat v dinamične strukture in mi nekak ne gre. Tega cobol nima in je težko naenkrat prešaltat na c++.
To kar si videl od prejšnje kode je prfoks zahteval da se tko naredi - ena čudna mešanica vsega.
In tko sem prišel kot čisti začetnik v C++ v enem mesecu na dinamične strukture, ki pa mi delajo preglavice.

Gundolf ::

Jah težko je najti dobrega prfoxa za programiranje.

krneki0001 ::

Tukaj je problem, ker skače iz teme na temo potem pa spet nazaj.
Nekaj sem že naredil in zaenkrat zadovoljivo dela. Bom pa še kaj vprašal, če me bo matralo.

krneki0001 ::

Evo program deluje dobro, dokler vpisuješ vse podatke in jih tudi vpiše lepo(če greš z debugerjem gledat), ampak izpisat jih pa noče. Nekak ne znam za izpis narest funkcije.

Izpiše mi glavni seznam. Torej več prodajalcev, podseznama, njihovih avtomobilov pa nikakor noče izpisat, ampak rukne program.
void Prodajalec::Izpisi_prodajalec() //Izpih vseh prodajalcev
{	
	...izpis prodajalca, ki deluje vredu... potem je pa del, ki noče delat, ampak se sesuje
	for(Avto* vmesni = konec; vmesni!=NULL;vmesni=vmesni->prejsnji)
	{
		vmesni->Izpisi_avto();
	}
}


[edit: tole ti bo v pomoč, ko pišeš kodo jo daš v slo-tech tage [st.koda c] in [/st.koda c] - Gundolf]

Zgodovina sprememb…

  • spremenil: Gundolf ()

Gundolf ::

V kodi ne vidim nobene očitne napake, očitno se ta skriva nekje drugje. Poskusi ugotoviti kaj je narobe z debuggerjem. Ali pa ročno debuggiraj. Se pravi poskusi izpisati le zadnji avto v seznamu (if (konec != NULL) konec->Izpisi_avto();).

Lahko pa tudi poveš kako ti crkne program (ok, verjetno je seg fault oz. njegov windows sorodnik), recimo a izpiše vsaj en avto ali že prej crkne.

krneki0001 ::

Crkne ko bi moral izpisat avto. Vrže me pa debuger na izpis, vendar ne najdem napake.

Gundolf ::

Očitno je problem, da konec sploh ni pravilno nastavljen. Druge razlage jaz tu ne vidim.

krneki0001 ::

Kako pa recimo v enem seznamu narediš kazalec na drug seznam?

Gundolf ::

Takole moraš razmišljat: Imaš seznam objektov (vsak objekt je instanca tvojega structa). To, da ima vsak objekt tudi svoj seznam nekih drugih objektov te v prvem seznamu sploh ne zanima. Povsem nepomembna zadeva. Torej povsem identično kot hraniš kazalec na prvi seznam nekje v main ali pa globalno, tako hraniš kazalec na nek drug seznam v objektu. Definiraš ga po istem sistemu, dostopaš do njega po istem sistemu, gradiš in uničiš ga po istem sistemu...

Kiri ::

Hehe, ocitno sva sosolca. Mam en podoben primer narejen. Ce hoces daj mail, pa ti ga poslem...
E pur si muove!

krneki0001 ::

Je bil že dokončan in ocenjen - z 10. Mi je potem vse ratalo, ko sem se malo poglobil v tisto kar je gundolf nazadnje napisal.

Kiri ::

OK.
Mimogrede, ves mogoce kaj vse lahko mamo na izpitu zraven? Zanc je reku baje, da mamo lahko zraven knjige pa zapiske...
E pur si muove!

krneki0001 ::

Men je reku, da imam lahko vse kar ni inteligentno. Mel bom pa samo svoje zapiske, sej mam dost not zapisano. Bom pa še primere, ki smo jih na vajah naredil sprintal, da bom mel mal za pogledat, če bo treba, sej na vajah smo lih komi skoz pršli.

Kiri ::

No, sej pomoje kaj drugega ne bomo nit delali...take stvari, kot smo jih delali na vajah...kaksno funkcijo za brisanje elementa z doloceno vsebino iz seznama...pa verjetno kaksno urejanje, ali pa kaj podobnega...pa kaj z fajli.
E pur si muove!

krneki0001 ::

Na izpitu bo ena naloga s seznami, ena z datotekami in ena navadna z kako vsebino za narisat.

Kiri ::

No, ja...ni bilo cisto tako :)
Kako ti je slo?
E pur si muove!

krneki0001 ::

Pomoje bo 9 al pa 10. Vse tri naloge naredu brez problema.

Kiri ::

88% sam zaj. sem z mini testi, ker sem jih pisal povprecno 56,3%...upam da mi ne zniza prevec ocene...
E pur si muove!

krneki0001 ::

Jst sm pa pisal samo 54%, pa sem se že zmenu, da grem to u petek mal pogledat, ker se mi mal premal zdi. Sej sem vse naredu tko kot mora bit, pa še doma sem še enkrat na mašini sprobal in zadeve delajo. Itak je pa reku da ne bo preveč upošteval sintaktičnih napak, tko da napisano je sigurno za več kot samo za 54%.


Vredno ogleda ...

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

enojno povezan seznam -izpis nazaj

Oddelek: Programiranje
242904 (2444) Randomness
»

[C] Seznam s poljem

Oddelek: Programiranje
232031 (1511) aceton
»

[C] kazalčni seznam

Oddelek: Programiranje
122566 (2380) MrBrdo
»

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

Oddelek: Programiranje
91362 (1202) wat56
»

[C] Povezani seznami in kazalci

Oddelek: Programiranje
242234 (1801) Good Guy

Več podobnih tem