Heron,funkcje, cpp

JarTSW
Użytkownik
Użytkownik
Posty: 414
Rejestracja: 15 mar 2007, o 15:15
Płeć: Mężczyzna
Lokalizacja: C:/WINDOWS/pulpit
Podziękował: 104 razy
Pomógł: 11 razy

Heron,funkcje, cpp

Post 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");
}
Awatar użytkownika
Sylwek
Użytkownik
Użytkownik
Posty: 2716
Rejestracja: 21 maja 2007, o 14:24
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 160 razy
Pomógł: 657 razy

Heron,funkcje, cpp

Post 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
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

Heron,funkcje, cpp

Post autor: Rafal88K »

Z tym double to chodzi o funkcje sqrt().
JarTSW
Użytkownik
Użytkownik
Posty: 414
Rejestracja: 15 mar 2007, o 15:15
Płeć: Mężczyzna
Lokalizacja: C:/WINDOWS/pulpit
Podziękował: 104 razy
Pomógł: 11 razy

Heron,funkcje, cpp

Post 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 (:
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

Heron,funkcje, cpp

Post 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;
JarTSW
Użytkownik
Użytkownik
Posty: 414
Rejestracja: 15 mar 2007, o 15:15
Płeć: Mężczyzna
Lokalizacja: C:/WINDOWS/pulpit
Podziękował: 104 razy
Pomógł: 11 razy

Heron,funkcje, cpp

Post 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.
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

Heron,funkcje, cpp

Post 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;
}
JarTSW
Użytkownik
Użytkownik
Posty: 414
Rejestracja: 15 mar 2007, o 15:15
Płeć: Mężczyzna
Lokalizacja: C:/WINDOWS/pulpit
Podziękował: 104 razy
Pomógł: 11 razy

Heron,funkcje, cpp

Post autor: JarTSW »

Lekko zmodyfikowany?
A w czym sie rozni od mojego (oprocz struktury)?
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

Heron,funkcje, cpp

Post 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.
JarTSW
Użytkownik
Użytkownik
Posty: 414
Rejestracja: 15 mar 2007, o 15:15
Płeć: Mężczyzna
Lokalizacja: C:/WINDOWS/pulpit
Podziękował: 104 razy
Pomógł: 11 razy

Heron,funkcje, cpp

Post 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?
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

Heron,funkcje, cpp

Post 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
ODPOWIEDZ