» »

[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.


#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.

An0N ::

Razumem... Hvala!

mallard ::

Samo v vednost, velikost v takšni deklaraciji
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.

Zgodovina sprememb…

  • spremenilo: An0N ()

mallard ::

An0N je izjavil:


Polje kazalcev sem uporabil, ker je to v navodilih naloge eksplicitno zahtevano.

Tu ni kaj, potem. Fair enough.

An0N je izjavil:

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.

An0N je izjavil:


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 ()

An0N ::

Hvala za dober prispevek!

LP


Vredno ogleda ...

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

Futourist - obetaven slovenski projekt

Oddelek: Kriptovalute in blockchain
122714 (2024) next3steps
»

Kruskalov algoritem težave pri implementaciji

Oddelek: Programiranje
51635 (1409) zacetnik11
»

c++ (sortiranje)

Oddelek: Programiranje
121501 (1364) minghags
»

BOF - uprasanje

Oddelek: Loža
51586 (1167) TekO
»

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

Oddelek: Programiranje
121681 (1418) l0g1t3ch

Več podobnih tem