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

Błąd przy wylicaniu wzoru Herona w funkcji;

Object Storage Arubacloud
0 głosów
86 wizyt
pytanie zadane 18 marca w C i C++ przez fereblacek Nowicjusz (120 p.)
#include <iostream>
#include <cmath>

using namespace std;



float polet(int x1, int y1, int x2, int y2, int x3, int y3) {
    float x = abs(x2-x1) + abs(y2-y1);
    float y = abs(x3-x2) + abs(y3-y2);
    float z = abs(x3-x1) + abs(y3-y1);
    float p = (x + y + z)/2;
    int s = sqrt(p*(p-x)*(p-y)*(p-z));
    return s;
}


int main() {
    
    int x1, y1, x2, y2, x3, y3;

    cout << "Podaj wspolrzedne pierwszego wierzcholka: ";
    cin >> x1 >> y1;

    cout << "Podaj wspolrzedne drugiego wierzcholka: ";
    cin >> x2 >> y2;

    cout << "Podaj wspolrzedne trzeciego wierzcholka: ";
    cin >> x3 >> y3;

    cout << "Pole trojkata wynosi: " << polet(x1, y1, x2, y2, x3, y3) << endl;

    return 0;
}

Mój program wylicza boki z wierzchołków poprawnie, lecz gdy tylko robie wzór herona jako wynik pokazuje zawsze 0 (dla innych wzorów nie wysepuje ten problem);

komentarz 19 marca przez VBService Ekspert (253,400 p.)
edycja 19 marca przez VBService

BTW, sam fakt, że

float polet(int x1, int y1, int x2, int y2, int x3, int y3) {
    ...
}

daje możliwość zapisu np. tak

float polet(int x1, int y1, int x2, int y2, int x3, int y3) {
    float x = abs(x2-x1) + abs(y2-y1);
    float y = abs(x3-x2) + abs(y3-y2);
    float z = abs(x3-x1) + abs(y3-y1);
    float p = (x + y + z)/2;
    return sqrt(p*(p-x)*(p-y)*(p-z));
}

 

2 odpowiedzi

+2 głosów
odpowiedź 18 marca przez adrian17 Ekspert (344,860 p.)

Tak na oko...

int s = sqrt(p*(p-x)*(p-y)*(p-z));

wynik operacji zamieniasz na inta, więc np 0.5 zamienia się na 0.

Skoro zwracasz floata, to to aby też nie powinien być float?

komentarz 19 marca przez fereblacek Nowicjusz (120 p.)
dzieki
+2 głosów
odpowiedź 18 marca przez toko Dyskutant (7,670 p.)
edycja 19 marca przez toko

Tak na oko, to wzór na długość odcinka między punktami nie jest sumą bezwzględnej różnicy współrzędnych, a pierwiastkiem z sumy kwadratów różnicy współrzędnych.

nie:
|x1-x2|+|y1-y2|

tak:
sqrt((x1-x2)²+(y1-y2)²)

Chyba się jednak pomyliłeś z tym, że liczenie boków działa.

+ Co już @adrian17 napisał, wynik powinien być floatem.

komentarz 19 marca przez fereblacek Nowicjusz (120 p.)
Masz rację. Dzięki, działa.

Podobne pytania

0 głosów
1 odpowiedź 3,397 wizyt
+1 głos
1 odpowiedź 406 wizyt
pytanie zadane 20 kwietnia 2018 w Matematyka, fizyka, logika przez Aoi Nowicjusz (230 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...