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 » 23 wrz 2007, o 21:37

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
Gość Specjalny
Gość Specjalny
Posty: 2711
Rejestracja: 21 maja 2007, o 14:24
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 155 razy
Pomógł: 654 razy

Heron,funkcje, cpp

Post autor: Sylwek » 23 wrz 2007, o 21:48

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 » 23 wrz 2007, o 22:25

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 » 24 wrz 2007, o 17:11

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 » 25 wrz 2007, o 17:34

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 » 25 wrz 2007, o 21:06

[quote]Na Twoim miejscu zrobiłbym tak:
Kod:
cout [/quote]

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 » 25 wrz 2007, o 23:38

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 » 26 wrz 2007, o 18:47

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 » 26 wrz 2007, o 20:00

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 » 26 wrz 2007, o 20:11

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 » 26 wrz 2007, o 20:25

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