Napredno Programiranje

  • Uploaded by: api-245739455
  • 0
  • 0
  • January 2021
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Napredno Programiranje as PDF for free.

More details

  • Words: 8,048
  • Pages: 47
Loading documents preview...
Задачи Автомобили (30 поени) Problem 1 (5 / 8) ............................................................................................. 2 Мобилни телефони (30 поени) Problem 1 (1 / 3) ................................................................................ 5 Матрица Problem 1 (2 / 2) ..................................................................................................................... 7 Администрација на чет-систем Problem 2 (0 / 1) ................................................................................ 9 Дропки (35 поени) Problem 3 (1 / 2) ................................................................................................... 14 Мерна станица (35 поени) Problem 2 (1 / 1) ...................................................................................... 16 Архива (35 поени) Problem 2 (1 / 1) .................................................................................................... 20 Календар на настани (35 поени) Problem 3 (1 / 1) ............................................................................ 24 Насловна страница Problem 3 (1 / 6) .................................................................................................. 27 Тежини (30 поени) Problem 1 (1 / 6) ................................................................................................... 33 Циркуларна листа (35 поени) Problem 2 (0 / 0) ................................................................................. 36 Патна мрежа (35 поени) Problem 3 (0 / 5).......................................................................................... 39 Место за паркинг (40 поени) Problem 8 (5 / 6) .................................................................................. 43

Автомобили (30 поени) Problem 1 (5 / 8) Да се напише класа за автомобил Car во која се чува:    

производител модел цена моќност.

Да се имплементира конструктор со следните аргументи Car(String manufacturer, String model, int price, float power). Потоа да се напише класа CarCollection во која се чува колекција од автомобили. Во оваа класа треба да се имплментираат следните методи:  





public void addCar(Car car) - додавање автомобил во колекцијата public void sortByPrice(boolean ascending) - подредување на колекцијата по цената на автомобилот (во растечки редослед ако аргументот ascending е true, во спротивно, во опаѓачки редослед). Ако цената на автомобилите е иста, сортирањето да се направи според нивната моќноста. public List filterByManufacturer(String manufacturer) - враќа листа со автомобили од одреден производител (споредбата е според името на производителот без да се води сметка за големи и мали букви во името). Автомобилите во оваа листата треба да бидат подредени според моделот во растечки редослед. public List getList() - ја враќа листата со автомобили од колекцијата.

Solution:

import java.util.*; public class CarTest { public static void main(String[] args) { CarCollection carCollection = new CarCollection(); String manufacturer = fillCollection(carCollection); carCollection.sortByPrice(true); System.out.println("=== Sorted By Price ASC ==="); print(carCollection.getList()); carCollection.sortByPrice(false); System.out.println("=== Sorted By Price DESC ==="); print(carCollection.getList()); System.out.printf("=== Filtered By Manufacturer: %s ===\n", manufacturer); List result = carCollection.filterByManufacturer(manufacturer); print(result); } static void print(List cars) { for (Car c : cars) { System.out.println(c);

} }

static String fillCollection(CarCollection cc) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { String line = scanner.nextLine(); String[] parts = line.split(" "); if(parts.length < 4) { scanner.close(); return parts[0]; } Car car = new Car(parts[0], parts[1], Integer.parseInt(parts[2]), Float.parseFloat(parts[3])); cc.addCar(car); } scanner.close(); return ""; } } class Car { String manufacturer; String model; int price; float power; public Car(String manufacturer, String model, int price, float power) { this.manufacturer = manufacturer; this.model = model; this.price = price; this.power = power; } public String getManufacturer(){ return manufacturer; } public int getPrice(){ return price; } public float getPower(){ return power; } public String getModel(){ return model; } public String toString(){ return manufacturer + " " + model + " (" + (int)power + "KW) " + price; } }

class CarCollection { List carList; public CarCollection(){ carList = new ArrayList<>(); } public void addCar(Car car){ carList.add(car); } public void sortByPrice(boolean ascending){ if(ascending) Collections.sort(carList, new SortByPriceLowToHigh()); else Collections.sort(carList, new SortByPriceHighToLow()); } public List filterByManufacturer(String manufacturer){ List carFromManufacturer = new ArrayList<>(); for(Car c : carList){ String m1 = c.getManufacturer().toLowerCase(); String m2 = manufacturer.toLowerCase(); if(m1.equals(m2)) carFromManufacturer.add(c); } Collections.sort(carFromManufacturer, new SortByModel()); return carFromManufacturer; } public List getList(){ return carList; } } class SortByPriceLowToHigh implements Comparator { @Override public int compare(Car car1, Car car2) { if(car1.getPrice() > car2.getPrice()) return 1; else if(car1.getPrice() < car2.getPrice()) return -1; else if(car1.getPower() > car2.getPower()) return 1; else return -1; } } class SortByPriceHighToLow implements Comparator { @Override public int compare(Car car1, Car car2) { if(car1.getPrice() < car2.getPrice()) return 1; else if(car1.getPrice() > car2.getPrice()) return -1; else if(car1.getPower() < car2.getPower()) return 1; else return -1; } }

