Operowanie na tablicach dynamicznych w funkcjach

Odpowiedz Nowy wątek
2017-12-09 20:01
0

Witam! Mając początkową "strukturę" kodu, który wygląda tak:

#include <iostream>

using namespace std;

void insert()
{

}

void choose()
{

}

void remove()
{

}

void resize()
{

}

int main()
{
    int roz;
    cout << "Enter a number of cells:";
    cin >> roz;
    int *tab;
    tab = new int[roz];
    for (int i=0;i<roz;i++)
    {
        cin >> tab[i];
    }
    for (int i=0;i<roz;i++)
    {
        cout << tab[i] << endl;
    }

    int wybor;
    do
    {
        cout << "1: insert 1 cell to the end" << endl;
        cout << "2: choose a cell and insert 1 cell after it" << endl;
        cout << "3: remove the first cell" << endl;
        cout << "4: resize the table" << endl;
        cout << "5: quit" << endl;
        cin.clear();
        cin.sync();
        cin >> wybor;
    } while(wybor!=1 && wybor !=2 && wybor !=3 && wybor !=4 && wybor !=5);

    switch (wybor)
    {
    case 1:
        insert();
        break;
    case 2:
        choose();
        break;
    case 3:
        remove();
        break;
    case 4:
        resize();
        break;
    case 5:
        break;
    }

    return 0;
}

Mam za zadanie teraz po kolei uzupełniać funkcje. Wymagania odnośnie pierwszej z nich:

Działanie funkcji insert():

  1. Zwiekszenie tablicy o 1 komorke
  2. Wstawienie ostatniej (nowej liczby) z numerem jej komorki
    Wymagania: Tablice tworz dynamicznie operatorem new, usuwaj operatorem delete
    Funkcja insert() ma być bezargumentowa i ma niczego nie zwracać.

No i właśnie - skoro funkcja ma być bezargumentowa, to w jaki sposób utworzyć w funkcji nową tablicę o rozmiarze starej tablicy+1, nie przekazując do funkcji informacji o rozmiarze tablicy wejściowej? Chyba, że źle rozumiem pojęcie "bezargumentowa"?

Z góry przepraszam jeżeli to blachy problem, ale jestem początkujący w tym temacie

Pozostało 580 znaków

2017-12-09 20:04
1

Można to zrobić bez podawania argumentów, ale musiał byś utworzyć klasę. W klasie stworzyć pole z tą tablicą i w funkcjach tej klasy odwoływać się za pomocą this.pole

Edit. a jeżeli chodzi o rozmiar, to też możesz zrobić z tego pole, które będziesz powiększał, a w konstruktorze sobie ją zdefiniujesz.


Jeśli widzisz mój błąd to mnie popraw.
Pisanie błędnych wypowiedzi utrwala złe praktyki.
Kiedyś możesz dostać do ręki mój kod.
edytowany 1x, ostatnio: PanRiK, 2017-12-09 20:15

Pozostało 580 znaków

2017-12-09 20:16
kq
1

Dostałeś dokładnie taki kod do uzupełnienia? Zadanie wygląda na niemożliwe, bo tablica jest lokalna. Jeśli pisałeś sam, to polecam lekturę. I faktycznie, jak piszesz sam, to opakuj to w klasę.


Pozostało 580 znaków

2017-12-09 21:13
2

