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

Jak oceniacię mój kalkulator ? [c++]

Object Storage Arubacloud
–1 głos
520 wizyt
pytanie zadane 4 marca 2017 w C i C++ przez PirchHD Obywatel (1,730 p.)
edycja 4 marca 2017 przez PirchHD

Witam tu podaję swój kod i proszę o ocenę i propozycję co dodać co zmienić..... Mam zamiar dodać funkcje takie jakie ma zawansowany kalkulator takie jak: wzory skróconego mnożenia, potęgo, logarytmy, liczenie pola lub obwodu... po prostu chcę zrobić kalkulator w którym będzie wszystko.. ;) o to on:

 

 

#include <iostream>
#include <string>
using namespace std;

void Wybory()
{
    cout << "[1] - dodawanie" << endl;
    cout << "[2] - odejmowanie" << endl;
    cout << "[3] - mnozenie " <<endl;
    cout << "[4] - dzielenie " <<endl;
    cout << "[5] - WZORY SKROCONEGO MNOZENIA " <<endl;
}
void funkcja_dodawanie()
{
    int x,z;
    cout<<"Podaj liczbe: ";
    cin>>x;
    cout <<"Podaj kolejna: ";
    cin>> z;
    cout <<"Wynik to: "<<x+z<<endl;

 

}
void funkcja_odejmowanie()
{
    int x,z;
    cout<<"Podaj liczbe: ";
    cin>>x;
    cout <<"Podaj kolejna: ";
    cin>> z;
    cout <<"Wynik to: "<<x-z<<endl;

}
void funkcja_mnozenie()
{
        int x,z;
    cout<<"Podaj liczbe: ";
    cin>>x;
    cout <<"Podaj kolejna: ";
    cin>> z;
    cout <<"Wynik to: "<<x * z<<endl;

}
void funkcja_dzielenie()
{
    int x,z;
    cout<<"Podaj liczbe: ";
    cin>>x;
    cout <<"Podaj kolejna: ";
    cin>> z;
    cout <<"Wynik to: "<<x/z<<endl;
}

int main()
{

    cout << "Witam serdecznie w moim prywatny kalkulatorze " << endl;
    int zmienna;
    cout<< "-----------------------------------------------------------"<< endl;
    cout<< "Podaj co chcesz zrobic: "<<endl;
    Wybory();

    cin >> zmienna;
switch( zmienna )
{
case 1:
   funkcja_dodawanie();
   main();
    break;

case 2:
    funkcja_odejmowanie();
    main();
    break;
case 3:
    funkcja_mnozenie();
    main();
    break;

case 4:
    funkcja_dzielenie();
    main();
    break;
case 5:
    cout << "tu beda wzoru skroconego mnozenia..."<<endl;
    main();
    break;

    }

    return 0;
}

 

komentarz 4 marca 2017 przez hoktaur Pasjonat (22,250 p.)

wrzuć to do code o tak:

#include <iostream>
#include <string>
using namespace std;

void Wybory()
{
    cout << "[1] - dodawanie" << endl;
    cout << "[2] - odejmowanie" << endl;
    cout << "[3] - mnozenie " <<endl;
    cout << "[4] - dzielenie " <<endl;
    cout << "[5] - WZORY SKROCONEGO MNOZENIA " <<endl;
}
void funkcja_dodawanie()
{
    int x,z;
    cout<<"Podaj liczbe: ";
    cin>>x;
    cout <<"Podaj kolejna: ";
    cin>> z;
    cout <<"Wynik to: "<<x+z<<endl;

 

}
void funkcja_odejmowanie()
{
    int x,z;
    cout<<"Podaj liczbe: ";
    cin>>x;
    cout <<"Podaj kolejna: ";
    cin>> z;
    cout <<"Wynik to: "<<x-z<<endl;

}
void funkcja_mnozenie()
{
        int x,z;
    cout<<"Podaj liczbe: ";
    cin>>x;
    cout <<"Podaj kolejna: ";
    cin>> z;
    cout <<"Wynik to: "<<x * z<<endl;

}
void funkcja_dzielenie()
{
    int x,z;
    cout<<"Podaj liczbe: ";
    cin>>x;
    cout <<"Podaj kolejna: ";
    cin>> z;
    cout <<"Wynik to: "<<x/z<<endl;
}

