Program przeliczający stopnie Celsjusza na stopnie Fahrenheita – poprawność kodu

0

Witam, dopiero zaczynam przygodę z programowaniem i mam pytanie dotyczące mojego kodu. Otóż rozwiązałem zadanie ale nie wiem czy to ma wyglądać w taki sposób jak ja do tego doszedłem ( a trochę się z tym męczyłem, gdyż nie do końca rozumiem to całe wywoływanie funkcji użytkownika).

Treść zadania brzmiała:

Stwórz program w którym w funkcji main() zostanie wywołana funkcja użytkownika otrzymująca temperaturę w stopniach Celsjusza i zwracająca odpowiednią jej temperaturę w skali Fahrenheita.
Wzór na zmianę temperatury: Fahrenheit = 1,8 * stopnie C + 32.

Z chęcią przyjmę wszelkie wskazówki na przyszłość. A oto jak wygląda kod:

#include <iostream>

using namespace std;
float c_to_f(float);

int main()
{
    float t;
    cout << "Podaj temperature w stopniach Celsjusza: ";
    cin >> t;
    float f = c_to_f(t);
    cout << t << " stopni Celsjusza to ";
    cout << f << " w stopniach Fahrenheita" << endl;

    return 0;
}
    float c_to_f(float ctf)
    {
       return (1.8*ctf)+32;
    }
4

Dobrze jest, choć przeniesienie ciała funkcji c_to_f pod ciało funkcji main jest zbędne. Do tego źle operujesz wcięciem – funkcja przeliczająca powinna mieć takie same wcięcia jak main (klamry równo, bez wcięcia, instrukcje z wcięciem). W funkcji głównej można złączyć oba cout – będzie czytelniej.

Jeśli o mniej ważne rzeczy chodzi, to staraj się dobierać lepsze nazwy dla zmiennych oraz funkcji – t, f czy c_to_f w ogóle nie mówią o swoim przeznaczeniu.

0

@furious programming: Dzięki za odpowiedź i wszelkie wskazówki ! :)

3

Jak na początek przygody z programowaniem, tyle wskazówek powinno wystarczyć.

Co prawda możnaby się uczepić tego using namespace std na samej górze kodu, jednak jeśli chodzi o dobre praktyki pisania kodu, to przyjdzie i na to czas. Do używania endl też. ;)

0

Mam jeszcze pytanie, może głupie ale napisałeś, że przeniesienie ciała funkcji c_to_f pod ciało funkcji main jest zbędne. Gdzie zatem powinienem umieścić tę funkcję ?

3

Nad ;-)

Wtedy nie będziesz potrzebował jej deklarować na samym początku: float c_to_f(float);, bo już będzie znana w momencie przetwarzania funkcji main.

1

Ja jeszcze zapytam, gdzie w zadaniu masz napisane, że program ma wypisywać "Podaj temperature w stopniach Celsjusza: " itp?
Może dla ciebie to ma sens, ale większość takich zdań jest sprawdzanych maszynowo, a automat nie będzie w stanie zrozumieć tych napisów i uzna odpowiedź za błędną.
Czyli na wyjściu mają się pojawiać jedynie rzeczy, które są opisane w treści zadania.

1

@OP: Pochwal autora za ładny kod (jak na poziom studenta).
Wywołanie funkcji działa tak:

W kodzie:

a = 1;
cos-tam(a);
b = 2;

// funkcja
void cos-tam(int arg) {
  int c = arg;
  wyswietl-c;
}

Zadziała tak:

a = 1;
// przygotuj-a-jako-argument i zapamietaj gdzie masz wrocic
// skocz do cos-tam()
cos-tam(a);
// po zakonczeniu cos-tam wracaj tutaj
b = 2;

// funkcja
void cos-tam(int arg) {
  // przypisz do arg to co dostales jako argument (a)
  // uzyj argumentu
  int c = arg;
  wyswietl-c;
  // powroc do miejsca wywolania ew. zwracajac wynik (jesli nie "void")
}

To wszystko co napisałem w komentarzach ładnie widać jak zajrzysz do wersji ASM tego kodu, np. tym narzędziem:
https://gcc.godbolt.org/#

Trzeba tylko sobie odkodować kilka instrukcji ASM (do deassemblacji dużo ich nie trzeba znać).

1

Masz Bracie w formie zrozumiałej dla nowicjusza,bez skrótów myślowych:

#include <iostream>
 
//using namespace std;//jak popraktykujesz dłużej jako programista odkryjesz,że takie pozbywanie się jednoznacznego określania nazw to potencjalne źródło problemów w większych projektach.Ostatecznie można używać w plikach .cpp od definicji klas,ale Swarogu,Perunie,Trygławie i Welesie brońcie wrzucać using namespace XXX; do .h - jest to dopraszanie się o kłopoty.

float c_to_f(float ctf)//dzięki takiemu zapisowi nie potrzebujesz deklaracji zapowiadającej float c_to_f(float); bo kompilator w miejscu użycia c_to_f() zna już definicję tejże funkcji.
{
	return (1.8*ctf)+32;
}		
 
int main()
{
    float t;
    cout << "Podaj temperature w stopniach Celsjusza: ";
    cin >> t;
    float f = c_to_f(t);
    cout << t << " stopni Celsjusza to ";
    cout << f << " w stopniach Fahrenheita" << endl;
 
    return 0;
}
//a teraz ze zmienionymi nazwami zmiennych i funkcji, oraz spacją między poszczególnymi operacjami.
float convertDegreesCelsiusToFarenheit(float degreesCelsius)
{
	return (1.8 * degreesCelsius) + 32;
}

int main()
{
    float temperatureCelsius;
    std::cout << "Podaj temperature w stopniach Celsjusza: ";
    std::cin >> temperatureCelsius;

    float temperatureFarenheit = convertDegreesCelsiusToFarenheit(temperatureCelsius);
    std::cout << temperatureCelsius << " stopni Celsjusza to " << temperatureFarenheit << " w stopniach Fahrenheita" << std::endl;
 
    return 0;
}
//który kod lepiej się czyta?;]

Generalnie dobrze zaczynasz, praktykuj dalej robiąc np. zadania ze SPOJ-a.

0

@vpiotr: @MasterBLB
Dzięki za wszelką pomoc i objaśnienia bo całkiem sporo mi to rozjaśniło ! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1