Strona 1 z 1

Heron,funkcje, cpp

: 23 wrz 2007, o 21:37
autor: JarTSW
Ja dalej jestem na edukowaniu sie c++, obecnie na etapie i funkcji, i napotkalem na taki blad, ze w tym programie pole jest obliczane nieprawidlowo, Moglby ktos rzucic okiem?

Kod: Zaznacz cały

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;

int pole (int a,int b,int c,int p)
{
p=(a+b+c)/2;
return p*(p-a)*(p-b)*(p-b);
}


int main()
{
    int a,b,c,pom,p,pole2;
    cout<<"HERONIK"<<endl;
    cout<<"Podaj pierwszy z bokow trojkata"<<endl;
    cin>>a;
    cout<<"Podaj drugi z bokow trojkata"<<endl;
    cin>>b;
    cout<<"Podaj trzeci z bokow trojkata"<<endl;
    cin>>c;
    if (a+b>c && a+c>b && b+c>a)
    {
              cout<<"Mozna utworzyc trojkat i bedzie on "<<endl;
              if (a==b && b==c && a==c) cout<<"ROWNOBOCZNY"<<endl;
              else if ((a==b || b==c || a==c) && (a!=b || b!=c || a!=c)) cout<<"ROWNORAMIENNY"<<endl;
              else cout<<"ROZNOBOCZNY"<<endl;        
    }
    else cout<<"Nie mozna utworzyc trojkata"<<endl;         
    cout<<" a jego pole to ";
    pom=pole(a,b,c,p);
    pole2=sqrt(pom);
    cout<<pole2<<endl;
    cout<<endl;
    system("PAUSE");
}

Heron,funkcje, cpp

: 23 wrz 2007, o 21:48
autor: Sylwek
Po pierwsze, mi w Dev-C++ nie chciało skompilować, pomogła zamiana wszystkich typów danych z "int" na "double".

Po drugie:
JarTSW pisze:return p*(p-a)*(p-b)*(p-b);
tam powinno być p-c i wychodzi wszystko ładnie

Wypadałoby jeszcze dopracować, co się stanie, gdy wprowadzimy np. za długości boków 10, 20, 40, bo program pokazuje, że nie można zbudować z tego trójkąta, ale mimo to oblicza jego pole

Heron,funkcje, cpp

: 23 wrz 2007, o 22:25
autor: Rafal88K
Z tym double to chodzi o funkcje sqrt().

Heron,funkcje, cpp

: 24 wrz 2007, o 17:11
autor: JarTSW
Dalem testowo drugi raz b, bo jak dalem co, to wywalalo, ze za duzo argumentow dla tej funkcji...

[ Dodano: 24 Września 2007, 21:30 ]
Działa (: dzieki

[ Dodano: 24 Września 2007, 22:10 ]
Sylwek pisze:Wypadałoby jeszcze dopracować, co się stanie, gdy wprowadzimy np. za długości boków 10, 20, 40
Wystarczy wrzucic kilka linijek wyzej obliczenia, co nie jest problemem. Glownie chodzilo mi, zeby dobrze liczylo (:

Heron,funkcje, cpp

: 25 wrz 2007, o 17:34
autor: Rafal88K
JarTSW mam pytanie gdzie jest przypisanie czegoś do zmiennej \(\displaystyle{ p}\)? Nie możesz zrobić tak:

Kod: Zaznacz cały

pom=pole(a,b,c,p); 
Ponieważ przy inicjalizacji nic nie podstawiłeś do p i później też nie przypisywałeś nic do tej zmiennej i zawiera ona jakieś "śmieci", a po co ona w ogóle jest? Nie lepiej w funkcji pole zrobić tak:

Kod: Zaznacz cały

double p=(a+b+c)/2;
Na Twoim miejscu zrobiłbym tak:

Kod: Zaznacz cały

cout << sqrt(pole(a,b,c)) << endl;

Heron,funkcje, cpp

: 25 wrz 2007, o 21:06
autor: JarTSW
Na Twoim miejscu zrobiłbym tak:
Kod:
cout
Próbowalem, ale chyba wywalało mi jakis bladzik.

[ Dodano: 25 Września 2007, 22:25 ]
Wyskrobalem cos takiego:

Kod: Zaznacz cały

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;

int pole (int a,int b,int c,int p)
{
    p=(a+b+c)/2;
    return p*(p-a)*(p-b)*(p-c);
}

int main ()
{
    char odp,t;
    do
    {
    int a,b,c,p,pole2,pom;
    cout<<"Heron"<<endl;
    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 && c+b>a)
    {
              cout<<"Mozna utworzyc trojkata i bedzie on ";
              if (a==b && a==c && b==c) cout<<" rownoboczny, a jego pole to ";
              else if (a==b && a==c && b==c) cout<<" rownoramienny, a jego pole to ";
              else cout<<" roznoboczny, a jego pole to ";
              int pom=pole(a,b,c,p);
              pole2=sqrt(pom);
              cout<<pole2<<endl;  
              cout<<"Powtorzyc? (t/n)"<<endl;
              cin>>odp;           
    }
    else  
    {
         cout<<"Nie mozna utworzyc trojkata"<<endl;
         cout<<"Powtorzyc? (t/n)"<<endl;
         cin>>odp;
    }
    } while (odp=='t');
    system("PAUSE");
}
Czekam na uwagi.

Heron,funkcje, cpp

: 25 wrz 2007, o 23:38
autor: Rafal88K
Coś pokręciłeś ;) poniżej podaje Twój lekko zmodyfikowany kod:

