program działa, pyt o czytelność kodu
Ostatnio zmodyfikowano 2016-12-31 14:47
mikewazowski Temat założony przez niniejszego użytkownika |
program działa, pyt o czytelność kodu » 2016-12-30 23:39:06 zaczynam naukę c++, nie chcę utrwalać złych praktyk, stąd moje pytanie - czy mój kod jest czytelny, czy są w nim jakieś rażące błędy? ( jest to kalkulator temperatur z zabezpieczeniem przed przeliczaniem zera bezwzglednego ) #include <iostream> using namespace std;
float cel_na_fahr( float x ) { return( x *( 9.0 / 5.0 ) ) + 32; } float fahr_na_cel( float x ) { return( 5.0 / 9.0 ) *( x - 32 ); } float cel_na_kel( float x ) { return x + 273.15; } float kel_na_cel( float x ) { return x - 273.15; } float kel_na_fah( float x ) { int przeliczone, wynik; przeliczone = kel_na_cel( x ); wynik = cel_na_fahr( przeliczone ); return wynik; } float fah_na_kel( float x ) { int przeliczone, wynik; przeliczone = fahr_na_cel( x ); wynik = cel_na_kel( przeliczone ); return wynik; }
void menu() { int wybor; float wartosc, wynik; do { cout << "menu" << endl; cout << "1-kelwiny na cel\n2-cel na kel\n3-fahr na cel\n4-cel na fah\n5-kel na fah\n6-fah na kel\ntwoj wybor: "; cin >> wybor; switch( wybor ) { case 1: cout << "kel na cel" << endl; cout << "podaj wartosc do przeliczenia: " << endl; cin >> wartosc; while( wartosc <= 0 ) { cout << "podaj wartosc wieksza niz zero bezwzgledne: "; cin >> wartosc; } wynik = kel_na_cel( wartosc ); cout << "w przeliczeniu: " << wynik << endl; break; case 2: cout << "cel na kel" << endl; cout << "podaj wartosc do przeliczenia: " << endl; cin >> wartosc; while( wartosc <- 270 ) { cout << "podaj wartosc wieksza niz zero bezwzgledne: "; cin >> wartosc; } wynik = cel_na_kel( wartosc ); cout << "w przeliczeniu: " << wynik << endl; break; case 3: cout << "fah na cel" << endl; cout << "podaj wartosc do przeliczenia: " << endl; cin >> wartosc; wynik = fahr_na_cel( wartosc ); cout << "w przeliczeniu: " << wynik << endl; break; case 4: cout << "cel na fah" << endl; cout << "podaj wartosc do przeliczenia: " << endl; cin >> wartosc; while( wartosc <- 270 ) { cout << "podaj wartosc wieksza niz zero bezwzgledne: "; cin >> wartosc; } wynik = cel_na_fahr( wartosc ); cout << "w przeliczeniu: " << wynik << endl; break; case 5: cout << "kel na fah" << endl; cout << "podaj wartosc do przeliczenia: " << endl; cin >> wartosc; while( wartosc <= 0 ) { cout << "podaj wartosc wieksza niz zero bezwzgledne: "; cin >> wartosc; } wynik = kel_na_fah( wartosc ); cout << "w przeliczeniu: " << wynik << endl; break; case 6: cout << "fah na kel" << endl; cout << "podaj wartosc do przeliczenia: " << endl; cin >> wartosc; wynik = fah_na_kel( wartosc ); cout << "w przeliczeniu: " << wynik << endl; break; } } while( wybor != 7 ); } int main() { menu(); return 0; }
|
|
mokrowski |
» 2016-12-31 00:45:33 Wzorów i obliczeń nie sprawdzałem. Ogólnie dobra robota :-) Małe uwagi umieściłem w kodzie. Jak będziesz bardziej zaawansowany, zapiszesz ten program inaczej :-) #include <iostream> #include <cstdlib>
using namespace std;
float cel_na_fahr( float x ) { return( x *( 9.0 / 5.0 ) ) + 32; }
float fahr_na_cel( float x ) { return( 5.0 / 9.0 ) *( x - 32 ); }
float cel_na_kel( float x ) { return x + 273.15; }
float kel_na_cel( float x ) { return x - 273.15; }
float kel_na_fah( float x ) { int przeliczone; przeliczone = kel_na_cel( x ); return cel_na_fahr( przeliczone ); }
float fah_na_kel( float x ) { int przeliczone; przeliczone = fahr_na_cel( x ); return cel_na_kel( przeliczone ); }
void menu() { unsigned wybor; float wartosc; do { cout << "menu" << endl; cout << "1-kelwiny na cel\n2-cel na kel\n3-fahr na cel\n4-cel na fah\n5-kel na fah" "\n6-fah na kel\n7-koniec programu\ntwoj wybor: "; cin >> wybor; switch( wybor ) { case 1: cout << "kel na cel" << endl; cout << "podaj wartosc do przeliczenia: " << endl; cin >> wartosc; while( wartosc <= 0 ) { cout << "podaj wartosc wieksza niz zero bezwzgledne: "; cin >> wartosc; } cout << "w przeliczeniu: " << kel_na_cel( wartosc ) << endl; break; case 2: cout << "cel na kel" << endl; cout << "podaj wartosc do przeliczenia: " << endl; cin >> wartosc; while( wartosc <- 270 ) { cout << "podaj wartosc wieksza niz zero bezwzgledne: "; cin >> wartosc; } cout << "w przeliczeniu: " << cel_na_kel( wartosc ) << endl; break; case 3: cout << "fah na cel" << endl; cout << "podaj wartosc do przeliczenia: " << endl; cin >> wartosc; cout << "w przeliczeniu: " << fahr_na_cel( wartosc ) << endl; break; case 4: cout << "cel na fah" << endl; cout << "podaj wartosc do przeliczenia: " << endl; cin >> wartosc; while( wartosc <- 270 ) { cout << "podaj wartosc wieksza niz zero bezwzgledne: "; cin >> wartosc; } cout << "w przeliczeniu: " << cel_na_fahr( wartosc ) << endl; break; case 5: cout << "kel na fah" << endl; cout << "podaj wartosc do przeliczenia: " << endl; cin >> wartosc; while( wartosc <= 0 ) { cout << "podaj wartosc wieksza niz zero bezwzgledne: "; cin >> wartosc; } cout << "w przeliczeniu: " << kel_na_fah( wartosc ) << endl; break; case 6: cout << "fah na kel" << endl; cout << "podaj wartosc do przeliczenia: " << endl; cin >> wartosc; cout << "w przeliczeniu: " << fah_na_kel( wartosc ) << endl; break; case 7: cout << "koniec programu\n"; break; default: cout << "to nie jest prawidlowy wybor\n"; break; } } while( wybor != 7 ); } int main() { menu(); return EXIT_SUCCESS; }
Jeszcze uwaga co do użycia std::endl, std::flush, "\n". Doczytaj jakie są różnice, przemyśl i będzie po sprawie :-) |
|
michal11 |
» 2016-12-31 02:06:39 Jest dobrze, ale mogłoby być lepiej. W casach naruszasz DRY, można to na pewno jakoś inaczej, sprytniej zapisać.
@mokrowski
Jeżeli chodzi o zmienne w funkcjach, oczywiscie zgadzam się ale to co napisał mikewazowski i tak zostanie zoptymalizowane a czasami łatwiej się debuguje jak są zmienne w kodzie. |
|
mokrowski |
» 2016-12-31 13:30:02 Oczywiście że da się to zapisać ładniej ale po ilości postów kolegi (~8) wnioskuję że kontener lambd lub inne rozwiązania z wydzielonymi funkcjami (może np. mapa) były by zbyt zaawansowane. Jeśli kolega będzie chciał to poprosi o napisanie nieco nowocześniej :-)
Moim zdaniem kod jest _dla_ludzi_ a nie dla debugera. Ale tu wkraczamy w obszar "kto co uważa" więc nie będę brnął :-) Dość że ma się czytać dobrze dla człowieka. Jak będzie konieczność debugowania i tak będzie walka. Im krótszy kod (powyżej wyraźnej granicy dla C++ ~ 10-15 linii) tym mniej błędów :-)
Na marginesie... Im więcej praktyki tym częściej się testuje nie debuguje. Testem jest szybciej :-)
|
|
mikewazowski Temat założony przez niniejszego użytkownika |
» 2016-12-31 13:48:56 dziękuje za wskazówki :) uściślając nie jestem kolegą tylko koleżanką, tylko dwa pytania - czym jest DRY które naruszam w casach? (nie spotkałam się z tym sformułowaniem wcześniej)i dlaczego poprawniej jest używać return EXIT_SUCCESS; zamiast return 0; lub nie pisać return? |
|
carlosmay |
» 2016-12-31 14:06:20 DRY - don't repeat yourselfW skrócie. Pisanie kodu tak, aby się nie powtarzał. Jeśli jakiś fragment powtarza się kilka razy, należy ująć dany fragment w funkcję i to ją wywoływać w tych miejscach. @mikewazowski - Hmm? Wszystko wskazuje na male; |
|
mokrowski |
» 2016-12-31 14:23:33 |
|
mikewazowski Temat założony przez niniejszego użytkownika |
» 2016-12-31 14:47:45 ok, dziekuje jeszcze raz za pomoc :D zamykam |
|
« 1 » |