• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ponowne wypełnienie tablicy tekstem

0 głosów
92 wizyt
pytanie zadane 6 września 2017 w C i C++ przez Provokator5 Początkujący (370 p.)

Hej, nie mogę sobie poradzić z ponownym wypełnieniem tablicy po jej zwiększeniu.

Chcę aby w drugim wypełnieniu tablicy wcześniejsze "teksty" zostały pominięte i dodane zostały tylko do nowych, pustych tablic (z założenia, że zmienimy wielkość tablicy na większą).


#include <iostream>
#include <string>

int zmiana_ile(int iile)
{
    std::cin >> iile;

    std::cin.clear();  // wyczyść bufor
    std::cin.sync();

    return iile;
}

int main()
{
    using std::cin;
    using std::cout;
    using std::string;
    using std::endl;

    int ile = 5;

    string *miejsce = new string[ile]; 
    
    for (int i = 0; i < ile; i++) // wypełnij liste tekstem
        miejsce[i] = "wolne miejsce";

        
    for (int i = 0; i < ile; i++)   // pokaż liste
        cout << i+1 << ": " << miejsce[i] << endl;

        
    cout << "zmien wartosc "ile": ";
    ile = zmiana_ile(ile);  // nadpisz wartość "ile"

    
    cout << "zmieniona wartosc "ile": " << ile << endl; // pokaz zmienna "ile" po zmianie

    
    // wypełnij listę, jeśli zmienna "ile" się zwiększyła z pominięciem już istniejących zmiennych
    for (int i = 0; i < ile; i++)
    {
        if( miejsce[i].empty() )
        miejsce[i] += "wolne miejsce";
    }

    for (int i = 0; i < ile; i++)   // pokaz zaktualizowana liste
        cout << i+1 << ": " << miejsce[i] << endl;



    delete [] miejsce; // usuń tablice


    return 0;
}

 

3 odpowiedzi

0 głosów
odpowiedź 6 września 2017 przez januszprogramowania Bywalec (2,900 p.)
wybrane 6 września 2017 przez Provokator5
 
Najlepsza

Rozumiem, że w funkcji 

int zmiana_ile(int iile)

chcesz zmienić rozmiar tablicy miejsce. Niestety w c++ nie da się zmienić rozmiaru tablic. Musisz zwolnić starą i utworzyć nową.

int zmiana_ile(int iile, std::string **m)
{
    std::cin >> iile;
    
    std::cin.clear();  // wyczyść bufor
    std::cin.sync();
    delete [] *m;
    *m = new std::string[iile];
    return iile;
}

Teraz musisz zmienić wywołanie tej funkcji na :

ile = zmiana_ile(ile, &miejsce);  // nadpisz wartość "ile"

Ponadto, tutaj:

cout << "zmien wartosc "ile": ";

by wyświetlić cudzysłów musisz poprzedzić go znakiem \ czyli :

cout << "zmien wartosc \"ile\": ";

 

komentarz 6 września 2017 przez Provokator5 Początkujący (370 p.)
Wielkie dzięki chłopaki za pomoc :) tego się nie spodziewałem, że nie da się tego tak zrobić.

januszprogramowania - Twoje rozwiązanie prawie spełniło by moje kryteria tylko, że zwalniając starą tablicę stracił bym te wcześniejsze "teksty", a chciałem aby zostały.

To chyba pozostaje mi teraz tylko zapisywać te "teksty" do pliku.

Chciałem poćwiczyć najpierw taki wariant manipulowania tablicami ale no cóż teraz wiem, że moim sposobem nie da rady :)
komentarz 6 września 2017 przez januszprogramowania Bywalec (2,900 p.)
Nie musisz do pliku. Wystarczy, że przed usunięciem starej tablicy skopiujesz jej zawartość do nowej.
komentarz 6 września 2017 przez Provokator5 Początkujący (370 p.)
No faktycznie... :p mały blond moment miałem ;p jeszcze raz, dzięki za pomoc :)
0 głosów
odpowiedź 6 września 2017 przez Ehlert VIP (138,130 p.)
Nie możesz tak robić. Na początku zaalokowałeś pamieć na 5 miejsc i tego się musisz trzymać.
0 głosów
odpowiedź 8 września 2017 przez Provokator5 Początkujący (370 p.)

Zastosowałem się do wskazówek i wypociłem poniższy kod.

Teoretycznie działa ale co x kompilacji program się crash'uje... czasem za 2 razem a czasami za 10.

Co zrobiłem źle ?

#include <iostream>
#include <string>
#include <cstring>

int zmiana_ile(int iile, std::string **m)
{
    std::cin >> iile;

    std::cin.clear();  // wyczyść bufor
    std::cin.sync();

    delete [] *m;
    *m = new std::string[iile];

    return iile;
}

int main()
{
    using std::cin;
    using std::cout;
    using std::string;
    using std::endl;

    int ile = 5, kopia_ile = ile;

    string *miejsce = new string[ile];

    string *kopia_miejsce = new string[ile];

    for (int i = 0; i < ile; i++) // wypełnij liste tekstem
        miejsce[i] = "wolne miejsce";

    for (int i = 0; i < ile; i++)
        kopia_miejsce[i] = miejsce[i];

    for (int i = 0; i < ile; i++)   // pokaż liste
        cout << i+1 << ": " << miejsce[i] << endl;


    cout << "zmien wartosc \"ile\": ";
    ile = zmiana_ile(ile, &miejsce);  // nadpisz wartość "ile"


    cout << "zmieniona wartosc \"ile\": " << ile << endl; // pokaz zmienna "ile" po zmianie

    for (int i = 0; i < ile; i++)
    {
        for (int i = 0; i < kopia_ile; i++)
        {
            strcpy ((char*)&miejsce[i], (char*)&kopia_miejsce[i]);

        }

        if (kopia_ile < ile)
        {
            for (int i = kopia_ile; i < ile; i++)
            {
                miejsce[i] = "Nowe miejsce";
            }
        } //if
    }//for

    kopia_ile = ile;

    for (int i = 0; i < ile; i++)   // pokaz zaktualizowana liste
        cout << i+1 << ": " << miejsce[i] << endl;



    delete [] miejsce; // usuń tablice
    delete [] kopia_miejsce;

    return 0;
}
komentarz 8 września 2017 przez januszprogramowania Bywalec (2,900 p.)
Zaiast
strcpy ((char*)&miejsce[i], (char*)&kopia_miejsce[i]);

wystarczy:

miejsce[i] =kopia_miejsce[i];

 

Podobne pytania

0 głosów
2 odpowiedzi 344 wizyt
0 głosów
3 odpowiedzi 273 wizyt
pytanie zadane 9 marca 2016 w C i C++ przez sakro95 Nowicjusz (170 p.)
–1 głos
2 odpowiedzi 70 wizyt
pytanie zadane 23 lutego 2016 w C i C++ przez KTK Nowicjusz (150 p.)
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

54,387 zapytań

98,241 odpowiedzi

202,066 komentarzy

26,700 pasjonatów

Przeglądających: 177
Pasjonatów: 3 Gości: 174

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...