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

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;
    
} 
0

https://stackoverflow.com/questions/199333/how-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 :)

1

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.

0

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

0

kq chodzi o konstrukcję:

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

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"
    }
1

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

if (!(cin >> val))

Od C++11 basic_ios posiada operator bool.

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;
 
}
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.

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.

0

@kaslee ależ to nie jest najmniejszy nawet powód do wstydu! Bardzo dobrze, że poruszyłeś temat.
Generalnie, jeśli dobrze ogarniasz angielski to w google znajdziesz mnóstwo artykułów, czym jest proces debugowania, i jak się go robi w konkretnym środowisku programistycznym.
W czym ten program piszesz, Visual Studio może?

0

Dzięki, MasterBLB.
Następna rzecz do której głupio się przyznać, używam www.onlinegdb.com. Wiem, ze maja debugger ale może łatwiej korzystałoby się z Visual Studio?

1

Hah, też go używam :]
Otóż dla prostych celów jest wystarczający. Jednak szczerze powiem, debugger z Visual Studio jest o parę klas wygodniejszy i bardziej zaawansowany.
Co do debugowania, to ma jakiś samouczek po użyciu przycisku "Debug" tam na górze okna edytora. Generalnie najistotniejsze jest stawianie breakpoint'ów oraz wykonywanie step over i step into.
Jak coś będzie niejasne nie obawiaj się pisać, my tu tylko leni co to by na gotowe chcieli nie lubimy, jak widać, że człowiek próbuje coś własnymi siłami zrobić to nie widziałem jeszcze, żeby mu odmówiono pomocy.

0

Spróbuj najprościej:

	    int val;
		bool val_test = cin >> val;
		if (! val_test || val < 0) {
			cout << "Error, exit";
				return (1);
		}
      //carry on...
0

Dziękuję wszystkim za podpowiedzi! Trochę to zajęło, ale w końcu się udało :):) Z debuggerem nadal walczę. Pozdrawiam serdecznie!

#include <climits>
#include <iostream>
using namespace std;
int main()
{
	int input; 
	double in;
	bool run_me_again = true;
	int a = INT_MAX; 
	char run_me_again_check; 
	while (run_me_again)  
	{
		int sum = 0;
		bool breakme = true;
		do { 
			cout << "Please input the integer:  ";
			cin >> in;
			if (in<0)
				cout << "You entered negative value. Please try again. " << endl;
			else if (in > INT_MAX)
				cout << "Entered value is too long. Please try again. " << endl;
		} while (in < 0 || in > INT_MAX);

		input = in;

		while (breakme)
		{
			if (input < 10)
			{

				sum = sum + input;
				breakme = false;
			}
			else
			{
				sum = sum + (input % 10); 
				input = input / 10; 
			}
		}
		cout << "Sum of the integers is " << sum << endl;
		cout << "One more time? (Y/N) ";
		cin >> run_me_again_check;
		if (run_me_again_check == 'Y' || run_me_again_check == 'y')
			run_me_again = true;
		else
			run_me_again = false;
	}
	system("pause");
	return 0;
}

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