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

[C++] dynamiczne tablice

Ostatnio zmodyfikowano 2016-05-13 23:13
Autor Wiadomość
Harion
Temat założony przez niniejszego użytkownika
[C++] dynamiczne tablice
» 2016-05-13 17:36:15
Witam bylibyście jakoś w stanie pomóc jak się zabrać za takie zadanie?

Napisz i przetestuj własną funkcję int** funkc(int* tab, int n) której parametrami są podana tablica liczb naturalnych tab i jej rozmiar n, a wynikiem jest tablica wskaźników do następujących, utworzonych dynamicznie tablic:

Napisać i przetestować własną funkcję int** test(int* tab, int n), której parametrami są podana tablica liczb naturalnych tab i jej rozmiar n, a wynikiem jest tablica wskaźników do następujących, utworzonych dynamicznie tablic:
a) dzielników liczby n
b) liczb parzystych z tablicy tab,
przy czym, w każdej z tych tablic (a, b), pierwszy element zawsze oznacza ilość elementów odpowiedniego rodzaju (dzielników/parzystych). Jeśli w roboczej tablicy nie ma miejsca dla kolejnej liczby odpowiedniego rodzaju (dzielnika/parzystej) należy zwiększyć jej rozmiar 2 razy. 

Głównie chodzi mi o tworzenie i zwracanie tych tablic bo z tym mam mały problem.
Dzięki wielkie!
P-148169
carlosmay
» 2016-05-13 19:42:03
Czy już coś napisałeś?
Z czym masz kłopot?
P-148173
Harion
Temat założony przez niniejszego użytkownika
» 2016-05-13 21:00:13
ogólnie ze samym zrozumieniem zadania, choćby jakiś zarys gdyby ktoś przedstawił było by fajnie.

Na razie mam coś takiego: http://wklej.to/8omtX
P-148176
carlosmay
» 2016-05-13 23:13:56
Zrobiłbym coś takiego, ale te gołe
new
 i
delete
 tutaj nie pasują.

C/C++
#include <iostream>
#include <algorithm> // std::count_if - zlicza wystąpienia w tablicy

int ** test( int * tab, int n )
{
    int i;
   
    // przydzielanie pamięci dla tablicy wskaźników
    int ** tab2d = new int *[ 2 ];
   
    // obliczenie ile jest dzielników liczby n
    int numberOfDivisors = std::count_if( tab, tab + n,
    [ = ]( int elem ) { return n % elem == 0; } );
   
    // przydzielenie pamięci dla tablicy dzielników
    tab2d[ 0 ] = new int[ numberOfDivisors + 1 ];
    tab2d[ 0 ][ 0 ] = numberOfDivisors + 1; // pierwszy element przechowuje długość tablicy
   
    // wypełnienie tablicy
    i = 0;
    std::for_each( tab, tab + n,
    [ & ]( int elem )
    {
        if( n % elem == 0 )
        {
            tab2d[ 0 ][ ++i ] = elem;
        }
    } );
   
    // obliczenie ile jest liczb parzystych w tablicy tab
    int theNumberOfOddNumbers = std::count_if( tab, tab + n,
    []( int elem ) { return elem % 2 == 0; } );
   
    // przydzielenie pamięci dla tablicy parzystych
    tab2d[ 1 ] = new int[ theNumberOfOddNumbers + 1 ];
    tab2d[ 1 ][ 0 ] = theNumberOfOddNumbers + 1; // pierwszy element przechowuje długość tablicy
   
    // wypełnieni tablicy
    i = 0;
    std::for_each( tab, tab + n,
    [ & ]( int elem )
    {
        if( elem % 2 == 0 )
        {
            tab2d[ 1 ][ ++i ] = elem;
        }
    } );
   
    // zwróć wskaźnik na tablicę wskaźników
    return tab2d;
}

int main( int argc, char * argv[] )
{
    int tabN[ 10 ] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int ** tab2dPtr;
    tab2dPtr = test( tabN, sizeof( tabN ) / sizeof( int ) );
   
    // wypisz zawartość tablic
    for( int i = 1; i < tab2dPtr[ 0 ][ 0 ]; ++i )
    {
        std::cout << tab2dPtr[ 0 ][ i ] << ' ';
    }
    std::cout << '\n';
   
    for( int i = 1; i < tab2dPtr[ 1 ][ 0 ]; ++i )
    {
        std::cout << tab2dPtr[ 1 ][ i ] << ' ';
    }
   
    delete[] tab2dPtr[ 1 ];
    delete[] tab2dPtr[ 0 ];
    delete[] tab2dPtr;
   
   
    std::cin.get();
}

Zamiast gołych dynamicznych tablic
std::vector <>
, albo na upartego bezpieczne wskaźniki
std::shared_ptr <>
 lub
std::unique_ptr <>
.

@edit:
Zapomniałem napisać, że nie ma tutaj powiększania tablic, gdy braknie miejsca.
  • alokujesz nową tablicę większą o "+2"
  • kopiujesz zawartość starej do nowej
  • zwalniasz pamięć starej
  • przypisujesz do wskaźnika nową

Funkcja powiększająca tablicę o 2.
C/C++
int * MagnificationArray( int * arr, int n )
{
    int * tempArr = new int[ n + 2 ];
    tempArr[ 0 ] = n + 2;
    for( int i = 1; i < n; ++i )
    {
        tempArr[ i ] = arr[ i ];
    }
   
    delete[] arr;
    return tempArr;
}

// ......

// warunek w pętli dodającej elementy do tablicy
if( i == tab2d[ 0 ][ 0 ] )
{
    tab2d[ 0 ] = MagnificationArray( tab2d[ 0 ], tab2d[ 0 ][ 0 ] );
    tab2d[ 0 ][ ++i ] = elem;
}

}
P-148179
« 1 »
  Strona 1 z 1