Jak wyświetlić błąd w programie gdy podana liczba jest ujemna lub zbyt duża

2018-11-21 11:02
0

Dzień dobry,
Program sumuje cyfry podanej liczby. Chcę wyświetlić błąd, gdy podana liczba jest ujemna lub zbyt duża, aby przechować ją w int. Jak mogę to zrobić?
Jak mogę rozwiązać ćwiczenie bez użycia string i array?
Pozdrawiam serdecznie

#include <climits>
#include <cmath>
#include <iostream>
using namespace std;
void sumOfNumber();
int main()
{
    char answer;

    do
    {
        sumOfNumber();
        cout << "\nOneMoreTime (Y/N) : ";
        cin >> answer;

    } while (answer == 'Y' || answer == 'y');
    return 0;
}

void sumOfNumber()
{
    int val, num, sum = 0;
    cout << "Enter the number : ";
    cin >> val;
    num = val;
    while (num != 0 && num <= INT_MAX)
    {
        sum = sum + num % 10;
        num = num / 10;
    }
    cout << "The sum of the digits of the given number is " << sum;

} 
edytowany 1x, ostatnio: furious programming, 2018-11-21 17:38

Pozostało 580 znaków

2018-11-21 11:03
0

https://stackoverflow.com/que[...]ow-to-detect-integer-overflow

Majac dwie liczby robisz tak:

int pozostalo = INT_MAX - liczba1;

if (pozostalo < liczba2) { 
    cout<<"Liczba jest za duza";
}

W lini:

while (num != 0 && num <= INT_MAX)

Jest Undefined Behaviour, bo podczas przepelnienia liczba staje sie ujemna i zawsze bedzie mniejsza of INT_MAX poza tym kiedy moze byc rowna :)
Nigdy nie bedzie wieksza chyba ze dla num uzyjesz wiekszy zakres niz posiada INT. Ale ihmo nie jest to chyba zbyt dobre rozwiazanie :)

edytowany 2x, ostatnio: daniel1302, 2018-11-21 11:10

Pozostało 580 znaków

2018-11-21 11:08
kq

Jak podana liczba nie mieści się w int, to cin >> val będziesz mógł porównać do false - i tak właśni zrób.


Pozostało 580 znaków

2018-11-21 11:52
0

Niestety, nie ogarniam... czy mam się pozbyć się pętli while i zamienić ja na if?

Pozostało 580 znaków

2018-11-21 12:32
0

kq chodzi o konstrukcję:

    cout << "Enter the number : ";
    if ((cin >> val) == false)
    {
        cout << " Entered number exceeds int size, handle this";
    }

"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

2018-11-21 13:33
0

Przepraszam, nadal nie mogę sobie poradzić. W załączniku błędy, które mi wyskakują.

void sumOfNumber()
{
    int val, num, sum = 0;
    cout << "Enter the number : ";
    if ((cin >> val) == false)
    {
        cout << " Entered number exceeds int size, handle this";

    }
    cin >> val;
    num = val;
    while (num != 0 && num <= INT_MAX)
    {
        sum = sum + num % 10;
        num = num / 10;
    }
    cout << "The sum of the digits of the given number is " << sum;

} 

screenshot-20181121133240.png

Pozostało 580 znaków

2018-11-21 13:52
0

Hmm faktycznie, zilustrowałem po prostu co kq powiedział, ale cin nie ma operatora ==. Zatem poprawna wersja wygląda tak:

    cout << "Enter the number : ";
    if ((cin >> val).fail() == true)
    {
        cout << " Entered number exceeds int size, handle this";
        //przy okazji, ta konstrukcja sobie poradzi z sytuacją, kiedy ktoś zamiast liczby wpisze ci np "dupa"
    }

"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 1x, ostatnio: MasterBLB, 2018-11-21 13:54
Nope, iostreamy mają fail, bad, good i one mają różne wartości w różnych kombinacjach, lepiej użyć ich operatora bool (który, nota bene, prawie poprawnie użyłeś w poprzednim poście) - kq 2018-11-21 15:52
rozumiem, że użycie cin >> sth jako bool powoduje sprawdzenie, czy jednocześnie fail == false, bad == false, good == true, tak? - MasterBLB 2018-11-21 17:37

Pozostało 580 znaków

2018-11-21 13:55
1

@MasterBLB wydaje mi się że @kq chodziło o taki zapis

if (!(cin >> val))

Od C++11 basic_ios posiada operator bool.

edytowany 2x, ostatnio: several, 2018-11-21 13:59
tak jest - kq 2018-11-21 15:52

Pozostało 580 znaków

2018-11-21 14:05
0

Dziękuję za wszystkie odpowiedzi. Program się zawiesza, co zrobię źle?

void sumOfNumber()
{
    int val, num, sum = 0;
    cout << "Enter the number : ";
    if (!(cin >> val))
    {
        cout << " Entered number exceeds int size, handle this";
    }
    cin >> val;
    num = val;
    while (num != 0 && num <= INT_MAX)
    {
        sum = sum + num % 10;
        num = num / 10;
    }
    cout << "The sum of the digits of the given number is " << sum;

}

Pozostało 580 znaków

2018-11-21 14:12
1
kaslee napisał(a):

Program się zawiesza, co zrobię źle?

Trujesz głowę ludziom na forum zamiast odpalić debugger, dowiedzieć się, która linia zawiesza program, i dopiero pisać posta jak nie wiesz, czemu ta konkretna linia programu nie działa.


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

2018-11-21 14:56
0

Jestem na tym etapie, na którym nie wiem nawet jak korzystać z debuggera, wstyd się przyznać. Przepraszam i dziękuję za wszystkie odpowiedzi.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0