5.2.20
12/07/19
Last Modified 06/30/19 by Walter Tasin
AlgoDat_LU11 Reload Page

Algorithmen und Datenstrukturen

Übung zum Kapitel "Kontrollstrukturen"

W. Tasin, M.Sc.


Theoretische Fragen

  • Folgendes Codefragment liest Zeichen von der Tastatur ein und gibt diese (sobald <Enter> gedrückt wurde) wieder aus.
    Dies wird so lange wiederholt bis die Eingabe mit Ctrl-D (Linux/Mac) bzw. Ctrl-Z (Windows) beendet wird.
    Alle eingegebenen Grossbuchstaben (ohne Umlaute) sollen vor der Ausgabe in Kleinbuchstaben umgewandelt werden.
    Ergänzen Sie das folgende Codefragment entsprechend.

int ch;
while ((ch=getchar())!=-1)
{
   if (ch>='A' && ch<='Z')
     ch=ch-'A'+'a';
  
   putchar(ch);
}


  • Folgendes Codefragment ermittelt die Länge eines Strings. Für welchen konstanten String arbeitet dieser Code nicht richtig?
    Wie kann dieses Problem gelöst werden?
const char *meldung="Dies ist ein Test!";
unsigned laenge=0;
do
{
  laenge++;
}
while (*(meldung+laenge)!='\0'); /* Vergleiche das Zeichen mit dem NUL-Character */
 
printf("String: \"%s\" hat die Laenge: %u\n", meldung, laenge);

Für den Leerstring:

const char *meldung="";
unsigned laenge=0;
do
{
  laenge++;
}
while (*(meldung+laenge)!='\0'); /* Vergleiche das Zeichen mit dem NUL-Character */
 
printf("String: \"%s\" hat die Laenge: %u\n", meldung, laenge);

liefert das Programm eine falsche Lösung, denn *(meldung+0) ist '\0'.
Die Variable laenge besitzt bei der Überprüfung des Zeichens im String bereits den Wert 1.

Somit zeigt meldung+1 bereits auf eine Speicheradresse, die nicht mehr gültig ist.
Die Variable laenge wird so lange erhöht bis der Inhalt der Adresse meldung+laenge (zufällig) den Wert '\0' beinhaltet.
In gewissen Fällen kommt es auch zu einem Laufzeitfehler.

Lösung des Problem:
Verwendung einer abweisenden Schleife!

const char *meldung="Dies ist ein Test!";
unsigned laenge=0;
while (*(meldung+laenge)!='\0')    /* Vergleiche das Zeichen mit dem NUL-Character */
{
  laenge++;
}

printf("String: \"%s\" hat die Laenge: %u\n", meldung, laenge);

  • Folgende Codefragmente sollen - falls sinnvoll und möglich - mithilfe des bedingte Auswerteoperators realisiert werden.
if ((wert % divisor) != 0)
  puts("Division geht nicht auf.");
else
  puts("Division geht auf.");

/* Mit bedingtem Auswerteoperator: */
puts((wert % divisor!=0) ? "Division geht nicht auf." : "Division geht auf.");

if (divisor == 0)
  puts("Division darf nicht ausgefuehrt werden!");
else
  printf("Ergebnis ist: %d\n", wert/divisor);

/* Verwendung des bed. Auswerteoperators hier nicht sinnvoll. */ 

if (zeichen != ' ')
  putchar(zeichen);

/* Verwendung des bed. Auswerteoperators hier nicht moeglich. */ 

if (zahl>=0)
  zahl%=10;
else
  zahl=-zahl % 10;

/* Anders dargestellt: */
if (zahl>=0)
  zahl= zahl % 10;
else
  zahl=-zahl % 10;

/* Mit bedingtem Auswerteoperator: */
zahl= ((zahl>=10) ? zahl : -zahl) % 10;  /* Praezedenz beachten!! */

binaerWert=-1;
if (asciiWert>='0' && asciiWert<='9')
  binaerWert=asciiWert-'0';

/* Mit bedingtem Auswerteoperator: */
binaerWert= (asciiWert>='0' && asciiWert<='9') ? asciiWert-'0' : -1;



Links

Uebungen Algorithmen und Datenstrukturen
Unterlagen Algorithmen und Datenstrukturen
Praktikum Algorithmen und Datenstrukturen
Zur Hauptseite