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

c++ zadanie, Objetosc beczki

Object Storage Arubacloud
0 głosów
448 wizyt
pytanie zadane 15 stycznia 2018 w C i C++ przez Rizenek Nowicjusz (220 p.)

Ćwiczenie 1.4 – „Kelner”
Pobieranie danych liczbowych z klawiatury, konwersja napisów na liczby, wykonywanie obliczeń
Użytkownik podaje wymiary beczki z winem (promień podstawy i wysokość), oraz pojemność jednego kieliszka. Napisz program obliczający, ile kieliszków uda się napełnić winem z takiej beczki.
 

Problem polega na tym, że chce żeby wymiary beczki podawać w cm, potem chciałem żeby pokazało objetosc beczki w litrach, kieliszka w ml, i calosc wyliczyć, tylko gdzieś ciągle gubię się z jednostami, proszę o pomoc :)



#include <iostream>
#include <cstdlib>
#include <math.h>
#include <iomanip>                              // setprecision
using namespace std;

float r,h;
int objetosc_beczki, objetosc_kieliszka;
int wybor;                                      // opcja w menu do wyboru tak, nie
int obliczenia;                                 // oblicza ile kieliszkow miesci sie w beczce
int main()

{

    cout << "Podaj promien podstawy beczki (w cm): ";
    label_name:
    cin >> r;
                if (r==0)
                {
                cout << "Podano bledna wartosc promienia, podaj prawidlowa: "<<endl;
                goto label_name ;
                };
    cout << "Podaj wysokosc beczki (w cm): ";
    label_name1:
    cin >> h;
                if(h==0)
                {
                cout << "Podano bledna wartosc wysokosci beczki, podaj prawidlowa: " <<endl;
                goto label_name1;
                };
    objetosc_beczki = ((M_PI * r *r)*h);
    cout << "Objetosc beczki o promieniu podstawy: " <<r << "cm" <<" i wysokosci: " <<h << "cm";
    cout << " wynosi " << setprecision(2) << (objetosc_beczki/1000) << " litrow" <<endl <<endl;

    cout << "Podaj pojemnosc kieliszka (w ml):  ";
    label_name3:
    cin >> objetosc_kieliszka;
                if(objetosc_kieliszka=0)

                {
                    cout << "Podano bledna pojemnosc kieliszka, podaj prawidlowa: ";
                    goto label_name3;
                };

    cout << "Wybrales kieliszek o pojemnosci: " << objetosc_kieliszka << "ml";

    cout << "Czy chcesz sprawdzic ile kieliszkow mozesz napelnic z tej beczki? " << endl;
    cout << "1. Tak" << endl;
    cout << "2. Nie" << endl;
label_name2:
    cin >> wybor;
        obliczenia = ((objetosc_beczki/1000)/(objetosc_kieliszka));

        if(wybor==1)
        {
        cout << "Z tej beczki mozesz napelnic:    " << obliczenia << "kieliszkow o pojemnosci: " <<objetosc_kieliszka << "."<<endl;
        goto label_name2;
        }
            else if(wybor==2)
            {
            cout << "To juz wszystko, milego dnia";
            return 0;
            }
            if(wybor!=1 && wybor!=2)
               {
               cout << "Nacisnieto zly klawisz, sprobuj ponownie";
               goto label_name2;
               };







    return 0;
}

 

komentarz 15 stycznia 2018 przez Rizenek Nowicjusz (220 p.)
edycja 16 stycznia 2018 przez Rizenek
Wyszlo mi takie coś, wygląda dużo lepiej, coś jeszcze zmienić? Program nie zawiesza mi się przy błędnych wartościach.

#include <iostream>
#include <cstdlib>
#include <cmath>
#include <iomanip>                              // setprecision
using namespace std;