class SortByModel implements Comparator{ @Override public int compare(Car car1, Car car2) { return car1.getModel().compareTo(car2.getModel()); }

Мобилни телефони (30 поени) Problem 1 (1 / 3) Да се напише класа за мобилен телефон Phone во која се чува:   

име производител цена на телефон.

Потоа да се напише класа PhonesList во која се чува колекција од телефони. Во оваа класа треба да се имплментираат следните методи:    

public void addPhone(Phone phone) - дадавање телефон во колекцијата public void sortByPrice() - сортирање на колекцијата по цената на телефонот (во растечки редослед) public void sortByManufacturer() - сортирање на колекцијата по производителот на телефонот (лексикографски во растечки редослед) public List getPhones() - ја враќа колекцијата од телефони.

Solution: import java.util.*; public class MobilePhonesTest { static void fillList(PhonesList mpl) { Scanner scanner = new Scanner(System.in); while(scanner.hasNext()) { String line = scanner.nextLine(); String[] parts = line.split(" "); Phone phone = new Phone(parts[0], parts[1], Float.parseFloat(parts[2])); mpl.addPhone(phone); } scanner.close(); } public static void main(String[] args) { PhonesList mpl = new PhonesList(); // Create list object fillList(mpl); mpl.sortByManufacturer(); System.out.println("SORTED BY MANUFACTURER"); for(Phone p : mpl.getPhones()) { System.out.println(p); } mpl.sortByPrice(); System.out.println("SORTED BY PRICE"); for(Phone p : mpl.getPhones()) { System.out.println(p); } }

}

class PhonesList { // vashiot kod ovde ArrayList phonesList; public PhonesList(){ phonesList = new ArrayList<>(); } public void addPhone(Phone phone){ phonesList.add(phone); } public void sortByPrice(){ Collections.sort(phonesList, new SortByPrice()); } public void sortByManufacturer(){ Collections.sort(phonesList, new SortByManufacturer()); } public List getPhones(){ return phonesList; } } class Phone { // vashiot kod ovde String name; String manufacturer; double price; public Phone(String name, String manufacturer, double price) { this.name = name; this.manufacturer = manufacturer; this.price = price; } public String getName() { return name; } public String getManufacturer() { return manufacturer; } public double getPrice() { return price; }

@Override public String toString() { return String.format("%s %s %f.2", name, manufacturer, price); } } class SortByPrice implements Comparator{ @Override public int compare(Phone phone1, Phone phone2) { if(phone1.getPrice() > phone2.getPrice()) return 1; else if(phone1.getPrice() < phone2.getPrice()) return -1; else return phone1.getManufacturer().compareTo(phone2.getManufacturer()); } } class SortByManufacturer implements Comparator{ @Override public int compare(Phone phone1, Phone phone2) { return phone1.getManufacturer().compareTo(phone2.getManufacturer()); } }

Матрица Problem 1 (2 / 2) Да се имплементира класа Matrix (матрица) за чување на дво-димензионална низа од double вредности. Во класата се чуваат димензиите на матрицата (бројот на редици и бројот на колони) и елементите. Да се имплментираат методи за вчитување void load(InputStream is) на матрицата од влезен тек и за запишување void write(OutputStream os) матрица на излезен тек. Методот за вчитување фрла исклучок од тип MatrixInvalidDimensions ако барем една од димензиите (бројот на редици или колони) е негативен број. На излезниот тек се печатат само вредностите на матрицата форматирани со 10 места од кои 2 места се за децималниот дел од бројот. Пораката која се чита од исклучокот е "INVALID DIMENSIONS". Solution: import java.util.*; public class MatrixTest { public static void main(String[] args) { try { Matrix mat = new Matrix(); mat.load(System.in); mat.write(System.out); } catch (MatrixInvalidDimensions e) {

System.out.println(e.getMessage()); } } }

class Matrix { private int rows; private int columns; private double data[][]; public Matrix() { rows = columns = 0; data = null; } public void load(InputStream inputStream) throws MatrixInvalidDimensions { Scanner scanner = new Scanner(inputStream); int r = scanner.nextInt(); int c = scanner.nextInt(); if(r < 0 || c < 0) throw new MatrixInvalidDimensions(); rows = r; columns = c; data = new double[rows][columns]; for(int i = 0; i < rows; ++i) { for(int j = 0; j < columns; ++j) { data[i][j] = scanner.nextDouble(); } } scanner.close(); } public void write(OutputStream outputStream) { PrintWriter printWriter = new PrintWriter(outputStream); for(int i = 0; i < rows; ++i) { for(int j = 0; j < columns; ++j) { printWriter.printf("%10.2f", data[i][j]); } printWriter.println(); } printWriter.close(); } } class MatrixInvalidDimensions extends Exception { public MatrixInvalidDimensions() { super("INVALID DIMENSIONS"); } }

Администрација на чет-систем Problem 2 (0 / 1) Треба да се развие класа за администрација на чет‐систем(chat). Системот се состои од повеќе чет‐соби, објекти од класата ChatRoom. Во ChatRoom ги чуваме името на собата и имињата на корисниците кои тековно се наоѓаат во таа соба (за корисницит е да се користи соодветен Set).   



 

ChatRoom(String name) ‐ креира нова празна соба за чет (празна значи без ко рисници). addUser(String username) - го додава корисникот со тоа име во собата. removeUser(String username) го отстранува корисникот со тоа име од собата доколку има таков, во спротив но не прави ништо. toString():String враќа стринг кои ги содржи името на собата и сите корисници кои се во собата секој одделен со нов ред. Корисниците се подредени алфабетски. Ако собата е празна се враќа името на собата во еден ред, а во вториот ред стрингот "EMPTY" (наводници само за појаснување). hasUser(String username):boolean враќа true ако постои корисник со тоа име во собата. numUsers():int - го враќа бројот на корисници во собата.

Главната класа ChatSystem ги содржи сите соби и сите орисници. Корисниците може да се членови на една, повеќе или да не се членови на ниедна соба. За менаџмент на собите треба да ги понудите следните три методи:   

addRoom(String roomName) - додава нова празна соба во листата на соби. removeRoom(String roomName) - ја отстранува собата од листата. getRoom(String roomName):ChatRoom го враќа објектот кој ја претставува собата со име roomName. Фрлете NoSuch RoomExcpetion(roomName) доколку не постои соба со тоа име.

Забелешка: Собите чувајте ги во TreeMap за да бидат секогаш подредени по нивно то име. Дополнително во класата ChatSystem постојат следните методи за работа со корисни ците:  

ChatSystem() - default constructor register(String userName) го регистрира корисникот во системот. Го додава во собата со најмалку корисници. Доколку има повеќе такви соби тогаш го додава во првата соба по лексикоргафско подредување.









registerAndJoin(String userName, String roomName) го регистрира корисникот во системот. Дополнително го додава во собата со име roomName. joinRoom(String userName, String roomName) го додава корисникот во собата со соодветно име доколку таа постои, в о спротивно фрла исклучок од типот NoSuchRoomExcеpetion(roomName). Ако не постои регистриран корисник со т оа име се фрла исклучок NoSuchUserException(userName).

leaveRoom(String username, String roomName) го отстранува корисникот од собата со соодветно име доколку таа постои. во спротивно фрла исклучок од типот NoSuchRoomExcеpetion(roomName). Ако не постои регистриран корисник со т оа име се фрла исклучок NoSuchUserException(userName). followFriend(String username, String friend_username) – корисникот со име username го приклучува во сите соби во кој е член корисникот со име friendUsername. Ако не постои регистриран корисник со тоа име се фрла исклучок NoSuchUserException(user Name).

Solution: import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.*; class NoSuchRoomException extends Exception { public NoSuchRoomException(String message) { super(message); } } class NoSuchUserException extends Exception { public NoSuchUserException(String message) { super(message); } } class ChatRoom implements Comparable { private String name; private TreeSet<String> users; public ChatRoom(String name) { this.name = name; users = new TreeSet<String>(); } public void addUser(String userName) { users.add(userName); } public void removeUser(String userName) { users.remove(userName);

} public boolean hasUser(String userName) { return users.contains(userName); } public int numUsers() { return users.size(); }

@Override public String toString() { String string = name + "\n"; if (users.size() == 0) return string + "EMPTY\n"; for (String userName : users) string += userName + "\n"; return string; } @Override public int compareTo(ChatRoom chatRoom) { if (this.numUsers() < chatRoom.numUsers()) return -1; else if (this.numUsers() > chatRoom.numUsers()) return 1; else return this.name.compareTo(chatRoom.name); } } class ChatSystem { private TreeMap<String, ChatRoom> rooms; private LinkedList<String> users; public ChatSystem() { rooms = new TreeMap<String, ChatRoom>(); users = new LinkedList<String>(); } public void addRoom(String roomName) { ChatRoom chatRoom = new ChatRoom(roomName); rooms.put(roomName, chatRoom); } public void removeRoom(String roomName) { rooms.remove(roomName); } public ChatRoom getRoom(String roomName) throws NoSuchRoomException { ChatRoom chatRoom = rooms.get(roomName); if (chatRoom == null) throw new NoSuchRoomException(roomName); else return chatRoom; }

public void register(String userName) { if (rooms.size() > 0) { users.add(userName); ChatRoom chatRooms[] = new ChatRoom[rooms.size()]; rooms.values().toArray(chatRooms); Arrays.sort(chatRooms); chatRooms[0].addUser(userName); } } public void registerAndJoin(String userName, String roomName) throws NoSuchRoomException { users.add(userName); ChatRoom chatRoom = this.getRoom(roomName); chatRoom.addUser(userName); } public void joinRoom(String userName, String roomName) throws NoSuchRoomException, NoSuchUserException { ChatRoom chatRoom = this.getRoom(roomName); chatRoom.addUser(userName); } public void leaveRoom(String userName, String roomName) throws NoSuchRoomException, NoSuchUserException { ChatRoom chatRoom = this.getRoom(roomName); int index = users.indexOf(userName); if (index != -1) chatRoom.removeUser(userName); // else // throw new NoSuchUserException(userName); // Nema nitu try-catch nitu throws deklaracija za NoSuchUserException vo // main } public void followFriend(String userName, String friendUserName) throws NoSuchUserException { /* * * Nema nitu try-catch nitu throws deklaracija za NoSuchUserException vo * main * * int index = users.indexOf(userName); * * if(index == -1) throw new NoSuchUserException(userName); * * index = users.indexOf(friendUserName); * * if(index == -1) throw new NoSuchUserException(friendUserName); */ LinkedList chatRooms = new LinkedList(rooms.values()); for (ChatRoom chatRoom : chatRooms)

if (chatRoom.hasUser(friendUserName)) chatRoom.addUser(userName); } }

public class ChatSystemTest { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchRoomException { Scanner jin = new Scanner(System.in); int k = jin.nextInt(); if (k == 0) { ChatRoom cr = new ChatRoom(jin.next()); int n = jin.nextInt(); for (int i = 0; i < n; ++i) { k = jin.nextInt(); if (k == 0) cr.addUser(jin.next()); if (k == 1) cr.removeUser(jin.next()); if (k == 2) System.out.println(cr.hasUser(jin.next())); } System.out.println(""); System.out.println(cr.toString()); n = jin.nextInt(); if (n == 0) return; ChatRoom cr2 = new ChatRoom(jin.next()); for (int i = 0; i < n; ++i) { k = jin.nextInt(); if (k == 0) cr2.addUser(jin.next()); if (k == 1) cr2.removeUser(jin.next()); if (k == 2) cr2.hasUser(jin.next()); } System.out.println(cr2.toString()); } if (k == 1) { ChatSystem cs = new ChatSystem(); Method mts[] = cs.getClass().getMethods(); while (true) { String cmd = jin.next(); if (cmd.equals("stop")) break; if (cmd.equals("print")) { System.out.println(cs.getRoom(jin.next())+"\n"); continue; } for (Method m : mts) { if (m.getName().equals(cmd)) {

String params[] = new String[m.getParameterTypes().length]; for (int i = 0; i < params.length; ++i) params[i] = jin.next(); //m.invoke(cs, params); } } } } } }

Дропки (35 поени) Problem 3 (1 / 2) Треба да се развие генеричка класа за работа со дропки. Класата GenericFraction има два генерички параметри T и U кои мора да бидат од некоја класа која наследува од класата Number. GenericFraction има две променливи:  

numerator - броител denominator - именител.

Треба да се имплементираат следните методи: 

  

GenericFraction(T numerator, U denominator) - конструктор кој ги иницијализира броителот и именителот на дропката. Ако се обидиме да иницијализираме дропка со 0 вредност за именителот треба да се фрли исклучок од тип ZeroDenominatorException GenericFraction add(GenericFraction gf) - собирање на две дропки double toDouble() - враќа вредност на дропката како реален број toString():String - ја печати дропката во следниот формат [numerator] / [denominator], скратена (нормализирана) и секој со две децимални места.

Solution: import java.util.Scanner; public class GenericFractionTest { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); double n1 = scanner.nextDouble(); double d1 = scanner.nextDouble(); float n2 = scanner.nextFloat(); float d2 = scanner.nextFloat(); int n3 = scanner.nextInt(); int d3 = scanner.nextInt(); try { GenericFraction gfDouble = new GenericFraction(n1, d1); GenericFraction gfFloat = new GenericFraction(n2, d2); GenericFraction gfInt = new GenericFraction(n3, d3); System.out.printf("%.2f\n", gfDouble.toDouble()); System.out.println(gfDouble.add(gfFloat));

System.out.println(gfInt.add(gfFloat)); System.out.println(gfDouble.add(gfInt)); gfInt = new GenericFraction(n3, 0); } catch(ZeroDenominatorException e) { System.out.println(e.getMessage()); } scanner.close(); } }

class GenericFraction { T numerator; U denominator; public GenericFraction(T numerator, U denominator) throws ZeroDenominatorException { this.numerator = numerator; if(denominator.doubleValue() == 0) throw new ZeroDenominatorException(); else this.denominator = denominator; } public GenericFraction add(GenericFraction gf) throws ZeroDenominatorException{ double d; double n; if(this.denominator != gf.denominator) { d = this.denominator.doubleValue() * gf.denominator.doubleValue(); n = this.numerator.doubleValue() * gf.denominator.doubleValue() + gf.numerator.doubleValue() * this.denominator.doubleValue(); } else { n = this.numerator.doubleValue() + gf.numerator.doubleValue(); d = this.denominator.doubleValue(); } for(int i = (int)n ; i > 0; i--){ if(n % i == 0 && d % i == 0){ n = n / i; d = d / i; } } GenericFraction genericFraction = new GenericFraction(n, d); return genericFraction; } @Override public String toString() { return String.format("%.2f / %.2f", numerator, denominator); } public double toDouble(){ return numerator.doubleValue() / denominator.doubleValue();

} }

class ZeroDenominatorException extends Exception { public ZeroDenominatorException(){ super("Denominator cannot be zero"); }

Мерна станица (35 поени) Problem 2 (1 / 1) Во една метеролошка станица на секои 5 минути пристигнуваат податоци за временските услови (температура, влажност на воздухот, ветар, видливост, време). Пример за вакви податоци:     

температура: 13 степени влажност: 98% ветар: 11.2 km/h видливост: 14 km време: 28.12.2013 14:37:55 (dd.MM.yyyy HH:mm:ss).

Потребно е да се имплементира класа WeatherStation која ќе ги чува податоците за временските услови за последните x денови (при додавање на податоци за ново мерење, сите мерења чие што време е постаро за x денови од новото се бришат ). Исто така ако времето на новото мерење кое се додава се разликува за помалку од 2.5 минути од времето на некое претходно додадено мерење, тоа треба да се игнорира (не се додава). Да се имплементираат следните методи на класата WeatherStation:    

WeatherStation(int days) - конструктор со аргумент бројот на денови за кои се чуваат мерења public void addMeasurment(float temperature, float wind, float humidity, float visibility, Date date) - додавање на податоци за ново мерење public int total() - го враќа вкупниот број на мерења кои се чуваат public void status(Date from, Date to) - ги печати сите мерења во периодот од from до to подредени според датумот во растечки редослед и на крај ја печати просечната температура во овој период. Ако не постојат мерења во овој период се фрла исклучок од тип RuntimeException (вграден во Јава).

Пример за форматот на излезот: 24.6 80.2 km/h 28.7% 51.7 km Tue Dec 17 23:40:15 CET 2013 23.5 32.2 km/h 16.5% 187.2 km Tue Dec 17 23:45:15 CET 2013 13.2 67.1 km/h 18.9% 135.4 km Tue Dec 17 23:50:15 CET 2013 Avarage temperature: 20.43

Solution: import import import import import

java.text.DateFormat; java.text.ParseException; java.text.SimpleDateFormat; java.util.Date; java.util.Scanner;

import import import import

java.util.TreeMap; java.util.Set; java.util.Map; java.util.Iterator;

public class WeatherStationTest { public static void main(String[] args) throws ParseException { Scanner scanner = new Scanner(System.in); DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); int n = scanner.nextInt(); scanner.nextLine(); WeatherStation ws = new WeatherStation(n); while (true) { String line = scanner.nextLine(); if (line.equals("=====")) { break; } String[] parts = line.split(" "); float temp = Float.parseFloat(parts[0]); float wind = Float.parseFloat(parts[1]); float hum = Float.parseFloat(parts[2]); float vis = Float.parseFloat(parts[3]); line = scanner.nextLine(); Date date = df.parse(line); ws.addMeasurment(temp, wind, hum, vis, date); } String line = scanner.nextLine(); Date from = df.parse(line); line = scanner.nextLine(); Date to = df.parse(line); scanner.close(); System.out.println(ws.total()); try { ws.status(from, to); } catch (RuntimeException e) { System.out.println(e); } } } // vashiot kod ovde class WeatherStatus implements Comparable<WeatherStatus> { private float temperature; private float humidity; private float windSpeed;

private float visibility; private Date date; public WeatherStatus(float temperature, float humidity, float windSpeed, float visibility, Date date) { this.temperature = temperature; this.humidity = humidity; this.windSpeed = windSpeed; this.visibility = visibility; this.date = date; } public float getTemperature() { return temperature; } public float getHumidity() { return humidity; } public float getWindSpeed() { return windSpeed; } public float getVisibility() { return visibility; } public Date getDate() { return date; } @Override public int compareTo(WeatherStatus weatherStatus) { return date.compareTo(weatherStatus.date); } @Override public String toString() { return String.format("%.1f %.1f km/h %.1f%s %.1f km %s", temperature, humidity, windSpeed, "%", visibility, date.toString()); } } class WeatherStation { private TreeMap treeMap; private int days; public WeatherStation(int days) { treeMap = new TreeMap(); this.days = days; } public void addMeasurment(float temperature, float wind, float humidity, float visibility, Date date) {

WeatherStatus newWeatherStatus = new WeatherStatus(temperature, wind, humidity, visibility, date); Map.Entry lastEntry = treeMap.lastEntry(); if (lastEntry != null) { WeatherStatus lastWeatherStatus = treeMap.lastEntry().getValue(); if (((newWeatherStatus.getDate().getTime() lastWeatherStatus.getDate().getTime()) / 1000) >= 150) { treeMap.put(date, newWeatherStatus); Set<Map.Entry> entrySet = treeMap.entrySet(); Iterator<Map.Entry> iterator = entrySet.iterator();

while (iterator.hasNext()) { Map.Entry entry = iterator.next(); int daysBetween = (int) ((date.getTime() entry.getKey().getTime()) / (1000 * 60 * 60 * 24)); if (daysBetween >= days) iterator.remove(); } } } else treeMap.put(date, newWeatherStatus); } public int total() { return treeMap.size(); } public void status(Date from, Date to) { float temperatureSum = 0; int sum = 0; for (Map.Entry entry : treeMap.entrySet()) { if (entry.getKey().compareTo(from) >= 0 && entry.getKey().compareTo(to) <= 0) { System.out.println(entry.getValue()); temperatureSum += entry.getValue().getTemperature(); sum++; } } if (sum == 0) throw new RuntimeException(); System.out.println(String.format("Average temperature: %.2f", temperatureSum / sum)); } }

Архива (35 поени) Problem 2 (1 / 1) Да се имплементира класа ArchiveStore во која се чува листа на архиви (елементи за архивирање). Секој елемент за архивирање Archive има:  

id - цел број dateArchived - датум на архивирање.

Постојат два видови на елементи за архивирање, LockedArchive за кој дополнително се чува датум до кој не смее да се отвори dateToOpen и SpecialArchive за кој се чуваат максимален број на дозволени отварања maxOpen. За елементите за архивирање треба да се обезбедат следните методи:  

LockedArchive(int id, Date dateToOpen) - конструктор за заклучена архива SpecialArchive(int id, int maxOpen) - конструктор за специјална архива

За класата ArchiveStore да се обезбедат следните методи:   



ArchiveStore() - default конструктор void archiveItem(Archive item, Date date) - метод за архивирање елемент item на одреден датум date void openItem(int id, Date date) - метод за отварање елемент од архивата со зададен id и одреден датум date. Ако не постои елемент со даденото id треба да се фрли исклучок од тип NonExistingItemException со порака Item with id [id] doesn't exist. String getLog() - враќа стринг со сите пораки запишани при архивирањето и отварањето архиви во посебен ред.

За секоја акција на архивирање во текст треба да се додаде следната порака Item [id] archived at [date], додека за секоја акција на отварање архива треба да се додаде Item [id] opened at [date]. При отварање ако се работи за LockedArhive и датумот на отварање е пред датумот кога може да се отвори, да се додаде порака Item [id] cannot be opened before [date]. Ако се работи за SpecialArhive и се

обидиеме да ја отвориме повеќе пати од дозволениот број (maxOpen) да се додаде порака Item [id] cannot be opened more than [maxOpen] times. Solution: import java.util.Date; import java.util.Scanner; import java.util.ArrayList; public class ArchiveStoreTest { public static void main(String[] args) { ArchiveStore store = new ArchiveStore(); Date date = new Date(113, 10, 7); Scanner scanner = new Scanner(System.in); scanner.nextLine(); int n = scanner.nextInt(); scanner.nextLine(); scanner.nextLine(); int i; for (i = 0; i < n; ++i) { int id = scanner.nextInt(); long days = scanner.nextLong(); Date dateToOpen = new Date(date.getTime() + (days * 24 * 60 * 60 * 1000)); LockedArchive lockedArchive = new LockedArchive(id, dateToOpen); store.archiveItem(lockedArchive, date); } scanner.nextLine(); scanner.nextLine(); n = scanner.nextInt(); scanner.nextLine(); scanner.nextLine(); for (i = 0; i < n; ++i) { int id = scanner.nextInt(); int maxOpen = scanner.nextInt(); SpecialArchive specialArchive = new SpecialArchive(id, maxOpen); store.archiveItem(specialArchive, date); } scanner.nextLine(); scanner.nextLine(); while (scanner.hasNext()) { int open = scanner.nextInt(); try { store.openItem(open, date); } catch (NonExistingItemException e) { System.out.println(e.getMessage()); } } System.out.println(store.getLog()); } } abstract class Archive { private int id; private Date dateArchived;

public Archive(int id) { this.id = id; this.dateArchived = null; } public int getId() { return id; } public void setDateArchived(Date dateArchived) { this.dateArchived = dateArchived; } public Date getDateArchived() { return dateArchived; } public abstract String open(Date date); } class LockedArchive extends Archive { private Date dateToOpen; public LockedArchive(int id, Date dateToOpen) { super(id); this.dateToOpen = dateToOpen; } public Date getDateToOpen() { return dateToOpen; } @Override public String open(Date date) { if (date.before(dateToOpen) == true) return String.format("Item %d cannot be opened before %s\n", getId(), dateToOpen); else return String.format("Item %d opened at %s\n", getId(), date); } }

class SpecialArchive extends Archive { private int maxOpen; private int timesOpened; public SpecialArchive(int id, int maxOpen) { super(id); this.maxOpen = maxOpen; this.timesOpened = 0; } public int getMaxOpen() { return maxOpen;

} @Override public String open(Date date) { if (timesOpened >= maxOpen) return String.format( "Item %d cannot be opened more than %d times\n", getId(), maxOpen); else { timesOpened++; return String.format("Item %d opened at %s\n", getId(), date); } } }

class ArchiveStore { private ArrayList archives; private String string; public ArchiveStore() { archives = new ArrayList(); string = ""; } public void archiveItem(Archive item, Date date) { item.setDateArchived(date); archives.add(item); string += "Item " + item.getId() + " archived at " + date + "\n"; } public void openItem(int id, Date date) throws NonExistingItemException { for (Archive archive : archives) { if (archive.getId() == id) { string += archive.open(date); return; } } throw new NonExistingItemException(id); } public String getLog() { return string; } } class NonExistingItemException extends Exception { public NonExistingItemException(int id) { super("Item with id " + id + " doesn't exist"); } }

Календар на настани (35 поени) Problem 3 (1 / 1) Да се имплементира класа за календар на настани EventCalendar. Секој настан е дефиниран со:   

име локација време (Date).

Класата треба да ги овозможува следните функционалности:  





public EventCalendar(int year) - конструктор со еден аргумент годината на календарот public void addEvent(String name, String location, Date date) - додава нов настан зададен со име, локација и време. Ако годината на настанот не се совпаѓа со годината на календарот да се фрли исклучок од вид WrongDateException со порака Wrong date: [date]. public void listEvents(Date date) - ги печати сите настани на одреден датум (ден) подредени според времето на одржување во растечки редослед (ако два настани имаат исто време на одржување, се подредуваат лексикографски според името). Добивањето колекција од настани на одреден датум треба да биде во константно време O(1), а печатењето во линеарно време O(n) (без сортирање, само изминување)! Форматот на печатење настан е dd MMM, YYY HH:mm at [location], [name]. public void listByMonth() - ги печати сите месеци (1-12) со бројот на настани во тој месец.

Solution: import import import import import import

java.text.DateFormat; java.text.ParseException; java.text.SimpleDateFormat; java.util.Calendar; java.util.Date; java.util.HashMap;

import import import import

java.util.Map.Entry; java.util.Scanner; java.util.TreeMap; java.util.TreeSet;

class Event implements Comparable<Event>{ String name; String place; Date date; public Event(String name, String place, Date date) { this.name = name; this.place = place; this.date = date; } @Override public int compareTo(Event e) { return this.date.equals(e.date) ? name.compareTo(e.name) : date.compareTo(e.date); } @Override public String toString() { Calendar cal = Calendar.getInstance(); cal.setTime(date); DateFormat df = new SimpleDateFormat("dd MMM, yyyy HH:mm"); String dateString = df.format(cal.getTime()); return dateString + " at " + place + ", " + name; } }

class EventCalendar { HashMap<String, TreeSet<Event>> events; TreeMap byMonths; int year;

public EventCalendar(int year) { events = new HashMap<>(); this.year = year; byMonths = new TreeMap<>(); for(int i = 1; i <= 12;) { byMonths.put(i++, 0); } } public void addEvent(String name, String location, Date date) throws WrongDateException { Calendar cal = Calendar.getInstance(); cal.setTime(date); DateFormat df = new SimpleDateFormat("dd.MM.yyyy"); String dateString = df.format(cal.getTime()); if(cal.get(Calendar.YEAR) != year) { throw new WrongDateException(date);

}

if(!events.containsKey(dateString)) { events.put(dateString, new TreeSet<Event>()); } events.get(dateString).add(new Event(name, location, date)); int k = byMonths.get(cal.get(Calendar.MONTH) + 1); byMonths.remove(cal.get(Calendar.MONTH) + 1); byMonths.put((cal.get(Calendar.MONTH) + 1), k+1); }

public void listEvents(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); DateFormat df = new SimpleDateFormat("dd.MM.yyyy"); String dateString = df.format(cal.getTime()); TreeSet<Event> tmp = events.get(dateString); if(tmp == null) { System.out.println("No events on this day!"); return; } for (Event event : tmp) { System.out.println(event); } } public void listByMonth() { for (Entry ent : byMonths.entrySet()) { System.out.println(ent.getKey() + " : " + ent.getValue()); } }

} public class EventCalendarTest { @SuppressWarnings("resource") public static void main(String[] args) throws ParseException { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); scanner.nextLine(); int year = scanner.nextInt(); scanner.nextLine(); EventCalendar eventCalendar = new EventCalendar(year);

DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm"); for (int i = 0; i < n; ++i) { String line = scanner.nextLine(); String[] parts = line.split(";"); String name = parts[0]; String location = parts[1]; Date date = df.parse(parts[2]); try { eventCalendar.addEvent(name, location, date); } catch (WrongDateException e) { System.out.println(e.getMessage()); } } Date date = df.parse(scanner.nextLine()); eventCalendar.listEvents(date); eventCalendar.listByMonth(); } }

@SuppressWarnings("serial") class WrongDateException extends Exception { public WrongDateException(Date date) { super("Wrong date: " + date); } }

// vashiot kod ovde

Насловна страница Problem 3 (1 / 6) Весникот FINKI Onion се одлучил да развие мобилна апликација за своите вести. Сите вести NewsItem се состојат од наслов, датум на објавување (објект од класата java.util.Date) и категорија. Категоријата на вести е објект од класата Category во која се чува само името на категоријата. Две категории се еднакви, ако се еднакви нивните имиња. Во весникот засега постојат два видови вести кои се објавуваат и тоа:  

Текстуални вести (TextNewsItem) за кој се чува дополнително текстот на веста, Мултимедијални вести (MediaNewsItem) за кој се чува url кон локацијата на мултимедијалната содржина (String) и бројот на погледи.

Сите вести се додаваат во класа FrontPage во која се чува листа од вести и поле од сите категории на вести кои постојат. За оваа класа треба да се имплементираат следните методи: 

конструктор: FrontPage(Category[] categories);

  



void addNewsItem(NewsItem newsItem) - додава нова вест во листата со вести, List listByCategory(Category category) - прима еден аргумент рефернца кон објект од Category и враќа листа со сите вести од таа категорија. List listByCategoryName(String category) - прима еден аргумент String името на категоријата и враќа листа со сите вести од категоријата со тоа име. Ако не постои категорија со вакво име во полето со категории, да се фрли исклучок од тип CategoryNotFoundException во кој се пренесува името на категоријата која не е најдена. препокривање на методот toString() кој враќа String составен од сите кратки содржини на вестите (повик на методот getTeaser()).

Во класите за вести треба да се имплементира методот за враќање на кратка содржина getTeaser() на следниот начин:  

import import import import import import import

TextNewsItem:getTeaser() - враќа String составен од насловот на веста, пред колку минути е објавена веста (цел број минути) и максимум 80 знаци од содржината на веста, сите одделени со нов ред. MediaNewsItem:getTeaser() - враќа String составен од насловот на веста, пред колку минути е објавена веста (цел број минути), url-то на веста и бројот на погледи, сите одделени со нов ред.

java.util.Arrays; java.util.Calendar; java.util.Date; java.util.Iterator; java.util.LinkedList; java.util.Scanner; java.util.ArrayList;

public class FrontPageTest { public static void main(String[] args) { // Reading Scanner scanner = new Scanner(System.in); String line = scanner.nextLine(); String[] parts = line.split(" "); Category[] categories = new Category[parts.length]; for (int i = 0; i < categories.length; ++i) { categories[i] = new Category(parts[i]); } int n = scanner.nextInt(); scanner.nextLine(); FrontPage frontPage = new FrontPage(categories); Calendar cal = Calendar.getInstance(); for (int i = 0; i < n; ++i) { String title = scanner.nextLine(); cal = Calendar.getInstance(); int min = scanner.nextInt(); cal.add(Calendar.MINUTE, -min); Date date = cal.getTime();

scanner.nextLine(); String text = scanner.nextLine(); int categoryIndex = scanner.nextInt(); scanner.nextLine(); TextNewsItem tni = new TextNewsItem(title, date, categories[categoryIndex], text); frontPage.addNewsItem(tni); } n = scanner.nextInt(); scanner.nextLine(); for (int i = 0; i < n; ++i) { String title = scanner.nextLine(); int min = scanner.nextInt(); cal = Calendar.getInstance(); cal.add(Calendar.MINUTE, -min); scanner.nextLine(); Date date = cal.getTime(); String url = scanner.nextLine(); int views = scanner.nextInt(); scanner.nextLine(); int categoryIndex = scanner.nextInt(); scanner.nextLine(); MediaNewsItem mni = new MediaNewsItem(title, date, categories[categoryIndex], url, views); frontPage.addNewsItem(mni); } // Execution String category = scanner.nextLine(); System.out.println(frontPage.toString()); for(Category c : categories) { System.out.println(frontPage.listByCategory(c).size()); } try { System.out.println(frontPage.listByCategoryName(category).size()); } catch(CategoryNotFoundException e) { System.out.println(e.getMessage()); } } } abstract class NewsItem { String title; Date date; Category category; public NewsItem(String title, Date date, Category category) { this.title = title; this.date = date; this.category = category; } public String getTeaser() { return "from Class News Item"; } public String getTitle() { return title;

} public Date getDate() { return date; } public Category getCategory() { return category; } public void setTitle(String title) { this.title = title; } public void setDate(Date date) { this.date = date; }

} class TextNewsItem extends NewsItem { String text; public TextNewsItem(String title, Date date, Category category, String text) { super(title, date, category); this.text = text; } public String getText() { return text; } public void setText(String text) { this.text = text; }

public String getTeaser() { Calendar cal = Calendar.getInstance(); Date date = cal.getTime(); if (text.length() > 80) return getTitle() + "\n" + (date.getTime() getDate().getTime()) / 60 / 1000 + "\n" + text.substring(0, 80); else return getTitle() + "\n" + (date.getTime() getDate().getTime()) / 60 / 1000 + "\n" + text; } } class MediaNewsItem extends NewsItem { String url; int views; public MediaNewsItem(String title, Date date, Category category,

String url, int views) { super(title, date, category); this.url = url; this.views = views; } public String getUrl() { return url; } public int getViews() { return views; } public void setUrl(String url) { this.url = url; } public void setViews(int views) { this.views = views; } @Override public String getTeaser() { Calendar cal = Calendar.getInstance(); Date date = cal.getTime(); return getTitle() + "\n" + (date.getTime() - getDate().getTime()) / 60 / 1000 + "\n" + url + "\n" + views; } } class Category { String name; public Category(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } class FrontPage { ArrayList newsItems = new ArrayList(); Category[] categories; public FrontPage(Category[] categories) { this.categories = categories; }

void addNewsItem(NewsItem newsItem) { newsItems.add(newsItem); } ArrayList listByCategory(Category category) { ArrayList list = new ArrayList(); for (NewsItem ni : newsItems) { if (ni.getCategory().equals(category)) list.add(ni); } return list; } public boolean check(String category) { for (Category c : categories) { if (c.getName().equals(category)) return true; } return false; } ArrayList listByCategoryName(String category) throws CategoryNotFoundException { if (!check(category)) throw new CategoryNotFoundException(category); else { ArrayList list = new ArrayList(); for (NewsItem ni : newsItems) { if (ni.getCategory().getName().equals(category)) list.add(ni); } return list; } } @Override public String toString() { StringBuilder sb = new StringBuilder(); for(NewsItem ni : newsItems){ sb.append(ni.getTeaser() + "\n"); } return sb.toString(); } } class CategoryNotFoundException extends Exception { public CategoryNotFoundException(String category) { super("Category " + category +" was not found"); } }

Тежини (30 поени) Problem 1 (1 / 6) Да се имплементира класа BodyForm која од влезен тек (стандарден влез, датотека, ...) ќе чита податоци за мерења на тежината на неколку луѓе. Податоците за луѓето и нивната тежина се дадени во следниот формат: name weight1 weight2 weight3..., (секој човек може да има различен број на мерења). Пример: James 81.3 90.8 87.9. Ваша задача е да ги имплементирате методите:   

BodyForm() - default конструктор void readData(InputStream inputStream) - метод за читање на податоците void printByWeight(OutputStream outputStream, int type) - метод кој ги печати сите луѓе сортирани според тежината во растечки редослед. По завршување на печатењето извршете flush() и не затворајте (не извршувајте close()). Притоа ако аргументот type има вредност: o 1 се подредуваат според максималната измерена тежина o 2 се подредуваат според просечната измерена тежина (просек од сите измерени тежини).

Печатењето на луѓето е во следниот формат: Формат: [name] MAX : [max.0] kg, AVG : [avg.0] kg

import import import import import import import import import import import import import

java.io.BufferedReader; java.io.FileNotFoundException; java.io.FileReader; java.io.IOException; java.io.InputStream; java.io.InputStreamReader; java.io.OutputStream; java.io.PrintWriter; java.lang.reflect.Array; java.util.ArrayList; java.util.Arrays; java.util.Collection; java.util.Collections;

import java.util.Comparator; import java.util.TreeMap; public class BodyFormTest { public static void main(String[] args) throws IOException { BodyForm bodyForm = new BodyForm(); bodyForm.readData(System.in); System.out.println("BY MAX"); bodyForm.printByWeight(System.out, 1); System.out.println("BY AVG"); bodyForm.printByWeight(System.out, 2); } } // вашиот код овде class Player { double average; double max; String name; public Player(double average, double max, String name) { super(); this.average = average; this.max = max; this.name = name; } public double getAverage() { return average; } public double getMax() { return max; } public String getName() { return name; } @Override public String toString(){ return String.format("%s MAX : %.1f kg, AVG : %.1f kg", name, max, average); }

}

class BodyForm { ArrayList playerList = new ArrayList<>(); public BodyForm(){ }

public void readData(InputStream inputStream) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); String line; float counter = 0; float average = 0; float max = 0; while((line = br.readLine()) != null){ String parts[] = line.split(" "); for(int i = 1; i < parts.length; i++){ if(max < Float.parseFloat(parts[i])) max = Float.parseFloat(parts[i]); counter += Float.parseFloat(parts[i]); } average = counter/(parts.length-1); playerList.add(new Player(average, max, parts[0])); counter = 0; max = 0; } br.close(); }

public void printByWeight(OutputStream outputStream, int type){ PrintWriter printWriter = new PrintWriter(outputStream); if(type == 1){ Collections.sort(playerList, new sortByMax()); } else Collections.sort(playerList, new sortByAverage()); for(Player p : playerList){ printWriter.println(p.toString()); } printWriter.flush(); } }

class sortByMax implements Comparator{ @Override public int compare(Player arg0, Player arg1) { // TODO Auto-generated method stub if(arg0.getMax() < arg1.getMax()) return -1; else return 1; }

} class sortByAverage implements Comparator{ @Override public int compare(Player o1, Player o2) {

if(o1.getAverage() < o2.getAverage()) return -1; else return 1; }

}

Циркуларна листа (35 поени) Problem 2 (0 / 0) Да се имплементира класа за генеричка циркуларна листа CircularList. Класата треба да ги имплементира следните методи:  

 





import import import import

- конструктор со еден аргумент кој означува максимален капацитет на елементи во листата. void addElement(T element) - метод за додавање нов елемент во листата. Секој следен елемент се додава на крајот од листата, но откако ќе се исполни капацитетот, секој нареден елемент го заменува најстариот елемент во листата. Пример за листа со капацитет од три елементи и додадени [1, 2, 3] најстар елемент е 1 и истиот има индекс 0. По додавањето на нов елемент 4 се добива листата [4, 2, 3] и најстар елемент во листата станува 2, со што и неговиот индекс станува 0. void rotateLeft(int k) - се ротираат елементите на лево за k места. [1, 2, 3, 4] ротирана на лево за 2 места [3, 4, 1, 2]. void rotateRight(int k) - се ротираат елементите на десно за k места. [1, 2, 3, 4] ротирана на десно за 3 места [2, 3, 4, 1]. Методите за ротација ако се повикаат на листа во која не е исполнет капацитетот, треба да фрлат исклучок од вид InvalidRotationException. T getElement(int i) - го враќа елементот на позиција i. Позицијата се смета според редоследот на додавање на елементот. Елементот кој е прв додаден (најстар) има позиција 0, додека елементот кој е додаден последен има позиција (n - 1). Ако методот се повика со позиција која е поголема или еднаква на бројот на елементи во листата треба да се фрли исклучок од вид InvalidIndexException. String toString() - враќа стринг репрезентација на листата. CircularList(int n)

java.util.ArrayList; java.util.Collections; java.util.List; java.util.Scanner;

public class CircularListTest { public static void main(String[] args) { Scanner scanner = new Scanner(System.in);

int n = scanner.nextInt(); int m = scanner.nextInt(); CircularList list = new CircularList(n); try { list.rotateLeft(2); } catch (InvalidRotationException e) { System.out.println("InvalidRotationException"); } for (int i = 0; i < n; ++i) { list.addElement(scanner.nextInt()); } System.out.println(list); for (int i = 0; i < m; ++i) { int a = scanner.nextInt(); System.out.println("ADD " + a); list.addElement(a); System.out.println(list); } int r = scanner.nextInt(); System.out.println("ROTATION LEFT " + r); try { list.rotateLeft(r); } catch (InvalidRotationException e) { System.out.println("InvalidRotationException"); } System.out.println(list); r = scanner.nextInt(); System.out.println("ROTATION RIGHT " + r); try { list.rotateRight(r); } catch (InvalidRotationException e) { System.out.println("InvalidRotationException"); } System.out.println(list); int p = scanner.nextInt(); System.out.println("ELEMENT ON POSITION " + p); try { System.out.println(list.getElement(p)); } catch (InvalidIndexException e) { System.out.println("InvalidIndexException"); } int x = scanner.nextInt(); System.out.println("ADD " + x); list.addElement(x); System.out.println(list); System.out.println("ELEMENT ON POSITION " + (p + 1)); try { System.out.println(list.getElement(p + 1)); } catch (InvalidIndexException e) { System.out.println("InvalidIndexException"); } } }

class CircularList { private int n; private int index = 0;

private ArrayList list; public CircularList(int n) { list = new ArrayList(); this.n = n; } void addElement(T element){ if(list.size() < n) { list.add(element); } else { if(index == list.size()) index = 0; list.set(index, element); index++; } } void rotateLeft(int k) throws InvalidRotationException{ if(list.size() != n) throw new InvalidRotationException(); Collections.rotate(list, -k); if(index - k < 0) index = index + (index - k); else index = index - k; } void rotateRight(int k) throws InvalidRotationException{ if(list.size() != n) throw new InvalidRotationException(); Collections.rotate(list, k); index = (index + k) % n; } T getElement(int i) throws InvalidIndexException{ if(i >= n) throw new InvalidIndexException(); return list.get((index + i) % n); }

@Override public String toString() { return list.toString(); } } class InvalidRotationException extends Exception { public InvalidRotationException(){ super("InvalidRotationException"); } } class InvalidIndexException extends Exception { public InvalidIndexException(){ super("InvalidIndexException"); } }

Патна мрежа (35 поени) Problem 3 (0 / 5) Да се имплементира класа RoadNetwork коjа ќе jа опишува патната инфраструктура во една држава. Во класата се чуваат информации за државата, градовите и патиштата. За државата се чува името, а за секоj град се чува неговото име, броj на жители и имиња на локации со кои е поврзан со директен пат како и должината на тоj пат. Класата треба да ги имплементира следните методи:  







import import import import import

RoadNetwork(String country) - конструктор со аргумент името на државата void addCity(String cityName, int population, String[] locations, float[] distances) - се додава нов град, опишан со името, бројот на жители

и

локациите до кои има директен пат до него, како и должината на тој пат. void search(String cityName) - пребарува град и ги печати информациите за градот (името, броjот на жители и листата на локации со коi е поврзан во растечки редослед). Доколку не постои градот се фрла исклучок од типот CityNotFoundException. float roadNetwork() - jа враќа вкупната должина на сите директни патишта во државата. Патот од Скопје до Велес е различен од патот Велес до Скопје, така што и двата влегуваат во пресметката. void mostDense() - ги печати имињата на двата градови чии што коефициент коj се преметува со формулата (жители на град1 + жители на град2) / растоjание (меѓу град1 и град2), е наjголем.

java.util.ArrayList; java.util.Comparator; java.util.Map; java.util.Scanner; java.util.TreeMap;

public class RoadNetworkTest { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String country = scanner.nextLine(); RoadNetwork roadNetwork = new RoadNetwork(country); int n = scanner.nextInt(); scanner.nextLine(); for (int i = 0; i < n; ++i) {

String line = scanner.nextLine(); String[] parts = line.split(" "); String cityName = parts[0]; int population = Integer.parseInt(parts[1]); String[] cities = new String[(parts.length - 2) / 2]; float[] distances = new float[(parts.length - 2) / 2]; int k = 0; for (int j = 2; j < parts.length; j += 2) { cities[k] = parts[j]; distances[k++] = Float.parseFloat(parts[j + 1]); } roadNetwork.addCity(cityName, population, cities, distances); } System.out.println("SEARCH"); String cityName = scanner.nextLine(); scanner.close(); try { roadNetwork.search(cityName); } catch (CityNotFoundException e) { System.out.println(e.getMessage()); } System.out.println("ROAD NETWORK"); System.out.printf("%.2f\n", roadNetwork.roadNetwork()); System.out.println("MAX DENSE"); roadNetwork.mostDense(); } } // vasiot kod ovde class City { String name; int population; String[] locations; float[] distances; public City(String name, int population, String[] locations, float[] distances) { this.name = name; this.population = population; this.locations = locations; this.distances = distances; } public void sort() { float dis; String loc; for (int i = 0; i < distances.length; i++) { for (int j = 1; j < distances.length - i; j++) { if (distances[j - 1] > distances[j]) { dis = distances[j - 1]; distances[j - 1] = distances[j]; distances[j] = dis; loc = locations[j - 1]; locations[j - 1] = locations[j]; locations[j] = loc; } }

} } public String getName() { return name; } public int getPopulation() { return population; } public String[] getLocations() { return locations; } public float[] getDistances() { return distances; } public float sum() { float sum = 0; for (int i = 0; i < distances.length; i++) sum += distances[i]; return sum; } @Override public String toString() { sort(); StringBuilder sb = new StringBuilder(); sb.append(name + "\n"); sb.append(population + "\n"); for (int i = 0; i < locations.length-1; i++) { sb.append(String.format("%s : %.1f km\n", locations[i], distances[i])); } sb.append(String.format("%s : %.1f km", locations[locations.length1], distances[locations.length-1])); return sb.toString(); } } class RoadNetwork { String country; TreeMap<String, City> cityInformations = new TreeMap<>(); public RoadNetwork(String country) { this.country = country; } void addCity(String cityName, int population, String[] locations, float[] distances) { cityInformations.put(cityName, new City(cityName, population, locations, distances)); } void search(String cityName) throws CityNotFoundException {

if (!cityInformations.containsKey(cityName)) throw new CityNotFoundException(); else System.out.println(cityInformations.get(cityName).toString()); } float roadNetwork() { float sum = 0; for (Map.Entry<String, City> entry : cityInformations.entrySet()) { sum += entry.getValue().sum(); } return sum; } void mostDense(){ float max = 0; String city1 = ""; String city2 = ""; for(Map.Entry<String, City> entry : cityInformations.entrySet()){ for(int i = 0; i < entry.getValue().getLocations().length; i++){ if(cityInformations.containsKey(entry.getValue().getLocations()[i])) { float formula = (entry.getValue().getPopulation() + cityInformations.get(entry.getValue().getLocations()[i]).getPopulation()) / entry.getValue().getDistances()[i]; if(max < formula){ max = formula; city1 = entry.getKey(); city2 = entry.getValue().getLocations()[i]; } } } } System.out.println(String.format("%s - %s : %.2f", city1, city2, max)); } } class CityNotFoundException extends Exception { public CityNotFoundException() { super("CityNotFoundException"); } }