int main()
{

    cout << "Witam serdecznie w moim prywatny kalkulatorze " << endl;
    int zmienna;
    cout<< "-----------------------------------------------------------"<< endl;
    cout<< "Podaj co chcesz zrobic: "<<endl;
    Wybory();

    cin >> zmienna;
switch( zmienna )
{
case 1:
   funkcja_dodawanie();
   main();
    break;

case 2:
    funkcja_odejmowanie();
    main();
    break;
case 3:
    funkcja_mnozenie();
    main();
    break;

case 4:
    funkcja_dzielenie();
    main();
    break;
case 5:
    cout << "tu beda wzoru skroconego mnozenia..."<<endl;
    main();
    break;

    }

    return 0;
}

 

4 odpowiedzi

0 głosów
odpowiedź 4 marca 2017 przez tangarr Mędrzec (154,860 p.)
wybrane 4 marca 2017 przez PirchHD
 
Najlepsza

Funkcja main jest tragiczna. Rekurencyjne wywoływanie funkcji main doprowadzi do przepełnienia stosu

Zamiast wywoływać main rekurencyjnie umieść tam nieskończoną pętle

while (true) {
    Wybory();
    cin >> zmienna;
    switch (zmienna) {
       ...
    }
}

Z mniejszych błędów: Pozwalasz na dzielenie przez zero.

komentarz 4 marca 2017 przez Molester Bywalec (2,920 p.)
Nie ma sensu zakładać nowej odpowiedzi bo większość została już dodana, ale od siebie dodałbym ang nazwy funkcji i zmiennych, zaprzestanie używania przestrzeni nazw std, oraz używanie innego typu danych np double, sprawdzanie poprawności czy to co weszło to liczba,czyszczenie bufora strumienia i tyle chyba.
komentarz 4 marca 2017 przez Molester Bywalec (2,920 p.)
A i nie wiem po co Ci biblioteka stringów.
1
komentarz 4 marca 2017 przez koczurekk Gaduła (3,420 p.)

W tej sytuacji nie ma szans na przepełnienie stosu, dupiate uzasadnienie. A są dwa dużo gorsze powody:

  • Wywołanie ręcznie main jest niezgodne ze standardem C++.
  • Fatalna czytelność.
komentarz 4 marca 2017 przez tangarr Mędrzec (154,860 p.)
#include <iostream>

unsigned long long x = 0;

int main()
{
    int zmienna = x++;
    main();
    return zmienna;
}

Uruchom ten program i powiedz czy mi czy przepełniłeś stos czy nie.

komentarz 4 marca 2017 przez koczurekk Gaduła (3,420 p.)
  1. Wstawiłeś błędny kod, więc nie mam się co bawić w jego kompilację.
  2. Nie widzisz drobnej różnicy między tym co wstawiłeś ty, a tym co zaprezentował @OP? Hint: jego kod nie wywołuje się w kółko bez interakcji ze strony użytkownika i dlatego można się tam nie przejmować tym, że stos trochę utyje.
0 głosów
odpowiedź 4 marca 2017 przez mokrowski Mędrzec (155,460 p.)

