Atexor Temat założony przez niniejszego użytkownika |
Podprogram liczący wierzchołek paraboli » 2013-12-14 20:24:33 Witajcie, mam takie proste niby zadanko, mianowicie napisać podprogram (funkcję) obliczającą punkty wierzchołka paraboli na podstawie danych a,b,c co wprowadza się z klawiatury. Problem w tym, że mi program nie chce się skompilować, bo wykrywa błąd na "return (zmienna)". Chciałem aby z podprogramu zwróciło mi strukturę mającą wyliczone punkty xw,yw i je potem wykorzystać w głównej funkcji programu. Jeszcze wcześniej chciałem to napisać bez użycia struktur, aby funkcja zwracała return(xw,yw) ale też coś potem nie działało. Domyślam się że ciąg dalszy też może mieć błędy, ale nie mam jak ich sprawdzić bo one wynikają z błędu w returnie. Co robię źle? #include <stdio.h> #include <stdlib.h>
liczwierzch( float x, float y, float z ) { float delta; delta = y * y - 4 * x * z; struct wierzcholek { float xw; float yw; }; struct wierzcholek zmienna; zmienna.xw =- y / 2 * x; zmienna.yw =- delta / 4 * x; return( zmienna ); }
int main() { float a, b, c, funkcja; printf( "Podaj wartosci wspolczynnikow: a b c:\n" ); scanf( "%f %f %f", & a, & b, & c ); funkcja = liczwierzch( a, b, c ); printf( "Wierzcholek paraboli ma wspolrzedne [%f,%f]", zmienna.xw, zmienna.yw ); system( "PAUSE" ); return 0; }
Pozdrawiam |
|
Monika90 |
» 2013-12-14 20:50:47 liczwierzch( float x, float y, float z ) |
Nie zadklarowałeś typu zwracanego z funkcji. funkcja = liczwierzch( a, b, c ); |
Jeżeli funkcja ma zwracać strukturę, a zmienna funkcja jest typu float to nie ma to sensu. |
|
Atexor Temat założony przez niniejszego użytkownika |
» 2013-12-14 22:11:22 Poprawiłem już i trochę zmieniłem kod, niestety dalej mam błąd z tym return (zmienna) i potem zm2 w funkcji głównej. Co jest nie tak? Dziękuję za wykrycie tamtych błędów :) #include <stdio.h> #include <stdlib.h>
float liczwierzch( float x, float y, float z ) { float delta; delta = y * y - 4 * x * z; struct wierzcholek { float xw; float yw; } zmienna; zmienna.xw =- y / 2 * x; zmienna.yw =- delta / 4 * x; return( zmienna ); }
int main() { float a, b, c; struct funkcja { float x; float y; } zm2; puts( "Podaj wartosci wspolczynnikow a b c" ); scanf( "%f %f %f", & a, & b, & c ); zm2 = liczwierzch( a, b, c ); printf( "Wierzcholek paraboli ma wspolrzedne [%f,%f].\n", zm2.x, zm2.y ); system( "PAUSE" ); return 0; }
|
|
kubek3898 |
» 2013-12-14 22:15:10 Przeczytaj to co napisała Monika90. Zwracasz rezultat jako float, a zmienna jest typu wierzcholek. |
|
Atexor Temat założony przez niniejszego użytkownika |
» 2013-12-14 22:50:21 Hmmm, źle ją zrozumiałem, tzn. że funkcja nie ma typu a zwraca i w tym tkwi błąd. Funkcję zrobiłem jako strukturę i teraz "działa" (chociaż sam już nie wiem dlaczego), a to dlatego bo raz liczy dobrze wierzchołek, a raz źle, np. dla y = 2x^2 -4x + 3, wierzchołek to (1,1), a program wskazuje (4,4). Gdzie jest błąd? I nie da rady w ogóle pozbyć struktur, po prostu aby funkcja zwracała (xw,yw) i to wykorzystać w głównej funkcji? #include <stdio.h> #include <stdlib.h>
struct wierzcholek { float xw; float yw; } zwroc;
struct wierzcholek funkcja( float x, float y, float z ) { float delta; delta = pow( y, 2 ) - 4 * x * z; zwroc.xw =- y /( 2 * x ); zwroc.yw =- delta /( 4 * x ); return( zwroc ); };
int main() { float a, b, c; puts( "Podaj wartosci wspolczynnikow a b c" ); scanf( "%f %f %f", & a, & b, & c ); zwroc = funkcja( a, b, c ); printf( "Wierzcholek paraboli ma wspolrzedne [%.3f,%.3f].\n", zwroc.xw, zwroc.yw ); system( "PAUSE" ); return 0; }
|
|
docentpp |
» 2013-12-14 23:29:23 Xw=-b/(2a) , Yw=-delta/(4a). Masz błędy literowe : zwroc.xw =- y / 2 * x; zwroc.yw =- delta / 4 * x;
|
|
Atexor Temat założony przez niniejszego użytkownika |
» 2013-12-14 23:46:07 O rany, racja, taki głupi błąd. Poprawiłem wyżej. Teraz już wszystko działa :)
Mam jeszcze takie jedno nurtujące mnie pytanie, czemu w niektórych programach (tutaj też) jeżeli mam wynik jakichś obliczeń równy 0, ty wynik mi często zapisuje jako " -0 ", a nie 0? Np. dla wartości 1,0,1, 2,-4,2? Mimo tego, że nie operuję na dużych liczbach i zazwyczaj jeszcze typu int, więc nie powinno być chyba jakichś niedokładności. |
|
« 1 » |