Uppgift 5 ­ PM1/PK HT-02


Uppgift 5 måste lämnas senast onsdag 30/10 kl. 08:00. Lämna in den med hjälp av inlämningssystemet i slutet av denna sidan. Tänk på att för rekursiva funktioner kräver kodkonventionerna ytterligare information i specifikationen.

Efter denna laboration ska du kunna...

Före laborationen

Din inlämning

Överst i din fil ska följande finnas (inom kommentartecken):

Obs. Inga biblioteksfunktioner utom de tillhörande Char och String får användas.

Uppgiften

Problem 1

          1
        1   1
      1   2   1
    1   3   3   1
  1   4   6   4   1
1   5  10   10  5   1

Triangeln här ovan kallas (toppen av) Pascals triangel. Den skapas genom att för varje ny rad lägga till ettor ute i kanterna, och alla andra fält skapas genom att summera de två talen ovanför till vänster och ovanför till höger. Skriv en funktion pascalTri: (int * int) -> int som tar in två heltal där det första representerar raden, och det andra positionen inom raden från vänster räknat, och som returnerar det tal som har den platsen i Pascals triangel. Returnera ~1 om positionen är ogiltig för den raden.

Exempel:

- pascalTri(3 , 1);
> val it = 1 : int
- pascalTri(1 , 3);
> val it = ~1 : int
- pascalTri(6 , 4);
> val it = 10 : int
- pascalTri(7 , 4);
> val it = 20 : int

Tips: Programmet är mycket enklare än man kanske först tror. Tänk på programmet för beräkning av fibonaccital som vi gått igenom på föreläsningarna.

Problem 2

Skriv en funktion isPalindrome som är sann om strängen är ett palindrom (dvs likadan om man läser den framlänges och baklänges) och falsk annars.

Du ska ta hand om stora bokstäver och mellanslag, vilket brukar tillåtas i palindrom. "Ni talar bra latin" skall funktionen alltså känna igen som ett palindrom trots att den strängen baklänges blir "nital arb ralat iN".

Tips: Ett annat sätt att säga att en sträng är ett palindrom är att första tecknet och sista tecknet är lika, och mittendelen (om den finns, dvs om strängen är längre än två tecken) är ett palindrom.

Försök att dela upp problemet i mindre delproblem. Vad är skillnaden på det rekursiva anropet när man har hittat ett mellanslag i texten? Hur får man datorn att strunta i om en bokstav är stor eller liten?

- isPalindrome("Dromedaren Alpotto planerade mord");
> val it = true : bool
- isPalindrome("Dromedaren Alpotto var snäll");
> val it = false : bool

Problem 3

Att konvertera decimala tal (bas 10) till någon annan bas behöver man göra ibland. Du ska skriva en funktion decToBase: (int * int) -> string som givet ett (decimalt) heltal (första argumentet) returnerar en sträng med motsvarande tal i den nya basen (andra argumentet). Du behöver inte hantera negativa tal eller baser större än 10.

Exempel:

- decToBase(17, 10);
> val it = "17" : string
- decToBase(17, 2);
> val it = "10001" : string
- decToBase(17, 8);
> val it = "21" : string

Tips: Börja med att skriva en funktion som översätter ett decimalt tal till en sträng. När du tittar på din funktion så bör du se var du bör ändra för att få den att fungera generellt för alla baser mindre än 10. Fundera över vad du vill ha som basfall. En vettig uppdelning är den del av talet som kommer att ge entalssiffran respektive den del som kommer att ge resten av talet.

Tips: Hur skall du översätta från ental till siffror? Antingen kan du använda ett case eller liknande, eller så kan du utnyttja att teckenkoderna för tecknen #"0" till #"9" ligger i följd. I så fall behöver du funktionerna ord och chr som översätter från tecken (char) till teckenkoder (int) och vice versa.

Problem 4

Skriv en funktion killDuplicates: string -> string som tar en sträng och returnerar en sträng med samma tecken som den första, men bara ett av varje. Den slänger alltså bort alla utom ett av varje tecken. Det spelar ingen roll i vilken ordning tecknen står i den returnerade strängen.

Exempel:

- killDuplicates("qqq");
> val it = "q" : string
- killDuplicates("");
> val it = "" : string
- killDuplicates("11122223341231235512345");
> val it = "12345" : string
- killDuplicates("En fånig sträng.");
> val it = "Efåi sträng." : string

Notera att ditt program inte behöver ha med tecknen i samma ordning som exemplen.

Tips: Det kan kanske vara bra med en funktion som kollar om ett tecken finns i en sträng.

Inlämning

Hämta ett formulär för att lämna in uppgiften genom att fylla i fälten nedan.

ID:
PIN:
formulär för inlämning

lhe@csd.uu.se
The page has been accessed [an error occurred while processing this directive] times.

Valid HTML 4.01!