Пројектовање софтвера/К1 2024 — разлика између измена
(prepisani pravi tekstovi) |
|||
| Ред 1: | Ред 1: | ||
{{tocright}} | {{tocright}} | ||
'''Први колоквијум 2024. године''' одржан је 27. октобра 2024. године. Биле су доступне презентације о свим пројектним обрасцима, као и ''Java'' документација. Време за израду је било 120 минута | '''Први колоквијум 2024. године''' одржан је 27. октобра 2024. године. Биле су доступне презентације о свим пројектним обрасцима, као и ''Java'' документација. Време за израду је било 120 минута. | ||
== 1. задатак == | == 1. задатак == | ||
Верзија на датум 20. јул 2025. у 11:59
Први колоквијум 2024. године одржан је 27. октобра 2024. године. Биле су доступне презентације о свим пројектним обрасцима, као и Java документација. Време за израду је било 120 минута.
1. задатак
Поставка
Направити програм за рад са сликама. Слика је дефинисана као низ пиксела, где се сваки пиксел састоји од три целобројне вредности (R, G и B), с тим да су сви бројеви у опсегу од 0 до 255. Имплементација пиксела приказана је у следећој класи:
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;
}
}
Kорисник може читати пикселе са слике и додавати произвољан број филтера слици, али тако да разлика између обичне слике и слике са примењеним филтерима није видљива кориснику. Потребно је имплементирати два конкретна филтера:
Greyscale: R, G, B = 0.2 * R + 0.5 * G + 0.3 * B
Inverse: R = 255 - R, G = 255 - G, B = 255 - B
Потребно је написати пример сарадње ових класа. На произвољну слику треба применити оба филтера, Greyscale и Inverse, и исписати све пикселе након примене филтера.
Решење
Сарадња
У овом задатку потребно је користити узорак Декоратер, а у изради се користио и узорак Шаблонски метод.
- Декоратер
- Учесници:
- Компонента (Picture)
- Субјекат (RawPicture)
- Допуна (Filter)
- КонкретнаДопуна (Greyscale, Inverse)
- Шаблонски метод
- Учесници:
- АпстрактнаКласа (Filter)
- КонкретнаКласа (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. задатак
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Поставка
Посматра се део система који симулира карташку игру. Пре почетка игре, играчи могу да се пријаве делиоцу карата („крупијеу“) за учествовање у игри и могу да се одјаве након завршене игре. Игра се игра тако да у њој може учествовати различит број играча и током игре играчи не разговарају један са другим. Број играча је увек довољно мали да је са њима прихватљива синхрона комуникација. Након што се игра покрене, сваки играч од крупијеа добија по две насумичне карте (којих је само он свестан). Потом крупије открива једну од преосталих карата и сви играчи се обавештавају о карти која је откривена. На основу ових информација, сваки играч може да одлучи колико ће новца уложити. Неки играчи играју агресивно, а неки штедљиво; начин играња може да се конфигурише за сваког играча различито, при чему се предвиђа осмишљавање нових различитих начина игре, па различити играчи са истим информацијама улажу различиту количину новца. Након што сви играчи уложе свој новац, следи поново откривање нове карте око које се играчи обавештавају и након чега сваки може поново да уложи новац. Ово се понавља пет пута по игри, на крају чега играч са најбољом комбинацијом карата добија сав новац и игра се завршава. Логика одабира победника се такође може мењати од игре до игре, мада конкретна имплементација ове логике није од интереса за овај задатак.
Дорадити и исправити дату имплементацију система коришћењем одговарајућих пројектних образаца. Навести све примене пројектних образаца у систему са кратким образложењем у текстуалном фајлу z2.txt (једна до две реченице).