Mini parser - liczenie rezystancji

0

Wymyslilem sobie, że zrobię sobie programik do liczenia rezystacji zastępczej.
Miał polegać na tym, że podaję stringa, np. "30 | 40 + 10", gdzie znak "|" oznacza połaczenie równoległe a '+' szeregowe, i progam wyrzuca mi rezystancję zastępcza.

W większości wypadków wynik jest dobry. Przykładowy łancuch dla którego występuje bład to "10|10 + 50 +3". Powinno być 58, a wypisuje 85.

#include<iostream>
#include<string>
#include<conio.h>

int main () {

string wejscie;

for(;;) {

wejscie.erase();
getline (cin, wejscie);
cout<< rezystancja (wejscie)<<endl;

system("pause");
system("cls");
}

}

double rezystancja (string &lancuch) {

bool rownolegle=0;
double wynik=0, konduktancja=0; 
int dlugosc = lancuch.size();
string roboczy;

roboczy.erase();
lancuch += "+";


for(int i=0,k=0; i< dlugosc ;){
        
        
        
        for(;(isdigit(lancuch[i]) || lancuch[i]=='.') && (i<dlugosc);){
                     roboczy[k]= lancuch[i];
                     k++;
                     i++;
        }
        
        for(;(lancuch[i] == ' ') && (i < dlugosc) ;)
                      i++;
        
        if(lancuch[i] == '+'){
                      
                      if (rownolegle)  {
                      konduktancja += (1/ atof (roboczy.c_str()));
                      wynik += (1/konduktancja);
                      rownolegle =0;
                      i++;
                      k=0;
                      roboczy.erase();
                      konduktancja =0;
                      }
                      
                      else {
                      wynik += atof (roboczy.c_str());
                      i++;
                      roboczy.erase();
                      k=0;
                      }
                      }
        
                      if(lancuch[i] == '|'){
                      konduktancja += (1 / atof(roboczy.c_str()));
                      rownolegle =1;
                      i++;
                      k=0;
                      roboczy.erase();
                      }
               
}

return  wynik;
}



0

Nie wiem co zmienił Ranides - ale kod ok.
Btw, można jedynie się przyczepić do linijki :

roboczy[k] = lancuch[i];

U mnie w VC++ 2005EE ta linijka się wysypuje.. nie wiem jak na innych kompilatorach.
Zmieniając na :

roboczy += lancuch[i];

działa bez zarzutu ;>

Czy konstrukcja 1 jest w ogóle poprawna jeśli wcześniej usunięto zawartość stringa ?
Czy można w ogóle napisać :

string s = "abc";
s.erase();
s[0] = 'a';
s[100] = 'b';

??

0

@vivo:
zmieniłem tylko tagi kolorujące składnię, bo przedtem było w zwykłym < code >

a spostrzeżenie bardzo trafne. jasne że nie można grzebać po erase, program oryginalny na MinGW się kompiluje i zachowuje się dokładnie tak źle, jak autor napisał. Poprawiony zgodnie z twoją uwagą zachowuje się dobrze.

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