Wątek przeniesiony 2017-12-05 21:27 z C/C++ przez ŁF.

Prosty kalkulator – potęgowanie liczby 5 zawsze działa nieprawidłowo

0

Witam.
Dzisiaj robiłem kalkulator na informatykę. Kiedy robiłem potęgowanie na pierwszy rzut oka było wszystko ok ale kiedy sprawdziłem jeszcze raz pojawił się właśnie taki błąd, kiedy potęguje jakąkolwiek liczbę jest ok ale kiedy potęguje 5 zawsze jest o jedno mniej np: 5^2=25 a mi wychodzi 24, albo 5^3=125 a mi wychodzi 124.
Od razu pokazuje kod:

else if(wybor==5)
                {
                    potegowanie=pow(liczba1,liczba2);
                    cout<<"Wynik: "<<potegowanie<<endl;
                }

Reszta kodu jest dobra więc myślę że nie potrzeba udostępniać.

0
else if(wybor==5)
{
potegowanie=pow(liczba1,liczba2);
cout<<"Wynik: "<<potegowanie<<endl;
}

tu nie ma bledu (oprocz tego, ze mozna uzyc '\n' zamiast endla i tez brak formatowania...)

0
#include <iostream>
#include <windows.h>
#include <math.h>

using namespace std;

int liczba1,liczba2,wybor,dodawanie,odejmowanie,mnozenie,dzielenie,potegowanie,yes,no,tak,nie;

int main()
{
    while(true)

            for(;;)
            {
                cout<<"Podaj pierwsza liczbe:";
                cin>>liczba1;
                cout<<"Podaj druga liczbe:";
                cin>>liczba2;
                cout<<"___Wybierz Dzialanie___"<<endl;
                cout<<"1.Dodawanie"<<endl;
                cout<<"2.Odejmowanie"<<endl;
                cout<<"3.Mnozenie"<<endl;
                cout<<"4.Dzielenie"<<endl;
                cout<<"5.Potegowanie"<<endl;
                cout<<"wybierasz: ";
                cin>>wybor;

                if(wybor==1)
                {
                    dodawanie=liczba1+liczba2;
                    cout<<"Wynik: "<<dodawanie<<endl;
                }
                    else if(wybor==2)
                {
                    odejmowanie=liczba1-liczba2;
                    cout<<"Wynik: "<<odejmowanie<<endl;
                }
                else if(wybor==3)
                {
                    mnozenie=liczba1*liczba2;
                    cout<<"Wynik: "<<mnozenie<<endl;
                }
                else if(wybor==5)
                {
                    potegowanie=pow(liczba1,liczba2);
                    cout<<"Wynik: "<<potegowanie<<endl;
                }
                else if(wybor==4)
                {
                if(liczba2==0)
                    {
                    cout <<"Nie da sie dzielic przez 0"<<endl;
                    }
                    else
                    {
                        dzielenie=liczba1/liczba2;
                        cout<<"Wynik: "<<dzielenie<<endl;
                    }
                    }
                    else
                        cout<<"Nie ma takiej opcji"<<endl;

                            string a,b;
                            cout << "czy chcesz wylaczyc, w przeciwnym wypadku nastapi reset: ";
                            cin >> a;
                            if (a == "tak")
                            {
                                cout<<"Dziekuje za uwage. Program zostal napisany przez K.T";
                                Sleep(3000);
                                exit(0);
                            }
                            else
                                cout<<"czy chcesz wylaczyc, w przeciwnym wypadku nastapi reset: ";
                                {
                                    system("cls");
                                }
             }
    return 0;
}
0

Ten kod działa
http://rextester.com/SWTM19332



Podaj pierwsza liczbe:3
Podaj druga liczbe:3

___Wybierz Dzialanie___
1.Dodawanie
2.Odejmowanie
3.Mnozenie
4.Dzielenie
5.Potegowanie
wybierasz: Wynik: 27

0

Dlaczego nie działa - bez patrzenia na cały kod - błąd jest w tym kawałku kodu. Jak C, PHP i C++ zaokrągla liczby, gdy gdzieś się trafi int? Tego można było się domyślić bez patrzenia w resztę kodu.

Odpowiedź od razu powinna brmieć :"sprawdź typy zmiennych, podejrzewam, że wynik jest typu int.".

Marni programiści... Albo celowo wyciągają kod jak Pabloss w ostatnich postach mimo, że temat nie dotyczył nawet stricte programowania.

Taki błąd - wynik za mały lub za duży o 1 zazwyczaj świadczy o braku wzięcia pod uwagę precyzji i próbie zaokrąglania do int.

0

Dodatkowe uwagi dla OP. Wiem, że jesteś nowy i nie o Tobie piszę, tylko o doświadczonych pomocnikach. Doświadczony programista znajdzie ten błąd w minutę, gdy wie, że z tym kawałkiem jest problem a reszta działa.

Porady.:
Klamry otwieraj i zamykaj w tej samej odleglości od lewego marginesu - będzie Ci lepiej czytać kod. Są 3 sposoby formatowania (z czego 2 sa popularne) - bliżej Ci jest do tej, która preferuje domykanie i otwieranie w nowej linii w tej samej kolumnie co poprzedzajaca instrukcja.
Za klamrą w następnej linii zawsze rób albo tabulator, albo 3 spacje. Po domknięciu klamry piszesz równo z nią. Po if, while, for jeżeli jest tylko jedna instrukcja robisz wcięcie i kolejne instrukcje z powrotem w tej kolumnie co if, for, while.

Tu masz przykład jak kod powinien być poformatowany dla czytelności: gidnetwork. com/b-38.html

To że podali tam 3 sposoby formatowania, nie oznacza, ze można mieszać - należy wybrać jeden i jeżeli piszesz w tym samym pliku, w którym ktoś rozpoczął i kod ma cechę poformatowania - kontynuujesz ten sam styl, by nie było bałaganu. W wielu firmach narzucone jest z góry jak kod formatować.

0

Nie wiem co mam dobić.

Do osób nie mających konta pisz komentarze. Nie da się odpowiadać na komentarze.

Ogólnie swojego powa otocz nawiasami i dopisz przed słowo round

Powinno to wyglądać tak: ...=round(pow(...));

A jażeli aplikacja kalkulator ma służyć do liczenia na liczbach rzeczywistych, a nie całkowitych, to deklaracja typów powinna być inna. Polecam typ double oraz funkcję sprintf i printf, które pomogą ją sformatować odpowiednio z odpowiednią ilością miejsc dziesiętnych. Wtedy nie robisz zaokrąglania.

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