Advertisement
StefanTodorovski

[НП] Студентски досиеа

Feb 6th, 2019
518
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.70 KB | None | 0 0
  1. /*
  2. Студентски досиеа (60 поени)
  3. Да се имплементира класа StudentRecords која ќе чита од влезен тек (стандарден влез, датотека, ...) податоци за студентски досиеа. Податоците содржат (код - единствен стринг), насока (стринг од 3 букви) и низа со оценки (цели броеви од 6 - 10). Сите податоци се разделени со едно празно место.
  4.  
  5. Пример за форматот на податоците:
  6. ioqmx7 MT 10 8 10 8 10 7 6 9 9 9 6 8 6 6 9 9 8
  7.  
  8.  
  9. Ваша задача е да ги имплементирате методите:
  10.  
  11. StudentRecords() - default конструктор
  12.  
  13. int readRecords(InputStream inputStream) - метод за читање на податоците кој враќа вкупно прочитани записи
  14.  
  15. void writeTable(OutputStream outputStream) - метод кој ги печати сите записите за сите студенти групирани по насока (најпрво се печати името на насоката), а потоа се печатат сите записи за студентите од таа насока сортирани според просекот во опаѓачки редослед (ако имаат ист просек според кодот лексикографски) во формат kod prosek, каде што просекот е децимален број заокружен на две децимали. Пример jeovz8 8.47. Насоките се сортирани лексикографски. Комплексноста на методот да не надминува O(N) во однос на бројот на записи.
  16.  
  17. void writeDistribution(OutputStream outputStream) - метод за печатење на дистрибуцијата на бројот на оценки по насока, притоа насоките се сортирани по бројот на десетки во растечки редослед (прва е насоката со најмногу оценка десет). Дистрибуцијата на оценки се печати во следниот формат:
  18.  
  19. NASOKA
  20. [оценка со 2 места порамнети во десно] | [по еден знак * на секои 10 оценки] ([вкупно оценки])
  21.  
  22. Пример:
  23. KNI
  24.  6 | ***********(103)
  25.  7 | ******************(173)
  26.  8 | *******************(184)
  27.  9 | *****************(161)
  28. 10 | **************(138)
  29. Комплексноста на овој метод да не надминува O(N∗M∗log2(M)) за N записи и M насоки
  30. */
  31.  
  32.  
  33. import java.io.*;
  34. import java.util.*;
  35. import java.util.stream.Collectors;
  36. import java.util.stream.IntStream;
  37.  
  38. /**
  39.  * January 2016 Exam problem 1
  40.  */
  41. public class StudentRecordsTest {
  42.     public static void main(String[] args) {
  43.         System.out.println("=== READING RECORDS ===");
  44.         StudentRecords studentRecords = new StudentRecords();
  45.         int total = studentRecords.readRecords(System.in);
  46.         System.out.printf("Total records: %d\n", total);
  47.         System.out.println("=== WRITING TABLE ===");
  48.         studentRecords.writeTable(System.out);
  49.         System.out.println("=== WRITING DISTRIBUTION ===");
  50.         studentRecords.writeDistribution(System.out);
  51.     }
  52. }
  53.  
  54. class Student {
  55.     private String code;
  56.     private List<Integer> grades;
  57.  
  58.     public Student(String code, List<Integer> grades) {
  59.         this.code = code;
  60.         this.grades = new ArrayList<>(grades.size());
  61.         this.grades.addAll(grades);
  62.     }
  63.  
  64.     public String getCode() {
  65.         return code;
  66.     }
  67.  
  68.     public double calculateAverage() {
  69.         return grades.stream().mapToInt((g) -> g).average().orElse(0);
  70.     }
  71.  
  72.     public Integer countGrades(int grade) {
  73.         return Math.toIntExact(grades.stream()
  74.                 .filter((g) -> g == grade)
  75.                 .count());
  76.     }
  77.  
  78.     @Override
  79.     public String toString() {
  80.         return String.format("%s %.2f", code, calculateAverage());
  81.     }
  82. }
  83.  
  84. class Program {
  85.     private String name;
  86.     private TreeSet<Student> students;
  87.  
  88.     public Program(String name) {
  89.         this.name = name;
  90.         this.students = new TreeSet<>(
  91.                 Comparator.comparingDouble(Student::calculateAverage)
  92.                 .reversed()
  93.                 .thenComparing(Student::getCode));
  94.     }
  95.  
  96.     public void addStudent(Student s) {
  97.         students.add(s);
  98.     }
  99.  
  100.     public String printAverage() {
  101.         StringBuilder sb = new StringBuilder();
  102.         sb.append(name).append("\n");
  103.         students.forEach((s) -> sb.append(s).append("\n"));
  104.         return sb.toString();
  105.     }
  106.  
  107.     public Integer getGradeDistribution(int grade) {
  108.         return students.stream()
  109.                 .mapToInt((s) -> s.countGrades(grade))
  110.                 .sum();
  111.     }
  112.  
  113.     public String printGradeDistribution(int grade) {
  114.         StringBuilder sb = new StringBuilder();
  115.         int grades = getGradeDistribution(grade);
  116.         int asterisks = (int)Math.ceil((double)grades/10);
  117.  
  118.         for(int i=0; i<asterisks; i++)
  119.             sb.append("*");
  120.  
  121.         sb.append("(").append(grades).append(")");
  122.         return sb.toString();
  123.     }
  124.  
  125.     public String getName() {
  126.         return name;
  127.     }
  128. }
  129.  
  130. class StudentRecords {
  131.     private TreeMap<String, Program> records;
  132.  
  133.     public StudentRecords() {
  134.         this.records = new TreeMap<>();
  135.     }
  136.  
  137.     int readRecords(InputStream inputStream) {
  138.         BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
  139.         String line;
  140.         int readRecords = 0;
  141.  
  142.         try {
  143.             while((line = br.readLine()) != null) {
  144.                 if (line.equals("KRAJ")) break;
  145.                 String[] parts = line.split("\\s+");
  146.  
  147.                 List<Integer> grades = IntStream.range(2, parts.length)
  148.                         .mapToObj((i) -> Integer.parseInt(parts[i]))
  149.                         .collect(Collectors.toList());
  150.  
  151.                 Student newStudent = new Student(parts[0], grades);
  152.                 Program studentProgram =
  153.                         records.computeIfAbsent(parts[1], (sr) -> new Program(parts[1]));
  154.                 studentProgram.addStudent(newStudent);
  155.  
  156.                 readRecords++;
  157.             }
  158.             br.close();
  159.         } catch(IOException e) {
  160.             e.printStackTrace();
  161.         }
  162.         return readRecords;
  163.     }
  164.  
  165.     void writeTable(OutputStream outputStream) {
  166.         PrintWriter pw = new PrintWriter(outputStream);
  167.         records.values().forEach((p) -> pw.println(p.printAverage()));
  168.  
  169.         //O(n) -> gi izminuva site studenti ednas
  170.         // taka sto nasoki*studenti = N (site studenti)
  171.  
  172.         pw.flush();
  173.    }
  174.  
  175.     void writeDistribution(OutputStream outputStream) {
  176.         PrintWriter pw = new PrintWriter(outputStream);
  177.  
  178.         records.values().stream()
  179.                 .sorted((p1, p2) -> -p1.getGradeDistribution(10).compareTo(p2.getGradeDistribution(10)))
  180.                 .forEach((p) -> {
  181.                     pw.println(p.getName());
  182.                     IntStream.range(6, 11)
  183.                             .forEach((i) -> {
  184.                                 pw.printf("%2d | %s\n", i, p.printGradeDistribution(i));
  185.                             });
  186.                 });
  187.  
  188.         //Sortiranje logM na nasokite
  189.         //Izminuvanje na sekoj student po ednas (ne e M*N zatoa sto vo edna nasoka imam nekolku studenti, ne site)
  190.         // Kompleksnost: O(N*Log2M)
  191.  
  192.         pw.flush();
  193.         pw.close();
  194.     }
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement