marcinpro Temat założony przez niniejszego użytkownika |
Lekcja 44 - zarządzanie pamięcią new i delete. » 2018-02-25 17:17:14 Witam przerabiam lekcje 44 i było za zadanie "Zmodyfikuj przykładowy kod tak, aby nowa tablica nie była tworzona za każdym razem, gdy dodawany jest nowy element." Zrobiłem program i działa, ale nie mam pewności, że jest dobrze zrobiony. #include <iostream>
using namespace std;
int main() { int indeks = 0; int * tab = new int[ 100 ]; cout << "Podawaj liczby, 0 konczy wczytywanie.\n"; while( true ) { int liczba = 0; cin >> liczba; if( liczba == 0 ) break; tab[ indeks ] = liczba; indeks++; } for( int i = indeks - 1; i >= 0; --i ) cout << tab[ i ] << ' '; delete[] tab; }
|
|
YooSy |
» 2018-02-25 17:28:19 Nie jest zgodny z treścią zadania. Nie masz zabezpieczenia przed wyjściem poza tablicę, oraz nie ma powiększania tablicy jeśli obecna jest za mała. W zadaniu należy zapewnić powiększanie tablicy o więcej niż jeden element, aby zyskać na wydajności. |
|
marcinpro Temat założony przez niniejszego użytkownika |
» 2018-02-26 19:05:41 Czyli ja mam tworzyć nową tablicę, ale np co 5 elementów, a nie co jeden? |
|
YooSy |
» 2018-02-26 19:19:46 Optymalnie będzie podwoić rozmiar. |
|
marcinpro Temat założony przez niniejszego użytkownika |
» 2018-02-26 19:56:23 Ok, zrobiłem coś takiego. #include <iostream>
using namespace std;
int main() { int indeks = 0; int rozmiartab = 1; int iloscliczb = 0; int * tab = nullptr; cout << "Podawaj liczby, 0 konczy wczytywanie.\n"; while( true ) { int liczba = 0; cin >> liczba; if( liczba == 0 ) break; else iloscliczb++; if( iloscliczb >= rozmiartab ) { rozmiartab = rozmiartab * 2; int * nowa = new int[ rozmiartab ]; for( int i = 0; i < indeks; ++i ) nowa[ i ] = tab[ i ]; nowa[ indeks ] = liczba; delete[] tab; tab = nowa; } else { tab[ indeks ] = liczba; } indeks++; } for( int i = indeks - 1; i >= 0; --i ) cout << tab[ i ] << ' '; }
|
|
YooSy |
» 2018-02-26 22:02:00 Trochę przekombinowana instrukcja warunkowa w pętli. Wystarczy: if( iloscliczb >= rozmiartab ) { rozmiartab = rozmiartab * 2; int * nowa = new int[ rozmiartab ]; for( int i = 0; i < indeks; ++i ) nowa[ i ] = tab[ i ]; delete[] tab; tab = nowa; } tab[ indeks ] = liczba;
Wstawienie nowej wartości wykonywane było w obu gałęziach instrukcji warunkowej (niepotrzebnie), przecież wychodzi na to, że dodajesz do tablicy w każdym obiegu pętli, więc można zrobić to po ewentualnym rozszerzeniu rozmiaru tablicy. Jeszcze lepiej byłoby podzielić kod na funkcje. |
|
marcinpro Temat założony przez niniejszego użytkownika |
» 2018-03-02 10:16:25 Ok, poprawiłem kod. Dodałem funkcje do wypisywania. Bo dodawanie liczby z funkcji nie ma sensu bo więcej kodu, jak i sprawdzanie czy jest miejsce itp. #include <iostream>
using namespace std;
void wypisz( int iloscliczb, int tab[], int rozmiartab )
{ cout << "Liczby podane do tablicy wypisane odwrotnie: "; for( int i = iloscliczb - 1; i >= 0; --i ) cout << tab[ i ] << ", "; cout << endl << "Rozmiar tablicy:" << rozmiartab << endl; }
int main() { int liczba = 0; int indeks = 0; int rozmiartab = 1; int iloscliczb = 0; int * tab = nullptr; cout << "Podawaj liczby, 0 konczy wczytywanie.\n"; while( true ) { int liczba = 0; cin >> liczba; if( liczba == 0 ) break; else iloscliczb++; if( iloscliczb >= rozmiartab ) { rozmiartab = rozmiartab * 2; int * nowa = new int[ rozmiartab ]; for( int i = 0; i < indeks; ++i ) nowa[ i ] = tab[ i ]; delete[] tab; tab = nowa; } tab[ indeks ] = liczba; indeks++; } wypisz( iloscliczb, tab, rozmiartab ); return 0; }
|
|
YooSy |
» 2018-03-02 10:28:58 Dodaj jeszcze funkcję, która rozszerzy tablicę. Niech przyjmie jako argument obecną tablicę i adres rozmiaru tablicy. int * rozszerz_tablice( int * stara_tablica, int * rozmiar ) { int * nowa_tablica = new int[ rozmiar * 2 ]; rozmiar *= 2; delete[] stara_talica; return nowa_tablica; }
i użyć jest w funkcji głównej. Znacznie uprości to kod. Można jeszcze dopisać funkcję kopiującą tablicę i dodać w niej zabezpieczenie przed nieprawidłowym kopiowaniem. |
|
« 1 » 2 |