Program sprawdzajacy trojkat

Program sprawdzajacy trojkat
KL
  • Rejestracja:około 5 lat
  • Ostatnio:około 4 lata
  • Postów:53
0

Napisz program a w programie funkcję, która wczyta trzy liczby typu int - będą to boki trójkąta, a następnie sprawdzi czy z tych boków można stworzyć trójkąt prostokątny.
W przypadku podania długości boków, które tworzą trójkąt prostokątny należy wyświetlić komunikat: Z tych boków można zbudować trójkąt prostokątny, w przeciwnym razie powinien być to komunikat: To nie będzie trójkąt prostokątny.
Uwaga: W programie należy założyć, że użytkownik wpisze liczby w dowolnej
kolejności.
Ograniczamy się tylko do liczb dodatnich, więc to też należy sprawdzić.
Najlepiej żeby została użyta funkcja typu bool.

lambdadziara
  • Rejestracja:ponad 6 lat
  • Ostatnio:minuta
  • Postów:444
1

ile płacisz?

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:4 dni
  • Lokalizacja:Szczecin
1

Czy masz jakieś pytania związane z tym zadaniem? Masz bardzo lakoniczny styl wypowiedzi.


KL
  • Rejestracja:około 5 lat
  • Ostatnio:około 4 lata
  • Postów:53
0

Chciałbym się dowiedzieć w sumie jak zacząć, jakieś porady jak i co zrobić i wytłumaczenie byłoby mile widziane.

Althorion
Moderator C/C++
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 5 godzin
  • Postów:1607
2
  1. Przeczytać na Wikipedii o nierówności trójkąta.
  2. Przeczytać w podręczniku/w sieci o C++-ie — o instrukcjach warunkowych, o pobieraniu danych od użytkownika i o wyświetlaniu danych.
  3. Uruchomić ulubiony edytor tekstu i napisać program, korzystając z wiedzy zdobytej w dwóch powyższych punktach.

W razie konkretnych problemów, udać się z nimi na forum.

Spine
  • Rejestracja:około 22 lata
  • Ostatnio:3 minuty
  • Postów:6694
2

Wystarczy sprawdzić, czy dla dwóch najkrótszych boków zachodzi twierdzenie Pitagorasa.

Najpierw posortuj rosnąco trzy podane długości. Potem sprawdź czy suma kwadratów pierwszej i drugiej równa się kwadratowi trzeciej.

Masz operować na liczbach całkowitych, co dodatkowo upraszcza sprawę.


dodałem załącznik z porównaniem wydajności dla @Althorion, bo tak wygodniej, niż ładować na imgur ;)


🕹️⌨️🖥️🖱️🎮
edytowany 8x, ostatnio: Spine
Zobacz pozostałe 29 komentarzy
kq
Ja, żebym miał takie rozterki, musiałbym w ogóle ogarnąć jak wygląda trójkąt w koordynatach zespolonych, bo mi się to na razie nie spina.
Spine
Demokratycznie @Althorion nie ma racji :P
BO
Po co sortować skoro wystarczy maksymalna wartość?
enedil
Trickowe rozwiązanie bez sortowania i kilku sprawdzeń - m = max([a, b, c]); return 2*m**2 == a**2+b**2+c**2 wymaga tylko dwóch skoków warunkowych
KL
  • Rejestracja:około 5 lat
  • Ostatnio:około 4 lata
  • Postów:53
0

#include <iostream>

using namespace std;

int a,b,c;
bool funkcja(){
if ( ( (aa)+(bb) )== ( c*c) ) {
cout<<"Z tych bokow mozna zbudowac trojkat prostokatny";}
return true;
}