float r,h;
int objetosc_beczki, objetosc_kieliszka;
int wybor;                                      // opcja w menu do wyboru tak, nie
int obliczenia;                                 // oblicza ile kieliszkow miesci sie w beczce
int main()
{

    cout << "Podaj promien podstawy beczki (w cm): ";
                while( cin >> r, r==0 )
                {
                cout << "Podano bledna wartosc promienia, podaj prawidlowa: "<<endl;
                cin.clear();
                cin.sync();
                };
    cout << "Podaj wysokosc beczki (w cm): ";
                while( cin >>h, h==0 )
                {
                cout << "Podano bledna wartosc wysokosci beczki, podaj prawidlowa: " <<endl;
                cin.clear();
                cin.sync();
                };
    objetosc_beczki = ((M_PI * r *r)*h);
    cout << "Objetosc beczki o promieniu podstawy: " <<r << "cm" <<" i wysokosci: " <<h << "cm";
    cout << " wynosi " << setprecision(2) << (objetosc_beczki/1000) << " litrow" <<endl <<endl;

    cout << "Podaj pojemnosc kieliszka (w ml):  ";

                while(cin >> objetosc_kieliszka, objetosc_kieliszka==0 )
                {
                cout << "Podano bledna pojemnosc kieliszka, podaj prawidlowa: ";
                cin.clear();
                cin.sync();
                };
    cout << "Wybrales kieliszek o pojemnosci: ";
    cout << objetosc_kieliszka << "ml" <<endl <<endl;

    cout << "Czy chcesz sprawdzic ile kieliszkow mozesz napelnic z tej beczki? " << endl;
    cout << "1. Tak" << endl;
    cout << "2. Nie" << endl;

        if(cin >> wybor, wybor==1)
        {
        obliczenia = (objetosc_beczki / objetosc_kieliszka);
        cout << "Z tej beczki mozesz napelnic: ";
        cout << obliczenia;
        cout << "kieliszkow o pojemnosci: ";
        cout << objetosc_kieliszka << "."<<endl;
        }
            else if(wybor==2)
            {
            cout << "To juz wszystko, milego dnia";
            return 0;
            }
            else if(wybor!=1 && wybor!=2)
               {
               cout << "Nacisnieto zly klawisz, sprobuj ponownie";
                cin.clear();
                cin.sync();
               };

    return 0;
}

 

komentarz 15 stycznia 2018 przez Sebastian Fojcik Nałogowiec (43,020 p.)

A cóż to za obrzydliwe goto? Używanie tej instrukcji świadczy o tym, że jest się bardzo złym programistą. Jak się nie oduczysz szybko tego stosować, to będziesz stracony. Wszystkie goto powinieneś zastąpić odpowiednią pętlą, np. taki kod:

label_name:
cin >> r;
if (r==0)
{
    cout << "Podano bledna wartosc promienia, podaj prawidlowa: "<<endl;
    goto label_name ;
};

Powinieneś kategorycznie zastąpić takim:

cin >> r;
while( r == 0 )
{
    cout << "Podano bledna wartosc promienia, podaj prawidlowa: "<<endl;
    // (1) czyszczenie bufora i naprawa strumienia

    cin >> r;
}

Gdzie w miejscu (1) powinieneś naprawić strumień cin, bo jeśli ktoś jako promień poda napis, to wtedy program się zepsuje na amen ;-)

1
komentarz 15 stycznia 2018 przez niezalogowany

cin można jeszcze wrzucić do warunku pętli ;)

while (cin >> r, r == 0)
{
	cout << "Podano bledna wartosc promienia, podaj prawidlowa: " << endl;
	// (1) czyszczenie bufora i naprawa strumienia
}
komentarz 16 stycznia 2018 przez Rizenek Nowicjusz (220 p.)
wielkie dzieki, poprawiłem swój program, dopiero zaczynam, ucze sie samodzielnie, także muszę jakoś do wszystkiego dojśc :)
komentarz 17 stycznia 2018 przez Sebastian Fojcik Nałogowiec (43,020 p.)

@NieUmiemProgramowac, świetna sugestia, dzięki :-)

Gwoli ścisłości wyjaśnię jak jest sprawdzany taki warunek, gdy w nawiasie mamy jakieś wyrażenia po przecinku. Otóż wyrażenie skrajnie na prawo będzie wartością całego nawiasu (od niego zależy czy warunek if się spełni), reszta wyrażeń oddzielonych przecinkami nie ma wpływu na warunek if-a, ale jak pokazał kolega nieumiejący programować (ciekawy nick), ma to też swoje zastosowanie. W tym przypadku pozbyliśmy się redundancji w kodzie smiley

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 962 wizyt
pytanie zadane 20 września 2019 w C i C++ przez KamilKerry Początkujący (390 p.)
0 głosów
1 odpowiedź 714 wizyt
pytanie zadane 31 stycznia 2019 w C i C++ przez gorgonkowa Obywatel (1,810 p.)
+1 głos
1 odpowiedź 1,634 wizyt
pytanie zadane 26 marca 2017 w C i C++ przez kakola3 Początkujący (270 p.)

92,555 zapytań

141,402 odpowiedzi

319,540 komentarzy

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

...