Övningsuppgifter 725G82 Mål Syftet med dessa övningsuppgifter är att utveckla din förmåga att lösa problem med programmering i programspråket Java. Uppgifterna är uppdelade i tre delar och fokuserar på tre grundläggande områden: Grundläggande satser, som t.ex. tilldelning och uttryck, operationer för in- och utmanting (tangentbord/skärm) samt styrstrukturer, if, for, while, do-while. Underprogram (Javas metoder) och hur de kan användas för att dela upp ett problem/program. En av Javas inbyggda datastrukturer, det dynamiska fältet ArrayList.
Del A - Grundläggande satser Uppgift 1 - Tomten på solsemester Efter jul är tomten trött och tar där med en relaxresa till Bahamas. För att ta sig från nordpolen till hotellet behöver tomten åka flyg, buss och sedan taxi. Eftersom taxibilarna har fullt upp just denna period (många som vill fly undan snö och rusk) måste dessa bokas i förtid. Din uppgift är att räkna ut vilken tidpunkt som taxin skall bokas för. Tomten kommer att mata in sin utresetid från nordpolen i ditt program. Det tar 6,5 timmar att flyga från Nordpolen till Bahamas. Utöver detta tar det maximalt 20 minuter att ta sig till busstationen när man väl kommer fram. Bussarna går var 30:e minut (varje hel och halvtimme) från flygplatsen till resorten. Bussresan tar maximalt 1 timme. Det tar sedan ca 5 minuter att gå från fjärrbussterminalen till taxiparkeringen. Vi utgår ifrån att nordpolen och Bahamas har samma tidszon. Du behöver inte använda loopar i din lösning, men du får om du vill. Mata in utresetid Timme: 11 Minut: 35 Taxin skall bokas för kl 19:35. Mata in utresetid Timme: 17 Minut: 00 Taxin skall bokas för kl 01:05. Körexempel 3: Mata in utresetid Timme: 07 Minut: 11 Taxin skall bokas för kl 15:35.
Uppgift 2 - Momstabellen Konstruera ett program som skriver ut en momstabell. Programmet ska på terminalen fråga efter och ta som inmatning följande värden (där alla värden ska rimlighetskontrolleras, se nedan): Nedre samt övre gräns för prisintervallet Steglängd i tabellen Momsprocenten (uttryckt som decimaltal i intervallet 0 till 100 %) För att få lite överblick kan det vara vettigt att börja med antagandet att användaren kommer att mata in rimliga värden och skriva ett program utan felkontroller. Programmet ska ge resultat enligt nedan vid körning (användarens indata kursiverad). När du fått till själva tabellen så kan du lägga till felhantering av användarens inmatning. D.v.s. antag nu att användaren matar in felaktiga värden. Felhanteringen skall vara av typen rimlighetskontroll vilket innebär att användaren alltid kommer att mata in data av rätt datatyp. Detta ska göras så fort som felet kan upptäckas. Programmet ska ej avbrytas utan ny fråga ska ställas om användaren matar in ett felaktigt data! Tänk på att användaren kan mata in felaktiga data många gånger. Första pris: 10.00 Sista pris: 15.00 Steg: 0.5 Momsprocent: 10.00 === Momstabell === Pris utan moms Moms Pris med moms 10.00 1.00 11.00 10.50 1.05 11.55 11.00 1.10 12.10...... 15.00 1.50 16.50 Första pris: 10.00 Sista pris: 12.00 Steg: 0.3 Momsprocent: 20.00 === Momstabell === Pris utan moms Moms Pris med moms 10.00 2.00 12.00 10.30 2.06 12.36 10.60 2.12 12.72...... 11.80 2.36 14.16 OBS! Sista Pris utan moms -värdet i andra exemplet är 11.80 och inte 12.00 (inte heller 12.10)! Lämpliga testdata kan vara (kombinera lite olika för att se om ditt program verkar fungera): Första pris: -1 0 10 100 Sista pris: -1 0 1 11 12 15 101 1000000 Steg: -1 0 0.1 0.25 0.3 0.5 1 10 Momsprocent:-1 0 1 20 50 100 101
Uppgift 3 - Läckande kaffeapparat En kaffeapparat står och är evigt igång. Det är en sådan där användaren får välja bland många olika saker, som t.ex. cappuccino, latte, café lungo, hetvatten m.m. Tyvärr läcker apparaten, inte vätska, utan minne. Varje gång apparaten används uppstår en minnesläcka á 1 byte. Ju mer minne som apparaten förlorar, desto längre tid tar det för användaren att få sin dryck. Apparaten har 1 Kbyte minne att röra sig på, när allt detta minne tar slut så kraschar apparaten. Det är dock troligare att användaren långt tidigare blir så frustrerad över att apparaten går långsamt så att denne rycker ut sladden och maskinen startar om (då är allt minne fritt igen). Tiden det tar att få sin dryck tillagad kan beräknas med följande formel: 60 M 20 T=40 0.5 Där T är tiden i sekunder och M är minnesläckans storlek. Skriv ett program där användaren matar in hur lång tid som det maximalt är acceptabelt att vänta på kaffe (minst 5 sekunder). Programmet skall då mata ut hur många koppar som kan beredas innan apparaten måste startas om. Mata in den maximalt acceptabla väntetiden: 22.0 Apparaten måste startas om efter 43 koppar. Mata in den maximalt acceptabla väntetiden: 5.0 Apparaten måste startas om efter 1 koppar. Körexempel 3: Mata in den maximalt acceptabla väntetiden: 120.0 Apparaten måste startas om efter 92 koppar. Körexempel 4: Mata in den maximalt acceptabla väntetiden: 1200.0 Apparaten måste startas om efter 159 koppar. TIPS: Den matematiska approachen skulle vara att lösa ut M från formeln ovan. Det är inte tanken att du skall göra så i denna uppgift. Låt programmet helt enkelt testa sig fram med formeln ovan tills man överstiger tidsgränsen.
Del B - Underprogram Uppgift 4 - Ettan Skriv ett program som skriver ut en "etta". Användaren matar in storleken på ettan som skall ritas ut. I denna uppgift skall du försöka använda metoder så mycket som du kan. En bra tumregel är att inte ha mer än 10 rader kod per metod (inklusive main). Om två metoder blir lika varandra, kan du komma på något sätt att ersätta dem med en enda? Mata in N: 1 / Mata in N: 2 _ / Körexempel 3: Mata in N: 3 / Körexempel 4: Mata in N: 5 /
Uppgift 5 - Syldavernas kod Den syldaviska armen har en ny kod som de använder för att säkert kommunicera mellan sina regimenten. Koden fungerar på följande sätt: För alla bokstäver mellan 'A' och 'Z' och mellan 'a' och 'z' så vänder man på alfabetet. 'a' blir alltså 'z' och vice versa, 'b' blir 'y' och vice versa o.s.v. Alla tecken som inte är bokstäver är helt oförändrade. T.ex. blir strängen "hejsan" "svqhzm" och "Anfall nu!" blir "Zmuzoo mf!". Det som är så bra med denna kod är att avkrypteringen kan ske med samma algoritm som krypteringen! Skriv ett program som låter användaren mata in ett meddelande (på en rad) och som sedan skriver ut det avkrypterade meddelandet. Dela upp din lösning i lämpliga underprogram. Ett tips är att göra en metod som avkrypterar just ett tecken. Mata in meddelandet: Yziz vgg kzi wztzi pezi groo qfozuglm mf! Det avkrypterade meddelandet lyder: Bara ett par dagar kvar till julafton nu! Mata in meddelandet: Rmtvm plnnvi zgg pfmmz orhgz fg wvmmz plw. Det avkrypterade meddelandet lyder: Ingen kommer att kunna lista ut denna kod. TIPS: Tänk på att det går att plussa chars. Testa t.ex. char c = 'A' + 2; System.out.println(c);
Del C - Fält Uppgift 6 - Medianleksak Tomtens verkstad har akut materialbrist och måste begränsa antalet leksaker till en leksak per barn. Ifall tomten väljer den första leksaken på varje lista kommer inte barnen bli överraskade, tomten tänkte därför att medianleksaken blir ett bra val av leksak! Skapa ett program som hittar median-leksaken bland en godtycklig mängd leksaker. Det är givet att det alltid är ett udda antal leksaker som matas in. Mata in leksaker: Bil SuperCoolActionFigur Kol Psyduck Laserpistol Medianleksak: Kol Mata in leksaker: Boll Ring Apa Ponny Slagträ Bok Abakus Medianleksak: Ponny
Uppgift 7 - Bollar och glasrör Vi tänker oss N stycken genomskinliga glasrör ståendes på rad. Som ett spel kan man tänka sig att vi släpper ner bollar från ovan och låter dem landa i rören. Vi tänker oss att det är slumpmässigt vilket rör som just varje boll hamnar i. Vi antar även att rören är väldigt långa och smala och att det kan finnas maximalt 99 stycken. Skriv ett program där användaren får mata in N, d.v.s. hur många rör vi har. Användaren skall därefter mata in hur många bollar vi vill släppa ned (också maximalt 99 stycken). Programmet skall därefter slumpa hur bollarna hamnar i rören och rita ut detta på skärmen. I den utritade "bilden" skall även rören vara numrerade från 1 upp till N. Ingen felhantering av indata krävs. Mata in N: 5 Mata in antal bollar: 13 o o o o o o o o o o o o o 1 2 3 4 5 Mata in N: 4 Mata in antal bollar: 7 o o o o o o o 1 2 3 4 Körexempel 3: Mata in N: 13 Mata in antal bollar: 7 o o o o o o o 1 2 3 4 5 6 7 8 9 10 11 12 13
Uppgift 8 - Automatisk försäljare Skriv ett program som simulerar en amerikansk godisautomat (en sådan som syns här i bilden). Programmet skall med en prompt uppmana användaren till att utföra någon av följande: Mata in ett antal 'Q' som i "quarter" (ett 25- centsmynt). Maskinen lagrar hur stort belopp som användaren har petat i och ger en bekräftelse. Mata in Rad och Kolumn, t.ex. "B2" vilket innebär den andra produkten på B-raden ("Combos" i detta fall). Automaten skall kontrollera att det inmatade beloppet är tillräckligt stort och ge ett felmeddelande om det inte är det. Om det finns tillräckligt med pengar så skall den köpta varan lossas och växeln skall återlämnas. Programmet avslutas Mata in 'R' som i "return". Då skall köpet avbrytas och alla myten återlämnas. Programmet avslutas också. På filen STOCK.TXT finns varorna som automaten har i lager. Du får klistra in dessa data in i ditt program. Automaten har ett oändligt lager med godis, så det kan inte ta slut och den kan alltid ge exakt växel (se bild). WELCOME TO AUTOVENDOR 3000 RETURN (R), USER >> Q Q Q Q Q Bild: By Nenyedi at English Wikipedia (Transferred from en.wikipedia to Commons.) [Public domain], via Wikimedia Commons WELCOME TO AUTOVENDOR 3000 RETURN (R), USER >> Q Q Q AMOUNT DEPOSITED: $1.25 RETURN (R), USER >> B 3 DENIED! INSUFFICIENT DEPOSIT, DEPOSIT MORE COINS! RETURN (R), USER >> Q Q Q AMOUNT DEPOSITED: $2.00 RETURN (R), USER >> B 3 AMOUNT DEPOSITED: $0.75 RETURN (R), USER >> Q AMOUNT DEPOSITED: $1.00 RETURN (R), USER >> R COIN RETURN: $1.00 GOOD BYE, PLEASE COME AGAIN! ITEM DISPENSED: Grandma's waffles COIN RETURN: $0.40 GOOD BYE, PLEASE COME AGAIN!
Uppgift 9 - Sidnumrering Skriv ett program som låter användaren mata in ett antal sidnummer. Inmatningen avslutas med en nolla. Det är givet att numren alltid kommer i stigande ordning och att det inte förekommer dubbletter. Programmet skall sedan skriva ut detta med ett mer komprimerat format. Formatet skall vara på följande vis: 1. När det är minst två konsekutiva tal, skriv ut det första och det sista med ett bindestreck emellan. 2. Alla andra nummer skall separeras med komma. 3. Utskriften skall vara på en rad. Mata in sidnummer: 1 2 3 0 Resultat: 1 3 Mata in sidnummer: 1 2 3 5 0 Resultat: 1 3,5 Körexempel 3: Mata in sidnummer: 1 2 5 6 8 9 10 0 Resultat: 1 2,5 6,8 10 Körexempel 4: Mata in sidnummer: 1 0 Resultat: 1 Körexempel 5: Mata in sidnummer: 1 2 3 5 6 7 8 9 11 12 13 15 16 0 Resultat: 1 3,5 9,11 13,15 16 TIPS: Dela först upp problemet. Tänk dig att du löser en förenklad variant (t.ex. där man bara skall skriva ut separerat med komma, eller där det bara är konsekutiva tal). Utöka sedan denna variant till den fulla lösningen.
Uppgift 10 - Sillsallad AB Du har blivit anställd av Sillsallad AB, ett företag startat av superentrepenören Ulon Mesk. Företagets marknadsidé är att automatiskt framställa sillsallad. Till detta har företaget införskaffat ett rullande band, en långsmal korg, en bläckskrivare och roboten Slicemaster 3000. I nuläget är framställningsprocessen dock inte helt automatiserad, så det behövs en operatör som hjälper roboten i arbetet. Så här är framställningsprocessen tänkt att gå till: 2. Ingredienser landar i korgen (första hamnar längst ned). 4. Slicemaster 3000 (ditt program) skickar data till skrivaren. RULLBAND 1. Ingredienser (t.ex. rödbetor, potatisar, äpplen, gurka, sill) kommer på rullbandet och identifieras av operatören. 3. Slicemaster 3000 plockar upp en ingrediens i taget. Operatören anger hur den skall tärnas. Slicemaster 3000 tärnar ingrediensen och lägger tärningarna i plastförpackningen. 30% Potatis 25% Rödbeta 15% Sill 10% Gurka 20% Äpple 5. Skrivaren matar ut en etikett med en tabell med sillsalladens innehåll. Etiketten klistras sedan på plastförpackningens undersida. Då roboten skall tärna ingredienserna skall man ange hur många snitt som roboten skall göra. Först anger man snitten som skär ingrediensen i skivor, sedan snitten som skär dem i strimlor och till sist snitten som tärnar strimlorna. Om vi t.ex. skär en potatis i två skivor, strimlar dessa till sex strimlor och sedan skär dessa i arton tärningar skulle motsvarande sekvens av snitt bli: 1 2 2. Potatis (Från sidan) Två skivor (Från sidan) Sex långa strimlor (Ovanifrån) 18 tärningar. Observera att man kan be roboten att göra 0 snitt. T.ex. sekvensen 0 0 0 skulle innebära att man inte skär ingrediensen över huvud taget. Ett annat exempel är sekvensen 1 0 1 som ger 4 tärningar. Vi antar att operatören ser till att ingredienserna tärnas så att tärningarna blir jämnstora. Ditt program är alltså gränssnittet mellan operatören och resten av systemet. Programmet skall göra följande: Låta operatören mata in ingredienserna som kommer på det löpande bandet. Ingredienserna matas in på egna rader och kan bestå av flera ord. Nära alla ingredienser har kommit så skall operatören mata in "SLUT". Du kan utgå ifrån att det kommer minst en ingrediens men du vet inte hur många ingredienser som kommer. Låta operatören mata in (med tre heltal) hur ingredienserna skall tärnas. Ordningen på ingredienserna är det omvända från hur de kom på rullbandet. Beräkna och mata ut sillsalladens innehållsförteckning. Varje rad i tabellen anger hur mycket (hur många tärningar av totalen) av en ingrediens som salladen innehåller. Tabellen behöver inte sorteras, men varje ingrediens skall bara förekomma en gång.
Inkommande ingredienser (mata in på egna rader): Potatis Potatis Sillfilé Rödbeta Äpple Rödbeta Rödbeta Gurka SLUT Mata in snitt för "Gurka": 1 3 0 Mata in snitt för "Rödbeta": 3 3 3 Mata in snitt för "Rödbeta": 3 2 2 Mata in snitt för "Äpple": 3 4 3 Mata in snitt för "Rödbeta": 2 3 3 Mata in snitt för "Sillfilé": 0 3 6 Mata in snitt för "Potatis": 1 2 2 Mata in snitt för "Potatis": 1 3 2 Innehåll: 2% Gurka 48% Rödbeta 26% Äpple 9% Sillfilé 13% Potatis Inkommande ingredienser (mata in på egna rader): Sillfilé Rödbeta SLUT Mata in snitt för "Rödbeta": 1 1 1 Mata in snitt för "Sillfilé": 0 1 1 Innehåll: 66% Rödbeta 33% Sillfilé Eftersom procentandelarna är avrundade är det troligt att summan inte blir 100%, men Ulon hoppas på att ingen kommer upptäcka detta.