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

Wstaw element na koniec tablicy

Ostatnio zmodyfikowano 2017-06-08 09:06
Autor Wiadomość
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

C/C++
#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?
P-162210
Kinexity
» 2017-06-07 20:30:37
Aby kopiować dane z jednej tablicy do drugiej lepiej i łatwiej jest użyć funkcji
memcpy()
 - http://cpp0x.pl/dokumentacja​/standard-C/memcpy/246
P-162211
latajacaryba
» 2017-06-07 20:31:41
C/C++
int max_pom = max_liczba_elem * 2;
// dalszy kod

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ł.
P-162212
pekfos
» 2017-06-07 20:36:09
C/C++
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ę.
C/C++
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.
P-162213
badyl94
Temat założony przez niniejszego użytkownika
» 2017-06-07 20:42:58
pekfos
czyli jak to zmienić przez wskaźnik ??
P-162214
pekfos
» 2017-06-07 20:45:23
Zmień sam wskaźnik
C/C++
delete[] tablica;
tablica = tab_pom;
P-162215
Kinexity
» 2017-06-07 21:23:44
Nieco zmienione rozwiązanie, które powinno działać. Pozwoliłem sobie dodać parę rzeczy.

C/C++
#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;
}
P-162217
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.
P-162220
« 1 » 2
  Strona 1 z 2 Następna strona