Övningar
Övningarna under varje avdelning nedan är sorterade i (väldigt) ungefärlig svårighetsgrad. Varianterna i punktform efter varje huvuduppgift kan dock vara betydligt svårare än efterföljande huvuduppgift. Svårighetsgraden kommer att variera i hög grad beroende på din inlärning av de olika momenten i kursen, din tidigare erfarenhet samt din kunskap om problemen som ska lösas, så känn dig inte bunden av ordningen.
För samtliga övningar går det bra att använda valfria inbyggda metoder i C# och .NET så länge inte övningen går ut på att implementera just metoden i fråga. (Med andra ord: om ni kan lösa övningen med ett enda metodanrop så bör ni hitta en annan lösning, annars är det inga problem.) Generellt är det dock alltid en bra övning att försöka sig på en uppgift med ett begränsat antal inbyggda metoder till hjälp, men när och till vilken grad ni vill göra detta bestämmer ni själva.
Metoder och klasser
Dessa övningar kan skrivas som enstaka metoder eller klasser och kräver i regel mindre kod än övningarna i nästa avdelning. Samtliga metoder ska returnera sitt resultat som ett returvärde.
- Skriv en metod som tar emot en sträng och ett heltal och upprepar strängen det givna antalet gånger. Om strängen exempelvis är "nej" och heltalet är 5 ska resultatet bli "nejnejnejnejnej".
- Skriv en metod som spegelvänder en text. Om texten exempelvis är "Summer time" så ska resultatet bli "emit remmuS".
- Skriv en metod som kontrollerar om en sträng är en palindrom eller inte. En palindrom är ett ord eller en text som blir samma baklänges som framlänges. Om strängen exempelvis är "wow" eller "dallassallad" ska metoden returnera
true.
- Skriv en variant som fungerar även för meningar med kommatecken, frågetecken och andra specialtecken; dessa ska helt enkelt inte räknas med när bedömningen görs. Metoden ska också räkna stora och små bokstäver som likvärdiga. Denna metod ska alltså returnera
true på exempelvis "Was it a rat I saw?" och "A man, a plan, a canal: Panama!".
- Skriv en metod som kontrollerar om ett lösenord uppfyller en uppsättning säkerhetsregler. Reglerna är följande: minst 8 tecken långt, minst en stor bokstav, minst en liten bokstav och minst en siffra.
-
Skriv en metod som krypterar en text med den gamla (och sedan länge förlegade) metoden ROT13, som finns beskriven på Wikipedia. Du behöver bara ta engelska bokstäver i åtanke.
- Skriv en ytterligare metod som också dekrypterar strängen.
- Skriv varianter på dina metoder som tar emot ett ytterligare argument: antalet steg som bokstäverna ska förskjutas. Om detta argument exempelvis är 2 så ska "A" ersättas med "C" och så vidare.
- Skriv en variant på din dekrypteringsmetod som inte vet hur många steg som bokstäverna ska förskjutas utan istället gissar detta med hjälp av grundläggande kryptoanalys. Denna metod ska utöver strängen också ta emot en array med tecken som innehåller de vanligast förekommande bokstäverna i det engelska språket. Metoden ska testa samtliga varianter på förskjutning och välja det resultat som innehåller flest vanliga bokstäver. En passande lista på vanligaste bokstäver finns på Oxford Dictionaries. Välj själv hur många bokstäver som ska finnas i arrayen och testa sedan din lösning med olika texter och bokstavsuppsättningar.
- Skriv en metod som kontrollerar om en en text är ett pangram. Ett pangram är en text som innehåller varje bokstav i alfabetet åtminstone en gång. Om strängen exempelvis är "The five boxing wizards jump quickly" ska metoden returnera
true.
- Skriv en variant som också tar emot en array med bokstäver som ska användas i bedömningen och således möjliggör kontroll av pangram i valfritt alfabet.
- Skriv en metod som censurerar olämpliga ord i en text genom att ersätta dem med asterisker (eller andra passande tecken). Utöver texten i fråga ska metoden ta emot en array av ord som ska censureras. Om texten exempelvis är "Luke's father is Vader and Rosebud is a sled." och arrayen är
{ "Vader", "sled" } så ska resultatet vara "Luke's father is ***** and Rosebud is a ****."
- Skriv en metod som hämtar ut domännamnet utan toppdomän från en epostadress. Om epostadressen exempelvis är
jakob@jakobkallin.com så ska resultatet vara "jakobkallin". Metoden ska hantera även epostadresser med punkter i användarnamnet (som brad.pitt@example.com).
- Skriv en metod som räknar antalet förekomster av olika bokstäver i en text och returnerar resultatet som en dictionary. Om texten exempelvis är "Hello world" så ska resultatet bli
{ ["H"] = 1, ["e"] = 1, ["l"] = 3, ["o"] = 2, ["w"] = 1, ["r"] = 1, ["d"] = 1 }.
- Skriv en variant som räknar antalet förekomster av olika ord i en text.
- Skriv en metod som översätter en text från ett språk till ett annat språk med hjälp av en uppslagstabell. Om texten exempelvis är "Merry Christmas everybody" och uppslagstabellen är
{ ["Merry"] = "God", ["Christmas"] = "jul", ["everybody"] = "allihopa" } så ska resultatet vara "God jul allihopa". Ord i texten som inte förekommer i uppslagstabellen ska vara oförändrade.
- Skriv en metod som översätter en sträng till rövarspråket. Reglerna för rövarspråket beskrivs på både svenska och engelska Wikipedia.
- Skriv en metod som översätter en sträng till Pig Latin. Reglerna för Pig Latin beskrivs på både svenska och engelska Wikipedia.
- Skriv en metod som tar emot en sträng som beskriver ett tärningsslag och sedan utför detta tärningsslag (med slumpmetoder) och returnerar summan. Reglerna för strängen är följande: först anges antalet tärningar, sen tecknet "d" (för "dice"), sen antalet sidor på tärningarna, sen antingen "+" eller "-" följt av ett tal som ska adderas till eller subtraheras från resultatet. Om strängen exempelvis är "2d8-3" så ska metoden simulera kastandet av två åttasidiga tärningar, summera värdena, dra bort tre och returnera resultatet.
-
Skriv din egen klass som fungerar på (nästan) samma sätt som den inbyggda klassen List. Du kan göra följande antaganden och förenklingar:
- Din klass behöver bara fungera för heltal, alltså inte godtyckligt innehåll.
- Din klass behöver bara återskapa metoderna
Add och Remove och instansvariabeln Length.
- Din klass får inte använda sig av den inbyggda klassen
List internt. Istället ska den lagra samtliga värden i en array med storlek 10. När arrayen har fått slut på plats ska den automatiskt utökas med 10 nya platser. (Detta ska alltså hända bakom kulisserna medan klassens användare lägger till värden i listan som för en inbyggd lista.)
Nedan följer några möjliga varianter:
- Lägg till stöd för ytterligare metoder, exempelvis
Clear och Insert.
- Använd generics för att möjliggöra användning av klassen med innehåll av valfri typ.
Program
Dessa övningar består i att skriva hela program och kräver i regel större mängder kod än övningarna i föregående avdelning. Samtlig interaktivitet ska ske genom kommandoraden.
-
Skriv om lösningen på valfri tidigare övning (på denna sida samt från tidigare övningstillfällen) till ett program som läser indata från användaren via kommandoraden och till slut skriver ut resultatet.
-
Lös valfri uppgift 1-11 på sidan med extra övningar (varav vissa redan har förekommit på denna sida eller vid tidigare övningstillfällen).
-
Skriv ett program som gör samma sak som inlämningsuppgift 1 fast interaktivt: genom att mata in text via kommandoraden ska användaren kunna sätta ihop en order och till slut få en sammanställning av kostnaden. Skriv först en variant där användaren själv anger namn och pris på varje produkt och sedan en variant där användaren får välja från en fördefinierad lista.
- Skriv ett program som låter användaren spela Mad Libs med en fördefinierad text. Mad Libs går ut på att spelaren får ange ett antal ord i diverse kategorier (exempelvis "föremål", "namn", "verb" etc.) och sedan får se dessa ord insatta i fördefinierade platser i en text som förhoppningsvis blir rolig att läsa. Välj själv hur den fördefinierade texten ska se ut och vilka ord som spelaren ska mata in. Läs mer om Mad Libs på Wikipedia eller annan lämplig plats.
-
Skriv ett program som låter användaren spela "Gissa vilket tal jag tänker på" med datorn. Programmet ska slumpa ett tal och sedan läsa in gissningar från användaren. Om användaren gissar fel så ska programmet skriva ut antingen "du gissade för högt" eller "du gissade för lågt" tills användaren gissar rätt.
- Skriv en variant som istället för "för högt" och "för lågt" anger hur nära det rätta svaret gissningen är, enligt någon skala som du bestämmer själv. Programmet skulle exempelvis kunna skriva ut "varmt" om gissningen är mindre än 20 från svaret och "hett" om gissningen är mindre än 10 från svaret.
-
Skriv ett program som låter användaren spela Blackjack mot datorn, som agerar dealer. Programmet ska interaktivt via kommandoraden visa vilka kort som har dragits för både spelaren och för datorn, samt låta spelaren välja när det är dags att stanna. Datorn ska fortsätta enligt reglerna för Blackjack, som du kan slå upp på Wikipedia eller annan lämplig plats. När antingen spelaren eller datorn har vunnit ska spelaren ha möjlighet att spela en till omgång och dessutom se det totala antalet gånger som spelaren respektive datorn har vunnit.