UMEÅ UNIVERSITET Datavetenskap 041201 TENTAMEN Programmeringsmetodik C för KV och Kemi - C, Datum Tid Hjälpmedel Antal uppgifter Totalpoäng • • • • • : : : : : 5p 041201 14 - 20 Inga 9 40(halva poängtalet krävs normalt för godkänt) Börja varje uppgift på nytt papper. Skriv ditt namn och uppgiftens nummer på varje papper. Skriv bara på ena sidan av papperet. Sortera dina papper efter uppgiftsnummer. Kryssa för de uppgifter du lämnar in. • Ange vilken kurs ni läser på försättsbladet (KV/Kemi) • Lösningarna skall vara snyggt och prydligt nedskrivna. Tankegången skall vara lätt att följa. Alla antaganden som inte är uppenbara skall redovisas. Kommentera källkod. Tips! • Försök på alla uppgifter! Observera att uppgifterna inte är ordnade efter svårighetsgrad. • Uppgifter kan vara felformulerade, fråga om du är osäker eller tycker att något verkar konstigt (jag kommer förbi ca 16:30). • Redovisa dina resonemang så är det lättare att bortse från skrivfel. • Om du inte kommer ihåg den exakta syntaxen, så gör ett antagande och redovisa detta. • Det är viktigt att du löser den givna uppgiften! UMEÅ UNIVERSITET 901 87 UMEÅ Johan Eliasson Tel.: 070-2378695 e-mail: [email protected] Tentamen: Programmeringsmetodik – C för KV och Teknisk kemi 041201 Lycka till! Uppgift 1. (5p) I denna uppgift ska ni skriva en funktion som vänder på innehållet i en sträng. Anropar man tex funktionen med strängen "Hej" så skall den efter anropet till funktionen vara "jeH". Funktionen ska överenstämma med nedanstående funktionsprototyp. void rev_str(char *str); Uppgift 2. (4p) Givet följande deklarationer: enum day {Mon,Tue,Wed,Thu,Fri,Sat,Sun}; struct date { int day,month,year; enum day day_name; char month_name[4]; /* Jan, Feb, Mar, etc */ }; int main(void) { struct date *myDate; myDate=malloc(sizeofstruct date); Skriv de satser som behövs för att sätta alla värden i den struct som myDate pekar på till de som gäller för dagens datum. Uppgift 3. (2p) Skriv om följande for-loop som en while-loop. Samma värden skall skrivas ut och variabeln i skall ha samma värde efter loopen. for(i=1;i<=32;i*=2) { printf("%d\n",i); } Uppgift 4. (3+1+1=5p) a) Skriv en funktion som löser samma problem som makrot nedan. #define swap(x,y) {int tmp=x;x=y;y=tmp;} b) Ge ett exempel där din funktion används. c) Ge ett exempel där makrot används Uppgift 5. (4p) Vad gör följande funktioner/operatorer? Ge exempel på hur de kan användas. a) sprintf b) += 2 Tentamen: Programmeringsmetodik – C för KV och Teknisk kemi 041201 c) calloc d) fclose Uppgift 6. (5p) Skriv en rekursiv funktion som adderar två positiva heltal. Du får endast använda dig av operatorerna ++, --, = och ==. (-2p om ni skriver en funktion som inte är rekursiv) Uppgift 7. (4p) Vilken datatyp och vilket värde har följande uttryck. Om uttrycket innehåller ett syntaxfel eller resulterar i ett programkörningsfel (run-time error) så ange vilken typ av fel det blev i stället för värde och datatyp. Direkt innan den plats i koden där uttrycken ska beräknas finns följande variabeldeklarationer: int d=7; int *x=NULL; int *y=&d; a) 1+2/(3+4) b) (*x) + d c) 1 + -2 d) (*y) % 5 Uppgift 8. (2+2+2=6p) a) Varför bör man oftast undvika globala variabler. b) Varför är dokumentation och kommentering av kod viktigt c) Varför allokerar man ibland minne dynamiskt. Uppgift 9 (5p) I vissa applikationer är det ibland användbart att koda tal mha BCD kodning (Binary Coded Decimal), där fyra bitar används för att reprecentera en decimal siffra (till skillnad från sättet vi har sett att heltal lagras i normala fall). En 32 bitars variabel kan då användas till att lagra ett åttasiffrigt tal. Tex skulle talet 123 lagras som det binära talet nedan: 0000 0000 0000 0000 0000 0001 0010 0011 De 4a bitarnas värde: 1 2 3 Er uppgift är att skriva en funktion int toBCD(int value) som tar ett tal value och konverterar det till motsvarande tal i BCD-format (lagrat i en int). Ni kan anta att talet value inte är negativt. Till er hjälp så får ni följande funktion som tar tre parametrar: digit en siffra (0-9) 3 Tentamen: Programmeringsmetodik – C för KV och Teknisk kemi 041201 pos den position som siffran ska ha i resultatet. Varje position består av 4a bitar och parametern pos kan alltså endast anta värdena 0-7 en pekare result. Siffran digit stoppas in på positionen pos i det tal som result pekar på. void ins_bcd(int *result,int digit,int pos) { *result |= value << (4*pos); } 4