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

Podstawy. Przeliczanie wzrostu.

+1 głos
461 wizyt
pytanie zadane 13 stycznia 2019 w C i C++ przez moringnewbie Nowicjusz (180 p.)

Witam.

Proszę o opinię na temat rozwiązania ćwiczenia. Dopiero zacząłem książkę i kurs Pana M. Zelenta.

Ćwiczenie pochodzi z książki S. Prata "Język C++ Szkoła programowania".

Napisz krótki program, który poprosi o podanie wzrostu w centymetrach, a następnie przekonwertuj ten wzrost na stopy i cale. Niech program za pomocą podkreślenia odróżnia rodzaj odpowiedzi (?). Użyj stałej symbolicznej const, aby zapisać współczynnik konwersji.

#include <iostream>

using namespace std;    //jestem leniem, napisze raz.

const float STOPA=30.48;
const float CAL=2.54;

int podanieWzrostu();
float naStopy(float);
float naCale(float);

int main()
{
    float wzrost=podanieWzrostu();
    cout<<wzrost<<"cm to "<<naStopy(wzrost)<<" stop lub "<<naCale(wzrost)<<" cali.\n";

return 0;
}

int podanieWzrostu()
{
    int podany;
    cout<<"Podaj wzrost w cm: ";
    cin>>podany;
    return podany;
}

float naStopy(float wzrostCm)
{
    return wzrostCm/STOPA;
}

float naCale(float wzrostCm)
{
    return wzrostCm/CAL;
}

 

1. Czy jest sens na początku trochę "na siłę" pisać osobne funkcje do większości obliczeń? Równie dobrze mógłbym wszystko napisać w funkcji main. Wydaje mi się jednak, że w dalszym etapie nauki korzystniejsze jest trzymania porządku w int main()...?

2. Czy w w/w kodzie nie lepiej byłoby dopisać kolejną funkcję, która wypisywała by wyniki zamiast klepać 

 cout<<wzrost<<"cm to "<<naStopy(wzrost)<<" stop lub "<<naCale(wzrost)<<" cali.\n";

 w głównej funkcji?

3. Czego unikać, co jest ok i co poprawić? :)

 

Pozdrawiam, 

Nowicjusz.

komentarz 13 stycznia 2019 przez MikDal Mądrala (5,180 p.)
Pamiętaj, jeśli uzyskałeś odpowiedź – zaznacz ją. Jeśli nie: to pytaj dalej :).

3 odpowiedzi

+1 głos
odpowiedź 24 września 2020 przez Whiskey_Taster Stary wyjadacz (11,690 p.)
Aktualnie tak się składa, że również przerabiam ową książkę, jednakże jestem ciut dalej niż Ty. Dlatego też moja rada brzmi tak, by nie wprowadzać żadnej kontroli błędów na ten moment, a po prostu pójść dalej z materiałem. Dlaczego? Ponieważ dalej jest odrobina materiału z kontrolą błędów, gdzieś w okolicach rozdziału 5 czy tam 6 i tam będziesz miał wyjaśnione ładnie jak sobie radzić w sytuacji, gdy na przykład użytkownik poda literę zamiast liczby.
0 głosów
odpowiedź 13 stycznia 2019 przez MikDal Mądrala (5,180 p.)
edycja 13 stycznia 2019 przez MikDal

Bardzo ładnie - podział na funkcje jest bardzo ważny. Pozwala on utrzymać porządek, co sam zauważyłeś.  Pozwala to również, co jeszcze ważniejsze) , na bardzo szybkie zrozumienie kodu, a to właśnie czytelność i zreozumienie decydują w dużej mierze o jakości oprogramowania w czasie.

Czy warto tworzyć osobna funkcje dla jednej linijki? W tym przypadku akurat nie. Jednak gdyby było to skomplikowane wyrażenie: wtedy warto.

Generalnie według mnie można by poprawić głównie nazwy: z polskich na angielskie oraz dodawać więcej odstępów między znakami takimi jak <<, = itp. Jeśli chcesz się zagłębić dalej to polecam książkę Czysty kod. Podręcznik dobrego programisty autorstwa Roberta C. Martina.


W celu jakiegoś samorozwoju możesz jeszcze zainteresować się obsługa błędów, bo co gdy ktoś poda Ci litery zamiast cyfr? Jakiś wstęp znajdziesz tutaj: http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Obsluga-strumienia-wejsciowego/12, https://stackoverflow.com/a/1283318.

Edycja 1. Dodanie propozycji ksiażki Czysty Kod oraz linków do obsługi błędów w funkcji cin.

komentarz 13 stycznia 2019 przez moringnewbie Nowicjusz (180 p.)

Dziękuję za odpowiedź.

Co do odstępów - zauważyłem przeglądając poważniejsze kody, że u mnie jest za ciasno - mniej czytelnie. Poprawię to jak najszybciej, żeby się przyzwyczaić do poprawnego pisania.

Od teraz nazwy zmiennych również będę zapisywał po angielsku.

