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

Ocena mojego programu

Object Storage Arubacloud
0 głosów
712 wizyt
pytanie zadane 23 grudnia 2019 w C i C++ przez _Kuba_ Początkujący (250 p.)

Witam, niedawno zacząłem programować w moim pierwszym języku czyli C++. Aktualnie jestem na 6 odc. kursu C++ na kanale "Pasja Informatyki".

Ostatnio stworzyłem dwa programy, jeden to kalkulator, drugi oblicza objętości figur. Postanowiłem połączyć go w jeden. Poniżej wklejam efekty mojej pracy. Prawdopodobnie złapiecie się za głowę, bo ma mnóstwo błędów, na które starsi programiści by sobie nie pozwolili. Proszę o opinię oraz co mógłbym zmienić. W przyszłości chciałbym dodać tu jeszcze więcej programów np. Obliczanie pola itp.

#include <iostream>
#include <conio.h>
#include <math.h>
#include <ostream>
#include <cmath>

void kalkulator()
{
    system("cls");

    int choice;
    float a, b;

    std::cout << "   MENU GLOWNE\n";
    std::cout << "-----------------\n";
    std::cout << "1. Dodawanie\n";
    std::cout << "2. Odejmowanie\n";
    std::cout << "3. Mnozenie\n";
    std::cout << "4. Dzielenie\n";
    std::cout << "5. Pierwiastkowanie\n";
    std::cout << "6. Potegowanie\n";
    std::cout << "\nCo wybierasz[0-6]? ";

    choice = getch();

    switch (choice) {
    case '1':
        system("cls");
        std::cout << "======[Dodawanie]======\n\n";
        std::cout << "Podaj 1 liczbe: ";
        std::cin >> a;
        std::cout << "Podaj 2 liczbe: ";
        std::cin >> b;
        std::cout << "===================\n";
        std::cout << "\n      Suma: " << a + b;
        std::cin.ignore();
        getchar();
        system("cls");
        break;

    case '2':
        system("cls");
        std::cout << "======[Odejmowanie]======\n\n";
        std::cout << "Podaj 1 liczbe: ";
        std::cin >> a;
        std::cout << "Podaj 2 liczbe: ";
        std::cin >> b;
        std::cout << "===================\n";
        std::cout << "\n    Roznica: " << a - b;
        std::cin.ignore();
        getchar();
        system("cls");
        break;

    case '3':
        system("cls");
        std::cout << "======[Mnozenie]======\n\n";
        std::cout << "Podaj 1 liczbe: ";
        std::cin >> a;
        std::cout << "Podaj 2 liczbe: ";
        std::cin >> b;
        std::cout << "===================\n";
        std::cout << "\n   Iloczyn: " << a * b;
        std::cin.ignore();
        getchar();
        system("cls");
        break;

    case '4':
        system("cls");
        std::cout << "======[Dzielenie]======\n\n";
        std::cout << "Podaj 1 liczbe: ";
        std::cin >> a;
        std::cout << "Podaj 2 liczbe: ";
        std::cin >> b;
        std::cout << "\n   Iloraz: " << a / b;
        std::cin.ignore();
        getchar();
        system("cls");
        break;

    case '5':
        system("cls");
        std::cout << "======[Pierwiastkowanie]======\n\n";
        std::cout << "Podaj stopien pierwiastka: ";
        std::cin >> b;
        std::cout << "Podaj liczbe ktora bedzie pierwiastkowana: ";
        std::cin >> a;
        std::cout << "===================\n";
        std::cout << "Wynik wynosi: " << pow(a, (1 / b));
        std::cin.ignore();
        getchar();
        system("cls");
        break;

    case '6':
        system("cls");
        std::cout << "======[Potegowanie]======\n\n";
        std::cout << "Podaj liczbe ktora bedzie potegowana: ";
        std::cin >> a;
        std::cout << "Podaj potege: ";
        std::cin >> b;
        std::cout << "===================\n";
        std::cout << "Wynik wynosi: " << pow(a, b);
        std::cin.ignore();
        getchar();
        system("cls");
        break;
    }
}

