Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 27. 09. 2013 21:09 — Editoval Nefritox (27. 09. 2013 21:11)

Nefritox
Zelenáč
Příspěvky: 15
Reputace:   
 

C++ pojištěni vstupu

Zdravím,
potřeboval bych poradit jak ošetřit vstup u tohodle programku, něco jsem už vymyslel, nicmeně nefunguje to tak jak bych chtěl... Má to načíst 4 čísla(souřadnice dvou bodů) a následně spočitat střed kružnice a poloměr... Potřebuju tam dat nějakou podminku že načitané hodnoty musí být čiselne at po zadani neceho jineho do vstupu to vyhlasi chybovou hlasku. Např když zadam "ahoj" misto čisla at to napiše "Nespravny vstup.". Nicméně problém je v tom že moje řešení nějak nebere desetiná čísla čili když zadam 1,5 do vstupu tak to hodi taky chybovou hlašku. Budu rad za jakykoliv navrh ;)

Code:

#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;

int main()
{
    cout << "Zadejte souradnice bodu A a B:" << endl;
    double a, b, c, d;
    bool req = true;

if (!(cin >> a))
    req = false;
    cin.clear();
if (!(cin >> b))
    req = false;
    cin.clear();
if (!(cin >> c))
    req = false;
    cin.clear();
if  (!(cin >> d))
    req = false;
    cin.clear();

if (!req)
{
    cout << "Nespravny vstup." << endl;
    return 0;
}

    double S1 = ((a+c)/2);
    double S2 = ((b+d)/2);
    double polomer = (sqrt(pow((a-c), 2)+pow((b-d), 2)))/2;

    cout.setf(ios::fixed);
    cout.precision(6);
    cout << "Stred kruznice je: " << "S[" << S1 << "," << S2 << "]" << endl;
    cout << "Polomer kruznice r ma hodnotu: " << polomer << endl;
    return 0;

}

Offline

 

#2 02. 10. 2013 12:21

Marcopolo
Zelenáč
Příspěvky: 15
Škola: ČVUT - FEL
Reputace:   
 

Re: C++ pojištěni vstupu

↑ Nefritox:
Pokud chceš dosáhnout toho že to bude brát pouze čísla, tak jediná možnost je brát vstup jako string
a pak jej od filtrovat.

zde je kousek kodu:

Code:

bool isDecimal(std::string & s)
{
    // od filtrovani bilich mezer:
    unsigned index = 0 ;
    while ( index < s.length() && std::isspace(s[index]) )
        ++index ;

    bool decimalEncountered = false ;
if ( s[index] == '$' || std::isdigit(s[index]) || s[index] == '.' )
{
        if ( s[index] == '$' )
        {
            if ( index+1 >= s.length() )
                return false ;
            
            s[index] = ' ' ;  // odstraneni $
        }   

        if ( s[index++] == '.' )
        {
            if (index >= s.length() )
                return false ;
            decimalEncountered = true ;
        }

        while ( index < s.length() )
        {
            if ( !std::isdigit(s[index]) )
            {
                if ( !s[index] == '.' || decimalEncountered )
                    return false ;

                decimalEncountered = true ;
            }

            ++index ;
        }

        return true ;
    }
    return false ;
}

tohle jedna z moznych metod


Quod erat Demonstrandum

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson