[C++] Budowanie trójkąta z odcinków

magda87
Użytkownik
Użytkownik
Posty: 97
Rejestracja: 1 sty 2013, o 17:48
Płeć: Kobieta
Lokalizacja: pomorze
Podziękował: 6 razy

[C++] Budowanie trójkąta z odcinków

Post autor: magda87 »

Witam,
dostałam do napisania taki oto program w C++:

Napisz program sprawdzający, czy z podanych odcinków o długościach podanych przez użytkownika da się zbudować trójkąt (czy suma długości dwóch boków jest większa od trzeciego), a jeśli tak, to czy jest on prostokątny (czy dla boków \(\displaystyle{ a, b, c: a ^{2} + b ^{2} = c ^{2}}\)). Dla sprawdzenia każdego z warunków uzyć funkcji.

Mam problem z zadeklarowaniem funkcji, nie bardzo wiem od czego zacząć. Będę wdzięczna za jakieś wskazówki.

Pozdrawiam
Ostatnio zmieniony 20 mar 2013, o 22:55 przez Afish, łącznie zmieniany 1 raz.
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania.
szw1710

[C++] Budowanie trójkąta z odcinków

Post autor: szw1710 »

Technicznie się nie znam na \(\displaystyle{ C}\). Ale najpierw uporządkowałbym liczby \(\displaystyle{ a,b,c}\) rosnąco. Potem sprawdziłbym warunek \(\displaystyle{ c<a+b}\) i wreszcie \(\displaystyle{ c^2=a^2+b^2}\).
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[C++] Budowanie trójkąta z odcinków

Post autor: Ser Cubus »

int - typ całkowity
double - typ zmiennoprzecinkowy

ja użyję int

Kod: Zaznacz cały

int czy_trojkat(int a, int b, int c)
{
     if( c < a+b) return 1;
     else return 0;
}
int czy_prostokatny(int a, int b, int c)
{
     if( a^2 + b^2 = c^2) return 1;
     else return 0;
}

int main()
{
int tab[3];
cout << "Podaj dlugosci 3 bokow: ";

for( int i = 0 ; i < 3 ; i++)
     cin >> tab[i];

... // posortuj bobelkowo (google)
if( czy_trojkat(tab[0], tab[1], tab[2]))
{
      cout << "mozna zbudowac trojkat";
      if ( czy_prostokatny(tab[0], tab[1], tab[2]))
           cout << "trojkat jest prostokatny";
}
...
}
m-2
Użytkownik
Użytkownik
Posty: 55
Rejestracja: 4 maja 2011, o 13:37
Płeć: Mężczyzna
Podziękował: 2 razy
Pomógł: 14 razy

[C++] Budowanie trójkąta z odcinków

Post autor: m-2 »

Ser Cubus pisze:

Kod: Zaznacz cały

     if( a^2 + b^2 = c^2) return 1;
 
No chyba nie. ^ to bitowy XOR.
arcan
Użytkownik
Użytkownik
Posty: 106
Rejestracja: 17 gru 2012, o 23:56
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 7 razy
Pomógł: 31 razy

[C++] Budowanie trójkąta z odcinków

Post autor: arcan »

Zamysł dobry, ale sortowanie tu nie jest potrzebne. Wystarczy maksymalna wartość a ją trochę łatwiej zaimplementować od booble sort. Błąd też przy ^. Aha i najlepiej takie coś:

Kod: Zaznacz cały

int czy_trojkat(int a, int b, int c)
{
     if( c < a+b) return 1;
     else return 0;
}
int czy_prostokatny(int a, int b, int c)
{
     if( a^2 + b^2 = c^2) return 1;
     else return 0;
}
nie zapisywać jako zmienną 32 bitową a jako 1 bitową (typ bool), bo przyjmuje tylko wartość true/false.
m-2
Użytkownik
Użytkownik
Posty: 55
Rejestracja: 4 maja 2011, o 13:37
Płeć: Mężczyzna
Podziękował: 2 razy
Pomógł: 14 razy

[C++] Budowanie trójkąta z odcinków

Post autor: m-2 »

