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

Deklarowanie wielkości tablicy w macierzy C++

Object Storage Arubacloud
0 głosów
765 wizyt
pytanie zadane 6 marca 2018 w C i C++ przez darek_s91 Użytkownik (580 p.)

Cześć chciałbym żeby użytkownik miał możliwość samemu deklarować wielkość tablicy, zeby nie była ona narzucona z góry. W jaki najprostszy sposób można to wykonać? Próbowałem poprzez konstruktor, ale niestety nic nie wychodziło. Prosze o wyrozumiałość, z góry dzięki.

 

#include <iostream>
using namespace std;

class Klasa
{
    public:
    int macierz[10][10];
    int wiersz, kolumna;

    void setter()
    {
        cout<<"Podaj ilosc wierszy: "<<endl;
        cin>>wiersz;
        cout<<"Podaj ilosc kolumn: "<<endl;
        cin>>kolumna;

        for(int i=0; i<wiersz; i++)
            for(int j=0; j<kolumna; j++)
            {
                cout<<"Podaj wartosc dla "<<i+1<<" "<<j+1<<" w macierzy: "<<endl;
                cin>>macierz[i][j];

            }
    }

    void getter()
    {
        cout<<endl<<"MACIERZ: "<<wiersz<<" x "<<kolumna<<endl;
        for (int i=0; i<wiersz; i++)
            for (int j=0; j<kolumna; j++)
            {
                cout<<macierz[i][j]<<" ";
                if(j==kolumna-1) cout<<endl;
            }

    }


};

 int main()
 {
     Klasa m1;

     m1.setter();
     m1.getter();

    return 0;
}

 

5 odpowiedzi

0 głosów
odpowiedź 7 marca 2018 przez mokrowski Mędrzec (155,460 p.)
wybrane 8 marca 2018 przez darek_s91
 
Najlepsza

Możesz to zrobić na bardzo wiele sposobów.

Na początek pewnie taki jakiego uczy się do dziś. Niskopoziomowe, brzydkie "wachlowanie new i delete" i wskaźniki na wskaźniki:

#include <iostream>
#include <iomanip>

class Matrix {
public:
    Matrix(size_t height, size_t width)
        : max_height(height), max_width(width) {

        data = new int*[max_height]();
        for(size_t rowIdx = 0; rowIdx < max_height; ++rowIdx) {
            data[rowIdx] = new int[max_width]();
        }

    }

    int& valueAccess(size_t height, size_t width) const {
        return data[height][width];
    }

    void show() const {
        // Implementacja testowa dla prezentacji rozwiązania.
        for(size_t rowIdx = 0; rowIdx < max_height; ++rowIdx) {
            for(size_t colIdx = 0; colIdx < max_width; ++colIdx) {
                std::cout << std::setw(8) << data[rowIdx][colIdx];
            }
            std::cout << '\n';
        }

    }

    ~Matrix() {

        for(size_t rowIdx = 0; rowIdx < max_height; ++rowIdx) {
            delete [] data[rowIdx];
        }
        delete [] data;

    }
private:
    size_t max_height;
    size_t max_width;
    int ** data;
};

int main() {
    Matrix matrix(7, 12);
    matrix.valueAccess(5, 5) = 20;
    matrix.show();
}

W kodzie chodzi mi tylko o pokazanie sposobu alokacji danych. Jak widzisz to podejście wymaga dokładnego sprzątania w destruktorze i ... uwierz mi.. ma bardzo wiele wad. Trzeba mieć poważne powody by tak programować.

Pierwszą poprawką będzie "spłaszczenie tablicy" tak aby nie była wielowymiarowa a jedynie prezentowana była wielowymiarowo. Zwróć uwagę na sposób dostępu do elementów:

#include <iostream>
#include <iomanip>

class Matrix {
public:
    Matrix(size_t height, size_t width)
        : max_height(height), max_width(width) {

        data = new int[height * width]();

    }

    int& valueAccess(size_t height, size_t width) const {
        return data[height * max_height + width];
    }

    void show() const {
        // Implementacja testowa dla prezentacji rozwiązania.
        for(size_t rowIdx = 0; rowIdx < max_height; ++rowIdx) {
            for(size_t colIdx = 0; colIdx < max_width; ++colIdx) {
                std::cout << std::setw(8) << valueAccess(rowIdx, colIdx);
            }
            std::cout << '\n';
        }

    }

