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

0

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[kanaly*wiersze*kolumny];

Kod progamu:

#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";
	}
}
0

Pokaż, co już zrobiłeś sam, albo załóż wątek w dziale Ogłoszenia drobne.

0

Nie mam pomysłu na to zadanie, a bardzo ciekawi mnie jak można je rozwiązać na wskaźnikach. Bardzo proszę o pomoc jak ktoś widzi rozwiązanie na wskaźnikach. Jestem początkujący. Dziękuję za pomoc i przepraszam za kłopot.

1

Po co przerabiać ten kod na wskaźniki, skoro sam kod wyjściowy jest beznadziejny.

Nawet jeśli się uprzeć to nie ma sensu stosować wskaźników, bo std::vector jest pewniejszy i lepszy w tym wypadku.

0

Podpowiedź:

Do elementu w tablicy możesz się odwoływać poprzez nawiasy kwadratowy albo poprzez wskaźnik, w tym przypadku często potocznie nazywane jest to wyłuskaniem. Zadanie te ma na celu ci to uświadomić i przy okazji nauczyć czegoś z zakresu arytmetyki wskaźników. Zwróć uwagę, że referencje już nie umożliwiają nam takiej arytmetyki jak wskaźniki.

int array[5] // zwykła 5-elementowa tablica integerów 
array[3] // odwołujesz się do elementu tablicy o indeksie 3
*(array +3) // odwołujesz się do tego samego elementu tylko w inny sposób, najpierw przesuwasz pamięć na to miejsce dodając 3 a potem wyłuskujesz wartość z tego miejsca w pamięci

int array[5][5] // tablica
array[3][3] // odwołanie
*(*(array +3)+3) // odwołanie v2

Analogicznie z tablicami trójwymiarowymi.

0

Zrobiłem to w taki sposób:

class CObraz
{
public:
	CObraz(int kanaly, int wiersze, int kolumny) : Kanaly(kanaly), Wiersze(wiersze), Kolumny(kolumny) { obraz = new int [getOffset(Kanaly, Wiersze, Kolumny)]; }
	~CObraz() { delete[] obraz; }
	int get(int kanal, int wiersz, int kolumna) const { return obraz[getOffset(kanal, wiersz, kolumna)]; }
	void set(int kanal, int wiersz, int kolumna, int wartosc) { obraz[getOffset(kanal, wiersz, kolumna)] = wartosc; }
private:
	CObraz() = delete;
	int getOffset(int kanal, int wiersz, int kolumna) const {return kanal + Wiersze * (wiersz + Kolumny * kolumna); }
	int* obraz;
	int Kanaly;
	int Wiersze;
	int Kolumny;
	int Capacity;
};

int main()
{
	CObraz 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.set(z, i, j, r);
					r++;
				}
				if (z == 1) {
					t.set(z, i, j, g);
					g++;
				}
				if (z == 2) {
					t.set(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;
				std::cout << std::setw(n) << t.get(z, i, j);
			}
			std::cout << "   ";
		}
		std::cout << "\n";
	}
	std::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.get(z, i, j);
					t.set(z, i, j, t.get(z, i, m));
					t.set(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.get(z, i, j);
						t.set(z, i, j, t.get(k, i, j));
						t.set(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;
				std::cout << std::setw(n) << t.get(z, i, j);
			}
			std::cout << "   ";
		}
		std::cout << "\n";
	}
	std::system("pause");
    return 0;
}

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