Übungsaufgaben zur Einführung in C


Inhaltsverzeichnis

Übungsaufgaben

  • Neue Aufgaben
  • Übungen zu Variablendeklarationen, Rechnen und printf()/scanf()
  • Übungen zu Feldern, Zeichenketten, Schleifen und if/else
  • Übungen zu Funktionen, Strukturen und Unions
  • Übungen zu Dateien und Switch
  • Lösungen zu den Übungsaufgaben

  • Lösung zum Abschnitt Variablendeklarationen, Rechnen und printf()/sc
  • Lösung zum Abschnitt Felder, Zeichenkette, Schleifen, if/else
  • Lösungen zum Abschnitt Funktionen, Strukturen und Unions
  • Lösungen zum Abschnitt Dateien und switch

  • Übungsaufgaben

    Dieses Kapitel beinhaltet die Übungsaufgaben zu den einzelnen Themenbereichen. Sie bestehen aus einer Beschreibung der Aufgabe.


    Neue Aufgaben

    Tree compare

    Word Funktionen (word, words, wordpos, worddel, wordins, ...)

    wasserdichte Funktionen zum Einfügen / Löschen von Elementen in doppelt verketteten Listen und zum Sortieren / Löschen von ganzen Listen

    Primzahlenberechnung (Sieb des Erathostenes)

    Variable Anzahl Parameter beim Funktionsaufruf

    variable Anzahl Kommandozeilenparameter in variabler Reihenfolge und mit Gruppierung

    Dateiinhalt durchblättern

    PARSE VALUE, PARSE VAR mit UPPER/LOWER

    SUBSTR, STRIP, LASTPOS, POS

    HTML Parser


    Übungen zu Variablendeklarationen, Rechnen und printf()/scanf()

    1. Aufgabe

      Schreiben Sie ein C-Programm, das folgenden Text auf dem Bildschirm ausgibt:

      Mögen
      täten wir schon wollen,
      aber Können
      haben wir uns nicht getraut!
      

      Hinweis: Verwenden Sie das NewLine-Zeichen (\n) an den geeigneten Stellen.

    2. Aufgabe

      Welches Ergebnis liefert das folgende Programm?

         void main(void)
         {
            printf("4 + 6 / 2 = %d\n", 4+6/2);
         }
      

    3. Aufgabe

      Welche Ergebnisse liefert das folgende Programm?

         void main(void)
         {
            int i=0, j=3, k=7;
       
            i = k / j;
            printf("I = %d", i);
            i = k % j;
            printf("I = %d", i);
         }
      

    4. Aufgabe

      Das folgende Programm enthält Fehler! Korrigieren Sie es und testen Sie es daraufhin auf Lauffähigkeit.

      */ Fehlerprogramm /*
      #include <stdio.h>
       
      void main(void);
      {
        int zahl1;
        int zahl2;
       
        printf("Dieser Text); printf("soll einmal auf dem Bildschirm");
        printf("erscheinen, wenn die Fehler"\n);
        printf("bereinigt sind!!!!"),
        zahl1 == 0;
        zahl2 == 3;
       
        printf("zahl1 + zahl2 = %d", zahl1 + zahl2);
      )
      

    5. Aufgabe

      Welche der nachstehenden Variablendeklarationen sind korrekt?

         int a = 2,34;
         char c = 'd";
         int d = 's';
         float fläche = 12.98;
         float value = 123.445;
         int gross = 12345678900000;
      

    6. Aufgabe.

      Welche der nachstehenden Zuweisungen sind falsch?

      a) summe = summe + 12;
      b) a*a = a*5;
      c) 4g = erde + mond;
      d) erg = user + old_wert * 2;
      e) pro = betrag * 1.13;
      

    7. Aufgabe

      Schreiben Sie ein Programm, in dem die beiden Gleitkommavariablen "komma" und "punkt" vereinbart werden. Von der Tastatur sollen Ihnen zwei Werte zugewiesen und diese danach addiert werden. Die Summe beider Zahlen ist auf dem Bildschirm auszugeben.

    8. Aufgabe

      Warum liefert das nachstehende Programm unter Umständen ein falsches Ergebnis?

      #include <stdio.h>
       
      void main(void)
      {
         double summe, zahl;
       
         zahl = 10;
         summe = summe + zahl;
         summe = summe + zahl;
         printf("Ergebnis: %lf", summe);
      }
      

    9. Aufgabe

      Schreiben Sie ein Programm, das eine printf()-Anweisung enthält, die drei Integer-Werte in einem Ausgabe-Feld von 10, 15 und 20 Spalten jeweils in einer eigenen Zeile ausgibt.

    10. Aufgabe

      Ein Kondomhersteller verpackt jeweils 111 Kondome pro Karton. Schreiben Sie ein Programm, das die Anzahl der hergestellten Kondome pro Tag einliest und die Anzahl der benötigten Kartons ausgibt. Dabei soll die Zahl der übrig gebliebenen Kondome, die keinen ganzen Karton mehr füllen, ebenfalls ausgegeben werden.

    11. Aufgabe

      Schreiben Sie ein Programm, daß den durchschnittlichen Verbrauch eines Autos auf 100km errechnet. Die getankten Liter und die gefahrenen Kilometer sollen eingegeben werden können.

    12. Aufgabe

      Schreiben Sie ein Programm, das den Namen des Benutzers und vier seiner letzten Noten einliest. Es soll der Notendurchschnitt mit dem Namen wieder ausgegeben werden. Außerdem soll nach dem Qualifikationsgrad für das Gymnasium (A-D) gefragt werden. Kommentieren Sie das Programm ausreichend und gestalten Sie die Ausgaben auf dem Bildschirm möglichst benutzerfreundlich.

    13. Aufgabe

      Ändern Sie das folgende Programm derart, daß die Nachkommastellen nicht ausgegeben werden.

      #include <stdio.h>
       
      void main(void)
      {
        double schlaege, alter;
       
        printf("Herzschläge pro Minute: ");
        fflush(stdout);
        scanf("%lf",&schlaege);
        printf("Alter in Jahren: ");
        fflush(stdout);
        scanf("%lf",&alter);
        printf("Ihr Herz hat seit Ihrer Geburt \
      %f mal geschlagen.",schlaege*60*24*365.25*alter);
      }
      

    Übungen zu Feldern, Zeichenketten, Schleifen und if/else

    1. Aufgabe

      Welchen Fehler enthält der folgende Ausschnitt?

         char puffer[15];
         strcpy(puffer,"Programmiersprache C");
      

    2. Aufgabe

      Vorgegeben sind folgende Zeichenketten mit den entsprechenden Werten:

         kette1="Crash";
         kette2="Test";
         kette3="Dummies";
      
      Mit welchen Anweisungen müssen diese Ketten verbunden werden, damit das Feld "gruppe" den Namen einer bekannten Popgruppe enthält?

    3. Aufgabe

      Schreiben Sie ein Programm, das einen Satz von der Tastatur liest und die Anzahl des Buchstabens 'e' in diesem Satz bestimmt. Errechnen Sie auch den prozentualen Anteil des Buchstabens an der Gesamtbuchstabenanzahl des Satzes.

    4. Aufgabe

      Was macht das nachstehende Programm?

         #include <stdio.h>
       
         void main(void)
         {
            char satz[80];
            int x = 0;
            int y = 0;
       
            printf("Bitte einen Satz eingeben!\n>>");
            gets(satz);
       
            while(satz[x] != '\0')
            {
               if (satz[x] == 32) y++;
               x++;
            }
           printf("\ny = %d", y);
         }
      

    5. Aufgabe

      Schreiben Sie ein Programm, das einen Satz liest und ohne Satzzeichen und Leerstellen wieder ausgibt.

    6. Aufgabe

      Schreiben Sie ein Programm, das einen Satz liest und jedes Wort in einer eigenen Zeile wieder ausgibt. Die Wortbegrenzung ist das Leerzeichen. Am Ende des Programms soll die Anzahl der Wörter ausgegeben werden.

      Hinweis: Ein Satz kann sowohl mit einem Leerzeichen anfangen, als auch mit einem enden. Des weiteren können zwischen zwei Wörtern mehrere Leerzeichen stehen.

    7. Aufgabe:

      Schreiben Sie ein Programm, das alle ungeraden Zahlen von 1 bis n addiert. Verwenden Sie dazu eine for-Schleife. Die Zahl n wird vom Benutzer eingegeben und das Ergebnis am Bildschirm ausgegeben.

    8. Aufgabe

      Schreiben Sie ein Programm, das eine ganze Zahl "x" vom Benutzer entgegennimmt und das Ergebnis der Berechnung von 2^x ausgibt. Beachten Sie die Problematik der Überschreitung/Unterschreitung der Wertebereiche. Führen Sie die Berechnung, sofern sinnvoll, für Ergebnisvariablen der Typen signed|unsigned short int|int|long int, float, double und long double durch.

      Erweitern Sie das Programm dahingehend, daß für den Typ long double alle Potenzen von 2^0 bis 2^x berechnet und ausgegeben werden.

    9. Aufgabe

      Das nachstehende Programm gibt ein Dreieck aus Sternen auf dem Bildschirm aus. Verändern Sie es derart, daß das Dreieck auf dem Kopf steht.

      #include <stdio.h>
       
      void main(void)
      {
         int zeile = 0;
         int spalte= 0;
       
         for (zeile=1; zeile <= 20; zeile++)
         {
            for (spalte=1; spalte <= zeile; ++spalte)
            {
               printf("*");
            }  /* ende for spalte */
       
            printf("\n");
       
         }  /* ende for zeile */
      }  /* ende main */
      

    10. Aufgabe

      Schreiben Sie ein Programm, das die Fakultät einer eingegebenen Zahl errechnet. Verwenden Sie die for-Schleife. (z.B. !4 = 24)

    11. Aufgabe

      Ändern Sie das Programm aus der vorhergehenden Aufgabe so ab, daß statt der for- eine while-Schleife verwendet wird.

    12. Aufgabe

      Notieren Sie die nachstehenden Aussagen in der Art, daß sie als while-Schleife in einem C-Programm verwendet werden könnten.

    13. Aufgabe

      In einem Programm soll dafür gesorgt werden, daß nur Integer-Werte größer Null bei der Eingabe zugelassen werden. Schreiben Sie diesen Programmteil und nutzen Sie die do-Schleife.

    14. Aufgabe

      Schreiben Sie ein Programm, das die nachstehende Formel berechnet:

         f(x)= 4x^2 + 7x + h
      

      Der Wert der Variablen x soll von der Tastatur eingelesen werden. Wenn x > 7 ist, soll h den Wert 4 annehmen, ist x <= 7, so soll h = -3 sein.

    15. Aufgabe

      Schreiben Sie das Programm zur Berechnung des Benzinverbrauchs aus dem letzten Abschnitt so um, daß die eventuelle Eingabe einer Null durch eine if/else-Abfrage abgefangen wird. Dadurch soll eine Division durch Null verhindert werden.

    16. Aufgabe

      Das folgende Programm soll alle eingegebenen Buchstaben in Großbuchstaben umwandeln. Warum arbeitet es nicht korrekt?

      #include <stdio.h>
      #include <conio.h>
      void main(void)
      {
        char zeichen=' ';
        printf("Das Programm wird durch Eingabe von 0 beendet.\n");
        do
        {
           printf("Zeichen eingeben: ");
           fflush(stdout);
           zeichen=getche();
           if(zeichen>='a' && zeichen<='z')
           {
             zeichen=zeichen-('a'-'A');
           }
           printf("  %c\n",zeichen);
        } while(zeichen!=0);
      }
      

    17. Aufgabe

      Sind die folgenden Aussagen wahr oder falsch:

      1. int a=5,b=18;
        while(a>0 && b!=18)

      2. int zahl=10,wert=100;
        if(zahl!=0 || zahl>wert || wert-zahl==90)

      3. double x=1.0,y=5.7;
        if(x>=.9 && y<=5.0)

      4. int n1=1,n2=17;
        while(n1>0 && n2>0 || n1>n2 && n2!=17)

    18. Aufgabe

      Wie oft wird der Text "Hallo Welt" gedruckt?

      for(x=1; x<6; x=x+1)
      {
         for(y=2;y<=4;y=y+1)
            printf("Hallo Welt\n");
      }
      

    19. Aufgabe

      Geben Sie das kleine Einmaleins in tabellarischer Form aus.

    20. Aufgabe

      Geben Sie für die folgenden for-Schleifen an, wie oft sie durchlaufen werden und welche Werte die Zählvariable dabei annimmt.

      1. for(zaehler=0;zaehler!=10;zaehler=zahler+1)

      2. for(n=10;n>0;n=n-1)

      3. for(x=1;x<=15;x=x+3)

      4. for(anfang=0;anfang<3;anfang=anfang+0.5)

      5. for(i=10;i<0;i=i+2)

    Übungen zu Funktionen, Strukturen und Unions

    1. Aufgabe

      Schreiben Sie eine Funktion, die den Absolutwert (Wert ohne Vorzeichen) eines double-Wertes zurückliefert.

    2. Aufgabe

      Schreiben Sie eine Funktion "vorzeichen", die einen Integer-Wert zurückliefert und einen double-Parameter übernimmt. Ist der double-Wert größer Null, soll 1, ist er kleiner Null, soll -1 und ist er gleich Null, so soll Null zurückgegeben werden.

    3. Aufgabe

      Schreiben Sie eine Funktion "hoch", die einen double-Wert potenziert und das Ergebnis zurückliefert. Der Prototyp sieht folgendermaßen aus:

        double hoch(double wert, int potenz);
      
      Bei einer Potenz = 0 soll der Wert 1, bei einer negativen Potenz der Fehlerwert -1 zurückgegeben werden.

    4. Aufgabe

      Schreiben Sie ein Programm, das zur Berechnung des Durchschnittswertes eine Funktion verwendet.

    5. Aufgabe

      Schreiben Sie eine Funktion, die den Jahrestag berechnet. Sie soll als Parameter Tag, Monat und Jahr bekommen. Achtung: Schaltjahr!
      Hinweis: Ermitteln Sie Zeit und Datum mit DosGetDateTime.

    6. Aufgabe

      Schreiben Sie eine Funktion, die mehrere Integer-Werte von der Tastatur entgegennimmt und den größten zurückliefert.

    7. Aufgabe

      Schreiben Sie ein Programm, daß das aktuelle Datum vom Benutzer entgegennimmt und in einer Struktur (tt.mm.jjjj) speichert.

    8. Aufgabe

      Schreiben Sie ein Programm, daß die Bücher einer Buchhandlung verwalten kann. Dazu wird eine Struktur benötigt, die die Komponenten Inventarnummer, Titel, Preis, Mwst und Stückzahl für bis zu 100 Bücher aufnehmen kann. Es soll zuerst die Mehrwertsteuer eingelesen werden und dann in einer Schleife die restlichen Bücher. Dadurch braucht die Mehrwertsteuer nur einmal eingegeben werden.

    9. Aufgabe

      Schreiben Sie ein Programm, daß bis zu 100 Girokonten verwalten kann. Die Daten eines Kontos sollen mind. Name und Anschrift des Inhabers, dessen Geburtsdatum, die Kontonummer und den momentanen Kontostand umfassen.

      Beschränken Sie das Programm zunächst auf die Anlage neuer Konten (Eingabe) und die Ausgabe der Daten der angelegten Konten. Die Anlage neuer Konten umfaßt die Entgegennahme der Daten per Tastatur, das Speichern der Daten in den entsprechenden Variablen und eine Ausgabe der eingegebenen Daten zur Überprüfung auf Tippfehler. Im Falle eines Tippfehlers muß dieser selbstverständlich korrigiert werden können. Die Ausgabe der Daten umfaßt entweder die Ausgabe aller angelegten Kontendaten oder eines beliebigen Kontos (Auswahl per Kontonummer). Die Art der Ausgabe (alle oder ein bestimmtes) muß der Benutzer auswählen können.

      Hinweis: Man kann sich das Leben leichter machen, indem man die Aufgabe zunächst schrittweise aufgliedert und nicht alles auf einmal programmiert.

    10. Aufgabe

      Schreiben Sie eine Funktion, die in einer Zeichenkette ein Zeichen sucht und es jeweils durch ein anderes ersetzt. Benutzen Sie die folgenden Prototyp:

      void ersetze_zeichen(char *s, char alt, char neu);
      

    Übungen zu Dateien und Switch

    1. Aufgabe

      Ändern Sie das Programm zum Ausgeben eines Satzes ohne Satzzeichen und Leerzeichen so ab, daß statt der if- eine switch-Anweisung verwendet wird.

    2. Aufgabe

      Erweitern Sie Aufgabe der Bücherverwaltung aus dem letzten Abschnitt so, daß die Informationen zu den Büchern in einer Datei gespeichert werden.

    3. Aufgabe

      Erweitern Sie das Programm zur Verwaltung von Girokonten dahingehend, daß die angelegten Konten in einer Datei gespeichert werden. Die Ausgabe der Kontendaten muß auch die gespeicherten Daten berücksichtigen.

      Hinweis: Gliedern Sie die Aufgabe zunächst schrittweise auf.

    4. Aufgabe

      Stellen Sie Überlegungen an, wie im Programm zu Verwaltung von Girokonten eine Funktion zum Suchen von Daten und eine Funktion zum Ändern von Daten realisiert werden kann. Eine Umsetzung in Programmcode ist nicht erforderlich.

    5. Aufgabe

      Schreiben Sie ein Programm, das einzelne Zeichen aus einer Textdatei liest. Diese Zeichen sollen hinsichtlich ihrer Beschaffenheit (Groß-, Kleinbuchstabe, Ziffern, Sonderzeichen) analysiert werden. (Anzahl der jeweiligen Zeichen und prozentualer Anteil)

    6. Aufgabe

      Schreiben Sie ein Programm, das den Inhalt zweier Dateien Zeichen für Zeichen vergleicht. Die eingelesenen Zeichen sollen mitgezählt und bei Feststellung eines Unterschieds der Programmablauf abgebrochen werden.

    7. Aufgabe

      Schreiben Sie ein Programm, das eine Textdatei kopiert. Das Programm erwartet den Namen der Quelldatei und den Namen der Zieldatei als Kommandozeilenparameter. Am Ende soll noch die Anzahl der kopierten Worte ausgegeben werden.

    8. Aufgabe

      Schreiben Sie ein Programm, das Zeichen aus einer Datei liest und prüft, ob es sich um einen Groß- oder Kleinbuchstaben handelt. Ist es ein Großbuchstabe, soll er in einen Kleinbuchstaben, und ist es ein Kleinbuchstabe, so soll er in einen Großbuchstaben umgewandelt werden. Diese neuen Zeichen sollen in eine neue Datei geschrieben werden.

    9. Aufgabe

      Schreiben Sie ein Programm, daß Geburtsdaten aus einer Datei liest und sie mit dem aktuellen Datum vergleicht. Wenn innerhalb der nächsten 7 Tage ein Geburtstag ansteht, soll eine Meldung ausgegeben werden, die den Namen, das Datum und das Alter der Person ausgibt.

      Hinweis: Daten-Datei muß erst angelegt werden!

    10. Aufgabe

      Schreiben Sie ein Programm, daß den Inhalt einer Textdatei zeilenweise umdreht. Die letzte Zeile soll die erste werden.

    11. Aufgabe

      Schreiben Sie ein Programm, daß den Inhalt einer Textdatei zeichenweise umdreht. Das erste Zeichen soll das letzte werden.

    12. Aufgabe

      Sie bekommen von einem anderen Rechner eine Datei übergeben. Auf diesem Rechner werden die Zeichen nach einem Code verschlüsselt, der nicht vollständig mit dem ASCII-Code übereinstimmt. Die interne Darstellung der Zeichen ist in der folgenden Tabelle enthalten:

      ASCII       dezimaler Code des
      Zeichen     fremden Rechners
      ++++++++++++++++++++++++++++++
      a           48
      b           49
      c           50
      d           51
      e           52
      f           53
      g           54
      h           55
      i           116
      j           117
      k           118
      l           119
      m           56
      n           57
      o           97
      p           98
      q           99
      r           100
      s           101
      t           102
      u           103
      v           104
      w           105
      x           106
      y           107
      z           108
      1           109
      2           110
      3           111
      4           112
      5           113
      6           114
      7           115
      8           120
      9           121
      0           122
      

      Das bedeutet, daß z.B. das Zeichen mit dem Code 116 des fremden Rechners ein 'i' sein soll, es wird bei uns aber als 't' dargestellt.

      Beispieldatensatz (siehe T:\C\SATZ.NEU):

      Dt4e tef 4t9
      T4ef30f49e0fl,
      34d 0g5 4t948
      5d48349 R42794dekef48
      4def4wwf igd34.ÿ
      

    Lösungen zu den Übungsaufgaben

    Dieses Kapitel beinhaltet Lösungen zu den einzelnen Übungsaufgaben. Diese Lösungen bestehen aus Quelltexten und ggf. aus Erläuterungen. Da es in der Regel mehr als eine Möglichkeit gibt, eine Lösung zu erreichen, sind diese Lösungen jeweils auch nur als eine von vielen Möglichkeiten zu betrachten.


    Lösung zum Abschnitt Variablendeklarationen, Rechnen und printf()/sc

    anf()

    1. Lösung

    2. Lösung

      Es wird 7 ausgegeben, da erst 6/2 und dann 3+4 berechnet wird.

    3. Lösung

      Es wird:

         I = 2
         I = 1
      
      ausgegeben.

    4. Lösung - Fehlerprogramm

         #include <stdio.h>
       
         void main(void)
         {
            int zahl1=0;
            int zahl2=0;
       
            printf("Dieser Text");
            printf("soll einmal auf dem Bildschirm");
            printf("erscheinen, wenn die Fehler\n");
            printf("bereinigt sind!!!!");
       
            zahl1 = 0;
            zahl2 = 3;
       
            printf("\nzahl1 + zahl2 = %d\n", zahl1 + zahl2);
      }
      

    5. Lösung - Deklarationen

      Es sind nur folgende Variablenvereinbarung korrekt:

         int d='s';
         float value = 123.445;
      

    6. Lösung - Zuweisungen

    7. Lösung - Punkt / Komma

      #include <stdio.h>
      #include <conio.h>
       
      void main(void)
      {
      float komma = 0.0;
      float punkt = 0.0;
       
         printf("\nBitte x eingeben:");
         scanf("%f", &komma);
         printf("\nBitte y eingeben:");
         scanf("%f", &punkt);
         printf("\nx + y = %f", komma+punkt);
      }
      

    8. Lösung - keine Initialisierung

      summe ist vor der ersten Zuweisung nicht initialisiert worden: double summe = 0.0;!

      Fehler c009a wahrscheinlich

    9. Lösung - Ausgabefeldbreite
      /* Aufgabe 10_1_12 */
      #include <stdio.h>
      #include <conio.h>
       
      void main(void)
      {
      int komma = 1;
      int punkt = 2;
      int stich = 3;
       
         printf("\nKomma in 10 Spalten: %10d", komma);
         printf("\nPunkt in 15 Spalten: %15d", punkt);
         printf("\nStich in 20 Spalten: %20d", stich);
      }
      

    10. Lösung - Kondompackungen
      #include <stdio.h>
      #include <conio.h>
       
      void main(void)
      {
      int   anzahl_kondome  = 0;
      float karton          = 0.0;
      float ergebnis        = 0.0;
       
         printf("\nBitte Tagesanzahl der produzierten Kondome eingeben:\n>");
         scanf("%d", &anzahl_kondome);
       
         karton   = anzahl_kondome / 111;
         ergebnis = anzahl_kondome % 111;
       
         printf("\nEs können %.0f Kartone ausgeliefert werden!", karton);
         printf("\nDann sind %.0f Kondome über!", ergebnis);
      }
      

    11. Lösung - Benzinverbrauch

      get_Liter * 100 / gef_km

      /* Programm: Durchschnittsverbrauch */
       
      /*                Einbinden von Hilfsbibliotheken                  */
      #include <conio.h>
      #include <math.h>
       
      /*                      Hauptfunktion                              */
      void main(void)
      {
      /*           Variablendeklaration und Initialiserung               */
        float getankteLiter, gefahreneKilometer, rest, durchVerbrauch;
       
        getankteLiter=0;
        gefahreneKilometer=1;
       
        printf(" \n\n\n");                         /* Benutzereingabe    */
        printf("\t Getankte Liter: ");
        scanf("%f",&getankteLiter);
        printf("\t Gefahrene Kilometer: ");
        scanf("%f",&gefahreneKilometer);
       
        durchVerbrauch = (getankteLiter * 100) / gefahreneKilometer;
       
        printf("\n\n\n");                        /* Ausgabe            */
        printf("\t\t Wenn ich %4.2f Liter getankt habe\n\n",getankteLiter);
        printf("\t\t\t und %5.2f Kilometer gefahren bin,\n\n",
                                                         gefahreneKilometer);
        printf("\t\t so habe ich %5.2f Liter\n\n",durchVerbrauch);
        printf("\t\t\t auf 100 Kilometer verbraucht.\n\n\n");
      }
      

    12. Lösung - Notendurchschnitt
      /* Aufgabe 10_1_16 */
      #include <stdio.h>
      #include <conio.h>
       
      void main(void)
      {
      char name[20];
      char qual  = 'A';
      int  note1 = 0;
      int  note2 = 0;
      int  note3 = 0;
      int  note4 = 0;
      float durch = 0.0;
       
        printf("Name:\n>");
        scanf("%s", name);
        printf("Note1:\n>");
        scanf("%d", &note1);
        printf("Note2:\n>");
        scanf("%d", &note2);
        printf("Note3:\n>");
        scanf("%d", &note3);
        printf("Note4:\n>");
        scanf("%d", &note4);
        printf("Qualifikation:\n>");
        qual = getche();
       
        printf("\nGuten Tag %s!\n", name);
        durch = (note1+note2+note3+note4)/4.0;
        printf("Ihr Notendurchschnitt: %.2f.\n", durch);
        printf("Damit ergibt sich die Qualifikation: %c", qual);
      }
      

    13. Lösung - Herzschlag ohne Nachkommastellen
        printf("Ihr Herz hat seit Ihrer Geburt \
      %.0f mal geschlagen.",schlaege*60*24*365.25*alter);
      

    Lösung zum Abschnitt Felder, Zeichenkette, Schleifen, if/else

    1. Lösung - String zuweisen

      Feld ist zu klein

    2. Lösung - Strings verketten
      #include <stdio.h>
      #include <conio.h>
       
      void main(void)
      {
      char gruppe[20];
      char kette1[10];
      char kette2[10];
      char kette3[10];
       
         strcpy(kette1,"Crash ");
         strcpy(kette2,"Test ");
         strcpy(kette3,"Dummies");
       
         strcpy(gruppe, kette1);
         strcat(gruppe, kette2);
         strcat(gruppe, kette3);
       
         printf("\n%s", gruppe);
      }
      

    3. Lösung - e im Satz zählen
      #include <stdio.h>
      #include <conio.h>
      #include <string.h>
       
      void main(void)
      {
      char satz[80];
      int x, laenge, anzahl=0;
      float prozent;
       
         printf("Bitte einen Satz eingeben!\n>");
         gets(satz);
       
         laenge = strlen(satz);
       
         for (x=0; x<laenge; x++)
         {
           if(satz[x] == 'e')
           {
              anzahl++;
           }
         }
         prozent = 100.0/laenge*anzahl;
         printf("\n%d der Zeichen sind ein 'e'.", anzahl);
         printf("\n%.2lf%% der Zeichen sind ein 'e'.", prozent);
      }
      

    4. Lösung - Leerzeichen zählen

      Das Programm zählt die Anzahl der Leerzeichen in einem Text. Das Leerzeichen hat den ASCII-Code 32.

    5. Lösung - Satz ohne Satzzeichen und Leerzeichen
      #include <stdio.h>
      #include <conio.h>
       
      void main(void)
      {
      int x = 0;
      char satz[100];
       
         printf("\nBitte einen Satz eingeben!.\n"),
         gets(satz);
       
         while(satz[x] != '\0')
         {
           if((satz[x]!=',') && (satz[x]!='.') &&
              (satz[x]!='?') && (satz[x]!='1') &&
              (satz[x]!=' '))
           {
               printf("%c", satz[x]);
           }
           x++;
         }
      }
       
      bzw. besser:
      #include <stdio.h>
       
      void main(void)
      {
        char satz[80+1];
        int laenge=0, i=0, t=0;
       
        printf("Bitte einen Satz eingeben:\n");
        gets(satz);
        for(i=strlen(satz)-1;i>=0;i--)
        {
           if(satz[i]==' ') satz[i]='\0';
           else break;
        } /* ende for */
        for(i=0;i<strlen(satz);i++)
        {
           if(satz[i]==' ')
           {
             for(t=i; t<strlen(satz); t++)
                satz[t]=satz[t+1];
             i=-1;
           }
           else break;
        } /* ende for */
        printf("\nNeuer Satz: >%s<\n",satz);
       
      } /* ende main */
       
      

    6. Lösung - Satz als Wort / Zeile ausgeben
      #include <stdio.h>
      #include <conio.h>
       
      void main(void)
      {
      int x = 0;
      char satz[100];
       
         printf("\nBitte einen Satz eingeben!.\n"),
         gets(satz);
       
         while(satz[x] != '\0')
         {
           if(satz[x]!=' ')
               printf("%c", satz[x]);
           else
              printf("\n");
           x++;
         }
      }
      

    7. Lösung - ungerade / gerade Zahlen bis n addieren
      #include <stdio.h>
       
      void main(void)
      {
        int i=0, ergebnis=0, n=11;
       
        for(i=1;i<=n;i+=2)
           ergebnis=ergebnis+i;
        printf("Ergebnis für n=%d ist %d.\n",n,ergebnis);
      }
      
         #include <conio.h>
       
         void main(void)
         {
         int n=0, x;
         float summe=0.0;
       
            printf("Bitte n eingeben:\n>");
            scanf("%d", &n);
       
            for (x = 0; x <= n; x+=2)
            {
              summe += x;
            }
            printf("%.0f", summe);
      }
      

    8. Lösung - 2^x ausrechnen

      nicht verfügbar

    9. Lösung - Dreieck auf dem Kopf ausgeben
         #include <stdio.h>
         #include <conio.h>
       
         void main(void)
         {
         int zeile = 0;
         int spalte= 0;
       
           for (zeile=20; zeile >= 1; zeile--)
           {
               for (spalte=1; spalte <= zeile; ++spalte)
               {
                 printf("*");
               }
           printf("\n");
           }
         }
      

    10. Lösung - Fakultät berechnen / for
         #include <stdio.h>
         #include <conio.h>
       
         void main(void)
         {
         int n,x;
         double produkt = 1;
       
            printf("\t\t****************Fakultätsberechnung***************\n");
            printf("\nBitte n eingeben!\n>");
            scanf("%d", &n);
       
            for (x=1; x<=n; x++)
            {
              produkt *= x;
            }
            printf("\n%i! = %.0lf", n, produkt);
         }
      

    11. Lösung - Fakultät berechnen / while
         #include <stdio.h>
         #include <conio.h>
       
         void main(void)
         {
         int n,x;
         double produkt = 1;
       
            printf("\t\t****************Fakultätsberechnung***************\n");
            printf("\nBitte n eingeben!\n>");
            scanf("%d", &n);
       
            x=1;
            while (x <= n)
            {
              produkt *= x;
              x++;
            }
            printf("\n%i! = %.0lf", n, produkt);
         }
      

    12. Lösung - Schleifenbedingungen / while

    13. Lösung - nur eingegebene Integerwerte > 0 akzeptieren
         #include <stdio.h>
         #include <conio.h>
       
         void main(void)
         {
         int n;
       
           do
           {
              printf("\nBitte n eingeben!\n>");
              scanf("%d", &n);
       
           } while (n <= 0);
       
           printf("\nEndlich ein Integerwert, der größer als Null ist! %d", n);
         }
      

    14. Lösung - Formel berechnen
      #include <stdio.h>
      #include <conio.h>
       
      void main(void)
      {
         double y = 0.0;
         int   x = 0;
         int   h = 0;
       
         printf("\nBitte x eingeben!\n>");
         scanf("%d", &x);
       
         if (x > 7)
            h = 4;
         else
            h = -3;
       
         y = 4*x*x + 7*x + h;
         printf("\nErgebnis: %.0lf", y);
      }
       
      oder
       
      #include <stdio.h>
      #include <conio.h>
      #include <math.h>
       
      void main(void)
      {
         double y = 0.0, x=0.0, h=0.0;
       
         printf("\nBitte x eingeben!\n>");
         scanf("%lf", &x);
       
         if (x > 7) h = 4;
         else       h = -3;
       
         z = 4*pow(x,2.0) + 7*x + h;
         printf("\nErgebnis: %.2lf", y);
      }
      

    15. Lösung - Spritverbrauch / Test auf Division durch 0
      /* Programm: Durchschnittsverbrauch  A101_14.c */
       
      /*                Einbinden von Hilfsbibliotheken                  */
      #include <conio.h>
      #include <math.h>
       
      /*                      Hauptfunktion                              */
      void main(void)
      {
      /*           Variablendeklaration und Initialiserung               */
        float getankteLiter, gefahreneKilometer, rest, durchVerbrauch;
       
        getankteLiter=0;
        gefahreneKilometer=1;
       
        printf(" \n\n\n");                         /* Benutzereingabe    */
        printf("\t Getankte Liter: ");
        scanf("%f",&getankteLiter);
        printf("\t Gefahrene Kilometer: ");
        scanf("%f",&gefahreneKilometer);
       
        if (gefahreneKilometer == 0)               /* Division by 0 ?    */
          printf("Fehler: Division durch Null!");
        else
        {
          durchVerbrauch = (getankteLiter * 100) / gefahreneKilometer;
       
          printf("\n\n\n");                        /* Ausgabe            */
          printf("\t\t Wenn ich %4.2f Liter getankt habe\n\n",getankteLiter);
          printf("\t\t\t und %5.2f Kilometer gefahren bin,\n\n",
                                                           gefahreneKilometer);
          printf("\t\t so habe ich %5.2f Liter\n\n",durchVerbrauch);
          printf("\t\t\t auf 100 Kilometer verbraucht.\n\n\n");
        }                                          /* Ende ELSE-Zweig     */
      }
      

    16. Lösung - a->A hört nicht auf

      while(zeichen!=0) müßte while(zeichen!='0') heißen

    17. Lösung - Abbruchbedingungen wahr oder falsch

      1. falsch

      2. wahr

      3. falsch

      4. wahr

    18. Lösung - wie oft wird Hallo Welt gedruckt

      Lösung: 15 mal

    19. Lösung - kleines Einmaleins in Tabellenform

      Lösung:

      #include <stdio.h>
      void main(void)
      {
        int x=0,y=0;
        for(x=1;x<=10;x=x+1)
        {
           printf("\n");
           for(y=1;y<=10;y=y+1)
               printf("%4i",x*y);
        }
      }
      

    20. Lösung - Anzahl Durchläufe bei for-Schleifen

      1. 10 Durchläufe: 0 1 2 3 4 5 6 7 8 9 10 -> zähler: 10

      2. 10 Durchläufe: 10 9 8 7 6 5 4 3 2 1 -> n: 0

      3. 5 Durchläufe: 1 4 7 10 13 -> x: 16

      4. 6 Durchläufe: 0 0.5 1 1.5 2 2.5 -> anfang: 3.0

      5. nie -> i: 10

    Lösungen zum Abschnitt Funktionen, Strukturen und Unions

    1. Lösung - Absolutwert eines float-wertes
      #include <stdio.h>
      #include <conio.h>
       
      float f_abs(float para)
      {
         if (para < 0) para *= (-1);
         return(para);
      }
       
      void main(void)
      {
      float y = 0.0;
      float e = 0;
       
         printf("\nBitte x eingeben!\n>");
         scanf("%f", &y);
       
         e = f_abs(y);
         printf("\nAbsolutwert von x: %f", e);
      }
      

    2. Lösung - Vorzeichenfunktion
      #include <stdio.h>
      #include <conio.h>
       
      int vorzeichen(float wert)
      {
         if (wert<0) return(-1);
         if (wert==0) return(0);
         if (wert>0) return(1);
      }
       
      void main(void)
      {
      int   x = 0;
      float y = 0.0;
       
         printf("\nBitte x eingeben!\n>");
         scanf("%f", &y);
       
         x = vorzeichen(y);
      }
      

    3. Lösung - double wert potenzieren
      double hoch(double wert, int potenz)
      {
        int i=0;
        double ergebnis=1.0;
       
        if(potenz==0) return(1);
        if(potenz<0)  return(-1);
        for(i=1;i<=potenz;i++)
           ergebnis=ergebnis*wert;
        return(ergebnis);
      }
      
      #include <stdio.h>
      #include <conio.h>
       
      float hoch(float wert, int potenz)
      {
      int   x   = 0;
      float erg = 0.0;
       
         if (potenz<0) return(-1);
         if (potenz==0) return(1);
         if (potenz==1) return(wert);
       
         erg = wert;
         for(x=2; x<=potenz; x++)
         {
            erg *= wert;
         }
         return(erg);
      }
       
      void main(void)
      {
      int   x = 0;
      float y = 0.0;
      float erg = 0.0;
       
         printf("\nBitte x eingeben!\n>");
         scanf("%f", &y);
         printf("\nBitte Potenz eingeben!\n>");
         scanf("%d", &x);
       
         printf("Die %d. Potenz von %f = %f", x, y, (erg = hoch(y,x)));
      }
      

    4. Lösung - Durchschnittswert errechnen
      #include <stdio.h>
      #include <conio.h>
       
      float durchschnitt(int feld[], int n)
      {
      int   y   = 0;
      float erg = 0.0;
       
         for(y=0; y<=n; y++)
         {
            erg += feld[y];
         }
         return(erg/n);
      }
       
      void main(void)
      {
      int   x = 1;
      int   feld[100];
      char  abfrage = 'j';
      /* float erg = 0.0; */
       
         for (x=0; x<=99; x++)
         {
            feld[x] = 0;
         }
       
         x=0;
         while(((abfrage == 'j') || (abfrage == 'J')) && (x <= 99))
         {
            printf("\nBitte %d. Zahl eingeben!\n>", x+1);
            scanf("%d", &feld[x]);
       
            printf("\nNoch eine Zahl eingeben?\n>");
            abfrage = getche();
            x++;
         }
       
         printf("\nDer Durchschnitt ist: %.2f", (durchschnitt(feld, x)));
       
      }
      

    5. Lösung - Jahrestag berechnen / OS/2 + DOS
      #include <stdio.h>
      #include <os2.h>
      #include <time.h>
      #include <string.h>
       
      void main(void)
      {
          DATETIME DateTime;
          APIRET rc;
          char *wochentag[]={"Montag","Dienstag","Mittwoch","Donnerstag",
                             "Freitag","Samstag","Sonntag"};
          int ergebnis;
       
          time_t zeit;
          struct tm *zeit_s;
          char zeitstring[60];
       
       
          time(&zeit);
          zeit_s=localtime(&zeit);
          strcpy(zeitstring,asctime(zeit_s));
          printf("\nZeit: %sStunden: %c%c\n\n",asctime(zeit_s),
                zeitstring[11],zeitstring[12]);
       
       
       
          rc=DosGetDateTime(&DateTime);
       
          switch(DateTime.month)
          {
            case 1 :
            {
               ergebnis=DateTime.day;
               break;
            }
            case 2 :
            {
               ergebnis=31+DateTime.day;
               break;
            }
            case 3 :
            {
               ergebnis=31+28+DateTime.day;
               break;
            }
            case 4 :
            {
               ergebnis=31+28+31+DateTime.day;
               break;
            }
            case 5 :
            {
               ergebnis=31+28+31+30+DateTime.day;
               break;
            }
            case 6 :
            {
               ergebnis=31+28+31+30+31+DateTime.day;
               break;
            }
            case 7 :
            {
               ergebnis=31+28+31+30+31+30+DateTime.day;
               break;
            }
            case 8 :
            {
               ergebnis=31+28+31+30+31+30+31+DateTime.day;
               break;
            }
            case 9 :
            {
               ergebnis=31+28+31+30+31+30+31+31+DateTime.day;
               break;
            }
            case 10 :
            {
               ergebnis=31+28+31+30+31+30+31+31+30+DateTime.day;
               break;
            }
            case 11 :
            {
               ergebnis=31+28+31+30+31+30+31+31+30+31+DateTime.day;
               break;
            }
            case 12 :
            {
               ergebnis=31+28+31+30+31+30+31+31+30+31+30+DateTime.day;
               break;
            }
          }
       
          if(DateTime.year%4==0 && DateTime.month>2) ergebnis++;
       
          printf("\n==================================================================
      =============\n\
      Date:    %s, %02d.%02d.%02d ist der %03d. Tag im Jahr.\nTime:    %02d:%02d:%02d\
      n\
      ===============================================================================\
      n",
               wochentag[DateTime.weekday-1],DateTime.day,DateTime.month,
               DateTime.year,ergebnis,
               DateTime.hours,DateTime.minutes,DateTime.seconds);
       
       
      } /* Ende main */
      
      /***********************************************************************/
      /* Funktion errechnet den Tag des Jahres (z.B.134). Parameter sind Tag,*/
      /* Monat und Jahr eines beliebigen Datums.                             */
      /***********************************************************************/
      int day_of_year_errechnen(int r_tag, int r_monat, int r_jahr)
      {
      int monat[13];
       
         monat[0] = 0;
         monat[1] = 31;
         monat[2] = 28;
         monat[3] = 31;
         monat[4] = 30;
         monat[5] = 31;
         monat[6] = 30;
         monat[7] = 31;
         monat[8] = 31;
         monat[9] = 30;
         monat[10] = 31;
         monat[11] = 30;
         monat[12] = 31;
       
         if ((r_jahr % 4) == 0) monat[2] = 29;
       
         for (x=0; x<=((r_monat)-1); x++)
         {
            day_of_year += monat[x];
         }
         return(day_of_year += (r_tag));
      }
      

    6. Lösung - groessten eingegebenen Wert ermitteln
      #include <stdio.h>
       
      int groesser_als(int feld[], int n)
      } /* Ende main */
       int x=0;
       int alt_wert=feld[x];
       
       for (x=1; x<=n; x++)
       {
         int neu_wert=feld[x];
       
         if (alt_wert < neu_wert)
         {
           alt_wert = neu_wert;
         }
       }
       return(alt_wert);
      }
       
      void main(void)
      {
       int feld[100];
       int n=0;
       
       clrscr();
       printf("\nBitte 9999 als Abbruchkriterium eingeben!\n");
       for(n=0; n<=100; n++)
       {
         printf("\nBitte %d. Zahl eingeben => ", n+1);
         scanf("%d", &feld[n]);
         if (feld[n] == 9999)
            break;
       }
       n--;
       printf("\nDie größte der eingegebenen Zahlen ist: %d", groesser_als(feld,
       n));
      }
      

    7. Lösung - Datum vom Benutzer -> Struktur
      #include <conio.h>
      #include <stdio.h>
       
      /*  eventuelle EIGENE FUNKTIONEN, TYPEN, etc. EXTERNE VARIABLEN    */
       
      /*                      Hauptprogramm                              */
       
      void main(void)
      {
       
      /* Vereinbarungsteil */
         struct date                /* Datumsstruktur */
         {
            int  Tag;
            int  Monat;
            int  Jahr;
         };
         struct date DATUM;
       
         int tag_gueltig   = 0;    /* Merker zur Feststellung */
         int monat_gueltig = 0;    /* der Korrekheit des      */
         int jahr_gueltig  = 0;    /* eingegebenen Datums     */
         int x             = 0;
       
      /* Verarbeitungsteil */
      /* while((tag_gueltig != 0) || (monat_gueltig != 0) ||
                                     (jahr_gueltig != 0)); */
         for (x=0;
              ((tag_gueltig == 0) || (monat_gueltig == 0) || (jahr_gueltig == 0
              x++)
         {
      /* Eingabe und Prüfung Tag */
            printf("\n\nBitte heutigen Tag eingeben: (Form: 09) ");
            scanf("%d", &DATUM.Tag);
            printf("\n");
            if ((DATUM.Tag < 1) || (DATUM.Tag > 31))
            {
               printf("Ungültige Tageszahl!");
            }
            else
            {
               tag_gueltig = 1;
            }
       
      /* Eingabe und Prüfung Monat */
            printf("\nBitte aktuellen Monat eingeben: (Form: 03) ");
            scanf("%d", &DATUM.Monat);
            printf("\n");
            if ((DATUM.Monat < 1) || (DATUM.Monat > 12))
            {
               printf("Ungültiger Monat!");
            }
            else
            {
               monat_gueltig = 1;
            }
       
      /* Eingabe und Prüfung Jahr */
            printf("\nBitte aktuelles Jahr eingeben: (Form: 1971) ");
            scanf("%d", &DATUM.Jahr);
            printf("\n");
            if ((DATUM.Jahr < 1994) || (DATUM.Jahr > 2000))
            {
               printf("Ungültiges Jahr!");
            }
            else
            {
               jahr_gueltig = 1;
            }
       
      /* Zurücksetzen der Merker, falls eine Komponente Falsch war */
            if ((tag_gueltig == 0) || (monat_gueltig == 0) ||
                                      (jahr_gueltig == =));
            {
               printf("\n Das kann ganz unmöglich das heutige Datum sein!");
               tag_gueltig   = 0;
               monat_gueltig = 0;
               jahr_gueltig  = 0;
            }
         } /* Ende for */
       
      /*
       * Ausgabe des aktuellen Datums
       */
       printf("\n\nDas aktuelle Datum ist:\n");
       printf("Tag  : %4d\n", DATUM.Tag);
       printf("Monat: %4d\n", DATUM.Monat);
       
      } /*     end- main      */
      

    8. Lösung - Bücherverwaltung
      #include <conio.h>
      #include <stdio.h>
       
      #define MAX 100
       
      /*                      Hauptprogramm                              */
      void main(void)
      {
       
      /* Vereinbarungsteil */
      struct buch
      {
         char inv_nr[5];
         char titel[50];
         char preis[6];
         char mwst[6];
         char menge[5];
      }
      };
      struct buch BUCHSATZ[MAX];
      int x = 0;
      char abfrage = 'j';
       
         printf("\nBitte Mehrwertsteuer eingeben!\n>");
         gets(BUCHSATZ[0].mwst);
       
         while(((abfrage == 'j') || (abfrage == 'J')) && (x <= MAX))
         {
            printf("\nBitte %d.Datensatz eingeben!", x+1);
            printf("\nInventarnummer: ");
            gets(BUCHSATZ[x].inv_nr);
            printf("Titel         : ");
            gets(BUCHSATZ[x].titel);
            printf("Preis         : ");
            gets(BUCHSATZ[x].preis);
            printf("Menge         : ");
            gets(BUCHSATZ[x].menge);
            strcpy(BUCHSATZ[x].mwst, BUCHSATZ[0].mwst);
       
            printf("\nNoch einen Datensatz eingeben?\n>");
            abfrage = getche();
            x++;
         }
      } /*     end- main      */
      

    9. Aufgabe 9 - Kontoverwaltung (Lösung komplett)
      #include <stdio.h>
      #include <string.h>
      #include <conio.h>
      #include <stdlib.h>
       
      #define max_string 120     /* maximale stringlänge definieren */
       
      /* Funktionsprototypen */
      void clrscr(void);
      void blau(void);
      void normal(void);
      void gotoxy(int, int);                  /* x-koordinate, y-koordinate */
      void satz_eingeben(int,int);            /* fortlaufende satznummer,kontonummer *
      /
      void satz_ausgeben(int);                /* höchste satznummer */
      void satz_speichern(FILE *, int);       /* dateizeiger, fortlaufende satznummer
      */
      int satz_lesen(FILE *);                 /* höchste satznummer, dateizeiger */
      FILE * datei_oeffnen(char [], char []); /* dateizeiger, dateiname, modus */
       
      /* Datenstruktur für Konto */
      struct konto_s {
            char nname[80+1];
            char vname[80+1];
            char strasse[max_string+1];
            char strasse2[max_string+1];
            int plz;
            char stadt[80+1];
            double kontostand;
            int kontonummer;
      } konto[100];
       
       
       
      void main(int argc, char *argv[])
      {
         int i=0, rc=0;  /* i: satznummer, rc: Return Code */
         int knummer=0;  /* kontonummer für automatische zuteilung */
         char janein='j';
         FILE *datei1, *datei2;
       
         datei1=datei_oeffnen("SATZ.TXT","a+");
       
         rc=fseek(datei1, 0L, SEEK_SET);  /* Dateizeiger an den Anfang setzen */
         if(rc!=0)
         {
            printf("\nProblem beim Setzen der Dateiposition!\n");
            printf("Weiter mit einer beliebigen Taste."); fflush(stdout);
            janein=getch();
         }
       
      do
      {
         clrscr();
         printf("Auswahl:\n\n");
         printf("1. Datensätze anzeigen lassen.\n");
         printf("2. Neuen Datensatz hinzufügen.\n");
         printf("X. Programmende.\n");
         janein=getche();
         if(janein=='1')
         {
            /* bestehende Sätze lesen und anzeigen */
            i=satz_lesen(datei1);
            knummer=(konto[i-1].kontonummer)+1;
            satz_ausgeben(i);
            printf("Gelesene Sätze: i=%d\n",i);
            printf("Nächste Kontonummer: %d\n",knummer);
            printf("Weiter mit einer beliebigen Taste."); fflush(stdout);
            janein=getch();
         } /* Ende Sätze anzeigen lassen */
         if(janein=='2')
         {
            /* neue Sätze hinzufügen */
            do
            {
              satz_eingeben(i,knummer++);
              satz_speichern(datei1,i);
              printf("Einen weiteren Datensatz eingeben? ");
              fflush(stdout); fflush(stdin);
              scanf("%c",&janein);
              fflush(stdin);
              i++;
            } while((janein=='j' || janein=='J') && i<100);
         } /* Ende Sätze hinzufügen */
      }
      while(janein!='x' && janein!='X');
       
         fclose(datei1);
       
         /* alle sätze ausgeben */
         satz_ausgeben(i);
       
      } /* Ende main */
       
       
      /*********************************************/
      /* Datei öffnen, Parameter: Dateiname, Modus */
      /* Return: Dateizeiger                       */
      FILE * datei_oeffnen(char name[], char modus[])
      {
         FILE *datei;
         datei=fopen(name,modus);
         if(datei==NULL)
         {
            printf("\nFehler beim Öffnen der Datei %s, Modus %s.\n",name,modus);
            printf("Unter Umständen greift bereits ein Programm exklusiv auf diese Dat
      ei zu.\n");
            exit(8);
         }
         return datei;
      }
       
      /***************************************************************/
      /* Datensatz eingeben, Parameter: Datensatznummer, Kontonummer */
      void satz_eingeben(int i, int knummer)
      {
           clrscr();
           printf("Bitte den Nachnamen angeben : \n");
           printf("Bitte den Vornamen angeben  : \n");
           printf("Bitte die Strasse angeben   : \n");
           printf("                            : \n");
           printf("Bitte die PLZ angeben       : \n");
           printf("Bitte die Stadt angeben     : \n");
           printf("Bitte den Kontostand angeben: \n");
       
      blau();
      gotoxy(31,1);
      printf("                             ");
      gotoxy(31,2);
      printf("                             ");
      gotoxy(31,3);
      printf("                             ");
      gotoxy(31,4);
      printf("                             ");
      gotoxy(31,5);
      printf("                             ");
      gotoxy(31,6);
      printf("                             ");
      gotoxy(31,7);
      printf("                             ");
       
           gotoxy(31,1);
           gets(konto[i].nname);
           gotoxy(31,2);
           gets(konto[i].vname);
           gotoxy(31,3);
           gets(konto[i].strasse);
           gotoxy(31,4);
           gets(konto[i].strasse2);
           gotoxy(31,5);
           scanf("%d",&konto[i].plz); fflush(stdin);
           gotoxy(31,6);
           gets(konto[i].stadt);
           gotoxy(31,7);
           scanf("%lf",&konto[i].kontostand); fflush(stdin);
      normal();
           konto[i].kontonummer=knummer;
       
           printf("\n\n   Nachname: %s\n",konto[i].nname);
           printf("    Vorname: %s\n",konto[i].vname);
           printf("    Strasse: %s\n",konto[i].strasse);
           printf(" Kontostand: %.2lf\n",konto[i].kontostand);
           printf("Kontonummer: %06d\n\n",konto[i].kontonummer);
      } /* Ende Datensatz eingeben */
       
      /*************************************************************************/
      /* Datensatz KONTO speichern, Parameter: Filehandler und Datensatznummer */
      void satz_speichern(FILE *datei1, int i)
      {
           fprintf(datei1,"%s\n",konto[i].nname);
           fprintf(datei1,"%s\n",konto[i].vname);
           fprintf(datei1,"%s\n",konto[i].strasse);
           fprintf(datei1,"%.2lf\n",konto[i].kontostand);
           fprintf(datei1,"%06d\n",konto[i].kontonummer);
           /*fprintf(datei1,"\n");*/ /* ab in die nächste zeile */
      } /* Ende satz_speichern */
       
      /*********************************************************/
      /* Datensätze lesen und zuweisen. Parameter: Dateizeiger */
      /* Return: anzahl gelesene Sätze                         */
      int satz_lesen(FILE *datei1)
      {
           int i=0,          /* fortlaufende satznummer des kontos */
               t=0,          /* nummer des aktuellen zeichens der zeile */
               zeilenr=0;    /* nummer der gelesenen zeile */
           char zeile[80+1];
       
           do                /* alle zeilen der datendatei lesen */
           {
              do             /* aktuelle zeile lesen */
              {
                 zeile[t]=fgetc(datei1);
                 t++;
              }  while(zeile[t-1]!='\n' && t<max_string && !feof(datei
      1));
              zeilenr++;
              zeile[t-1]='\0'; /* gelesenes und zugewiesenes CR/LF durch \0 ersetzen *
      /
              switch(zeilenr)  /* zuweisung zeile->strukturelement */
              {
                 case 1: strcpy(konto[i].nname,zeile); break;
                 case 2: strcpy(konto[i].vname,zeile); break;
                 case 3: strcpy(konto[i].strasse,zeile); break;
                 case 4: konto[i].kontostand=atof(zeile); break;
                 case 5:
                    {
                       konto[i].kontonummer=atoi(zeile);
                       i++;
                       zeilenr=0;
                       break;
                    }
                 default: break;
              }
              t=0;
           }  while(!feof(datei1));
       
         return i; /* anzahl gelesene sätze */
      } /* Ende satz_lesen */
       
      /******************************************************/
      /* Datensätze ausgeben, Parameter: höchste satznummer */
      void satz_ausgeben(int i)
      {
         int zaehler=0;
       
         clrscr();
         for(zaehler=0;zaehler<i;zaehler++)
         {
           printf("\n   Nachname: %s\n",konto[zaehler].nname);
           printf("    Vorname: %s\n",konto[zaehler].vname);
           printf("    Strasse: %s\n",konto[zaehler].strasse);
           printf(" Kontostand: %.2lf\n",konto[zaehler].kontostand);
           printf("Kontonummer: %06d\n\n",konto[zaehler].kontonummer);
           printf("<Weiter mit Taste>\n");
           getch();
         }
      }
       
      /**********************/
      /* Bildschirm löschen */
      void clrscr(void)
      {
        printf("\x1B[2J"); fflush(stdout);
      }
       
      /********************************************************/
      /* Cursor positionieren, Parameter: X- und Y-Koordinate */
      void gotoxy(int x, int y)
      {
        printf("\x1B[%i;%iH",y,x); fflush(stdout);
      }
       
      void blau(void)
      {
        printf("\x1B[0;37;44m"); fflush(stdout);
      }
       
      void normal(void)
      {
        printf("\x1B[0m"); fflush(stdout);
      }
      

    10. Lösung - Zeichen suchen und ersetzen
      #include <stdio.h>
      #include <string.h>
       
      void ersetze_zeichen(char *s, char alt, char neu);
       
      void main(void)
      {
         ersetze_zeichen("Dies ist ein Testtext.",'e','#');
      }
       
      void ersetze_zeichen(char *s, char alt, char neu)
      {
         int i=0;
         for(i=0;i<strlen(s);i++)
            if(s[i]==alt) s[i]=neu;
         printf("%s\n",s);
      }
      

    Lösungen zum Abschnitt Dateien und switch

    1. Lösung - Satz ohne Satzzeichen mit switch
         #include <stdio.h>
         #include <conio.h>
       
         void main(void)
         {
         int x = 0;
         char satz[100];
       
            printf("\nBitte einen Satz eingeben!.\n"),
            gets(satz);
       
            while(satz[x] != '\0')
            {
              switch(satz[x])
              {
                case ',':
                case '.':
                case '?':
                case '!':
                case ' ':
                   break;
                default:
                   printf("%c", satz[x]);
             }
             x++;
           }
        }
      

    2. Lösung - Bücher speichern

      Lösung liegt nicht vor

    3. Lösung - Konto speichern

      Siehe Lösung im vorherigen Abschnitt

    4. Lösung - Zeilenweise umdrehen

      fgetpos / fsetpos / fseek

    5. Lösung - Zeichen aus Datei lesen und analysieren mit switch
      #include <stdio.h>
      #include <conio.h>
       
      void main(void)
      {
      FILE *datei_ptr;
      int zeichen;
       
         datei_ptr = fopen("EINS.TXT", "rt");
         if (datei_ptr == NULL)
         {
            printf("Datei nicht gefunden!"); /* Zugriff nicht erfolgreich ! */
            exit();
         }
         else                                /* Zugriff erfolgreich         */
         {
            zeichen= fgetc(datei_ptr);
       
            while (!feof(datei_ptr))
            {
               switch(zeichen)
               {
                  case 'a':
                  case 'b':
                  case 'c':
                  case 'd':
                  case 'e':
                  case 'f':
                  case 'g':
                  case 'h':
                  case 'i':
                  case 'j':
                  case 'k':
                  case 'l':
                  case 'm':
                  case 'n':
                  case 'o':
                  case 'p':
                  case 'q':
                  case 'r':
                  case 's':
                  case 't':
                  case 'u':
                  case 'v':
                  case 'w':
                  case 'x':
                  case 'y':
                  case 'z': printf("Es ist ein Kleinbuchstabe!\n");
                            break;
                  case 'A':
                  case 'B':
                  case 'C':
                  case 'D':
                  case 'E':
                  case 'F':
                  case 'G':
                  case 'H':
                  case 'I':
                  case 'J':
                  case 'K':
                  case 'L':
                  case 'M':
                  case 'N':
                  case 'O':
                  case 'P':
                  case 'Q':
                  case 'R':
                  case 'S':
                  case 'T':
                  case 'U':
                  case 'V':
                  case 'W':
                  case 'X':
                  case 'Y':
                  case 'Z': printf("Es ist ein Großbuchstabe!\n");
                            break;
                  case '0':
                  case '1':
                  case '2':
                  case '3':
                  case '4':
                  case '5':
                  case '6':
                  case '7':
                  case '8':
                  case '9': printf("Es ist eine Ziffer!\n");
                            break;
                  default : printf("Nichts von alledem !\n");
               }
               zeichen= fgetc(datei_ptr);
            }
            fclose(datei_ptr);
         }
      }
      

    6. Lösung - Inhalt zweier Dateien zeichenweise vergleichen
      #include <stdio.h>
      #include <conio.h>
       
      void main(void)
      {
      FILE *datei_ptr_1;
      FILE *datei_ptr_2;
      unsigned long int position;
      int erster, zweiter;
       
         datei_ptr_1 = fopen("EINS.TXT", "rt");
         if (datei_ptr_1 == NULL)
         {
            printf("Datei 1 nicht gefunden!"); /* Zugriff1 nicht erfolgreich */
            exit();
         }
         else                                  /* Zugriff1 erfolgreich       */
         {
            datei_ptr_2 = fopen("ZWEI.TXT", "rt");
            if (datei_ptr_2 == NULL)
            {
               printf("Datei 2 nicht gefunden!"); /* Zugriff2 nicht erfolgr. */
               exit();
            }
            else
            {
               position = 1;                      /* Zugriff2 erfolgreich !  */
               erster = fgetc(datei_ptr_1);
               zweiter= fgetc(datei_ptr_2);
       
               while (erster == zweiter && !feof(datei_ptr_1)
                                        && !feof(datei_ptr_2))
              {
                 position++;
                 erster = fgetc(datei_ptr_1);
                 zweiter= fgetc(datei_ptr_2);
              }
       
              if (erster != zweiter)
              {
                 printf("\nUnterschied bei %li Zeichen.\a", position);
              }
              else
              {
                 printf("\nVergleich ok!\a");
              }
               fclose(datei_ptr_1);
               fclose(datei_ptr_2);
            }
         }
      }
      

    7. Lösung - Datei kopieren

      Lösung liegt nicht vor

    8. Lösung - Zeichen aus Datei lesen und a->A / A->a konvertieren und speichern
      #include <stdio.h>
      #include <conio.h>
       
      void main(void)
      {
      FILE *datei_ptr;
      FILE *datei_ptr_2;
      int zeichen;
       
         datei_ptr_2 = fopen("VIER.TXT","wt");
         datei_ptr = fopen("EINS.TXT", "rt");
         if (datei_ptr == NULL)
         {
            printf("Datei nicht gefunden!"); /* Zugriff nicht erfolgreich ! */
            exit();
         }
         else                                /* Zugriff erfolgreich         */
         {
            zeichen= fgetc(datei_ptr);
       
            while (!feof(datei_ptr))
            {
               switch(zeichen)
               {
                  case 'a':
                  case 'b':
                  case 'c':
                  case 'd':
                  case 'e':
                  case 'f':
                  case 'g':
                  case 'h':
                  case 'i':
                  case 'j':
                  case 'k':
                  case 'l':
                  case 'm':
                  case 'n':
                  case 'o':
                  case 'p':
                  case 'q':
                  case 'r':
                  case 's':
                  case 't':
                  case 'u':
                  case 'v':
                  case 'w':
                  case 'x':
                  case 'y':
                  case 'z': fputc(toupper(zeichen), datei_ptr_2);
                            break;
                  case 'A':
                  case 'B':
                  case 'C':
                  case 'D':
                  case 'E':
                  case 'F':
                  case 'G':
                  case 'H':
                  case 'I':
                  case 'J':
                  case 'K':
                  case 'L':
                  case 'M':
                  case 'N':
                  case 'O':
                  case 'P':
                  case 'Q':
                  case 'R':
                  case 'S':
                  case 'T':
                  case 'U':
                  case 'V':
                  case 'W':
                  case 'X':
                  case 'Y':
                  case 'Z': fputc(tolower(zeichen), datei_ptr_2);
                            break;
                  default : fputc(zeichen, datei_ptr_2);
               }
               zeichen= fgetc(datei_ptr);
            }
            fclose(datei_ptr);
            fclose(datei_ptr_2);
         }
      }
      

    9. Lösung - GEBU.EXE
      /* gebu exec */
      #include <stdio.h>
      #include <conio.h>
      #include <ctype.h>
       
      #define MAX 100
       
      FILE *datei_ptr;
       
      int x           = 0;            /*          Datensatzzaehler          */
      int day_of_year = 0;
       
      struct datum              /* Struktur zur Aufnahme des Systemdatums   */
      {
         int  jahr;
         char tag;
         char monat;
      };
      struct datum *datum_ptr   /* Pointer auf die Struktur DATUM           */
       
      struct gebu_dat
      {
         int tag;
         int monat;
         int jahr;
      };
       
      struct satz
      {
         char   name[20];
         char   vorname[15];
         struct gebu_dat geb_dat;
      };
      struct satz daten_satz[MAX];
       
      /************************************************************************/
      /*  Funktion zum Eröffnen einer Datei - Zugriffsart wird übergeben      */
      /************************************************************************/
      int Datei_oeffnen(char *datei_zugriff)
      {
         datei_ptr = fopen("GEBU.DAT", datei_zugriff);
         if (datei_ptr == NULL)
         {
             return(0);              /* Zugriff nicht erfolgreich ! */
         }
         else
         {
             return(1);              /* Zugriff erfolgreich !       */
         }
      }
       
      /**************************************************************************/
      /* Funktion errechnet den Tag des Jahres (z.B.: 134). Parameter sind Tag,
      */
      /* Monat und Jahr eines beliebigen Datums.                                */
      /**************************************************************************/
      int day_of_year_errechnen(int r_tag, int r_monat, int r_jahr)
      {
      int monat[13];
       
         monat[0] = 0;
         monat[1] = 31;
         monat[2] = 28;
         monat[3] = 31;
         monat[4] = 30;
         monat[5] = 31;
         monat[6] = 30;
         monat[7] = 31;
         monat[8] = 31;
         monat[9] = 30;
         monat[10] = 31;
         monat[11] = 30;
         monat[12] = 31;
       
         if ((r_jahr % 4) == 0) monat[2] = 29;
       
         for (x=0; x<=((r_monat)-1); x++)
         {
           day_of_year += monat[x];
         }
         return(day_of_year += (r_tag));
      }
       
      /************************************************************************/
      /**********                   Hauptfunktion                    **********/
      /************************************************************************/
      void main(void)
      {
      /* Vereinbarungsteil */
       int  oeffnen_ok      = 0;       /* Boolsche Var. für die Überprüfung */
                                       /* des Datei-Zugriffs                */
       int  alter           = 0;       /* Wie alt wird er denn nun?         */
       int  geb_day_of_year = 0;       /* Sicherungsvariable für Jahrestag  */
       int  merker          = 0;       /* Jemand in nächster Zeit Gebu ???? */
       char dummy            = '';
       char datei_zugriff[3] = "wt";
       
      /* Verarbeitungsteil */
         clrscr();
         strcpy(datei_zugriff,"rt");
         oeffnen_ok = (Datei_oeffnen(datei_zugriff));
                                       /* oder '...(&datei_zugriff[0]));'   */
                                       /* Übergabe der Adresse der ersten   */
                                       /* Feldkomponenten                   */
         if (oeffnen_ok == 0)
         {
            printf("Datei konnte nicht geöffnet werden!");
            exit(0);
         }
         else
         {
                                       /* E R S T L E S E N                 */
            fscanf(datei_ptr, "%20s", daten_satz[x].name);
            fscanf(datei_ptr, "%15s", daten_satz[x].vorname);
            fscanf(datei_ptr, "%5d", &daten_satz[x].geb_dat.tag);
            fscanf(datei_ptr, "%5d", &(daten_satz[x].geb_dat.monat));
            fscanf(datei_ptr, "%7d", &daten_satz[x].geb_dat.jahr);
       
            day_of_year = day_of_year_errechnen(daten_satz[x].geb_dat.tag,
                          daten_satz[x].geb_dat.monat,
                          daten_satz[x].geb_dat.jahr);
            geb_day_of_year = day_of_year;
       
            day_of_year = 0;
       
            getdate(datum_ptr);
            day_of_year = day_of_year_errechnen((*datum_ptr).tag,
                          (int)(*datum_ptr).monat,
                          (int)(*datum_ptr).jahr);
            if ((geb_day_of_year - day_of_year >= 0) &&
                (geb_day_of_year - day_of_year <= 7))
            {
               printf("\n\t\tAm    %02d.%02d.%4d    hat\n",
                                         daten_satz[x].geb_dat.tag,
                                         daten_satz[x].geb_dat.monat,
                                         (int)(*datum_ptr).jahr);
               printf("           %15s", daten_satz[x].vorname);
               printf(" %-20s\n\t\t      Geburtstag. \n",
                                         daten_satz[x].name);
               alter = ((*datum_ptr).jahr - daten_satz[x].geb_dat.jahr);
               printf("\tDas Geburtstagskind wird %-3d Jahre alt !\n\n", alter);
               merker = 1;
            }
       
            while ( !feof(datei_ptr) )
            {
                                        /* N A C H L E S E N                 */
               fscanf(datei_ptr, "%20s", daten_satz[x].name);
               fscanf(datei_ptr, "%15s", daten_satz[x].vorname);
               fscanf(datei_ptr, "%5d", &daten_satz[x].geb_dat.tag);
               fscanf(datei_ptr, "%5d", &(daten_satz[x].geb_dat.monat));
               fscanf(datei_ptr, "%7d", &daten_satz[x].geb_dat.jahr);
       
               if (feof(datei_ptr)) break;
       
               day_of_year = 0;
               day_of_year = day_of_year_errechnen(daten_satz[x].geb_dat.tag,
                                                   daten_satz[x].geb_dat.monat,
                                                   daten_satz[x].geb_dat.jahr);
               geb_day_of_year = day_of_year;
       
               day_of_year = 0;
       
               getdate(datum_ptr);
               day_of_year = day_of_year_errechnen((*datum_ptr).tag,
                                                   (int)(*datum_ptr).monat,
                                                   (int)(*datum_ptr).jahr);
               if ((geb_day_of_year - day_of_year >= 0) &&
                   (geb_day_of_year - day_of_year <= 7))
               {
                  printf("\n\t\tAm    %02d.%02d.%4d    hat\n",
                                                   daten_satz[x].geb_dat.tag,
                                                   daten_satz[x].geb_dat.monat,
                                                   (int)(*datum_ptr).jahr);
                  printf("           %15s", daten_satz[x].vorname);
                  printf(" %-20s\n\t\t      Geburtstag. \n",
                                                   daten_satz[x].name);
                  alter = ((*datum_ptr).jahr - daten_satz[x].geb_dat.jahr);
                  printf("\tDas Geburtstagskind wird %-3d Jahre alt !\n\n",
                                                                        alter);
                  merker = 1;
                } /* of if */
              } /* of while */
              if (merker == 0)
              {
                 printf("\n\n\t\tKeine Geburtstage in nächster Zeit !");
              } /* of if */
       
              printf("\n\n");
              printf("Bitte <ENTER> zum Beenden drücken!");
              dummy = getch();
       
            } /* of else */
         } /* of MAIN */
      

    10. Lösung - Zeilenweise umdrehen

      Lösung liegt nicht vor

    11. Lösung - Zeichenweise umdrehen

      Lösung liegt nicht vor

    12. Lösung - Fremdcode übersetzen
      /* Kodierten Text in Klartext wandeln */
      #include <stdio.h>
       
        static char out[]="abcdefghijklmnopqrstuvwxyz1234567890";
        static char in[]={48,49,50,51,52,53,54,55,116,117,118,119,56,57,97,
                          98,99,100,101,102,103,104,105,106,107,108,109,110,
                          111,112,113,114,115,120,121,122};
       
      void main(int argc, char *argv[])
      {
        char zeichen;
        int i,found;
        FILE *datei1, *datei2;
       
        datei1=fopen(argv[1],"r");
        datei2=fopen(argv[2],"w");
        do
        {
          zeichen=fgetc(datei1);
          found=0;
          for(i=0;i<=35;i++)
          {
             if(zeichen==in[i])
             {
                found=1;
                break;
             }
          }
          if (found==1) fputc(out[i],datei2);
          else fputc(zeichen,datei2);
       
        } while(!feof(datei1));
       
      }
      
      /* Klartext in codierten Text wandeln */
      #include <stdio.h>
       
        static char out[]="abcdefghijklmnopqrstuvwxyz1234567890";
        static char in[]={48,49,50,51,52,53,54,55,116,117,118,119,56,57,97,
                          98,99,100,101,102,103,104,105,106,107,108,109,110,
                          111,112,113,114,115,120,121,122};
       
      void main(int argc, char *argv[])
      {
        char zeichen;
        int i,found;
        FILE *datei1, *datei2;
       
        datei1=fopen(argv[1],"r");
        datei2=fopen(argv[2],"w");
        do
        {
          zeichen=fgetc(datei1);
          found=0;
          for(i=0;i<=35;i++)
          {
             if(zeichen==out[i])
             {
                found=1;
                break;
             }
          }
          if (found==1) fputc(in[i],datei2);
          else fputc(zeichen,datei2);
       
        } while(!feof(datei1));
       
      }