Место за паркинг (40 поени) Problem 8 (5 / 6) Да се имплементира паркинг системот на еден град. За таа цел треба да се имплементираат класите: 1. ParkingSector во која се чуват информации за: o кодот на секторот String o бројот на паркинг места int o сите автомобили (регистрации) во овој сектор ? 2. CityParking во која се чуваат информации за: o името на градот String o и сите паркинг сектори во тој град ? Во класата CityParking треба да се имплементираат следните методи:  





  

CityParking(String name) конструктор со аргумент име на градот void createSectors(String[] sectorNames, int[] counts) креирање на паркинг сектори со имиња String[] sectorNames и број на паркинг места int[] counts (двете низи се со иста големина) void addCar(String sectorName, int spotNumber, String registrationNumber) за додавање автомобил со регистрација registrationNumber на позиција spotNumber (притоа ако позицијата не е во опсегот од 1 <= spotNumber <= број-на-паркинг-места треба да се фрли исклучок од тип InvalidSpotNumberException, ако позицијата е зафатена од некој друг автомобил тогаш се фрла исклучок од тип SpotTakenException, ако

не постои сектор со даденото име се фрла исклучок од тип NoSuchSectorException) void findCar(String registrationNumber) за печатење на секторот и бројот на местото каде што е паркиран автомобилот со дадената регистрација (ако не се пронајде таков автомобил се фрла исклучок од тип CarNotFoundException) забелешка комплексноста на методот не треба да биде поголема од O(logn) toString() враќа стринг во формат: Ime_na_grad Kod_na_sektor : zafateni_mesta/parking_mesta nov red

