Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Praca domowa do lekcji 15 - kalkulator

Ostatnio zmodyfikowano 2015-08-15 16:14
Autor Wiadomość
kaczan
Temat założony przez niniejszego użytkownika
Praca domowa do lekcji 15 - kalkulator
» 2015-08-12 22:01:54
Mam problem z opuszczeniem pętli w programie.
Zastosowałem dwie i testując nie chce opuścić ani jednej zgodnie z mym życzeniem. Przeglądałem kilka razy i nie potrafię sobie z tym poradzić.

C/C++
#include <iostream>
int main()



{
    double liczba;
    liczba = 0;
    double liczba1;
    bool poprawnosc;
    bool poprawnosc1;
    int dzialanie;
   
   
    do
    {
        std::cout << "Aktualny wynik działania to: " << liczba << std::endl;
        std::cout << "Podaj nową liczbę. Pamiętaj, jeśli podasz 0, to zakończysz program: ";
        std::cin >> liczba1;
        poprawnosc = std::cin.good();
       
        if( poprawnosc != 1 )
        {
            std::cout << std::endl << " To nie jest liczba spróbuj jeszcze raz :" << std::endl;
            std::cin.clear();
            std::cin.sync();
        }
       
        else
        {
            if( liczba1 != 0 )
           
            {
                do
                {
                    std::cout << std::endl << "Wybierz odpowiednie działanie :" << std::endl;
                    std::cout << "[1] Dodawanie" << std::endl;
                    std::cout << "[2] Odejmowanie" << std::endl;
                    std::cout << "[3] Mnożenie" << std::endl;
                    std::cout << "[4] Dzielenie" << std::endl;
                    std::cout << "[5] Rezygnuj" << std::endl;
                    std::cin >> dzialanie;
                    poprawnosc1 = std::cin.good();
                   
                   
                    if( poprawnosc1 != 1 )
                    {
                        std::cout << "Dokonałeś niewłaściwego wyboru. Spróbuj jeszcze raz. " << std::endl;
                        std::cin.clear();
                        std::cin.sync();
                       
                    }
                    else
                    {
                        switch( dzialanie )
                        {
                        case 1:
                            liczba = liczba + liczba1;
                            std::cin.clear();
                            std::cin.sync();
                           
                            break;
                           
                        case 2:
                            liczba = liczba - liczba1;
                            std::cin.clear();
                            std::cin.sync();
                            break;
                           
                        case 3:
                            liczba = liczba * liczba1;
                            std::cin.clear();
                            break;
                           
                        case 4:
                            liczba = liczba / liczba1;
                            std::cin.clear();
                            std::cin.sync();
                            break;
                           
                        case 5:
                            std::cin.clear();
                            std::cin.sync();
                            break;
                           
                            default:
                            std::cout << "Niepoprawny wybór działania. Spróbuj jeszcze raz.";
                            std::cin.clear();
                            std::cin.sync(); }
                       
                    }
                   
                } while( dzialanie == 1 || dzialanie == 2 || dzialanie == 3 || dzialanie == 4 || dzialanie == 5 );
               
            } }
    } while( liczba1 == 0 || dzialanie == 5 );
   
    std::cout << "Koniec programu. Końcowym wynikiem jest: " << liczba;
   
    return 0;
}
P-136116
carlosmay
» 2015-08-12 22:20:03
Trochę się zakręciłeś. Możesz zrobić to w jednej pętli (łatwiej).
Warunek przerwania pętli
C/C++
while( liczba1 != 0 );

P-136117
C-Objective
» 2015-08-13 15:27:14
if( liczba1 != 0 )
Nieee. Nonsens. Piszesz 'wpisz 0 aby zakonczyc program' a teraz mam wpisać 5 tak? Gdzie pobierasz zmienną liczba?
I do pobierania znaku użyj getch. Wtedy ci się nie zapętli. Getch zwraca char, czyli liczbę od 0 do 255.
Edit: Kod bardzo rozlazły.
P-136149
carlosmay
» 2015-08-13 15:59:08
Nieee. Nonsens. Piszesz 'wpisz 0 aby zakonczyc program'
Właśnie taka jest treść zadania:

Napisz prosty kalkulator, który będzie potrafił dodawać, odejmować, mnożyć i dzielić. Program ten ma działać następująco:
1. Wypisuje obecny wynik
2. Wprowadź liczbę
3. Wybierz działanie (jeżeli liczba różna od 0)
4. Wykonaj obliczenia (jeżeli liczba różna od 0)
5. Wróć do kroku 1.
6. Jeżeli wprowadzoną liczbą jest 0, zakończ program.
Przykładowe menu wyboru działania:
[1] Dodawanie
[2] Odejmowanie
[3] Mnożenie
[4] Dzielenie
[5] Rezygnuj

while( liczba1 != 0 );
oraz gdy w opcjach switch wprowadzi 5
C/C++
case 5:
liczba1 = 0;
break;
czy jeszcze czegoś nie rozumiesz?
P-136153
michal11
» 2015-08-13 17:44:33
Zamiast
while( dzialanie == 1 || dzialanie == 2 || dzialanie == 3 || dzialanie == 4 || dzialanie == 5 )
while( dzialanie >= 1 && dzialanie <= 5 )