void v_figur()
{
    int wybor;
    float pp, h, r;
    system("cls");

    std::cout << "       MENU GlOWNE\n";
    std::cout << "--------------------------\n";
    std::cout << "1. V czworoscianu foremnego\n";
    std::cout << "2. V ostroslupa czworokatnego\n";
    std::cout << "3. V ostroslupa prawidlowego czworokatnego\n";
    std::cout << "4. V szescianu\n";
    std::cout << "5. V graniastoslupa trojkatnego\n";
    std::cout << "6. V graniastoslupa prawidlowego pieciokatnego\n";
    std::cout << "7. V walca\n";
    std::cout << "8. V stozka\n";
    std::cout << "9. V kuli\n\n";
    std::cout << "Co wybierasz?[0-9]: ";

    wybor = getch();

    switch (wybor) {
    case '1':
        system("cls");
        std::cout << "======[Objetosc czworoscianu foremnego]======\n\n";
        std::cout << "Podaj pole podstawy pp= ";
        std::cin >> pp;

        std::cout << "Podaj wysokosc h= ";
        std::cin >> h;
        std::cout << "==========================================\n";
        std::cout << "Objetosc czworoscianu foremnego V= " << 0.33 * pp * h;
        std::cin.ignore();
        getchar();
        system("cls");
        break;

    case '2':
        system("cls");
        std::cout << "======[Objetosc ostroslupa czworokatnego]======\n\n";

        std::cout << "Podaj pole podstawy pp= ";
        std::cin >> pp;

        std::cout << "Podaj wysokosc h= ";
        std::cin >> h;
        std::cout << "==========================================\n";
        std::cout << "Objetosc ostroslupa czworokatnego V= " << 0.33 * pp * h;
        std::cin.ignore();
        getchar();
        system("cls");

        break;

    case '3':
        system("cls");
        std::cout << "======[Objetosc ostroslupa prawidlowego czworokatnego]======\n\n";

        std::cout << "Podaj pole podstawy pp= ";
        std::cin >> pp;

        std::cout << "Podaj wysokosc h= ";
        std::cin >> h;
        std::cout << "==========================================\n";
        std::cout << "Objetosc ostroslupa prawidlowego czworokatnego V= " << 0.33 * pp * h;
        std::cin.ignore();
        getchar();
        system("cls");
        break;

    case '4':
    	system("cls");
        std::cout << "======[Objetosc szescianu]======\n\n";

        std::cout << "Podaj pole podstawy pp= ";
        std::cin >> pp;

        std::cout << "Podaj wysokosc h= ";
        std::cin >> h;
        std::cout << "==========================================\n";
        std::cout << "Objetosc szescianu V= " << pp * h;
        std::cin.ignore();
        getchar();
        system("cls");
        break;

    case '5':
        system("cls");
		std::cout << "======[Objetosc graniastoslupa trojkatnego]======\n\n";

        std::cout << "Podaj pole podstawy pp= ";
        std::cin >> pp;

        std::cout << "Podaj wysokosc h= ";
        std::cin >> h;
        std::cout << "==========================================\n";
        std::cout << "Objetosc graniastoslupa trojkatnego V= " << pp * h;
        std::cin.ignore();
        getchar();
        system("cls");
        break;

    case '6':
    	system("cls");
        std::cout << "======[Objetosc graniastoslupa prawidlowego pieciokatnego]======\n\n";

        std::cout << "Podaj pole podstawy pp= ";
        std::cin >> pp;

        std::cout << "Podaj wysokosc h= ";
        std::cin >> h;
        std::cout << "==========================================\n";
        std::cout << "Objetosc graniastoslupa prawidlowego pieciokatnego V= " << pp * h;
        std::cin.ignore();
        getchar();
        system("cls");
        break;

    case '7':
        system("cls");
		std::cout << "======[Objetosc walca]======\n\n";

        std::cout << "Podaj pole podstawy pp= ";
        std::cin >> pp;

        std::cout << "Podaj wysokosc h= ";
        std::cin >> h;
        std::cout << "==========================================\n";
        std::cout << "Objetosc walca V= " << pp * h;
        std::cin.ignore();
        getchar();
        system("cls");
        break;

    case '8':
        system("cls");
		std::cout << "======[Objetosc stozka]======\n\n";

        std::cout << "Podaj pole podstawy pp= ";
        std::cin >> pp;

        std::cout << "Podaj wysokosc h= ";
        std::cin >> h;
        std::cout << "==========================================\n";
        std::cout << "Objetosc stozka V= " << 0.33 * pp * h;
        std::cin.ignore();
        getchar();
        system("cls");
        break;

    case '9':
        system("cls");
		std::cout << "======[Objetosc kuli]======\n\n";

        std::cout << "Podaj promien r= ";
        std::cin >> r;
        std::cout << "==========================================\n";
        std::cout << "Objetosc kuli wynosi V= " << 4 / 3 * M_PI * r * r * r;
        std::cin.ignore();
        getchar();
        system("cls");
        break;
    default:
        std::cout << "\n\nNie ma takiej opcji w Menu Glownym :(";
        getchar();
        system("cls");
    }
}

int main()
{
    int wybor;
    system("cls");
    std::cout << "Autor: Jakub Jagodzinski\n\n";

    do {
        std::cout << "    MENU GLOWNE\n";
        std::cout << "===================\n";
        std::cout << "0. Zamknij\n";
        std::cout << "1. Kalkulator\n";
        std::cout << "2. Obliczanie V Figur\n";
        std::cout << "====================\n";
        std::cout << "Co wybierasz [0-2]? ";

        wybor = getch();

        switch (wybor) {
        case '0':
            exit(0);
            break;

        case '1':
            kalkulator();
            break;

        case '2':
            v_figur();
            break;
        }
    } while (wybor != 0);
}

 

