Diskuze: Nefunguje parsování
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 25 zpráv z 25.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.