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.
- 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.
- 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.
- 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.
- 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"
- 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.
- 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
- g? inn i oblig-01-katalogen
cd HomeExam01-Handout
- lag en underkatalog for ? bygge programmene fra den utleverte kildekoden
mkdir build
- g? inn i build-katalogen
cd build
- bruk CMake til ? lage en Makefile som passer din maskin
cmake ..
- kompilér for ? lage eksekverbare filer fra kildekoden
make
- kj?r programmene, f.eks.
./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
.