Danmarks Tekniske Universitet DTU
02101   Indledende programmering
Efterår 2007

Rapportopgaven

Læg en studieplan


Problemstillingen

Til en DTU-studerende skal der udvikles et anvendelsesprogram som kan lægge en studieplan, der semester for semester viser de kurser man ønsker at følge. Brugeren fører en dialog med programmet via et terminal window, hvori brugeren indtaster ordrer til programmet, og programmet udskriver svar til brugeren. De kurser der kan indplaceres i en studieplan står i en kursusbase, hvis data stammer fra tre filer.
 

Eksempel på en dialog

Nedenfor vises et eksempel på en dialog. I har iøvrigt frie hænder til at udforme den dialog jeres program skal udføre, blot kravene til programmets funktionalitet er opfyldt.
    Velkommen til 'Læg en studieplan'
    Programmet kender følgende ordrer:
        hjælp  tilføj  fjern  udskrivbase  visplan ... afslut
    Indtast din ordre/data efter '-->' nedenfor
    --> tilføj 02101
    Angiv semesternummer
    --> 1
    Kursus 02101 er blevet tilføjet
    --> tilføj 01017
    Angiv semesternummer
    --> 1
    Kursus 01017 er blevet tilføjet
    --> tilføj 02101
    Angiv semesternummer
    --> 1
    *** Kursus 02101 kunne ikke tilføjes - er allerede i planen ***
    --> tilføj 02105
    Angiv semesternummer
    --> 1
    *** Kursus 02105 kunne ikke tilføjes - manglende forudsætningskurser ***
    --> visplan
    Semester    Mandag  Tirsdag   Onsdag  Torsdag   Fredag
 
    E   8-12     ---     02101     ---      ---      ---
       13-17     ---      ---      ---     01017     ---
    --> afslut
Spørgsmålet om forudsætningskurser behandles efterfølgende.

 

Krav til en studieplan

Placeringen af et kursus på en ugedag og i en tidsperiode på dagen (8-12 eller 13-17) er bestemt af en skemagruppe således:
                Mandag  Tirsdag   Onsdag  Torsdag   Fredag 
        8-12      1A       3A       5A       2B       4B
       13-17      2A       4A       5B       1B       3B
Kurserne 02101 og 01017 udbydes om efteråret (E) på første semester. Placeringen på ugedag og tidsperiode - jfr. underafsnittet Eksempel på en dialog - angives derfor i DTU kursusbasen som E3A henholdsvis E1B, altså med et foranstillet E.

For kurser på 2. semester (om foråret) angives kursernes placering i DTU kursusbasen med bogstavet F foran skemagruppen.

Et eksempel på en studieplan for de første to semestre kunne være:

    Semester    Mandag  Tirsdag   Onsdag  Torsdag   Fredag
 
    E   8-12     ---     02101    01005     ---     02121
       13-17     ---      ---     01005    01017    01005

    F   8-12     ---      ---     01005    02105    02405
       13-17    02161    02402    01005     ---     01005
Denne studieplan opfylder følgende krav: Tidligere, i afsnittet Eksempel på en dialog, forsøgte vi at placere kursus 02105 på 1. semester, men det accepterede programmet ikke, fordi 02105 har følgende to forudsætningskurser: 02101 og 01017.

 

Kursusbasen

For hvert kursus rummer kursusbasen oplysninger om kursets nummer, kursusnavnet, skemagruppeplaceringen og forudsætningskurserne. Disse data stammer som tidligere nævnt fra tre filer.

Nedenfor er som eksempel vist de tre filer svarende til netop kurserne i dén studieplan der blev vist i forrige afsnit - Krav til en studieplan:


Fil med kursusnavne

    01005 Matematik 1
    01017 Diskret matematik og databaser
    02101 Indledende programmering
    02105 Algoritmer og Datastrukturer I
    02121 Ingeniørarbejde
    02161 Software Engineering 1
    02402 Introduktion til statistik
    02405 Sandsynlighedsregning

Fil med skemagrupper

Her har vi forenklet modellen lidt, så kurser der udbydes både efterår og forår internt har fået suppleret deres kursusnummer med -e, henholdsvis -f:

    01005-e E5A E5B E3B 
    01005-f F5A F5B F3B
    01017   E1B
    02101   E3A
    02105   F2B
    02121   E4B
    02161   F2A
    02402-e E3A
    02402-f F4A
    02405-e E4B
    02405-f F4B

Fil med forudsætningskurser

Kurserne 02105 og 02161 har de anførte forudsætningskurser 01017 og 02101, henholdsvis 02101:

    02105 01017 02101
    02161 02101


 

Forenklinger af problemstillingen

