Thema indholdsfortegnelse -- Tastaturgenvej: 'u'  Forrige tema i denne lektion -- Tastaturgenvej: 'p'  Næste slide i denne lektion -- Tastaturgenvej: 'n'Introduktion til programmering i C
4.  Udskrivning og indlæsning

Udskrivning af tegn på skærmen og på filer er vigtig for mange af de programmer vi skriver. Tilsvarende er det vigtigt at kunne indlæse data via tegn fra tastaturet, eller fra tekstfiler. Indlæsning er mere udfordrende end udskrivning, idet vi skal fortolke tegnene som indlæses. Undertiden vil vi sige at disse tegn skal parses. Ved udskrivning skal vi formatere data, f.eks. tal, som et antal tegn.

Undervejs i kurset vender vi flere gange tilbage til problematikken. (Den mest grundige behandling gives i kapitel 45). Her og nu introducerer vi det mest nødvendige, så vi kan foretage nødvendig input og output i de programmer, vi skriver i den første del af kurset.

4.1 Udskrivning med printf4.3 Et input output eksempel
4.2 Indlæsning med scanf
 

4.1.  Udskrivning med printf
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

Kommandoen printf udskriver tal, tegn, og tekststrenge i et format, som er foreskrevet af en kontrolstreng. Deraf nok også navnet, printf - 'f' for formattering. For hver procent-tegn, konverteringstegn, i kontrolstrengen skal der være en parameter efter kontrolstrengen. Der er således en en-til-en korrespondance mellem konverteringstegn i kontrolstrengen og parametre, som overføres efter kontrolstrengen. (Vi kommer tilbage til parametre til funktioner i afsnit 12.7).

Kommandoen printf kan udskrive data af forskellige fundamentale typer.

Formateringen af output styres af en kontrolstreng, som altid er første parameter.

I program 4.1 ser vi straks på et eksempel, som er lavet i forlængelse af program 1.7. Værdien af hver af de forskellige variable i program 1.7 skrives ud med printf.

I den røde del ser vi at alle heltal kan udskrives med konverteringstegnet d. Vi ser endvidere at værdier i typen short kan angives med hd, hvor h kaldes en 'size modifier' i forhold til konverteringstegnet. Værdien af k, som er af typen long, udskrives med en 'size modifier' l til konverteringstegnet d. 3-tallet efter procenttegnet ved udskrivningen af j er minimum field width, og det angiver således det mindste antal tegn som udskrives. 10.5 angivelsen ved udskriften af k angiver hhv. minimum field width og precision. Når vi udskriver heltal fortolkes precision som det antal cifre, som bliver udskrevet. Hvis tallet ikke indholder cifre nok udskrives foranstillede nul cifre, jf. udskriften af k i program 4.2.

I den blå del udskriver vi forskellige reelle tal. Værdien af x er af typen double, som udskrives med konverteringstegnet f. Floats kan udskrives med det samme konverteringstegn. 5.2 angivelsen, som bruges ved udskriften af y, betyder at minium field width er 5, og precision er 2. Der afsættes altså minimum 5 pladser til udskriften af y, og der vil være netop to cifre efter decimalpunktet. Man kan også skrive .2 hvilket betyder at der ikke er angivet nogen minimal field width, og at precision er 2 (se program 4.4 for et eksempel). For z bruger vi konverteringstegnet e. Med dette beder vi om 'scientific notation'. Bemærk at det er nødvendigt at bruge size modifier L foran e, idet z er erklæret som en long double.

I den brune del udskriver vi tegn med konverteringstegnet c, og i den lilla del strenge med s. Dette er uden de store komplikationer.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

int main(void) {

  int i = 10;
  short j = 5;
  long k = 111L;
  printf("i: %d, j: %3hd, k: %10.5ld\n", i, j, k);

  double x = 10.5;
  float y = 5.5F;
  long double z = 111.75L;
  printf("x: %f, y: %5.2f, z: %Le\n", x, y, z);

  char c = 'A';
  char d = 'a';
  printf("c: %c, d: %d\n", c, d);

  char *s = "Computer", *t = "C";
  printf("s: %s,\nt: %s\n", s, t);  

  return 0;
}
Program 4.1    Udskrivning af variable af forskellige typer med printf.

Det er vigtigt at typen af den dataværdi, vi udskriver, svarer nøje til det anvendte konveteringstegn, som er tegnet efter %-tegnet. Output fra ovenstående program kan ses herunder.

