Thema indholdsfortegnelse -- Tastaturgenvej: 'u'  Forrige tema i denne lektion -- Tastaturgenvej: 'p'  Næste slide i denne lektion -- Tastaturgenvej: 'n'Tekststrenge
29.  Tidligere eksempler

I dette kapitel vil vi genprogrammere et par eksempler fra hhv. afsnit 16.10 og afsnit 18.3.

Vores ærinde er at illustrere hvordan vi kan drage fordel af at overføre tekststrenge som parametre og af at returnere en tekststreng som resultatet af en funktion. Dette vil ofte give mere generelle og mere genbrugbare funktioner.

29.1 Konvertering mellem talsystemer29.2 Udskrivning af enumeration konstanter
 

29.1.  Konvertering mellem talsystemer
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

I en tidligere lektion har vi programmeret funktioner der konverterer tal mellem forskellige talsystemer

De involverede funktioner læste/skrev input/output med getchar og putchar

Det er mere alsidigt at skrive funktioner, der modtager eller returnerer tekststrenge

Herunder, i program 29.1 viser vi en funktion, som konverterer et tal n i talsystemet med basis base til et decimalt tal. Da tal i f.eks. 16-talsystemet kan gøre brug af alfabetiske cifre ala 'a' og 'f' kan vi ikke overføre et heltal som parameter til to_decimal_number. Det er derfor bekvemt at overføre en tekststreng, som opfattes som et tal i n-talsystemet. Den oprindelige version af funktionen kan ses i program 16.8, read_in_base.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* Convert the string n to a decimal number in base and return it.
   Assume that input string is without errors */
int to_decimal_number(char *n, int base){
  int ciffer_number, res = 0;
  char *ciffer_ptr = &n[0], ciffer = *ciffer_ptr;

  do {
    if (ciffer >= '0' && ciffer <= '9')
      ciffer_number = ciffer - '0';
    else if (ciffer >= 'a' && ciffer <= 'z')
      ciffer_number = ciffer - 'a' + 10;
    else ciffer_number = -1;   /* error */

    if (ciffer_number >= 0 && ciffer_number < base)
      res = res * base + ciffer_number;

    ciffer_ptr++; ciffer = *ciffer_ptr;
  }
  while (ciffer != '\0');

  return res;
}
Program 29.1    En funktion der konverterer et tal n i base talsystemet (en streng) til et decimalt tal.

I program 29.1 ser vi på det røde sted at n er en tekststreng (char *). På det blå sted initialiserer vi en pointer, ciffer_ptr, der skal bruges til at løbe igennem strengen n. Vi dereferencer straks ciffer_ptr, og lægger tegnet over i char variablen ciffer. Vi bruger ciffer i en formel (udtryk), som svarer til formlen i program 16.8. Den brune del opdaterer ciffer_ptr og ciffer. Den lilla del holder udkig efter nulafslutningen i n.

I program 29.2 ses funktionen to_decimal_number i et komplet C program. Læg specielt mærke til hvordan vi kalder to_decimal_number i printf.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <stdlib.h>

int read_in_base(int);

int main(void) {
  int i, n, base;
  char *the_number[20];

  for (i = 1; i <= 5; i++){
    printf("Enter number base (a decimal number)"
           "and a number in that base: ");
    scanf("%d %s", &base, the_number); 
    printf("The decimal number is: %d\n",
            to_decimal_number(the_number, base));
  }
  
  return 0;
}

/* Convert the string n to a decimal number in base and return it.
   Assume that input string is without errors */
int to_decimal_number(char *n, int base){
  int ciffer_number, res = 0;
  char *ciffer_ptr = &n[0], ciffer = *ciffer_ptr;

  do {
    if (ciffer >= '0' && ciffer <= '9')
      ciffer_number = ciffer - '0';
    else if (ciffer >= 'a' && ciffer <= 'z')
      ciffer_number = ciffer - 'a' + 10;
    else ciffer_number = -1;   /* error */

    if (ciffer_number >= 0 && ciffer_number < base)
      res = res * base + ciffer_number;

    ciffer_ptr++; ciffer = *ciffer_ptr;
  }
  while (ciffer != '\0');

  return res;
}
Program 29.2    Hele programmet.

 

29.2.  Udskrivning af enumeration konstanter
Indhold   Op Forrige Næste   Slide Aggregerede slides    Stikord Programindeks Opgaveindeks 

I proceduren prnt_day, program 18.7, så vi hvordan vi kan lave og udskrive værdierne af enumerators. Herunder, i program 29.3, ser vi hvordan vi kan få hånd på print værdien af en enumerator via funktionen print_name_of_day. Læg mærke til at print_name_of_day returnerer en streng, hvorimod prnt_day fra program 18.7 returnerer void.

I en tidligere lektion har vi programmeret funktioner der udskriver navnene på enumeration konstanter

De involverede funktioner skrev output med printf

Det er mere alsidigt at skrive funktioner, returnerer tekststrenge

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* Return the symbolic name of day d */
char *print_name_of_day(days  d){
  char *result;
  switch (d) {
    case sunday: result = "Sunday";
       break;
    case monday: result = "Monday";
       break;
    case tuesday: result = "Tuesday";
       break;
    case wednesday: result = "Wednesday";
       break;
    case thursday: result = "Thursday";
       break;
    case friday: result = "Friday";
       break;
    case saturday: result = "Saturday";
       break;
  }
  return result;
}
Program 29.3    En funktion som returnerer en symbolsk ugedag (en streng) givet dagens nummer.

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