10.07.2015 Views

uppgift 2A

uppgift 2A

uppgift 2A

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Inlämnings<strong>uppgift</strong> <strong>2A</strong>, Algoritmer ochdatastrukturer, 2011BeskrivningUppgiften går ut på att implementera ett enkelt register för att hålla reda på studieresultaten för enmängd studenter. Registret skall dels hålla reda på vilka kurser som finns dels vilka kurser studenterklarat av. Användare av registret skall kunna lägga in nya kurser och nya studenter, registrera att vissstudent klarat av en kurs. Man skall kunna få svar på frågor om vilka kurser en viss student klarat,vilka studenter som har uppnått ett visst antal poäng, vilka studenter som klarat av en viss kurs etc.Det finns uttalade krav på effektiviteten. Man får använda de av Javas standardklasser ochlärobokens klassbibliotek som man finner lämpliga. I <strong>uppgift</strong>en ingår också att motivera sina val ochvisa att man därmed uppfyller effektivitetskraven.ProblemetImplementera ett program som kan användas för att hantera ett register som håller reda på ett(möjligtvis stort) antal studenter och deras prestationer samt (ett litet) antal kurser. I programmetskall man kunna1. Lägga in en ny student i registret.2. Registrera att en viss student klarat av en viss kurs och fått ett visst betyg.3. Ta reda på hur många studenter det finns i registret.4. Lägga till en ny kurs.5. Skriva ut en lista över vilka kurser en viss student klarat av och vilka betyg som erhållits påkurserna.6. Ta reda på hur många poäng en student totalt har tagit.7. Skriva ut en alfabetiskt ordnad lista över vilka studenter som tagit ett visst minsta antalpoäng p, där p är en parameter.8. Ta reda på och skriva ut de k studenter som har tagit flest poäng. Resultatet ska vara en listamed <strong>uppgift</strong> om studentens namn och antalet poäng som klarats av. Denna lista ska varasorterad efter antal poäng i avtagande ordning. k är en parameter till operationen och kananta alla värden. Om k > antal studenter i listan så kommer alltså alla studenter att vara medi listan.9. Avsluta programmet och spara allt på filer (se vidare avsnittet Filformat).Programmet skall vara interaktivt. Användare skall kunna ge kommandon (t ex nummer)motsvarande var och en av de ovan uppräknade punkterna.Rimliga svar skall alltid ges. För punkt 2 ovan skall man t ex ge felutskrift om studenten ellerkursen inte finns och för punkt 1 gäller motsvarande om studenten redan finns.Studenter antas kunna identifieras entydigt med sitt namn (förnamn och efternamn). Vid alfabetisksortering används efternamnet i första hand.Kurser antas också kunna identifieras med en sträng (t ex motsvarande de kurskoder som användsvid LTH av typ “EDA027”). En kurs skall dessutom ha ett poängtal. När en student klarat av en kurserhålls betyget 3, 4 eller 5.


Läsa från fil och skriva till filProgrammet läser vid start alla <strong>uppgift</strong>er om kurser och studenter från en fil. Samma fil användssedan för att spara de eventuellt uppdaterade <strong>uppgift</strong>erna när programmet avslutas. Mer tips omhur denna fil kan utformas ges i nästa avsnitt.Inläsning från fil kan till största delen göras enligt de anvisningar som gavs på inlämnings<strong>uppgift</strong>1. Här används ju klasserna FileReader och BufferedReader. För utskrift radvis på filfinns motsvarande klasser FileWriter och BufferedWriter. För att öppna en fil för skrivninggör man så här:BufferedWriter out = null;try {out = new BufferedWriter(new FileWriter(fileName));}catch(FileNotFound e) {System.out.println(“Error opening file: “ + fileName);}Läs dokumentationen om BufferedWriter på nätet. För att skriva ut en sträng name på en egenrad på filen via bufferten out gör man:out.write(name);out.newLine();write-operationerna på en BufferedWriter skriver inte direkt på filen utan via en buffert. Närbufferten är full töms den och hela dess innehåll skrivs ut på filen. Man kan påtvinga tömning avbufferten genom att anropa metoden flush. Man bör naturligtvis se till att bufferten töms när manär helt klar med sina utskrifter. Man kan ju då ha en delvis fylld buffert som ännu inte skrivits ut påfilen. Lämpligt är då att använda operationen close, som dels skriver ut bufferten på filen delsfrigör de resurser som tagits i anspråk under skrivningen.I början av programmet öppnar man filen för läsning och läser enligt anvisningarna påinlämnings<strong>uppgift</strong> 1. När läsningen av filen är klar stänger man filen genom anrop av close.Därefter körs programmet så länge användaren utför sina kommandon. När det kommando sombetyder “avsluta” begärs, öppnas filen för skrivning enligt ovan, alla <strong>uppgift</strong>er skrivs ut och filenstängs igen.Datastrukturer och krav på effektivitetAntalet kurser antas vara litet och de kan därför lagras i någon enkel struktur t ex en lista.Studenterna kan däremot bli många och det krävs lite mer eftertanke för att välja en lämpligdatastruktur för resultatregistret. Det går bra att använda någon av de samlingsklasser (av typCollection eller Map) som finns i bland Javas standardklasser eller de som finns i bokens paketweiss.nonstandard. Om ni väljer att skriva egna klasser för att lagra registret så krävs att dessaär lika generellt skrivna som de nämnda d.v.s. de skall kunna hantera alla slags objekt elleråtminstone objekt av typen Comparable.Kraven på effektivitet är följande (n anger antalet studenter i registret):Det initiala arbetet att läsa indata från registerfilen och att bygga de strukturer sominnehåller information om kurser och studenter och deras resultat får kosta högst O(n log n) imedelfall. Vi antar här att det antal kurser som finns inrapporterade för en student är litet iförhållande till n.Efter det att det initiala arbetet utförts gäller följande krav för de frågor som skall besvaras avprogrammet:Frågorna 1, 2, 5 och 6 skall kunna besvaras till en kostnad som är O(log n) i värsta fall.


