Rozdział 15. Zadanie domowe.
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

Rozdział 15. Zadanie domowe.

AutorWiadomość
Temat założony przez niniejszego użytkownika
Rozdział 15. Zadanie domowe.
» 2018-07-24 14:11:25
Witam, chciałbym, aby ktoś bardziej doświadczony popatrzył na mój kod i powiedział, czy wszystko jest w porządku. Wydaje mi się, że program według wytycznych spełnia swoją rolę, ale nie chciałbym powielać błędów o ile takowe występują.

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.
Zabezpiecz wcześniej napisany kalkulator przed podawaniem niepoprawnych liczb i operacji. Wykorzystaj wiedzę zdobytą z pierwszego zadania pracy domowej niniejszego rozdziału. Zabezpiecz również w analogiczny sposób przed możliwością wyboru nieprawidłowego działania.

Mój kod wygląda tak:

C/C++
#include <iostream>
using namespace std;
int main()
{
    double wynik = 0;
    double liczba;
   
    do {
        cout << "Wynik wynosi: " << wynik << endl;;
        cin.clear();
        cin.sync();
        cout << "Wprowadz dowolna niezerowa liczbe: " << endl << "(By zakonczyc wpisz 0)" << endl;
        cin >> liczba;
        if( cin.good() && liczba != 0 ) {
            cout << "Wybierz odpowiednia operacje matematyczna:" << endl << "[1] Dodawanie" << endl << "[2] Odejmowanie" << endl << "[3] Mnozenie" << endl << "[4] Dzielenie" << endl << "[5] Rezygnuj" << endl;
            int wybor;
            cin >> wybor;
            switch( wybor ) {
            case 1:
                cout << wynik << " + " << liczba << " = ";
                cout <<( wynik = wynik + liczba ) << endl;
                break;
            case 2:
                cout << wynik << " - " << liczba << " = ";
                cout <<( wynik = wynik - liczba ) << endl;
                break;
            case 3:
                cout << wynik << " * " << liczba << " = ";
                cout <<( wynik = wynik * liczba ) << endl;
                break;
            case 4:
                cout << wynik << " / " << liczba << " = ";
                cout <<( wynik = wynik / liczba ) << endl;
                break;
            case 5:
                break;
            default:
                cout << "Bledne dane!" << endl;
                break;
            }
        }
    } while( liczba != 0 || cin.fail() );
   
    cout << "Koniec." << endl;
}
P-171944
» 2018-07-24 14:17:53
P-171945
Temat założony przez niniejszego użytkownika
» 2018-07-24 14:41:43
Rozumiem, że wystarczającym typem dla zmiennych będzie float, ale użycie double nic nie komplikuje poza większym użyciem pamięci. Poza tym typem jest wszystko dobrze?
P-171946
» 2018-07-24 16:49:13
Użycie sync() to błąd.
» Kurs C++ » Poziom 1Obsługa strumienia wejściowego lekcja
Czerwona ramka. Ten rozdział jest do przepisania na nowo, by nie wspominał o sync() w ogóle.
P-171947
Temat założony przez niniejszego użytkownika
» 2018-07-24 19:05:17
Dziękuję za uwagę. Jeszcze odnośnie
cin.ignore( numeric_limits < streamsize >::max(), '\n' );
 Jak mam rozumieć tę linijkę? Czy na razie mam się po prostu nauczyć jej na pamięć?

Dodatkowo zauważyłem, że używając metody ignore na początku programu trzeba wpisać 2 wartości, z czego nawet jeśli pierwsza jest literą to pętla się nie powtarza. Dopiero druga wartość jest brana pod uwagę i używana w kalkulatorze. W kolejnych powtórzeniach ten problem nie występuje.
P-171948
» 2018-07-24 19:37:05
std::basic_istream::ignore

Rozumiem, że wystarczającym typem dla zmiennych będzie float, ale użycie double nic nie komplikuje poza większym użyciem pamięci.
Nie chodzi o rozmiar zmiennej przechowującej dane tylko o jej reprezentację w pamięci
i o to, że wartości zmiennoprzecinkowe przechowywane są w przybliżeniu, a nie dokładnej wartości.

C/C++
int main() {
    double a = 0.1;
    while( a != 1 ) {
        std::cout << a << '\n';
        a += 0.1;
    }
}
P-171949
Temat założony przez niniejszego użytkownika
» 2018-07-24 20:05:02
A jaki ma to wpływ na działanie, w tym przypadku kalkulatora. Jakie komplikacje może powodować?
P-171950
» 2018-07-24 20:17:06
Przykład pierwszy z brzegu: dzielenie przez zero. Jeśli nie wykonasz porównania we właściwy sposób, to program może mylić zero z liczbami bliskimi zera i na przykład zabraniać prawidłowych działań lub pozwalać na te, które spowodują błąd krytyczny programu.
P-171952
« 1 » 2
 Strona 1 z 2Następna strona