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

R. 44 - zadanie domowe - czy o to chodziło?

Ostatnio zmodyfikowano 2019-04-20 12:20
Autor Wiadomość
pekfos
» 2019-04-17 22:47:00
C/C++
int ileElementow =( tablica + wTab ) - tablica;
Czym to się różni od wTab?
P-174450
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?


C/C++
#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
        {
            // Brakuje miejsca, utwórz większą tablicę
            wTab += 3;
            int * nowa = new int[ wTab ];
           
            // Skopiuj dane
            for( int i = 0; i < rozmiar; ++i )
                 nowa[ i ] = tablica[ i ];
           
            // Dodaj nową wartość
            nowa[ rozmiar ] = liczba;
           
            // Usuń starą tablicę
            delete[] tablica;
           
            // Zakutalizuj zmienne
            tablica = nowa;
            rozmiar++;
        }
       
    }
   
    cout << "Te same liczby, ale odwrotnie!\n";
   
    for( int i = rozmiar - 1; i >= 0; --i )
         cout << *( tablica + i ) << ' ';
   
    delete[] tablica;
}
P-174452
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.
P-174453
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?

C/C++
#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 )
        {
            // Brakuje miejsca, utwórz większą tablicę
            wTab += 3;
            int * nowa = new int[ wTab ];
           
            // Skopiuj dane
            for( int i = 0; i < rozmiar; ++i )
                 nowa[ i ] = tablica[ i ];
           
            // Dodaj nową wartość
            nowa[ rozmiar ] = liczba;
           
            // Usuń starą tablicę
            delete[] tablica;
           
            // Zakutalizuj zmienne
            tablica = nowa;
        }
    }
   
   
   
    cout << "Te same liczby, ale odwrotnie!\n";
   
    for( int i = rozmiar - 1; i >= 0; --i )
         cout << *( tablica + i ) << ' ';
   
    delete[] tablica;
}
P-174454
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.
P-174455
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?

C/C++
#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;
        }
       
        // Brakuje miejsca, utwórz większą tablicę
        wTab += 3;
        cout << wTab << endl;
        int * nowa = new int[ wTab ];
       
        // Skopiuj dane
        for( int i = 0; i < rozmiar; ++i )
             nowa[ i ] = tablica[ i ];
       
        // Dodaj nową wartość
        nowa[ rozmiar ] = liczba;
       
        // Usuń starą tablicę
        delete[] tablica;
       
        // Zakutalizuj zmienne
        tablica = nowa;
        rozmiar++;
       
    }
   
   
   
    cout << "Te same liczby, ale odwrotnie!\n";
   
    for( int i = rozmiar - 1; i >= 0; --i )
         cout << *( tablica + i ) << ' ';
   
    delete[] tablica;
}
P-174456
nanoant20
» 2019-04-18 18:02:19
ten Twój kod jest poprawny

C/C++
if( liczba == 0 )
     break;

if( wTab == rozmiar )
{
    // Brakuje miejsca, utwórz większą tablicę
    code oki
    // Skopiuj dane
    code oki
    // Dodaj nową wartość
    code oki
    // Usuń starą tablicę
    code oki
    // Zakutalizuj zmienne
    tablica = nowa;
    rozmiar++;
}
//wstawiasz tylko
tablica[ rozmiar ] = liczba;
} //<-- klamra zamykająca petle while

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
P-174457
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ś

C/C++
if( liczba == 0 )
     break;

if( wTab == rozmiar )
{
    // Brakuje miejsca, utwórz większą tablicę
    code oki
    // Skopiuj dane
    code oki
    // Dodaj nową wartość
    code oki
    // Usuń starą tablicę
    code oki
    // Zakutalizuj zmienne
    tablica = nowa;
    rozmiar++;
}
//wstawiasz tylko
tablica[ rozmiar ] = liczba;

} //<-- klamra zamykająca petle while
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?
P-174458
1 2 « 3 » 4 5
Poprzednia strona Strona 3 z 5 Następna strona