Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Błąd aplikacji - std::out_of_range

Ostatnio zmodyfikowano 2013-08-08 08:53
Autor Wiadomość
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
C/C++
// kalk.cpp: Określa punkt wejścia dla aplikacji konsoli.
//

#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[] )
{
    //string input;
    //cin>>input;
   
    cout << "\nWynik" << //wykonaj_dzialanie(input);
    wykonaj_dzialanie_wiele_znakow( "2+2^2" );
    //cout<<pow(5,3);
    //potega(5,3);
    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)
P-89697
DejaVu
» 2013-08-08 08:53:55
Problem dotyczy wszystkich funkcji jak leci. Wychodzisz poza zakres tablicy.
P-89717
« 1 »
  Strona 1 z 1