IN2140 v?r 2025

Oblig 1: Bli kjent med C (norsk)

For english, see here.

I denne obligen skriver du dine egne funksjoner i en rekke sm? programmer for ? bli bedre kjent med programmeringsspr?ket C. Du finner utleveringspakken for denne oppgaven her.

Oppgavene skal l?ses i de tildelte teameme; man kan diskutere l?sningsteknikker med andre teams, men ? dele kode utenfor teamet er ikke lov. Se retningslinjene for obligatoriske oppgaver og andre innleveringer ved Ifi.

Retterne vil teste innleveringer p? Ifis Linuxmaskiner, tilgjengelige gjennom login.ifi.uio.no (hvordan). Programmene dine m? kompilere og kj?re p? disse maskinene. Dersom du lurer p? noe om oppgavene, sp?r gruppel?reren din.

Besvarelse leveres gjennom Devilry innen torsdag 13. februar kl. 23.59.

Oppgave 1: Vokalbytte

I denne oppgaven skal du fullf?re et program som bytter ut alle vokalforekomster med en annen bokstav i en setning.

Programmet tar to argumenter: én setning og én bokstav. Alle fem engelske vokaler i setningen, det vil si ‘a’, ‘e’, ‘i’, ‘o’ og ‘u’ skal byttes ut med bokstaven. Skriv s? ut den forandrede setningen til terminalen.

Eksempel

$ ./vowelshift "Lorem ipsum dolor sit amet" a
Laram apsam dalar sat amat

Oppgave 2: Strengoperasjoner

Denne oppgaven handler om strenger og diverse strengoperasjoner. Du skal skrive funksjonene i filen stringops-todo.c

Kodefeil i implementasjonen kan for?rsake segmenteringsfeil i programmet. I s? fall anbefaler vi at du bruker Gdb og Valgrind for ? finne ut hvor i programmet feilen oppst?r.

  1. stringsum

Skriv funksjonen

int stringsum (char* s)

som tar en char-peker som argument og returnerer en int-verdi som vi kaller strengsummen. Vi definerer strengsummen som den akkumulerte verdien av alle tegn i strengen, hvor verdien tilsvarer alfabetisk posisjon: ‘a’ har verdien 1, ‘b’ har verdien 2 og s? videre. Vi skiller ikke mellom sm? og store bokstaver. Mellomrom og den avsluttende nullbyten inng?r ikke i summen. Dersom strengen inneholder noen tegn som ikke er en stor eller liten bokstav eller mellomrom, s? skal funksjonen returnere -1.

Det er flere m?ter ? forenkle denne oppgaven p?; det kan v?re lurt ? lage en enkel l?sning f?r du forbedrer den s? den m?ter alle kriteriene i oppgaven.

Tips: En char er en énbytes tallverdi, som kan ha verdier fra -128 til 127, og som oftest tolkes som en bokstav ved hjelp av ASCII-tabellen. Dette kan man utnytte for en effektiv l?sning – ved ? beregne tallverdiene som trenges for ? l?se oppgaven fra bokstavenes ASCII-verdier.

  1. distance_between

Skriv funksjonen

int distance_between(char* s, char c)

som tar en char-peker og en char som argumenter og returnerer avstanden (alts? differansen mellom posisjonene) fra f?rste til siste forekomst av tegnet i strengen. Dersom tegnet forekommer kun én gang s? skal funksjonen returnere 0. Dersom tegnet ikke forekommer, s? skal funksjonen returnere -1.

  1. string_between

Skriv funksjonen

char* string_between(char* s, char c)

som tar en char-peker og en char som argumenter og returnerer delstrengen som befinner seg mellom f?rste og siste forekomst av tegnet i strengen. Dersom tegnet forekommer kun én gang, s? skal funksjonen returnere den tomme strengen. Dersom tegnet ikke forekommer, s? skal funksjonen returnere nullpekeren.

Dersom tegnet forekommer minst to ganger skal hverken den f?rste og heller ikke den siste forekomsten v?re med i strengen du returnerer.

Her skal du IKKE allokkere en ny streng, men isteden skal du forandre inputstrengen, og returnere peker til rett sted.

  1. stringsum2

Skriv funksjonen

int stringsum2(char* s, int* res)

som fungerer som stringssum, men istedenfor ? returnere strengsummen, legger den resultatet i int-en som res peker p?. Funksjonen returnerer 0 i alle tilfeller da stringsum ville returnert et tall st?rre enn 0 or -1 ellers.

Oppgave 3: Marken i eplet

Du har en variabel apple som er definiert i filen 'the_apple.c'. Variablen apple er ogs? deklarert i headerfilen 'the_apple.h'.

Main-funksjonene til programmet ligger i filen apple-main.c. Funksjonene nevnt nedenfor, som du b?r implementere, skal v?re plassert i filen apple-todo.c

Det er bare én mark i eplet, men marken kan vokse seg stor ved ? duplisere sine bokstaver. Da ser den kanskje slik ut:

"leappleappleappleappwwwwoooooooorrrrrr\n"
" rrmmmmmleappleappleappleappleappleap\n"
  1. Skriv funksjonen
int locateworm(char* apple)

som finner marken i eplet ved kun ? bruke grunnleggende spr?kkonstruksjoner som if … else, for, while, do og s? videre – alts? ingen funksjoner som er ment for strengmanipulasjoner, som f.eks. strcpy, strchr eller strstr.

N?rmere bestemt skal funksjonen returnere tallet som er den (null-baserte) array-indeksen til den f?rste bokstaven som tilh?rer marken, eller -1 hvis marken ikke finnes.

  1. Skriv funksjonen
int removeworm(char* apple)

som skj?rer ut marken av eplet ved ? overskrive den med mellomrom. Funksjonen returnerer markens lengde (antallet bytes som ble erstattet med mellomrom) eller 0 hvis marken ikke finnes.

Kompilering

For ? kompilere programmene har vi laget en spesifikasjonsfil som heter CMakeLists.txt. Disse filene leses av en softwarepakke med navn CMake, og den kan lage Makefiler p? Linux. Den kan ogs? lage prosjektfiler for Visual Studio eller XCode, men for IN2140 skal dere bruke terminalvinduer og Makefiler.

Du kan nedlaste og kompilere dette prosjektet som f?lger: - ?pne en terminal - i terminalen, pakk opp de utleverte filene:

unzip HomeExam01-Handout.zip
cd HomeExam01-Handout
mkdir build
cd build
cmake ..
make
./vowelshift "This is a text on the command line" u

CMake er installert p? login.ifi.uio.no. Hvis du har behov til ? installere CMake andre steder, kan du laste ned fra CMake. P? Windows med WSL2 og p? Linux kan du bruke Apt eller Snap, p? Mac funker Homebrew og p? Windows med Visual Studio kan du f?lge oppskriften fra Microsoft.

Levering

Dere skal levere koden deres i Devilry som en arkiv-fil. Arkiv-filen skal v?re en Zip-fil og m? inneholde alle kildefiler og dokumentasjonsfiler.

F?lger dere oppskriften for ‘make’ under Kompilering, kan dere lage arkiv-filen ved ? kalle

make package_source

Filen heter da HomeExam01-1.0-Source.zip.