tablica dynamiczna
Ostatnio zmodyfikowano 2016-01-03 13:12
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 #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; }
|
|
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 #include <iostream> #include<string>
using namespace std;
int main() { string s; char znak; while( 1 ) { cin >> znak; if( znak == '0' ) break; s += znak; } cout << s << endl; }
|
|
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ł. 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( ) tablica = powieksz( tablica, & rozmiar ); delete[] tablica; }
|
|
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 #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; }
|
|
« 1 » |