[C++] dynamiczne tablice
Ostatnio zmodyfikowano 2016-05-13 23:13
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! |
|
carlosmay |
» 2016-05-13 19:42:03 Czy już coś napisałeś? Z czym masz kłopot? |
|
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 |
|
carlosmay |
» 2016-05-13 23:13:56 Zrobiłbym coś takiego, ale te gołe new i delete tutaj nie pasują. #include <iostream> #include <algorithm>
int ** test( int * tab, int n ) { int i; int ** tab2d = new int *[ 2 ]; int numberOfDivisors = std::count_if( tab, tab + n, [ = ]( int elem ) { return n % elem == 0; } ); tab2d[ 0 ] = new int[ numberOfDivisors + 1 ]; tab2d[ 0 ][ 0 ] = numberOfDivisors + 1; i = 0; std::for_each( tab, tab + n, [ & ]( int elem ) { if( n % elem == 0 ) { tab2d[ 0 ][ ++i ] = elem; } } ); int theNumberOfOddNumbers = std::count_if( tab, tab + n, []( int elem ) { return elem % 2 == 0; } ); tab2d[ 1 ] = new int[ theNumberOfOddNumbers + 1 ]; tab2d[ 1 ][ 0 ] = theNumberOfOddNumbers + 1; i = 0; std::for_each( tab, tab + n, [ & ]( int elem ) { if( elem % 2 == 0 ) { tab2d[ 1 ][ ++i ] = elem; } } ); 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 ) ); 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. Funkcja powiększająca tablicę o 2. 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; }
if( i == tab2d[ 0 ][ 0 ] ) { tab2d[ 0 ] = MagnificationArray( tab2d[ 0 ], tab2d[ 0 ][ 0 ] ); tab2d[ 0 ][ ++i ] = elem; }
} |
|
« 1 » |