Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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
#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
#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);
}
-
Ahoj mas tam o = navic
void init(cekarna&vstup){
for(int x=0;x<VEL;x++){
vstup
vstup
vstup
vstup
}
snad takhle ...
-
A v čom máš konkrétne problém ?
tvoj "NEFUNGUJE" kod sa mi bezproblemov zkompiloval a spustil, len si initom prepisujes Anetu....
-
Problém je v tom, že když to zkompiluju, tak to nic nevypíše na obrazovku.
-
Už funguje díky.
-
Zabudol si to kompilácii spustiť ? ;)
to občas aj mne stáva a polhodinu hľadám, kde je chyba :D
-
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).
-
Tipnem si: Problem bol tu:
for(int x=0;x <= VEL;x++){
-
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
-
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.
-
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ý...
-
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:
#define VEL 10
...
typedef klient cekarna[ VEL ];
...
-
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:
#define VEL 10
...
typedef klient cekarna[ VEL ];
...
... což je c++ prasárna.
-
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:
#define VEL 10
...
typedef klient cekarna[ VEL ];
...
... což je c++ prasárna.
Proc?
-
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:
#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...
-
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:
#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 :
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....
-
...
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...
-
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
-
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.