pekfos |
» 2019-04-17 22:47:00 int ileElementow =( tablica + wTab ) - tablica;
|
Czym to się różni od wTab? |
|
rottingham Temat założony przez niniejszego użytkownika |
» 2019-04-17 22:59:15 Heh... Chyba tylko stopniem zawiłości. Bo funkcjonalność w tym kodzie jest taka sama - poprawiony kod zdaje się działać tak samo. Czy na tym poziomie powinienem coś jeszcze udoskonalić w tym kodzie? #include <iostream>
using namespace std;
int main() { int wTab = 2; int * tablica = new int[ wTab ], rozmiar = 0; cout << "Podawaj liczby, 0 konczy wczytywanie.\n"; while( true ) { int liczba; cin >> liczba; if( liczba == 0 ) break; if( wTab > rozmiar ) { tablica[ rozmiar ] = liczba; rozmiar++; } else { wTab += 3; int * nowa = new int[ wTab ]; for( int i = 0; i < rozmiar; ++i ) nowa[ i ] = tablica[ i ]; nowa[ rozmiar ] = liczba; delete[] tablica; tablica = nowa; rozmiar++; } } cout << "Te same liczby, ale odwrotnie!\n"; for( int i = rozmiar - 1; i >= 0; --i ) cout << *( tablica + i ) << ' '; delete[] tablica; }
|
|
pekfos |
» 2019-04-17 23:02:29 Po co tam if else? Jeśli jest miejsce, dodajesz element, jeśli nie ma miejsca, robisz miejsce i dodajesz element. |
|
rottingham Temat założony przez niniejszego użytkownika |
» 2019-04-18 00:46:49 Masz na myśli, że wystarczy tylko jeden if np. w takiej formie? #include <iostream>
using namespace std;
int main() { int wTab = 2; int * tablica = new int[ wTab ], rozmiar = 0; cout << "Podawaj liczby, 0 konczy wczytywanie.\n"; while( true ) { int liczba; cin >> liczba; if( liczba == 0 ) break; tablica[ rozmiar ] = liczba; rozmiar++; if( wTab == rozmiar ) { wTab += 3; int * nowa = new int[ wTab ]; for( int i = 0; i < rozmiar; ++i ) nowa[ i ] = tablica[ i ]; nowa[ rozmiar ] = liczba; delete[] tablica; tablica = nowa; } } cout << "Te same liczby, ale odwrotnie!\n"; for( int i = rozmiar - 1; i >= 0; --i ) cout << *( tablica + i ) << ' '; delete[] tablica; }
|
|
pekfos |
» 2019-04-18 07:19:28 Lepiej najpierw sprawdzaj czy jest miejsce. Nie wprowadzasz wtedy założeń i nie musisz alokować pamięci przed pętlą - jak w kodzie przykładowym. |
|
rottingham Temat założony przez niniejszego użytkownika |
» 2019-04-18 17:56:50 Nie wprowadzasz wtedy założeń |
Ale jakiekolwiek założenie jest potrzebne? Jeżeli chodzi o sprawdzanie czy jest miejsce, to przychodzi mi do głowy tylko albo użycie if albo zmiennej typu bool. Czy to rozwiązanie jest dobre? Czy da się to zrobić w ogóle bez ifa? #include <iostream>
using namespace std;
int main() { int wTab = 2; int * tablica = new int[ wTab ], rozmiar = 0; cout << "Podawaj liczby, 0 konczy wczytywanie.\n"; while( true ) { int liczba; cin >> liczba; if( liczba == 0 ) break; if( rozmiar < wTab ) { tablica[ rozmiar ] = liczba; rozmiar++; continue; } wTab += 3; cout << wTab << endl; int * nowa = new int[ wTab ]; for( int i = 0; i < rozmiar; ++i ) nowa[ i ] = tablica[ i ]; nowa[ rozmiar ] = liczba; delete[] tablica; tablica = nowa; rozmiar++; } cout << "Te same liczby, ale odwrotnie!\n"; for( int i = rozmiar - 1; i >= 0; --i ) cout << *( tablica + i ) << ' '; delete[] tablica; }
|
|
nanoant20 |
» 2019-04-18 18:02:19 ten Twój kod jest poprawny if( liczba == 0 ) break;
if( wTab == rozmiar ) { code oki code oki code oki code oki tablica = nowa; rozmiar++; }
tablica[ rozmiar ] = liczba; }
i jeszcze jedno if( wTab == rozmiar ) powinno byc if( wTab >= rozmiar ) a na pytanie Czy da się to zrobić w ogóle bez ifa? |
tak można skorzystać z kontenera vector, ale @pekfos znowu da mi reprymende, i napisze, że OT off-topic no i nie nauczyłbyś się zarządzać pamięcia |
|
rottingham Temat założony przez niniejszego użytkownika |
» 2019-04-18 20:42:49 @nanoant20 - tak na wstępie to wielkie dzięki za pomoc w rozwiązywaniu tego zadania. Dopiero przyswojenie lekcji Dynamiczne zarządzanie pamięcią new i delete i dokładna analiza kodu, który tam jest przedstawiony naprowadziła mnie na dobre... Ba! Na jakiekolwiek tory. Co do kodu, który zaproponowałeś
if( liczba == 0 ) break;
if( wTab == rozmiar ) { code oki code oki code oki code oki tablica = nowa; rozmiar++; }
tablica[ rozmiar ] = liczba;
}
|
Czy rozmiar++; nie powinien być poza ifem, na samym końcu pętli? Wstawienie go przed przypisaniem wartości sprawi, że miejsce zerowe w tabeli będzie pominięte. Gdy rozmiar++; jest w ifie to nie ma szans, żeby warunek się spełnił. Może, że nie zrozumiałem Twojego szablonu? A w tym przypadku: i jeszcze jedno
if( wTab == rozmiar ) powinno byc if( wTab >= rozmiar ) |
Czy przy takim warunku nie prowadzimy do zwiększania tabeli przy każdym wykonaniu pętli? W końcu od samego początku ilość elementów w tabeli jest mniejsza od wielkości tabeli? |
|
1 2 « 3 » 4 5 |