Jawnie łamiesz zasadę DRY (ang. Don't Repeat Yourself). Zwróć uwagę że "zwrotka"

    int x,z;
    cout<<"Podaj liczbe: ";
    cin>>x;
    cout <<"Podaj kolejna: ";
    cin>> z;

Powtarza Ci się wielokrotnie. To należy wydzielić do funkcji.

komentarz 4 marca 2017 przez PirchHD Obywatel (1,730 p.)

rozumiem o co ci chodzi lecz gdy daję " int x,z; " w main() to mi kompilator pokazuję błąd...

||=== Build file: "no target" in "no project" (compiler: unknown) ===|
C:\Users\prosz\Desktop\Kalkulator\main.cpp||In function 'void funkcja_dodawanie()':|
C:\Users\prosz\Desktop\Kalkulator\main.cpp|19|error: 'x' was not declared in this scope|
C:\Users\prosz\Desktop\Kalkulator\main.cpp|21|error: 'z' was not declared in this scope|
C:\Users\prosz\Desktop\Kalkulator\main.cpp||In function 'void funkcja_odejmowanie()':|
C:\Users\prosz\Desktop\Kalkulator\main.cpp|31|error: 'x' was not declared in this scope|
C:\Users\prosz\Desktop\Kalkulator\main.cpp|33|error: 'z' was not declared in this scope|
C:\Users\prosz\Desktop\Kalkulator\main.cpp||In function 'void funkcja_mnozenie()':|
C:\Users\prosz\Desktop\Kalkulator\main.cpp|41|error: 'x' was not declared in this scope|
C:\Users\prosz\Desktop\Kalkulator\main.cpp|43|error: 'z' was not declared in this scope|
C:\Users\prosz\Desktop\Kalkulator\main.cpp||In function 'void funkcja_dzielenie()':|
C:\Users\prosz\Desktop\Kalkulator\main.cpp|52|error: 'x' was not declared in this scope|
C:\Users\prosz\Desktop\Kalkulator\main.cpp|54|error: 'z' was not declared in this scope|
||=== Build failed: 8 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

i dlatego zostawiłem to tak jak jest... :/

komentarz 4 marca 2017 przez PirchHD Obywatel (1,730 p.)
dobra naprawiłem.... dzięki wielkie..
0 głosów
odpowiedź 4 marca 2017 przez Piter10p Bywalec (2,750 p.)
edycja 4 marca 2017 przez Piter10p
Ten kawałek kodu mógłbyś wrzucić do oddzielnej funkcji
cout<<"Podaj liczbe: ";
cin>>x;
cout <<"Podaj kolejna: ";
cin>> z;

I Mako Boska, co to jest?

case 4:
    funkcja_dzielenie();
    main();
    break;

W życiu bym na coś takiego nie wpadł xD

Co prawda pamięci tym nie zapełnisz ale... To zły pomysł. Lepiej wpakować cały kod do pętli niż wywoływać tu main.

Poza tym pomyślał bym nad inną mechaniką liczenia. Inty nie mają zbyt dużej pojemności.

Pozdrawiam ;)

komentarz 5 marca 2017 przez PirchHD Obywatel (1,730 p.)
Mam zamiar  zmienić na long long int albo long double... a to z main dałem już do pętli haha xD
0 głosów
odpowiedź 5 marca 2017 przez Mixxy3k Użytkownik (730 p.)
Pomijając błędy pokazane przez poprzedników przed rozbudowaniem polecam wpierw napisać kalkulator który nie ma do wyboru 1. + 2. -  itd. (Wyobraź sobie że mając 40*6 + 20 - 1 / 2 nie chciało by mi się wywoływać 4 razy funkcji + zapamiętać dawny wynik). Napisz najpierw kalkulator który prosi o podanie działania za pomocą wyrażenia cin >> (z klawiatury ) 20*6+20/2 w ten sposób oszczędzisz ludu i sobie męki przy wpisywaniu + będziesz się nieźle bawić przy kodowaniu, potem dopiero myśl na logarytmami itd gl&hf ;3
Sorcia za tak wielki chaos w poście w końcu kto o 1 w nocy myśli nad składnią xd.
komentarz 5 marca 2017 przez PirchHD Obywatel (1,730 p.)
Szczerze miałem taki pomysł ale musze się zastanowić jak to zrobić.... może niech wynik zapisuje do innego int...
komentarz 5 marca 2017 przez Mixxy3k Użytkownik (730 p.)
Int - całkowita liczba z przedziału
Gdy użytkownik pomnoży 3.4 * 2.1 dostanie wynik dla 3*2 więc widzisz polecam pozanać inne typy zmiennych w C++

[Tu masz informacje o zmiennych w C++]
http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Pojecie-zmiennej-i-podstawowe-typy-danych/11

Podobne pytania

0 głosów
4 odpowiedzi 925 wizyt
pytanie zadane 22 września 2016 w C i C++ przez somix12 Nowicjusz (190 p.)
0 głosów
1 odpowiedź 386 wizyt
pytanie zadane 10 września 2018 w C i C++ przez Archeon Początkujący (480 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 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!

...