Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Najwieksze mozliwe pole prostokata o danym obwodzie - zadanie c++

Ostatnio zmodyfikowano 2016-03-25 02:56
Autor Wiadomość
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.

C/C++
#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;
   
}
P-146537
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.
P-146538
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.

C/C++
#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;
   
}
P-146539
Gibas11
» 2016-03-25 01:50:13
Nie mam weny na pisanie (może jutro), ale te dwa linki i trochę wiedzy z pierwszej klasy liceum wystarczą.
1. http://matematyka.pisz.pl​/strona/1395.html
2. http://www.matematyka.pl​/9111.htm <- Tylko pierwsza odpowiedź
P-146540
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?
P-146541
Gibas11
» 2016-03-25 02:01:50
To wszystko jest do policzenia. ;) Tu jest to z czym skończyłem:
C/C++
#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:
C/C++
#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.
P-146542
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.
C/C++
#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.
C/C++
#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.
C/C++
#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.
C/C++
#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.
P-146543
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
P-146544
« 1 » 2
  Strona 1 z 2 Następna strona