For at I kan anvende kræfterne på det væsentlige har vi fjernet nogle detaljer omkring lægning af en studieplan og håndtering af kursusbasen:
  1. Studieplanen skal ikke omfatte kurser der udbydes i 3-ugersperioderne. Disse kurser er udeladt for at få en overskuelig semester-opdeling af en studieplan med 10 skemagrupper på hvert semester, uden indskud af 3-ugersperioder med i princippet kun "en skemagruppe".
  2. Nogle kurser, som fx 02105, har i DTU-kursusbasen blandt sine forudsætningskurser nogle der kan tages senest samtidig. Denne komplikation for lægning af en studieplan ser vi bort fra.
  3. For kurser der strækker sig over to semestre, som fx 01005, har vi valgt en semesteropdeling, så kursusbasen internt indeholder kurserne 01005-e og 01005-f. Brugeren må så tilføje kurset 01005 af to gange, nemlig som 01005-e og som 01005-f. Og når kurset ønskes fjernet/flyttet må brugeren også gøre dette af to gange.
  4. For kurser der som 02402 udbydes på to semestre har vi også internt valgt at supplere kursusnummeret med -e og -f. Herved forenkles søgningen i kursusbasen: Enten forekommer kurset netop én gang eller også findes det ikke i basen. Brugeren må så selv sørge for kun at placere kurset én gang i sin studieplan.
 

Opgaven

Med udgangspunkt i den givne problemstilling angives efterfølgende kravene til programmets funktionalitet, til de klasser der som minimum bør være og til afprøvningen.

Overordnet skal programmet først etablere kursusbasen med de kurser der kan indgå i en studieplan, dernæst kunne lægge en studieplan i dialog med brugeren af programmet, og til sidst kunne gemme den lagte studieplan i en fil.

Kursusbasen dannes ud fra tre filer nævnt i den givne problemstilling i underafsnittet Kursusbasen:

  1. En tekstfil navne.txt med én linie per kursus indholdende forrest kursusnummeret og derefter kursusnavnet.
    Brug eventuelt blot den i rapportopgaven givne fil.
    Bemærk: En udskrift af denne fil er nyttig at have når man skal benytte programmet.
  2. En tekstfil skemagrp.txt med én linie per kursus indholdende forrest kursusnummeret og derefter den (de) skemagrupper kurset beslaglægger i det semester hvori det udbydes. Brug eventuelt blot den i rapportopgaven givne fil.
  3. En tekstfil forud.txt med én linie per kursus indholdende forrest kursusnummeret og derefter kursusnumrene for de kurser der tidligere skal være taget for at det har mening at indplacere det aktuelle kursus i en skemaplan. Brug eventuelt blot den i rapportopgaven givne fil.
Underafsnittet Eksempel på en dialog ovenfor gav et fingerpeg om hvad studieplanlægningsprogrammet skal kunne, dets funktionalitet.

Vær opmærksom på, at eksemplet ikke skal følges slavisk. Fx kan I selv bestemme formatet for ordrerne, dvs. ordrens navn og om ordren skal have alle sine parametre med det samme, eller om programmets dialogdel skal bede om parametrene. Så for ordren tilføj kan I vælge mellem:

Dialogeksemplet viser også fejlmeldinger svarende til brud på de krav til en studieplan der er nævnt i underafsnittet Krav til en studieplan.

 

Programmets funktionalitet

I dette underafsnit angives den funktionalitet der forventes af en løsning fra en 2-personersgruppe:
  1. Kunne fortælle brugeren navnene på de ordrer programmet kender.
  2. Have en hjælpefacilitet der i terminalvinduet kan oplyse detaljer om ordrerne.
  3. Danne programmets kursusbase ud fra de tre filer som nævnt ovenfor.
  4. Kunne give en tekstrepræsentation af kursusbasen - toString().
  5. Vise i terminalvinduet den aktuelle studieplan som den ser ud her og nu.
  6. Kunne indsætte i studieplanen på et angivet semester et kursus der står i kursusbasen.
  7. Kunne fjerne et tidligere indsat kursus fra studieplanen.
  8. Afslutte programkørslen med mulighed for at man i en efterfølgende kørsel (program run) kan arbejde videre på en tidligere udarbejdet studieplan - benyt Object serialization.
  9. Kunne arbejde videre på en tidligere udarbejdet studieplan.
  10. Give fejlmeldinger når brugeren beder om noget der ikke kan lade sig gøre.
  11. Sørge for at en studieplan altid opfylder de krav der er stillet i underafsnittet Krav til en studieplan.


Programmets klasser

Jeres anvendelsesprogram skal indeholde de klasser I opfatter som nødvendige for at have en god løsning, hvilket betyder svag kobling (coupling) mellem klasserne og stærk (indre) sammenhæng (cohesion) i klasser og metoder.

Et godt udgangspunkt for at opnå dette er, at man gør sig klart:

  1. Hvilke klasser skal være ansvarlige for hvilke data ?
  2. Hvilke klasser skal være ansvarlige for at udføre hvilke opgaver ?
  3. Hvilke klasser skal uddelegere nogen af deres ansvarsområder til andre klasser?
Vi har valgt ikke at stille krav om at jeres løsning skal indeholde bestemte navngivne klasser. Men en god løsning kræver flere klasser end de, der næsten er oplagte. Et forslag baseret på de to første punkter ovenfor ville omfatte: Klasserne realiserer en Model-View-Control-løsning, hvor klasserne Studieplan og KursusBase udgør model-delen og klassen Dialog er view-delen, svarende til følgende klassediagram:



