Örebro universitet
Institutionen för teknik
Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se)
Med vissa rättelser. 2006-01-14.




Tentamen i

Programmering C

för D1, Sdu1 och TDV

lördag 14 januari 2006 kl 14:00 - 19:00 i L003







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 4 februari 2006.
Visning och frågestund: Tisdag 7 februari 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.




LYCKA TILL!

Uppgift 1 (1 p)

Skriv formeln nedan som en tilldelningssats i C.

En formel: x = ...

Uppgift 2 (1 p)

Vilka värden har följande uttryck?

a) 2 + 3 * 4 - 5

b) 11 / 5 % 8

Uppgift 3 (1 p)

Den här datatypen avbildar spelare, eller rättare sagt deras rollfigurer, i en simulerad värld:

struct spelare {
   char namn[10];  // Spelarens namn
   float vikt;     // Spelarens vikt
   int styrka;     // Spelarens styrka
};

Definiera en variabel av denna typ och initiera den med namnet Kalle, vikten 95.0 och syrkan 18.

Uppgift 4 (1 p)

x är en heltalsvariabel. Ange värdet på x då följande kod körts.

x = 9;
while (x >= 0) {
    if (x == 12 || x == 6 || x == 2)
        x -= 3;
    else
        x--;
}

Uppgift 5 (1 p)

När man programmerar mätsystem skickar man ofta strängar mellan dator och mätinstrument. Hur gör man om det reella talet 5.1 till strängen "5.1"? Visa omvandlingen med en allmän algoritm som gäller för alla reella tal med en decimal, mellan 0.0 och 9.9. Inga färdiga funktioner får användas.

Uppgift 6 (2 p)

Skriv en funktion som heter dagnummer, som tar ett sex-siffrigt positivt heltal i form av ett datum som parameter, och som returnerar dagens nummer. Exempelvis ska 051210 returnera 10. Så här ser funktionshuvudet ut:

int dagnummer(int datum);

Uppgift 7 (2 p)

Skriv en funktion som heter visa_spelare, och som visar en spelares data (enligt uppgift 3 ovan) på skärmen. Den ska alltså skriva ut spelarens uppgifter, med lämpliga ledtexter, på standardutmatningen. Så här ser funktionshuvudet ut:

void visa_spelare(struct spelare b);

Uppgift 8 (2 p)

Ett personnummer brukar skrivas med tio siffror och antingen ett plus- eller minustecken. Personnumret 631211-1658 beskriver en person född 1963, medan personnumret 631211+1658 beskriver en person född 1863.

Skriv en funktion som kontrollerar att alla tecken utom det sjunde i ett personnummer är siffror. Funktionen ska returnera sant (1) eller falskt (0), och ha ett funktionshuvud som ser ut så här:

int is_ok_pnr_siffror(char *pnr);

Uppgift 9 (2 p)

Skriv en funktion som heter is_ok_pnr_tecken, som tar ett personnummer som parameter, och som returnerar sant (1) om alla tecken är siffror förutom det sjunde tecknet som kan vara + eller -. Annars ska den returnera falskt (0). Du ska anropa funktionen is_ok_pnr_siffror i uppgift 8 ovan. Funktionshuvud enligt:

int is_ok_pnr_tecken(char *pnr);

Uppgift 10 (2 p)

Skriv en funktion som heter las_spelare, och som läser in en spelares data (enligt uppgift 3 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 spelare las_spelare();

eller så här:

void las_spelare(struct spelare* p);

Uppgift 11 (5 p)

Skriv ett program som läser in en stor bokstav, och som skriver ut alla stora bokstäver från och med den inlästa bokstaven till och med den sista stora bokstaven Z. Två körexempel där du matar in det understrukna:

Ge en stor bokstav : R
RSTUVWXYZ

Ge en stor bokstav : J
JKLMNOPQRSTUVWXYZ
Vi arbetar alltså med det engelska alfabetet, och ignorerar de svenska bokstäverna Å, Ä och Ö. Ett tips: Teckenkoderna för de stora bokstäverna kommer i samma ordning som själva bokstäverna, så om A har teckenkoden 76, så har B teckenkoden 77.

Uppgift 12 (5 p)

Skriv ett program som upprepat läser in de positiva talen min och max, och skriver ut en tabell för kvadratrötter från och med min till och med max i steg om 0.1. Exempeltabellen nedan har min = 1.0 och max = 2.0.

Tal     Rot

1.00    1.00
1.10    ...
...     ...
2.00    1.41

Upprepningen ska avslutas då man anger ett negativt tal som min.

Uppgift 13 (5 p)

Skriv ett program som använder din funktion las_spelare för inläsning av spelare i uppgift 10 ovan, och läser in två spelare. Använd sedan funktionen visa_spelare i uppgift 7 ovan, och skriv ut spelarena i stigande ordning vad gäller vikt. Om vikten är lika, i stigande ordning efter styrkan.

 

Uppgift 14 (5 p)

Textfilen spelare.txt innehåller ett antal spelare enligt uppgift 3 ovan, med namn, vikt och styrka. Filen innehåller data om en spelare per rad, så här:

Kalle   95.0    18
Olle    83.2    15
Hjalmar 75.8    12
Hulda   65.9    9
...

Alla vikter är angivna med en decimal. Filen kan innehålla tusentals spelare. Den avslutas med att filen helt enkelt tar slut, utan något speciellt avslutningsvärde.

Skriv ett program som läser igenom textfilen, och sen talar om hur många spelare som har vikter i vart och ett av de här fyra olika intervallen:

Så här kan utmatningen från programmet se ut:

0.0 - 39.9: 1982
40.0 - 79.9: 12987
80.0 - 119.9: 4583
120.0 - : 313

Om programmet hittar en spelare med en vikt mindre än noll, ska programmet avbrytas med ett felmeddelande. I övrigt behövs ingen felkontroll.

Uppgift 15 (5 p)

C-programmet nedan är tänkt att läsa in 3 heltal och sen skriva ut det största av dem, så här:

Skriv tre heltal: 10 10 1
Största talet: 10

Tyvärr har det smugit sig in ganska många fel i programmet. Tala om vilka fel det är, och visa vad det borde stå i stället!

Programmet finns även på sista sidan i tentan. Du kan göra rättelserna på den sidan, och sedan riva loss den och lämna in den tillsammans med dina övriga lösningar, så slipper du skriva av programkoden.

include <stdio.h>

int Main(void) {
  int x, y, max;
  printf("Skriv tre heltal: ");
  scanf("%d", x);
  scanf("%f", &y);
  scanf("%s", *z);
  if (x > y && x > z)           /* Här räknar vi ut
    max = x;                     * vilket av de tre
  else if (y > x && y > z)       * talen x, y och z
    max = y;                     * som är störst,
  else                           * och lägger det i max.
    max = z;                     */
  printf("Största talet: \n", max);
  return 0;
} // main


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

Lösningsblankett till uppgift 15

Tentamenskod:



include <stdio.h>



int Main(void) {

  int x, y, max;

  printf("Skriv tre heltal: ");

  scanf("%d", x);

  scanf("%f", &y);

  scanf("%s", *z);

  if (x > y && x > z)           /* Här räknar vi ut

    max = x;                     * vilket av de tre

  else if (y > x && y > z)       * talen x, y och z

    max = y;                     * som är störst,

  else                           * och lägger det i max.

    max = z;                     */

  printf("Största talet: \n", max);

  return 0;

} // main