int main() {
cout << "-------------------------------------------------" << endl;
cout << "Sprawdzam czy mozna zbudowac trojkat prostokatny!" << endl;
cout << "-------------------------------------------------" << endl;
cout <<"Podaj bok A: ";
cin >> a;
cout << "Podaj bok B: ";
cin >> b;
cout << "Podaj bok C: ";
cin >> c;

if(funkcja()==true){

}
else{
cout<<"To nie bedzie trojkat prostokatny";
}

return 0;

}
Jestem na takim etapie, ale nie potrafię tej funkcji bool. Jak wpisuje trojke pitagorejska to wszystko dziala i wyswietla to zdanie na samej gorze, ale gdy juz wpisuje co innego to nie wyświetla mi tego ostatniego zdania. Co źle robie i jak to poprawic?

AK
Nie na zmiennych globalnych. Błagam. Funkcja niech ma znaczącą nazwę i argumenty
Tasmanian Devil
Hej! Twój post prawdopodobnie zawiera niesformatowany kod. Użyj znaczników ``` aby oznaczyć, co jest kodem, będzie łatwiej czytać. (jestem botem, ta akcja została wykonana automatycznie, prawdopodobieństwo 0.9988564)
KL
Anyktokolwiek moglbys mi pomoc i pokazac jak zrobic zmienne inaczej?
AK
argumenty funkcji - i wiesz wszystko. Internet chyba masz?
lambdadziara
  • Rejestracja:ponad 6 lat
  • Ostatnio:minuta
  • Postów:444
3

Bo obecnie zwracasz true zawsze, bez wzgledu na rezultat. Powinno byc tak

Kopiuj
bool funkcja(){
    if ( ( (a*a)+(b*b) )== ( c*c) ) {
        cout<<"Z tych bokow mozna zbudowac trojkat prostokatny";
        return true;
    }
    return false;
}
Zobacz pozostałe 2 komentarze
AK
Bardzo kiepska propozycja. A co, gdy JEDNAK ktoś będzie chciał użyć tylko do sprawdzenia, bez drukowania?
lambdadziara
to niech chociaz napisze "if(funkcja()!=true){cout<<"To nie bedzie trojkat prostokatny";}"
KL
zrobilłem tak jak mowilas, zeby przed return false postawic cout "to nie jest trojkat prostokatny" i w sumie jest okej ale nadal kurde nie wiem jak dobrze zadeklarowac int a, int... funkcje w bool. Wyskakuje mi error, ze mam za duzo argumentow.
KL
Tak samo jak robię funkcje int tylko na wpisywanie bokow, zeby to jednak nie byly zmienne globalne
AK
Nie porównuj == true
KL
  • Rejestracja:około 5 lat
  • Ostatnio:około 4 lata
  • Postów:53
0
Kopiuj
#include <iostream>

using namespace std;

bool trojka(int a,int b,int c){
    if ( ( (a*a)+(b*b) )== ( c*c) ) {
        cout<<"Z tych bokow mozna zbudowac trojkat prostokatny";
        return true;
    }
    cout << "To nie jest trojkat prostokatny";
    return false;
}


int main(int a,int b, int c) {
    cout << "-------------------------------------------------" << endl;
    cout << "Sprawdzam czy mozna zbudowac trojkat prostokatny!" << endl;
    cout << "-------------------------------------------------" << endl;
    cout <<"Podaj bok A: ";
    cin >> a;
    cout << "Podaj bok B: ";
    cin >> b;
    cout << "Podaj bok C: ";
    cin >> c;
    trojka(a,b,c);
    return 0;
}
``````````````````````````````````````````````````````````````````````````````````````````````````````
Cos takiego jest okej, zeby nie bylo zmiennych globalnych? Czy zrobić co innego? Chciałbym tez zrobic funkcje na wprowadzanie boków ale nie wiem jak. Probowałem cos zrobic, ale nie za bardzo mi wychodzilo i np nie dzial juz ten bool wtedy. Help
KL
  • Rejestracja:około 5 lat
  • Ostatnio:około 4 lata
  • Postów:53
0
Kopiuj
int boki(int a,int b,int c){
    cout <<"Podaj bok A: ";
    cin >> a;
    cout << "Podaj bok B: ";
    cin >> b;
    cout << "Podaj bok C: ";
    cin >> c;
}

I jak zaczynam wpisywac te boki to juz dalej za kazdym razem pokazuje mi, ze nie moge utworzyc trojkata

Zobacz pozostały 1 komentarz
KL
To jak to wszystko naprawic tak aby dzialalo?
AK
Akurat wczytanie liczb co JEDYNE pasuje do main() / oczywiście można się doktoryzować, ale nie na poziomie początkujacym /
KL
Czyli najlepiej po prostu usunąć ten int boki i zostawic tak jak jest na gorze?
BO
  • Rejestracja:około 6 lat
  • Ostatnio:4 dni
  • Postów:214
1
Kopiuj
#include <iostream>


using namespace std;

int max(int a, int b, int c) 
{
    if (a > b)
    {
        if(a>c) return a;
    }
    else if (b > c) return b;
    return c;
}
bool trojka(int a, int b, int c)
 {
    int m = max(a, b, c);
    return 2 * m * m == a * a + b * b + c * c;
}

int main() 
{
    int a, b, c;
    cout << "-------------------------------------------------" << endl;
    cout << "Sprawdzam czy mozna zbudowac trojkat prostokatny!" << endl;
    cout << "-------------------------------------------------" << endl;
    cout << "Podaj bok A: ";
    cin >> a;
    cout << "Podaj bok B: ";
    cin >> b;
    cout << "Podaj bok C: ";
    cin >> c;

    if(trojka(a, b, c)) cout << "Z tych bokow mozna zbudowac trojkat prostokatny";
    else cout << "To nie jest trojkat prostokatny";
    return 0;
}

W swoim kodzie nie uwzględniałeś ,że użytkownik może podać boki w dowolnej kolejności. I nie dobry rozwiązaniem jest w funkcji ,która zwraca bool wypisanie ,bo albo zwraca true/false albo jest void i od razu wypisuje. Takie połączenie nie ma żadnego sensu.

edytowany 2x, ostatnio: Botek
Zobacz pozostałe 2 komentarze
KL
w jakim miejscu to zamiescic?
BO
To zależy co chcesz by się wydarzyło po wpisaniu liczby ujemnej.
KL
najpewniej zeby wypisalo jakis "error" czy cos w tym stylu, ze nie mozna uzyc liczby ujemnej
BO
No dobrze ,ale od razu po wpisaniu tej liczby czy po wpisaniu wszystkich? I co wtedy ma przerywać program czy poprosić jeszcze raz? Do tego drugiego potrzebna już jest pętla.
KL
W momencie kiedy uzytkownik wpisze liczbe ujemna i w sumie moze poprosic jeszcze raz (to zapewne moze petla do...while czy moze inna) I jeszcze w sumie jakbyś mogl spojrzec na ten kod co wkleje i powiedziec mi jak moge zmienic ta funkcje bool u siebie zeby to dzialalo jak u ciebie
KL
  • Rejestracja:około 5 lat
  • Ostatnio:około 4 lata
  • Postów:53
0
Kopiuj
#include <iostream>

using namespace std;

bool trojka(int a,int b,int c){
    if ( ((a*a)+(b*b))==(c*c)||((b*b)+(c*c))==(a*a)||((a*a)+(c*c))==(b*b) ) {
        cout<<"Z tych bokow mozna zbudowac trojkat prostokatny";
        return true;
    }
    cout << "To nie jest trojkat prostokatny";
    return false;
}


int main(int a,int b,int c) {
    cout << "-------------------------------------------------" << endl;
    cout << "Sprawdzam czy mozna zbudowac trojkat prostokatny!" << endl;
    cout << "-------------------------------------------------" << endl;
    cout <<"Podaj bok A: ";
    cin >> a;
    cout << "Podaj bok B: ";
    cin >> b;
    cout << "Podaj bok C: ";
    cin >> c;
    trojka(a,b,c);
    return 0;

}
KL
Jak dodać tutaj sprawdzenie czy liczba jest dodatnia i żeby poprosiło jeszcze raz o wpisanie liczb wtedy, gdy ktoś wpisze ujemną?
p_agon
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:96-230
  • Postów:953
0

Może coś takiego:

Kopiuj
if (a + b > c && b + c > a && c + a > b) {
            cout<<"TAK";
        } else {
            cout<<"NIE";
        }

Reasumując wszystkie aspekty kwintesencji tematu, dochodzę do fundamentalnej konkluzji: To by nic nie dało, nie dałoby nic! Przez 10 minut można, przy 2h to już jakaś zemsta pagona.
edytowany 1x, ostatnio: p_agon
Zobacz pozostałe 3 komentarze
p_agon
Ok, spoko. Wrzucaj gotowca.
BO
Już nawet jest. Bo autor podał swój kod i się starał. Był nawet dosyć blisko. I nagle wchodzisz ty i wrzucasz coś 30 kroków wstecz.
KL
Botek w momencie kiedy uzytkownik wpisze liczbe ujemna i w sumie moze poprosic jeszcze raz (to zapewne moze petla do...while czy moze inna) I jeszcze w sumie jakbyś mogl spojrzec na ten kod u gory zamieszczony przeze mnie i powiedziec mi jak moge zmienic ta funkcje bool u siebie zeby to dzialalo jak u ciebie
BO
Napiszę coś wieczorem. Bo teraz mam czas napisać tylko kilka słów.
KL
Oki, dziękuje za wszelką chęć pomocy i próbę wytłumaczenia.
KL
  • Rejestracja:około 5 lat
  • Ostatnio:około 4 lata
  • Postów:53
0
Kopiuj
#include <iostream>

using namespace std;

bool trojka(int a,int b,int c){
    if ( ((a*a)+(b*b))==(c*c)||((b*b)+(c*c))==(a*a)||((a*a)+(c*c))==(b*b) ) {
        cout<<"Z tych bokow mozna zbudowac trojkat prostokatny";
        return true;
    }
    cout << "To nie jest trojkat prostokatny";
    return false;
}


int main(int a,int b,int c) {
    cout << "-------------------------------------------------" << endl;
    cout << "Sprawdzam czy mozna zbudowac trojkat prostokatny!" << endl;
    cout << "-------------------------------------------------" << endl;
    if (a,b,c>=0){
    cout <<"Podaj bok A: ";
    cin >> a;
    cout << "Podaj bok B: ";
    cin >> b;
    cout << "Podaj bok C: ";
    cin >> c;
    }
    else{
        cout <<"Nie mozna podac liczby ujemnej" << endl;
    }
    trojka(a,b,c);
    return 0;

}

Nie dziala mi to sprawdzanie liczby ujemnej, jak to zmienic zeby, gdy wpisze liczbe ujemna wywalalo program, badz prosilo podac jeszcze raz boki?

Spine
  • Rejestracja:około 22 lata
  • Ostatnio:3 minuty
  • Postów:6694
0

pętla do ... while z odpowiednim warunkiem


🕹️⌨️🖥️🖱️🎮
Zobacz pozostałe 4 komentarze
AK
@Konrad Zarzecki mam Ci na plus, że pracujesz własnoręcznie (wielu błaga, żeby coś wyłudzić), ale na minus, że nie kartkowałeś choćby jakiejś książki do języka
KL
najwyrazniej bede musial jakas ogarnac ksiazke do jezyka
AK
nie da się ukryć :)
KL
if (a>=0||b>=0||c>=0) zrobilem taki warunek, tylko nadal nie wiem co zrobic zeby wyswietlalo mi to else jak wpisze liczbe ujemna, chyba, ze ten warunek ma byc po wpisaniu liczb przez uzytkownika
KL
O dalem po wpisaniu liczb przez uzytkownika i zaczelo dzialac i zmienilem operatory na && zamiast || bo wtedy tylko a dzialalo
plx211
  • Rejestracja:ponad 11 lat
  • Ostatnio:4 miesiące
  • Postów:181
0

Kompiluje ci się to?
Masz int main() w którym wywołujesz to?
int main(int a,int b,int c) {
bo ten main + if (a,b,c>=0){ wyglądają na błędny kod

edytowany 2x, ostatnio: plx211
Zobacz pozostałe 5 komentarzy
KL
No w sumie cos tam pisze, dzieki za info. Juz to zmieniam
plx211
An implementation shall not predefine themainfunction. This function shall not be overloaded. It shallhave a return type of typeint, but otherwise its type is implementation-defined. All implementations shallallow both— a function of() returning int and— a function of(int, pointer to pointer tochar) returning int
AK
No i pogłębiłem teorię
AK
@plx211: Jak już jesteś przy akcji, daj mi jakiś reading nt C0 (asemblerowa rozbiegówka do maina) - sto lat temu byłem z tego boski. Nie umiem sobie wykwerendować w google.
KL
  • Rejestracja:około 5 lat
  • Ostatnio:około 4 lata
  • Postów:53
0
Kopiuj
#include <iostream>

using namespace std;

bool trojka(int a,int b,int c){
    if ( ((a*a)+(b*b))==(c*c)||((b*b)+(c*c))==(a*a)||((a*a)+(c*c))==(b*b) ) {
        cout<<"Z tych bokow mozna zbudowac trojkat prostokatny";
        return true;
    }
    cout << "To nie jest trojkat prostokatny";
    return false;
}


int main() {
    int a,b,c;
    cout << "-------------------------------------------------" << endl;
    cout << "Sprawdzam czy mozna zbudowac trojkat prostokatny!" << endl;
    cout << "-------------------------------------------------" << endl;

    cout <<"Podaj bok A: ";
    cin >> a;
    cout << "Podaj bok B: ";
    cin >> b;
    cout << "Podaj bok C: ";
    cin >> c;
    if (a>=0&&b>=0&&c>=0){
    trojka(a,b,c);
    }
    else{
        cout <<"Nie mozna podac liczby ujemnej" << endl;
    }
    return 0;

}

Wszystko wydaje się, ze chyba dziala i jest okej, ale teraz pytanie czy funkcja bool jest dobrze zrobiona czy moze jakas ja zmienic zeby jej nie wywolywac jak void??

edytowany 1x, ostatnio: KingLoczek
TomaszLiMoon
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 4 godziny
  • Postów:530
0

czy funkcja bool jest dobrze zrobiona czy moze jakas ja zmienic zeby jej nie wywolywac jak void?

Przenieś operacje cout na zewnątrz funkcji i wykorzystaj zwracaną wartość.

Kopiuj
#include <iostream>

using namespace std;

inline bool isTriangleRectangle( int a , int b , int c )
{
    auto max = (a>b?(a>c?a:c):(b>c?b:c));
    return 2*max*max==(a*a+b*b+c*c);
}

int main()
{
    cout << "Triangle is " << (isTriangleRectangle(5,4,3)?"":"not") << " rectangular" << endl;
    return 0;
}
KL
a dalbys rade to pokazac na moim kodzie, bo nie chcialbym go juz jakos znaczaco zmieniac, a nie rozumiem jak to przeksztalcic na moj kod?
TomaszLiMoon
Podmieniasz funkcję isTriangleRectangle w main na trojka i usuwasz ze swojej funkcji wszystkie linie z cout. Jeszcze tylko małe tłumaczenie na język polski i gotowe.
kq
To jest "right triangle" po angielsku.
KL
  • Rejestracja:około 5 lat
  • Ostatnio:około 4 lata
  • Postów:53
1

Dziękuje wszystkich za wszelką pomoc!!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.