Program do obliczania momentów bezwładności.

0

Witam, jestem studentem pierwszego roku automatyki i robotyki. W moim planie zajęć w tym semestrze pojawił się wspaniały przedmiot jakim jest 'Podstawy programowania'. Zaliczenie tego przedmiotu składa się z napisania kolokwium i oddania projektu. Kolokwium zaliczyłem, zostało przede mną oddanie projektu. Jako, że chciałem wybrać coś zgodnego z moim kierunkiem studiów wybrałem sobie nieszczęśliwie napisanie programu do obliczania momentów bezwładności figur płaskich. Początkowo wydawał mi się to wspaniały i prosty do zrealizowania pomysł, jednak gdy przystąpiłem do zadania okazało się, że nie wiem jak się za to zabrać. Myślę, że jest tu pare osób dla których napisanie takiego programu to pestka, dlatego tworzę ten temat z prośbą o pomoc. Jak się za to zabrać?
Program ma być prosty - działać w konsoli. Może ma ktoś jakiś program podobny, (np do liczenia środków ciężkości) który mógłbym przerobić na własne potrzeby?

Z góry dziękuje za pomoc .
J

0

A z czym konkretnie masz problem?

0

Tak ogólnie to brakuje mi pomysłu na ten program, czyli w jaki sposób to ogarnąć, żeby to działało. Nigdy wcześniej nie miałem styczności z programowaniem i jest to dla mnie niemałe wyzwanie. Generalnie wzory do obliczania środka ciężkości, a później momentu bezwładności nie są problemem. Brakuje mi pomysłu w jaki sposób w konsoli ustalić układ współrzędnych, według którego będzie to liczone. Planuje podzielić program na funkcje: liczenie dla koła , trójkąta, kwadratu i z 3 dodatkowe do liczenia złożeń tych figur.

Myślałem żeby wygenerować tablice i pętle żeby sprawdzało czy dany punkt w tablicy jest środkiem cięzkości. Dałoby się tak ?

0

Jeśli to twój pierwszy program, to może być za duży dla ciebie.
Jeśli jeśli masz troszkę oleju w głowie to dasz radę.

  • po pierwsze zdecyduj się jakie dane będziesz dostarczał programowi. Pojedynczy wielokąt powinien wystarczeć, podawałbyś go w postaci tekstowej (współrzędne wieżchołków) do standardowego wejścia.
  • zdecyduj jak co dokładnie chcesz policzyć. Możliwe że jako wynik powinieneś podać środek ciężkości i moment bezwładności względem tego punktu (wtedy łatwo przeliczyć to do dowolnie innego punktu: twierdzenie Steinera)
  • jak chcesz to liczyć? Całkowanie r2 po polu powierzchni wielokąta, to dość trudne zadanie. Może powinieneś się ograniczyć do figur ze znanymi analitycznymi wzorami na moment bezwładności!
0

Dokładnie taki jest plan, opcję z całkowaniem odrzucam od razu. Facet zaproponował mi to ale to by był skok na głęboką wodę. Myślałem nad generowaniem tablicy, której 1 wiersz i 1 kolumna byłaby układem współrzędnych a figury zajmowałyby określony wymiar względem tego układu współrzędnych. Później odpaliłbym pentlę, która będzie wyszukiwała punktu w tej tablicy odpowiadającemu środkowi ciężkości tej figury i na podstawie tego wyniku program dokonywałby obliczeń tego momentu korzystając ze wzorów.

Jest szansa tego dokonać ?

p.s
Oczywiście nie jest to mój pierwszy kontakt z c++. Mam za sobą pół roku laboratoriów z których będę miał egzamin także gość nie olewa tematu i ostro nas ciśnie. Napisałem już z 30 pomniejszych programów, ale tak dużego projektu jeszcze nie robiłem.

0

Długo się nie odzywałem w związku z licznymi zaliczeniami na studiach. O to aktualna wersja programu. Przy próbie kompilacji wyskakuje mi błąd w funkcji liczącej moment dla trójkąta a dokładnie w lini liczącej jego pole "s=(sqrt((a+b+c)(a+b-c)(a-b+c)(b+c-a)))/4;" nie rozumiem co jest nie tak. Codeblocks wyrzuca mi haslo