Kod: Zaznacz cały

#include<iostream>
#include<cmath>
using namespace std;

float pole (const float& a, const float& b, const float& c)
{
    float p = (a+b+c) / 2;
    return p*(p-a)*(p-b)*(p-c);
}

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

	try
	{
		do
		{
			cout << "Heron" << endl;

			cout << "Podaj a: ";
			if(!(cin >> a))
				throw exception();

			cout << "Podaj b: ";
			if(!(cin >> b))
				throw exception();

			cout << "Podaj c: ";
			if(!(cin >> c))
				throw exception();

			if((a + b > c) && (a + c > b) && (c + b > a))
			{
				cout << "Mozna utworzyc trojkata i bedzie on ";

				if ((a == b) && (a == c) && (b == c))
					cout << " rownoboczny, a jego pole to ";
				else if ((a == b) && (a == c) && (b == c))
					cout << " rownoramienny, a jego pole to ";
				else
					cout << " roznoboczny, a jego pole to ";

				cout << sqrt(pole(a, b, c)) << endl;
				cout << "Powtorzyc? (t/n): ";
				cin >> odp;           
			}
			else 
			{
				cout << "Nie mozna utworzyc trojkata" << endl;
				cout << "Powtorzyc? (t/n): ";
				cin >> odp;
			}
		} while(odp == 't');
	} catch(exception e)
	{
			cerr << "Wystapil wyjatek." << endl;
	}

	cout << endl;
    system("pause");
	return 0;
}

Heron,funkcje, cpp

: 26 wrz 2007, o 18:47
autor: JarTSW
Lekko zmodyfikowany?
A w czym sie rozni od mojego (oprocz struktury)?

Heron,funkcje, cpp

: 26 wrz 2007, o 20:00
autor: Rafal88K
Jest kilka rzeczy, które zmieniłem:
1. Moja wersja działa poprawnie
2. Dodałem obsługę wyjątków
3. Spójrz na poniższe kody:

Kod: Zaznacz cały

char odp,t; 
int a,b,c,p,pole2,pom;
zamieniłem na:

Kod: Zaznacz cały

float a, b, c;
char odp;

Kod: Zaznacz cały

 int pom=pole(a,b,c,p);
            pole2=sqrt(pom);
              cout<<pole2<<endl;
Na:

Kod: Zaznacz cały

cout << sqrt(pole(a, b, c)) << endl;
Następnie:

Kod: Zaznacz cały

int pole (int a,int b,int c,int p)
{
    p=(a+b+c)/2;
    return p*(p-a)*(p-b)*(p-c);
} 
Na taki kod:

Kod: Zaznacz cały

float pole (const float& a, const float& b, const float& c)
{
    float p = (a+b+c) / 2;
    return p*(p-a)*(p-b)*(p-c);
} 
4. Nie wiem po co dodawałeś nagłówek: skoro i tak z niego nie korzystałeś.

Więc jednak kod jest trochę zmodyfikowany.

Heron,funkcje, cpp

: 26 wrz 2007, o 20:11
autor: JarTSW
Rafal88K pisze:4. Nie wiem po co dodawałeś nagłówek: skoro i tak z niego nie korzystałeś.
Kopiowalem z innego programu, ktory wczesniej pisalem. A czy nadmiar bibloitek ma ja jakies negatywne znaczenie?

Heron,funkcje, cpp

: 26 wrz 2007, o 20:25
autor: Rafal88K
Nie wpływa on negatywnie ale powinieneś się zdecydować, z której biblioteki chcesz korzystać w stylu c czy w stylu c++. Jest kilka różnice między tymi bibliotekami, a tym możesz poczytać w necie. Natomiast najważniejsza moim zdaniem różnica jest taka, żę w nie możesz ładnie w wczytywać i wypisywać obiektów zdefiniowanych przez siebie, natomiast w masz przeładowanie (przeciążenie) operatorów >> i