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

[Rozdział 17] Kalkulator - problem z funkcją

Ostatnio zmodyfikowano 2015-08-14 15:41
Autor Wiadomość
WilkZKlatki
Temat założony przez niniejszego użytkownika
[Rozdział 17] Kalkulator - problem z funkcją
» 2015-08-13 12:19:55
Witam. W rozdziale 17 proszą mnie o stworzenie funkcji wczytajLiczbe() (u mnie nazwa zmieniona na wczytaj(), z powodu tego, że w Visual Studio wszystko traktuje mi jako jeden projekt i nie mogę mieć tych samych nazw funkcji :C )

Problem jest taki, że gdy wpiszę literkę zamiast liczby to to co występuje w if wykonuje się w nieskończoność.

C/C++
#include <iostream>

using namespace std;

int wczytaj()
{
    int a;
    bool poprawnie;
    do
    {
       
        cin >> a;
        poprawnie = cin.good();
        cin.clear();
        cin.sync();
        if( !poprawnie )
        {
            cout << "Podales nieprawidlowa liczbe!" << endl;
            cout << "Podaj liczbe: ";
        }
    } while( !poprawnie );
   
    return a;
}

int main()
{
    int wynik = 0;
    int wybor;
    int koniec = 1;
    int liczba;
    int a;
    int b;
    do
    {
        cout << "Wynik: " << wynik << endl;
       
        cout << "Wprowadz pierwsza liczbe: " << endl;
        liczba = wczytaj();
        if( liczba != 0 )
        {
            a = liczba;
            cout << "Wprowadz druga liczbe: " << endl;
            liczba = wczytaj();
            if( liczba != 0 )
            {
                b = liczba;
                cout << "WYbierz dzialanie:" << endl;
                cout << "[1] Dodawanie" << endl;
                cout << "[2] Odejmowanie" << endl;
                cout << "[3] Mnoazenie" << endl;
                cout << "[4] Dzielenie" << endl;
                cout << "[5] Rezygnuj" << endl;
                cin >> wybor;
                switch( wybor )
                {
                case 1:
                    wynik = a + b;
                    break;
                case 2:
                    wynik = a - b;
                    break;
                case 3:
                    wynik = a * b;
                    break;
                case 4:
                    wynik = a / b;
                    break;
                case 5:
                    koniec = 0;
                    break;
                }
            }
            else
            {
                koniec = 0;
            }
           
        }
        else
        {
            koniec = 0;
        }
       
       
       
    } while( koniec != 0 );
   
    return 0;
}
P-136127
PawloRz
Najpierw dodaj bibliotekę stdio.h
» 2015-08-13 12:56:29
Miałem kiedyś ten sam problem. Musisz w tym if, w którym jest błąd dodaj fflush(stdin);
Litera zostaje w stdin'ie i wiecznie wywołuje błąd. Jeśli błąd dalej będzie występował, próbuj przenosić funkcję fflush(stdin);
Życzę powodzenia!
P-136129
carlosmay
» 2015-08-13 13:18:51
wczytajLiczbe() (u mnie nazwa zmieniona na wczytaj(), z powodu tego, że w Visual Studio wszystko traktuje mi jako jeden projekt i nie mogę mieć tych samych nazw funkcji
A jak przyjdzie przeciążać funkcje to co zrobisz?

Jak używasz vs 15 to faktycznie ma problem z czyszczeniem strumienia. Sprawdzałem to na vs 13 i kod jest poprawny, na vs 15 pętla nieskończona.
Nie wiem czy to błąd środowiska (ale chyb tak).
P-136130
PawloRz
Nie wkurza Cię brak polskich liter?
» 2015-08-13 13:25:39
Za cout użyj printf("", [kody-znaków]);
Podam Ci zawartość pliku polishchar.h:

#ifndef POLISHCHAR
#define POLISHCHAR

#define S_S 920
#define U_S 919
#define S_L 904
#define U_L 925
#define U_A 932
#define S_A 933
#define S_E 937
#define U_E 936
#define S_X 939
#define U_X 909
#define U_Z 957
#define S_Z 958
#define S_N 996
#define U_N 995
#define U_C 911
#define S_C 902
#define S_O 930
#define U_O 736

#endif

Użyj, n.p. printf("Rozwi%czanie = %d\n", S_A, [wynik]);
P-136131
Monika90
» 2015-08-13 13:43:57
Musisz w tym if, w którym jest błąd dodaj fflush(stdin);
fflush(stdin) ma niezdefiniowane zachowanie.
P-136132
WilkZKlatki
Temat założony przez niniejszego użytkownika
Odpowiadam
» 2015-08-13 14:12:10
Miałem kiedyś ten sam problem. Musisz w tym if, w którym jest błąd dodaj fflush(stdin); Litera zostaje w stdin'ie i wiecznie wywołuje błąd. Jeśli błąd dalej będzie występował, próbuj przenosić funkcję fflush(stdin); Życzę powodzenia!
say what?

A jak przyjdzie przeciążać funkcje to co zrobisz?
Nie wiem co to przeciążanie funkcji, może jakaś porada?

Jak używasz vs 15 to faktycznie ma problem z czyszczeniem strumienia. Sprawdzałem to na vs 13 i kod jest poprawny, na vs 15 pętla nieskończona.

Nie wiem czy to błąd środowiska (ale chyb tak).
Czyli wcześniejsza wersja VS albo jakieś inne, lub czekać aż pan Microsoft to naprawi.

Użyj, n.p. printf("Rozwi%czanie = %d\n", S_A, [wynik]);
Dzięki ale nie pytałem o polskie znaki :)

fflush(stdin) ma niezdefiniowane zachowanie.
Możliwe, a ja nawet nie wiem co to :)
P-136136
Monika90
» 2015-08-13 14:21:40
zatąp cin.sync();
przez cin.ignore(999999, '\n');
i powiedz czy to coś zmieniło.
P-136137
WilkZKlatki
Temat założony przez niniejszego użytkownika
Odpowiadam #2
» 2015-08-13 14:35:50
zatąp cin.sync(); przez cin.ignore(999999, '\n'); i powiedz czy to coś zmieniło.

Tak zmieniło, bo działa :P
Wyjaśnisz co robi ta linijka?
P-136139
« 1 » 2
  Strona 1 z 2 Następna strona