[ alfa-pro @ 05.05.2013. 14:32 ] @
E ovako sada dali ja toliko gresim u matematici koliko se secam ali reko bih da sam u pravu.

Radim zadatak iz C++ izracunavanje obima Jednokrakog, Jednakostranicnog i Nejednakostranicnog trougla.

Zasto sam postavio ovu temu iz razloga zato sto drugar koji se duze bavi od mene C++ -om kaze da ovaj postupak nevalja i nije tacan obim trougla...

Moja definicija za ovo je:

Jednakostranicni trougao je trougao kome stranice su iste duzine jel tako? Obim = A+B+C znaci da a i b i c moraju imtai iste vrednosti.
Jednakokraki (dve stranice su iste a jedna se razlikuje) sto bi bilo Obim = A(5) + B(2) + C(5)
Nejednakostranicni (sve stranice su razlicite) sto bi bilo Obim = A(3) + B(2) + C(5)

Dali gresim u proracunu ove geometrije? Mislim nesecam se ni ja vise kad sam to ucio pre 15 godina u skoli..

Zadatak je da izracunam obim i proverim dali stranice imaju vrednost 0 (NULL) i dali su jednake.

Moj kod je sledeci:


Code:

#include <iostream>
#include <string>

using namespace std;

// Jednakostranicni

int jedankostranicni() {
    // a = stranica A
    // b = stranica B
    // c = stranica C
    // o = obim trougla

    int a, b, c, o;

    std::cout << "Jednakostranicni trougao" << std::endl;
    std::cout << "-----------------------------------------------------" << std::endl;

    std::cout << "A = ";
    std::cin >> a;
    std::cout << "B = ";
    std::cin >> b;
    std::cout << "C = ";
    std::cin >> c;

    // Proveri dali su stranice validne
    if ((a == 0) || (b == 0) || (c == 0)) {
        std::cout << "ERROR: Stranica sa nula vrednosti nije ispravna" << std::endl;
    }        // Proveri jednakost stranica
    else if ((a != b) || (a != c) || (b != a) || (b != c) || (c != a) || (c != b)) {
        std::cout << "ERROR: Sve stranice moraju biti iste duzine " << std::endl;
    }        // Ako je sve uredu izracunaj obim trougla
    else {
        // obim
        o = a + b + c;

        std::cout << "Obim Jednakostranicnog truugla je = " << o << std::endl;
    }

    return o;
}

int main() {

    std::cout << "*****************************************************************" << std::endl;
    std::cout << "Tip Trougla" << std::endl;
    std::cout << "*****************************************************************" << std::endl;
    std::cout << "1: Jednakostranicni (sve stranice su iste duzine)" << std::endl;
    std::cout << "2: Jednakokraki (dve stranice su iste a jedna se razlikuje)" << std::endl;
    std::cout << "3: Nejednakostranicni (sve stranice su razlicite)" << std::endl;
    std::cout << "-----------------------------------------------------------------" << std::endl;

    std::cout << "Unesi tip : ";
    std::cin >> tip;

    // Proveri tip

    switch (tip) {
        case 1:
            return jedankostranicni();
            break;
        case 2:
            std::cout << "Jednakokraki trougao";
            break;
        case 3:
            std::cout << "Nejednakostranicni trougao";
            break;
        default:
            std::cout << "ERROR: Nepoznati tip" << std::endl;
    }

    return 0;
}


Samo sam stavio za jednakostranicni trougao jer je kod ogroman.
[ djoka_l @ 05.05.2013. 16:28 ] @
Prvo malo gramatike:
- da li se piše odvojeno
- ne valja se piše odvojeno
- ne sećam se piše odvojeno

Što se matematike tiče, obim trougla je jednak zbiru stranica, bez obzira na to kakav je trougao, tako da ti je matematika tačna.
Tvoj primer za nejednakostranični trougao nije dobar jer ne postoji trougao sa stranicama 2, 3 i 5. Ako mi ne veruješ probaj da ga nacrtaš i ispašće ti duž a ne trougao. Za svaki trougao važi da zbir dužina bilo koje dve stranice mora biti veći od dužine treće stranice. U tvom primeru je 2+3=5 pa onda nije ispunjen uslov da je zbir bilo koje dve stranice veći od dužine treće stranice.

Što se programiranja tiče, tvoj kod je očajan.

Prvo treba da proveriš da li su stranice >= 0 jer bi u tvom programu prošao kao validan trougao sa negativnim dužinama stranica.
Drugo, kada proveravaš da li je trougao jednakostraničan, dovoljno je da bude ispunjeno a==b i a==c, jer je realacija ekvivalencije refleksivna, simetrična i tranzitivna pa su sva ostala poređenja potpuno suvišna.
[ djoka_l @ 05.05.2013. 16:42 ] @
Dodatak na to šta ne valja u programu:

Pretpostavljam da je zadatak glasio da program treba da učita tri celobrojne stranice trougla, proveri da li je trougao jednakostranični, jednakokraki ili nejednakostranični i to ispiše i na kraju da izračuna obim trougla i ispiše ga.

Umesto toga, program prvo ispisuje meni i zahteva da se zada kakav će trougao biti, a zatim poziva metodu koja radi ispitivanje i izračunavanje.
Moje pitanje je, ako sam već rekao da želim da unesem jednakostranični trougao, zašto me onda program tera da unesem tri puta istu stranicu, sa mogućnošću da pogrešim, pa da mi onda kaže da to nije jednakostranični. Dakle, ako moram da biram prvo tip trougla, ond za jednakostranični bi bilo lepo da unesem samo jednu vrednost, za jednakokraki dve vrednosti, a samo za nejednakostranični sve tri.

Osim toga, u switch konstrukciji program se završava sa return obim, a svaka druga vrednost osim return 0 funkcije main označava kod greške.

Zbog takvog načina pisanja ti je program "ogroman", a ne zato što nešto pametno radi.