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

[lekcja 15] 2 zadanie ( kalkulator)

Ostatnio zmodyfikowano 2014-01-27 15:11
Autor Wiadomość
G4m3killer
Temat założony przez niniejszego użytkownika
[lekcja 15] 2 zadanie ( kalkulator)
» 2014-01-26 09:57:40
Witam.
Napisałem kalkulator do zadania 2 z 15 lekcji.
Chciałbym, abyście zobaczyli czy nie ma błędów + czy funkcja zabezpieczajaca przed nieporzadanymi znakami zostala dobrze napisana :) Tu macie tresc 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
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. "

C/C++
#include <iostream>
using namespace std;
int main()
{
    float liczba, liczba2, wynik;
    wynik = 0;
   
    do
    {
        cout << "Wynik: " << wynik << endl;
        wynik = 0;
        cout << "Podaj liczbe: ";
        cin.clear();
        cin.sync();
        cin >> liczba;
       
        cout << "Podaj 2 liczbe: ";
        cin.clear();
        cin.sync();
        cin >> liczba2;
       
        if( liczba != 0 && liczba2 != 0 )
        {
            cout << "Wybierz dzialanie: " << endl;
            cout << "[1] Dodawanie" << endl;
            cout << "[2] Odejmowanie" << endl;
            cout << "[3] Mnozenie" << endl;
            cout << "[4] Dzielenie" << endl;
            cout << "[5] Rezygnuj" << endl;
            int wybor;
            cin >> wybor;
            switch( wybor )
            {
            case 1:
                wynik = liczba + liczba2;
                cout << liczba << " + " << liczba2 << " = " << wynik << endl;
                break;
            case 2:
                wynik = liczba - liczba2;
                cout << liczba << " - " << liczba2 << " = " << wynik << endl;
                break;
            case 3:
                wynik = liczba * liczba2;
                cout << liczba << " * " << liczba2 << " = " << wynik << endl;
                break;
            case 4:
                wynik = liczba / liczba2;
                cout << liczba << " / " << liczba2 << " = " << wynik << endl;
                break;
            case 5:
               
                break;
            default:
                cout << "Podales bledne dane :/" << endl;
                break;
            }
           
        }
       
    } while( liczba != 0 && liczba2 != 0 );
   
    return 0;
}
P-103211
alixir
» 2014-01-26 10:44:51
Ja osobiście trochę inaczej rozumiem treść zadania, ale pomijam już ten fakt.
Co do zabezpieczeń to program jest "zabezpieczony" niepoprawnie zarówno w przypadku wczytywania liczb jak i w przypadku wyboru opcji.


P-103214
G4m3killer
Temat założony przez niniejszego użytkownika
» 2014-01-26 11:47:53
Byłbym wdzięczny jeśli byś przedstawił jak rozumiesz zabezpieczenie w tym zadaniu :)
Czym zabezpieczyc? przyklad jakis.
I co inaczje rozumiesz niz ja w tym zadaniu?
P-103223
alixir
» 2014-01-26 11:55:32
Kwestia zabezpieczeń na przykładzie wczytywania liczby:

C/C++
do { // petla wczytujaca liczbe
    if( std::cin.fail() ) {
        std::cout << "To nie jest liczba!" << std::endl;
        std::cin.clear();
        std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
    }
    std::cout << "Podaj liczbe : ";
    std::cin >> liczba;
} while( std::cin.fail() );


Oczywiście taka pętla musi być użyta dla każdej wczytywanej z liczb osobno.
Co do kwestii zrozumienia treści zadania to już jest sprawa indywidualna, lecz ja to rozumiem tak:
- wyświetlasz wynik
- podajesz liczbę (tylko jedną)
- wybierasz działanie
- wykonujesz obliczenia (opierają się one na wyniku i podanej liczbie)
.. i tak w kółko
P-103226
G4m3killer
Temat założony przez niniejszego użytkownika
» 2014-01-26 18:55:23
"std::cin.ignore( std::numeric_limits < std::streamsize >::max()"
Takiego czegos w kursie nawet do tej pory nie bylo :)
po 2 jesli 0 sie poda to program musi byc zamkniety.
Co do tej 1 liczby to czemu by nie zrobić 2 liczb? Trudniej, lepiej, a da łatwo się zrobić :)
P-103274
alixir
» 2014-01-26 19:09:11
Zamiast
std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
 możesz oczywiście użyć
std::cin.sync();

Ten kawałek kodu zabezpiecza program przed próbą podania liter lub innych znaków. Co do zamykania programu jeśli wczytana liczba będzie równa 0 to oczywiście trzeba zastosować dodatkowy warunek, ale to już poza pętlą.

Natomiast co do zrozumienia treści zadania to jak wspomniałem kwestia indywidualna.
P-103275
G4m3killer
Temat założony przez niniejszego użytkownika
» 2014-01-27 07:26:15
Czyli program napisalem dobrze?
Chodzi tu o zabezpieczenie.
Jeśli jakaś liczba jest bledna to zamyka kod.
Dlatego dalem float. Gdy jest źle to wywala 0 i wyłącza program :)
Pomyślałem, że tak by bylo lepiej.
P-103299
alixir
» 2014-01-27 07:41:02
Uruchom swój program i podaj np.
e
8

i sprawdź co się dzieje
P-103300
« 1 » 2
  Strona 1 z 2 Następna strona