error: '((a+b)+c) cannot be used as a function.
. Kolejnym krokiem jest dodanie osobnego menu programu który pyta czy do policzonego już momentu dodac nastepną figurę. Wykładowca w ten sposób zaproponował mi wykonanie czesci zadania o złożeniach figur. A co wy o tym myślicie ?

*Edit

nie rozumiem czemu po wrzuceniu kodu część tylko dobrze sie kopiuje a pod koniec zaczyna wariować, ktoś coś ?

#include <iostream>
#include <math.h>

using namespace std;

//srodek ciezkosci prostokata
double cprostokat()
{
double a,b;

cout<<"Podaj bok a(os x): ";
cin>>a;
cout<<"Podaj bok b(os y): ";
cin>>b;

return (a * b*(b/2))/(a*b);

}
//moment bezwladnosci prostokata wzgledem Ox
double xmprostokat(double a, double b)
{
double m;

m=((b*b*b)*a)/3;

return m;

}
//moment bezwladnosci prostokata wzgledem Oy
double ymprostokat(double a, double b)
{
double m;

m=((a*a*a)*b)/3;

return m;

}
//srodek ciezkosci trojkata
double ctrojkat()
{
double a,h;

cout<<"Podaj podstawe trojkata(os x): ";
cin>>a;
cout<<"Podaj wysokosc trojkata: ";
cin>>h;

return (((a*h)/2)*(h/3))/((a*h)/2);

}
//moment bezwladnosci trojkata
double xmtrojkat(int ax, int ay, int bx, int by, int cx, int cy)
{
int a, b, c;
double s,h,m;

a=sqrt((((bx-ax)*(bx-ax))+((by-ay)*(by-ay))));
b=sqrt((((cx-cx)*(cx-bx))+((cy-by)*(cy-by))));
c=sqrt((((ax-cx)*(ax-cx))+((ay-cy)*(ay-cy))));

s=(sqrt((a+b+c)(a+b-c)(a-b+c)(b+c-a)))/4;
h=(2*s)/a;
m=(a*(h*h*h))/12;


return m;

}
//srodek ciezkosci kola
double ckolo()
{
double d;
cout<<"Podaj srednice kola: ";
cin>>d;

return ((M_PI*(d*d)/4)*(d/2))/(M_PI*(d*d)/4);

}
//moment bezwladnosci kola
double mkolo(double d)
{
double m;
m=(M_PI*(ddd*d))/64;
return m;
}

int main()
{
char figura;

do{
    double a,b,h,d;
    int ax,ay,bx,by,cx,cy,a,b,c;



cout<<"Podaj typ figury do obliczenia momentu bezwladnosci"<<endl;
cout<<"(p=prostokat, t=trojkat, k=kolo): ";
cin>>figura;
    if(figura=='p'||figura=='P'){

        cout<<"Podaj bok a(os x): ";
        cin>>a;
        cout<<"Podaj bok b(os y): ";
        cin>>b;
        cout<<"Moment bezwladnosci wzgledem osi x:"<<xmprostokat(a,b)<<endl;
        cout<<" i osi y: "<<ymprostokat(a,b)<<endl;}

       else if(figura=='t'||figura=='T'){

            cout<<"Podaj wspolrzedne wierzcholka 1"<<endl;
            cout<<"Podaj x :";
            cin>>ax;
            cout<<"Podaj y :";
            cin>>ay;

            cout<<"Podaj wspolrzedne wierzcholka 2"<<endl;
            cout<<"Podaj x :";
            cin>>bx;
            cout<<"Podaj y :";
            cin>>by;

            cout<<"Podaj wspolrzedne wierzcholka 3"<<endl;
            cout<<"Podaj x :";
            cin>>cx;
            cout<<"Podaj y :";
            cin>>cy;
            cout<<"Moment bezwladnosci tej figury to:"<<xmtrojkat(int
            ax, int ay, int bx, int by, int cx, int cy)<<endl;}

           else if(figura=='k'||figura=='K'){

            cout<<"Podaj srednice kola: ";
            cin>>d;
            cout<<"Moment bezwladnosci tej figury: "<<mkolo(d)<<endl;}

            else
                cout<<"Nacisnij wlasciwy klawisz";

}while(true);

}

