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ść
nanoant20
» 2019-04-19 20:10:04
czy ten poniższy kod spełnia
C/C++
#include <iostream>

using namespace std;

int main()
{
    int pojemnosc = 1, rozmiar = 0;
    int * tablica = new int[ pojemnosc ];
    cout << "pojemnosc: " << pojemnosc << ", rozmiar: " << rozmiar << endl;
    cout << "Podawaj liczby, 0 konczy wczytywanie.\n";
   
    while( true )
    {
        int liczba;
        cin >> liczba;
       
        if( liczba == 0 )
             break;
       
        if( rozmiar < pojemnosc )
        {
            cout << "Is a lot of memory. Add elements." << endl;
            tablica[ rozmiar ] = liczba;
            rozmiar++;
            cout << "pojemnosc: " << pojemnosc << ", rozmiar: " << rozmiar << endl;
        }
        else
        {
            cout << "Out of memory. Reserve memory and add elements." << endl;
            // Brakuje miejsca, utwórz większą tablicę
            pojemnosc += 3;
            int * nowa = new int[ pojemnosc ];
           
            // 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 << "pojemnosc: " << pojemnosc << ", rozmiar: " << rozmiar << endl;
        }
    }
    cout << "pojemnosc: " << pojemnosc << ", rozmiar: " << rozmiar << endl;
    cout << "Te same liczby, ale odwrotnie!\n";
    for( int i = rozmiar - 1; i >= 0; --i )
         cout << *( tablica + i ) << ' ';
   
    delete[] tablica;
    cout << endl;
    cin.get();
    cin.get();
    return 0;
}
te założenia?

C/C++
if( jest miejsce )
     dodaj element;
else
{
    zrob miejsce;
    dodaj element;
}

Chodzi o usunięcię tego
continue;
?
P-174470
pekfos
» 2019-04-19 20:43:12
Chodzi o usunięcię tego
continue;
?
Chodzi o usunięcie tego oczywistego powtórzenia "dodaj element". Dlatego napisałem by zrobić prościej, tak:
C/C++
if( nie ma miejsca )
     zrob miejsce;

dodaj element;
P-174471
nanoant20
» 2019-04-19 22:17:55
Dlatego napisałem by zrobić prościej
Czytelniejsze rozwiązanie jest @rottingham, ale proszę prościej

C/C++
#include <iostream>

using namespace std;

int main()
{
   
    int * tablica = nullptr, rozmiar = 0, liczba, ilosc_liczb = 0;
   
    cout << "Podawaj liczby, 0 konczy wczytywanie.\n";
    while( true )
    {
        cout << "\nIlosc Liczb: " << ilosc_liczb << ", Rozmiar tablicy: " << rozmiar << endl;
        cin >> liczba;
       
        if( liczba == 0 )
             break;
       
        ilosc_liczb++;
        if( rozmiar < ilosc_liczb )
        {
            if( rozmiar == 0 )
                 rozmiar++;
            else
                 rozmiar += 3;
            // Brakuje miejsca, utwórz większą tablicę
            int * nowa = new int[ rozmiar ];
            // Skopiuj dane
            for( int i = 0; i < ilosc_liczb - 1; i++ )
            {
                nowa[ i ] = tablica[ i ];
            }
            // Usuń starą tablicę
            delete[] tablica;
            // Zakutalizuj zmienne
            tablica = nowa;
        }
        // Dodaj nową wartość
        tablica[ ilosc_liczb - 1 ] = liczba;
       
    }
    cout << endl;
    cout << "Te same liczby, ale odwrotnie!\n";
    for( int i = ilosc_liczb - 1; i >= 0; --i )
         cout << *( tablica + i ) << ' ';
   
    delete[] tablica;
    cout << endl;
   
    cin.get(); cin.get();
    return 0;
}

//edit poprawiłem
jedno i drugie rozwiązania spełniają założenia zadania
Zmodyfikuj przykładowy kod tak, aby nowa tablica nie była tworzona za każdym razem, gdy dodawany jest nowy element.
P-174472
pekfos
» 2019-04-19 22:24:35
C/C++
#include <iostream>


