[C++] Błąd aplikacji - std::out_of_range
Ostatnio zmodyfikowano 2013-08-08 08:53
luky92 Temat założony przez niniejszego użytkownika |
[C++] Błąd aplikacji - std::out_of_range » 2013-08-07 17:04:14 W poniższym kodzie występuje taki właśnie błąd nie mam pojęcia czemu i proszę o pomoc
#include "stdafx.h" struct nawias { int lewy; int prawy; }; long int potega( long int podstawa, int wykladnik ) { int wynik = 1; for( int i = 0; i < wykladnik; i++ ) wynik *= podstawa; cout << wynik; return wynik; } string wytnij_nawias( struct nawias tnij ); double wykonaj_dzialanie( string dzialanie ); double wykonaj_dzialanie_wiele_znakow( string dz ); int _tmain( int argc, _TCHAR * argv[] ) { cout << "\nWynik" << wykonaj_dzialanie_wiele_znakow( "2+2^2" ); getch(); return 0; }
double wykonaj_dzialanie( string dzialanie ) { int i = 0; for( i; i <= dzialanie.length(); i++ ) if( dzialanie[ i ] == '+' || dzialanie[ i ] == '-' || dzialanie[ i ] == '\\' || dzialanie[ i ] == '*' || dzialanie[ i ] == '^' ) break; string pierwsza = dzialanie.substr( 0, i ); string druga = dzialanie.substr( i + 1, dzialanie.length() ); double pierwsza_db = atof( pierwsza.c_str() ); double druga_db = atof( druga.c_str() ); cout << "\n" << dzialanie << "\n" << dzialanie[ i ] << "\n" << pierwsza << "\n" << druga << "\n" << pierwsza_db << "\n" << druga_db; if( dzialanie[ i ] == '+' ) return pierwsza_db + druga_db; if( dzialanie[ i ] == '-' ) return pierwsza_db - druga_db; if( dzialanie[ i ] == '*' ) return pierwsza_db * druga_db; if( dzialanie[ i ] == '^' ) return pow( pierwsza_db, druga_db ); if( dzialanie[ i ] == '/' && druga_db != 0 ) return pierwsza_db / druga_db; else return ERROR_ZERO_DEVIDE; } int sprawdz_liczbe_nawiasow( string dzialanie ) { int licznik_lewe = 0, licznik_prawe = 0; for( int i = 0; i <= dzialanie.length(); i++ ) { if( dzialanie[ i ] == '(' ) licznik_lewe++; if( dzialanie[ i ] == ')' ) licznik_prawe++; } if( licznik_lewe == licznik_prawe ) return 1; return 0; } bool sa_nawiasy( string dzialanie ) { for( int i = 0; i <= dzialanie.length(); i++ ) if( dzialanie[ i ] == '(' || dzialanie[ i ] == ')' ) return true; return false; } nawias zwroc_najb_wew( string dzialanie ) { struct nawias dotych; for( int i = 0; i <= dzialanie.length(); i++ ) { if( dzialanie[ i ] == '(' ) dotych.lewy = i; if( dzialanie[ i ] == ')' ) dotych.prawy = i; } return dotych; } int ile_znakow_dzialan( string dzialanie ) { int j = 0; for( int i = 0; i <= dzialanie.length(); i++ ) if( dzialanie[ i ] == '+' || dzialanie[ i ] == '-' || dzialanie[ i ] == '/' || dzialanie[ i ] == '*' || dzialanie[ i ] == '^' ) j++; return j; } char zwroc_najw_priorytet( string dzialanie ) { char zwrot; for( int i = 0; i <= dzialanie.length(); i++ ) { if( dzialanie[ i ] == '+' || dzialanie[ i ] == '-' ) zwrot = dzialanie[ i ]; if( dzialanie[ i ] == '*' || dzialanie[ i ] == '/' ) zwrot = dzialanie[ i ]; if( dzialanie[ i ] == '^' ) zwrot = dzialanie[ i ]; } return zwrot; } int znajdz_nasetepny_znak_z_prawej( string dzialanie, int start ) { for( int i = start + 1; i <= dzialanie.length(); i++ ) if( dzialanie[ i ] == '+' || dzialanie[ i ] == '-' || dzialanie[ i ] == '/' || dzialanie[ i ] == '*' || dzialanie[ i ] == '^' ) return i; } int znajdz_nasetepny_znak_z_lewej( string dzialanie, int start ) { for( int i = start - 1; i <= 0; i-- ) if( dzialanie[ i ] == '+' || dzialanie[ i ] == '-' || dzialanie[ i ] == '/' || dzialanie[ i ] == '*' || dzialanie[ i ] == '^' ) return i; } double wykonaj_dzialanie_wiele_znakow( string dzialanie ) { int poz; char d = zwroc_najw_priorytet( dzialanie ); poz = dzialanie.find( d ); int poczatek_ciecia = znajdz_nasetepny_znak_z_lewej( dzialanie, poz ); int koniec_ciecia = znajdz_nasetepny_znak_z_prawej( dzialanie, poz ); string subsum = dzialanie.substr( poczatek_ciecia, koniec_ciecia ); double syb_wybik = wykonaj_dzialanie( subsum ); ostringstream ss; ss << syb_wybik; string a = dzialanie.substr( 0, poczatek_ciecia ); string b = ss.str(); string c = dzialanie.substr( koniec_ciecia, dzialanie.length() ); dzialanie = a + b + c; cout << dzialanie; return 0; }
Problem prawdopodobnie dotyczy funkcji wykonaj_dzialanie_wiele_znakow(string dzialanie)
problem rozwiązałem temat można usunąć (całkowicie) |
|
DejaVu |
» 2013-08-08 08:53:55 Problem dotyczy wszystkich funkcji jak leci. Wychodzisz poza zakres tablicy. |
|
« 1 » |