Problem z działaniem programu

0

Witam mam problem z poprawnym działaniem programu a mianowice:

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
	float a0=0.0, a1=0.0, a2=0.0 ,delta=0.0, x1=0.0, x2=0.0, im=0.0, re=0.0;

	bool A, B, C;
    
    
    cout<<"Jest to program obliczajacy pierwiastki rzeczywiste i zespolone funkcji kwadratowej postaci a0x^2+(a1)x+(a2)=0\nPodaj wspolczynniki rownania kwadratowego: \n"
		"Podaj wspolczynnik a0 rownania: ";

	cin>>a0;
	A = cin.good();
    
                   if( A == false )
	                   do
	                     {
		                    cout<<"Poproszono Cie o wpisanie wspolczynnika rownania kwadratowego. Zastanow sie jakiej postaci powinien on byc!!!\nPodaj ponownie wspolczynnik a0 rownania:";
		
                            cin >> a0;
		                    A = cin.good();
		                    cin.clear(); //kasowanie flagi błędu strumienia
		                    cin.sync();  //kasowanie zbędnych znaków z bufora
	                     
                         }  while( !A);
 
 
    cout<<"Podaj wspolczynnik a1 rownania: ";
 
    cin>>a1;
 	B = cin.good();
	
    
                   if( B == false )
	                   do
	                     {
		
                            cout<<"Poproszono Cie o wpisanie wspolczynnika rownania kwadratowego. Zastanow sie jakiej postaci powinien on byc!!!\nPodaj ponownie wspolczynnik a1 rownania:";
		
                            cin >> a1;
		                    B = cin.good();
		                    cin.clear();
		                    cin.sync();
	                     
                         } while( !B);
 
    cout<<"Podaj wspolczynnik a2 rownania: ";
    
    cin>>a2;
 	C = cin.good();
	               
                   
                   if( C == false )
	                   do
	                     {
		
                            cout<<"Poproszono Cie o wpisanie wspolczynnika rownania kwadratowego. Zastanow sie jakiej postaci powinien on byc!!!\nPodaj ponownie wspolczynnik a2 rownania:";
		
                            cin >> a2;
		                    C = cin.good();
		                    cin.clear();
		                    cin.sync();
	                     
                         } while( !C);

	
   
    cout<<"\nNasze rownanie jest postaci "<<a0<<"x^2+("<<a1<<")x+("<<a2<<")=0\n";
	
   
    delta=(a1*a1)-(4*a0*a2);
		
		
        if (a0==0)
                
                {
				
                cout<<"Zle wprawadzone wspolczynniki rownania. Otrzymane rownanie nie jest funkcjia kwadratowa tylko liniowa!!!\n";
                
                }
                           
                           
                else if (delta>0)
                   {
				                
                    x1=(-a1-sqrt(delta))/(2*a0);
                    x2=(-a1+sqrt(delta))/(2*a0);
		    cout<<"Otrzymane pierwiastki rownania kwadratowego to: \nx1= "<<x1<<"\nx2= "<<x2<<"\n";
			                    
                    }
			
                                                 
                  else if (delta==0)
                    {
				                                      
                      x1=(-a1)/(2*a0);
			
                      cout<<"Otrzymane pierwiastki x1 i x2 rownania kwadrtawego sa sobie rowne poniewaz obliczony wyroznik rownania kwadratowego wyniosl 0.\nOtrzymany pierwiastek x1=x2=x rownania kwadratowego to: "<<x1<<"\n";
			                                          
                          }
		                                                        
                                                                
                                                                
                      else if (delta<0)
			   {                                                         
                                                                      
                            re=((-a1)/(2*a0));
                            im=(sqrt(-delta))/(2*a0);
                                                                       
                            cout<<"Otrzymaliśmy zespolone pierwiastki podanego rownania kwadratowego. Wynosza one odpowiednio:\nx1="<<re<<"+i*"<<im<<"\nx2="<<re<<"-i*"<<im<<"\n";

                             }
				

	system("PAUSE");		
	return 0;

Nie wiem dlaczego przy zabezpieczeniu przed wpisywaniem liter, gdy w programie wpiszemy literę zamiast cyfry dla zmiennej a0 komunikat o blędnym wpisaniu wyświetla się dwukrotnie? Czy istnieje możliwośc napisania tego zabezpiecznia prościej? Z góry dziękuję za pomoc

0

Zabezpieczenie przed wpisywaniem liter
Jeżeli chodzi o samo formatowanie.. Musisz być konsekwentny. Jeżeli nie dajesz klamry po if, gdy masz tylko jedną linijkę, to nie dawaj jej nigdy.. albo rób na odwrót..
i tak dalej i tak dalej...

#include <iostream>
#include <cmath>
using namespace std;
int main(){
    float a0=0.0, a1=0.0, a2=0.0 ,delta=0.0, x1=0.0, x2=0.0, im=0.0, re=0.0;
    bool A, B, C;
    cout<<"Jest to program obliczajacy pierwiastki rzeczywiste i zespolone funkcji kwadratowej postaci a0x^2+(a1)x+(a2)=0\nPodaj wspolczynniki rownania kwadratowego: \n"
        "Podaj wspolczynnik a0 rownania: ";
    cin>>a0;
    A = cin.good();
    if(A == false)
        do{
            cout<<"Poproszono Cie o wpisanie wspolczynnika rownania kwadratowego. Zastanow sie jakiej postaci powinien on byc!!!\nPodaj ponownie wspolczynnik a0 rownania:";
            cin >> a0;
            A = cin.good();
            cin.clear(); //kasowanie flagi błędu strumienia
            cin.sync();  //kasowanie zbędnych znaków z bufora
        }while(!A);
    cout<<"Podaj wspolczynnik a1 rownania: ";
    cin>>a1;
    B = cin.good();
    if( B == false )
        do{
            cout<<"Poproszono Cie o wpisanie wspolczynnika rownania kwadratowego. Zastanow sie jakiej postaci powinien on byc!!!\nPodaj ponownie wspolczynnik a1 rownania:";
            cin >> a1;
            B = cin.good();
            cin.clear();
            cin.sync();
        }
        while(!B);
    cout<<"Podaj wspolczynnik a2 rownania: ";
    cin>>a2;
    C = cin.good();
    if(C==false)
        do{
            cout<<"Poproszono Cie o wpisanie wspolczynnika rownania kwadratowego. Zastanow sie jakiej postaci powinien on byc!!!\nPodaj ponownie wspolczynnik a2 rownania:";
            cin >> a2;
            C = cin.good();
            cin.clear();
            cin.sync();
        }
        while(!C);
    cout<<"\nNasze rownanie jest postaci "<<a0<<"x^2+("<<a1<<")x+("<<a2<<")=0\n";
    delta=(a1*a1)-(4*a0*a2);
    if (a0==0)
        cout<<"Zle wprawadzone wspolczynniki rownania. Otrzymane rownanie nie jest funkcjia kwadratowa tylko liniowa!!!\n";
    else if (delta>0){
        x1=(-a1-sqrt(delta))/(2*a0);
        x2=(-a1+sqrt(delta))/(2*a0);
        cout<<"Otrzymane pierwiastki rownania kwadratowego to: \nx1= "<<x1<<"\nx2= "<<x2<<"\n";
    }
    else if (delta==0){
        x1=(-a1)/(2*a0);
        cout<<"Otrzymane pierwiastki x1 i x2 rownania kwadrtawego sa sobie rowne poniewaz obliczony wyroznik rownania kwadratowego wyniosl 0.\nOtrzymany pierwiastek x1=x2=x rownania kwadratowego to: "<<x1<<"\n";
    }
    else if (delta<0){
        re=((-a1)/(2*a0));
        im=(sqrt(-delta))/(2*a0);
        cout<<"Otrzymaliśmy zespolone pierwiastki podanego rownania kwadratowego. Wynosza one odpowiednio:\nx1="<<re<<"+i*"<<im<<"\nx2="<<re<<"-i*"<<im<<"\n";
    }
    return 0;
}
1
 
       do{
            cout<<"Poproszono Cie o wpisanie wspolczynnika rownania kwadratowego. Zastanow sie jakiej postaci powinien on byc!!!\nPodaj ponownie wspolczynnik a0 rownania:";
            cin.clear(); //kasowanie flagi błędu strumienia
            cin.sync();  //kasowanie zbędnych znaków z bufora
        }while(!(cin>>a0));
0

Dzięki za uwagi, faktycznie teraz kod wygląda zdecydowanie bardziej czytelnie. Jednak ciągle zastanawiam się gdzie w tym fragmencie tekstu występuje problem:

cin>>a0;
    A = cin.good();
    
    
    if(A == false)
        
        do{
            
            cout<<"Poproszono Cie o wpisanie wspolczynnika rownania kwadratowego. Zastanow sie jakiej postaci powinien on byc!!!\nPodaj ponownie wspolczynnik a0 rownania:";
            cin >> a0;
            A = cin.good();
            cin.clear(); //kasowanie flagi błędu strumienia
            cin.sync();  //kasowanie zbędnych znaków z bufora
        
        
        }while(!A); 

Dlaczego tekst "Poproszono Cie o wpisanie wspolczynnika rownania kwadratowego. Zastanow sie jakiej postaci powinien on byc!!!Podaj ponownie wspolczynnik a0 rownania:" wyświetla się dwukrotnie?

1

Bo zrobiłeś jeden cin>> i on ustawił ci znacznik błędu. A następnie znów robisz cin>> w pętli while (kiedy masz jeszcze znacznik błędu!)
W efekcie napis wypisze się 2 razy. Zamiast robić jakies idiotyczne ify skopiuj kawałek kodu który masz w faq podlinkowanym wyżej.

0

Dzięki wszystkim za pomoc

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