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-06 00:35:15
Co zatem jest nie tak?
Poddaję się.. Próbuję cię zmusić do zauważenia oczywistego błędu w kodzie, ale stawiasz wyjątkowy opór ;) Wpisać 45 liczb do 0-elementowej tablicy to też jakieś osiągnięcie. Zadanie brzmi
Zmodyfikuj przykładowy kod tak, aby nowa tablica nie była tworzona za każdym razem, gdy dodawany jest nowy element.
Twoje rozwiązanie nie ma praktycznie żadnej funkcjonalności z przykładowego kodu. Żeby nie tworzyć tablicy z każdym dodawanym elementem, nie tworzysz tablicy w ogóle. Trudno o bardziej oczywisty błąd. Nie wykorzystujesz nawet wiedzy z lekcji.
P-174342
rottingham
Temat założony przez niniejszego użytkownika
» 2019-04-15 13:03:15
Czy to jest dobre rozwiązanie?

C/C++
#include <iostream>

int main()
{
    int * tablica = new int[ 10 ], rozmiar = 0;
    std::cout << "Podawaj liczby, 0 konczy wczytywanie.\n";
   
    while( true )
    {
        int liczba;
        int i = 0;
        std::cin >> liczba;
       
        if( liczba == 0 )
             break;
       
        if( i == 9 )
        {
            int * nowa = new int[ rozmiar + 1 ];
           
            for( int i = 0; i < rozmiar; ++i )
                 nowa[ i ] = tablica[ i ];
           
           
            delete[] tablica;
           
            tablica = new int[ rozmiar + 10 ];
            tablica = nowa;
            i = 0;
        }
       
        tablica[ rozmiar ] = liczba;
        rozmiar++;
        i++;
    }
   
    std::cout << "Te same liczby, ale odwrotnie!\n";
   
    for( int i = rozmiar - 1; i >= 0; --i )
         std::cout << tablica[ i ] << ' ';
   
    delete[] tablica;
}
P-174427
pekfos
» 2019-04-15 13:19:20
Nie działa. Po co w ogóle pytasz, czy jest dobrze, gdy masz tak oczywiste błędy w kodzie jak to:
C/C++
tablica = new int[ rozmiar + 10 ];
tablica = nowa;
Na pierwszy rzut oka widać, że to jest błędne. A na drugi rzut oka - że ten kod się nawet nigdy nie wykonuje. Jeśli masz takiego pecha z wysypywaniem programu, napisz własne testy - zamiast pytać mnie, czy rozwiązanie jest poprawne, spróbuj mi udowodnić, że takie jest. Wypisz jakiś tekst, gdy realokujesz pamięć, dodaj ifa, by testować czy nie przekraczasz zakresu tablicy. To nie jest nic trudnego, wystarczy nie robić tych zadań na autopilocie i użyć we własnym zakresie wiedzy, którą powinieneś mieć..
P-174428
nanoant20
» 2019-04-15 20:19:28
patrząc na tą lekcje i zamieszczony w nim treśc zadania
Zmodyfikuj przykładowy kod tak, aby nowa tablica nie była tworzona za każdym razem, gdy dodawany jest nowy element.
to jest tam napisane krok po kroku całe rozwiązanie

trzeba tylko powstawiać kilka warunków
i stworzyć tablicę zgodnie z treścią zadania

Twoja tablica przyjmuje na samym początku 10 elementów
int * tablica = new int[ 10 ]
 za dużo elementów
w tablicy jak na początek, zaczynasz marnować pamięć,
ponieważ nie wiesz ile zostanie wpisanych elementów,
więc lepiej zrobić tablicę o minimalnym rozmiarze
C/C++
int iloscelementow = 2, rozmiar = 0;
int * tablica = new int[ iloscelementow ]

a potem zamiast tych komentarzy <-- to nie są komentarze tylko polecenia
co trzeba wykonać, uzupełniasz o swój kod
tylko zamiast tworzyć tablicę za każdym razem o 1 element
tak jak jest tam pokazane, patrz poniżej
C/C++
// Brakuje miejsca, utwórz większą tablicę
int * nowa = new int[ rozmiar + 1 ];
robisz np. tak
C/C++
if( ?>= ? ) //zamiast komentarza
     int * nowa_tablica = new int[ iloscelementow * 2 ];

Jeżeli używałeś kiedyś kontenera
vector < int > wektor;

to tam powiększa się kontener int o 4 elementy

węc możesz swoją tablicę powiększać o 4 elementy
int * nowa_tablica = new int[ iloscelementow + 4 ];


Warto szukać złotego środka, aby przypadkiem nie marnować pamięci.
Może dojść do sytuacji, że zarezerwowanej pamięć jest prawie dwa razy więcej
niż ilości elementów znajdujących się w tablicy!

 //edit moim zdaniem optymalnie będzie tak
