Cyfra czy litera?

0

Witam. Jestem świeżo po opracowaniu symfonii c++ standard. Jako swój pierwszy program postanowiłem napisać coś tak "banalnego" jak kalkulator. Chciałbym go zrobić w oparciu o klasy, jeszcze co prawda nie OO, ale od czegoś trzeba zacząć. Problem pojawił się na samym początku ponieważ tak jak w każdym kalkulatorze chciałbym aby użytkownik mógł wybrać ile miejsc po przecinku ma się pojawić przy wykonywaniu działań. Obecny mój kod wygląda następująco:

#include <iostream>
using namespace std;

int main()
{

    int czy_liczba;
    bool koniec = true;
    while(koniec == true)
    {
        cout << "Wpis k aby zakonczyc program: " << endl;
        cout << "Ile zer ma byc po przecinku" << endl;
        cout << "do wyboru 0, 2, 3, 4: ";

        czy_liczba = cin.peek();
        if(isdigit(czy_liczba))
        {
            int ile_zer;
            cin >> ile_zer;
            cout << "Ustawiono " << ile_zer << " miejsc po przecinku." << endl;
        }
        else
        {
            cout << "To byl znak";
            koniec = false;
        }
    }
}

Problem pojawia się przy użyciu pętli. Chciałbym aby program w razie gdy z klawiatury zostanie podany jakiś znak przeszedł do instrukcji else. I tak robi. Lecz jeżeli podam liczbę np. 2 to wykonuje jeden obrót a przy drugim kończy pracę przechodząc do else dlaczego? Prosiłbym o poradę...

1

Być może przez to, że cin.peek() pobiera znak, ale nie usuwa go ze strumienia

2

To ci nie pomoże, peek nadal czeka jak wypełni się bufor klawiatury czyli czeka na entera.
To co chcesz osiągnąć nazywa się getch()/getche() i jest w niekompatybilnej bibliotece <conio.h> lub w ncurses możesz też posłużyć się API systemu.
np szukaj: "console functions MSDN"

0

Dzięki waszym szybkim podpowiedziom poradziłem sobie wielkie dzięki:

#include <iostream>
using namespace std;

int main()
{
    bool koniec = true;
    while(koniec == true)
    {
        cout << "Wpis k aby zakonczyc program: " << endl;
        cout << "Ile zer ma byc po przecinku" << endl;
        cout << "do wyboru 0, 2, 3, 4: ";

        int czy_liczba = cin.peek();

        if(isdigit(czy_liczba))
        {
            int ile_zer;
            cin >> ile_zer;
            cin.clear();
            cin.sync();

            cout << "Ustawiono " << ile_zer << " miejsc po przecinku." << endl;
        }
        else
        {
            cout << "To byl znak";
            koniec = false;
        }
    }
}
0

Tylko że strasznie przekombinowałeś:

#include <iostream>
using namespace std;
 
int main()
{
    for(;;)
    {
        cout << "Wpis k aby zakonczyc program: " << endl;
        cout << "Ile zer ma byc po przecinku" << endl;
        cout << "do wyboru 0, 2, 3, 4: ";
        int ile_zer;
        if(!(cin>>ile_zer))
        {
            cout << "To byl znak";
            return 0;
        }
        cout << "Ustawiono " << ile_zer << " miejsc po przecinku." << endl;
    }
}
0

Teraz to jeszcze wielkie dzięki pokazałeś mi coś co ułatwiło mi dalszą zabawę. Nie spodziewałem się że można to w tak łatwy sposób rozwiązać. Myślę że teraz na końcu pozwolę sobie pokazać ostateczny wynik choć wiem że to jeszcze nie osiągnięcie. Siedzę nad tym już drugi dzień dlatego szczere podziękowania z mojej strony.

0

Aby nie tworzyć nowego tematu prosiłbym o ocenę mojego kodu z kalkulatorem. Chciałem zrobić coś trudniejszego nie wiem czy mi wyszło dlatego prosiłbym o ocenę. Jest to pierwszy program jaki napisałem w jakimkolwiek języku a niestety znam tylko html.

#include <iostream>
#include <cstdlib>
using namespace std;

class kalkulator
{
private:
    int ile_zer_po_przecinku;
    double c1, c2, wynik;
    char symbol;
public:
    kalkulator(double cc1, double cc2, char znak_dzialania, int precyzja);
    void wypisz();
    double dzialanie();
    operator double()
    {
        return (double)wynik;
    }

};
int main()
{
    double liczba1 = 0;
    double liczba2 = 0;
    char znak = '+';
    for(;;)
    {
        cout << "Wpisz jakikolwiek znak i nacisnij enter aby zakonczyc program: " << endl;
        cout << "Ile zer ma byc po przecinku" << endl;
        cout << "do wyboru 0, 2, 3, 4: ";
        int ile_zer;
        if(!(cin >> ile_zer))
        {
            cout << "Koniec programu...";
            return 0;
        }
        else
        {
            if(ile_zer < 0 || ile_zer == 1 || ile_zer > 4)
            {
                cout << "Podales zla liczbe... ustawiam 2 miejsca po przecinku..." << endl;
                ile_zer = 2;
            }
            else
            {
                cout << "Ustawiono " << ile_zer << " miejsc po przecinku." << endl;
            }
            for(;;)
            {
                system("cls");
                cout << "Co chcesz policzyc? \n";
                cout << "Niewlasciwy znak w liczbie konczy program\n";
                cout << liczba2 << endl;
                cout << "Podaj liczbe: ";

                if(!(cin >> liczba1))
                {
                    return 0;
                }
                kalkulator wynik(liczba2, liczba1, znak, ile_zer);
                wynik.wypisz();
                liczba2 = wynik;
                cout << "\nPodaj znak: ";\
                cin >> znak;
            }
        }
    }
}
kalkulator::kalkulator(double cc1, double cc2, char znak_dzialania, int precyzja) : c1(cc1), c2(cc2), symbol(znak_dzialania), ile_zer_po_przecinku(precyzja)
{
    dzialanie();
}

double kalkulator::dzialanie()
{
    if(symbol == '+')
    {
        wynik = c1 + c2;
    }
    else if(symbol == '-')
    {
        wynik = c1 - c2;
    }
    else if(symbol == '*')
    {
        wynik = c1 * c2;
    }
    else if(symbol == '/')
    {
        wynik = c1 / c2;
    }
}

void kalkulator::wypisz()
{
   cout.precision(ile_zer_po_przecinku+1);
   cout << wynik;
}


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