Diagrammet i figuren ovenfor er tænkt som inspiration til hvordan man kan opbygge sit program så der sikres svag kobling mellem klasserne. Klassediagrammet for jeres løsning bør indeholde flere klasser.


Afprøvning af programmet

Kørselsomgivelsen BlueJ understøtter automatiseret unit testing. Som udgangspunkt er det primære krav at der foretages en fuldstændig JUnit test af alle public metoder, med testdatavalg der omfatter såvel positiv som negativ test (jfr. lærebogens afsnit 6.3.2).

Testklasserne indføres samtidig med programklasserne og udbygges efterhånden som klasserne skrives.


 

Opgavebesvarelsen

Det udførte arbejde skal beskrives i en rapport med tilhørende Java-program, hvor kravene til indhold og form fremgår af

Om rapporten

Kriterierne for bedømmelsen af jeres rapport med tilhørende Java-program fremgår af

Bedømmelseskriterier

Oplysninger om tidsfrister for gruppedannelsen og for aflevering af rapporten fremgår af

Praktiske oplysninger



 

Reducerede krav til 1-personersgrupper

Opgaven skal løses som den er specificeret ovenfor i afsnittet Opgaven, men kun med disse funktionalitetskrav:
  1. Kunne fortælle brugeren navnene på de ordrer programmet kender.
  2.   udgår
  3. Danne programmets kursusbase ud fra de tre filer som nævnt ovenfor.
  4. Kunne give en tekstrepræsentation af kursusbasen - toString().
  5. Vise i terminalvinduet den aktuelle studieplan som den ser ud her og nu.
  6. Kunne indsætte i studieplanen på et angivet semester et kursus der står i kursusbasen. Dog uden at tage hensyn til forudsætningskurser.
  7. Kunne fjerne et tidligere indsat kursus fra studieplanen.
  8.   udgår
  9.   udgår
  10. Give fejlmeldinger når brugeren beder om noget der ikke kan lade sig gøre.
  11. Sørge for at en studieplan altid opfylder de to første krav der er stillet i underafsnittet Krav til en studieplan, nemlig:

 

Udvidede krav til 3-personersgrupper

Opgaven skal løses som den er specificeret ovenfor i afsnittet Opgaven, men med tilføjelse af mindst tre af nedenstående funktionalitetskrav:
  1. Ret i programmet så man kan lægge studieplaner med kurser der udbydes i 3-ugersperioderne januar og juni.
  2. Ved definitionen af skemagrupper for de enkelte kurser forenklede vi modellen ved at tilføje -e eller -f til kursusnummeret for at lette håndteringen af kurser over to semestre og af kurser der blev udbudt såvel forår som efterår. Foretag de nødvendige rettelser så skemagruppefiler kan se sådan ud:
        01005 E5A E5B E3B F5A F5B F3B 
        01017 E1B
        02101 E3A
        02105 F2B
        02121 E4B
        02161 F2A
        02402 E3A
        02402 F4A
        02405 E4B
        02405 F4B
    Hvis jeres program kan håndtere kurser i 3-ugersperioderne skal 02121 specificeres således.
        02121 E4B januar
  3. Håndtering af fejlmeldinger sker med så udstrakt brug af exceptions som muligt (helst udelukkende).
  4. Alle fejlmeldinger skal fortælle årsagen til at det gik galt. Fejlmeldingsteksterne i afsnittet Eksempel på en dialog angiver årsager, fx
        ... manglende forudsætningskurser
    Men det kan gøres endnu bedre:
        *** Kursus 02105 ej tilføjet - forudsætningskurset 01017 mangler ***
  5. Indfør en ordre, så man fra terminalvinduet kan indtaste et manglende kursus til kursusbasen.
  6. Indfør en ordre og en kursusfil så man kan få udvidet kursusbasen med de kurser der står i kursusfilen, hvori der er én linie pr. kursus, fx:

    02101;Indledende programmering;E3A;
    02161;Software Engineering 1;F2A;02101

  7. Indfør en ordre så man til sin studieplan kan tilføje en hel række af kurser på én gang i stedet for at skulle komme med ét kursus ad gangen.
  8. Indfør en ordre der i terminalvinduet kan udskrive alle de kurser fra kursusbasen som ligger i en bestemt skemagruppe.
  9. Indfør ordrer, så programmet kan håndtere flere studieplaner, enten for samme person, eller for flere personer. Dog naturligvis kun én studieplan ad gangen. Man skal i samme kørsel kunne afslutte en plan og skifte til en anden. Og kunne skifte mellem personerne.


Jens Thyge Kristensen, Email: jtk@imm.dtu.dk

Sidst ændret:   28. november - afsnittet 'Opgavebesvarelsen' tilføjet
Tidligere ændret:
    - 22. november - afsnittet 'Udvidede krav til 3-personersgrupper' tilføjet
    - 21. november - afsnittet 'Reducerede krav til 1-personersgrupper' tilføjet
    - 19. november - afsnittet 'Opgaven' tilføjet
    - 17. november - afsnittet 'Problemstillingen' tilføjet
    - 15. november - kun titlen