1

Mnożenie wykonuje się za pomocą operatora *, (a+b+c)(a+b-c) jest traktowane jako wywołanie funkcji/wskaźnika na funkcję/funktora będącego wynikiem wyrażenia (a+b+c) z parametrem a+b-c.

0

O JEZU ALE GLUPI BŁĄD. Robiłem to rano zaspany i sie z kolegą głowiliśmy hahaha aż mi wstyd

*EDIT Poprawiony kod. Program sie odpala ale ma problem z liczeniem tego momentu dla trójkąta. Co bym nie wpisał to wyskakuje 0. Jest tu ktoś kto jest w stanie chwile się nad tym zastanowić ? :) z góry dziękuję.

#include <iostream>
#include <math.h>

using namespace std;

//srodek ciezkosci prostokata
double cprostokat()
{
    double a,b;

    cout<<"Podaj bok a(os x): ";
    cin>>a;
    cout<<"Podaj bok b(os y): ";
    cin>>b;

    return (a * b*(b/2))/(a*b);
}
//moment bezwladnosci prostokata wzgledem Ox
double xmprostokat(double a, double b)
{
    double m;

    m=((b*b*b)*a)/3;

    return m;
}
//moment bezwladnosci prostokata wzgledem Oy
double ymprostokat(double a, double b)
{
    double m;

    m=((a*a*a)*b)/3;

    return m;
}
//srodek ciezkosci trojkata
double ctrojkat()
{
    double a,h;

    cout<<"Podaj podstawe trojkata(os x): ";
    cin>>a;
    cout<<"Podaj wysokosc trojkata: ";
    cin>>h;

    return (((a*h)/2)*(h/3))/((a*h)/2);
}
//moment bezwladnosci trojkata
double xmtrojkat(int ax, int ay, int bx, int by, int cx, int cy)
{
    int a, b, c;
    double s,h,m;

    a=sqrt((((bx-ax)*(bx-ax))+((by-ay)*(by-ay))));
    b=sqrt((((cx-cx)*(cx-bx))+((cy-by)*(cy-by))));
    c=sqrt((((ax-cx)*(ax-cx))+((ay-cy)*(ay-cy))));

    s=(sqrt((a+b+c)*(a+b-c)*(a-b+c)*(b+c-a)))/4;
    h=(2*s)/a;
    m=(a*(h*h*h))/12;


    return m;
}
//srodek ciezkosci kola
double ckolo()
{
    double d;
    cout<<"Podaj srednice kola: ";
    cin>>d;

    return ((M_PI*(d*d)/4)*(d/2))/(M_PI*(d*d)/4);
}
//moment bezwladnosci kola
double mkolo(double d)
{
    double m;
    m=(M_PI*(d*d*d*d))/64;
    return m;
}


int main()
{
    char figura;

    do{
        double a,b,h,d;
        int ax,ay,bx,by,cx,cy;



    cout<<"Podaj typ figury do obliczenia momentu bezwladnosci"<<endl;
    cout<<"(p=prostokat, t=trojkat, k=kolo): ";
    cin>>figura;
        if(figura=='p'||figura=='P'){

            cout<<"Podaj bok a(os x): ";
            cin>>a;
            cout<<"Podaj bok b(os y): ";
            cin>>b;
            cout<<"Moment bezwladnosci wzgledem osi x:"<<xmprostokat(a,b)<<endl;
            cout<<" i osi y: "<<ymprostokat(a,b)<<endl;}

           else if(figura=='t'||figura=='T'){

                cout<<"Podaj wspolrzedne wierzcholka 1"<<endl;
                cout<<"Podaj x :";
                cin>>ax;
                cout<<"Podaj y :";
                cin>>ay;

                cout<<"Podaj wspolrzedne wierzcholka 2"<<endl;
                cout<<"Podaj x :";
                cin>>bx;
                cout<<"Podaj y :";
                cin>>by;

                cout<<"Podaj wspolrzedne wierzcholka 3"<<endl;
                cout<<"Podaj x :";
                cin>>cx;
                cout<<"Podaj y :";
                cin>>cy;
                cout<<"Moment bezwladnosci tej figury to:"<<xmtrojkat(ax, ay, bx, by, cx, cy)<<endl;}

               else if(figura=='k'||figura=='K'){

                cout<<"Podaj srednice kola: ";
                cin>>d;
                cout<<"Moment bezwladnosci tej figury: "<<mkolo(d)<<endl;}

                else
                    cout<<"Nacisnij wlasciwy klawisz";

    }while(true);
}