C/C++
int iloscelementow = 1; rozmiar = 0;
int * nowa_tablica = new int[ iloscelementow * 2 ];


//edit @pekfos (2019-04-15 20:30:32) 3. Przyjąłem do wiadomości.
Wierzę, że nie popełniłem jakegoś wielkiego faux pas.
To zadanie odzwierciedla działanie kontenera vector.
Doczytałem. W kontenerze vector pamięć jest zawsze podwojona,
bawiąc się klasą vector jeśli kontener zawierał (5) elementów,
przydzielał on nowy blok zdolny do przechowywania (8) elementów
i dlatego wyciągnołem błędny wniosek. Dzięki za zwrócenie mi uwagi.
P-174433
pekfos
» 2019-04-15 20:30:32
Jeżeli używałeś kiedyś kontenera
vector < int > wektor;
 to tam powiększa się kontener int o 4 elementy
Zanim to przepadnie w >30 edycjach wiadomości:
1. To zależne od implementacji.
2.
C/C++
std::vector < int > v;
for( int i = 0; i < 20; ++i )
     std::cout << v.capacity() << ' ', v.push_back( i );
0 1 2 4 4 8 8 8 8 16 16 16 16 16 16 16 16 32 32 32
Nie.
3. Odpowiadając na pytanie dotyczące lekcji kursu, nie wychodź poza materiał kursu.
P-174434
rottingham
Temat założony przez niniejszego użytkownika
» 2019-04-16 22:53:07
Ok, zatem napisałem kod, w którym nowa tablica jest tworzona co każdy kolejny trzeci element.
Widać, że po zwiększaniu rozmiaru tablicy adres zmienia się losowo. Na końcu widać, że kolejne elementy są upakowane co cztery bajty. Zatem mogę wnioskować, że są elementami jednej tablicy?

Podejrzewam, że chodziło o bardziej wyrafinowane rozwiązanie niż to z użyciem zmiennej
int i
. Ale chciałbym, żeby na razie w ogóle to rozwiązanie poprawnie działało. Czy ten kod wyczerpuje znamiona dobrze wykonanego zadania?

C/C++
#include <iostream>

using namespace std;

int main()
{
    int * tablica = new int[ 2 ], rozmiar = 0;
    std::cout << "Podawaj liczby, 0 konczy wczytywanie.\n";
    int i = 0;
    while( true )
    {
        int liczba;
        std::cin >> liczba;
       
        if( liczba == 0 )
             break;
       
        if( i < 2 )
        {
            cout <<( int ) tablica << endl;
            tablica[ rozmiar ] = liczba;
            rozmiar++;
            i++;
        }
        else
        {
            // Brakuje miejsca, utwórz większą tablicę
            int * nowa = new int[ rozmiar + 2 ];
            cout << nowa << " " <<( int ) nowa << endl;
            // 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++;
            i = 0;
        }
       
    }
   
    std::cout << "Te same liczby, ale odwrotnie!\n";
   
    for( int i = rozmiar - 1; i >= 0; --i )
         std::cout <<( int )( tablica + i ) << ' ';
   
    delete[] tablica;
}

//edit
zmieniłem w kodzie
int * nowa = new int[ rozmiar + 2 ];

na
int * nowa = new int[ rozmiar + 3 ];
P-174437
pekfos
» 2019-04-16 23:04:08
Pomijając, że na koniec wypisujesz nie to co trzeba, zadanie jest wykonane poprawnie. Niezbyt elegancko, ale poprawnie. Zmienne w startowym kodzie były opisowo nazwane: rozmiar to rozmiar kolekcji liczb. Twoje i nazywa się jak się nazywa i znaczy co dokładnie..?
P-174438
rottingham
Temat założony przez niniejszego użytkownika
» 2019-04-17 22:37:30
Hmm... Moje
i
 miało sprawdzać ile razy wprowadzono liczbę do tablicy od ostatniego zwiększenia tablicy. To rzeczywiście rozwiązanie od siekiery. I chyba udało mnie się wymyślić coś bardziej błyskotliwego. Czyli po prostu sprawdzić czy miejsce w tablicy się kończy poprzez porównanie aktualnego rozmiaru tablicy poprzez zmienną
ileElementow
 ze zmienną
rozmiar
, która zawiera w sobie informację ile liczb jest aktualnie wprowadzonych do tablicy.

Czy ten kod rzeczywiście jest lepszy? Czy da się to zrobić krócej na tym etapie?

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 ileElementow =( tablica + wTab ) - tablica;
        int liczba;
       
        cin >> liczba;
       
        if( liczba == 0 )
             break;
       
        if( ileElementow > 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-174449
1 « 2 » 3 4 5
Poprzednia strona Strona 2 z 5 Następna strona