* Примерна задача 2

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

1. Да се създаде клас „точка“ с член променливи „координати по осите x и y“. Създайте необходимите конструктори и get методи. Защитете координатите така, че да не могат да бъдат променяни след като бъдат инициализирани. Създайте метод отпечатващ координатите на точката. Създайте статичен метод, който сравнява координатите на две точки и показва дали те съвпадат:

class Point{
  final private double x;
  final private double y;
  public Point(){
    this.x = 0;
    this.y = 0;
  }
  public Point(double x, double y){
    this.x = x;
    this.y = y;
  }
  public double getX(){
    return this.x;
  }
  public double getY(){
    return this.y;
  }
  public String show(){
    return ("("+this.x+", "+this.y+")");
  }
  public static boolean equals(Point x, Point y){
    if( (x.getX()==y.getX()) && (x.getY() == y.getY()) ) return true;
    else return false;
  }
}

2. Да се създаде клас „множество” съдържащ списък от точки. Създайте член-методи за добавяне на точка към множеството, добавяне на множество точки към множеството, изтриване на точка от множеството и за отпечатване на екрана точките от множеството. Създайте необходимите изключения (в едно множество НЕ може да има дублиращи се точки; НЕ можем да изтрием точка, която не съществува в множеството). Създайте метод за отпечатване на координатите на множеството точки. Създайте статични методи за обединение, сечение и разлика на подадени две множества:

class AddPointException extends Exception{
  public AddPointException(Point x){
    super("The point "+x.show()+" is already in the set");
  }
  public AddPointException(String msg){
    super(msg);
  }
  public String toString(){
    return "The point is already in the set";
  }
}

class PointDoesNotExistsException extends Exception{
  public PointDoesNotExistsException(Point x){
    super("The point "+x.show()+" does not exists");
  }
  public PointDoesNotExistsException(String msg){
    super(msg);
  }
  public String toString(){
    return "The point does not exists";
  }
}

class Set{
  java.util.LinkedList<Point> list;
  public Set(){
    this.list = new java.util.LinkedList<Point>();
  }
  public boolean inSet(Point x){
    java.util.Iterator it = this.list.iterator();
    while(it.hasNext()){
      if(Point.equals((Point)it.next(), x)) return true;
    }
    return false;
  }
  public java.util.LinkedList<Point> getList(){
    return this.list;
  }
  public void addPoint(Point x) throws AddPointException{
    if(this.inSet(x)) throw new AddPointException(x);
    else this.list.addLast(x);
  }
  public void removePoint(Point x) throws PointDoesNotExistsException{
    boolean removed = false;
    for (int i=0; i<this.list.size(); i++){
      if (Point.equals(this.list.get(i),x)){
        this.list.remove(i);
        removed = true;
        break;
      }
    }
    if (!removed) throw new PointDoesNotExistsException(x);
  }
  public void print(){
    for (int i=0; i<this.list.size(); i++){
      System.out.println(""+(i+1)+". "+this.list.get(i).show());
    }
  }
  public void addSet(Set newlist){
    for(int i=0; i<newlist.getList().size(); i++){
      try{
        this.addPoint((Point)newlist.getList().get(i));
      }
      catch(AddPointException e){}
    }
  }
  public static Set union(Set x, Set y){
    Set result = new Set();
    result.addSet(x);
    result.addSet(y);
    return result;
  }
  public static Set intersect(Set x, Set y){
    Set result = new Set();
    firstset: for (int i=0; i<x.getList().size(); i++){
      for (int j=0; j<y.getList().size(); j++){
        if(Point.equals(x.getList().get(i),y.getList().get(j))){
          try{
            result.addPoint(x.getList().get(i));
            continue firstset;
          }
          catch (AddPointException e){
            System.err.println("Some bad logic error has occured???");
          }
        }
      }
    }
    return result;
  }
  public static Set complement(Set x, Set y){
    Set result = new Set();
    for (int i=0; i<x.getList().size(); i++){
      boolean found = false;
      for (int j=0; j<y.getList().size(); j++){
        if(Point.equals(x.getList().get(i),y.getList().get(j))){
          found = true;
          break;
        }
      }
      if (!found){
        try{
          result.addPoint(x.getList().get(i));
        }
        catch (AddPointException e){
          System.err.println("Some bad logic error has occured???");
        }
      }
    }
    return result;
  }
}

3. Демонстрирайте функционалността на създадените класове, чрез написване на главна програма с main метод:

