Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Expand
titleDel 2 - Course- og Exam-klassene (30%)

Course-klassen tilsvarer et undervist emne i et bestemt semester. Kurskoden (code) oppgis ved opprettelsen av Course-objekter, mens studiepoeng (credits) og semesteret (time) kan settes senere. 

Oppgave a)

Deklarer felt for time-egenskapen, og skriv kode for getYear, getSemester, getTime og setTime (se vedlegg 3). Med tanke på del 4, så kan det være lurt å lage en metode som sjekker formatet til setTime sitt time-argument, som kan brukes i andre klasser.

Expand
titleLF

Her velger vi å lagre året og semesteret separat, og la getTime og setTime gi en illusjon om et time-felt. checkTime-metoden er laget for også å bli brukt ved innlesing av time-data.

Code Block
private int year;
private char semester; // F(all) eller S(pring)

public int getYear() {
   return year;
}

public char getSemester() {
   return semester;
}


public String getTime() {
   return String.valueOf(getSemester()) + year;
}

public static void checkTime(String time) throws IllegalArgumentException {
   char c0 = Character.toUpperCase(time.charAt(0));
   if (c0 != 'S' && c0 != 'F') {
      throw new IllegalArgumentException("Semester must be either F(all) or S(pring)");
   }
   Integer.valueOf(time.substring(1));
}

public void setTime(String time) {
   checkTime(time);
   int year = Integer.valueOf(time.substring(1));
   if (year < 100) {
      year = (year < 50 ? 2000 : 1900) + year;
   }
   this.semester = Character.toUpperCase(time.charAt(0));
   this.year = year;
}

Oppgave b)

Course-objekter skal kunne sorteres kronologisk på semesteret de undervises. Forklar hvilke endringer som må gjøres på Course-klassen for å kunne bruke Java sin standard mekanisme for sortering, og skriv den nødvendige koden.

Expand
titleLF

Dersom Course-klassen implementerer Comparable, dvs. sammenligning med et annet Course-objekt, så kan Collections.sort- og List.sort-metodene brukes til sortering av Course-objekter.

Code Block
public class Course implements Comparable<Course> {
   // Compares based on the time given, earlier means smaller.
   @Override
   public int compareTo(Course other) {
      if (year != other.year) {
         return year - other.year;
      }
      return (other.semester - semester);
   }
}

Exam-klassen tilsvarer en avlagt eksamen for et undervist emne. Både emnet (course) og karakteren (grade) oppgis ved opprettelse av Exam-objekter.

Oppgave c)

Deklarer felt for course- og grade-egenskapene, og skriv konstruktøren og isPass-metoden (se vedlegg 3).

Expand
titleLF
Code Block
private final Course course;
private char grade;


public Exam(Course course, char grade) {
   this.course = course;
   grade = Character.toUpperCase(grade);
   if ("ABCDEF".indexOf(grade) < 0) {
      throw new IllegalArgumentException("Result must be one of the characters A-F");
   }
   this.grade = grade;
}

public boolean isPass() {
   return grade != 'F';
}

 


Oppgave d)

Exam-objekter skal også kunne sorteres, men på to måter! Standard-sorteringen skal være kronologisk på semesteret kurset ble undervist, men Exam-objektene skal også kunne sorteres på karakter. Forklar hvordan begge sorteringene kan støttes og skriv nødvendig kode.

Expand
titleLF

I tillegg til Comparable, som bygger sorteringsrekkefølgen inn i klassen selv, så kan en implementere en Comparator<Exam>, som er en annen klasse som sammenligne to Exam-objekter:

Code Block
public class Exam implements Comparable<Exam> {


   @Override
   public int compareTo(Exam other) {
      return course.compareTo(other.getCourse());
   }
}

public class ExamComparator implements Comparator<Exam> {


   @Override
   public int compare(Exam exam1, Exam exam2) {
      return exam1.getGrade() - exam2.getGrade();
   }
}

Se også wiki-side om Sortering med Comparable og Comparator

Expand
titleDel 3 - Person-klassen (20%)

Person-klassen er knyttet til Course- og Exam-klassene, og tanken er at Course-objekter legges til når en person melder seg opp og Exam-objekter legges til når eksamen er avlagt. En skal bare kunne ta eksamen i kurs en har meldt seg opp i!  

Oppgave a)

Skriv kode for name-egenskapen, gitt at den bare skal kunne settes ved opprettelse av Person-objekter. 

Expand
titleLF
Code Block
private final String name;
 
public Person(String name) {
   this.name = name;
}


public String getName() {
   return name;
}

Oppgave b)

Deklarer felt for courses-egenskapen, og begrunn valg av type. Skriv kode for addCourse og hasCourse (se vedlegg 3).

Expand
titleLF

Typen bør være et grensesnitt fra Collection-rammeverket, enten Collection eller List, som er spesialisert til element-typen Course. Her brukes Collection, fordi en ikke trenger andre metoder enn den deklarerer.

Code Block
private Collection<Course> courses = new ArrayList<Course>();
      
public boolean addCourse(Course course) {
   for (Course existing : courses) {
      if (course.getCode().equals(existing.getCode()) && course.getTime().equals(existing.getTime())) {
         return false;
      }
   }
   courses.add(course);
   return true;
}
      
public boolean hasCourse(String code) {
   for (Course course : courses) {
      if (code.equals(course.getCode())) {
         return true;
      }
   }
   return false;
}
Oppgave c)

Deklarer felt for exams-egenskapen, og begrunn valg av type. Skriv kode for addExam, getLastExam og hasPassed (se vedlegg 3).

Expand
titleLF

Samme begrunnelse for typen som over.

Code Block
private Collection<Exam> exams = new ArrayList<Exam>();
 
public Exam addExam(Course course, char grade) {
   if (courses.contains(course)) {
      for (Exam exam : exams) {
         if (exam.getCourse() == course && exam.isPass()) {
            return null;
         }
      }
      Exam exam = new Exam(course, grade);
      exams.add(exam);
      return exam;
   }
   return null;
}
 
public Exam getLastExam(String code) {
   Exam lastExam = null;
   for (Exam exam : exams) {
      if (code.equals(exam.getCourse().getCode())) {
         lastExam = exam;
      }
   }
   return lastExam;
}
 
public boolean hasPassed(String code) {
   Exam exam = getLastExam(code);
   return exam != null && exam.isPass();
}
Oppgave d)

Skriv kode for countCredits-metoden i Person-klassen. Hust at en ikke får studiepoeng for kurs uten å ha tatt og bestått eksamen, og at det er siste karakter som teller!

Expand
titleLF
Code Block
public double countCredits() {
   // first collect all course codes
   Collection<String> codes = new ArrayList<String>();
   for (Exam exam : exams) {
      String code = exam.getCourse().getCode();
      if (! codes.contains(code)) {
         codes.add(code);
      }
   }
   // check last exam result for each course code and add credit if passed
   double sum = 0;
   for (String code : codes) {
      Exam exam = getLastExam(code);
      if (exam.isPass()) {
         sum += exam.getCourse().getCredits();
      }
   }
   return sum;
}

...