• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego program się wysypuje po drugim powtórzeniu w do...while?

Object Storage Arubacloud
0 głosów
250 wizyt
pytanie zadane 25 listopada 2015 w C i C++ przez eveN Nowicjusz (230 p.)

Witajcie, mam napisany program (kalkulator) w C++. Program wysypuje się przy drugim powtórzeniu pętli do...while. Pomóżcie ; )

#include <iostream>
#include <cmath>

using namespace std;

void menu()
{
    cout << "Podaj operacje, jaka chcesz wykonac: " << endl;
    cout << "0 - dodawanie" << endl;
    cout << "1 - odejmowanie" << endl;
    cout << "2 - mnozenie" << endl;
    cout << "3 - dzielenie" << endl;
    cout << "4 - a do potegi b" << endl;
    cout << "5 - reszta z dzielenia a przez b" << endl;
    cout << "6 - minimum z n liczb" << endl;
    cout << "7 - maximum z n liczb" << endl;
    cout << "9 - wyjscie" << endl;
}
double dodaj(double a, double b)
{
    double suma = a+b;
    return suma;
}
double odejmij(double a, double b)
{
    double roznica = a-b;
    return roznica;
}
double mnoz(double a, double b)
{
    double iloczyn = a*b;
    return iloczyn;
}
double dziel(double a, double b)
{
    double iloraz = a/b;
    return iloraz;
}
int potega(int a, int b)
{
    int wynik = a;
    for (int i=1; i<b; i++)
    {
        wynik *= a;
    }
    return wynik;
}
int reszta(int a, int b)
{
    int reszta = a%b;
    return reszta;
}
double minimum(int n, double tab[])
{
    double wynik = tab[0];
    for (int i=1; i<n; i++)
    {
        if (tab[i]<wynik) wynik = tab[i];
    }
    return wynik;
}
double maximum(int n, double tab[])
{
    double wynik = tab[0];
    for (int i=1; i<n; i++)
    {
        if (tab[i]>wynik) wynik = tab[i];
    }
    return wynik;
}
int main()
{
    int operacja;
    double a, b;
    do
    {
        menu();
        cout << "Podaj numer operacji: ";
        cin >> operacja;
        switch(operacja)
        {
        case 0:
            cout << "Podaj dwie liczby: ";
            cin >> a >> b;
            cout << "Suma: " << dodaj(a, b) << endl;
            break;
        case 1:
            cout << "Podaj dwie liczby: ";
            cin >> a >> b;
            cout << "Roznica: " << odejmij(a, b) << endl;
            break;
        case 2:
            cout << "Podaj dwie liczby: ";
            cin >> a >> b;
            cout << "Iloczyn: " << mnoz(a, b) << endl;
            break;
        case 3:
            cout << "Podaj dwie liczby: ";
            cin >> a >> b;
            cout << "Iloraz: " << dziel(a, b) << endl;
            break;
        case 4:
            cout << "Podaj dwie liczby: ";
            cin >> a >> b;
            cout << "Potega: " << potega(a, b) << endl;
            break;
        case 5:
            cout << "Podaj dwie liczby: ";
            cin >> a >> b;
            cout << "Reszta z dzielenia: " << reszta(a, b) << endl;
            break;
        case 6:
            cout << "Podaj ilosc elementow tablicy: ";
            int n;
            cin >> n;
            double tab[n];
            cout << "Uzupelnij tablice: ";
            for (int i=0; i<n; i++)
            {
                cin >> tab[i];
            }
            cout << "Najmniejszy element to: " << minimum(n, tab) << endl;
            break;
        case 7:
            cout << "Podaj ilosc elementow tablicy: ";
            int n2;
            cin >> n2;
            cout << "Uzupelnij tablice: ";
            double tab2[n2];
            for (int i=0; i<n2; i++)
            {
                cin >> tab2[i];
            }
            cout << "Najwiekszy element to: " << maximum(n, tab2) << endl;
            break;
        case 9:
            cout << "Koniec programu!" << endl;
            break;
        default:
            cout << "Zly wybor!" << endl;
        }
        cout << endl;
    }
    while (operacja!=9);

    return 0;
}

 

4 odpowiedzi

+1 głos
odpowiedź 25 listopada 2015 przez Radfler VIP (101,030 p.)

Dobra, jakoś znalazłem ten błąd:

W case 6 i case 7 tworzysz nowe zmienne. W takim przypadku warto byłoby ograniczyć je klamrami, gdyż zmienne które tworzysz są widoczne dla wszystkich casów niżej. Oprócz tego w case 7 odwołujesz się do zmiennej n, która została utworzona w case 6, a właściwie nie została, gdyż ten fragment kodu nigdy nie został wykonany.

+1 głos
odpowiedź 25 listopada 2015 przez Porcupine Nałogowiec (31,560 p.)

1) To co napisał Radfler - gdy deklarujesz zmienną w switchu musisz korzystać z klamer, wiecej informacji tutaj: 
http://stackoverflow.com/questions/92396/why-cant-variables-be-declared-in-a-switch-statement

2) Nie tak się robi tablice o ustalonej wielkosci... 
ŹLE: 

double tab[n];

DOBRZE:

double *tab = new double [n];

 

3) W linii: 

cout << "Najwiekszy element to: " << maximum(n, tab2) << endl;