int main()
{
    int * tablica = nullptr, rozmiar = 0, pojemnosc = 0;
    std::cout << "Podawaj liczby, 0 konczy wczytywanie.\n";
   
    while( true )
    {
        int liczba;
        std::cin >> liczba;
       
        if( liczba == 0 )
             break;
       
        if( rozmiar == pojemnosc )
        {
            // Brakuje miejsca, utwórz większą tablicę
            pojemnosc += 3;
            int * nowa = new int[ pojemnosc ];
           
            // Skopiuj dane
            for( int i = 0; i < rozmiar; ++i )
                 nowa[ i ] = tablica[ i ];
           
            // Usuń starą tablicę
            delete[] tablica;
           
            // Zakutalizuj zmienne
            tablica = nowa;
        }
       
        // Dodaj nową wartość
        tablica[ rozmiar ] = liczba;
        rozmiar++;
    }
   
    std::cout << "Te same liczby, ale odwrotnie!\n";
   
    for( int i = rozmiar - 1; i >= 0; --i )
         std::cout << tablica[ i ] << ' ';
   
    delete[] tablica;
}
?

jedno i drugie rozwiązania spełniają założenia zadania
Od drugiej strony tematu pytanie brzmi
Czy da się to zrobić krócej na tym etapie?
P-174473
nanoant20
» 2019-04-19 23:01:28
<< removed - "zrobić krócej na tym etapie" >>
P-174474
nanoant20
» 2019-04-19 23:23:49
@pekfos dlaczego usunąłeś mój post z moim rozwiązaniem ?
zostawiłeś swój post z moim omyłkowo wklejonym kodem,
mimo, że Cię poprosiłem o edycje lub usunięcie
bądź konsekwentny w swoich działaniach
i zostaw post z clasą vector, które napisałem


Od drugiej strony tematu pytanie brzmi
Czy da się to zrobić krócej na tym etapie?

Jak się da, to się da.

C/C++
#include <iostream>
#include <vector>
#include <iterator> //std::reverse(std::begin(vector), std::end(vector));

using namespace std;

int main()
{
    int liczba;
    vector < int > wektor;
    cout << "Rozmiar: " << wektor.size() << " Pojemnosc: " << wektor.capacity() << endl;
    std::cout << "Podawaj liczby, 0 konczy wczytywanie.\n";
   
    while(( std::cin >> liczba ) && liczba )
    {
        wektor.push_back( liczba );
        cout << "Rozmiar: " << wektor.size() << " Pojemnosc: " << wektor.capacity() << endl;
       
    }
    cout << endl;
    cout << "Rozmiar: " << wektor.size() << " Pojemnosc: " << wektor.capacity() << endl;
   
    cout << "Te same liczby, ale odwrotnie!\n";
    std::reverse( std::begin( wektor ), std::end( wektor ) );
    for( auto i: wektor )
         std::cout << i << ' ';
   
    std::cout << '\n';
   
    cout << endl;
    cin.get(); cin.get();
    return 0;
}
P-174475
rottingham
Temat założony przez niniejszego użytkownika
» 2019-04-20 12:20:01
Doszliśmy do rozwiązania, o które pytałem, więc uznaję temat za zamknięty.

Dzięki za pomoc @pekfos. Gdy zrobiłem ostatecznie to rozwiązanie

C/C++
if( nie ma miejsca )
     zrob miejsce;

dodaj element;

to sam zacząłem się sobie dziwić dlaczego wcześniej nie widziałem tak prostego wyjścia z sytuacji.

Dzięki za pomoc @nanoant20.
Jakiś spór tutaj wyniknął chyba z tego, że nie do końca zrozumiałeś moją intencję, gdy pytałem @pekfos o jeszcze krótsze (ale mieszczące się w ramach kursu) rozwiązanie. Zdarza się. Zła komunikacja to czasem najgorsza bariera.

Pozdrawiam i życzę udanego wypoczynku w święta!
P-174476
1 2 3 4 « 5 »
Poprzednia strona Strona 5 z 5