Örebro universitet
Institutionen för teknik
Thomas Padron-McCarthy
(Thomas.Padron-McCarthy@tech.oru.se)
Tentamen i
Programmering C
för PA1 m fl
onsdag 15 mars 2006 kl 8:00 - 13:00 i L001
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 måndag 27 mars 2006.
|
Visning och frågestund:
|
Onsdag 29 mars 2006 kl 12:00-12:30 i mitt rum (T2220).
Efter visningen kan tentorna hämtas på expeditionen.
|
Examinator och jourhavande:
|
Thomas Padron-McCarthy, telefon 0707-347013.
|
-
Skriv tydligt och klart. Lösningar som inte går att läsa kan
naturligtvis inte ge några poäng. Oklara 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. Gjorda
antaganden får inte förändra den givna uppgiften.
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) 1 + 2 * 3 + 4 % 5
b) 1 + 2 * (3 + 4) % 5
Uppgift 3 (1 p)
i är en heltalsvariabel.
Ange värdet på i då följande kod körts.
i = 3;
while (i < 10) {
if (i < 4 || i == 8)
i += 3;
else
i++;
}
Uppgift 4 (1 p)
Den här datatypen avbildar länder.
Varje land har ett namn, ett invånarantal,
och en landyta som anges i kvadratkilometer.
struct Land {
char namn[30 + 1]; // Landets namn ("+1" är för strängavslutningstecknet)
int befolkning; // Landets invånarantal
float landyta; // Landets landyta (i kvadratkilometer)
};
Definiera en variabel av denna typ och initiera den med
namnet Sverige, invånarantalet 9001774 och landytan 410934.
Uppgift 5 (1 p)
x och y är två variabler som kan innehålla heltal:
int x;
int y;
Skriv de programrader som behövs för att byta plats på innehållet
i x och y. Om vi till exempel antar att x innehåller 3 och y innehåller 17,
så ska x alltså sen innehålla 17 och y ska innehålla 3.
Uppgift 6 (2 p)
Skriv en funktion som heter datum_ok,
som tar ett datum i form av ett åttasiffrigt positivt heltal som parameter,
och som returnerar värdet 1 om heltalet kan vara ett riktigt datum,
och 0 om det inte kan vara det.
De kontroller man ska göra är att månaden är mellan 1 och 12,
och att dagen är mellan 1 och 31.
(Man behöver inte bry sig om att vissa månader har färre än 31 dagar.)
Exempel:
-
20060315 ska returnera 1.
-
20061315 ska returnera 0.
-
19990231 ska returnera 1 (trots att den 31 februari egentligen är omöjligt)
Så här ser funktionshuvudet ut:
int datum_ok(int datumet);
Uppgift 7 (2 p)
Skriv en funktion som heter visa_datum,
som skriver ut ett datum på skärmen.
Funktionen tar datumet som parameter i form av ett åttasiffrigt positivt heltal.
Den ska första anropa datum_ok för att kontrollera om datumet är riktigt,
och om det inte är det ska den skriva ut Felaktigt datum.
Exempel:
-
20060315 ska ge utskriften 15/3 2006
-
20061315 ska ge utskriften Felaktigt datum
-
19990231 ska ge utskriften 31/2 1999
Så här ser funktionshuvudet ut:
void visa_datum(int datumet);
Uppgift 8 (2 p)
Skriv en funktion som heter las_datum,
som läser in ett datum från användaren i form av dag, månadsnummer och år,
och som returnerar det i form av ett åttasiffrigt heltal.
Funktionen ska skriva ut lämpliga ledtexter på standardutmatningen,
och läsa in data från standardinmatningen
(som normalt är kopplad till tangentbordet).
Om datumet inte var ett tillåtet datum enligt funktionen datum_ok,
ska funktionen fråga efter ett nytt datum,
ända tills användaren matar in ett korrekt datum.
Så här ser funktionshuvudet ut:
int las_datum();
Uppgift 9 (2 p)
Skriv en funktion som heter visa_land,
och som visar ett lands data (enligt uppgift 4 ovan) på skärmen.
Den ska alltså skriva ut landets uppgifter, med lämpliga ledtexter, på standardutmatningen.
Så här ser funktionshuvudet ut:
void visa_land(struct Land landet);
Uppgift 10 (2 p)
Skriv en funktion som heter las_land,
och som läser in en lands data (enligt uppgift 4 ovan).
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 Land las_land();
eller så här:
void las_land(struct Land* p);
Uppgift 11 (5 p)
Skriv ett program som börjar med att fråga efter dagens datum,
och sen läser in det med hjälp av funktionen las_datum.
Därefter ska programmet fråga efter hur många datum det ska behandla,
och sedan läsa in dem ett efter ett, fortfarande med las_datum,
och lagra dem i en vektor.
Programmet ska kunna hantera upp till 10 datum i vektorn,
och om användaren anger ett större antal än så,
ska programmet avbrytas med ett rättvisande och informativt felmeddelande.
Avslutningsvis ska programmet skriva ut alla datum i vektorn som ligger i framtiden
(alltså efter dagens datum). Använd funktionen visa_datum för utskrifterna.
Uppgift 12 (5 p)
Skriv ett spel som fungerar så här:
-
Först ska programmet fråga efter ett största tal,
som användaren matar in.
-
Därefter ska programmet slumpa fram ett heltal,
mellan 1 och det angivna största talet.
-
Sen får användaren gissa vad talet var.
För varje gissning ska programmet tala om ifall gissningen var för liten,
för stor, eller rätt.
Om gissningen var rätt,
ska programmet skriva ut antalet gissningar, och sen avslutas.
Ledtråd:
Använd anropet rand() för att få ett stort, slumpmässigt heltal.
Innan man kan använda den funktionen,
måste slumptalsgeneratorn initieras, till exempel med anropet
srand(time(NULL));
Uppgift 13 (5 p)
Skriv ett program som läser in länder med hjälp av funktionen las_land,
och sparar dem på en binärfil.
Filen ska heta lander.dat.
Programmet ska läsa länder, och spara dem på binärfilen,
ända tills användaren matar in ett land som har noll som både yta och folkmängd.
(Det landet ska inte sparas på filen.)
Uppgift 14 (5 p)
Skriv ett program som läser igenom binärfilen lander.dat från uppgiften ovan,
och som skriver ut de fyra länder som har:
- minsta folkmängden
- största folkmängden
- minsta ytan
- största ytan
Använd funktionen visa_land för utskrifterna.
Uppgift 15 (5 p)
En pappersmaskin, som används för att tillverka papper,
är en stor och komplicerad maskin.
För att hålla koll på papperstillverkningen
mäter man temperaturer på ett antal ställen inuti maskinen.
Temperaturerna sparas på en textfil.
Textfilen heter temperaturer.txt,
och varje rad innehåller tre tal:
tidpunkt (ett heltal som anger tiden, mätt i sekunder sedan maskinen senast startades),
givarnummer (ett heltal som anger platsen som temperaturen kommer från),
samt temperaturen (ett reellt tal).
Exempelvis kan en rad se ut så här:
7292 19 98.16
Den raden säger att drygt två timmar från det att maskinen startades
så var temperaturen på plats nummer 19 i maskinen 98.16 grader.
Temperaturerna ligger i tidsordning på filen.
Det finns 100 olika temperaturmätställen i maskinen,
numrerade från 1 till 100.
Skriv ett program som läser textfilen,
och som skriver ut medeltemperaturen för vart och ett av de hundra
temperaturmätställen.
Utmatningen ska bestå av en rad för varje mätställe,
med mätställets nummer och dess medeltemperatur.