//za site sektori vo

Во класата ParkingSector треба да се имплементираат следните методи:  

конструктор со аргументи код на секторот и број на слободни места и останати потребни методи за имплементација на претходната класа... ParkingSector(String code, int count)

import java.util.Map; import java.util.Scanner; import java.util.TreeMap; public class ParkingTest { public static void main(String[] args) {

String t; System.out.println(t); Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); scanner.nextLine(); String[] sectorNames = new String[n]; int[] counts = new int[n]; for (int i = 0; i < n; ++i) { String[] parts = scanner.nextLine().split(" "); sectorNames[i] = parts[0]; counts[i] = Integer.parseInt(parts[1]); } String name = scanner.nextLine(); CityParking cityParking = new CityParking(name); cityParking.createSectors(sectorNames, counts); n = scanner.nextInt(); scanner.nextLine(); for (int i = 0; i < n; ++i) { String[] parts = scanner.nextLine().split(" "); String sectorName = parts[0]; int spotNumber = Integer.parseInt(parts[1]); String registrationNumber = parts[2]; try { cityParking.addCar(sectorName, spotNumber, registrationNumber); } catch (InvalidSpotNumberException e) { System.out.println(e.getMessage()); } catch (SpotTakenException e) { System.out.println(e.getMessage()); } catch (NoSuchSectorException e) { System.out.println(e.getMessage()); } } n = scanner.nextInt(); scanner.nextLine(); for (int i = 0; i < n; ++i) { String registrationNumber = scanner.nextLine(); try { cityParking.findCar(registrationNumber); } catch (CarNotFoundException e) { System.out.println(e.getMessage()); } } System.out.println(cityParking); } } // Vasiot kod ovde class ParkingSector { String code; int count; TreeMap<String, Integer> registrations = new TreeMap<>(); public ParkingSector(String code, int count) { this.code = code; this.count = count; }

