Problem z szalejącą konsolą.

0

Witam,
jestem tutaj nowy więc na sam początek się przywitam.

Mam problem, uczę się właśnie C++ i przerabiam lekcje o pętlach do... while...

napisałem taki program :

#include <iostream>

using namespace std;

int main()

{
    char K = 112;
    do
    {

    int A;
    int B;
    do
        {
            cout << "#################### KALKULATOR ####################" << endl;
            cout << "Podaj wartosc A : " << endl;
            cin >> A;
    }while (A < 1);

    do
    {
            cout << "Podaj wartosc B : " << endl;
            cin >> B;
    }while (B < 1);

    cout << "podales wartosci : " << endl;
    cout << "A = " << A << endl;
    cout << "B = " << B << endl;
    cout << "jakiej operacji chcesz dokonac? " << endl;
    cout << "(+ , - , * , / , 0 = zamknij)" << endl;
    char C;
    cin >> C;
    switch ( C )
    {
    case 43:
        cout << "A " << "+ " << "B = " << A + B << endl;
        cout << "Nowe obliczenia (r) : ";
        cin >> K;
    break;

    case 45:
        cout << "A " << "- " << "B = " << A - B << endl;
        cout << "Nowe obliczenia (r) : ";
        cin >> K;
    break;

    case 42:
        cout << "A " << "* " << "B = " << A * B << endl;
    break;

    case 47:
        cout << "A " << "/ " << "B = " << A / B << endl;
        cout << "Nowe obliczenia (r) : ";
        cin >> K;
    break;

    case 48:
        cout << "Koniec programu " << endl;
        cout << "Nowe obliczenia (r) : ";
        cin >> K;
        cout << "##########################################ver.1#####" << endl;
    break;

    }

    }while (K != 112);

return 0;



}

Jak widać prosty kalkulator, podajemy wartość A i wartość B a następnie wybieramy działanie jakie chcemy wykonać na tych liczbach. Dodatkowo po wykonaniu każdego działania istnieje możliwość powtórzenia (wklepując w konsole "r" a właściwie to znak inny niż "p").
Kalkulator działa, obliczenia wykonują się poprawnie a pętla która ma zaczynać program od początku działa bez zarzutu. Problem w tym że jeżeli wklepie do wartości A na przykład liczbę 99999999 a do wartości B liczbę 999999 to po wybraniu działania program zaczyna wariować.

Przypuszczam że to problem z wielkością tych liczb i zmienną którą pewnie źle zadeklarowałem.

Ktoś mnie oświeci ? :)

Pozdrawiam

1

Co konkretnie się dzieje? Czy program działa poprawnie, tylko pokazuje zły wynik?

Przy jakim działaniu jest problem? Jeżeli przy mnożeniu, to przyczyną problemu jest przekroczenie zakresu. Zmienna typu "int" może mieć wartość od ok. -2 miliardy do +2 miliardy. Zmień typ z int na long i sprawdź ponownie.

0

Program przy podawaniu wartość A zapętlał "Podaj wartość A :".
Rzeczywiście, dopiero po przeczytaniu Twojego postu zwróciłem uwagę że randomowo wklepywane w wartość A dziewiątki tworzą liczbę 9 miliardów.
Zmieniłem typ zmiennej z int na long i działa bez problemu.

Dzięki, temat do usunięcia.
Pozdrawiam

0

Dobrze, że problem rozwiązałeś i pewnie się domyśliłeś, że chodzi o "long long". Typ "long" też jest 32-bitowy, przynajmniej w QtCreator z MinGW.
Na podstawie analizy kodu wywnioskowałem, że chcesz operować na liczbach bez znaków. Do tego celu najlepiej operować na typach bez znaku ("unsigned int", "unsigned long" i "unsigned long long"). Wtedy maksymalna wartość po stronie dodatniej zwiększa się dwukrotnie w stosunku do typu ze znakiem (bez słowa "unsigned").

0
andrzejlisek napisał(a):

Dobrze, że problem rozwiązałeś i pewnie się domyśliłeś, że chodzi o "long long". Typ "long" też jest 32-bitowy, przynajmniej w QtCreator z MinGW.
Na podstawie analizy kodu wywnioskowałem, że chcesz operować na liczbach bez znaków. Do tego celu najlepiej operować na typach bez znaku ("unsigned int", "unsigned long" i "unsigned long long"). Wtedy maksymalna wartość po stronie dodatniej zwiększa się dwukrotnie w stosunku do typu ze znakiem (bez słowa "unsigned").

Super, tego w kursie nie tłumaczyli ale rozumiem że to "triki" które przyjdą z czasem.
Dzięki jeszcze raz za pomoc, wracam do nauki ;)

0

Jeśli nie chcesz pamiętać o tym jaki wielki jest dany typ, użyj takich, które mają ten opis w nazwie:

#include <cstdint>
uint64_t a;
int64_t b;
uint8_t c;
0

Kolejny problem, pewnie z powodu wysokich temperatur przeoczyłem coś w kodzie.
Napisałem taki program :

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()


