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:
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:
Na Twoim miejscu zrobiłbym tak:
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:
zamieniłem na:
Kod: Zaznacz cały
int pom=pole(a,b,c,p);
pole2=sqrt(pom);
cout<<pole2<<endl;
Na:
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