Lösung der Aufgabe 1-43 inklusive Problemanalyse und Algorithmusentwurf<

Ein konkretes Beispiel:
vorher, Zeichenkette s:

Inhalt
0
5
5
2
2
/
5
1
4
-
2
3
4
\0
           
Index i
0
1
2
3
4
5
6
7
8
9
10
11
12
13
           

nachher:

Inhalt
0
5
5
2
2
5
1
4
2
3
4
\0
           
Index j
0
1
2
3
4
5
6
7
8
9
10
11
12
13
           

Auf jeden Fall muß jedes Zeichen der Original-Zeichenkette s geprüft werden, also eine Schleife
Für i = 0 bis Länge der Zeichenkette
durchlaufen werden. Vergleich man die Originalzeichenkette mit der neuen Zeichenkette, so sieht man:
Man muß sich zusätzlich zur aktuellen Position i merken, wo die nächste Ziffer (gültiges Zeichen) abgelegt werden muß.
Für das Bespiel ergibt sich folgende Abfolge von i (Index des gerade untersuchten Zeichens) und j (hier wird das Zeichen abgelegt, wenn es eine Ziffer ist):

Inhalt
0
5
5
2
2
/
5
1
4
-
2
3
4
\0
           
Quelle i
0
1
2
3
4
5
6
7
8
9
10
11
12
13
Kopieren
ja
ja
ja
ja
ja
nein
ja
ja
ja
nein
ja
ja
ja
ja
Ziel j
0
1
2
3
4
5
5
6
7
8
8
9
10
11
           

Für die Erzeugung der neuen Zeichenkette ergibt sich daher als Lösungsansatzr:

  1. Man verwendet eine zusätzliche neue Zeichenkette s2 , in die fortlaufend (j) jene Zeichen aus der Originalzeichenkette übertragen werden, die erwünscht sind:
    Falls s[i] ein gültiges Zeichen ist
    dann { s2[j] = s[i]; j erhöhen }
    j ist zu Beginn 0, und wird immer dann erhöht, wenn wieder ein Zeichen in s2 abgelegt wurde.
    Am Ende wird die Zeichenkette s2 wieder auf die Zeichenkette s zurückkopiert.
  2. Studiert man die Lösung 1 etwas genauer, so stellt man fest, daß das Verfahren direkt auf die Originalkzeichenkette s angewandt werden kann, weil j immer kleiner oder gleich i ist.

/* Loesung der Aufgabe 1-43 (1-41 in der 3. Auflage */


#include <stdio.h>

int IstZiffer(char c);
void nummer_erstellen (char *s);
void nummer_erstellen_2 (char *s);

int main(void)
{
  char telnummer[50];

  do {
    printf("Telefonnummer (Ende mit 0): ");
    gets(telnummer);
    nummer_erstellen(telnummer);
    puts(telnummer);
  } while (telnummer[0] != '0' || telnummer[1] != '\0');
  return 0;
}


/* int IstZiffer(char c)
   prueft, ob das Zeichen c eine Ziffer ist, -> Loesung der Aufgabe 1-42
   es koennte auch isdigit (ctype.h) aus der Standardbibliothek
   verwendet werden */

int IstZiffer(char c)
{
  if (c >= '0' && c <= '9')
    return 1;
  else
    return 0;
}

void nummer_erstellen (char *s)  /*
-------------------------------------------------------------------------
entfernt aus einer Zeichenkette alle Zeichen, die keine
Dezimalziffern sind
-----------------------------------------------------------------------*/
{
   int i;       /* das gerade untersuchte Zeichen */
   int j = 0;   /* hier wird das Zeichen abgelegt, wenn es eine Ziffer ist */

   for (i = 0; s[i] != '\0'; i++)
     if (IstZiffer(s[i])) {
       s[j] = s[i];             /* s[i] wird bei s[j] abgelegt, */
       j++;                     /* dann wird j erhoeht          */
     }
   s[j] = '\0';                 /* Abschlusszeichen !!           */
}


/* 
die beiden Zeilen 
   s[j++] = s[i];
   j++;
kann man auch zusammenfassen zu
   s[j++] = s[i];
*/