{
    int ponow;

    do
    {
        srand( time( NULL ) );
        int liczba =( std::rand() % 1000 ) + 1;
        cout << "Podaj liczbe" <<endl;
        int liczba2;
        cin >> liczba2;
        int poprawnosc = cin.good();

        if( liczba2 == liczba)
        {
            cout << "Brawo, trafiles!" << endl;
            cout << "podales " << liczba2 << endl;
            cout << "prawidlowa " << liczba << endl;
        }

        if( liczba != liczba2)
        {
            cout << "niestety, nie udalo sie." << endl;
            cout << "prawidlowa liczba to " << liczba << endl;
            cout << "1 = restart" << endl;
            cin >> ponow;
        }

        if( poprawnosc == 0)
        {
            cout << "No bez jaj, miala byc cyfra/liczba a nie litera..." << endl;
            cout << "1 = restart" << endl;
            cin >> ponow;
        }

    }while (ponow != 2);

    return 0;
}


Program sam w sobie działa poprawnie (liczba się losuje, ify wykonują się zgodnie z tym co zawarłem w kodzie). Problem natomiast wychodzi w trakcie podania znaku innego niż liczba/cyfra.
Gdy wpiszę w program na przykład literkę A to ten if :

        if( poprawnosc == 0)
        {
            cout << "No bez jaj, miala byc cyfra/liczba a nie litera..." << endl;
            cout << "1 = restart" << endl;
            cin >> ponow;
        }

Zapętla się. Nie potrafię dostrzec swojego błędu a pewnie jest banalny.

Pozdrawiam

0

ponow nie zostaje wczytana przez co masz randomowa liczbe a cin ma flage bledu wiec nie przyjmuja wiecej znakow

Zabezpieczenie przed wpisywaniem liter

0

Z poprzednim problemem "jakoś" sobie poradziłem, natomiast teraz mam kolejny.
Przerabiam teraz przekazywanie wartości do funkcji poprzez argumenty, niestety w kursie temat wytłumaczony tak pobieżnie że nic z tego nie kumam.
Ogólnie funkcje kumam, ale tego już nie.

#include <iostream>

int dodawanie( int a, int b )
{
    return a + b;
}

int main()
{
    int z;

    do
    {
    std::cout << "Podaj liczbe A : " << std::endl;
    std::cin >> a;
    std::cout << "Podales liczbe B : " << std::endl;
    std::cin >> b;
    int wynik = dodawanie(a + b);
    std::cout << "Wynik to : " << wynik << std::endl;
    std::cin >> z;
    }while (z < 2);

    return 0;

}

Zaciąłem się na takim kodzie, mam podać dane w funkcji main które zostaną wykonane przez funkcje dodawanie a następnie wrzucone do zmiennej Wynik, czy ktoś mi pomoże i co najważniejsze wytłumaczy ? :)

Pozdrawiam

0

Po pierwsze brak deklaracji a i b. Po drugie parametry funkcji oddzielamy przecinkiem, powinno być 

int wynik = dodawanie(a, b);

Po trzecie zawsze nadawaj zmiennym wartość początkowa, inaczej mogą tam być jakieś "śmieci".

0

@Antipop poczytaj sobie moj kurs http://fasadin.4programmers.net/
widze ze dopiero zaczynasz nauke. Zacznij w odpowiedni sposob. Moze moje lekcje (niestety niedokonczone mam w planach dokonczyc) lepiej wytlumacza

idz od poczatku (pierwszego posta nawet wstepu)

0
sig napisał(a):

Po pierwsze brak deklaracji a i b. Po drugie parametry funkcji oddzielamy przecinkiem, powinno być 

int wynik = dodawanie(a, b);

Po trzecie zawsze nadawaj zmiennym wartość początkowa, inaczej mogą tam być jakieś "śmieci".

No i jednym postem nadrobiłeś u mnie braki z kursu który wytłumaczył mi to jakoś tak na około.

#include <iostream>

int dodawanie( int a, int b )
{
    return a + b;
}

int main()
{
    int z;

    do
    {
    int a = 0;
    int b = 0;
    std::cout << "Podaj liczbe A : " << std::endl;
    std::cin >> a;
    std::cout << "Podales liczbe B : " << std::endl;
    std::cin >> b;
    std::cout << "Wynik" << dodawanie(a,b) << std::endl;
    }while (z < 2);

    return 0;

}

To działa, z tym dodawanie(a,b) a nie dodawanie(a + b) wpadłem zaraz po napisaniu posta ale kurs mnie zmylił i nie podałem zmiennych na początku.
Program śmiga aż miło.

fasadin napisał(a):

@Antipop poczytaj sobie moj kurs http://fasadin.4programmers.net/
widze ze dopiero zaczynasz nauke. Zacznij w odpowiedni sposob. Moze moje lekcje (niestety niedokonczone mam w planach dokonczyc) lepiej >wytlumacza

idz od poczatku (pierwszego posta nawet wstepu)

Na pewno spróbuje, im więcej źródeł wiedzy tym efektywniejsza nauka, nie chce jakiegokolwiek zagadnienia po prostu przerobić, wolał bym też praktycznie wiedzieć co się w kodzie dzieje żeby potem mnie coś nie zaskoczyło ;)

Dzięki chłopaki.

Pozdrawiam

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