Program- Algorytm Kivjoja.
Ostatnio zmodyfikowano 2014-12-08 13:03
Argonus Temat założony przez niniejszego użytkownika |
Program- Algorytm Kivjoja. » 2014-12-02 16:51:24 Witam wszystkich, mam taki problem. Muszę napisać program liczący algorytm Kivjoja (Geodezja Wyższa) Ale żeby nie było za łatwo, mam problem z funkcjami trygonometrycznymi. Czy ktoś mógłby zerknąć i powiedzieć co mam z tym zrobić? #include<iostream> #include<math.h>
int main() { using namespace std; double Fip[ 100 ]; double lambdap[ 100 ]; float SAB; double Aab[ 100 ]; double a = 6378137; double e = 0.0066943800229; cout << "Podaj dane w [rad]: " << endl; cout << "Fip = "; cin >> Fip[ 0 ]; cout << "Lambdap = "; cin >> lambdap[ 0 ]; cout << "Sab = "; cin >> SAB; cout << "Azymut Aab = "; cin >> Aab[ 0 ]; cout << "Pkt I. Dzielimy cala dlugosc linii geodezyjnej s na n elementow ds"; int podzial; cout << "Podaj liczbe odcinkow: "; cin >> podzial; double ds; ds = SAB / podzial; cout << "Odcinek ds = " << ds; int i; double M[ 100 ]; double N[ 100 ]; double FFi1[ 100 ]; double Fim[ 100 ]; for( i = 0; i < podzial; i++ ) { double sinus[ 100 ]; sinus[ i ] = double sin( double Fip[ i ] ); double potega[ 100 ]; double y = 2; potega[ i ] = double pow( double sinus[ i ], double y ); double x[ 100 ]; x[ i ] =( 1 - e * potega[ i ] ); double pierwiastek[ 100 ]; pierwiastek[ i ] = double sqrt( double x ); M[ i ] =( a *( 1 - e ) ) /( pierwiastek[ i ] ); N[ i ] =( a ) /( pierwiastek[ i ] ); double cosinusA[ 100 ]; cosinusA[ i ] = double cos( double Aab[ i ] ); FFi1[ i ] =( ds * cosinusA[ i ] ) / M[ i ]; Fim[ i ] = Fip[ i ] +( 0.5 * FFi1[ 1 ] ); double sinusm[ 100 ]; sinusm[ i ] = double sin( double Fim[ i ] ); double potegam[ 100 ]; potegam[ i ] = double pow( double sinusm[ i ], double y ); double xm[ 100 ]; xm[ i ] =( 1 - e * potegam[ i ] ); double pierwiastekm[ 100 ]; pierwiastekm[ i ] = double sqrt( double xm[ i ] ); double Mmi[ 100 ]; Mmi[ i ] =( a *( 1 - e ) ) / pierwiastekm[ i ]; double Nmi[ 100 ]; Nmi[ i ] =( a ) /( pierwiastekm[ i ] ) double sinusA[ 100 ]; sinusA[ i ] = double sin( double Aab[ i ] ); double tangensFi[ 100 ]; tangensFi[ i ] = double tan( double Fim[ i ] ); double pAmi[ 100 ]; pAmi[ i ] =( ds * sinusA[ i ] * tangensFi[ i ] ) /( Nmi[ i ] ); double Ami[ 100 ]; Ami[ i ] = Aab[ i ] +( 0.5 * pAmi[ i ] ); double cosinusAmi[ 100 ]; cosinusAmi[ i ] = double cos( double Ami[ i ] ); double Yi[ 100 ]; Yi[ i ] =( ds * cosinusAmi[ i ] ) / Mmi[ i ]; double sinusAmi[ 100 ]; sinusAmi[ i ] = double sin( double Ami[ i ] ); double cosFi[ 100 ]; cosFi[ i ] = double cos( double Fim[ i ] ); double Li[ 100 ]; Li[ i ] =( ds * sinusAmi[ i ] ) /( Nmi[ i ] * cosFi[ i ] ); double Ai[ 100 ]; Ai[ i ] =( ds * sinusAmi[ i ] * tangensFi[ i ] ) / Nmi[ i ] ); Fip[ i + 1 ] = Fip[ i ] + Yi[ i ]; lambdap[ i + 1 ] = lambdap[ i ] + Li[ i ]; Aab[ i + 1 ] = Aab[ i ] + Ai[ i ]; } cout << "Podaje wyniki: " << endl; cout << "Fip = " << Fip[ podzial ]; cout << "Lambdap = " << lambdap[ podzial ]; cout << "Aab = " << Aab[ podzial ]; system( "pause" ); return 0; }
|
|
kubawal |
» 2014-12-02 16:58:04 Konkretnie? Błąd z kompilacją czy wynikiem? cosinusAmi[ i ] = double sin( double Ami[ i ] );
|
Hmmm, WTF? |
|
Argonus Temat założony przez niniejszego użytkownika |
» 2014-12-02 17:16:16 No właśnie nie wiem jak użyć funkcji sin/cos itp. Czy muszę dla nich za każdym razem pisać oddzielną funkcję? A jeśli tak to jak ją wrzucić w pętle. |
|
kubawal |
» 2014-12-02 17:19:11 sin() i cos() używa się jak każdą normalną funkcję. cosinusAmi[ i ] = sin( Ami[ i ] ); |
|
Argonus Temat założony przez niniejszego użytkownika |
» 2014-12-02 18:44:24 Zmodyfikowałem trochę program #include<iostream> #include<math.h>
int main() { using namespace std; double Fip[ 100 ]; double lambdap[ 100 ]; double SAB; double Aab[ 100 ]; double a = 6378137; double e = 0.0066943800229; cout << "Podaj dane w [rad]: " << endl; cout << "Fip = "; cin >> Fip[ 0 ]; cout << "Lambdap = "; cin >> lambdap[ 0 ]; cout << "Sab = "; cin >> SAB; cout << "Azymut Aab = "; cin >> Aab[ 0 ]; cout << "Pkt I. Dzielimy cala dlugosc linii geodezyjnej s na n elementow ds"; int podzial; cout << "Podaj liczbe odcinkow: "; cin >> podzial; double ds; ds = SAB / podzial; cout << "Odcinek ds = " << ds; int i; double M[ 100 ]; double N[ 100 ]; double FFi1[ 100 ]; double Fim[ 100 ]; for( i = 0; i < podzial; i++ ) { double pierwiastek[ 100 ]; pierwiastek[ i ] = sqrt(( 1 -( e *( pow( sin( Fip[ i ] ), 2 ) ) ) ) ); M[ i ] =( a *( 1 - e ) ) /( pierwiastek[ i ] ); N[ i ] =( a ) /( pierwiastek[ i ] ); FFi1[ i ] =( ds *( cos( Aab[ i ] ) ) / M[ i ] ); Fim[ i ] = Fip[ i ] +( 0.5 * FFi1[ 1 ] ); double pierwiastekm[ 100 ]; pierwiastekm[ i ] = sqrt(( 1 -( e *( pow( sin( Fim[ i ] ), 2 ) ) ) ) ); double Mmi[ 100 ]; Mmi[ i ] =( a *( 1 - e ) ) / pierwiastekm[ i ]; double Nmi[ 100 ]; Nmi[ i ] =( a ) /( pierwiastekm[ i ] ); double pAmi[ 100 ]; pAmi[ i ] =( ds *( sin( Aab[ i ] ) ) *( tan( Fim[ i ] ) ) ) /( Nmi[ i ] ); double Ami[ 100 ]; Ami[ i ] = Aab[ i ] +( 0.5 * pAmi[ i ] ); double Yi[ 100 ]; Yi[ i ] =( ds *( cos( Ami[ i ] ) ) ) / Mmi[ i ]; double Li[ 100 ]; Li[ i ] =( ds *( sin( Ami[ i ] ) ) ) /( Nmi[ i ] *( cos( Fim[ i ] ) ) ); double Ai[ 100 ]; Ai[ i ] =(( ds *( sin( Ami[ i ] ) ) ) *( tan( Fim[ i ] ) ) ) /( Nmi[ i ] ); Fip[ i + 1 ] = Fip[ i ] + Yi[ i ]; lambdap[ i + 1 ] = lambdap[ i ] + Li[ i ]; Aab[ i + 1 ] = Aab[ i ] + Ai[ i ]; } cout << "Podaje wyniki: " << endl; cout << "Fip = " << Fip[ podzial ]; cout << "Lambdap = " << lambdap[ podzial ]; cout << "Aab = " << Aab[ podzial ]; system( "pause" ); return 0; }
Tyle że teraz wyświetla mi zupełnie inny wynik jak excel. 1. Dane podaje w radianach dla funkcji trygonometrycznych. 2. Funkcje są na pewno dobrze spisane. Jak mam zwiększyć dokładność po przecinku bo dostaje Ledwie 6 miejsci A potrzebuję 11 3. Koniec programu ma wyświetlić ostatni obliczony wynik. 11 ;/ |
|
michal11 |
» 2014-12-02 19:17:38 Jaki sens ma tworzenie tablic w pętli ? Zawsze odwołujesz się tylko do i-tego elementu, i w dodatku przy każdym obiegu pętli tworzysz zupełnie nowe tablice. |
|
Argonus Temat założony przez niniejszego użytkownika |
» 2014-12-03 12:49:56 Dzięki za radę co do tablic, udało mi się zlokalizować gdzie mam błąd ale nie umiem go rozwiązać. C++ zle oblicza mi zmienna x. Bardzo proszę o pomoc. #include<iostream> #include<math.h>
int main() { using namespace std; double Fip[ 100 ]; double lambdap[ 100 ]; double SAB; double Aab[ 100 ]; double a = 6378137; double e = 0.0066943800229; cout << "Podaj dane w [rad]: " << endl; cout << "Fip = "; cin >> Fip[ 0 ]; cout << "Lambdap = "; cin >> lambdap[ 0 ]; cout << "Sab = "; cin >> SAB; cout << "Azymut Aab = "; cin >> Aab[ 0 ]; cout << "Pkt I. Dzielimy cala dlugosc linii geodezyjnej s na n elementow ds" << endl; int podzial; cout << "Podaj liczbe odcinkow: "; cin >> podzial; double ds; ds = SAB / podzial; cout << "Odcinek ds = " << ds; int i; int coute = 0; double x[ 100 ]; double M[ 100 ]; double Mmi[ 100 ]; double N[ 100 ]; double Nmi[ 100 ]; double pAmi[ 100 ]; double Ami[ 100 ]; double FFi1[ 100 ]; double Fim[ 100 ]; double pierwiastek[ 100 ]; double pierwiastekm[ 100 ]; double Yi[ 100 ]; double Li[ 100 ]; double Ai[ 100 ]; for( i = 0; i < podzial; i++ ) { pierwiastek[ i ] = sqrt(( 1 -( e *( pow( sin( Fip[ i ] ), 2 ) ) ) ) ); M[ i ] =( a *( 1 - e ) ) /( pierwiastek[ i ] ); N[ i ] =( a ) /( pierwiastek[ i ] ); FFi1[ i ] =( ds *( cos( Aab[ i ] ) ) / M[ i ] ); x[ i ] =( FFi1[ i ] / 2 ); Fim[ i ] = Fip[ i ] +( x[ i ] ); pierwiastekm[ i ] = sqrt(( 1 -( e *( pow( sin( Fim[ i ] ), 2 ) ) ) ) ); Mmi[ i ] =( a *( 1 - e ) ) / pierwiastekm[ i ]; Nmi[ i ] =( a ) /( pierwiastekm[ i ] ); pAmi[ i ] =( ds *( sin( Aab[ i ] ) ) *( tan( Fim[ i ] ) ) ) /( Nmi[ i ] ); Ami[ i ] = Aab[ i ] +( 0.5 * pAmi[ i ] ); Yi[ i ] =( ds *( cos( Ami[ i ] ) ) ) / Mmi[ i ]; Li[ i ] =( ds *( sin( Ami[ i ] ) ) ) /( Nmi[ i ] *( cos( Fim[ i ] ) ) ); Ai[ i ] =(( ds *( sin( Ami[ i ] ) ) ) *( tan( Fim[ i ] ) ) ) /( Nmi[ i ] ); Fip[ i + 1 ] = Fip[ i ] + Yi[ i ]; lambdap[ i + 1 ] = lambdap[ i ] + Li[ i ]; Aab[ i + 1 ] = Aab[ i ] + Ai[ i ]; coute++; } cout << endl; cout << "Podaje wyniki: " << endl; cout << "Liczba powtorzen petli: " << coute++ << endl; cout.precision( 7 ); cout << "Podaje wyniki pośrednie: " << "M = " << M[ 0 ] << " N = " << N[ 0 ] << " FFi1 = " << FFi1[ 0 ] << " x = " << x[ 0 ]; cout << " Fim = " << Fim[ 0 ] << " Mmi = " << Mmi[ 0 ] << " Nmi = " << Nmi[ 0 ] << " pAmi = " << pAmi[ 0 ]; cout << " Ami = " << Ami[ 0 ] << endl; cout << "Podaje wyniki posrednie: " << "B = " << Yi[ podzial - 1 ] << " L = " << Li[ podzial - 1 ] << " A = " << Ai[ podzial - 1 ] << endl; cout << "Fip = " << Fip[ podzial ] << endl; cout << "Lambdap = " << lambdap[ podzial ] << endl; cout << "Aab = " << Aab[ podzial ] << endl; cout << endl; system( "pause" ); return 0; }
|
|
Tomek_z_W11 |
» 2014-12-03 16:14:32 Myślę, że przyczyną błędów może być dzielenie całkowite, czyli w linijce: x[ i ] =( FFi1[ i ] / 2 );
Zamień na: x[ i ] =( FFi1[ i ] / 2.0 );
Dzieląc przez 2.0 zaznaczasz, że chcesz dzielenie double'a przez double, w związku z czym wynikiem też będzie double. |
|
« 1 » 2 |