Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Michal2000 24. 01. 2018, 22:16:18

Název: Problém s úkolem C++
Přispěvatel: Michal2000 24. 01. 2018, 22:16:18
Zdravím,

Ve škole jsme dostali úkol.

1. Vytvořte složený datový typ s názvem klient, který bude obsahovat: číslo ID, řetězec s názvem jméno, řetezec s názvem požadavek a přepínač TRUE/FALSE s názvem vyřízeno. 
2. Vytvořte DT pole klientů s názvem čekárna (velikost 10), vytvořte proměnnou tohoto DT  s názvem hala.                                                   
3. Vytvořte funkci init, která bude mít vstupní parametr pole klientů, tento parametr bude zapisovatelný. Funkce naplní všechny položky v poli výchozími hodnotami (id bude druhá mocnina indexu pole), jméno bude: Franta, požadavek bude NIC, přepínač bude na false.
4. Vytvořte funkci vypiš pole, která bude mít vstupní parametr pole klientů a vypíše celé pole.                                                                                                                      5. na 5 pozici v čekárně zapište: Aneta, kafe a true.                                                                                             Zavolejte v main: funkci init, zápis Anety a vypište pomocí funkce celé pole.

Jen podotýkám, že jsme se ještě vůbec neučili pointery ani reference. Bylo nám pouze řečeno, že pokud chceme zapisovat ve funkci musíme použít &. Mohl by mi to někdo lépe objasnit ? Jaká část programování se tímto zabývá ? Dále přikládám svůj kod. Mělo by to být dobře. Kromě bodů 4 a 5 s těmi si nevím rady. První způsob zápisu kodu funguje. Místo volání všech položek ve funkci vypisPole se dají vypsat ve funkci init. Jenže já je potřebuju vypsat právě ve funkci vypisPole a já nevím jak.

NEFUNGUJE

Kód: [Vybrat]

#include <iostream>
using namespace std;

struct klient{
int ID;
string jmeno;
string pozadavek;
bool vyrizeno;

};
const int VEL=10;
typedef klient cekarna[VEL];
cekarna hala;

void init(cekarna&vstup){
for(int x=0;x<=VEL;x++){
    vstup[x].ID=x*x;
    vstup[x].jmeno="Franta";
    vstup[x].pozadavek="nic";
    vstup[x].vyrizeno=false;
}

}

void vypisPole(cekarna &vstup) {
for(int x = 0; x < VEL; x++) {
cout
<< "id: " << vstup[x].ID
<< ", jmeno: " << vstup[x].jmeno
<< ", pozadavek: " << vstup[x].pozadavek
<< ", vyrizeno: " << vstup[x].vyrizeno
<< endl;
}

}


int main()
{

hala[4].jmeno = "Aneta";
hala[4].pozadavek="kafe";
hala[4].vyrizeno=true;


init(hala);
vypisPole(hala);

}



FUNGUJE

Kód: [Vybrat]

#include <iostream>

using namespace std;

struct klient{
int ID;
string jmeno;
string pozadavek;
bool vyrizeno;

};
const int VEL=10;
typedef klient cekarna[VEL];
cekarna hala;

void init(cekarna&vstup){
for(int x=0;x<=VEL;x++){
    vstup[x].ID=x*x;
    vstup[x].jmeno="Franta";
    vstup[x].pozadavek="nic";
    vstup[x].vyrizeno=false;
    cout<<vstup[x].ID<<endl;
    cout<<vstup[x].jmeno<<endl;
    cout<<vstup[x].pozadavek<<endl;
    cout<<vstup[x].vyrizeno<<endl;
    cout<<endl;
}

}

int main()
{

hala[4].jmeno = "Aneta";
hala[4].pozadavek="kafe";
hala[4].vyrizeno=true;


init(hala);
vypisPole(hala);

}




Název: Re:Problém s úkolem C++
Přispěvatel: SutDent 24. 01. 2018, 22:33:55
Ahoj mas tam o = navic

