Strona 1 z 2

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

: 19 mar 2013, o 22:01
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

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

: 19 mar 2013, o 22:03
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}\).

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

: 19 mar 2013, o 22:08
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";
}
...
}

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

: 19 mar 2013, o 23:22
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.

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

: 20 mar 2013, o 06:15
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.

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

: 20 mar 2013, o 10:22
autor: m-2
@arcan
bool zajmuje jeden bajt

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

: 20 mar 2013, o 10:43
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++.

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

: 20 mar 2013, o 16:25
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.

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

: 20 mar 2013, o 16:33
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.

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

: 20 mar 2013, o 17:00
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

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

: 20 mar 2013, o 18:35
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).

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

: 20 mar 2013, o 18:57
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;
}

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

: 20 mar 2013, o 19:17
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?

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

: 20 mar 2013, o 20:11
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?

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

: 20 mar 2013, o 20:18
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