*EDIT 2 PROSZE :) aktualnie zmieniam wzór dodalem zmienna p równa połowie obwodu. Zobaczymy moze tym razem pojdzie.

0

Dzięki wielkie, od strony wizualnej bardzo mi to pomogło. Wzór podmieniłem i program liczy moment. Problem chyba rozwiązany.

#include <iostream>
#include <math.h>

using namespace std;

// srodek ciezkosci prostokata
double cprostokat()
{
    double a, b;

    cout << "Podaj bok a(os x): ";
    cin >> a;
    cout << "Podaj bok b(os y): ";
    cin >> b;

    return (a * b * (b / 2)) / (a * b);
}
// moment bezwladnosci prostokata wzgledem Ox
double xmprostokat(double a, double b)
{
    double m;

    m = ((b * b * b) * a) / 3;

    return m;
}
// moment bezwladnosci prostokata wzgledem Oy
double ymprostokat(double a, double b)
{
    double m;

    m = ((a * a * a) * b) / 3;

    return m;
}
// srodek ciezkosci trojkata
double ctrojkat()
{
    double a, h;

    cout << "Podaj podstawe trojkata(os x): ";
    cin >> a;
    cout << "Podaj wysokosc trojkata: ";
    cin >> h;

    return (((a * h) / 2) * (h / 3)) / ((a * h) / 2);
}
// moment bezwladnosci trojkata
double xmtrojkat(int ax, int ay, int bx, int by, int cx, int cy)
{
    int a, b, c;
    double s, h, m, p;

    a = sqrt((((bx - ax) * (bx - ax)) + ((by - ay) * (by - ay))));
    b = sqrt((((cx - bx) * (cx - bx)) + ((cy - by) * (cy - by))));
    c = sqrt((((ax - cx) * (ax - cx)) + ((ay - cy) * (ay - cy))));

    p = (a + b + c) / 2;
    s = sqrt(p * (p - a) * (p - b) * (p - c));
    h = (2 * s) / a;
    m = (a * (h * h * h)) / 12;

    return m;
}
// srodek ciezkosci kola
double ckolo()
{
    double d;
    cout << "Podaj srednice kola: ";
    cin >> d;

    return ((M_PI * (d * d) / 4) * (d / 2)) / (M_PI * (d * d) / 4);
}
// moment bezwladnosci kola
double mkolo(double d)
{
    double m;
    m = (M_PI * (d * d * d * d)) / 64;
    return m;
}

int main()
{
    char figura;

    do {
        double a, b, h, d;
        int ax, ay, bx, by, cx, cy;

        cout << "Podaj typ figury do obliczenia momentu bezwladnosci" << endl;
        cout << "(p=prostokat, t=trojkat, k=kolo): ";
        cin >> figura;
        if (figura == 'p' || figura == 'P') {
            cout << "Podaj bok a(os x): ";
            cin >> a;
            cout << "Podaj bok b(os y): ";
            cin >> b;
            cout << "Moment bezwladnosci wzgledem osi x:" << xmprostokat(a, b)
                 << endl;
            cout << " i osi y: " << ymprostokat(a, b) << endl;
        }

        else if (figura == 't' || figura == 'T') {
            cout << "Podaj wspolrzedne wierzcholka 1" << endl;
            cout << "Podaj x :";
            cin >> ax;
            cout << "Podaj y :";
            cin >> ay;

            cout << "Podaj wspolrzedne wierzcholka 2" << endl;
            cout << "Podaj x :";
            cin >> bx;
            cout << "Podaj y :";
            cin >> by;

            cout << "Podaj wspolrzedne wierzcholka 3" << endl;
            cout << "Podaj x :";
            cin >> cx;
            cout << "Podaj y :";
            cin >> cy;
            cout << "Moment bezwladnosci tej figury to:" << xmtrojkat(ax, ay, bx, by,
                                                                cx, cy) << endl;
        }

        else if (figura == 'k' || figura == 'K') {
            cout << "Podaj srednice kola: ";
            cin >> d;
            cout << "Moment bezwladnosci tej figury: " << mkolo(d) << endl;
        }

        else
            cout << "Nacisnij wlasciwy klawisz";

    } while (true);
}
 