public class mainprogram{
  public static void main(String[] args){
    Set points = new Set();
    // adding three points
    try{
      points.addPoint(new Point(2,3));
      points.addPoint(new Point(5,6));
      points.addPoint(new Point(-5,-6));
      System.out.println("Three points added successfully");
    }
    catch (AddPointException e){
      System.out.println(e.getMessage());
    }

    // Trying to add duplicate point
    try{
      points.addPoint(new Point(2,3));
      System.out.println("Another point added successfully");
    }
    catch (AddPointException e){
      System.out.println(e.getMessage());
    }

    // Removing point
    try{
      points.removePoint(new Point(5,6));
      System.out.println("Point (5,6) removed");
    }
    catch (PointDoesNotExistsException e){
      System.out.println(e.getMessage());
    }
    // Trying to remove non existing point
    try{
      points.removePoint(new Point(12,23));
      System.out.println("Point (12,23) removed");
    }
    catch (PointDoesNotExistsException e){
      System.out.println(e.getMessage());
    }

    // Otpechatvane na sashtestvuvashtite tochki v mnojestvoto
    System.out.println("\nFirst set points:");
    points.print();
    System.out.println();

    // Sazdavane na vtoro mnojestvo ot tri tochki
    Set points2 = new Set();
    try{
      points2.addPoint(new Point(2,3));
      points2.addPoint(new Point(-9,-9));
      points2.addPoint(new Point());
    }
    catch (AddPointException e){
      System.out.println(e.getMessage());
    }
    System.out.println("Second set points:");
    points2.print();
    System.out.println();

    // Obediniavane na mnojestvata
    System.out.println("Union:");
    Set up1p2 = Set.union(points, points2);
    up1p2.print();

    // Sechenie na mnojestvata
    System.out.println("\nIntersection:");
    Set ip1p2 = Set.intersect(points, points2);
    ip1p2.print();

    // Izvajdane na mnojestva
    System.out.println("\nComplement");
    Set cp1p2 = Set.complement(points, points2);
    cp1p2.print();
  }
}



