Projektovanje softvera/K1 2024

Izvor: SI Wiki
< Пројектовање софтвера
Datum izmene: 20. jul 2025. u 11:59; autor: Aleksa (razgovor | doprinosi) (prepisani pravi tekstovi)
Pređi na navigaciju Pređi na pretragu

Prvi kolokvijum 2024. godine održan je 27. oktobra 2024. godine. Bile su dostupne prezentacije o svim projektnim obrascima, kao i Java dokumentacija. Vreme za izradu je bilo 120 minuta.

1. zadatak

Postavka

Napraviti program za rad sa slikama. Slika je definisana kao niz piksela, gde se svaki piksel sastoji od tri celobrojne vrednosti (R, G i B), s tim da su svi brojevi u opsegu od 0 do 255. Implementacija piksela prikazana je u sledećoj klasi:

package zad1;

public class Pixel {
    private int R, G, B;

    public Pixel(int R, int G, int B) {
        this.R = R;
        this.G = G;
        this.B = B;
    }

    public int getR() {
        return R;
    }

    public void setR(int R) {
        this.R = R;
    }

    public int getG() {
        return G;
    }

    public void setG(int G) {
        this.G = G;
    }

    public int getB() {
        return B;
    }

    public void setB(int B) {
        this.B = B;
    }
}

Korisnik može čitati piksele sa slike i dodavati proizvoljan broj filtera slici, ali tako da razlika između obične slike i slike sa primenjenim filterima nije vidljiva korisniku. Potrebno je implementirati dva konkretna filtera:

Greyscale: R, G, B = 0.2 * R + 0.5 * G + 0.3 * B

Inverse: R = 255 - R, G = 255 - G, B = 255 - B

Potrebno je napisati primer saradnje ovih klasa. Na proizvoljnu sliku treba primeniti oba filtera, Greyscale i Inverse, i ispisati sve piksele nakon primene filtera.

Rešenje

Saradnja

U ovom zadatku potrebno je koristiti uzorak Dekorater, a u izradi se koristio i uzorak Šablonski metod.

Dekorater
Učesnici:
  • Komponenta (Picture)
  • Subjekat (RawPicture)
  • Dopuna (Filter)
  • KonkretnaDopuna (Greyscale, Inverse)
Šablonski metod
Učesnici:
  • ApstraktnaKlasa (Filter)
  • KonkretnaKlasa (Greyscale, Inverse)

Picture.java

package zad1;

import java.util.List;

public abstract class Picture {
    protected List<Pixel> pixels;

    public List<Pixel> getPixels() {
        return pixels;
    }

}

RawPicture.java

package zad1;

import java.util.List;

public class RawPicture extends Picture {

    public RawPicture(List<Pixel> pixels) {
		this.pixels = pixels;
    }

}

Filter.java

package zad1;

import java.util.ArrayList;
import java.util.List;

public abstract class Filter extends Picture {

	public Filter(Picture picture) {
		pixels = new ArrayList<Pixel>();
		for (Pixel pixel : picture.getPixels()) {
			pixels.add(applyFilter(pixel));
		}
	}

	public abstract Pixel applyFilter(Pixel pixel);

}

Greyscale.java

package zad1;

public class Greyscale extends Filter {

	public Greyscale(Picture picture) {
		super(picture);
	}

	@Override
	public Pixel applyFilter(Pixel pixel) {
		int color = (int) (pixel.getR() * 0.2 + pixel.getG() * 0.5 + pixel.getB() * 0.3);
		return new Pixel(color, color, color);
	}
}

Inverse.java

package zad1;

public class Inverse extends Filter {
	
	public Inverse(Picture picture) {
		super(picture);
	}

	@Override
	public Pixel applyFilter(Pixel pixel) {
		return new Pixel(255 - pixel.getR(), 255 - pixel.getG(), 255 - pixel.getB());
	}
}

Main.java

package zad1;

import java.util.Arrays;
import java.util.List;

public class Main {
	public static void main(String[] args) {
		List<Pixel> pixels = Arrays.asList(new Pixel(100, 0, 50), new Pixel(255, 255, 0), new Pixel(0, 255, 0));
        Picture raw = new RawPicture(pixels);

		Picture picture = new Greyscale(new Inverse(raw));
		
		for (Pixel pixel : picture.getPixels()) {
			System.out.println("R = " + pixel.getR() + "\tG = " + pixel.getG() + "\tB = " + pixel.getB());
		}
	}
}

2. zadatak

Ovaj zadatak nije rešen. Pomozite SI Wiki tako što ćete ga rešiti.

Postavka

Posmatra se deo sistema koji simulira kartašku igru. Pre početka igre, igrači mogu da se prijave deliocu karata („krupijeu“) za učestvovanje u igri i mogu da se odjave nakon završene igre. Igra se igra tako da u njoj može učestvovati različit broj igrača i tokom igre igrači ne razgovaraju jedan sa drugim. Broj igrača je uvek dovoljno mali da je sa njima prihvatljiva sinhrona komunikacija. Nakon što se igra pokrene, svaki igrač od krupijea dobija po dve nasumične karte (kojih je samo on svestan). Potom krupije otkriva jednu od preostalih karata i svi igrači se obaveštavaju o karti koja je otkrivena. Na osnovu ovih informacija, svaki igrač može da odluči koliko će novca uložiti. Neki igrači igraju agresivno, a neki štedljivo; način igranja može da se konfiguriše za svakog igrača različito, pri čemu se predviđa osmišljavanje novih različitih načina igre, pa različiti igrači sa istim informacijama ulažu različitu količinu novca. Nakon što svi igrači ulože svoj novac, sledi ponovo otkrivanje nove karte oko koje se igrači obaveštavaju i nakon čega svaki može ponovo da uloži novac. Ovo se ponavlja pet puta po igri, na kraju čega igrač sa najboljom kombinacijom karata dobija sav novac i igra se završava. Logika odabira pobednika se takođe može menjati od igre do igre, mada konkretna implementacija ove logike nije od interesa za ovaj zadatak.

Doraditi i ispraviti datu implementaciju sistema korišćenjem odgovarajućih projektnih obrazaca. Navesti sve primene projektnih obrazaca u sistemu sa kratkim obrazloženjem u tekstualnom fajlu z2.txt (jedna do dve rečenice).

Rešenje