@arcan
bool zajmuje jeden bajt
Awatar użytkownika
MichalPWr
Użytkownik
Użytkownik
Posty: 1625
Rejestracja: 29 wrz 2010, o 15:55
Płeć: Mężczyzna
Lokalizacja: Leszno
Podziękował: 7 razy
Pomógł: 387 razy

[C++] Budowanie trójkąta z odcinków

Post autor: MichalPWr »

Nie czytałem polecanie, ani nie wczytywałem się w kod, ale

Kod: Zaznacz cały

if( a^2 + b^2 = c^2) return 1;
nie widzisz tutaj błędu?

Poza tym, w typie logicznym w C++ używamy true i false, a nie 0 i 1. Widać takie pomieszanie C i C++.
magda87
Użytkownik
Użytkownik
Posty: 97
Rejestracja: 1 sty 2013, o 17:48
Płeć: Kobieta
Lokalizacja: pomorze
Podziękował: 6 razy

[C++] Budowanie trójkąta z odcinków

Post autor: magda87 »

No własnie juz przy tym warunku jest problem z programem, nie chce dzialac, warunki beda trzy na istnienie trojkata, ale nie wiem jak to zapisac w formie funkcji. Jakiej zmiennej uzyc, double i int nie pasują w tym wypadku. Program zglasza błąd w momencie kiedy chce sprawdzić czy istnieje trójkąt prostokątny.
Awatar użytkownika
MichalPWr
Użytkownik
Użytkownik
Posty: 1625
Rejestracja: 29 wrz 2010, o 15:55
Płeć: Mężczyzna
Lokalizacja: Leszno
Podziękował: 7 razy
Pomógł: 387 razy

[C++] Budowanie trójkąta z odcinków

Post autor: MichalPWr »

magda87, Może inaczej. Napisz swój program, możesz się wzorować na ww. propozycjach. Według mnie program należy zrobić na double ew. float, no chyba, że w specyfikacji było że ma śmigać na int-ach. Jak już zrobisz swój program to pokaż go nam oraz koniecznie napisz jakiego kompilatora używasz i jakie błędy Ci wyrzuca.
magda87
Użytkownik
Użytkownik
Posty: 97
Rejestracja: 1 sty 2013, o 17:48
Płeć: Kobieta
Lokalizacja: pomorze
Podziękował: 6 razy

[C++] Budowanie trójkąta z odcinków

Post autor: magda87 »

Korzystam z Dev-C++ 5.2.0.2. Na ten moment mam tyle, i to jest wg kompilatora dobrze napisane, wszystkie warunki sprawdza, ale nie wiem jak sie zabrać za warunek dotyczący tego czy trójkąt jest prostokątny. Jesli chce skorzystac ze zmiennej float, double czy int to wyskakuje błąd : _CRTIMP double _cdecl pow ( double, double) dla funkcji pow lub gdy korzystam z operatora ^ krzyczy ze nie pasuje on do zmiennych tego typu.

Kod: Zaznacz cały

#include <iostream>
#include <math.h>
using namespace std;
int czy_trojkat ( int a, int b, int c)
{
	if( a + b>c || a+c> b || b+c>a)
	return 1;
	else
	return 0;
}


int main()
{
int a,b,c;

cout<<"podaj a:"<< endl;
cin>>a;
cout<<"podaj b:"<< endl;
cin>>b;
cout<<"podaj c:"<< endl;
cin>>c;
if( a + b>c || a+c> b || b+c>a)
{
	cout<<"trojkat istnieje"<< endl;
	
}
else
{
	cout<< "nie mozna zbudowac trojkata"<< endl;
}
if (pow(a,2) + pow(b,2) = pow(c,2)) // tutaj wyskakuje błąd  [b]_CRTIMP double _cdecl pow (double, double)[/b]
	{
	cout<< "trojkat jest prostokatny"<< endl;
		}
		else
		{
		cout<<"trojkat nie jest prostokatny"<< endl;	
			}
return 0;
}
-- 20 mar 2013, o 17:17 --

chyba coś przesadziłam z warunkami na istnienie trójkąta, wystraczylby jeden. Jeśli mam trzy to obojetnie co bym nie wpisala po uruchomieniu programu, to podaje mi ze trojkąt istnieje

