• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyjątek out_of_range C++

Aruba Cloud - Virtual Private Server VPS
0 głosów
288 wizyt
pytanie zadane 15 października 2019 w C i C++ przez Karpik Użytkownik (680 p.)

Postanowiłem zrobić program, który podnosi liczbę do podanej potęgi. Kod wygląda następująco:

#include "pch.h"
#include <iostream>
#include <string>

using namespace std;

int main()
{
	ios_base::sync_with_stdio(0);

	string	liczbaStr, wykladnikStr;
	int		liczbaInt = 0, wykladnikInt = 0;
	
	
	cout << "Wprowadz podstawe: ";
	cin >> liczbaStr;	
	
	cout << "Wprowadz wykladnik (liczba naturalna): ";
	cin >> wykladnikStr;

	for (int t = 0; t < liczbaStr.length(); t++)
	{
		if (!(liczbaStr[t] >= 48))
		{
			cout << "Wprowadzono nieprawidlowe dane!\n";
			return 0;
		}
		
		else if(!(liczbaStr[t] < 58))
		{
			cout << "Wprowadzono nieprawidlowe dane!\n";
			return 0;
		}
	}
	
	for (int f = 0; f < wykladnikStr.length(); f++)
	{
		if (!(wykladnikStr[f] >= 48))
		{
			cout << "Wprowadzono nieprawidlowe dane!\n";
			return 0;
		}
		
		else if(!(wykladnikStr[f] < 58))
		{
			cout << "Wprowadzono nieprawidlowe dane!\n";
			return 0;
		}
	}
	
	liczbaInt = stoi(liczbaStr);
	wykladnikInt = stoi(wykladnikStr);

	if ((liczbaInt == 0) && (wykladnikInt == 0))
	{
		cout << "To dzialanie nie jest mozliwe!\n";
		return 0;
	}

	if (wykladnikInt == 1)
	{
		cout << "Wynik: " << liczbaInt << "\n";
		return 0;
	}

	if (wykladnikInt == 0)
	{
		cout << "Wynik: 1\n";
		return 0;
	}

	int I = liczbaInt;
	long long II = liczbaInt;

	for (int i = 2; i <= wykladnikInt; i++)
	{
		II = II * I;
	}


	if (II <= 0)
	{
		cout << "Wynik przekroczyl zakres...\n";
		return 0;
	}


	cout << "Wynik: " << II << "\n";

	return 0;
}




 Niestety - program umiera przy bardzo dużych liczbach... W Visual Studio pojawia się, że wyjątek out_of_range nie jest obsłużony... Ktoś wie jak to naprawić? jak obsłużyć ten wyjątek? Szukałem na youtube ale tam tylko c# i programowanie obiektowe... 

2 odpowiedzi

0 głosów
odpowiedź 15 października 2019 przez j23 Mędrzec (195,240 p.)

Zamiast stoi użyj stoll.

 

if (!(liczbaStr[t] >= 48))

Po co tak komplikować. Nie prościej tak: if (liczbaStr[t] < 48) ?

Zapoznaj się z funkcją isdigit.

0 głosów
odpowiedź 15 października 2019 przez Velta Maniak (52,830 p.)
  • Po co przyjmujesz liczby jako ciągi znaków, a później przeprowadzasz walidację? Możesz od razu wykonać operację wyjścia na liczbę całkowitą / rzeczywistą. Zbędny kod. Później i tak konwertujesz ciąg znaków na liczbę.
  • if ((liczbaInt == 0) && (wykladnikInt == 0))
    {
        cout << "To dzialanie nie jest mozliwe!\n";
        return 0;
    }

    Dlaczego pojawiła się taka instrukcja warunkowa? 0^0 = 1.

  • Nie musisz się męczyć ze znakami ucieczki. W C++ jest funkcja endl.

  • Zamiast dziwnych pętli użyj po prostu funkcji pow.

  • Dodaj przed zakończeniem programu oczekiwanie na interakcję użytkownika, by mógł spokojnie zobaczyć wynik.

komentarz 15 października 2019 przez tkz Nałogowiec (42,020 p.)

0^0 = 1.

0 koniunkcja 0 to 0, nie 1.

if ((liczbaInt == 0) && (wykladnikInt == 0))
{
    cout << "To dzialanie nie jest mozliwe!\n";
    return 0;
}

Jeżeli liczbaInt to 0 i wykladnikInt to 0, mamy dwie prawdy, co po złożeniu(jeżeli oba warunki są prawdziwe) da nam 1, czyli if się wykona. 

Nie musisz się męczyć ze znakami ucieczki. W C++ jest funkcja endl.

https://stackoverflow.com/questions/213907/c-stdendl-vs-n

 

 

komentarz 18 października 2019 przez Karpik Użytkownik (680 p.)

@Velta, 

1) Uzytkownik wprowadza liczby jako ciąg znaków, aby wszystko było w pełni idiotoodporne. Po sprawdzeniu czy aby na pewno każdy znak jest liczbą (if(!(cin >> n)) nie robi tego w pelni, ucina kiedy napotka problem) dokonuje konwersji na liczbe.

2) Wiem że istnieje funkcja pow, jednak chciałem samemu napisać program, który petęguje liczby.

3) W środowisku z którego korzystam program automatycznie zatrzymuje się po wykonaniu. 

Podobne pytania

0 głosów
2 odpowiedzi 850 wizyt
pytanie zadane 18 kwietnia 2020 w C i C++ przez Bartosz Paterek Początkujący (410 p.)
0 głosów
0 odpowiedzi 143 wizyt
pytanie zadane 5 maja 2020 w C i C++ przez amtrax Dyskutant (9,630 p.)
+1 głos
1 odpowiedź 309 wizyt

93,335 zapytań

142,328 odpowiedzi

322,407 komentarzy

62,670 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...