public String getCode() { return code; } public int getCount() { return count; } public TreeMap<String, Integer> getRegistrations() { return registrations; } public void addCar(String registrationNumber, int spotNumber){ registrations.put(registrationNumber, spotNumber); } @Override public String toString() { // TODO Auto-generated method stub return code + " : " + registrations.size() + "/" + count; } } class Informations { String sectorName; int spotNumber; public Informations(String sectorName, int spotNumber) { this.sectorName = sectorName; this.spotNumber = spotNumber; } public String getSectorName() { return sectorName; } public int getSpotNumber() { return spotNumber; } } class CityParking { String name; TreeMap<String, ParkingSector> sectors = new TreeMap<>(); TreeMap<String, Informations> registrations = new TreeMap<>(); public CityParking(String name) { this.name = name; } void createSectors(String[] sectorNames, int[] counts){ for(int i = 0; i < sectorNames.length; i++) { sectors.put(sectorNames[i], new ParkingSector(sectorNames[i], counts[i]));

} } void addCar(String sectorName, int spotNumber, String registrationNumber) throws InvalidSpotNumberException, SpotTakenException, NoSuchSectorException{ if(!sectors.containsKey(sectorName)) throw new NoSuchSectorException(sectorName); else if(spotNumber < 1 || spotNumber > sectors.get(sectorName).getCount()) throw new InvalidSpotNumberException(); else if(sectors.get(sectorName).getRegistrations().containsValue(spotNumber)) throw new SpotTakenException(); else { sectors.get(sectorName).addCar(registrationNumber, spotNumber); registrations.put(registrationNumber, new Informations(sectorName, spotNumber)); } } void findCar(String registrationNumber) throws CarNotFoundException{ if(!registrations.containsKey(registrationNumber)) throw new CarNotFoundException(registrationNumber); else System.out.println(registrations.get(registrationNumber).getSectorName() + " : " + registrations.get(registrationNumber).getSpotNumber()); } @Override public String toString() { // TODO Auto-generated method stub StringBuilder sb = new StringBuilder(); sb.append(name + '\n'); for(Map.Entry<String, ParkingSector> entry : sectors.entrySet()){ sb.append(entry.getValue().toString() + '\n'); } return sb.toString(); } } class InvalidSpotNumberException extends Exception { public InvalidSpotNumberException(){ super("Invalid spot number"); } } class SpotTakenException extends Exception { public SpotTakenException(){ super("Spot is taken already!"); } } class NoSuchSectorException extends Exception { public NoSuchSectorException(String sectorName){ super("No sector with name " + sectorName); }

} class CarNotFoundException extends Exception { public CarNotFoundException(String registrationNumber){ super("Car with RN " + registrationNumber + " not found"); } }

Related Documents

Napredno Programiranje
January 2021 2
Programiranje
February 2021 1
C# Programiranje Skripta
January 2021 1
Internet Programiranje
January 2021 1
Web Programiranje
February 2021 0