chyba wystraczy tylko

Kod: Zaznacz cały

if ( a+b>c)
-- 20 mar 2013, o 17:46 --

nie to nie tak beda trzy warunki tyle że zamiast operatora \(\displaystyle{ lub}\) trzeba użyc operatora \(\displaystyle{ i}\):

Kod: Zaznacz cały

if( a + b>c && a+c> b && b+c>a)
zarówno w zapisie funkcji jak i w programie właściwym
Ostatnio zmieniony 20 mar 2013, o 22:56 przez Afish, łącznie zmieniany 1 raz.
Powód: Stosuj tagi code.
witekkq
Użytkownik
Użytkownik
Posty: 145
Rejestracja: 16 lis 2007, o 09:06
Płeć: Mężczyzna
Lokalizacja: Gniezno
Podziękował: 2 razy
Pomógł: 27 razy

[C++] Budowanie trójkąta z odcinków

Post autor: witekkq »

Popraw na:

Kod: Zaznacz cały

 (pow(a,2) + pow(b,2) == pow(c,2))
W C/C++ znak = jest operatorem przypisania, natomiast znak == jest operatorem porównania (dla zdefiniowanych typów).
magda87
Użytkownik
Użytkownik
Posty: 97
Rejestracja: 1 sty 2013, o 17:48
Płeć: Kobieta
Lokalizacja: pomorze
Podziękował: 6 razy

[C++] Budowanie trójkąta z odcinków

Post autor: magda87 »

Tak wiem, pomyłka:)

Napisałam taki program, może go ktoś sprawdzić? Niby działa ale chcę sę upewnić, że jest dobrze napisany:

Kod: Zaznacz cały

#include <iostream>
#include <cstdlib>
#include <math.h>
using namespace std;
float czy_trojkat ( float a, float b, float c)
{
	if( a + b>c && a+c> b && b+c>a)
	return 1;
	else
	return 0;
}
float czy_prostokatny ( float a, float b, float c)
{
	if (a*a + b*b == c*c || a*a + c*c == b*b || b*b + c*c == a*a)
	return 1;
	else 
	return 0;
}


int main()
{
float a,b,c;

cout<<"podaj a:"<< endl;
cin>>a;
cout<<"podaj b:"<< endl;
cin>>b;
cout<<"podaj c:"<< endl;
cin>>c;
	if( a + b>c && a+c> b && b+c>a)
{
	cout<<"trojkat istnieje"<< endl;
	
}
else
{
	cout<< "nie mozna zbudowac trojkata"<< endl;
}
	if (a*a + b*b == c*c || a*a + c*c == b*b || b*b + c*c == a*a)
	{
	cout<< "trojkat jest prostokatny"<< endl;
		}
		else
		{
		cout<<"trojkat nie jest prostokatny"<< endl;	
			}

return 0;
}
szw1710

[C++] Budowanie trójkąta z odcinków

Post autor: szw1710 »

Ze mnie taki ekspert programistyczny jak nie powiem co. Ale przypatrując się temu wszystkiemu obserwuję stały przyrost linii kodu. Czy to nie przesada, aby tak trywialny problem rozwiązywać tak długim programem?
Awatar użytkownika
Althorion
Użytkownik
Użytkownik
Posty: 4541
Rejestracja: 5 kwie 2009, o 18:54
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 9 razy
Pomógł: 662 razy

[C++] Budowanie trójkąta z odcinków

Post autor: Althorion »

1. Nie ma powodu, by funkcje czy_trojkat oraz czy_prostokatny zwracały liczbę zmiennoprzecinkową, typ logiczny (bool) jest dla nich idealny.
2. Po co Ci te funkcje, skoro z nich nie korzystasz? Powtarzasz te warunki w kodzie programu.
3. Po co Ci biblioteki cmath i cstdlib?
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[C++] Budowanie trójkąta z odcinków

Post autor: Ser Cubus »

Kod: Zaznacz cały

if( a + b>c && a+c> b && b+c>a)
tutaj chyba powinna być alternatywa ||

używaj boola w funkcjach, lub int jeżeli wydaje Ci się łatwiejsze

i korszytaj z funkcji
ODPOWIEDZ