Frågorna 3 får bara kosta O(1).Frågorna 7 och 9 får kosta O(n) i värsta fall.Fråga 8: Kravet är här att även när k ungefär är lika med n så skall kostnaden vara O(n log n) ivärsta fall.Vi utgår hela tiden från att antalet kurser är litet t ex < 100 och att det därför bara kostar O(1) attsöka i en lista av kurser eller att skriva ut de kurser en student klarat av (när vi väl hittat studenten iregistret).Tänk noga igenom dina val av datastrukturer och försök övertyga dig själv om att du med dina val kanuppfylla kraven på effektivitet innan du börjar implementera. Känner du dig osäker får du gärnadiskutera med lärare på kursen.Tips1För ett par av operationerna behöver man iterera sig genom registret. Använder man t ex javasTreeMap så kan man konstatera att det inte finns någon metod iterator som direkt ger eniterator för insatta nycklar eller värden. Däremot finns det operationer som values och entrySetsom bildar mängden av insatta värden respektive mängden av alla insatta par av (nyckel,värde). Detgaranteras att om man sedan skapar en iterator för någon av dessa båda mängder så kommer denatt ge värdena respektive paren i den ordning de hade i trädet, alltså efter stigande nyckelvärde. Tittapå dokumentationen av dessa operationer på nätet för mer information om du tänker användaTreeMap.Kommunikation med användarenProgrammet skall vara interaktivt och interaktionen får vara textbaserad. Det krävs alltså inte någotgrafiskt användargränssnitt. Låt det t ex finnas ett kommando för varje fråga numrerade 1-9. Enkörning av programmet skulle kunna ge upphov till följande dialog mellan datorn och användaren (>anger att användaren skriver in något).Välkommen till ...Tillgänliga kommandon:1: Registrera ny student2: Registrera resultat för student...Ange önskat kommando:> 1Ange namn:> Börje BörjessonBörje Börjesson insatt i registret.Tillgänliga kommandon:...För tips om hur inläsning från tangentbordet kan gå till se läroboken avsnitt 2.6.2.Tänk på att ge vettig utskrift även när användare skriver något felaktigt t ex ett kommando som intefinns eller om användaren inte skriver in ett tal när ett sådant förväntas. Programmet får absolut intege ett exekveringsfel i sådana situationer.Huvudprogrammet kan enklast utformas enligt följande principskiss:Läs in filen och bygg upp registret;boolean finish = false;while (!finish) {


Skriv ut lista över tillgängliga kommandon;Läs in önskat kommando;switch (kommando) {case 1: ...break;case 2: ...break;...case 9: finish= true;}}Spar undan registret på filen;FilformatFormatet på filen där registret sparas mellan körningar skall vara utformad enligt följande:EDA010 5EDA011 5EDA020 4FMA111 6#Andersson AnnaEDA010 5EDA020 3#Bengtsson Bengt#Carlsson CeciliaFMA111 5#Filen inleds alltså med en lista över kurser. På varje rad finns namnet på en kurs följt av antaletpoäng. Listan över kurserna avslutas med en rad med tecknet #. Därefter kommerstudent<strong>uppgift</strong>erna. För varje student finns alltid en rad med efternamn och förnamn. Därefter följernoll eller flera rader med resultat. På varje resultatrad finns ett kursnamn och ett betyg. Efterresultaten finns alltid en rad med tecknet # även om inga resultat finns för studenten.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!