nie działający mechanizm sprawdzania - liczby zespolone

0

Hej mam prośbę mógłby mi ktoś pomóc, bo chciałem żeby program sprawdzał czy dobrze wprowadziłem dane i ewentualnie wyrzucał błąd ale coś mi nie idzie to... np gdy wprawdzam 1+d3 - to wyskakuje błąd, program nie pyta o drugą liczbę, liczy podając wyniki z tego dodawania. np gdy podam mu 1+3i to wyświetla że dobrze wprowdziłem, nie pyta o drugą liczbę, liczy, podając wyniki z tego dodawania.
Oto kod:

#include <iostream>
#include <cmath>
using namespace std;
// klasa
class zespolona
  {
   public:
   double re;                           //czesc rzeczywista
   double im;                           //czesc urojona
   zespolona(double re=0,double im=0):re(re),im(im) {} 
   zespolona operator+(const zespolona &z)const;    // dzialania na liczbach
   zespolona operator-(const zespolona &z)const;
   zespolona operator*(const zespolona &z)const;
   zespolona operator/(const zespolona &z)const;
   bool operator==(const zespolona &z)const { return re==z.re && im==z.im; }
   zespolona sprz()const { return zespolona(re,-im); }
   double modul()const;
  
  };

const zespolona i(0,1);  //jednosc urojona


// przciazenia operatorow
ostream &operator<<(ostream &s,const zespolona &z)
  {
   if(z.im) return s<<'('<<z.re<<"-+"[z.im>0]<<'i'<<abs(z.im)<<')';
   return s<<z.re;
  }

istream &operator>>(istream &s,zespolona &z)
  {
   char S;
   s>>z.re>>noskipws>>S;
   if(s)
     {
      if(S!='+'&&S!='-') s.unget();
      else
        {
         char i;
         s>>i;
         if(i!='i') s.unget();
         else
           {
            s>>z.im;
            if(S=='-') z.im=-z.im;
           }
        }
     }
   return s>>skipws;
  }

istream &nomore(istream &s)
  {
   bool ok=true;
   char ch;
   while((ch=s.get())!='\n') ok&=((ch==' ')||(ch=='\t'));
   s.unget();
   if(!ok) s.clear(ios::badbit);
   return s;
  }


// dodawanie
zespolona zespolona::operator+(const zespolona &z)const
  {
   return zespolona(re+z.re,im+z.im);
  }
// odejmowanie
zespolona zespolona::operator-(const zespolona &z)const
  {
   return zespolona(re-z.re,im-z.im);
  }
// mnozenie
zespolona zespolona::operator*(const zespolona &z)const
  {
   return zespolona(re*z.re-im*z.im,re*z.im+im*z.re);
  }
// dzielenie
zespolona zespolona::operator/(const zespolona &z)const
  {
   double div=z.re*z.re+z.im*z.im;
   return zespolona((re*z.re+im*z.im)/div,(im*z.re-re*z.im)/div);
  }
   
// modul
double zespolona::modul()const
  {
   return sqrt(re*re+im*im);
  }

int main()
 {
   zespolona a,b;
// wprowadzamy liczby
   cout<<"Podaj pierwsza liczbe zespolona (np 1+i3): ";
   cin>>a;
      cout<<"Podaj druga liczbe zespolona (np 2-i1): ";
   cin>>b;
// sprawdzamy czy dobrze wprowadzilismy
if(cin) cout<<"dobrze wprowadzono"<<endl;
else
  {
   cin.clear();
   while(cin.get()!='\n') {}
   cout<<"Blad wprowadzenia"<<endl;
  }
//obliczenia
   cout<<"suma: "<<a<<'+'<<b<<'='<<(a+b)<<endl;
   cout<<"roznica: "<<a<<'-'<<b<<'='<<(a-b)<<endl;
   cout<<"iloczyn: "<<a<<'*'<<b<<'='<<(a)*(b)<<endl;
   cout<<"iloraz: "<<a<<'/'<<b<<'='<<(a)/(b)<<endl; 


   while(cin.get()!='\n'){}
   cin.get();
   return 0;
  } 
0

Jak bardzo ma być to uniwersalne?
Czy zobowiązujesz użytkownika do wpisania części zespolonej i rzeczywistej, czy wymuszasz na nim wpisanie obu części nawet jeśli są zerowe?
Jeśli pierwsza wersja to przy obecnym projekcie kodu będzie naprawdę ciężko to zrobić, w drugiej wersji nie ma kłopotu.

Może lepiej, użyć getline(istream&,string&) i stringstream?

0

hmm użytkownik ma wpisać wyrażenie 1+i3 lub ewentualnie jeśli się da to poprawić 1+3i wtedy będzie OK jeśli natomiast użytkownik wpisze 1+5, 1+2d lub aaa to program ma zwrocić błąd i ponownie zapytać

mam jeszcze jeden problem program nie przyjmuje mozliwosci liczenia w postaci 4i+2 tylko caly czas musi byc w postaci 1+i3 nie innej może ktoś wie jak to poprawić?

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