Najwieksze mozliwe pole prostokata o danym obwodzie - zadanie c++
Ostatnio zmodyfikowano 2016-03-25 02:56
jokker110 Temat założony przez niniejszego użytkownika |
Najwieksze mozliwe pole prostokata o danym obwodzie - zadanie c++ » 2016-03-25 01:29:41 Czesc! Chcialbym wykonac program, ktory po wczytaniu przez uzytkownika obwodu prostokata oblicza najwieksze mozliwe pole jakie moze miec ten prostokat. Z matematycznego punktu widzenia jest to dosyc proste, mamy wzor funckji kwadratowej, znajac wspolczynniki mozemy obliczyc max p ze wzoru p=-b/2a. Da sie to tak zrobic w c++? Zrobilem program ktory wylicza takie pole korzystajac z tego, ze wykresem funkcji kwadratowej jest parabola, a wiec dopoki pole wzrasta petla sie wykonuje, w momencie pierwszego zmniejszenia sie pola - petla sie konczy (patrz kod zrodlowy). Niestety program nie dziala do konca dobrze. O ile dla o=40 znajdzie max p, to dla o=4 juz nie bardzo. Jezeli nie da sie tego obliczyc tego wspolczynnikami to proszę o pomoc w ulepszeniu poniższego kodu, tak aby program dzialal prawidlowo. Z gory dziekuje za pomoc. #include <iostream> using namespace std; int main() { int a, b, m, n = 0, i, o; cout << "Podaj obwod prostokata: "; cin >> o; a = o / 2 - 1; for( i = a; i > 0; i-- ) { b =( o / 2 ) - i; m = i * b; if( m > n ) n = m; else break; } i++; b--; cout << "\nNajwieksze mozliwe pole prostokatu o obwodzie = " << o << " wynosi: " << i * b; }
|
|
Gibas11 |
» 2016-03-25 01:33:28 A to nie powinien być zawsze kwadrat? Czyli największe pole to ( o / 4 ) *( o / 4 ) . Chyba, że o czymś nie wiem. |
|
jokker110 Temat założony przez niniejszego użytkownika |
» 2016-03-25 01:39:49 Tak, ale chodzi mi ogolnie o znalezienie max p dla funkcji kwadratowej, nie biorac pod uwage tej zaleznosci //edit Inta zamienilem na floata, wynik jest bardziej dokladny, ale to wciaz nie jest dokladny wynik, ktory mozna otrzymac za pomoca wzoru p=-b/2a. #include <iostream> using namespace std; int main() { float a, b, m, n = 0, i, o; cout << "Podaj obwod prostokata: "; cin >> o; a = o / 2 - 1; for( i = a; i > 0; i = i - 0.01 ) { b =( o / 2 ) - i; m = i * b; if( m > n ) n = m; else break; } i = i + 0.01; b = b - 0.01; cout << "\nNajwieksze mozliwe pole prostokatu o obwodzie = " << o << " wynosi: " << i * b; }
|
|
Gibas11 |
» 2016-03-25 01:50:13 |
|
jokker110 Temat założony przez niniejszego użytkownika |
» 2016-03-25 01:54:47 O wzorach do ktorych link mi podales mowie na samym poczatku tematu, ale jak moge je wykorzystac znajac jedynie obwod, a nie wklepujac z klawiatury wspolczynnikow funkcji kwadratowej?
|
|
Gibas11 |
» 2016-03-25 02:01:50 To wszystko jest do policzenia. ;) Tu jest to z czym skończyłem: #include <iostream> using namespace std;
int main() { double obwod; cin >> obwod; double x = obwod / 4.0; cout << x << endl; return 0; }
A tu bardziej zrozumiała wersja: #include <iostream> using namespace std;
int main() { double obwod; cin >> obwod; double a = - 1; double b = obwod / 2.0; double x = - b /( 2 * a ); cout << x << endl; return 0; }
EDIT: Prawda jest taka, że przekształcając ten wzór po prostu dochodzisz do tego co miałem na początku, mogę Ci to potem pokazać etapowo. |
|
Gibas11 |
» 2016-03-25 02:08:00 Ok, dla porządku nowa wiadomość. 1. Pierwotny kod, coś takiego skleciłbyś na kartce papieru starając się to wyliczyć bez komputera. #include <iostream> using namespace std;
int main() { double obwod; cin >> obwod; double a = - 1; double b = obwod / 2.0; double int x = - b /( 2 * a ); cout << x << endl; return 0; }
Po prostu wyliczamy interesującą nas współrzędną najoczywistszą metodą. 2. Pozbywamy się zmiennych a i b, ponieważ i tak są używane tylko raz. #include <iostream> using namespace std;
int main() { double obwod; cin >> obwod; double x = -( obwod / 2.0 ) /( - 2 ); cout << x << endl; return 0; }
3. Usuwamy zbędne minusy i nawiasy. #include <iostream> using namespace std;
int main() { double obwod; cin >> obwod; double x = obwod / 2.0 / 2; cout << x << endl; return 0; }
4. Wyliczamy do końca. #include <iostream> using namespace std;
int main() { double obwod; cin >> obwod; double x = obwod / 4.0; cout << x << endl; return 0; }
Więc to koniec końców ten sam kod. Jedno wynika z drugiego i po prostu szukasz rozwiązania na około nie będąc w stanie uniknąć tej własności prostokątów. |
|
jokker110 Temat założony przez niniejszego użytkownika |
» 2016-03-25 02:13:33 Wybacz jesli swoimi oznaczeniami Cie zmylilem. U mnie w kodzie a i b odpowiadaja za boki prostokata, natomiast wzor p=-b/2a odnosi sie do wspolczynnikow funckji ax^2+bx+c.
Wzor na pole prostokatu o obwodzie 40 i bokach x,y wynosi: y^2+20y, gdyz
2x+2y=40 x+y=20
x=20-y
p=y(20-y)=-y^2+20y
-y^2+20y to wzor funkcji kwadratowej o wspolczynnikach: a=-1 b=20 c=0
p=-b/2a=-20/-2=10 |
|
« 1 » 2 |