void init(cekarna&vstup){
for(int x=0;x<VEL;x++){
    vstup
    vstup
    vstup
    vstup
}

snad takhle ...
Název: Re:Problém s úkolem C++
Přispěvatel: Pakosko 24. 01. 2018, 22:35:04
A v čom máš konkrétne problém ?
tvoj "NEFUNGUJE" kod sa mi bezproblemov zkompiloval a spustil, len si initom prepisujes Anetu....
Název: Re:Problém s úkolem C++
Přispěvatel: Michal2000 24. 01. 2018, 22:48:39
Problém je v tom, že když to zkompiluju, tak to nic nevypíše na obrazovku.
Název: Re:Problém s úkolem C++
Přispěvatel: Michal2000 24. 01. 2018, 22:50:46
Už funguje díky.
Název: Re:Problém s úkolem C++
Přispěvatel: Pakosko 24. 01. 2018, 22:52:51
Zabudol si to kompilácii spustiť ?  ;)
to občas aj mne stáva a polhodinu hľadám, kde je chyba  :D
Název: Re:Problém s úkolem C++
Přispěvatel: x14 25. 01. 2018, 12:03:38
Jen podotýkám, že jsme se ještě vůbec neučili pointery ani reference. Bylo nám pouze řečeno, že pokud chceme zapisovat ve funkci musíme použít &. Mohl by mi to někdo lépe objasnit ? Jaká část programování se tímto zabývá ?
Pokud nepoužiješ pointer nebo referenci, tak ve funkci při jejím zavolání vzniká nová proměnná a do ní se hodnota (případně objekt) kopíruje. Použití ukazatele (nebo reference) na tu původní hodnotu umožňuje nevytvářet kopii (to může někdy významně ušetřit čas) a měnit tu původní hodnotu (tak se dá ven vrátit výsledek).
Název: Re:Problém s úkolem C++
Přispěvatel: Jano 25. 01. 2018, 14:15:00
Tipnem si: Problem bol tu:

for(int x=0;x <= VEL;x++){
Název: Re:Problém s úkolem C++
Přispěvatel: Ondra..... 25. 01. 2018, 14:39:41
Jen par poznamek ke kodu:

1. typy velkym pismenem struct Klient
2. promenna cyklu vzdy i , zvysuje to citelnost, nemusis nic vymejslet, kdyz to veme nekdo jiny, bude tam min chyb
Název: Re:Problém s úkolem C++
Přispěvatel: MarSik 25. 01. 2018, 16:07:33
1. typy velkym pismenem struct Klient

Taky to mám radši, ale je potřeba dodržovat jmenné konvence projektu. Pokud mají nařízeno pojmenovat strukturu klient, tak bych se toho držel. Jinak to nějaký automat může vyhodnotit jako chybu.
Název: Re:Problém s úkolem C++
Přispěvatel: Honza 25. 01. 2018, 16:23:10
Obvykle se nejprve volá init(), který všude nastaví implicitní hodnoty, a teprve poté se provádějí explicitní nastavení. Takže si přehoď Anetu až za volání init() a ve funkci nech "<=". Protože až zjistíš, že tam tu Anetu nechceš a vymažeš ji, budeš mít poslední prvek pole neinicializovaný...
Název: Re:Problém s úkolem C++
Přispěvatel: D.A. Tiger 25. 01. 2018, 19:33:11
Mala poznamka :
Konstantu pro definovani rozmeru pole, bych osobne vynechal, vzhledem k tomu ze jeji jediny ucel je urcit rozmer pole je myslim zbytecne pouzit promennou a volil bych spis toto reseni:

Kód: [Vybrat]
#define VEL 10
...
typedef klient cekarna[ VEL ];
...
Název: Re:Problém s úkolem C++
Přispěvatel: hawran diskuse 25. 01. 2018, 20:29:32
Mala poznamka :
Konstantu pro definovani rozmeru pole, bych osobne vynechal, vzhledem k tomu ze jeji jediny ucel je urcit rozmer pole je myslim zbytecne pouzit promennou a volil bych spis toto reseni:

Kód: [Vybrat]
#define VEL 10
...
typedef klient cekarna[ VEL ];
...
... což je c++ prasárna.
Název: Re:Problém s úkolem C++
Přispěvatel: D.A. Tiger 25. 01. 2018, 20:53:44
Mala poznamka :
Konstantu pro definovani rozmeru pole, bych osobne vynechal, vzhledem k tomu ze jeji jediny ucel je urcit rozmer pole je myslim zbytecne pouzit promennou a volil bych spis toto reseni:

Kód: [Vybrat]
#define VEL 10
...
typedef klient cekarna[ VEL ];
...
... což je c++ prasárna.

Proc?
Název: Re:Problém s úkolem C++
Přispěvatel: hawran diskuse 25. 01. 2018, 21:28:27
Mala poznamka :
Konstantu pro definovani rozmeru pole, bych osobne vynechal, vzhledem k tomu ze jeji jediny ucel je urcit rozmer pole je myslim zbytecne pouzit promennou a volil bych spis toto reseni:

Kód: [Vybrat]
#define VEL 10
...
typedef klient cekarna[ VEL ];
...
... což je c++ prasárna.

Proc?
c++ má specifikátor const.
#define pro konstanty v c++ je anachronismus(?)
achranofobie?
V každém případě konstanty s const jsou šéfované překladačem, #define je záležitost preprocesoru...
Název: Re:Problém s úkolem C++
Přispěvatel: D.A. Tiger 25. 01. 2018, 21:58:07
Mala poznamka :
Konstantu pro definovani rozmeru pole, bych osobne vynechal, vzhledem k tomu ze jeji jediny ucel je urcit rozmer pole je myslim zbytecne pouzit promennou a volil bych spis toto reseni:

Kód: [Vybrat]
#define VEL 10
...
typedef klient cekarna[ VEL ];
...
... což je c++ prasárna.

Proc?
c++ má specifikátor const.
#define pro konstanty v c++ je anachronismus(?)
achranofobie?
V každém případě konstanty s const jsou šéfované překladačem, #define je záležitost preprocesoru...

Ve vsem mas pravdu. Az na to, ze specifikator const byl ( - pokud si to dobre pamatuji - ) uz v C. A promena v tomto pripade zbytecne zabere sizeof(int) v pameti, kdezto pri pouziti makra mas nakonec stejny vysledek jako by jsi napsal :

Kód: [Vybrat]
typedef klient cekarna[ 10 ];
...

Coz mi pro tento pripad prijde vyhodnejsi.

Vis ono s temi makry je to trochu dvojaky. jeden cas jsem taky jako papousek opakoval, ze makra do C++ nepatri. Nic nevi o datovych typech, pri jejich rozvinuti mohou vznikat ruzne nechtene efekty atpd... Tehdy mi nekdo rikal, ze kdyz vis co delas muzes pouzit cokoliv. Nic neni samospasne a nic neni k zahozeni. Az Foxtoolkit mi ukazal (konkretne na tech makrech) jaka je to pravda....
Název: Re:Problém s úkolem C++
Přispěvatel: hawran diskuse 25. 01. 2018, 22:29:23
...
Už jsem z toho vypadl, nerad bych kecal, ale mám dojem, že esli const proměnná opravdu zabere nějakou paměť závisí na na jejím typu a kontextu.

Nicméně, 'Co je překladačovo, nechte překladači.'

PS: modifikátor const se v c choval hodně jinak...
Název: Re:Problém s úkolem C++
Přispěvatel: MarSik 26. 01. 2018, 00:27:16
const proměnná v moderním c++ žádné místo nezabere, pokud to není potřeba (třeba k získání pointeru). Těch podmínek je docela dost, ale const int L = 5; je rozhodně splňuje. Používám i na mikrokontrolerech a není s tím žádný problém. V objdumpu prostě neexistuje.

Viz http://en.cppreference.com/w/cpp/language/constant_expression
Název: Re:Problém s úkolem C++
Přispěvatel: MarSik 26. 01. 2018, 00:33:37
Nicméně, 'Co je překladačovo, nechte překladači.'

To sice ano, ale bez const tu proměnnou k určení velikosti pole použít nesmíte. Obecné pravidlo minimálně od C++11 je používat const  všude, kde to jen jde. Překladač si to přebere a vyoptimalizuje, ale ten hint je pro něj velmi užitečný.

To samé auto. Téměř všechny lokální proměnné s inicializací jsou ideálními kandidáty.