Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
pacal.jakub
Člen
Avatar
pacal.jakub:19.7.2015 8:10

Ahoj
Začal jsem se včera učit programovat. Ale zadrhl jsem se u jednoho problému který chci vyřešit.
Používám linux, všechny zdrojáky píšu do textového editoru "nano" a potom si je nechám zkompilovat pomocí g++. Zatím to vycházelo, jenže teď si g++ z nějakého důvodu neumí poradit s příkazem:

int _a = atoi(_s.c_str());

Zkoušel jsem všechno možné ale nedokázal jsem to nijak vyřešit. Máte nějaké rady a postřehy ?

 
Odpovědět
19.7.2015 8:10
Avatar
pacal.jakub
Člen
Avatar
pacal.jakub:19.7.2015 9:48

Tak je to již vyřešeno, jen nevím jak tenhle příspěvek odstranit :-D

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
19.7.2015 9:48
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na pacal.jakub
David Novák:19.7.2015 10:33

napiš sem, jak jsi to vyřešil ;)

Nahoru Odpovědět
19.7.2015 10:33
Chyba je mezi klávesnicí a židlí.
Avatar
pacal.jakub
Člen
Avatar
pacal.jakub:19.7.2015 13:10

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

 
Nahoru Odpovědět
19.7.2015 13:10
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na pacal.jakub
David Novák:19.7.2015 13:20

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 :D

Nahoru Odpovědět
19.7.2015 13:20
Chyba je mezi klávesnicí a židlí.
Avatar
pacal.jakub
Člen
Avatar
Odpovídá na pacal.jakub
pacal.jakub:19.7.2015 13:22

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

 
Nahoru Odpovědět
19.7.2015 13:22
Avatar
pacal.jakub
Člen
Avatar
Odpovídá na David Novák
pacal.jakub:19.7.2015 13:26
#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.

 
Nahoru Odpovědět
19.7.2015 13:26
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na pacal.jakub
David Novák:19.7.2015 13:28

Hmm.. Teď na to koukám a je to nějaké divné.. :-S

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

Nahoru Odpovědět
19.7.2015 13:28
Chyba je mezi klávesnicí a židlí.
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na pacal.jakub
David Novák:19.7.2015 13:36

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>
Editováno 19.7.2015 13:37
Nahoru Odpovědět
19.7.2015 13:36
Chyba je mezi klávesnicí a židlí.
Avatar
pacal.jakub
Člen
Avatar
pacal.jakub:19.7.2015 13:37

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());
 
Nahoru Odpovědět
19.7.2015 13:37
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na pacal.jakub
David Novák:19.7.2015 13:44

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
Nahoru Odpovědět
19.7.2015 13:44
Chyba je mezi klávesnicí a židlí.
Avatar
pacal.jakub
Člen
Avatar
Odpovídá na pacal.jakub
pacal.jakub:19.7.2015 13:48

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 :( .

 
Nahoru Odpovědět
19.7.2015 13:48
Avatar
pacal.jakub
Člen
Avatar
pacal.jakub:19.7.2015 13:54

Bezva, tak už to funguje jak má :) .

 
Nahoru Odpovědět
19.7.2015 13:54
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na pacal.jakub
David Novák:19.7.2015 14:05

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 :D

Na linuxu je typicky nespouštíme pomocí ikony a konzole se nám po vykonání programu nezavře ;)

Editováno 19.7.2015 14:06
Nahoru Odpovědět
19.7.2015 14:05
Chyba je mezi klávesnicí a židlí.
Avatar
pacal.jakub
Člen
Avatar
pacal.jakub:19.7.2015 14:10

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;
}
 
Nahoru Odpovědět
19.7.2015 14:10
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na pacal.jakub
David Novák:19.7.2015 14:11

Hned je to hezčí, ne? ;)

Nahoru Odpovědět
19.7.2015 14:11
Chyba je mezi klávesnicí a židlí.
Avatar
pacal.jakub
Člen
Avatar
 
Nahoru Odpovědět
19.7.2015 14:12
Avatar
Odpovídá na pacal.jakub
Neaktivní uživatel:19.7.2015 16:29

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

Nahoru Odpovědět
19.7.2015 16:29
Neaktivní uživatelský účet
Avatar
pacal.jakub
Člen
Avatar
Odpovídá na Neaktivní uživatel
pacal.jakub:19.7.2015 16:47

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.

 
Nahoru Odpovědět
19.7.2015 16:47
Avatar
pacal.jakub
Člen
Avatar
pacal.jakub:19.7.2015 17:04

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

 
Nahoru Odpovědět
19.7.2015 17:04
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na pacal.jakub
David Novák:19.7.2015 23:04

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;
Nahoru Odpovědět
19.7.2015 23:04
Chyba je mezi klávesnicí a židlí.
Avatar
pacal.jakub
Člen
Avatar
pacal.jakub:20.7.2015 18:49

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.

 
Nahoru Odpovědět
20.7.2015 18:49
Avatar
Odpovídá na pacal.jakub
Libor Šimo (libcosenior):21.7.2015 7:09

Hádam naopak, zadanie písmena namiesto číslice? ;-)

Nahoru Odpovědět
21.7.2015 7:09
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):21.7.2015 9:01

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;
}
Editováno 21.7.2015 9:03
Nahoru Odpovědět
21.7.2015 9:01
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
pacal.jakub
Člen
Avatar
pacal.jakub:21.7.2015 11:53

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ší :) .

 
Nahoru Odpovědět
21.7.2015 11:53
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 25 zpráv z 25.