C, PHP, VB, .NET

Дневникът на Филип Петров


* Задача от контролно 1, вариант 2, 22 ноември 2014 г.

Публикувано на 22 ноември 2014 в раздел ПИК3 Java.

Задача 1. Създайте клас за филми (Movie) с член променливи име (name – тип String), времетраене в секунди (length – int) и трейлър (trailer – FileInputStream). Минималният брой на секундите в един филм трябва да e 3600. Създайте само един конструктор – с подадени параметри.

Задача 2. В клас Movie добавете следните методи:

a) static boolean equalTrailers(FileInputStream movie1, FileInputStream movie2) – методът трябва да сравни двата файла байт по байт и да върне true ако двата подадени трейлъра са с еднакво съдържание или false ако са различни;

b) static int compareMovieLenghts(Movie m1, Movie m2) – връща -1 ако m1 е с по-голяма продължителност от m2, 0 ако са равни по продължителност или 1 ако m2 е по-дълъг от m1.

c) Int compareWith(Movie m) – сравнява текущия обект (филм) с друг подаден като параметър на същия принцип, както е сравнение в подточка b)

Задача 3. Напишете клас LongMovie, който наследява Movie и добавя изискването времетраенето на филма да е минимум 10800 секунди.

Задача 4. Напишете клас с main метод, в който извършете следните действия:

a) Използвайки полиморфизъм създайте масив от 3 елемента, в който добавете два Movie и един LongMovie;

b) Проверете дали измежду въведените филми има такива, които да са с дублиращи се трейлъри – изведете имената на повтарящите се филми по двойки в конзолата (не забравяйте, че е възможно един филм да се повтаря повече от веднъж – тогава трябва да изведете всички комбинации от повторения). Задължително е да се реализира чрез цикъл/и обхождащ/и масива;

c) Изведете имената на филмите подредени по следния принцип:
a. Филмите с по-дълго времетраене, трябва да излезнат по-напред в списъка;
b. Тези с равно времетраене ги подредете по азбучен ред

Решение: Изтеглете като сорс код (или четете по-надолу):

import java.io.*;
import java.util.*;

public class Kontrolno1{
  public static void main(String[] args){
    Movie[] list = new Movie[3];
    try{
      list[0] = new Movie("ZZZ 1", 15000, new FileInputStream("ZAD1.docx"));
      list[1] = new LongMovie("Test 2", 5000, new FileInputStream("ZAD2.docx"));
      list[2] = new Movie("Test 3", 5000, new FileInputStream("ZAD3.docx"));
    }
    catch(Exception e){
      System.err.println(e.getMessage());
    }
    
    for(int i=0; i<list.length; i++){
      for(int j=i+1; j<list.length; j++){
        try{
          if(Movie.equalTrailers(list[i].trailer, list[j].trailer)){
            System.out.println(list[i].name +" and "+list[j].name+ " are equal");
          }
        }
        catch(IOException e){
          System.err.println(e.getMessage());
        }
      }
    }
    
    Comparator<Movie> cmp = new Comparator<Movie>(){ 
      public int compare(Movie m1, Movie m2) {
        // да връща <0 ако m1 е преди m2, 0 ако са еднакви и >0 ако m2 е преди m1
        int lengthsComparison = Movie.compareMovieLengths(m1, m2);
        if(lengthsComparison!=0) return lengthsComparison;
        else return m1.name.compareTo(m2.name);
      }
    };
    Arrays.sort(list, cmp);
    
    for(Movie m: list){
      System.out.println(m.name);
    }
    
  }
}

class Movie{
  String name;
  private int length;
  FileInputStream trailer;
  
  public Movie(String name, int length, FileInputStream trailer) throws Exception{
    this.name = name;
    this.setLength(length);
    this.trailer = trailer;
  }
  
  int getLength(){
    return this.length;
  }
  
  void setLength(int length) throws Exception{
    if(length<3600) throw new Exception("Movie is too short");
    else this.length = length;
  }
  
  static boolean equalTrailers(FileInputStream m1, FileInputStream m2) throws IOException{
    if(m1.equals(m2)) return true;
    BufferedInputStream input1 = new BufferedInputStream(m1);
    BufferedInputStream input2 = new BufferedInputStream(m2);
    int ch1=-1, ch2=-1;
    while ((ch1 = input1.read())!=-1){
      ch2 = input2.read();
      if (ch1 != ch2){
         try{
            if(input1 != null) input1.close();
            if(input2 != null) input2.close();
         }
         catch(IOException e){}
         return false;
    }
    try{
       if(input1 != null) input1.close();
       if(input2 != null) input2.close();
    }
    catch(IOException e){}
    return true;
  }
  
  static int compareMovieLengths(Movie m1, Movie m2){
    if(m1.getLength() > m2.getLength()) return -1;
    if(m1.getLength() < m2.getLength()) return 1;
    return 0;
  }
  
  int compareWith(Movie m){
    return Movie.compareMovieLengths(this, m);
  }
}

class LongMovie extends Movie{
  
  public LongMovie(String name, int length, FileInputStream trailer) throws Exception{
    super(name, length, trailer);
    this.setLength(length);
  }
  
  void setLength(int length) throws Exception{
    if(length<10800 ) throw new Exception("This is not a long movie");
    else super.setLength(length);
  }
}

 



4 коментара


  1. Красимир каза:

    Не трябва ли единия от филмите да е обект от тип LongMovie, т.е.
    list[0] = new Movie(„ZZZ 1“, 15000, new FileInputStream(„ZAD1.docx“));

    да е
    list[0] = new LongMovie(„ZZZ 1“, 15000, new FileInputStream(„ZAD1.docx“));

  2. Да, трябва. Поправих го в примера.

  3. Радослав каза:

    for(int i=0; i<list.length; i++){
    for(int j=i+1; j<list.length; j++){
    …..

    първия цикъл не трябва ли да е до i<list.length-1 ?

  4. По-правилно е, но не прави никаква разлика. Просто е една празна итерация повече.

Добави коментар

Адресът на електронната поща няма да се публикува


*