*EDIT
C++ uczę się dopiero 4 miesiące, czasami więc droga krótsza dla mnie dla innych może się okazać dłuższa. Poprawie :)

0

Siema, to znowu ja z kolejnym pytaniem. Jak ogarnąć w ostatniej części kodu, aby program sumował momenty kolejnych figur a na końcu wyrzucał wynik ?

#include <iostream>
#include <math.h>

using namespace std;

//srodek ciezkosci prostokata
double cprostokat()
{
    double a, b;

    cout << "Podaj bok a(os x): ";
    cin >> a;
    cout << "Podaj bok b(os y): ";
    cin >> b;

    return (a * b * (b / 2)) / (a * b);
}
//moment bezwladnosci prostokata wzgledem Ox
double xmprostokat(double a, double b)
{
    double m;

    m = ((b * b * b) * a) / 3;

    return m;
}
//moment bezwladnosci prostokata wzgledem Oy
double ymprostokat(double a, double b)
{
    double m;

    m = ((a * a * a) * b) / 3;

    return m;
}
//srodek ciezkosci trojkata
double ctrojkat()
{
    double a, h;

    cout << "Podaj podstawe trojkata(os x): ";
    cin >> a;
    cout << "Podaj wysokosc trojkata: ";
    cin >> h;

    return (((a * h) / 2) * (h / 3)) / ((a * h) / 2);
}
//moment bezwladnosci trojkata Ox
double xmtrojkat(int ax, int ay, int bx, int by, int cx, int cy)
{
    int a, b, c;
    double s, h, m, p;

    a = sqrt((((bx - ax) * (bx - ax)) + ((by - ay) * (by - ay))));
    b = sqrt((((cx - bx) * (cx - bx)) + ((cy - by) * (cy - by))));
    c = sqrt((((ax - cx) * (ax - cx)) + ((ay - cy) * (ay - cy))));

    p = (a + b + c) / 2;
    s = sqrt(p * (p - a) * (p - b) * (p - c));
    h = (2 * s) / a;
    m = (a * (h * h * h)) / 12;

    return m;
}
//moment bezwladnosci trojkata Oy
double ymtrojkat(int ax, int ay, int bx, int by, int cx, int cy)
{
    int a, b, c;
    double s, h, m, p;

    a = sqrt((((bx - ax) * (bx - ax)) + ((by - ay) * (by - ay))));
    b = sqrt((((cx - bx) * (cx - bx)) + ((cy - by) * (cy - by))));
    c = sqrt((((ax - cx) * (ax - cx)) + ((ay - cy) * (ay - cy))));

    p = (a + b + c) / 2;
    s = sqrt(p * (p - a) * (p - b) * (p - c));
    h = (2 * s) / a;
    m = (h * (a * a * a)) / 12;

    return m;
}
//srodek ciezkosci kola
double ckolo()
{
    double d;
    cout << "Podaj srednice kola: ";
    cin >> d;

    return ((M_PI * (d * d) / 4) * (d / 2)) / (M_PI * (d * d) / 4);
}
//moment bezwladnosci kola
double mkolo(double d)
{
    double m;
    m = (M_PI * pow(d, 4)) / 64;
    return m;
}