komentarz 23 grudnia 2019 przez adrian17 Ekspert (344,860 p.)

Proszę o opinię oraz co mógłbym zmienić

Nie używaj exit(0). Na dłuższą metę to doprowadzi do możliwych nieoczekiwanych problemów.

W Twoim przypadku tak naprawdę wystarczy usunąć tą linię i poprawić warunek końca pętli `wybor != 0`.

komentarz 23 grudnia 2019 przez _Kuba_ Początkujący (250 p.)
Czyli po prostu usunąć case '0' oraz zmienić na while(wybor=0)?
komentarz 23 grudnia 2019 przez _Kuba_ Początkujący (250 p.)

@adrian17,

Coś mi nie działa, zamieniłem, że kod wygląda tak, lecz kiedy nacisnę '0', to program zamiast się zamknąć to wypisuję "Nie ma takiej opcji w MENU"

do {
        cout << "    MENU GLOWNE\n";
        cout << "===================\n";
        cout << "0. Zamknij\n";
        cout << "1. Kalkulator\n";
        cout << "2. Obliczanie V Figur\n";
        cout << "====================\n";
        cout << "Co wybierasz [0-2]? ";
		
        wybor = getch();

        switch (wybor) {
    
		case '1':
            kalkulator();
            break;

        case '2':
            v_figur();
            break;
            
        default: cout<<"\n\nNie ma takiej opcji w MENU"; getchar(); system("cls");    
        }
    } while (wybor = 0);
	
}

Oraz jeszcze chciałbym żeby program trwał do momentu kiedy użytkownik tego zechcę a u mnie kończy się po wydrukowaniu wyniku. Mam dać nieskończoną pętle for?

 

 

komentarz 23 grudnia 2019 przez tkz Nałogowiec (42,000 p.)
Popełniłeś te same błędy o których pisałem wcześniej. Dajesz ten sam kod, tej samej jakości. Czego oczekujesz?

2 odpowiedzi

0 głosów
odpowiedź 23 grudnia 2019 przez edwardkraweznik Dyskutant (9,930 p.)
Jest ok :D

w mainie możnaby wstawić return 0;

i chyba już czas na obiekty :)

Powodzenia.
3
komentarz 23 grudnia 2019 przez tkz Nałogowiec (42,000 p.)

w mainie możnaby wstawić return 0;

Poco? 

komentarz 23 grudnia 2019 przez edwardkraweznik Dyskutant (9,930 p.)
0 = wszytko ok, a coś innego niż 0 oznacza błąd
komentarz 23 grudnia 2019 przez wsnofi Bywalec (2,680 p.)
Od kiedy inna zwracana wartosc niz false to błąd?
komentarz 23 grudnia 2019 przez edwardkraweznik Dyskutant (9,930 p.)
edycja 23 grudnia 2019 przez edwardkraweznik

źle się wyraziłem, program powinien kończyć się zwracając 0, a programując mamy możliwość napisania sobie jakiejś obsługi błędów i zakończyć program z błędem który zwraca coś innego niż 0. aplikacje konsolowe mogą zwracać cokolwiek.

przykładowo w systemie linux "wc -l" zwraca ilość linii a nie błąd.

http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Podstawy-programowania-w-C++/7

powyżej przykład

i mająć:

int main()
{
    int wybor;
    system("cls");
    std::cout << "Autor: Jakub Jagodzinski\n\n";
 
    do {
        std::cout << "    MENU GLOWNE\n";
        std::cout << "===================\n";
        std::cout << "0. Zamknij\n";
        std::cout << "1. Kalkulator\n";
        std::cout << "2. Obliczanie V Figur\n";
        std::cout << "====================\n";
        std::cout << "Co wybierasz [0-2]? ";
 
        wybor = getch();
 
        switch (wybor) {
        case '0':
            exit(0);
            break;
 
        case '1':
            kalkulator();
            break;
 
        case '2':
            v_figur();
            break;
        }
    } while (wybor != 0);
}

powinno być:

int main()
{
    int wybor;
    system("cls");
    std::cout << "Autor: Jakub Jagodzinski\n\n";
 
    do {
        std::cout << "    MENU GLOWNE\n";
        std::cout << "===================\n";
        std::cout << "0. Zamknij\n";
        std::cout << "1. Kalkulator\n";
        std::cout << "2. Obliczanie V Figur\n";
        std::cout << "====================\n";
        std::cout << "Co wybierasz [0-2]? ";
 
        wybor = getch();
 
        switch (wybor) {
        case '0':
           return 0;
            break;
 
        case '1':
            kalkulator();
            break;
 
        case '2':
            v_figur();
            break;
        }
    } while (wybor != 0);
}

