Wstaw element na koniec tablicy
Ostatnio zmodyfikowano 2017-06-08 09:06
badyl94 Temat założony przez niniejszego użytkownika |
Wstaw element na koniec tablicy » 2017-06-07 20:18:29 Hej mam napisać taką funkcje: push_back – wstawia element na koniec wektora. Jeśli do swojego wektora typu WektorDouble spróbujesz dodać nowy element i okaże się, że nie ma dla niego miejsca, musisz utworzyć nową tablicę dynamiczną o pojemności dwukrotnie większej od poprzedniej tablicy i wartości ze starej tablicy skopiować do nowej #include <iostream>
using namespace std; class WektorDouble { int max_liczba_elem; double * tablica = new double[ max_liczba_elem ]; int liczba_elem; public: WektorDouble( int max_elementow ) : max_liczba_elem( max_elementow ) { cout << "Podaj liczbe elementow: " << endl; cin >> liczba_elem; if( liczba_elem <= max_elementow ) for( int i = 0; i < liczba_elem; i++ ) cin >> tablica[ i ]; for( int i = liczba_elem; i < max_liczba_elem; i++ ) tablica[ i ] = 0; }; void push_back( double liczba ) { if( liczba_elem >= max_liczba_elem ) { int max_pom = max_liczba_elem * 2; double * tab_pom = new double[ max_pom ]; for( int i = 0; i < max_liczba_elem; i++ ) tab_pom[ i ] = tablica[ i ]; max_liczba_elem = max_pom; for( int i = 0; i < max_liczba_elem; i++ ) tablica[ i ] = tab_pom[ i ]; tablica[ liczba_elem ] = liczba; } } void wyswietl() const { for( int i = 0; i < max_liczba_elem; i++ ) cout << tablica[ i ]; cout << endl; } }
int main() { WektorDouble tablica1( 5 ); cout << "Tablica 1: " << endl; tablica1.wyswietl(); tablica1.push_back(); cout << "push back: " << endl; tablica1.wyswietl(); return 0; }
Doradzi mi ktoś dlaczego program się zawiesza? |
|
Kinexity |
» 2017-06-07 20:30:37 |
|
latajacaryba |
» 2017-06-07 20:31:41 int max_pom = max_liczba_elem * 2;
max_liczba_elem = max_pom; for( int i = 0; i < max_liczba_elem; i++ ) tablica[ i ] = tab_pom[ i ];
Sprawdź, czy nie wychodzisz tu poza zakres tablicy. max_pom to 2 * wielkosc tablicy tablica. Może się mylę, ale ja bym to sprawdził. |
|
pekfos |
» 2017-06-07 20:36:09 int max_pom = max_liczba_elem * 2; double * tab_pom = new double[ max_pom ]; for( int i = 0; i < max_liczba_elem; i++ ) tab_pom[ i ] = tablica[ i ];
max_liczba_elem = max_pom; for( int i = 0; i < max_liczba_elem; i++ ) tablica[ i ] = tab_pom[ i ];
tablica[ liczba_elem ] = liczba; |
Chyba nie rozumiesz, po co zaalokowałeś tu dodatkową tablicę. int max_liczba_elem; double * tablica = new double[ max_liczba_elem ]; |
Ten zapis nie oznacza, że te zmienne są w jakikolwiek sposób ze sobą związane, więc w szczególności, rozmiar tablicy nie zmieni się sam, jak zmienisz max_liczba_elem. |
|
badyl94 Temat założony przez niniejszego użytkownika |
» 2017-06-07 20:42:58 pekfos czyli jak to zmienić przez wskaźnik ?? |
|
pekfos |
» 2017-06-07 20:45:23 Zmień sam wskaźnik delete[] tablica; tablica = tab_pom; |
|
Kinexity |
» 2017-06-07 21:23:44 Nieco zmienione rozwiązanie, które powinno działać. Pozwoliłem sobie dodać parę rzeczy. #include <iostream> #include "memory.h"
using namespace std; class WektorDouble { private: int max_liczba_elem, max_liczba_elem_op, liczba_elem, liczba_elem_op; double * tablica, * tablica_op; public: WektorDouble( int max_elementow ) : max_liczba_elem( max_elementow ) { tablica = new double[ max_liczba_elem ]; cout << "Podaj liczbe elementow: "; cin >> liczba_elem; do { if( liczba_elem <= max_elementow ) { cout << "Podaj elementy: "; for( int i = 0; i < liczba_elem; i++ ) { cin >> tablica[ i ]; } for( int i = liczba_elem; i < max_liczba_elem; i++ ) { tablica[ i ] = 0; } } else { max_liczba_elem_op = max_liczba_elem * 2; tablica_op = new double[ max_liczba_elem_op ]; delete[] tablica; tablica = tablica_op; tablica_op = nullptr; } } while( liczba_elem > max_liczba_elem ); }; void push_back( double liczba ) { if( liczba_elem >= max_liczba_elem ) { max_liczba_elem_op = max_liczba_elem * 2; tablica_op = new double[ max_liczba_elem_op ]; memcpy( tablica_op, tablica, max_liczba_elem * sizeof( double ) ); delete[] tablica; tablica = tablica_op; tablica[ liczba_elem++ ] = liczba; tablica_op = nullptr; } else { tablica[ liczba_elem++ ] = liczba; } } void wyswietl() const { cout << "Zawartosc wektora: "; for( int i = 0; i < liczba_elem; i++ ) { cout << tablica[ i ] << " "; } cout << endl; } };
int main() { WektorDouble tablica( 5 ); cout << "Tablica 1: " << endl; tablica.wyswietl(); tablica.push_back( 1.2 ); cout << "push back: " << endl; tablica.wyswietl(); return 0; }
|
|
pekfos |
» 2017-06-07 22:59:49 Pozwoliłem sobie dodać parę rzeczy. |
Dobry przykład, jak nie programować. Dużo niepotrzebnego kodu i zmiennych o zbyt dużym zakresie. Jak już wprowadzasz rzeczy z własnej inicjatywy, to chociaż niech to ma jakiś sens. Tak naprawdę dodanie tych konkretnych 'paru rzeczy' powinno skrócić kod, a nie sprawić, że jest go 2 razy więcej. |
|
« 1 » 2 |