Powinno być: maximum(n2,tab2).

Pozdrawiam,

0 głosów
odpowiedź 25 listopada 2015 przez Mavimix Dyskutant (8,390 p.)
Z tego co widzę to niezadeklarowałeś wartości zmiennej operacja, ani nigdzie nie ma inkrementacji tej zmiennej
komentarz 25 listopada 2015 przez Radfler VIP (101,030 p.)
Nie musi, przecież w 79 linijce wczytuje do tej zmiennej wartość z stdout.
0 głosów
odpowiedź 25 listopada 2015 przez eveN Nowicjusz (230 p.)

Dzięki Panowie! Nie miałem siły nad tym myśleć już a muszę to mieć na wczoraj ; D Dodałem klamry { } i działa wszystko. Wiedziałem że coś nie tak z case 6 i 7 bo bez nich działało, a zapomniałem napisać tu. To kod już działający i ulepszony: 

#include <iostream>
#include <cmath>
#include <windows.h>
#include <conio.h>

using namespace std;

void menu()
{
    cout << "Podaj operacje, jaka chcesz wykonac: " << endl;
    cout << "0 - dodawanie" << endl;
    cout << "1 - odejmowanie" << endl;
    cout << "2 - mnozenie" << endl;
    cout << "3 - dzielenie" << endl;
    cout << "4 - a do potegi b" << endl;
    cout << "5 - reszta z dzielenia a przez b" << endl;
    cout << "6 - minimum z n liczb" << endl;
    cout << "7 - maximum z n liczb" << endl;
    cout << "9 - wyjscie" << endl;
}
double dodaj(double a, double b)
{
    double suma = a+b;
    return suma;
}
double odejmij(double a, double b)
{
    double roznica = a-b;
    return roznica;
}
double mnoz(double a, double b)
{
    double iloczyn = a*b;
    return iloczyn;
}
double dziel(double a, double b)
{
    double iloraz = a/b;
    return iloraz;
}
int potega(int a, int b)
{
    int wynik = a;
    for (int i=1; i<b; i++)
    {
        wynik *= a;
    }
    return wynik;
}
int reszta(int a, int b)
{
    int reszta = a%b;
    return reszta;
}
double minimum(int n, double tab[])
{
    double wynik = tab[0];
    for (int i=1; i<n; i++)
    {
        if (tab[i]<wynik) wynik = tab[i];
    }
    return wynik;
}
double maximum(int n, double tab[])
{
    double wynik = tab[0];
    for (int i=1; i<n; i++)
    {
        if (tab[i]>wynik) wynik = tab[i];
    }
    return wynik;
}
int main()
{
    int operacja;
    double a, b;
    do
    {
        system("cls");
        menu();
        cout << "Podaj numer operacji: ";
        cin >> operacja;
        switch(operacja)
        {
        case 0:
            cout << "Podaj dwie liczby: ";
            cin >> a >> b;
            cout << "Suma: " << dodaj(a, b) << endl;
            break;
        case 1:
            cout << "Podaj dwie liczby: ";
            cin >> a >> b;
            cout << "Roznica: " << odejmij(a, b) << endl;
            break;
        case 2:
            cout << "Podaj dwie liczby: ";
            cin >> a >> b;
            cout << "Iloczyn: " << mnoz(a, b) << endl;
            break;
        case 3:
            cout << "Podaj dwie liczby: ";
            cin >> a >> b;
            cout << "Iloraz: " << dziel(a, b) << endl;
            break;
        case 4:
            cout << "Podaj dwie liczby: ";
            cin >> a >> b;
            cout << "Potega: " << potega(a, b) << endl;
            break;
        case 5:
            cout << "Podaj dwie liczby: ";
            cin >> a >> b;
            cout << "Reszta z dzielenia: " << reszta(a, b) << endl;
            break;
        case 6:
            cout << "Podaj ilosc elementow tablicy: ";
            {
                int n;
                cin >> n;
                double tab[n];
                cout << "Uzupelnij tablice: ";
                for (int i=0; i<n; i++)
                {
                    cin >> tab[i];
                }
                cout << "Najmniejszy element to: " << minimum(n, tab) << endl;
            }
            break;
        case 7:
            cout << "Podaj ilosc elementow tablicy: ";
            {
                int n2;
                cin >> n2;
                cout << "Uzupelnij tablice: ";
                double tab2[n2];
                for (int i=0; i<n2; i++)
                {
                    cin >> tab2[i];
                }
                cout << "Najwiekszy element to: " << maximum(n2, tab2) << endl;
            }
            break;
        case 9:
            cout << "Koniec programu!" << endl;
            return 0;
            break;
        default:
            cout << "Zly wybor!" << endl;
        }
        cout << endl << "Aby kontynuowac wcisnij klawisz!";
        getch();
    }
    while (operacja!=9);

    return 0;
}

 

Podobne pytania

–2 głosów
2 odpowiedzi 260 wizyt
pytanie zadane 4 lutego 2016 w C i C++ przez 0xf Dyskutant (8,180 p.)
0 głosów
1 odpowiedź 689 wizyt
pytanie zadane 6 stycznia 2019 w C i C++ przez Kacper Lasota Początkujący (250 p.)
0 głosów
1 odpowiedź 313 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...