ale owszem jestem świadom tego, że jeśli program ma coś zwracać to może to być return jakiśint; <--- lub cokolwiek innego

komentarz 23 grudnia 2019 przez tkz Nałogowiec (42,000 p.)

W przypadku C ++ return 0; zakłada się, że to

int main()
{
}

jest równe temu

int main()
{
    return 0;
}
komentarz 23 grudnia 2019 przez edwardkraweznik Dyskutant (9,930 p.)

czyli się pomyliłem i poniższy kod zadziała, sory w takim razie.

int main()
{
    int wybor;
    system("cls");
    std::cout << "Autor: Jakub Jagodzinski\n\n";
 
    do {
        std::cout << "    MENU GLOWNE\n";
        std::cout << "===================\n";
        std::cout << "0. Zamknij\n";
        std::cout << "1. Kalkulator\n";
        std::cout << "2. Obliczanie V Figur\n";
        std::cout << "====================\n";
        std::cout << "Co wybierasz [0-2]? ";
 
        wybor = getch();
 
        switch (wybor) {
        case '0':
           //return 0; <--- zakomentowane bo zadziała program
            break;
 
        case '1':
            kalkulator();
            break;
 
        case '2':
            v_figur();
            break;
        }
    } while (wybor != 0);
}

 

komentarz 24 grudnia 2019 przez edwardkraweznik Dyskutant (9,930 p.)

napisałem sobie na szybko prosty programik... nie byłem pewien czy mam rację czy jej nie mam. i okazuje się, że gdy zakomentujemy return, program działa w nieskończonej pętli. a return umożliwia nam wyjście z takiego programu.

tkz i wsnofi jesteście 2 buce i dowartościowujecie się kosztem innych i jeszcze nie macie racji. tragedia, zamiast pokierować Kolegę to wy takie jajca se robicie. Gdzie gość się postarał. Widać to w jego kodzie.

#include <iostream>

int main()
{
int a;
std::cout << "0..exit, 1..dupa: " << std::endl;

while ( std::cin >> a ) {

switch (a) {
        case 0:
           return 0;
//            std::cout << a << std::endl;
                break;

        case 1:
                std::cout << "dupa " << std::endl; 
            break;

                }
        }
}

 

komentarz 24 grudnia 2019 przez mokrowski Mędrzec (155,460 p.)

Nie "są buce" tylko standard języka C++ od dawna twierdzi że dopuszczalne jest nie zwracanie return 0 z funkcji main(...). I tylko z tej funkcji i tylko wtedy gdy "kończy się wszystko ok", możesz nie zwrócić wartości (wtedy automatycznie zwróci 0). Jeśli zgłaszasz błąd, oczywiście zwróć "nie zero". Dla systemów z rodziny Unix, obowiązuje  ogólna konwencja zwrócenia wartości z zakresu [0-127]. Wartości powyżej 128, sygnalizują zakończenie sygnałem, czyli jeśli np. w wyniku będzie 130, to program otrzymał sygnał o numerze 2. Tu masz trochę precyzyjniej: http://tldp.org/LDP/abs/html/exitcodes.html

Z kolei w kernelu GNU/Linux: https://www.kernel.org/doc/htmldocs/kernel-hacking/convention-returns.html

Proszę.. doczytaj zanim będziesz kogoś nazywał "bucem". Tym bardziej że to Ty zrobiłeś błąd komentując return i nie dając żadnego punktu wyjścia z programu. Wartość zwracana (czy brak return'a) nie miała tu nic do rzeczy.

Wyjątki ze standardu:

https://eel.is/c++draft/basic.start.main punkt 5 ale warto przeczytać całość...

Inną sprawą jest "return tu i tam w kodzie". To ogólnie zła praktyka... można dyskutować ale szereg standardów zabrania zwracania danych przez return w więcej niż 1 miejscu i/oraz na końcu funkcji (przykład MISRA) https://en.wikipedia.org/wiki/Return_statement sekcja "Multiple return statements"

0 głosów
odpowiedź 23 grudnia 2019 przez _Kuba_ Początkujący (250 p.)
A jest możliwość aby zrobić tak, żeby po wybraniu np. Opcji 1 czyli kalkulatora i wybraniu działania i po wydrukowaniu wyniku nadal być w kalkulatorze, a nie przechodzić znowu do menu?

Podobne pytania

0 głosów
1 odpowiedź 373 wizyt
pytanie zadane 20 grudnia 2019 w C i C++ przez _Kuba_ Początkujący (250 p.)
0 głosów
2 odpowiedzi 170 wizyt
+1 głos
1 odpowiedź 177 wizyt
pytanie zadane 20 grudnia 2019 w Nasze projekty przez xFanti Obywatel (1,350 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

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

...