Пројектовање софтвера/К1 2024 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
м (KockaAdmiralac преместио је страницу Пројектовање софтвера/Колоквијум 1 Октобар 2024 на Пројектовање софтвера/К1 2024 без остављања преусмерења: Ispravan naslov)
(нема разлике)

Верзија на датум 29. октобар 2024. у 20:14

К1 2024. године Доступне су презентације о свим пројектним обрасцима, као и Java документација. Време за израду је 120 мин. Текстови задатака нису са оригиналног теста већ су препричани. За сваки задатак потребно је доставити Java фајлове и текстуални фајл који садржи опис пројектних узорака и улога њихових учесника.

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).

Код

Klasa Picture:

package zad1;

import java.util.List;

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

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

}

Klasa RawPicture:

package zad1;

import java.util.List;

public class RawPicture extends Picture {

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

}

Klasa Filter:

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);

}

Klasa Greyscale:

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);
	}
}

Klasa Inverse:

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());
	}
}

Klasa Main

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 тако што ћете га решити.

Разматра се карташка игра са следећим правилима: пре почетка игре, играчи се могу пријавити, а по завршетку игре могу се одјавити. Играчи не комуницирају међусобно, већ само са крупијеом. Због малог броја играча, синхронизација у комуникацији им не представља проблем. Када игра започне, крупије дели сваком играчу по две карте (које види само тај играч). Затим крупије открива једну карту коју сви играчи виде и, на основу те карте, остали играчи полажу улоге. Неки играчи имају агресивнији приступ, док су други резервисанији. Понашање играча може се прилагођавати.

Крупије потом открива још једну карту, а играчи поново улажу. Овај процес се понавља укупно пет пута, након чега се бира победник који узима сав новац. Начин избора победника такође се може мењати, али та логика није релевантна за ову апликацију.

Решење