Ö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.
|
-
Skriv tydligt och klart.
Lösningar som inte går att läsa kan naturligtvis inte ge några poäng.
Oklara och tvetydiga formuleringar kommer att misstolkas.
-
Skriv den personliga tentamenskoden på varje inlämnat blad.
Skriv inte namn eller personnummer på bladen.
-
Skriv bara på en sida av papperet.
Använd inte röd skrift.
-
Antaganden utöver de som står i uppgifterna måste anges.
-
Skriv gärna förklaringar om hur du tänkt.
Även ett svar som är fel kan ge poäng,
om det finns med en förklaring som visar att huvudtankarna var rätt.
-
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.)
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.
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:
- Planetens namn, till exempel Saturnus.
Planetnamnet kan vara högst 30 tecken långt,
och består alltid av ett enda ord.
- Planetens vikt, som anges med ett reellt tal. Vikten mäts i kilo.
- Planetens befolkning, som anges med ett heltal.
(De flesta planeterna har ingen befolkning alls, dvs noll.)
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:
- Hur många planeter fanns det på filen?
- Hur många av dessa planeter var befolkade?
- Vad heter den av de befolkade planeterna som är tyngst?
(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.)
|