Advertisement
SashkoKlincharov

[Java][НП] - Контакти

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