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

Znikająca wartość zmiennej xnew.

Ostatnio zmodyfikowano 2014-03-28 22:48
Autor Wiadomość
lost90
Temat założony przez niniejszego użytkownika
Znikająca wartość zmiennej xnew.
» 2014-03-28 21:15:56
Witam!
Mam taki problem z programem:
W funkcji obliczaniewpsolrzednych obliczana jest wartość zmiennej xnew. Przy warunkach, które testowo wprowadziłem wychodzi -1.56, jednak zaraz za funkcją (dosłownie w następnej linijce) kiedy każę wypisać wartość xnew wyskakuje wartość 0.
Błąd pewnie jest (jak zawsze) prozaiczny i prosty do naprawienia, ale ja go nie widzę!

Z góry dziękuję za wszelką pomoc!

C/C++
#include <iostream>
#include <cmath>
using namespace std;

char tablicax[ 3 ] = { 'x', 'X', 'N' }; //X=xy, N=nic
char tablicay[ 3 ] = { 'y', 'X', 'Y' }; //Y=yz
char tablicaz[ 3 ] = { 'z', 'Y', 'N' };

double f1_mnoznik[ 7 ] = { 2, 2, 1, - 2, - 2, - 2, 3 };
char f1_zmienna[ 8 ] = { 'x', 'y', 'z', 'X', 'Y', 'x', ' ', 'K' };
double f1_wykladnik[ 7 ] = { 2, 2, 2, 1, 1, 1, 0 };
double f1_mnoznik1[ 7 ];
char f1_zmienna1[ 8 ];
double f1_wykladnik1[ 7 ];

double f2_mnoznik[ 5 ] = { 3, 4, - 12, 12, - 24 };
char f2_zmienna[ 6 ] = { 'x', 'x', 'x', 'y', 'y', 'K' };
double f2_wykladnik[ 5 ] = { 4, 3, 2, 2, 1 };
double f2_mnoznik1[ 5 ];
char f2_zmienna1[ 6 ];
double f2_wykladnik1[ 5 ];

int i, rozmiar, kontrolkaX, kontrolkaY, kontrolkaZ;
double xold, xnew, wartoscpochodnej, c, e;

double obliczaniewpsolrzednych( double tablica1[], char tablica2[], double tablica3[], int rozmiar, char tablica4[], double wspolrzedna, double wspolrzednanowa, double stala, double wartoscpochodnej )
{
    wartoscpochodnej = 0;
    for( i = 0; i < rozmiar; i++ )
    {
        if( tablica2[ i ] == tablica4[ 0 ] )
        {
            wartoscpochodnej += tablica1[ i ] * pow( wspolrzedna, tablica3[ i ] );
        }
        else if( tablica2[ i ] == 'n' )
        {
            wartoscpochodnej += tablica1[ i ];
        }
    }
    std::cout << "xnew przed obliczeniem = " << wspolrzednanowa << endl;
    wspolrzednanowa = wspolrzedna - stala * wartoscpochodnej;
    std::cout << "xnew po obliczeniu = " << wspolrzednanowa << endl;
}

double pochodna( double tablica1[], char tablica2[], double tablica3[], double tablica11[], char tablica21[], double tablica31[], int rozmiar, char tablica4[] )
{
    for( i = 0; i < rozmiar; i++ )
    {
        tablica11[ i ] = tablica1[ i ];
        tablica21[ i ] = tablica2[ i ];
        tablica31[ i ] = tablica3[ i ];
        if( tablica4[ 2 ] == 'N' )
        {
            if( tablica21[ i ] == tablica4[ 1 ] || tablica21[ i ] == tablica4[ 0 ] )
            {
                tablica21[ i ] = tablica4[ 0 ];
            }
            else
            {
                tablica21[ i ] = 'n';
            }
        }
        else
        {
            if( tablica21[ i ] == tablica4[ 1 ] || tablica21[ i ] == tablica4[ 2 ] )
            {
                tablica21[ i ] = tablica4[ 0 ];
            }
        }
       
    }
    for( i = 0; i < rozmiar; i++ )
    {
        if( tablica21[ i ] == tablica4[ 0 ] )
        {
            tablica11[ i ] *=( tablica31[ i ] );
            tablica31[ i ] +=- 1;
            if( tablica31[ i ] == 0 )
            {
                tablica21[ i ] = 'n';
            }
        }
        else
        {
            tablica11[ i ] = 0;
            tablica31[ i ] = 0;
        }
       
    }
   
}

double sprawdzanieminimum( double e, double wspolrzedna, double wspolrzednanowa, double kontrolka )
{
    std::cout << "abs(xnew) = " << abs( wspolrzednanowa ) << endl;
    std::cout << "abs(xold) = " << abs( wspolrzedna ) << endl;
    std::cout << e << endl;
    std::cout << "różnica = " <<( abs( wspolrzednanowa ) - abs( wspolrzedna ) ) << endl;
    if(( abs( wspolrzednanowa ) - abs( wspolrzedna ) ) < e )
    {
        kontrolka = 1;
    }
}
int main()
{
    pochodna( f2_mnoznik, f2_zmienna, f2_wykladnik, f2_mnoznik1, f2_zmienna1, f2_wykladnik1, 5, tablicax );
    c = 0.01;
    e = 0.01;
    kontrolkaX = 0;
    xold = - 3;
    std::cout << "xold = " << xold << endl;
    obliczaniewpsolrzednych( f2_mnoznik1, f2_zmienna1, f2_wykladnik1, 5, tablicax, xold, xnew, c, wartoscpochodnej );
    std::cout << "xnew po funkcji = " << xnew << endl;
    sprawdzanieminimum( e, xold, xnew, kontrolkaX );
   
    return 0;
}
P-107357
ArgonZapan
» 2014-03-28 21:20:42
double obliczaniewpsolrzednych( double tablica1[], char tablica2[], double tablica3[], int rozmiar, char tablica4[], double wspolrzedna, double &wspolrzednanowa, double stala, double wartoscpochodnej )

spróbuj przekazać przez referencje.
P-107358
OczkoSX
» 2014-03-28 22:48:19
@up ma rację. Nie bazujesz na oryginalnych zmiennych i są one tymczasowo przechowywane do zamknięcia funkcji ;)
P-107367
« 1 »
  Strona 1 z 1