Puchacz1 Napisano 7 Stycznia 2007 Zgłoś Napisano 7 Stycznia 2007 Witam. Uczę się pisania w języku C++ i mam problem z wykonaniem jednego z działań Wygląda to tak: float nwynik7 = 1/2 * (nliczba10 * nliczba11); działanie ma wyglądać tak 1/2*(a*h) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Excray Napisano 7 Stycznia 2007 Zgłoś Napisano 7 Stycznia 2007 (edytowane) To co Ty stworzyłeś jest po prostu karygodne. Podstawy matematyki i programowania się kłaniają. Nie pisze się tak: float nwynik7 = 1/2 * (nliczba10 * nliczba11); !!! Piszesz albo tak: float nwynik7 = (1/2) * (nliczba10 * nliczba11);albo tak: float nwynik7 = 1/(2 * (nliczba10 * nliczba11));w zależności od efektu jaki chcesz osiągnąć. Edytowane 7 Stycznia 2007 przez Excray Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
grzmot Napisano 8 Stycznia 2007 Zgłoś Napisano 8 Stycznia 2007 Puchacz1: jaki w zasadzie masz problem? Excray: co jest karygodne, ten zapis wykona się normalnie. Oczywiście najlepiej byłoby tak: float nwynik7 = nliczba10 * nliczba11 / 2; Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
greg505 Napisano 8 Stycznia 2007 Zgłoś Napisano 8 Stycznia 2007 wszytskie tematy o programowaniu zamieszcza sie tu http://forum.purepc.pl/index.php?showforum=35 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
Excray Napisano 8 Stycznia 2007 Zgłoś Napisano 8 Stycznia 2007 (edytowane) Excray: co jest karygodne, ten zapis wykona się normalnie. Oczywiście najlepiej byłoby tak: float nwynik7 = nliczba10 * nliczba11 / 2; Skoro tak twierdzisz... ale zastanów się jeszcze nad tym. EDIT Nikt chyba nie zaczaił co jest źle w tym zapisie: float nwynik7 = 1/2 * (nliczba10 * nliczba11); Te działanie w tym zapisie wykona się tak: float nwynik7 = 1/(2 * (nliczba10 * nliczba11)); a podejrzewam, że autorowi zależy na tym: float nwynik7 = (1/2) * (nliczba10 * nliczba11); Podstawowa zasada!!! Zawsze stosuj nawiasy w celu określenia priorytetu wykonania operacji matematycznych! Edytowane 8 Stycznia 2007 przez Excray Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
arcuf_cofinuf Napisano 8 Stycznia 2007 Zgłoś Napisano 8 Stycznia 2007 (edytowane) Nikt chyba nie zaczaił co jest źle w tym zapisie: float nwynik7 = 1/2 * (nliczba10 * nliczba11); Te działanie w tym zapisie wykona się tak: float nwynik7 = 1/(2 * (nliczba10 * nliczba11)); E tam. Operatory dzielenia i mnożenia mają taki sam priorytet. Najpierw wykona się dzielenie 1/2, w wyniku otrzymamy... 0 (tak tak, dzielenie całkowite), a następnie to zero przemnoży się przez wartość iloczynu zmiennych w nawiasie. I tak naprawdę to tu kryje się nie tyle błąd, co nieświadomość programisty. Wynik takiej operacji będzie zerem, typu takiego jak typ iloczynu zmiennych (czyli gdy jest float*float, to typ iloczynu też float, gdy float*int, to iloczyn jest float, int*int -> int). Potem nastąpi zrzutowanie tego zera na typ float (lub brak rzutowania, jeśli już jest ono floatem) i przypisanie. Gdyby zamiast 1/2 wpisać od razu wartość 0.5, wszystko będzie poprawnie, otrzymamy jakiś wynik zmiennoprzecinkowy, który będzie zerem tylko wtedy, gdy któraś z mnożonych zmiennych ma wartość 0. Edytowane 8 Stycznia 2007 przez arcuf_cofinuf Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...