1
2
3
4
5
i: 10, j:   5, k:      00111
x: 10.500000, y:  5.50, z: 1.117500e+02
c: A, d: 97
s: Computer,
t: C
Program 4.2    Output fra ovenstående program.

Vi opsummerer her, ganske overordnet, egenskaberne og mulighederne i printf. Vi har mere at sige om dette i afsnit 18.2, afsnit 18.6 og ikke mindst i afsnit 45.1.

  • Egenskaber af printf kommandoen:

    • Indlejring af formaterede parametre i en fast tekst.

    • Én til én korrespondance mellem konverteringstegn og parametre efter kontrolstrengen.

    • Mulighed for at bestemme antal tegn i output, antal cifre før og efter 'komma', venstre/højrestilling, og output talsystem.

    • Antallet af udlæste tegn returneres

 

4.2.  Indlæsning med scanf
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

Vi ser her kort og relativt overfladisk på indlæsning med scanf.

Kommandoen scanf fortolker tegn med henblik på indlæsning af værdier af de fundamentale datatyper

Fortolkning og styring af input sker med en kontrolstreng, analogt til kontrolstrengen i printf.

Her følger et eksempel. Vi indlæser en float i variablen x. Dette gøres gentagne gange, i en while løkke. Indlæsningen stopper når der ikke længere er indlæst netop ét tal. I praksis vil løkken nok blive afbrudt, hvis man slet ikke indtaster data, hvilket vil medføre at scanf returnerer 0.

Læg endvidere mærke til hvorledes værdierne af heltallet cnt og det reelle tal sum udskrives med printf i eksemplet.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* Sums are computed. */

#include <stdio.h>

int main(void)
{
   int     cnt = 0;
   float   sum = 0.0, x;

   printf("The sum of your numbers will be computed\n\n");
   printf("Input some numbers:  ");
   while (scanf("%f", &x) == 1) {
      cnt = cnt + 1;
      sum = sum + x;
   }
   printf("\n%s%5d\n%s%12f\n\n",
      "Count:", cnt,
      "  Sum:", sum);
   return 0;
}
Program 4.3    Indlæsning og summering af tal.

  • Egenskaber af scanf kommando:

    • De indlæste data indlæses i angivne lageraddresser

    • Antallet af gennemførte indlæsninger/konverteringer returneres

 

4.3.  Et input output eksempel
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

Vi afslutter dette afsnit med et eksempel, som stammer fra C by Dissection. Læg først og fremmest mærke til at vi indlæser radius med lf i kontrolstrengen i scanf. Dette svarer altså ikke helt til det tilsvarende konverteringstegn for doubles i printf, som jo kun er f. Vi viser en udgave hvor vi har fremhævet de enkelte bestanddele med farver, så det forhåbentlig bliver lidt lettere at se, hvordan det hele hænger sammen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

#define PI 3.141592653589793

int main(void)
{
   double radius;

   printf("\n%s\n\n%s",
      "This program computes the area of a circle.",
      "Input the radius:  ");
   scanf("%lf", &radius);
   printf("\n%s\n%s%.2f%s%.2f%s%.2f\n%s%.5f\n\n",
      "Area = PI * radius * radius",
      "     = ",  PI, " * ",  radius, " * ",  radius,
      "     = ", PI * radius * radius );
   return 0;
}
Program 4.4    Samme program med farvede fremhævninger af kontrolstreng og parametre til printf.

Her ses output fra programmet:

1
2
3
4
5
6
7
8
This program computes the area of a circle.

Input the radius:  5.3

Area = PI * radius * radius
     = 3.14 * 5.30 * 5.30
     = 88.24734
Program 4.5    Input til og output fra programmet.

Flere detaljer om scanf følger senere i materialet. I afsnit 18.2 giver vi en nyttig oversigt over heltalstyper og scanf konverteringstegn. Tilsvarende oversigt bliver givet for flydende tal i afsnit 18.6. Endelig diskuterer vi nogle flere scanf detaljer i afsnit 45.3.

Genereret: Onsdag 7. Juli 2010, 15:10:01
Thema indholdsfortegnelse -- Tastaturgenvej: 'u'  Forrige tema i denne lektion -- Tastaturgenvej: 'p'  Næste slide i denne lektion -- Tastaturgenvej: 'n'