Jedna verzija rešenja (C#, C++, Python)
Postoji dosta načina na koje se može rešiti bilo koji zadatak. Ovde je prikazan jedan od načina:
Analiza - kako do rešenja
Potrebno je realizovati program koji radi sa trodimenzionalnom (3D) matricom celih brojeva dimenzija N x N x N.
Korisnik na početku unosi vrednost N, pri čemu važi uslov: 1 < N < 20
Unos mora biti proveren, što znači da program ne sme nastaviti rad dok se ne unese ispravna vrednost.
Nakon unosa dimenzije:
-
formira se 3D matrica,
-
svaki element dobija vrednost: mat[i][j][k] = i + j + k
Indeksiranje počinje od 0.
Operacije koje program treba da podrži
Program radi sve dok se ne unese komanda:
QUIT
Komande ne smeju biti osetljive na veličinu slova:
update
UPDATE
UpDaTe
sve mora biti prihvaćeno.
1.1 Prikaz matrice
Potrebno je ispisati sve elemente matrice nakon inicijalizacije.
Pošto je matrica 3D, najlakše je prikazati:
-
jedan sloj (
i) -
unutar njega redove (
j) -
i kolone (
k)
Primer:
Layer 0
0 1 2
1 2 3
2 3 4
1.2 UPDATE operacija
Komanda:
UPDATE 2,2,2 -1
znači:
mat[2][2][2] = -1
Potrebno je:
-
pročitati indekse,
-
pročitati novu vrednost,
-
izmeniti element,
-
ponovo prikazati matricu.
1.3 SUM operacija
Komanda:
SUM 1,1,1 3,3,3
znači:
izračunati sumu svih elemenata u opsegu:
i = 1..3
j = 1..3
k = 1..3
uključujući granice.
Potrebno je koristiti tri ugneždene petlje.
1.4 NEW operacija
Formira se nova matrica istih dimenzija.
Svaki element nove matrice predstavlja:
-
zbir susednih elemenata iz stare matrice.
Susedi su:
-
gore/dole
-
levo/desno
-
napred/nazad
Dijagonale se NE računaju.
Ciklično povezivanje (wrap-around)
Ako je element na ivici:
i = 0
njegov sused „iznad“ je:
i = N-1
Isto važi za sve dimenzije.
Ovo je kružna (torusna) matrica.
1.5 MOVE operacija
Komanda:
MOVE 1,1,1 0,1,1
znači:
-
uzeti elemente u istoj osi,
-
pomeriti ih za zadati broj mesta.
Pomeranje može biti:
-
pozitivno,
-
negativno.
Pošto je matrica ciklična, pomeranje „izlazi“ sa jedne strane i vraća se na drugu.
Struktura programa
Program se može podeliti na funkcije:
| Funkcija | Opis |
|---|---|
| InitMatrix | Popunjava matricu |
| PrintMatrix | Ispisuje matricu |
| Update | Menja element |
| SumRange | Računa sumu |
| CreateNewMatrix | Formira NEW matricu |
| Move | Vrši pomeranje |
| ParseCommand | Obrada komandi |
Pseudokod
Učitati N
Dok N nije u opsegu 2..19
ponovo učitati N
Kreirati 3D matricu N x N x N
Za i od 0 do N-1
Za j od 0 do N-1
Za k od 0 do N-1
mat[i][j][k] = i + j + k
Dok je komanda različita od QUIT
Učitati komandu
Ako je komanda PRINT
ispisati matricu
Ako je komanda UPDATE
učitati i,j,k,value
mat[i][j][k] = value
ispisati matricu
Ako je komanda SUM
učitati opseg
sum = 0
Za i kroz opseg
Za j kroz opseg
Za k kroz opseg
sum += mat[i][j][k]
ispisati sum
Ako je komanda NEW
kreirati newMat
Za sva polja
izračunati 6 suseda
upisati zbir u newMat
ispisati newMat
Ako je komanda MOVE
izvršiti ciklično pomeranje
ispisati matricu
C# rešenje (Visual Studio 2010)
using System;
class Program
{
static void PrintMatrix(int[,,] mat, int n)
{
// prolazak kroz slojeve
for (int i = 0; i < n; i++)
{
// prolazak kroz redove
for (int j = 0; j < n; j++)
{
// prolazak kroz kolone
for (int k = 0; k < n; k++)
{
Console.Write(mat[i, j, k] + "\t");
}
Console.WriteLine();
}
Console.WriteLine();
}
}
static void Main()
{
int n;
do
{
Console.WriteLine("Unesite N: ");
n = int.Parse(Console.ReadLine());
} while (n < 2 || n > 19);
int[,,] mat = new int[n, n, n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
for (int k = 0; k < n; k++)
{
mat[i, j, k] = i + j + k;
}
}
}
Console.WriteLine("\n********** Izlaz 1.1 **********");
PrintMatrix(mat, n);
while (true)
{
Console.WriteLine("Naredba: ");
string input = Console.ReadLine();
string upper = input.ToUpper();
if (upper == "QUIT")
{
break;
}
else if (upper.StartsWith("UPDATE"))
{
string[] parts = input.Split(' ');
string[] indexes = parts[1].Split(',');
int i = int.Parse(indexes[0]);
int j = int.Parse(indexes[1]);
int k = int.Parse(indexes[2]);
int value = int.Parse(parts[2]);
mat[i, j, k] = value;
Console.WriteLine("\n********** Izlaz 1.2 **********");
PrintMatrix(mat, n);
}
else if (upper.StartsWith("SUM"))
{
string[] parts = input.Split(' ');
string[] start = parts[1].Split(',');
string[] end = parts[2].Split(',');
int i1 = int.Parse(start[0]);
int j1 = int.Parse(start[1]);
int k1 = int.Parse(start[2]);
int i2 = int.Parse(end[0]);
int j2 = int.Parse(end[1]);
int k2 = int.Parse(end[2]);
int sum = 0;
for (int i = i1; i <= i2; i++)
{
for (int j = j1; j <= j2; j++)
{
for (int k = k1; k <= k2; k++)
{
sum += mat[i, j, k];
}
}
}
Console.WriteLine("\n********** Izlaz 1.3 **********");
Console.WriteLine( "SUM = " + sum );
}
else if (upper == "NEW")
{
int[,,] newMat = new int[n, n, n];
int preX,posleX,preY,posleY,preZ,posleZ, suma;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++){
// indeksi - Susedi
preX = (i-1)<0 ? (n-1) : (i-1);
posleX = (i+1)>=n ? 0 : (i+1);
preY = (j-1)<0 ? (n-1) : (j-1);
posleY = (j+1)>=n ? 0 : (j+1);
preZ = (k-1)<0 ? (n-1) : (k-1);
posleZ = (k+1)>=n ? 0 : (k+1);
suma=0;
suma += mat[preX,j,k]+mat[posleX,j,k];
suma += mat[i,preY,k]+mat[i,posleY,k];
suma += mat[i,j,preZ]+mat[i,j,posleZ];
newMat[i,j,k] = suma;
}
Console.WriteLine("\n********** Izlaz 1.4 **********");
PrintMatrix(newMat, n);
}
else if (upper.StartsWith("MOVE"))
{
string[] parts = input.Split(' ');
string[] pos = parts[1].Split(',');
string[] shift = parts[2].Split(',');
int x = int.Parse(pos[0]);
int y = int.Parse(pos[1]);
int z = int.Parse(pos[2]);
int dx = int.Parse(shift[0]);
int dy = int.Parse(shift[1]);
int dz = int.Parse(shift[2]);
// Pomeranje po x osi
if(dx<0){
int pom = mat[0, y, z];
for (int p = 0; p < -dx; p++) {
for (int i = 0; i < n-1; i++)
{
mat[i, y, z] = mat[i+1, y, z];
}
mat[n-1, y, z] = pom;
}
} else if(dx>0){
int pom = mat[n - 1,y,z];
for (int p = 0; p < dx; p++) {
for (int i = n - 1; i > 0; i--) {
mat[i,y,z] = mat[i - 1,y,z];
}
mat[0,y,z] = pom;
}
}
// Pomeranje po y osi
if(dz<0){
int pom = mat[x, y, 0];
for (int p = 0; p < -dz; p++) {
for (int i = 0; i < n-1; i++)
{
mat[x, y, i] = mat[x, y, i+1];
}
mat[x, y, n-1] = pom;
}
} else if(dz>0){
int pom = mat[x, y, n - 1];
for (int p = 0; p < dz; p++) {
for (int i = n - 1; i > 0; i--) {
mat[x, y, i] = mat[x, y, i - 1];
}
mat[x, y, 0] = pom;
}
}
// Pomeranje po z osi
if(dy<0){
int pom = mat[x, 0, z];
for (int p = 0; p < -dy; p++) {
for (int i = 0; i < n-1; i++)
{
mat[x, i, z] = mat[x, i+1, z];
}
mat[x, n-1, z] = pom;
}
} else if(dy>0){
int pom = mat[x, n - 1, z];
for (int p = 0; p < dy; p++) {
for (int i = n - 1; i > 0; i--) {
mat[x, i, z] = mat[x, i - 1,z];
}
mat[x, 0, z] = pom;
}
}
Console.WriteLine("\n********** 1.5 **********");
PrintMatrix(mat, n);
}
// Nepoznata komanda
else
{
Console.WriteLine( "Nepoznata komanda." );
}
}
}
}
C++ rešenje
#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>
#include <sstream>
using namespace std;
void printMat(int m[][20][20],int N){
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
for(int k=0;k<N;k++)
cout<<m[i][j][k]<<" ";
cout<<endl;
}
cout<<endl;
}
}
int main() {
int N,i,j,k,vrednost, sum=0;
int mat[20][20][20];
string naredba, komanda;
string zarez;
int i1,i2,j1,j2,k1,k2;
do{
cout<<"Unesite N"<<endl;
cin>>N;
}while(N<2 || N>19);
for(i=0;i<N;i++)
for(j=0;j<N;j++)
for(k=0;k<N;k++)
mat[i][j][k] = i+j+k;
cout<<"******** Izlaz 1.1. *********"<<endl;
printMat(mat,N);
cin.ignore();
do{
cout << "Naredba: " << endl;
getline(cin, naredba);
for(j=0;j<naredba.length();j++)
naredba[j]= toupper(naredba[j]);
string nazivNaredbe = naredba.substr(0, naredba.find(' '));
if(nazivNaredbe=="QUIT") break;
else if(nazivNaredbe=="UPDATE"){
sscanf(naredba.c_str(),"UPDATE %d,%d,%d %d",&i, &j, &k, &vrednost);
mat[i][j][k]=vrednost;
cout<<"\n******** Izlaz 1.2. *********"<<endl;
printMat(mat,N);
}
else if(nazivNaredbe=="SUM"){
sscanf(naredba.c_str(),"SUM %d,%d,%d %d,%d,%d",&i1, &j1, &k1, &i2, &j2, &k2);
for(i=i1;i<=i2;i++)
for(j=j1;j<=j2;j++)
for(k=k1;k<=k2;k++)
sum += mat[i][j][k];
cout<<"\n******** Izlaz 1.3. *********"<<endl;
cout<<"Suma = "<<sum<<endl;
}
else if(nazivNaredbe=="NEW"){
int newMat[20][20][20];
int preX,posleX,preY,posleY,preZ,posleZ, suma;
for(i=0;i<=N;i++)
for(j=0;j<=N;j++)
for(k=0;k<=N;k++){
preX = (i-1)<0 ? (N-1) : (i-1);
posleX = (i+1)>=N ? 0 : (i+1);
preY = (j-1)<0 ? (N-1) : (j-1);
posleY = (j+1)>=N ? 0 : (j+1);
preZ = (k-1)<0 ? (N-1) : (k-1);
posleZ = (k+1)>=N ? 0 : (k+1);
suma=0;
suma += mat[preX][j][k]+mat[posleX][j][k];
suma += mat[i][preY][k]+mat[i][posleY][k];
suma += mat[i][j][preZ]+mat[i][j][posleZ];
newMat[i][j][k] = suma;
}
cout<<"\n******** Izlaz 1.4. *********"<<endl;
printMat(newMat,N);
}
else if(nazivNaredbe=="MOVE"){
int x, y, z, x1, y1, z1, pomeraj;
sscanf(naredba.c_str(), "MOVE %d,%d,%d %d,%d,%d", &x, &y, &z, &i2, &j2, &k2);
pomeraj=i2;// i2 - pomeraj po X osi
if (pomeraj < 0) {
for (int p = 0; p < -pomeraj; p++) {
int tmp = mat[0][y][z];
for (int i = 0; i < N - 1; i++) {
mat[i][y][z] = mat[i + 1][y][z];
}
mat[N - 1][y][z] = tmp;
}
} else {
for (int p = 0; p < pomeraj; p++) {
int tmp = mat[N - 1][y][z];
for (int i = N - 1; i > 0; i--) {
mat[i][y][z] = mat[i - 1][y][z];
}
mat[0][y][z] = tmp;
}
}
pomeraj=j2;// j2 - pomeraj po Y osi
if (pomeraj < 0) {
for (int p = 0; p < -pomeraj; p++) {
int tmp = mat[x][0][z];
for (int i = 0; i < N - 1; i++) {
mat[x][i][z] = mat[x][i + 1][z];
}
mat[x][N - 1][z] = tmp;
}
} else {
for (int p = 0; p < pomeraj; p++) {
int tmp = mat[x][N - 1][z];
for (int i = N - 1; i > 0; i--) {
mat[x][i][z] = mat[x][i - 1][z];
}
mat[x][0][z] = tmp;
}
}
pomeraj=k2;// k2 - pomeraj po Z osi
if (pomeraj < 0) {
for (int p = 0; p < -pomeraj; p++) {
int tmp = mat[x][y][0];
for (int i = 0; i < N - 1; i++) {
mat[x][y][i] = mat[x][y][i + 1];
}
mat[x][y][N - 1] = tmp;
}
} else {
for (int p = 0; p < pomeraj; p++) {
int tmp = mat[x][y][N - 1];
for (int i = N - 1; i > 0; i--) {
mat[x][y][i] = mat[x][y][i - 1];
}
mat[x][y][0] = tmp;
}
}
printMat(mat,N);
}
else cout<<"nepoznata naredba "<<endl;
}while(true);
return 0;
}
Python rešenje
def print_matrix(mat, n):
for i in range(n):
for j in range(n):
for k in range(n):
print(mat[i][j][k], end="\t")
print()
print()
def mod(x, n):
return (x % n + n) % n
# unos N
n = 0
while n <= 1 or n >= 20:
n = int(input("Unesite N: "))
# inicijalizacija
mat = [[[0 for k in range(n)] for j in range(n)] for i in range(n)]
for i in range(n):
for j in range(n):
for k in range(n):
mat[i][j][k] = i + j + k
print_matrix(mat, n)
while True:
cmd = input("Komanda: ")
upper = cmd.upper()
# ---------------------------
# QUIT
# ---------------------------
if upper == "QUIT":
break
# ---------------------------
# UPDATE
# ---------------------------
elif upper.startswith("UPDATE"):
parts = cmd.split()
idx = parts[1].split(",")
i = int(idx[0])
j = int(idx[1])
k = int(idx[2])
value = int(parts[2])
mat[i][j][k] = value
print("Nakon UPDATE:")
print_matrix(mat, n)
# ---------------------------
# SUM
# ---------------------------
elif upper.startswith("SUM"):
parts = cmd.split()
start = parts[1].split(",")
end = parts[2].split(",")
i1 = int(start[0])
j1 = int(start[1])
k1 = int(start[2])
i2 = int(end[0])
j2 = int(end[1])
k2 = int(end[2])
s = 0
for i in range(i1, i2 + 1):
for j in range(j1, j2 + 1):
for k in range(k1, k2 + 1):
s += mat[i][j][k]
print("SUM =", s)
# ---------------------------
# NEW
# ---------------------------
elif upper == "NEW":
new_mat = [[[0 for k in range(n)] for j in range(n)] for i in range(n)]
for i in range(n):
for j in range(n):
for k in range(n):
up = mat[mod(i - 1, n)][j][k]
down = mat[mod(i + 1, n)][j][k]
left = mat[i][mod(j - 1, n)][k]
right = mat[i][mod(j + 1, n)][k]
front = mat[i][j][mod(k - 1, n)]
back = mat[i][j][mod(k + 1, n)]
new_mat[i][j][k] = (
up + down +
left + right +
front + back
)
print("NEW matrica:")
print_matrix(new_mat, n)
# ---------------------------
# MOVE
# ---------------------------
elif upper.startswith("MOVE"):
parts = cmd.split()
idx = parts[1].split(",")
move = parts[2].split(",")
x = int(idx[0])
y = int(idx[1])
z = int(idx[2])
dx = int(move[0])
dy = int(move[1])
dz = int(move[2])
temp = [[[mat[i][j][k] for k in range(n)]
for j in range(n)]
for i in range(n)]
# pomeranje po x osi
for i in range(n):
ni = mod(i + dx, n)
temp[ni][y][z] = mat[i][y][z]
# pomeranje po y osi
for j in range(n):
nj = mod(j + dy, n)
temp[x][nj][z] = mat[x][j][z]
# pomeranje po z osi
for k in range(n):
nk = mod(k + dz, n)
temp[x][y][nk] = mat[x][y][k]
mat = temp
print("Nakon MOVE:")
print_matrix(mat, n)
else:
print("Nepoznata komanda.")
Ne morate imati instaliran program da biste radili (i proverili) zadatak.
Online kompajleri:
- za Python, na primer: https://www.programiz.com/python-programming/online-compiler/
- za C# -> https://www.programiz.com/csharp-programming/online-compiler/
- za C -> https://www.programiz.com/c-programming/online-compiler/
- za C++ -> https://www.programiz.com/cpp-programming/online-compiler/
Ovo nije jedino online okruženje u kojem se može raditi - ima ih dosta, a vi koristite ono koje vam najviše odgovara.