Temat kontroli błędów jest mi jeszcze trochę obcy. Czasami próbuje zabezpieczyć kilkoma if'ami na ile potrawię w tej chwili, ale nie wygląda to dobrze. Znam tylko poniższy przykład console errors z kursów Pana Zelenta, który w sumie mogłem zapisać w kodzie w ten sposób:

if(!(cin>>podany))
    {
        cerr<<"To nie jest liczba. Program zostanie zamkniety.";
        exit(0);
    }

Rozwinę temat. ;)

Dziękuję!

komentarz 13 stycznia 2019 przez MikDal Mądrala (5,180 p.)

Zmodyfikowałem trochę swoją odpowiedź. Kontrola błędów nierzadko jest ważniejsza niż sam program. Nie ma nic bardziej nieprofesjonalnego niż zamykający się znienacka program który nie pozwoli nawet zapisać swoich postępów. Osobiście uważam, że warto zajmować się obsługą błędów od razu jak pisze się kod zgodnie z powiedzeniem lepiej zapobiegać niż leczyć.

Skoro dopiero zaczynasz przygodę z C++ to jako trudniejsze  zadanie możesz zrobić metodę, która będzie pobierać dane z konsoli i od razu je weryfikować najlepiej z wykorzystaniem wyjątków. To nie będzie proste, ale gdybyś pobierał więcej danych z konsoli to dzięki temu mógłbyś znacząco uprosić kod np. do czegoś takiego:

 
int main()
{
    try 
    {
        float wzrost = podanieWzrostu();
        cout << wzrost << "cm to " << naStopy(wzrost) << " stop lub " << naCale(wzrost) << " cali.\n";
    } catch(ConsoleInputError err) 
    {
        cerr << "Podano nieprawidlowa wartosc. Program zostanie zamkniety";
        exit(1);
    }
 
    return 0;
}
 
int podanieWzrostu()
{
    int podany;
    cout<<"Podaj wzrost w cm: ";
    getFromConsole(&podany);
    return podany;
}

Ale to co wyżej proponuje jest mocno na wyrost w programie, który zaprezentowałeś. Miałoby to sens przy większej ilości pobieranych danych od użytkownika przez konsolę.

komentarz 13 stycznia 2019 przez moringnewbie Nowicjusz (180 p.)
Bardzo, bardzo dziękuję za merytoryczną odpowiedź... i w takim razie biorę się za lekturę ;)

Pozdrawiam!
0 głosów
odpowiedź 24 września 2020 przez AizoOz Początkujący (490 p.)

Też przerabiam książkę i jak zobaczyłem Twój kod z funkcjami to poczułem się jak tuman ....

Mam pytanie do tego ćwiczenia więc się podepnę do tematu :)

Mój kod :

 

#include <iostream>



int main()

{

    using namespace std;

    int wzrost;

    const int cale = 2.54;

    const int stopy = 30.48;

    

    cout << "Podaj wzrost w centymetrach : ";

    cin >> wzrost;

    cout << "Twoj wzrost " << wzrost << " cm, to " << wzrost / stopy << " stop i " << wzrost % cale << " cali\n";

    

    return 0;

}

No i gdy wpiszę 187cm , to otrzymuję wynik :

"Twoj wzrost 187 cm, to 6 stop i 1 cali"   

No i tu mam pytanie : co mogę zmienić aby ten 1 cal który mi wyświetla pokazało mi z dziesiętną końcówką ? bo przy tej zamianie wychodzi że jestem trochę niższy niż 187 :) Próbowałem const cale dać w float, ale przy działaniu z modulo tak się chyba nie da.

komentarz 24 września 2020 przez tangarr VIP (136,860 p.)

Użycie typu int dla stałych cale i stopy powoduje obcięcie ich wartości (cale=2, stopy=30). Tego nie chcemy. Użyj typu zmiennoprzecinkowego.

Aby wyświetlić prawidłowy wynik wykonaj następujące obliczenia:

const float cale = 2.54;

float wzrost_cm = ...
float wzrost_cale = wzrost_cm / cale;
int wzrost_stopy = wzrost_cale / 12; // celowo obcinamy część dziesiętną
wzrost_cale -= wzrost_stopy * 12; //  odejmujemy pełne stopy od cali

cout << wzrost_cm << "cm to " << wzrost_stopy << "ft << wzrost_cale << "in" << endl;

 

komentarz 25 września 2020 przez VBService VIP (136,750 p.)

Podobne pytania

0 głosów
3 odpowiedzi 166 wizyt
pytanie zadane 21 lipca 2017 w Offtop przez chucksqll Stary wyjadacz (12,930 p.)
0 głosów
1 odpowiedź 1,539 wizyt
0 głosów
3 odpowiedzi 1,712 wizyt
Porady nie od parady
Zadając pytanie postaraj się o odpowiedni tytuł, kategorię oraz tagi.Tagi

85,698 zapytań

134,499 odpowiedzi

298,514 komentarzy

56,625 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...