Untitled

 avatar
unknown
plain_text
3 years ago
3.0 kB
2
Indexable

/* 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 - 1); i++) {
			if (tab[i] + 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 = 10;
	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];	
		cout << "orginalna 2D: " << tab2D;// 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
}

#endif

#ifdef ZadanieP

// TU UMIEŚĆ KOD ROZWIAZANIA ZADANIA PODSTAWOWEGO

#endif

#ifdef ZadanieA

// TU UMIEŚĆ KOD ROZWIAZANIA ZADANIA AMBITNEGO

#endif