Örebro universitet
Institutionen för teknik
Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se)

Med vissa rättelser.






Tentamen i

Programmering C

för D1 m fl, även distanskursen

lördag 13 januari 2007 kl 14:00 - 18:00 i Hörsal T









Hjälpmedel: Inga hjälpmedel.
Poängkrav: Maximal poäng är 40.
För godkänt betyg (3 respektive G) krävs 20 poäng.
Resultat och lösningar: Meddelas på kursens hemsida senast lördag 3 februari 2007.
Visning och frågestund: Tisdag 6 februari 2007 kl 15:00-15:30 i mitt rum (T2220).
Efter visningen kan tentorna hämtas på expeditionen.
Examinator och jourhavande: Thomas Padron-McCarthy, telefon 070-73 47 013.





LYCKA TILL!

Prioritet och associativitet hos operatorerna i C

De viktigaste operatorerna:

Prioritet Kategori Operator Associativitet
Högsta Unära postfixoperatorer (), [], ->, ., ++, -- vänster
  Unära prefixoperatorer !, ++, --, +, -, *, &, sizeof, (typ) höger
  Multiplikation mm *, /, % vänster
  Addition mm +, - vänster
  Jämförelser <, <=, >=, > vänster
  Likhetsjämförelser ==, != vänster
  Logiskt OCH && vänster
  Logiskt ELLER || vänster
Lägsta Tilldelning =, +=, -=, *=, /=, %= höger

Uppgift 1 (1 p)

Skriv formeln nedan som en tilldelningssats i C.

En formel: z = ...

Uppgift 2 (1 p)

Vilka värden har följande uttryck?

a) (3 + 1) / (2 - 1)

b) 3 + 1 / 2 - 1

c) 3 + 1.0 / 2 - 1

Uppgift 3 (1 p)

i och j är heltalsvariabler. Ange värdet på i och j då följande kod har körts.

i = 1;
j = 10;
while (i < j) {
  if (i % 2)
    i = i * 2;
  else
    j = j - 1;
}

Uppgift 4 (1 p)

Vi behöver en posttyp (med C-terminologi en struct) som kan användas för att lagra data om planeter. Det som ska finnas med i posten är:

Definiera posttypen. Den ska heta struct Planet.

Faktaruta:
Jordens befolkning, drygt sex miljarder människor, går inte in i ett 32-bitars heltal, vilket är vad många datorer jobbar med. Men i den här uppgiften antar vi att det inte är ett problem som vi behöver bry oss om.

Uppgift 5 (1 p)

Definiera en variabel av typen struct Planet och initiera den med data om planeten Jupiter, som väger två tusen kvadriljoner kilo (med siffror: 2 * 1027) och har noll invånare.

Uppgift 6 (2 p)

Skriv en funktion som heter visa_planet, som skriver ut ett planet (som i uppgift 4) på skärmen. Funktionen tar planetposten som parameter, och skriver ut den. Exempel på hur urskriften ska se ut:
Namn: Miniturnus
Vikt: 75.000000
Befolkning: 0
Så här ser funktionshuvudet ut:
void visa_planet(struct Planet planeten)

Uppgift 7 (2 p)

Skriv en funktion som heter las_planet, och som läser in data om ett planet. Funktionen ska skriva ut lämpliga ledtexter på standardutmatningen, och läsa in data från standardinmatningen (som normalt är kopplad till tangentbordet). Du får själv välja om du vill att funktionshuvudet ska se ut så här:

struct Planet las_planet()

eller så här:

void las_planet(struct Planet *p)

Uppgift 8 (2 p)

Skriv en funktion som heter befolkad, som tar en planet som argument, och som returnerar ett sant värde om planeten har invånare. Om planeten har noll invånare, ska funktionen returnera ett falskt värde.

Uppgift 9 (2 p)

Skriv en main-funktion som har två lokala variabler av typen struct Planet, som läser in data om två planeter till dessa variabler med hjälp av funktionen las_planet, och sen skriver ut planeternas data med hjälp av funktionen visa_planet.

I den här och alla andra uppgifter på tentan gäller: Om du ska anropa en funktion från en tidigare uppgift, behöver du inte skriva koden för den funktionen på nytt. Du får också anropa funktionen även om du inte gjort uppgiften där man skulle skriva den.

Uppgift 10 (3 p)

Skriv en funktion som heter las_befolkad_planet, som läser in data om en planet, och som upprepar den inläsningen ända tills man matar in en planet som är befolkad. Anropa funktionerna las_planet och befolkad. Till slut ska funktionen returnera den inlästa planeten på lämpligt sätt. Du får själv välja hur du vill att funktionshuvudet ska se ut.

Observera: Välj ut och besvara (högst) fyra av de fem uppgifterna 11-15. (Skulle du svara på alla fem, räknas den med högst poäng bort.)

Uppgift 11 (6 p)

Skriv ett C-program som läser in heltal ända tills man matar in talet noll, och sen talar om hur många av talen som var jämna och hur många som var udda. (Den avslutande nollan ska inte räknas med.)

Uppgift 12 (6 p)

Skriv ett C-program som läser in positiva reella tal till en array (högst tusen stycken), och sen talar om vilket av talen som ligger närmast genomsnittet för alla talen.

Man avslutar inmatningen genom att mata in ett negativt tal.

(Vi antar för enkelhets skull att det finns ett enda tal som ligger närmast genomsnittet. Det är alltså inte flera tal som "delar förstaplatsen".)

Uppgift 13 (6 p)

Skriv ett C-program som läser in planeter, som vanligt från standardinmatningen, och sparar data om planeterna på en fil. Du får själv välja om det ska vara en textfil eller en binärfil, hur den ska se ut, och vad den ska heta.

Man avslutar inmatningen genom att mata in en planet med vikten 0.

Uppgift 14 (6 p)

Skriv ett C-program som läser filen med planeter från uppgiften ovan, och sen skriver ut följande uppgifter: (Vi antar för enkelhets skull att det är en enda av de befolkade planeterna som är tyngst. Det är alltså inte flera planeter som "delar förstaplatsen".)

Förklara också hur programmet vet när det ska sluta läsa planeter från filen.

Uppgift 15 (6 p)

Ett rymdimperium består av en centralplanet och upp till tusen underplaneter. Både centralplaneten och alla underplaneterna måste vara befolkade.

a) Definiera en posttyp som kan användas för att lagra data om ett rymdimperium. Den ska heta struct Rymdimperium.

b) Skriv funktionen las_rymdimperium, som läser in uppgifter om ett rymdimperium och alla dess planeter, såväl central- som underplaneter. Använd gärna funktionen las_befolkad_planet.

c) Skriv en main-funktion som har en lokal variabel av typen struct Rymdimperium, och som läser in data om ett rymdimperium till den variabeln med hjälp av funktionen las_rymdimperium.

Observera: Välj ut och besvara (högst) fyra av de fem uppgifterna 11-15. (Skulle du svara på alla fem, räknas den med högst poäng bort.)