Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Podprogram liczący wierzchołek paraboli

Ostatnio zmodyfikowano 2013-12-14 23:46
Autor Wiadomość
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?
C/C++
#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
P-99216
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.
P-99218
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 :)

C/C++
#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;
}
P-99225
kubek3898
» 2013-12-14 22:15:10
Przeczytaj to co napisała Monika90. Zwracasz rezultat jako float, a
zmienna
 jest typu wierzcholek.
P-99226
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?

C/C++
#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;
}
P-99231
docentpp
» 2013-12-14 23:29:23
Xw=-b/(2a) ,
Yw=-delta/(4a).

Masz błędy literowe :
C/C++
zwroc.xw =- y / 2 * x;
zwroc.yw =- delta / 4 * x;
P-99234
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.
P-99236
« 1 »
  Strona 1 z 1