Nie sprawdzasz przy dzieleniu czy nie dzielisz przez zero.

C/C++
poprawnosc = std::cin.good();

if( poprawnosc != 1 )

całkiem źle,
if( !std::cin.good() )
 wystarczy. Zmienna poprawnosc  jest zupełnie niepotrzebna. To samo zresztą z poprawnosc1.

Jesteś pewny, że działania mają być wykonywana na obecnym wyniku ?

W ogóle ten program można dość znacząco skrócić i uprościć.
P-136159
kaczan
Temat założony przez niniejszego użytkownika
» 2015-08-14 00:08:31

Nie sprawdzasz przy dzieleniu czy nie dzielisz przez zero.

Poprzez zastosowanie warunku

if (liczba1 !=0)


Nie dopuszczam do dzielenia przez 0. Gdyż wybranie 0 zakończy program. Po co mam dodatkowo sprawdzać?

W ogóle ten program można dość znacząco skrócić i uprościć.

Domyślam się. Na razie jestem początkującym kandydatem na ucznia w programowaniu, dlatego piszę na forum. Nie znam osobiście nikogo kto by zerkał na moje wypociny, więc zadaję pytania tutaj, abyście jako znacznie bardziej doświadczone osoby pozwolili ustrzec błędów w przyszłości.

Zgodnie z Waszymi sugestiami poprawiłem program. Niestety nie działa mi sprawdzanie poprawności błędów. Wypisanie litery powoduje zakończenie programu - zamiast powtórzenia pętli od początku. Gdzie kryje się błąd?

C/C++
#include <iostream>
int main()



{
    double liczba;
    liczba = 0;
    double liczba1;
    bool poprawnosc;
    bool poprawnosc1;
    int dzialanie;
   
   
    do
    {
        liczba1 = 1;
        std::cout << "Aktualny wynik działania to: " << liczba << std::endl;
        std::cout << "Podaj nową liczbę. Pamiętaj, jeśli podasz 0, to zakończysz program: ";
        std::cin >> liczba1;
        poprawnosc = std::cin.good();
       
        if( poprawnosc != 1 )
        {
            std::cout << std::endl << " To nie jest liczba spróbuj jeszcze raz :" << std::endl;
            std::cin.clear();
            std::cin.sync();
        }
       
        else
        {
            if( liczba1 != 0 )
           
            {
               
                do
                {
                   
                    std::cout << std::endl << "Wybierz odpowiednie działanie :" << std::endl;
                    std::cout << "[1] Dodawanie" << std::endl;
                    std::cout << "[2] Odejmowanie" << std::endl;
                    std::cout << "[3] Mnożenie" << std::endl;
                    std::cout << "[4] Dzielenie" << std::endl;
                    std::cout << "[5] Rezygnuj" << std::endl;
                    std::cin >> dzialanie;
                    poprawnosc1 = std::cin.good();
                   
                   
                   
                    if( poprawnosc1 != 1 )
                    {
                        std::cout << "Dokonałeś niewłaściwego wyboru. Spróbuj jeszcze raz. " << std::endl;
                        std::cin.clear();
                        std::cin.sync();
                       
                    }
                    else
                    {
                        switch( dzialanie )
                        {
                        case 1:
                            liczba = liczba + liczba1;
                            std::cin.clear();
                            std::cin.sync();
                           
                            break;
                           
                        case 2:
                            liczba = liczba - liczba1;
                            std::cin.clear();
                            std::cin.sync();
                            break;
                           
                        case 3:
                            liczba = liczba * liczba1;
                            std::cin.clear();
                            break;
                           
                        case 4:
                            liczba = liczba / liczba1;
                            std::cin.clear();
                            std::cin.sync();
                            break;
                           
                        case 5:
                            std::cin.clear();
                            std::cin.sync();
                            liczba1 = 0;
                            break;
                           
                            default:
                            std::cout << "Niepoprawny wybór działania. Spróbuj jeszcze raz.";
                            std::cin.clear();
                            std::cin.sync(); }
                       
                    }
                   
                } while( dzialanie <= 1 && dzialanie >= 5 );
               
            } }
    } while( liczba1 != 0 );
   
    std::cout << "Koniec programu. Końcowym wynikiem jest: " << liczba;
   
    return 0;
}
P-136203
carlosmay
» 2015-08-14 08:44:40

Niestety nie działa mi sprawdzanie poprawności błędów.
C/C++
if( poprawnosc != 1 )
{
    std::cout << std::endl << " To nie jest liczba spróbuj jeszcze raz :" << std::endl;
    std::cin.clear();
    std::cin.sync();
}

Roziązanie: zamien std::cin.sync() na std::cin.ignore()
C/C++
std::cin.sync(); // => std::cin.ignore(100, '\n');

Opis tej metody jest w
Obsługa strumienia wejściowego
Patrz: Problemy z czyszczeniem strumienia pod Linuksem.

Tutaj są posty temat twojego problemu
Powodzenia.
P-136213
kaczan
Temat założony przez niniejszego użytkownika
» 2015-08-14 17:26:04

Roziązanie: zamien std::cin.sync() na std::cin.ignore()

Niestety nie pomaga. Wpisanie litery kończy program.
P-136257
« 1 » 2 3
  Strona 1 z 3 Następna strona