    ~Matrix() {

        delete [] data;

    }
private:
    size_t max_height;
    size_t max_width;
    int * data;
};

int main() {
    Matrix matrix(7, 12);
    matrix.valueAccess(5, 5) = 20;
    matrix.show();
}

Już jest lepiej.

Oczywiście lepiej jeszcze użyć std::array czy std::vector ale zaraz (zapewne) odpowiesz "nie mieliśmy/nie wolno" :)

0 głosów
odpowiedź 6 marca 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
Poczytaj o dynamicznej alokacji pamięci lub o kontenerach STL.
0 głosów
odpowiedź 7 marca 2018 przez Knayder Nałogowiec (37,640 p.)
Dynamiczna alokacja. Użyj operatora new.

int* tab;

tab = new int[dataFromUser];

delete []tab;
–3 głosów
odpowiedź 7 marca 2018 przez Erfik878 Początkujący (310 p.)

chodziło ci mniej więcej o coś takiego?

#include <iostream>

using namespace std;

int main ()
{
      int wiersze,kolumny;
      cin >> wiersze>> kolumny;
      int tab[kolumny][wiersze];
      // reszta kodu
}

 

komentarz 7 marca 2018 przez Knayder Nałogowiec (37,640 p.)
Spójrz na odpowiedź która ma 5 minusów -_-
komentarz 7 marca 2018 przez Erfik878 Początkujący (310 p.)
widziałem tą odpowiedź. tam pomysł był zły o tyle, że chciał przypisać rozmiar tablicy po zadeklarowaniu jej istnienia (co wiem że się nie da). Ja zaproponowałem rozwiązanie, żeby wprowadzić liczby, z których dopiero powstanie taka tablica. Odpowiedz, czy to rozwiązanie też jest złe?
komentarz 7 marca 2018 przez Knayder Nałogowiec (37,640 p.)

Źle zinterpretowałeś jego komentarz.
Mu chodziło dokładnie o to samo co tobie.
Twoje jest źle. Normalny kompilator by wyrzucił błąd.
Wielkość normalnej tablicy mus być znana w czasie kompilacji.
Jak chcesz wczytać rozmiar od użytkownika, użyj dynamicznej alokacji:
 

int size;
std::cin >> size;
int *tab = new int[size];


delete[] tab;

 

komentarz 7 marca 2018 przez Erfik878 Początkujący (310 p.)
to dziwne, bo mi wcześniej opisany sposób działa (używam CodeBlocks). Jednak to prawda, że lepiej użyć dynamicznej alokacji. Dziękuje za odpowiedź i przepraszam za wprowadzanie w błąd
komentarz 7 marca 2018 przez Knayder Nałogowiec (37,640 p.)
Bo kompilator to za ciebie naprawia. Nie rób tego po prostu :D
–6 głosów
odpowiedź 7 marca 2018 przez Beginer Pasjonat (22,110 p.)
edycja 7 marca 2018 przez Beginer
Spróbuj zadeklarować w ten sposób:

int rozmiar;

float tab[rozmiar];

Użytkownik, jako dane niech wprowadzi - np. rozmiar = 100.

Wtedy miałby tab[100].
komentarz 7 marca 2018 przez criss Mędrzec (172,590 p.)
Przed napisaniem odpowiedzi, upewnij się, że masz jakiekolwiek pojęcie co piszesz. To powinno być w regulaminie
komentarz 7 marca 2018 przez Beginer Pasjonat (22,110 p.)
Widziałem takie rozwiązania, a wszystko zależy od kontekstu i sytuacji. Dlatego użyłem słowa "Spróbuj".
1
komentarz 7 marca 2018 przez Knayder Nałogowiec (37,640 p.)
To jest niepoprawne. Są kompilatory które to skompilują, ale założenie jest takie, że to się nie skompiluje. Wielkość tablicy musi być znana w czasie kompilacji.

Podobne pytania

0 głosów
1 odpowiedź 602 wizyt
pytanie zadane 28 grudnia 2017 w Java przez Kabuuz Bywalec (2,820 p.)
0 głosów
2 odpowiedzi 5,495 wizyt
pytanie zadane 19 marca 2018 w C i C++ przez Groshq Użytkownik (590 p.)
0 głosów
0 odpowiedzi 553 wizyt
pytanie zadane 25 listopada 2019 w C i C++ przez Hubertius Bywalec (2,970 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...