int main()
{
    double a, b, h, d,w=0;
    int ax, ay, bx, by, cx, cy,t,j,i;
    char figura,os;

    cout << "**********************" << endl;
    cout << "*M O M E N T ver. 0.1*" << endl;
    cout << "**********************" << endl;
    cout << endl;
    cout << "Witam w programie MOMENT." << endl;
    cout << "Aby policzyc moment bezwladnosci dla pojedynczej figury plaskiej wpisz '1'." << endl;
    cout << "W celu liczenia zlozen figur nacisnij '2'." << endl;
    cin >> t;
    if (t == 1) {

         {
            cout << "Podaj typ figury do obliczenia momentu bezwladnosci" << endl;
            cout << "(p=prostokat, t=trojkat, k=kolo): ";
            cin >> figura;
            if (figura == 'p' || figura == 'P') {

                cout << "Podaj bok a(os x): ";
                cin >> a;
                cout << "Podaj bok b(os y): ";
                cin >> b;
                cout << "Moment bezwladnosci wzgledem osi x:" << xmprostokat(a, b) << endl;
                cout << " i osi y: " << ymprostokat(a, b) << endl;
            }

            else if (figura == 't' || figura == 'T') {

                cout << "Podaj wspolrzedne wierzcholka 1" << endl;
                cout << "Podaj x :";
                cin >> ax;
                cout << "Podaj y :";
                cin >> ay;

                cout << "Podaj wspolrzedne wierzcholka 2" << endl;
                cout << "Podaj x :";
                cin >> bx;
                cout << "Podaj y :";
                cin >> by;

                cout << "Podaj wspolrzedne wierzcholka 3" << endl;
                cout << "Podaj x :";
                cin >> cx;
                cout << "Podaj y :";
                cin >> cy;
                cout << "Moment bezwladnosci wzgledem osi x:" << xmtrojkat(ax, ay, bx, by, cx, cy) << endl;
                cout << " i osi y: " << ymtrojkat(ax, ay, bx, by, cx, cy) << endl;
            }

            else if (figura == 'k' || figura == 'K') {

                cout << "Podaj srednice kola: ";
                cin >> d;
                cout << "Moment bezwladnosci tej figury: " << mkolo(d) << endl;
            }

            else
                cout << "Nacisnij wlasciwy klawisz"<<endl;

        }
    }

    else if (t == 2) {


            cout << "Ile figur chcesz zlozyc?"<<endl;
            cin >> j;
                for(i=0;i<=j;i++)
                    {
                    cout << "Podaj typ figury do obliczenia momentu bezwladnosci" << endl;
            cout << "(p=prostokat, t=trojkat, k=kolo): ";
            cin >> figura;
            if (figura == 'p' || figura == 'P') {

                cout << "Podaj bok a(os x): ";
                cin >> a;
                cout << "Podaj bok b(os y): ";
                cin >> b;
                cout << "Wzgledem jakiej osi ?(wybierz x lub y)" <<endl;
                cin >> os;
                if (os == 'x' || os == 'X')
                cout << "Moment bezwladnosci prostokata wzgledem osi x:" << xmprostokat(a, b) << endl;
                else if (os == 'y' || os == 'Y')
                cout << "Moment bezwladnosci prostokata wzgledem osi y:" << ymprostokat(a, b) << endl;

            }

            else if (figura == 't' || figura == 'T') {

                cout << "Podaj wspolrzedne wierzcholka 1" << endl;
                cout << "Podaj x :";
                cin >> ax;
                cout << "Podaj y :";
                cin >> ay;

                cout << "Podaj wspolrzedne wierzcholka 2" << endl;
                cout << "Podaj x :";
                cin >> bx;
                cout << "Podaj y :";
                cin >> by;

                cout << "Podaj wspolrzedne wierzcholka 3" << endl;
                cout << "Podaj x :";
                cin >> cx;
                cout << "Podaj y :";
                cin >> cy;
                cout << "Wzgledem jakiej osi ?(wybierz x lub y)" <<endl;
                cin >> os;
                if (os == 'x' || os == 'X')
                cout << "Moment bezwladnosci trojkata wzgledem osi x:" << xmtrojkat(ax, ay, bx, by, cx, cy) << endl;
                else if (os == 'y' || os == 'Y')
                cout << "Moment bezwladnosci trojkata wzgledem osi y:" << ymtrojkat(ax, ay, bx, by, cx, cy) << endl;
            }

            else if (figura == 'k' || figura == 'K') {

                cout << "Podaj srednice kola: ";
                cin >> d;
                cout << "Moment bezwladnosci kola : " << mkolo(d) << endl;
            }

            else
                cout << "Nacisnij wlasciwy klawisz"<<endl;

                        }
}
} 

1 użytkowników online, w tym zalogowanych: 0, gości: 1