Advertisement
Nikolovska

[НП] лаб2.2 Контакти

Jun 3rd, 2018
843
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 17.22 KB | None | 0 0
  1. /*Класи, полиморфизам и исклучоци (2)
  2. Контакти Problem 2 (0 / 6)
  3. Се со цел да се подобри комуникацијата на факултетот потребно е да се направи систем за чување на контакти за секој студент.
  4.  
  5. Да се креира класа Contact. За потребите на оваа класа да се дефинираат следниве методи:
  6.  
  7. Contact(String date) - конструктор каде што date е датумот кога е креиран контактот даден во следниов формат YYYY-MM-DD
  8. isNewerThan(Contact c):boolean - метод кој враќа true доколку контактот е креиран подоцна од контактот c и обратно
  9. getType():String - метод кој враќа вредност "Email" или "Phone" во зависност од типот на контактот
  10. Од класата Contact не треба да може директно да се инстанцира објект.
  11.  
  12. Од оваа класа се изведуваат класите EmailContact и PhoneContact.
  13.  
  14. За класата EmailContact дополнително се чува e-маил кој што е од типот String. Да се дефинираат следниве методи:
  15.  
  16. EmailContact(String date, String email) - конструктор
  17. getEmail():String - метод кој што го враќа е-маилот
  18. getType():String- имплементација на методот од класата Contact
  19. За класата PhoneContact дополнително се чува телефонски број кој што е од типот String и оператор кој што е енумерација
  20. и се дефинира на следниов начин enum Operator { VIP, ONE, TMOBILE }. За оваа класа да се дефинираат следниве методи:
  21.  
  22. PhoneContact(String date, String phone) - конструктор
  23. getPhone():String - метод кој што го враќа телефонскиот број
  24. getOperator():Operator - метод кој што го враќа операторот (070, 071, 072 – TMOBILE, 075,076 – ONE, 077, 078 – VIP)
  25. getType():String- имплементација на методот од класата Contact
  26. *Забелешка: Сите телефонски броеви се во формат 07X/YYY-ZZZ каде што X има вредност {0,1,2,5,6,7,8}
  27.  
  28. Потоа да се дефинира класата Student каде што се чува низа на контакти за секој студент
  29.  
  30. Student(String firstName, String lastName, String city, int age, long index) – конструктор
  31. addEmailContact(String date, String email):void – метод што додава е-маил контакт во низата на контакти
  32. addPhoneContact(String date, String phone):void – метод што додава телефонски контакт во низата на контакти
  33. getEmailContacts():Contact[] – враќа низа на email контактите на студентот
  34. getPhoneContacts():Contact[] – враќа низа на phone контактите на студентот
  35. getCity():String - метод кој го враќа градот
  36. getFullName():String - метод кој го враќа целосното име на студентот во формат IME PREZIME
  37. getIndex():long - метод кој го враќа индексот на студентот
  38. getLatestContact():Contact – го враќа најновиот контакт (според датум) од студентот
  39. toString() – претставува JSON репрезентација на класата студент пр. {"ime":"Jovan", "prezime":"Jovanov", "vozrast":20,
  40. "grad":"Skopje", "indeks":101010, "telefonskiKontakti":["077/777-777", "078/888-888"], "emailKontakti":
  41. ["jovan.jovanov@example.com", "jovanov@jovan.com", "jovan@jovanov.com"]}
  42. *Забелешка: Во класата Student да се чува само една низа од контакти Contact[], а не две низи одделно (PhoneContact[]
  43. * и EmailContact[])
  44.  
  45. *Напомена да не се користи instanceOf или getClass при имплементација на овие методи
  46.  
  47. Дополнително да се дефинира класа Faculty. За оваа класа да се дефинираат следниве методи:
  48.  
  49. Faculty(String name, Student [] students) – конструктор
  50. countStudentsFromCity(String cityName):int – враќа колку студенти има од даден град
  51. getStudent(long index):Student – метод кој го враќа студентот кој го има дадениот индекс
  52. getAverageNumberOfContacts():double – враќа просечен број на контакти по студент
  53. getStudentWithMostContacts():Student – метод кој го враќа студентот со најмногу контакти (доколку има повеќе студенти со
  54. ист број на контакти да го врати студентот со најголем индекс)
  55. toString() – претставува JSON репрезентација на класата Faculty пример: {"fakultet":"FINKI", "studenti":
  56. [STUDENT1, STUDENT2, ...]} каде што треба да има целосни информации за секој студент.
  57.  
  58. Sample input
  59.  
  60. 4
  61. CREATE_FACULTY Ekonomski fakultet
  62. 3
  63. Sanja Mihova Skopje 21 82907017
  64. Emil Stankov Bitola 29 43009931
  65. Emil Trajanov Bitola 29 24914336
  66. ADD_EMAIL_CONTACT 82907017 2012-04-10 sanja@ef.ukim.mk
  67. ADD_PHONE_CONTACT 82907017 2010-03-05 070/744-235
  68. CHECK_SIMPLE
  69.  
  70.  
  71. Sample output
  72.  
  73. Average number of contacts: 0.67
  74. Number of students from Skopje: 1
  75. */
  76.  
  77. import java.text.DecimalFormat;
  78. import java.util.Arrays;
  79. import java.util.Scanner;
  80. import java.time.Year;
  81.  
  82.  
  83. abstract class Contact {
  84.     private String date;     //YYYY-MM-DD
  85.     private final int day;
  86.     private final int month;
  87.     private final int year;
  88.  
  89.     public Contact(String date){
  90.         this.date = date;
  91.         year = Integer.parseInt(date.substring(0,4));
  92.         month = Integer.parseInt(date.substring(5,7));
  93.         day = Integer.parseInt(date.substring(8,10));
  94.     }
  95.  
  96.     public boolean isNewerThan(Contact c){
  97.         if (year > c.year)
  98.             return true;
  99.         if (year < c.year)
  100.             return false;
  101.         if (month > c.month)
  102.             return true;
  103.         if (month < c.month)
  104.             return false;
  105.         if (day > c.day)
  106.             return true;
  107.         return false;
  108.     }
  109.  
  110.     public abstract String getType();
  111. }
  112.  
  113. class EmailContact extends Contact {
  114.    private String email;
  115.  
  116.     public EmailContact(String date, String email) {
  117.         super(date);
  118.         this.email = email;
  119.     }
  120.  
  121.     public String getEmail() {
  122.         return email;
  123.     }
  124.  
  125.     @Override
  126.     public String getType() {
  127.         return "Email";
  128.     }
  129. }
  130.  
  131. class PhoneContact extends Contact {
  132.     private String phone;    //Сите телефонски броеви се во формат 07X/YYY-ZZZ каде што X има вредност {0,1,2,5,6,7,8}
  133.     enum Operator {VIP, ONE, TMOBILE}
  134.  
  135.     public PhoneContact(String date, String phone) {
  136.         super(date);
  137.         this.phone = phone;
  138.     }
  139.  
  140.     public String getPhone() {
  141.         return phone;
  142.     }
  143.  
  144.     public Operator getOperator(){
  145.         //070, 071, 072 – TMOBILE, 075,076 – ONE, 077, 078 – VIP
  146.  
  147.         if (phone.charAt(2) == '0' || phone.charAt(2) == '1' || phone.charAt(2) == '2')
  148.             return Operator.TMOBILE;
  149.         if (phone.charAt(2) == '5' || phone.charAt(2) == '6')
  150.             return Operator.ONE;
  151.         return Operator.VIP;
  152.     }
  153.  
  154.     @Override
  155.     public String getType() {
  156.         return "Phone";
  157.     }
  158. }
  159.  
  160. class Student {
  161.     private String firstName;
  162.     private String lastName;
  163.     private String city;
  164.     private int age;
  165.     private long index;
  166.     Contact[] contacts;
  167.     private int contactsNumber;
  168.     private int emailContacts;
  169.     private int phoneContacts;
  170.  
  171.     public Student(String firstName, String lastName, String city, int age, long index) {
  172.         this.firstName = firstName;
  173.         this.lastName = lastName;
  174.         this.city = city;
  175.         this.age = age;
  176.         this.index = index;
  177.         contactsNumber = 0;
  178.         emailContacts = 0;
  179.         phoneContacts = 0;
  180.     }
  181.  
  182.     public void addEmailContact(String date, String email){
  183.         Contact[] tmp = new Contact[contactsNumber+1];
  184.         for (int i=0; i<contactsNumber; i++){
  185.             tmp[i] = contacts[i];
  186.         }
  187.         tmp[contactsNumber++] = new EmailContact(date,email);
  188.         contacts = tmp;
  189.         emailContacts++;
  190.     }
  191.  
  192.     public void addPhoneContact(String date, String phone){
  193.         Contact[] tmp = new Contact[contactsNumber + 1];
  194.         for (int i=0; i<contactsNumber; i++){
  195.             tmp[i] = contacts[i];
  196.         }
  197.         tmp[contactsNumber++] = new PhoneContact(date,phone);
  198.         contacts = tmp;
  199.         phoneContacts++;
  200.     }
  201.  
  202.     public Contact[] getEmailContacts(){
  203.         Contact[] tmp = new EmailContact[emailContacts];
  204.         int counter = 0;
  205.         for (Contact c:contacts) {
  206.             if (c.getType().equals("Email")){
  207.                 tmp[counter++] = c;
  208.             }
  209.         }
  210.         return tmp;
  211.     }
  212.  
  213.     public Contact[] getPhoneContacts(){
  214.         Contact[] tmp = new PhoneContact[phoneContacts];
  215.         int counter = 0;
  216.         for (Contact c:contacts) {
  217.             if (c.getType().equals("Phone")){
  218.                 tmp[counter++] = c;
  219.             }
  220.         }
  221.         return tmp;
  222.     }
  223.  
  224.     public Contact getLatestContact(){
  225.         int newestIndex = 0;
  226.         for (int i=1; i<contactsNumber; i++){
  227.             if (contacts[i].isNewerThan(contacts[newestIndex])){
  228.                 newestIndex = i;
  229.             }
  230.         }
  231.         return contacts[newestIndex];
  232.     }
  233.  
  234.     public String getFullName() {
  235.         return (firstName + " " + lastName).toUpperCase();
  236.     }
  237.  
  238.     public String getCity() {
  239.         return city;
  240.     }
  241.  
  242.     public long getIndex() {
  243.         return index;
  244.     }
  245.  
  246.     @Override
  247.     public String toString() {
  248.         //JSON reprezentacija
  249.  
  250.         StringBuilder sb = new StringBuilder();
  251.         sb.append("{\"ime\":\"").append(firstName).append("\", \"prezime\":\"").append(lastName);
  252.         sb.append("\", \"vozrast\":").append(age).append(", \"grad\":\"").append(city);
  253.         sb.append("\", \"indeks\":").append(index).append(", \"telefonskiKontakti\":[");
  254.        
  255.         PhoneContact[] pc = (PhoneContact[]) getPhoneContacts();
  256.         for (int i=0; i<phoneContacts-1; i++){
  257.             sb.append("\"").append(pc[i].getPhone()).append("\", ");
  258.         }
  259.         if (phoneContacts>0)
  260.             sb.append("\"").append(pc[phoneContacts-1].getPhone()).append("\"");
  261.         sb.append("], ");
  262.  
  263.         sb.append("\"emailKontakti\":[");
  264.         EmailContact[] ec = (EmailContact[]) getEmailContacts();
  265.         for (int i=0; i<emailContacts-1; i++){
  266.             sb.append("\"").append(ec[i].getEmail()).append("\", ");
  267.         }
  268.         if (emailContacts>0)
  269.             sb.append("\"").append(ec[emailContacts-1].getEmail()).append("\"");
  270.         sb.append("]}");
  271.        
  272.         return sb.toString();
  273.     }
  274.  
  275.     public int getContactsNumber() {
  276.         return contactsNumber;
  277.     }
  278.  
  279. }
  280.  
  281. class Faculty {
  282.  
  283.     private String name;
  284.     private Student[] students;
  285.  
  286.     public Faculty(String name, Student[] students) {
  287.         this.name = name;
  288.         this.students = students;
  289.     }
  290.  
  291.     public int countStudentsFromCity(String cityName){
  292.         int count = 0;
  293.         for (Student s:students) {
  294.             if (cityName.equals(s.getCity()))
  295.                 count++;
  296.         }
  297.         return count;
  298.     }
  299.  
  300.     public Student getStudent(long index){
  301.         int ind = -1;
  302.         for (int i=0; i<students.length; i++){
  303.             if (students[i].getIndex() == index){
  304.                 ind = i;
  305.                 break;
  306.             }
  307.         }
  308.         return students[ind];
  309.     }
  310.  
  311.     public double getAverageNumberOfContacts(){
  312.         double sum = 0;
  313.         for (Student s:students) {
  314.             sum += s.getContactsNumber();
  315.         }
  316.         return sum/students.length;
  317.     }
  318.  
  319.     public Student getStudentWithMostContacts(){
  320.         int maxIndex = 0;
  321.         int maxContactsNumber = students[0].contacts.length;
  322.         for (int i=1; i<students.length; i++){
  323.             if (students[i].contacts.length > maxContactsNumber){
  324.                 maxContactsNumber = students[i].contacts.length;
  325.                 maxIndex = i;
  326.             }
  327.             else if (students[i].contacts.length == maxContactsNumber){
  328.                 if (students[i].getIndex() > students[maxIndex].getIndex()){
  329.                     maxContactsNumber = students[i].contacts.length;
  330.                     maxIndex = i;
  331.                 }
  332.             }
  333.         }
  334.         return  students[maxIndex];
  335.     }
  336.  
  337.     @Override
  338.     public String toString() {
  339.         //JSON reprezentacija
  340.  
  341.         StringBuilder sb = new StringBuilder();
  342.         sb.append("{\"fakultet\":\"").append(name).append("\", \"studenti\":[");
  343.         for (int i=0; i<students.length-1; i++) {
  344.             sb.append(students[i].toString()).append(", ");
  345.         }
  346.         sb.append(students[students.length-1].toString()).append("]}");
  347.         return sb.toString();
  348.     }
  349. }
  350.  
  351. public class ContactsTester {
  352.  
  353.     public static void main(String[] args) {
  354.         Scanner scanner = new Scanner(System.in);
  355.  
  356.         int tests = scanner.nextInt();
  357.         Faculty faculty = null;
  358.  
  359.         int rvalue = 0;
  360.         long rindex = -1;
  361.  
  362.         DecimalFormat df = new DecimalFormat("0.00");
  363.  
  364.         for (int t = 0; t < tests; t++) {
  365.  
  366.             rvalue++;
  367.             String operation = scanner.next();
  368.  
  369.             switch (operation) {
  370.             case "CREATE_FACULTY": {
  371.                 String name = scanner.nextLine().trim();
  372.                 int N = scanner.nextInt();
  373.  
  374.                 Student[] students = new Student[N];
  375.  
  376.                 for (int i = 0; i < N; i++) {
  377.                     rvalue++;
  378.  
  379.                     String firstName = scanner.next();
  380.                     String lastName = scanner.next();
  381.                     String city = scanner.next();
  382.                     int age = scanner.nextInt();
  383.                     long index = scanner.nextLong();
  384.  
  385.                     if ((rindex == -1) || (rvalue % 13 == 0))
  386.                         rindex = index;
  387.  
  388.                     Student student = new Student(firstName, lastName, city,
  389.                             age, index);
  390.                     students[i] = student;
  391.                 }
  392.  
  393.                 faculty = new Faculty(name, students);
  394.                 break;
  395.             }
  396.  
  397.             case "ADD_EMAIL_CONTACT": {
  398.                 long index = scanner.nextInt();
  399.                 String date = scanner.next();
  400.                 String email = scanner.next();
  401.  
  402.                 rvalue++;
  403.  
  404.                 if ((rindex == -1) || (rvalue % 3 == 0))
  405.                     rindex = index;
  406.  
  407.                 faculty.getStudent(index).addEmailContact(date, email);
  408.                 break;
  409.             }
  410.  
  411.             case "ADD_PHONE_CONTACT": {
  412.                 long index = scanner.nextInt();
  413.                 String date = scanner.next();
  414.                 String phone = scanner.next();
  415.  
  416.                 rvalue++;
  417.  
  418.                 if ((rindex == -1) || (rvalue % 3 == 0))
  419.                     rindex = index;
  420.  
  421.                 faculty.getStudent(index).addPhoneContact(date, phone);
  422.                 break;
  423.             }
  424.  
  425.             case "CHECK_SIMPLE": {
  426.                 System.out.println("Average number of contacts: "
  427.                         + df.format(faculty.getAverageNumberOfContacts()));
  428.  
  429.                 rvalue++;
  430.  
  431.                 String city = faculty.getStudent(rindex).getCity();
  432.                 System.out.println("Number of students from " + city + ": "
  433.                         + faculty.countStudentsFromCity(city));
  434.  
  435.                 break;
  436.             }
  437.  
  438.             case "CHECK_DATES": {
  439.  
  440.                 rvalue++;
  441.  
  442.                 System.out.print("Latest contact: ");
  443.                 Contact latestContact = faculty.getStudent(rindex)
  444.                         .getLatestContact();
  445.                 if (latestContact.getType().equals("Email"))
  446.                     System.out.println(((EmailContact) latestContact)
  447.                             .getEmail());
  448.                 if (latestContact.getType().equals("Phone"))
  449.                     System.out.println(((PhoneContact) latestContact)
  450.                             .getPhone()
  451.                             + " ("
  452.                             + ((PhoneContact) latestContact).getOperator()
  453.                                     .toString() + ")");
  454.  
  455.                 if (faculty.getStudent(rindex).getEmailContacts().length > 0
  456.                         && faculty.getStudent(rindex).getPhoneContacts().length > 0) {
  457.                     System.out.print("Number of email and phone contacts: ");
  458.                     System.out
  459.                             .println(faculty.getStudent(rindex)
  460.                                     .getEmailContacts().length
  461.                                     + " "
  462.                                     + faculty.getStudent(rindex)
  463.                                             .getPhoneContacts().length);
  464.  
  465.                     System.out.print("Comparing dates: ");
  466.                     int posEmail = rvalue
  467.                             % faculty.getStudent(rindex).getEmailContacts().length;
  468.                     int posPhone = rvalue
  469.                             % faculty.getStudent(rindex).getPhoneContacts().length;
  470.  
  471.                     System.out.println(faculty.getStudent(rindex)
  472.                             .getEmailContacts()[posEmail].isNewerThan(faculty
  473.                             .getStudent(rindex).getPhoneContacts()[posPhone]));
  474.                 }
  475.  
  476.                 break;
  477.             }
  478.  
  479.             case "PRINT_FACULTY_METHODS": {
  480.                 System.out.println("Faculty: " + faculty.toString());
  481.                 System.out.println("Student with most contacts: "
  482.                         + faculty.getStudentWithMostContacts().toString());
  483.                 break;
  484.             }
  485.  
  486.             }
  487.  
  488.         }
  489.  
  490.         scanner.close();
  491.     }
  492. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement