Zatrzymanie programu w konsoli po wykonaniu instrukcji

0

Witam, napisałem swój pierwszy program w C++.
Program liczy np. rozwiązania funkcji kwadratowej. Napisałem instrukcję, która sprawdza czy wprowadzane współczynniki funkcji kwadratowej są liczbami, a jeżeli nie to wyrzuca informację: " Blad w danych wejsciowych. Dzialanie aplikacji przerwane".
Problem polega na tym, że chciałbym, żeby po wyświetleniu tej informacji program się nie zamykał, a pozostawiał wyświetlaną informację w oknie.(Chodzi mi odpalenie z pliku .exe, nie w kompilatorze). Póki co program pozostaje otwarty tylko po poprawnym wprowadzeniu danych, a np. kiedy zamiast współczynnika "a", który powinien być liczbą wprowadzimy literę to od razu się zamyka.
Jak temu zaradzić?
Nie mam zamiaru programować więcej w C++, jest to program, który muszę napisać na zaliczenie, więc proszę o możliwie klarowną odpowiedź co gdzie wstawić.
Z góry dziękuję :)

 #include <iostream>
#include <math.h>
#include <windows.h> // Biblioteka dodana do obslugi kolorow
#include <cstdlib> //Sprawdzenie poprawnosci danych


using namespace std;

string WYBOR;
int a,b,c = 0;

int delta(int a, int b,int c)
{return b*b-4*a*c;}
float e(int a,int  b)
{return ((-b)/(2*a));}
float pierwX1(int  a, int  b, int  delta)
{return (-b+sqrt(delta))/(2*a);}
float pierwX2(int  a, int  b, int  delta)
{return (-b-sqrt(delta))/(2*a);}
int xliniowe(int c, int b)
{return -c/b;}

int main()
{
    cout <<"1. Jezeli chcesz znalezc rozwiazanie rownania kwadratowego nacisnij (1)" << endl;
    cout <<"2. Jezeli chcesz obliczyc sume ciagu arytmetycznego nacisnij (2)"<< endl;
    cin >> WYBOR;

    if(WYBOR=="1")
    {
       cout<<"ROWNANIE KWADRATOWE:";
       cout<<"Postac ogolna rownania kwadratowego:";
     HANDLE hOut;
     hOut = GetStdHandle( STD_OUTPUT_HANDLE );
     SetConsoleTextAttribute( hOut, FOREGROUND_GREEN);
    cout <<endl<< "f(x)=a*x^2+b*x+c=0 \n" << flush << endl << endl;

SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED );
    int a,b,c,d;

cout<<"Podaj a: ";
cin>>a;

    if (cin.fail())
    {


        cerr << "Blad w danych wejsciowych. Dzialanie aplikacji przerwane\n";
        return EXIT_FAILURE;

    }


    cout << "Pobrano liczbe " << a << '\n';



cout<<endl<<"Podaj b: ";
cin>>b;

       if (cin.fail())
    {
        cerr << "Blad w danych wejsciowych. Dzialanie aplikacji przerwane\n";
        return EXIT_FAILURE;

    }

    cout << "Pobrano liczbe " << b << '\n';

cout<<endl<<"Podaj c: ";
cin>>c;

        if (cin.fail())
    {
        cerr << "Blad w danych wejsciowych. Dzialanie aplikacji przerwane\n";
        return EXIT_FAILURE;
    }

    cout << "Pobrano liczbe " << c << '\n';


if (delta(a,b,c)<0)
      {cout<<endl<<"Rownanie nie ma rozwiazan(nie posiada miejsc zerowych). \n";}
      else if (delta(a,b,c)==0)
        {cout<<endl<<"Jest tylko jedno miejsce zerowe:\n x="<<e(a,b);
        cout<<"\n";}
        else if (delta(a,b,c)>0)
            {cout<<endl<<"Funcja posiada dwa miejsca zerowe: \n"<<endl<<"x1="<<pierwX1(a,b,delta(a,b,c));
            cout<<"\n"<<"x2="<<pierwX2(a,b,delta(a,b,c));
            cout<<"\n";}
if (a==0)
   {
          cout<<"X jest rowne:"<<xliniowe(c,b);
          cout<<"\n";}
   else
   {
       d=delta(a,b,c);
        SetConsoleTextAttribute( hOut, FOREGROUND_RED);
       cout<<endl<<"Delta rownania wynosi:"<<d;
       SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED );
       cout<<"\n";

}

    }
    if(WYBOR=="2")
    {
         int n;

         HANDLE hOut;
     hOut = GetStdHandle( STD_OUTPUT_HANDLE );


     float a1,an,suma=0;
    cout<<"SUMA WYRAZOW CIAGU ARYTMETYCZNEGO";
    SetConsoleTextAttribute( hOut, FOREGROUND_GREEN);
    cout<<endl<<"Wzor ogolny na sume 'n' poczatkowych wyrazow: Sn=(a1+an)/2*n";
    SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED );
    cout<<endl<<"\Podaj wartosc n (liczba wyrazow poczatkowych) = ";
    cin>>n;
     if (cin.fail())
    {
        cerr << "Blad w danych wejsciowych. Dzialanie aplikacji przerwane\n";
        return EXIT_FAILURE;

    }

    cout << "Pobrano liczbe" << n << '\n';
    cout<<endl<<"Podaj wartosc pierwszego wyrazu ciagu (a1): ";
    cin>>a1;
     if (cin.fail())
    {
        cerr << "Blad w danych wejsciowych. Dzialanie aplikacji przerwane\n";
        return EXIT_FAILURE;
    }

    cout << "Pobrano liczbe " << a1 << '\n';
    cout<<endl<<"Podaj wartosc " <<n<<" wyrazu ciagu (an): ";
    cin>>an;
     if (cin.fail())
    {
        cerr << "Blad w danych wejsciowych. Dzialanie aplikacji przerwane\n";
        return EXIT_FAILURE;
    }

    cout << "Pobrano liczbe " << an << '\n';
    cout<<"\n\n";
    suma=(a1+an)*n/2;
    SetConsoleTextAttribute( hOut, FOREGROUND_RED);
    cout<<endl<<"Suma kolejnych "<< n<<" wyrazow ciagu arytmetycznego wynosi: "<<suma;
    SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED );
    cin.ignore();





    }
    cin.sync(); //Zatrzymuje zamykanie sie programu
    cin.get();
    return 0;
}

0

Dodaj jakąkolwiek funkcję oczekującą na wpisanie znaku.
np.

std::cin.get();
0

W którym miejscu ją dodać?

0

Twój program powinien zatrzymać się przed zakończeniem.
Moja skucha.
Może nie skompilowałeś jakiś zmian i w exeku nie masz pauzy na końcu.

Jeśli używasz std::string dodaj plik nagłówkowy <string>.

edit: przejrzałem kod i powinno być na końcu funkcji main()

cin.ignore(); // tutaj był cin.sync(), który prawdopodobnie nie oczyszczał bufora (nie do tego służy)
    cin.get();
    return 0;
0

Chodzi o to, że on się zatrzymuje po zakończeniu ale tylko jeżeli wprowadzono poprawne dane.
A chciałbym, żeby zatrzymywał się też po wyrzuceniu komunikatu: "Blad w danych wejsciowych. Dzialanie aplikacji przerwane" czyli po wprowadzeniu np. litery zamiast liczby, bo póki co wyświetla ten komunikat przez sekundę i się zamyka.

1

Można to tak rozwiązać:

if (cin.fail())
        {

            cerr << "Blad w danych wejsciowych. Dzialanie aplikacji przerwane\n";
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cin.get();
            return EXIT_FAILURE;

        }

lub wprowadzić kontrolę danych wejściowych i wczytywać do skutku

while (!(cin >> b)) {
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            std::cerr << "Blad danych wejsciowych. Podaj ponownie\n";
        }

Kod wymaga dodania <limits> oraz wyłączenia makra #undef max.

Ogólnie masz tam powtarzające się fragmenty kodu, więc można wrzucić to do jednej funkcji.
Zyskasz porządek w kodzie.

0

Drugie rozwiązanie jest dokładnie tym o co mi chodziło. Dziękuję!

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