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

tablica dynamiczna

Ostatnio zmodyfikowano 2016-01-03 13:12
Autor Wiadomość
Detroq
Temat założony przez niniejszego użytkownika
tablica dynamiczna
» 2016-01-03 12:10:41
Witam mam takie zadanie w którym muszę stworzyć dynamiczna tablice znaków która w miarę wprowadzania kolejnych znaków będzie się dynamicznie powiększała. Moje pytanie dotyczy tego ze w programie który napisałem moja tablica jest ograniczona czy da sie zrobic to inaczej?
Prosze oto kod
C/C++
#include <iostream>
#include <conio.h>

using namespace std;

void funkcja_e( char * & wsk, int & pojemnosc )
{
    int i = 0;
    char znak;
    for( i; i < pojemnosc; i++ )
    {
        znak = getche();
        if( znak == 13 )
             break;
        else
        {
            wsk[ i ] = znak;
        }
       
    }
   
    char * nowa_tablica = new char[ i ];
   
    for( int j = 0; j < i; j++ )
    {
        nowa_tablica[ j ] = wsk[ j ];
    }
   
    delete[] wsk;
    wsk = nowa_tablica;
    pojemnosc = i;
   
}

int main( int argc, char ** argv )
{
    int pojemnosc = 100;
    char * tablica = new char[ pojemnosc ];
   
    funkcja_e( tablica, pojemnosc );
   
    for( int i = 0; i < pojemnosc; i++ )
    {
        cout << endl << "tablica : " << tablica[ i ];
    }
   
   
    delete[] tablica;
    return 0;
}
P-142759
mateczek
» 2016-01-03 12:27:44
jak dla mnie takie zadanie jest równoznaczne z napisaniem uproszczonej klasy "string" (kontenera)!!! Bo to coś co stworzysz już nie będzie tablicą!!!
klasa powinna mieć składową rozmiar i jeśli rozmiar będzie większy od pojemności tablicy klasa powinna realokować tablicę!!!
klasa powinna mieć przeładowany operator "[]" dostęp do znaku i może coś "+="-dodaj znak 

widzisz problem w zadaniu jest taki że taka tablica już istnieje w c++ i nawet pisząc swoją klasę to i tak do środka wsadził bym string :P

C/C++
#include <iostream>
#include<string>

using namespace std;

int main()
{
    string s;
    char znak;
    while( 1 ) {
        cin >> znak;
        if( znak == '0' ) break; //koniec wprowadzana znakków z klawiatury!!!
       
        s += znak; //tablica sama się powiększa gdy dopisujesz znak !!!
    }
    cout << s << endl;
}
P-142761
carlosmay
» 2016-01-03 12:35:10
Dodaj warunek, który będzie sprawdzał kończące się zapasy i wywoływał funkcję powiększającą rozmiar.
Powiększać też warto o jakąś konkretną wartość lub podwajać (powiększanie po jednym znaku jest mało efektywne).
Klasa też dobry pomysł.
C/C++
int * powieksz( int * tab, int * rozmiar ) {
    int * temp = new int[ * rozmiar + 32 ];
    for( int i = 0; i < * rozmiar; i++ )
         temp[ i ] = tab[ i ];
   
    * rozmiar = * rozmiar + 32;
    delete[] tab;
    return temp;
}

int main()
{
    int rozmiar = 32;
    int * tablica = new int[ rozmiar ];
    if( /*rozmiar*/ )
         tablica = powieksz( tablica, & rozmiar );
   
    delete[] tablica;
}
 
P-142762
Detroq
Temat założony przez niniejszego użytkownika
» 2016-01-03 13:12:27
dzięki za pomoc, klasy dobry pomysł ale myślę że ja to muszę bardziej od podstaw zrobić, więc pożyczyłem sobie od carlosmay(jeśli oczywiście Ci to nie przeszkadza ;d)i zmodyfikowalem tą funkcje powieksz i teraz powinno byc ok ;d

C/C++
#include <iostream>
#include <conio.h>

using namespace std;
char * powieksz( char * tab, int * rozmiar );
void funkcja_e( char * & wsk, int & pojemnosc )
{
    int i = 0;
    char znak;
    for( i;; i++ )
    {
        znak = getche();
        if( znak == 13 )
             break;
        else
        {
            wsk[ i ] = znak;
        }
        if(( i + 1 ) == pojemnosc )
        {
            wsk = powieksz( wsk, & pojemnosc );
        }
       
       
    }
   
    char * nowa_tablica = new char[ i ];
   
    for( int j = 0; j < i; j++ )
    {
        nowa_tablica[ j ] = wsk[ j ];
    }
   
    delete[] wsk;
    wsk = nowa_tablica;
    pojemnosc = i;
   
}

int main( int argc, char ** argv )
{
    int pojemnosc = 4;
    char * tablica = new char[ pojemnosc ];
   
    funkcja_e( tablica, pojemnosc );
   
    for( int i = 0; i < pojemnosc; i++ )
    {
        cout << endl << "tablica : " << tablica[ i ];
    }
   
   
    delete[] tablica;
    return 0;
}

char * powieksz( char * tab, int * rozmiar )
{
    char * tab2 = new char[ * rozmiar + 50 ];
    for( int i = 0; i < * rozmiar; i++ )
         tab2[ i ] = tab[ i ];
   
    * rozmiar = * rozmiar + 50;
    delete[] tab;
    return tab2;
}
P-142768
« 1 »
  Strona 1 z 1