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

Przelicznik Stopni Celsjusza na Fahrenheita- problem z debugowaniem

VPS Starter Arubacloud
0 głosów
2,387 wizyt
pytanie zadane 26 stycznia 2018 w C i C++ przez No Pain no Gain Nowicjusz (230 p.)

Witam, ma pewien problem nad którym siedzę już około 3/4 dni. Mianowicie tyczy się to pewnego zadania z książki Stephena Praty, brzmi ono następująco:

Napisz program, w którym w funkcji main() zostanie wywołana funkcja użytkownika otrzymująca temperaturę w stopniach Celsjusza i zwracająca odpowiadającą jej temperaturę w skali Fahrenheita. Program ma poprosić użytkownika o podanie wartości z klawiatury i pokazać wynik jak poniżej:

Podaj temperaturę w stopniach Celsjusza: 20

20 stopnie Celsjusza to 68 stopnie Fahrenheita.

Zmianę temperatury przeprowadź zgodnie ze wzorem:

Fahrenheit = 1,8*stopnie Celsjusza +32

Przy pierwszych kilkunastu próbach stworzyłem coś takiego.

#include <iostream>
#include <math.h>
using namespace std;
double Fahrenheit(double);
 
int main()
{
    double cel;
    cout << "Podaj Temperature w stopniach Celsjusza:";
    cin >> cel;
    Fahrenheit(cel);
    cout << cel << " stopni Celsjusza to " << Fahrenheit << " stopni Fahrenheita." << endl;
    cin.get();
    cin.get();
    return 0;
}
 
double Fahrenheit(double sts)
{
    double f;
    return f = (sts * 1, 8) + 32, 0;
}

lecz jak to powinno wyglądać już wiem mniejsza z tym, w czym rzecz natomiast? Po skompilowaniu kodu i debugowaniu podczas podawania wyniku dostaje takie coś.

I pytanie moje teraz takie, dlaczego zamiast normalnego wyniku program wyświetla różne cyfry i litery?

Załączam jeszcze mój gotowy kod w razie potrzeby.

#include <iostream>
#include <math.h>
using namespace std;
double Fahrenheit(double);

int main()
{
	double cel;
	cout << "Podaj Temperature w stopniach Celsjusza:";
	cin >> cel;
	double fahr = Fahrenheit(cel);
	cout << cel << " stopni Celsjusza to " << Fahrenheit << " stopni Fahrenheita." << endl;
	cin.get();
	cin.get();
	return 0;
}

double Fahrenheit(double sts)
{
	return 1.8 * sts + 32.0 ;
}

 

1 odpowiedź

+1 głos
odpowiedź 26 stycznia 2018 przez Sebastian Fojcik Nałogowiec (43,020 p.)

Słusznie zauważyłeś, że wynik funkcji Farenheit trzeba zapisać do zmiennej. Zapisałeś to do zmiennej fahr. Ale zauważ, że Twoja instrukcja wypisania wygląda następująco:

cout << cel << " stopni Celsjusza to " << Fahrenheit << " stopni Fahrenheita." << endl;

Wypisujesz Farenheit zamiast fahr. Czyli wypisujesz nazwę funkcji zamiast wartość zmiennej. Powinieneś poprawić tę linijkę na:

cout << cel << " stopni Celsjusza to " << fahr << " stopni Fahrenheita." << endl;

Jeśli chcesz znać odpowiedź dlaczego wyświetlają się te dziwne cyfry i litery, to już odpowiadam. Być może tego pewnie nie zrozumiesz, bo nie wiesz czym są wskaźniki, ale dla potomnych napiszę.
To co się wyświetla w konsoli, to liczba zapisana szesnastkowo. Kiedyś w trakcie nauki C++ dowiesz się, że:

Nazwa funkcji jest jej adresem

Więc wypisujesz adres funkcji. Czym jest adres funkcji? Cóż... kiedyś się dowiesz ;-)

Pozdrawiam serdecznie :-)

komentarz 26 stycznia 2018 przez No Pain no Gain Nowicjusz (230 p.)
Czyli wynik się zgadza tylko jest wyświetlany w innej formie. Mianowicie w formacie liczb szesnastkowych, czyli wszystko powinno się zgadzać :) dziękuje bardzo ponieważ martwiłem się że coś poszło nie tak skoro wynik wyszedł na pierwszy rzut oka dziwny.
komentarz 26 stycznia 2018 przez Sebastian Fojcik Nałogowiec (43,020 p.)

Nie wiem czy dobrze zrozumiałeś co napisałem.
Jak poprawisz linijkę tak jak zasugerowałem, to wynik będzie zwykłą liczbą. Będzie to poprawna wartość w Fahrenheitach. Wtedy zadanie będzie wykonane poprawnie.

Natomiast to co Ty zrobiłeś, to wypisanie adresu funkcji. Ta liczba nie ma nic wspólnego z wynikiem, który miałeś obliczyć. Nie jesteś jeszcze na tyle zaawansowany w języku C++, aby zrozumieć czym jest owy adres. To co wyświetla Twoja konsola jest niepoprawnym wynikiem, a czym jest ten wynik, to napisałem to dodatkowo, dla zaawansowanych użytkowników, którzy będą czytali ten wpis.

Wszystko w swoim czasie. Ucz się solidnie podstaw na razie. Na wskaźniki i adresy przyjdzie jeszcze pora w trakcie Twojej nauki :-)

komentarz 26 stycznia 2018 przez No Pain no Gain Nowicjusz (230 p.)
Dobra czyli zbędna nadinterpretacja dziękuje bardzo, własnie jak poprawiłem i wszystko wyświetla się tak jak powinno. Wielkie dzięki za pomoc :D
komentarz 26 stycznia 2018 przez monika90 Pasjonat (22,940 p.)
edycja 26 stycznia 2018 przez monika90

Wyświetla się adres funkcji bo kompilator Microsoftu jest niezgodny ze standardem C++. Wg standardu na standardowe wyjście powinno zostać zapisane 1.

Nazwa funkcji jest jej adresem

Nonsens.

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

@monika90

No tak. Według standardu powinna zajść konwersja na bool.

Nazwa funkcji jest jej adresem

Nonsens.

Podaj argumenty, że tak nie jest. Niżej zamieszczam program pokazujący, że nazwa funkcji jest równoważna z jej adresem. Twierdzę tak w oparciu o książkę Grębosza i własne doświadczenia z tymi wskaźnikami. 

PS. Nie dotyczy to funkcji składowych klas, które wymagają już użycia &. W przypadku pozostałych nie jest to konieczne i mówienie, że nazwa tablicy jest jej adresem nie powinno być nadużyciem. 

Podobne pytania

+3 głosów
1 odpowiedź 10,507 wizyt
pytanie zadane 30 grudnia 2017 w C i C++ przez kuras Początkujący (390 p.)
0 głosów
1 odpowiedź 472 wizyt
pytanie zadane 16 grudnia 2017 w C i C++ przez Fabioo Nowicjusz (150 p.)
0 głosów
1 odpowiedź 1,033 wizyt
pytanie zadane 13 lipca 2017 w Java przez Moras Obywatel (1,620 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...