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

Jak przerobić program tak, aby wykorzystać wskaźniki?

Object Storage Arubacloud
0 głosów
162 wizyt
pytanie zadane 8 lipca 2018 w C i C++ przez biesak Nowicjusz (120 p.)

Napisz program wykonujący te same działania co program ponieżej, ale w oparciu
o wskaźniki i dynamiczny przydział pamięci.
int obraz = new int[kanalywiersze*kolumny];

Kod programu:


#include <stdlib.h>
#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    int t[3][5][6];
    int r = 0, g = 100, b = 1000;
    for (int z = 0; z < 3; z++) {
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 6; j++) {
                if (z == 0) {
                    t[z][i][j] = r;
                    r++;
                }
                if (z == 1) {
                    t[z][i][j] = g;
                    g++;
                }
                if (z == 2) {
                    t[z][i][j] = b;
                    b++;
                }
            }
        }
    }

    int n;
    for (int i = 0; i < 5; i++) {
        for (int z = 0; z < 3; z++) {
            for (int j = 0; j < 6; j++) {
                if (z == 0) n = 3; if (z == 1) n = 4; if (z == 2) n = 5;
                cout << setw(n) << t[z][i][j];
            }
            cout << "   ";
        }
        cout << "\n";
    }
    cout << "\n";

    int a;

    for (int z = 0; z < 3; z++) {
        for (int i = 0; i < 5; i++) {
            int m = 5;
            for (int j = 0; j < 6; j++) {
                if (j < 3) {
                    a = t[z][i][j];
                    t[z][i][j] = t[z][i][m];
                    t[z][i][m] = a;
                    m--;
                }
            }
        }int k = 2;
        for (int z = 0; z < 3; z++) {
            for (int i = 0; i < 5; i++) {
                for (int j = 0; j < 6; j++) {if (z==0){
                    a = t[z][i][j];
                    t[z][i][j] = t[k][i][j];
                    t[k][i][j] = a;
                    }
                }
            }
        }
    }

    for (int i = 0; i < 5; i++) {
        for (int z = 0; z < 3; z++) {
            for (int j = 0; j < 6; j++) {
                if (z == 0) n = 5; if (z == 1) n = 4; if (z == 2) n = 3;
                cout << setw(n) << t[z][i][j];
            }
            cout << "   ";
        }
        cout << "\n";
    }
}

 

komentarz 8 lipca 2018 przez Munvik Dyskutant (9,350 p.)
Zaraz Ci pokazę
komentarz 8 lipca 2018 przez biesak Nowicjusz (120 p.)
Dzięki za pomoc ale chyba nie widzę nadal rozwiązania. Czy mógłby ktoś mi pokazać rozwiązanie na już przerobionym kodzie? Wiem, że rzadko to robicie ale proszę o wyjątek w tej sytuacji i pomoc.
komentarz 8 lipca 2018 przez Munvik Dyskutant (9,350 p.)
Rozwiązanie masz na dole. Gotowca nie zrobię bo to wbrew regulaminowi i nic się nie nauczysz.
komentarz 8 lipca 2018 przez Mariusz08 Maniak (62,300 p.)
  1. zabronione jest proszenie o gotowe rozwiązanie danego zadania/problemu,
  1. postarać się udzielić jak najlepszej pomocy, starając się przy tym nie podać gotowego rozwiązania

 

Co prawda jest pewna różnica, niemniej jednak starajmy się nie podawać tych gotowców - lepiej dać przysłowiową wędkę niż rybę. 

komentarz 9 lipca 2018 przez biesak Nowicjusz (120 p.)

Dzięki za pomoc zrobiłem tak jak pisaliście. Czy to jest rozwiązanie:

#include <stdlib.h>
#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    int x, y, z; //zmienne mówiące o ilości komórek w wymiarze
    x=3;
    y=5;
    z=6;
    int ***t; //Żeby stworzyć tablice 3-wymiarową przydzielona dynamicznie musimy zadeklarować taki wskaźnik:

    t = new int **[x]; // Teraz przydzielimy mu dynamicznie pamięć. Teraz powstała nam tablica wskaźników na wskaźnik o rozmiarze x.
    for(int i=0; i<x; i++){
        t[i] = new int * [y];
    } //Musimy teraz w pętli dynamicznie przydzielić pamięć w tej tablicy. Teraz mamy tablicę wskaźników 2-wymiarową o rozmiarze x , y.

    for(int i=0; i<x; i++){
      for(int j=0; j<y; j++){
        t[i][j] = new int [z];
        }
    }//Mamy tablicę 3 wymiarową int'ów o rozmiarze x , y , z.

    int r = 0, g = 100, b = 1000;
    for (int z = 0; z < 3; z++) {
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 6; j++) {
                if (z == 0) {
                    *(*(*(t +z)+i)+j) = r;
                    r++;
                }

                if (z == 1) {
                    *(*(*(t +z)+i)+j) = g;
                    g++;
                }

                if (z == 2) {
                    *(*(*(t +z)+i)+j) = b;
                    b++;
                }
            }
        }
    }

    int n;
    for (int i = 0; i < 5; i++) {
        for (int z = 0; z < 3; z++) {
            for (int j = 0; j < 6; j++) {
                if (z == 0) n = 3; 
                if (z == 1) n = 4; 
                if (z == 2) n = 5;
                cout << setw(n) << *(*(*(t +z)+i)+j);
            }
            cout << "   ";
        }
        cout << "\n";
    }
    cout << "\n";

    int a;
    for (int z = 0; z < 3; z++) {
        for (int i = 0; i < 5; i++) {
            int m = 5;
            for (int j = 0; j < 6; j++) {
                if (j < 3) {
                    a = *(*(*(t +z)+i)+j);
                    *(*(*(t +z)+i)+j) = *(*(*(t +z)+i)+m);
                    *(*(*(t +z)+i)+m)= a;
                    m--;
                }
            }
        }
        int k = 2;
        for (int z = 0; z < 3; z++) {
            for (int i = 0; i < 5; i++) {
                for (int j = 0; j < 6; j++) {if (z==0){
                    a = *(*(*(t +z)+i)+j);
                    *(*(*(t +z)+i)+j)= *(*(*(t +k)+i)+j);
                    *(*(*(t +k)+i)+j) = a;
                    }
                }
            }
        }
    }

    for (int i = 0; i < 5; i++) {
        for (int z = 0; z < 3; z++) {
            for (int j = 0; j < 6; j++) {
                if (z == 0) n = 5; 
                if (z == 1) n = 4; 
                if (z == 2) n = 3;

                cout << setw(n) << *(*(*(t +z)+i)+j);
            }
            cout << "   ";
        }
        cout << "\n";
    }

    //Zwalnianie pamięci
    for(int i=0; i<x; i++){
      for(int j=0; j<y; j++){
          delete [] t[i][j];
      }
    }

    for(int i=0; i<x; i++){
        delete [] t[i];
    }

    delete [] t;
}



 

 

2 odpowiedzi

0 głosów
odpowiedź 8 lipca 2018 przez RafalS VIP (122,820 p.)

Troszke prosisz o gotowca, którego dać Ci nie mogę, więc jedynie podpowiem. Tak się tworzy dynamicznie tablice 1d o n elementach:

int* array = new int[n];

Żeby zrobić tablice 2d nxm potrzebujemy tablicy na n tablic m elementowych. Tablica to wskaźnik do pierwszego elementu więc potrzebujemy wskaźnika do tablicy (czyli pierwszego elementu) czyli wskaźnika do wskaźnika:

https://stackoverflow.com/questions/936687/how-do-i-declare-a-2d-array-in-c-using-new

tutaj od razu masz ładną ilutracje tego jak to wygląda w pamięci.

Mam nadzieje, że już sam domyślisz się jak to zrobić dla 3d.

Na koniec musisz pamiętać o zwolnieniu tablicy przy pomocy delete[] tab; ale nie ma tak łatwo, trzeba zwolnić każdą tablice stworzoną operatorem new, więc podobnie jak przy tworzeniu musisz użyć pętli, tylko tym razem zacznij od usuwania najbardziej wewnętrznych tablic.

Gdybyśmy chcieli dodać jeszcze wiecej wskaźników do tego rozwiązania to:

tab[i] == *(tab+i);

2d:

tab[i][j] == *(*(tab+i)+j);

A tak na marginesie to ten kod jest bardzo brzydki.

0 głosów
odpowiedź 8 lipca 2018 przez Munvik Dyskutant (9,350 p.)
int x, y, z; //zmienne mówiące o ilości komórek w wymiarze

Żeby stworzyć tablice 3-wymiarową przydzielona dynamicznie musimy zadeklarować taki wskaźnik:

int ***wsk; 

Teraz przydzielimy mu dynamicznie pamięć:

wsk = new int **[x];

To jeszcze nie koniec. Teraz powstała nam tablica wskaźników na wskaźnik o rozmiarze x.

Musimy teraz w pętli dynamicznie przydzielić pamięć w tej tablicy. Robimy to tak:

for(int i=0; i<x; i++)
{
  wsk[i] = new int * [y];
}

Teraz mamy tablicę wskaźników 2-wymiarową o rozmiarze x , y.

Trzeci krok wygląda tak:

for(int i=0; i<x; i++)
{
  for(int j=0; j<y; j++)
  {
     wsk[i][j] = new int [z];
  }
}

Mamy tablicę 3 wymiarową int'ów o rozmiarze x , y , z.

Teraz trzeba tą pamięć zwolnić.

Zwalnianie wygląda następująco:

for(int i=0; i<x; i++)
{
  for(int j=0; j<y; j++)
  {
     delete [] wsk[i][j];
  }
}

for(int i=0; i<x; i++)
{
  delete [] wsk[i];
}

delete [] wsk;

 

Podobne pytania

+1 głos
2 odpowiedzi 357 wizyt
0 głosów
1 odpowiedź 119 wizyt
0 głosów
1 odpowiedź 99 wizyt

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...