8 коментара за “Примерна задача 2”

 
  1. Яна:

    public java.util.LinkedList getList(){
    return this.list;
    }

    За това получаваш 6+ по defensive programming !

    Липсата на модификатори за достъп е най-дорбрата практика, трябва да напишеш статия за това.

    На нито един public метод не проверяваш за валидност на параметрите, което пак е доста зле.

    PS
    Предполагам няма да оставиш този коментар, което ще затвърди мнението ми за аситентите в ТУ пък и не само за тях.

    Поздрави,
    Яна

     
  2. Яна:

    public static boolean equals(Point x, Point y){
    if( (x.getX()==y.getX()) && (x.getY() == y.getY()) ) return true;
    else return false;
    }

    Е този метод ме разби !!

    Въпрос: За какво е сложен метода equals в Object ?

    Отговор: За да не пишеш методи като по-горния.

    Поздрави,
    Яна

     
  3. Филип Петров:

    Здравей Яна,

    Изречението започващо с „предполагам няма да оставиш този коментар“ явно беше сложено, за да пусна този коментар. Е успя въпреки, че досега нито един коментар не съм спирал освен руски спам.

    Към първият ти коментар – курсът, който се води няма никакво отношение по сигурно програмиране и защита на данните. Модификаторите на достъп само се споменават, но не са в конкретиката на учебната програма. Тук се изучават основите на програмирането на Java. Учениците за първи път се сблъскват с обекти, конструктори, get и set методи. Извинявай ако примерите са банални, неработещи и лоши за теб. Да, нивото е прекалено ниско и въпреки, че това е очаквано и нормално – все пак се извинявам.

    Колкото до вторият ти коментар – тук не съм съгласен с теб. Аз лично силно насърчавам всички студенти да знаят как се правят нещата, а не да използват готови „магически“ методи. Във всяко упражнение съм го натяквал. Трябва да знаем как да направим нещата сами. Това е целта на обучението все пак. Иначе ще си отваряме готови диалогови прозорци и ще си правим програми без да знаем как да програмираме. В този ред на мисли мога да погледна всеки твой професионален код и да кажа: „хаха, ама ти защо не използваш методът „automagicallyDoWhateverYanaIsDoing()“.

    Иначе да, благодаря за критиката – асистент съм, в ТУ съм, сигурно не струвам. За това можеш да се оплачеш на моите шефове. Предлагам ти един ден да дойдеш и да ме замениш като по-добра и по-можеща.

     
  4. Яна:

    Здравей Филип,

    Извинявам се за P.S. секцията в първия пост, мнението ми за ТУ – София туко що се повиши.

    Имам няколко малки въпроса:

    „Модификаторите на достъп само се споменават, но не са в конкретиката на учебната програма. Тук се изучават основите на програмирането на Java.“

    Не са ли модификаторите за достъп в основaта на ООП програмирането а от там и в основата на програнето на Java?

     
  5. Яна:

    Съжелявам за двойния пост…

    Относно equals въобще не е магичен. Има неписано правило, което спазват програмистите, никой пишещ на java няма да използва за сравнение на два обекта, който не са масиви, статичен метод equals, когато в самото ядро на езика е заложен друг подход. http://java.sun.com/docs/books/tutorial/java/IandI/objectclass.html

    Относно оплаквания към вас, за мое щастие нямам зимане даване с вашия университет, но вече придобих идея че нито студентите искат нещо да научат нито преподавателите искат нещо да преподават. Неприемливо е цял семестър нищо да не правиш и след това да изпадаш в пинка когато наближи изпита (или др форма на контрол). Неприелмливо и цял семстър нищо да не изискваш, да няма дори елемнтарна курсова задача или истниски проект по който ако имаш желания де се включиш. За специалности като КТС, за които това е основното с което ще се занимаваш програмирането поне за 2 – ри курс (не съм сигурна дали тогава се учи Java) e твърде недостатъчно.

    Поздрави,
    Яна

     
  6. Филип Петров:

    Здравей Яна,

    Модификаторите за достъп са нещо изключително важно, но аз смятам, че не са в основите на обучението по ООП (иначе да – те са в основите на ООП). Смятам, че първо трябва да се изгради основата (да се усетят обектите и техните възможности) и чак тогава да се посочат проблемите в сигурността. За прост пример – как ще убедиш някой, че му трябва аларма за автомобил, ако той все още няма автомобил?

    Студентите в КСТ следват по следната програма:

    1 курс: процедурно програмиране на С
    2 курс 1 семестър: начални стъпки в обектно-ориентираното програмиране (на Java)
    2 курс 2 семестър: синтез и анализ на алгоритми и бази данни
    3 курс 1 семестър: обектно ориентирано програмиране на C++ (където нещата се изучават в доста по-дълбоки детайли)
    3 курс 2 семестър: визуални приложения на .Net
    и т.н. (в четвърти курс програмата по информатика е по-интензивна за сметка на „техническите“ предмети)…

    Курсът по „методи за програмиране на сигурен код“ се изучават чак в края на бакалавърската програма в 4 курс 2 семестър. Честно казано аз смятам, че и така трябва да бъде.

    Има голяма разлика между „програмистите“ в ТУ и тези в СУ или НБУ. Тук в началото на програмата се заляга на много повече предмети, които ги няма в другите университети (техническата насоченост, като електротехника, сапромат и т.н.).

    Аз съм учил в СУ и знам, че там програмата по информатика е много по-интензивна (1 курс 1 семестър С и 1 курс 2 семестър обектно ориентирано програмиране на C++). За сметка на това студентите там нямат базата на много от предметите, които се изучават в ТУ. Именно затова университетите са различни. Знанията за възможностите на приложението на програмирането не са по-маловажни от самите умения по програмиране.

    Относно методът „equals“ – в конкретния случай съм съгласен с теб. Аз обаче нарочно желая да накарам студентите да правят тези елементарни дейности сами. Така аз ги карам сами да си пишат методите за превръщане от малки в главни букви, за повдигане на число на степен, за намиране на абсолютна стойност и т.н. Чак след като са решили проблема сами може да дойде готовото решение. Например смятам, че децата първо трябва да се научат да смятат и чак след това да получат калкулатор. В противен случай изчезва критичното мислене. Изпитваме страх към търсенето на решение на въпроса „а може ли колелото да не е кръгло?“…

    Много думи за прост метод. Да, признавам си – използването на Object.equals щеше да е много по-добре…

     
  7. Цветан:

    Аз не знам Яна с какво се занимава и на кой университет в България е почитател, но е немислимо, да има претенции за знания, при положение, че не знае как се изписват елементарни думи като „съжалявам“.

     
  8. Филип Петров:

    @Цветан – Мисля, че подобни заяждания са безсмислени. Споровете кой университет е „по-по-най“ се провеждат на олимпиади и научни конференции, а не в блогове :)

    Иначе никой програмист няма да пише наготово метод за сравняване за азбучна подредба на два символни низа – има си готов за това. Да, но това не значи, че те не трябва да знаят как се прави. В този ред на мисли аз винаги съм бил привърженик в учебната зала винаги сами да си пишем всичко. После, когато се правят сериозни програми – тогава готовата функционалност е добре дошла…

     

Trackback URI | RSS за коментарите

Пусни коментар