Diskuze: Nefunguje parsování
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 25 zpráv z 25.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.


Tak je to již vyřešeno, jen nevím jak tenhle příspěvek odstranit 
Hledal jsem a hledal a ptal se všude možně, až jsem se dozvěděl že
"atoi" je součástí knihovny stdlib.h.
Takže stačí jen na začátek kodu připsat:
#include <stdlib.h>
A díky tomu mi to už bez problémů funguje 
Doporučuju kompilovat s pár přepínači (např -Wall) - vypíše ti to pak spoustu warningů a chybových hlášek, které to normálně nevypisuje.
Více se můžeš dočíst v http://www.itnetwork.cz/…c-linux-uvod
Jo a když máš takové otázky, tak ideálně přilož celý kód - buď
jako odkaz někam do pastebin, nebo je tu tlačítko vložit zdroják (pokud
není příliš dlouhý) nebo dole je možnost "Máš dlouhý zdroják?" - ale
tu jsem zatím nezkoušel 
Na ten problém jsem narazil konkrétně když jsem se zaobíral touhle
lekcí: http://www.itnetwork.cz/…-a-parsovani
Nevím sice jak to funguje u windowsu, ale myslím že by to do toho článku
bylo dobré pro úplnost uvést
.David Novák
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main(void)
{
cout << "Vítejte v kalkulačce" << endl;
cout << "Zadej první číslo" << endl;
string number;
cin >> number;
float a = atof(number.c_str());
cout << "Zadej druhé číslo" << endl;
cin >> number;
float b = atof(number.c_str());
float soucet = a + b;
float rozdil = a - b;
float soucin = a * b;
float podil = a / b;
cout << "Součet: " << soucet << endl;
cout << "Rozdíl: " << rozdil << endl;
cout << "Součin: " << soucin << endl;
cout << "Podíl: " << podil << endl;
cout << "Děkuji za použití této kalkulačky" << endl;
getchar();
}
Tady to je.
Hmm.. Teď na to koukám a je to nějaké divné.. 
atoi je funkce z knihovny C.. A až na nějaké rychlé prográmky pro ukázku by se vůbec neměla používat. Je totiž nebezpečná (nepoznáš spolehlivě, jestli parsování proběhlo úspěšně)..
V C++ použij stoi()
Jen pro doplnění - je celá rodina těchto funkcí.. V tomto případě je ekvivalent stof (string to float)
Použitím C++ funkcí taky nebudeš muset includovat C knihovnu - tedy tyto dva hlavičkové soubory:
#include <stdio.h>
#include <stdlib.h>
Snažím se to zapsat do toho mého kódu, ale nevím jak potřebuji nějakou nápovědu jak zní celý příkaz kterým nahradím např.
float a = atof(number.c_str());
http://www.cplusplus.com/…string/stof/
float a = stof(number, NULL);
Jestli tam NULL musí být, nebo ho můžeš úplně vynechat, si nejsem
jistý (nezkoušel jsem), ale normálně bys místo něj dal ukazatel, který by
pak ukazoval na první znak ve stringu, co není číslo (pro kontrolu
převodu).. To ale zatím nemusíš řešit. 
Jo a koukám, že je to součástí až C++11.. Takže by ti to nefungovalo, pokud bys v g++ zvolil třeba standard c++98.
Kompiluj takto:
$ g++ -std=c++11 -Wall -Werror your_file.cc -o your_program
Tak teď jsem to zapsal takhle:
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main(void)
{
cout << "Vítejte v kalkulačce" << endl;
cout << "Zadej první číslo" << endl;
string number;
cin >> number;
float a = stof(number);
cout << "Zadej druhé číslo" << endl;
cin >> number;
float b = stof(number);
float soucet = a + b;
float rozdil = a - b;
float soucin = a * b;
float podil = a / b;
cout << "Součet: " << soucet << endl;
cout << "Rozdíl: " << rozdil << endl;
cout << "Součin: " << soucin << endl;
cout << "Podíl: " << podil << endl;
cout << "Děkuji za použití této kalkulačky" << endl;
getchar();
}
Tak nevím proč to teď nefunguje
.
Bezva, tak už to funguje jak má
.
Bylo potřeba dát druhý argument NULL? Nebo byl problém, že jsi to nepřekládal jako C++11?
Jo a to getchar na konci vyhoď (a s ním i stdio.h) - nejsme na windows, aby
naše programy čekaly na zadání znaku 
Na linuxu je typicky nespouštíme pomocí ikony a konzole se nám po
vykonání programu nezavře 
To druhý, stačilo jen použít C++11 a začalo to fungovat. Ani nebylo
třeba parametru NULL
.
Takže kód teď vypadá takhle:
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
cout << "Vítejte v kalkulačce" << endl;
cout << "Zadej první číslo" << endl;
string number;
cin >> number;
float a = stof(number);
cout << "Zadej druhé číslo" << endl;
cin >> number;
float b = stof(number);
float soucet = a + b;
float rozdil = a - b;
float soucin = a * b;
float podil = a / b;
cout << "Součet: " << soucet << endl;
cout << "Rozdíl: " << rozdil << endl;
cout << "Součin: " << soucin << endl;
cout << "Podíl: " << podil << endl;
cout << "Děkuji za použití této kalkulačky" << endl;
}
Len taká dobrá rada, aj keď si začiatočník, tak je dobrým zvykom
naučiť sa ošetrovať trochu vstupy používateľa.. skús si napríklad do
tvojho programu zadať niečo iné ako číslo. Skús tam zadať ako druhé
číslo 0 
No jo když jsem zadal tohle:
Vítejte v kalkulačce
Zadej první číslo
21
Zadej druhé číslo
0
Součet: 21
Rozdíl: 21
Součin: 0
Podíl: inf
Tak to najednou tak skvěle nefunguje.
Jak můžu docílit toho aby se tam místo toho
Podíl: inf
napsalo něco jako:
Podíl: Nelze dělit nulou
Prostě jak to inf něčím nahradit 
Buď se můžeš ponořit do výjimek.. Což pro začátečníka asi nebude to nejlepší.. A nebo to udělat klasicky podmínkou..
Po načtení a převedení toho čísla ověříš, jestli to není nula..
if (b != 0)
{
float podil = a / b;
cout << "Podíl: " << podil << endl;
}
else
cout << "Podíl: Nelze dělit nulou" << endl;
Ty jo, to je super funkce
.
Tak a teď ještě zkusím vymyslet jak to udělat aby při zadání čísla
místo písmena program nespadnul.
Hádam naopak, zadanie písmena namiesto číslice? 
Tu máš prehladnú funkciu, uprav si ju podľa seba:
#include <iostream>
#include <string.h>
using namespace std;
bool jeCislo(string cislo)
{
int i = 0, bodka = 0;
bool je = true;
while (cislo[i]) {
if ((cislo[i] < '0' || cislo[i] > '9') && cislo[i] != '.') { // znaky su ine ako cislice a bodka
je = false;
}
if (cislo[i] == '.') // spocitanie bodiek
bodka++;
i++;
}
if (bodka > 1) // ak je viac bodiek ako jedna, cislo je neplatne
je = false;
return je;
}
int main(void)
{
string cislo = "12582.5658"; // vyskusaj si rozne varianty "12582.56.58", "12582,5658", "12582=5658"
if (!jeCislo(cislo))
cout << "Nespravne zadanie!" << endl;
else
cout << cislo << endl;
return 0;
}
Super
.
A jde to rozdělit na víc souborů ? Třeba že bych se jen v tom prvním
souboru, odkázal na tu funkci.
Bylo by to pak mnohem přehlednější
.
Zobrazeno 25 zpráv z 25.