Uppsala universitet, inst f Informationsteknologi, avd f teknisk databehandling
Programmeringsteknik 1, ht04.

Laboration 2, Styrande satser

Syfte: Att följa ett programs exekvering, att öva på styrande satser och utskrifter/inmatning.
Att göra innan labben: Se föreläsning 4 med läsanvisning.
Redovisning: Skriftlig redovisning med kommenterad kod, utskrifter från lämpliga testkörningar och svar på frågorna, senast 2 dagar efter laborationstillfället.



Del 1. Enkelt statistikprogram

Skriv ett Javaprogram där man kan mata in, beräkna och skriva ut statistik för nederbörden under en tidsperiod. Programmet skall först presentera information om hur det används och sedan fråga efter och läsa in nederbörskategori, dvs regn, snö eller ingen nederbörd, samt mängden nederbörd. Nederbördskategori och mängd skall efterfrågas ända tills användaren vill att avsluta inmatningen. Sist skall relevant statistik skrivas ut.
Varje inmatning består av två värden, nederbördskategori och mängd under ett dygn. Kategori 1 betyder regn, 2 betyder snö och 3 betyder ingen nederbörd. Nederbördsmängd kan vara ett decimaltal, större än eller lika med noll. Inmatningen avslutas med att värdet -1 matas in för både kategori och nederbördsmängd. Du kan anta att det under ett och samma dygn bara förekommer en typ av nederbörd.
Programmet skall efter avslutad inmatning för varje kategori presentera antalet inmatade värden, samt medelvärdet av nederbörden för den kategorin. Medelvärdet skall avrundas till en decimal. Avslutningsvärdena -1, -1 skall inte räknas med i statistiken.
I den här laborationen bör du arbeta i BlueJ för att kunna testa dess debugger.

Gör så här:
  1. Starta BlueJ
  2. Klicka på knappen New Class. Fyll i namnet Nederbord (OBS! skriv inte Nederbord.java). Class Type skall vara Class.
  3. Högerklicka på symbolen för klassen Nederbord som kommer fram i BlueJ:s huvudfönster, och välj Open Editor, eller dubbelklicka på symbolen så öppnas editorn (=ordbehandlaren där Javakoden skrivs).
  4. Skriv in satsen
    import extra.*;
    överst i programmet. Ta bort det som står mellan public class Nederbord { och sista måsvingen. Här skall du skriva din main-metod. Nedan finns ett förslag på ett skelett till ett program med ledande kommentarer som ni kan använda om ni vill. Fyll i kod på de ställen där det står punkter (....). Markera koden i webläsaren och klistra in den i BlueJ:s editor genom att klicka på mellan-knappen på musen.
extra-paketet:
Tänk på att ni måste göra en inställning i BlueJ innan ni kan använda i extra-paketet. De flesta gjorde det under lab1. Om ni inte har gjort det gör det nu.

Att tänka på när ni jobbar:



Del 2. Testa ditt program m h a BlueJ:s debugger.

Följ programexekveringen (=programkörningen), och se hur variablernas värde ändras under exekveringen.
Med hjälp av BlueJ:s debugger kan du "avlusa", dvs söka efter och rätta fel logiska fel, och testköra ditt program. I den här övningen skall du använda debuggern till att följa en programexekvering och se hur du hoppar inom programmet, och se hur variablerna ändrar värde under körningens gång. På så sätt kan man spåra logiska fel, t ex var en beräkning går fel.
Starta debuggern, sätt brytpunkter, följ programkörningen m h a den svarta pilen, och se hur variablerna ändrar värde:
Frågor att besvara i redovisningen:

1. Redogör för testkörningarna: varför valde ni dessa värden? Vilka fall testar ni, vilka fall har ni inte testat?

2. Skulle ert program kunna förbättras?

3. I förslaget till lösning används en while-loop. Hur kan man skriva om man inte använder while?

4. Titta på era if-satser. Kan man skriva dem på något annat sätt? Vilken fördel (eller nackdel) är det att använda det sätt ni skrev dem på?

Förslag till main-metod:

//Programmet gör statistik på nederbörden under en tidsperiod. import extra.*; public class Nederbord { public static void main(String [] arg) { int kategori... // Du behöver fler variabler. Skriv in dem här efterhand // som du behöver dem .... Std.out.println("\n\nProgrammet beräknar och presenterar statistik för uppmätt nederbörd per dag under en tidsperiod avseende "); Std.out.println("kategori (Regn = 1, Snö = 2 eller Ingen nederbörd = 3) och mängd."); Std.out.println("Programmet avslutas då Du matar in -1 för kategori och -1 för nederbörd."); // En första inmatning av data: Std.out.print("Mata in kategori: "); kategori = Std.in.readInt(); Std.out.print("Mata in nederbördsmängd: "); mm = Std.in.readDouble(); // Du ska nu upprepade gånger kolla vilken kategori och nederbörsdmängd // som matats in, spara relevant information för att kunna // beräkna medelvärdet för de tre kategorierna och fräga efter nya data, // se exemplet nedan. while(.........................) { //upprepa inmatning tills -1 -1 matas in if (kategori == 1) { //1 betyder regn //Spara relevant information. Vilka variabler behöver du //för att kunna beräkna medelvärdet för nederbörden? .... } //Sen kommer snö. Gör på liknande sätt som för regn. .... //Och sist nederbördsfria dagar. .... //Vad måste göras innan loopen tar slut och programmet //hoppar upp till while()-satsen för ny kontroll igen? .... } //slut på while-loopen //Nu beräknar och skriver vi ut resultatet: Std.out.println("\nStatistik: \n"); Std.out.print("Antal regndagar: " ....); Std.out.println("I genomsnitt " ....); //På liknande sätt för snö- och nederbördsfria dagar .... } /*exempel på en programkörning: Programmet beräknar och presenterar statistik för uppmätt nederbörd per dag under en tidsperiod avseende kategori (Regn = 1, Snö = 2 eller Ingen nederbörd = 3) och mängd. Programmet avslutas då Du matar in -1 för kategori och -1 för nederbörd. Mata in kategori: 1 Mata in nederbördsmängd: 3 Mata in kategori: 1 Mata in nederbördsmängd: 4 Mata in kategori: 2 Mata in nederbördsmängd: 0.3 Mata in kategori: 2 Mata in nederbördsmängd: 1.2 Mata in kategori: 3 Mata in nederbördsmängd: 10 Nederbörden skall vara lika med noll för kategori 3. Mata in relevant nederbördsmängd: 0 Mata in kategori: 1 Mata in nederbördsmängd: -1 Nederbörden skall vara större än eller lika med noll. Mata in relevant nederbördsmängd: 3.5 Mata in kategori: -1 Mata in nederbördsmängd: -1 Statistik: Antal regndagar: 3 med i genomsnitt 3.5 mm/dag Antal snödagar: 2 med i genomsnitt .75 mm/dag Antal dagar utan nederbörd: 1 Genomsnittsnederbörden under perioden var 2 mm/dag. */