Oczywiście da się, ale to #rakcontent
Zgadzam się że zadanie jest źle sformułowane.
Rozwiązanie śmieszno-straszne:

    #include <iostream>
    #include <algorithm>

    using namespace std;

    struct MojNauczycielToDupek {
        int **tablica;
        int *rozmiar;

        MojNauczycielToDupek() {
           tablica = NULL;
           rozmiar = NULL;
        }

        void podlacz(int **tab, int *n) {
            tablica = tab;
            rozmiar = n;
        }

    } mojaKlasaJestOK;

    void insert()
    {
       int nowyRozmiar = *mojaKlasaJestOK.rozmiar + 1;
       int *nowaTablica = new int[nowyRozmiar];

       copy_n(*mojaKlasaJestOK.tablica, *mojaKlasaJestOK.rozmiar, nowaTablica);
       *(nowaTablica + *mojaKlasaJestOK.rozmiar) = 1;

       int *temp = *mojaKlasaJestOK.tablica;

       *mojaKlasaJestOK.tablica = nowaTablica;
       *mojaKlasaJestOK.rozmiar = nowyRozmiar;

       delete[] temp; 
    }

    void choose()
    {

    }

    void remove()
    {

    }

    void resize()
    {

    }

    int main()
    {
        int roz;
        cout << "Enter a number of cells:";
        cin >> roz;
        int *tab;
        tab = new int[roz];
        for (int i=0;i<roz;i++)
        {
            cin >> tab[i];
        }
        for (int i=0;i<roz;i++)
        {
            cout << tab[i] << endl;
        }

        mojaKlasaJestOK.podlacz(&tab, &roz);

        int wybor;
        do
        {
            cout << "1: insert 1 cell to the end" << endl;
            cout << "2: choose a cell and insert 1 cell after it" << endl;
            cout << "3: remove the first cell" << endl;
            cout << "4: resize the table" << endl;
            cout << "5: quit" << endl;
            cin >> wybor;
            cout << "wybor = " << wybor << endl;
        } while(wybor!=1 && wybor !=2 && wybor !=3 && wybor !=4 && wybor !=5);

        switch (wybor)
        {
        case 1:
            insert();
            break;
        case 2:
            choose();
            break;
        case 3:
            remove();
            break;
        case 4:
            resize();
            break;
        case 5:
            break;
        }

        cout << "End state: " << endl;
        cout << "roz = " << roz << endl;
        cout << "tab = " << endl;

        for(int i=0; i < roz; i++) {
          cout << tab[i] << ", ";   
        }

        cout << endl;

        return 0;
    }

https://ideone.com/6QBojH


Szacuje się, że w Polsce brakuje 50 tys. programistów
edytowany 1x, ostatnio: vpiotr, 2017-12-09 21:23

Pozostało 580 znaków

2017-12-09 21:56
0

Dziękuję za odpowiedzi i rozwiązanie problemu, i już odpowiadam na wasze wątpliwości dot tego zadania.

Ten "szkielet" pisałem sam, na podstawie zadania, które miałem uprzednio do wykonania:

title

Całkiem możliwe, że źle go napisałem - prosiłbym o zweryfikowanie.

Jeżeli zaś chodzi o wykonanie zadania - nie umiem jeszcze programowania obiektowego, klas - potrafię póki co podstawy (najnowsze zagadnienia to wskaźniki, tablice dynamiczne właśnie i funkcje argumentowe/bezargumentowe), i właśnie z wykorzystaniem tych podstaw muszę zrobić na zajęcia te zadanie.

Czy jest ono więc źle sformułowane?

Jeśli to naprawdę tak wygląda, to zmień nauczyciela... Bo jedyna możliwość to zmienne globalne, a to zło. - koszalek-opalek 2017-12-09 22:53

Pozostało 580 znaków

2017-12-09 22:13
2

Jedna rzecz jaka mi się nasuwa to deklaracja globalnej tablicy, plus deklaracja globalnej zmiennej , jaką była by rozmiar tej tablicy.

Edit:

marko2255 napisał(a):

nie umiem jeszcze programowania obiektowego, klas - potrafię póki co podstawy

Co to są dla Ciebie te "podstawy"?

@vpiotr użył struktury, może to Cię przeraziło i dlatego napisałeś, że nie umiesz programować obiektowo :D?


Jeśli widzisz mój błąd to mnie popraw.
Pisanie błędnych wypowiedzi utrwala złe praktyki.
Kiedyś możesz dostać do ręki mój kod.
edytowany 4x, ostatnio: PanRiK, 2017-12-09 22:27

Pozostało 580 znaków

2017-12-09 22:58
2

Jeśli nie mieliście obiektówki, to to zadanie jest debilnie sformułowane.
Autor zadania powinien za karę pracować przez 10 lat w COBOLu.


Szacuje się, że w Polsce brakuje 50 tys. programistów
edytowany 1x, ostatnio: vpiotr, 2017-12-09 22:58

Pozostało 580 znaków

2017-12-09 23:13
0

@PanRiK:

Takie podstawy podstaw, które obowiązują nas obecnie na zajęciach czyli:

Instrukcja warunku „if”.
Instrukcja wyboru „switch”.
Pętla „for”.
Pętla „while”.
Pętla „do” .. „while„.
Menu programu.
Tablica statyczna.
Zapis do tablicy.
Odczyt z tablicy.
Łańcuch znaków.
Przestawianie elementów tablicy.
Wskaźnik.
Dostęp do zmiennej przez wskaźnik.
Dostęp do tablicy przez wskaźnik.
Funkcja bezargumentowa.
Funkcja z argumentami przekazywanymi przez wartość.
Funkcja z argumentami przekazywanymi przez referencję.
Funkcja z argumentami przekazywanymi przez adres.
Tablica dynamiczna jednowymiarowa.
Tablica dynamiczna dwuwymiarowa.

Też mi się wydaje, że zadanie nie jest dobrze sformułowane. Ale szukając jakiegoś sposobu na zrobienie - sam rozmiar mogę w sumie zrobić jako zmienną globalną, ale jak przekazać wartości dynamicznie zrobionej tablicy w mainie operatorem new do funkcji bezargumentowej? :D Wykorzystując tylko zagadnienia, które są w powyższym cytacie?

Pozostało 580 znaków

2017-12-09 23:26
1
#include <iostream>

using namespace std;

int rozmiar;
int * tablica = new int[rozmiar];

void test(){
tablica[0] = 1;
}

int main(){

cin >> rozmiar;
test();

cout << tablica[0];

}

O proszę ;p, wpisuje jedynke w funkcji, a w maincie ją wyświetlam i jest 1 :).

Taka jedna dygresja, przecież funkcje takie jak "insert" , "remove" , "resize" , są to słowa kluczowe. Bardzo dziwne zadanie.

Edit: !!!! Nie zapomnij o !!!!

delete[] tablica

Jeśli widzisz mój błąd to mnie popraw.
Pisanie błędnych wypowiedzi utrwala złe praktyki.
Kiedyś możesz dostać do ręki mój kod.
edytowany 4x, ostatnio: PanRiK, 2017-12-09 23:43

Pozostało 580 znaków

2017-12-10 00:21
0

Wielkie dzięki! Zrobiłem coś takiego:

#include <iostream>

using namespace std;

int roz;
int *tab = new int[roz];

void insert()
{
    int *tab2 = new int[roz+1];
    for (int i=0; i<roz; i++)
        tab2[i]=tab[i];
    tab2[roz] = roz;
    delete []tab;
    tab = tab2;
}

void choose()
{

}

void remove()
{

}

void resize()
{

}

int main()
{
    cout << "Enter a number of cells:";
    cin >> roz;
    for (int i=0;i<roz;i++)
        cin >> tab[i];
    for (int i=0;i<roz;i++)
        cout << tab[i] << endl;

    int wybor;
    do
    {
        cout << "1: insert 1 cell to the end" << endl;
        cout << "2: choose a cell and insert 1 cell after it" << endl;
        cout << "3: remove the first cell" << endl;
        cout << "4: resize the table" << endl;
        cout << "5: quit" << endl;
        cin.clear();
        cin.sync();
        cin >> wybor;
    } while(wybor!=1 && wybor !=2 && wybor !=3 && wybor !=4 && wybor !=5);

    switch (wybor)
    {
    case 1:
        insert();
        for (int i=0; i<roz+1;i++)
            cout << tab[i];
        break;
    case 2:
        choose();
        break;
    case 3:
        remove();
        break;
    case 4:
        resize();
        break;
    case 5:
        break;
    }

    return 0;
}

Prawidłowo to zrobiłem? Bo niby działa, ale myślę, że mogłem jakieś błędy i tak w funkcji zrobić

Pozostało 580 znaków

2017-12-10 00:48
1

1.

delete []tab;

Daj to przed

return 0;

2.

int *tab2 = new int[roz+1];

W tym wypadku dobrze by było gdybyś nadpisał zmienną globalną w Twojej funkcji "insert";, a więc proponuje dodać do tej funkcji na sam początek:

roz++;
int *tab2 = new int[roz+1];
  1. Niepotrzebnie robisz nową tablice, nigdzie w zadaniu nie było napisane, abyś allokował za każdym razem nową , więc ja bym proponował:

void insert()
{
    roz++;
    tab[roz] = roz;
}

Sprawdź czy tak działa :)


Jeśli widzisz mój błąd to mnie popraw.
Pisanie błędnych wypowiedzi utrwala złe praktyki.
Kiedyś możesz dostać do ręki mój kod.
edytowany 2x, ostatnio: PanRiK, 2017-12-10 00:50
Nie mogę zedytować, jak coś trzeci punkt to jakieś herezje i nie powinno go być - PanRiK 2017-12-10 01:12

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0