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

Tablice dynamiczne - problem z zadaniem

Ostatnio zmodyfikowano 2013-01-09 16:56
Autor Wiadomość
fsg
Temat założony przez niniejszego użytkownika
Tablice dynamiczne - problem z zadaniem
» 2013-01-08 20:02:49
Cześć mam spory problem z zadaniem z tablic dynamicznych.

Napisz funkcję, któa zadaną tablicę jednowymiarową o długości N przekształci w tablicę w której sąsiednie elementy będą różniły się o wartość nie większą niż delta. Funkcja powinna działać według następującego algorytmu:
1) przeszukując tablicę sprawdzić wielkość skoku wartości pomiędzy sąsiednimi elementami i porównać go z deltą;
2) jeżeli wielkość maksymalnego skoku jest większa od delty: zastąpić największy element tablicy 'X' dwoma elementami o wartościach równych 'X/2';
3) jeżeli wielkość maksymalnego skoku jest mniejsza bądź równa delcie - zakończyć działanie funkcji

Przykład:
Długość tablicy: N = 7
docelowa maksymalna wartość skoku: delta = 1

tablica wejściowa : 2 4 7 3 5 2 1

po pierwszym sprawdzeniu powinno być:

2 4 3.5 3.5 3 5 2 1

a po zakończeniu działania powinno wyświetlić się:

2 2 2 1.75 1.75 1.75 1.75 1.5 1.5 2.5 2.5 2 1



Wydaje mi się, że wszystko jest w porządku do czasu funkcji rozbijanie(). Rozumiem, że nie powinienem zastępować elementów tablicy innymi, tylko je jakoś przesunąć, ale niestety nie wiem jak. W dodatku nie wiem czy dobrze używam zmiennej licznik.

Spodziewam się też, że może być dużo błędów i niepotrzebnych zmiennych.

C/C++
#include <iostream>
#include <cmath>
#include <cstdlib>

using namespace std;

float * tab;
float * tab2;
int n, d;
float licznik = 0;
float ktory = 0;
float m, mx;
int j;

float skok()
{
    cout << "Kolejne skoki: ";
    tab2 = new float[ n ];
    float buf;
   
    for( int i = 0; i < n - 1 + licznik; i++ )
    {
        buf = tab[ i ] - tab[ i + 1 ];
        tab2[ i ] = buf;
        cout << fabs( buf ) << " ";
    }
}

float mskok()
{
    //for (int i=0; i<n-1+licznik; i++)
    //{
    m = fabs( tab2[ 0 ] );
    //}
   
    for( int i = 1; i < n - 1 + licznik; i++ )
    {
        if( fabs( tab2[ i ] ) > m )
        {
            m = fabs( tab2[ i ] );
        }
    }
    if( m > d )
    {
        mx = 0;
        for( int i = 0; i < n - 1 + licznik; i++ )
        {
            if( tab[ i ] > mx )
            {
                mx = tab[ i ];
                j = i;
            }
        }
        cout << "Maksymalna wartosc tablicy: " << mx << " " << endl;
    }
    cout << "Maksymalny skok: " << m;
}

float rozbijanie()
{
    float buf;
   
    do
    //if (m > d)
    {
        for( int i = j; i < n + 1 + licznik; i++ )
        {
            tab[ i + 1 ] = tab[ i + 2 ];
        }
       
        tab[ j ] = tab[ j ] / 2;
        tab[ j + 1 ] = tab[ j ];
       
        licznik = licznik + 1;
    }
   
    while( d >= m );
   
}

int main()
{
    cout << "Podaj wartosc docelowego skoku: "; cin >> d;
    cout << "Podaj dlugosc tablicy: "; cin >> n;
   
    tab = new float[ n ];
   
    for( int i = 0; i < n; i++ )
    {
        cout << "T[" << i << "] = "; cin >> tab[ i ];
    }
   
    for( int i = 0; i < n; i++ )
    {
        cout << tab[ i ] << " ";
    }
   
    for( int i = 0; i < n; i++ )
    {
       
        skok(); cout << endl;
        mskok(); cout << endl;
        rozbijanie(); cout << endl;
       
        for( int i = 0; i < n + licznik; i++ )
        {
            cout << tab[ i ] << " ";
        }
    }
   
    system( "pause" );
    return 0;
}


Działa już trochę lepiej, ale nadal mnie wysypuje i źle ustawia.
P-73385
crash
» 2013-01-09 16:56:10
1. Nie używaj zmiennych globalnych, przekazuj zmienne do funkcji jako parametry, czy to przez wskaźnik, czy przez referencję.

2. Na Twoim miejscu najpierw przejechałbym tablicę żeby zbadać wszystkie elementy, ile razy musiałby zostać dzielone, żeby spełnić warunki zadania - przy okazji obliczysz rozmiar wynikowej tablicy. Kiedy już rozmiar znany, to wypełnianie. Popatrz na kartce dla skoku 1, jak zachowują się pary liczb stojące koło siebie np 1 i 9,  2 i 8, 3 i 5, pokombinuj to zobaczysz jak wygląda algorytm.
P-73466
« 1 »
  Strona 1 z 1