/* Zmieniając ostatnią literę w poniższej instrukcji na D (dodatkowe), lub P (podstawowe)
* wybierasz aktywne zadanie.
*
* UWAGA: jeśli rozwiązanie zadań wymaga podziału programu na pliki to dodaj je wszystkie do
* projektu, ale przy każdym zadaniu "includuj" tylko te, które jego dotyczą.
*
*/
#define ZadanieD
#ifdef ZadanieD
#include <stdlib.h>
#include <iostream>
#include <time.h>
#include <iomanip>
using namespace std;
void wypelnij(int** tab, const int W, const int K) {
int wypelnienie = 1;
for (int i = 0; i < W; i++)
{
for (int j = 0; j < K; j++)
tab[i][j] = wypelnienie++;
}
}
void wypisz(int** tab, const int W, const int K) {
for (int i = 0; i < W; i++)
{
for (int j = 0; j < K; j++)
cout << setw(3) << tab[i][j];
cout << endl;
}
cout << endl;
}
void zwolnienieTablicy(int*** tab, const int W, const int K) {
bool jakaAlokacja; // 0 -> fragmentaryczna || 1 -> ciągła
if (W == 1) {
cerr << "Tablica ma jeden wiersz. " << endl; // dla tablicy o 1 wierszu zastosowana dealokacja ciagla
delete[] *tab[0];
delete[] *tab;
*tab = nullptr;
}
else {
for (int i = 0; i < W; i++) {
if (*tab[i] + sizeof(int)*K == *tab[i + 1]) // sprawdzenie czy adresy wierszy są po kolei
jakaAlokacja = 1;
else
jakaAlokacja = 0;
}
if (jakaAlokacja) {
cerr << "Wykryty rodzaj alokacji: ciagla" << endl; // zwolnienie tablicy ciągłej
delete[] *tab[0];
delete[] *tab;
*tab = nullptr;
}
else {
cerr << "Wykryty rodzaj alokacji: fragmentaryczna" << endl; // zwolnienie tablicy fragmentarycznej
for (int i = 0; i < W; i++) {
delete[] *tab[i];
}
delete[] *tab;
*tab = nullptr;
}
}
}
int main() {
srand(time(NULL));
int rodzajAlokacji = (rand() % 2) + 1; //losowanie jaki rodzaj alokacji zostanie wysłany do funkcji
int iloscWierszy = 2;
int iloscKolumn = 6;
int** tab2D = nullptr;
if (rodzajAlokacji == 1) {
cout << "Wylosowana alokacja: fragmentaryczna";
tab2D = new int* [iloscWierszy]; // alokacja fragmentaryczna
for (int i = 0; i < iloscWierszy; i++) {
tab2D[i] = new int[iloscKolumn];
}
}
else if (rodzajAlokacji == 2) {
cout << "Wylosowana alokacja: ciagla";
tab2D = new int* [iloscWierszy]; // alokacja ciągła
tab2D[0] = new int[iloscWierszy * iloscKolumn];
for (int i = 1; i < iloscWierszy; i++) {
tab2D[i] = &tab2D[0][i * iloscKolumn];
}
}
wypelnij(tab2D, iloscWierszy, iloscKolumn); // wypelnienie
cout << endl << "Tablica: " << endl << endl;
wypisz(tab2D, iloscWierszy, iloscKolumn); // wypisanie
zwolnienieTablicy(&tab2D, iloscWierszy, iloscKolumn); // funkcja zwalniajaca tablic
cout << tab2D;
}
#endif
#ifdef ZadanieP
// TU UMIEŚĆ KOD ROZWIAZANIA ZADANIA PODSTAWOWEGO
#endif
#ifdef ZadanieA
// TU UMIEŚĆ KOD ROZWIAZANIA ZADANIA AMBITNEGO
#endif