Forum » Programiranje » [C++] Delo s kazalci na strukture, problem z vnosom podatkov
[C++] Delo s kazalci na strukture, problem z vnosom podatkov
An0N ::
Lp,
delam nalogo, pri kateri je potrebno vnesti podatke o 10 restavracijah, ki nudijo študentske bone.
Problem mam pri vnosu restavracije: po vnosu podatkov za 1. restavracijo se ob vnosu naslednje preskoči vnos imena, nimam pojma, zakaj. Program sem poskusil implementirati že dvakrat in ne vidim, kje je težava.
Gre morda za kako posebnost metode getline?
Prosim za nasvet,
Hvala.
An0N
delam nalogo, pri kateri je potrebno vnesti podatke o 10 restavracijah, ki nudijo študentske bone.
Problem mam pri vnosu restavracije: po vnosu podatkov za 1. restavracijo se ob vnosu naslednje preskoči vnos imena, nimam pojma, zakaj. Program sem poskusil implementirati že dvakrat in ne vidim, kje je težava.
#include <fstream> #include <iostream> #include <string> using namespace std; struct OdpiralniCas { unsigned int Od; unsigned int Do; }; struct Restavracija { string ime; string naslov; OdpiralniCas odpiralni; double cenaBona; double povprecnaOcena; }; void VnosOdpiralnega(OdpiralniCas & o1) { cout << "Prosim, vnesite, od kdaj dela restavracija: "; unsigned int a; cin >> a; cout << "Prosim, vnesite, do kdaj dela restavracija: "; unsigned int b; cin >> b; o1.Od = a; o1.Do = b; } void VnosRestavracij(Restavracija * kR[10]){ for (int i = 0; i < 10; i++) { cout << "Vnesite ime restavracije " << i + 1 << ": "; getline(cin, kR[i]->ime); cout << "Vnesite naslov restavracije " << i + 1 << ": "; getline(cin, kR[i]->naslov); VnosOdpiralnega(kR[i]->odpiralni); cout << endl; cout << "Vnesite ceno bona restavracije " << i + 1 << ": "; cin >> kR[i]->cenaBona; cout << "Vnesite povprecno oceno restavracije " << i + 1 << ": "; cin >> kR[i]->povprecnaOcena; } } void IzpisRestavracij(Restavracija * kR[10]) { for (int i = 0; i < 10; i++) { cout << "Ime restavracije " << i + 1 << ": " << kR[i]->ime << endl; cout << "Naslov restavracije " << i + 1 << ": " << kR[i]->naslov << endl; cout << "Odpiralni cas restavracije " << i + 1 << ": " << "od " << kR[i]->odpiralni.Od << ". do " << kR[i]->odpiralni.Do << ". ure"; cout << "Cena bona restavracije " << i + 1 << ": " << kR[i]->cenaBona << endl; cout << "Povprecna ocena restavracije " << i + 1 << ": " << kR[i]->povprecnaOcena << endl; } } int main() { Restavracija r1, r2, r3, r4, r5, r6, r7, r8, r9, r10; Restavracija * kR[10] = {&r1, &r2, &r3, &r4, &r5, &r6, &r7, &r8, &r9, &r10}; cout << "VNOS: " << endl; VnosRestavracij(kR); cout << "IZPIS: " << endl; IzpisRestavracij(kR); return 0; }
Gre morda za kako posebnost metode getline?
Prosim za nasvet,
Hvala.
An0N
- spremenilo: An0N ()
DarkSensei ::
https://stackoverflow.com/questions/103...
Skratka, vnos s cin na koncu loopa ti pusti newline, ki ga getline pozre kot vnos.
Skratka, vnos s cin na koncu loopa ti pusti newline, ki ga getline pozre kot vnos.
mallard ::
Samo v vednost, velikost v takšni deklaraciji
nima nobenega vpliva in je samo za okras. Je popolnoma enako kot če bi napisal
Tole je pa naravnost cringeworthy:
Hehe. Še dobro, da naloga ne zahteva vnosa par sto restavracij :)
bi blo mal boljše. Tako ti ni treba na roke štancat če se spremeni zahteva naloge, ampak samo spremeniš vrednost n_rest.
Pa ne vidim pametnega razloga imeti polja kazalcev. Bolj enostavno bi bilo imet samo polje r in spremenit funkcijo tako, da sprejme Restavracija* kot parameter (in pa zraven še velikost polja). Upam pa, da boste, če se že učiš C++, vzel in uporabljal std::vector namesto kazalcev.
void VnosRestavracij(Restavracija * kR[10])
nima nobenega vpliva in je samo za okras. Je popolnoma enako kot če bi napisal
void VnosRestavracij(Restavracija ** kR)
Tole je pa naravnost cringeworthy:
Restavracija r1, r2, r3, r4, r5, r6, r7, r8, r9, r10; Restavracija * kR[10] = {&r1, &r2, &r3, &r4, &r5, &r6, &r7, &r8, &r9, &r10};
Hehe. Še dobro, da naloga ne zahteva vnosa par sto restavracij :)
const int n_rest = 10; Restavracija r[n_rest]; Restavracija* r_p[n_rest]; for (int i = 0; i < n_rest; ++i) r_p[i] = &r[i];
bi blo mal boljše. Tako ti ni treba na roke štancat če se spremeni zahteva naloge, ampak samo spremeniš vrednost n_rest.
Pa ne vidim pametnega razloga imeti polja kazalcev. Bolj enostavno bi bilo imet samo polje r in spremenit funkcijo tako, da sprejme Restavracija* kot parameter (in pa zraven še velikost polja). Upam pa, da boste, če se že učiš C++, vzel in uporabljal std::vector namesto kazalcev.
An0N ::
Hvala lepa za dodatek,
imaš popolnoma prav ampak bi ti rad razložil, zakaj sem dejansko izbral takšno kodo:
Moja koda, ki si jo izpostavil, je res grozna in nepraktična. Uporabil sem jo zato, ker je program v vsakem primeru omejen na max. 10 restavracij.
Kaj se pa tiče primerjave Restavracija * kR[10] in Restavracija ** kR pa menim, da obstaja majhna razlika, namreč kazalec na kazalec (**) je dejansko nekonstanten kazalec, kar omogoča poljubno število alociranih pomnilniških mest za "zunanje kazalce" medtem pa ko lahko pri polju desetih kazalcev kR[10] pride do overflowa, saj lahko vnesemo le do 10 kazalcev v to polje.
Polje kazalcev sem uporabil, ker je to v navodilih naloge eksplicitno zahtevano.
Skratka: kR[10] je vbistvu konstantni kazalec - array, medtem ko ** ni.
Upam, da nisem zabluzil, želel sem samo argumentirati, zakaj sem uporabil takšne zapise.
Delo z vector objekti imamo v naslednjem semestru.
Lep pozdrav.
imaš popolnoma prav ampak bi ti rad razložil, zakaj sem dejansko izbral takšno kodo:
Moja koda, ki si jo izpostavil, je res grozna in nepraktična. Uporabil sem jo zato, ker je program v vsakem primeru omejen na max. 10 restavracij.
Kaj se pa tiče primerjave Restavracija * kR[10] in Restavracija ** kR pa menim, da obstaja majhna razlika, namreč kazalec na kazalec (**) je dejansko nekonstanten kazalec, kar omogoča poljubno število alociranih pomnilniških mest za "zunanje kazalce" medtem pa ko lahko pri polju desetih kazalcev kR[10] pride do overflowa, saj lahko vnesemo le do 10 kazalcev v to polje.
Polje kazalcev sem uporabil, ker je to v navodilih naloge eksplicitno zahtevano.
Skratka: kR[10] je vbistvu konstantni kazalec - array, medtem ko ** ni.
Upam, da nisem zabluzil, želel sem samo argumentirati, zakaj sem uporabil takšne zapise.
Delo z vector objekti imamo v naslednjem semestru.
Lep pozdrav.
Zgodovina sprememb…
- spremenilo: An0N ()
mallard ::
Polje kazalcev sem uporabil, ker je to v navodilih naloge eksplicitno zahtevano.
Tu ni kaj, potem. Fair enough.
Hvala lepa za dodatek,
Kaj se pa tiče primerjave Restavracija * kR[10] in Restavracija ** kR pa menim, da obstaja majhna razlika, ...
Se strinjam. Pa razlika sploh ni majhna.
Skratka: kR[10] je vbistvu konstantni kazalec - array, medtem ko ** ni.
Polje je polje, kazalec pa kazalec, ne ju mešat, prosim. Skupno jima je to, da se v večini primerov uporabe polja le-to implicitno pretvori v kazalec na prvi element. V C++ type sistemu sta pa ločena tipa. Velikokrat lahko kje prebereš "name of array is a pointer to its first element". Narobe. Potem se pa isti newbiji presenečeno sprašujejo zakaj jim prevajalnik ne pusti objekta tipa int[5][5] dodelit objektu tipa int**.
Kakorkoli, to ni bil moj point. Hotel sem ti povedat, da ima v deklaraciji
void VnosRestavracij(Restavracija * kR[10])
parameter kR tip Restavracija**.
Bolj splošno, v deklaraciji funkcij (ne govorim o deklaracijah objektov na stacku) je
void funkcija( T p [] )
isto kot
void funkcija( T* p )
Med oglate oklepaje je lahko tud vtakneš velikost, ampak nima nobenega semantičnega pomena ampak je kvečjemu namig bralcu kode.
Če mi ne verjameš, poženi tole kodo:
void foo(int* p); void foo(int p[42]) { } int main() { int arr[42]; foo(arr); int hmm[100]; foo(hmm); // dela int i; foo(&i); // to tud }
Tule, npr.
Lep pozdrav, pa veselo programiranje tud v 2015 :)
Zgodovina sprememb…
- spremenilo: mallard ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Futourist - obetaven slovenski projektOddelek: Kriptovalute in blockchain | 2714 (2024) | next3steps |
» | Kruskalov algoritem težave pri implementacijiOddelek: Programiranje | 1635 (1409) | zacetnik11 |
» | c++ (sortiranje)Oddelek: Programiranje | 1501 (1364) | minghags |
» | BOF - uprasanjeOddelek: Loža | 1586 (1167) | TekO |
» | [C] čuden izpis iz txt dat. na zaslonOddelek: Programiranje | 1681 (1418) | l0g1t3ch |