Nie zwraca poprawnie wyniku (C)


(fejku) #1

Witam.

Dostałem do napisania na zajęciach program w domu… Niby jest prosty, ale głowię się. Miałem zastosować stworzenie funkcji oraz switch żeby wybrano zadanie, które użytkownik chce obliczyć. Problemem jest to, że jakich liczb a i b bym nie podał wynik yl lub yk jest równy 0.

 

Oto kod:

http://wklej.org/id/2930458/

Jakieś podpowiedzi? :confused:


(Fizyda) #2

Błędów jest sporawo, ogarnij wcięcia w kodzie bo jest strasznie nieczytelny. Jak już to zrobisz myślę że część błędów wyłapiesz sam.


(fejku) #3

Błędów sporawo, a wykładowca jak popatrzył na kod (bez patrzenia na wypisywanie wyniku) to powiedział, że ok… No nieźle.

 

Co do formatowania kodu to nawet nie wiem zbyt jak to powinno poprawnie wyglądać.


(lukasssz) #4

Znam z doświadczenia, że zdarzają się wykładowcy, których to studenci uczą, a nie wykładowcy studentów, bo nie ogarniali tematu. Sam miałem 2-3 takich nauczycieli. :stuck_out_tongue:


(Fizyda) #5

Gdy zaczynasz jakiś nowy blok w jego środku robisz jeden tabulator niż on się od niego zaczynał. Jak masz funkcję to jej ciało zaczynasz od dodatkowego wcięcia.

Kod może nie z czystego C i jest to raczej pseudo kod, nie skupiam się nawet na jego poprawności w jakimkolwiek języku bardziej staram się zobrazować o co chodzi z tabulatorami:

http://wklej.org/id/2930515/

pierwszych 20 linijek raczej będzie tyczyło się języków obiektowych, takich jak np C++.

 

Widzisz teraz różnice w kodzie? Nie muszę zbyt skupiać się na wszystkim bo wcięcia pokazują mi co jest wykonywane w danym jakimś bloku logicznym. W Twoim kodzie ciężko nawet stwierdzić czy nawiasy klamrowe {} są w odpowiednich miejscach i czy są w ogóle potrzebne. Ich nadmiar nie spowoduje jakiegoś błędu, bo one dzielą kod na bloki instrukcji, ale mogą wpływać na czytelność lub jej brak kodu.


(fejku) #6

http://wklej.org/id/2930525/

 

Jak teraz to wygląda?


(Fizyda) #7

Lepiej, ale jeszcze nie do końca, gdzieniegdzie pouciekały Ci nawiasy i returny. No i te nawiasy klamrowe w case nie są potrzebne.

Ale teraz widać gdzie jest błąd ;). Błąd masz taki że gdy wywołujesz funkcje f1 lub f2, nie zapamiętujesz jej wyniku nigdzie. To co liczą f1 i f2 leci w niepamięć ;).

Gotowego rozwiązania Ci nie podam, pomyśl sam. Jeśli nie wpadniesz na rozwiązanie w ciągu 20 minut to napisz powiem Ci o co chodzi bo wiem jak jest na studiach z czasem ;). Ale spróbuj dojść do tego sam, jednak nauka na błędach jest chyba najlepszą i najszybszą formą nauki.


(fejku) #8

Zgłupiałem, a pewnie rozwiązanie jest banalne. Jeszcze jedna podpowiedź.


(Fizyda) #9

Gdy dajesz return to funkcja zwróci to co jest w argumencie return w miejsce gdzie jest wywoływana. Teraz jeśli chcesz taką wartość mieć w innym miejscu w kodzie poza samym faktem policzenia tego musisz ją “odebrać”.


(fejku) #10

Czemu nie mogę wpaść na tak prostą rzecz…


(Fizyda) #11

Może nikt Cię tego nie nauczył ;).

 

yl = f1(a, b);

 

lub w skróconej formie:

printf(“Wynik yl wynosi: %f\n”, f1(a, b));