Lösungen zum C-Kurs des Rechenzentrum, Tag 1


Diese Woche habe ich den C-Kurs des Rechenzentrums der Universität Kiel besucht. Dieser Kurs umfasst unter andrem einen ganzen Satz an Übungsaufgaben. Ich persönlich wollte meine Kenntnisse auffrischen und endlich mal vertiefen – dafür war der Kurs dann leider doch nicht geeignet. Mir persönlich war der Schwierigkeitsgrad zu niedrig, also wenn ihr schon ein wenig Programmierungshintergrund habt, erwartet nicht zu viel von den folgenden 3 Postings. Aber es gab durchaus einige, die sich an ein paar der Aufgaben die Zähne ausgebissen haben.

Da es keine offizielle Lösung für die Aufgaben zum Vergleichen gab, habe ich mir überlegt, meine Lösungen hier online zu stellen. Ich hoffe, dass sie dem ein oder anderen eine kleine Hilfestellung sind und vielleicht auch interessant sind für alle diejenigen, die nicht zum Kurs kommen konnten (für das nächste Semester werden C-Kenntnisse ja vorausgesetzt). Natürlich bin auch ich nicht perfekt (und ich habe den ersten Theorieteil von Tag 1 komplett verpasst). Also wenn ihr meint, dass man die ein oder andere Lösung optimieren kann, oder sie falsch ist, oder Ähnliches, hinterlasst doch bitte einen Kommentar!

Hier geht es zunächst nur um die Aufgaben des ersten Tages. Die Themen waren:

  • Grundzüge eines C-Programms
  • Einlesen von Daten über die Tastatur und Ausgeben von Daten über den Bildschirm
  • Operationen
  • Kontrollstrukturen

Die Aufgaben und Lösungen der anderen zwei Tage finden sich hier:

Die Kursunterlagen zum Theorieteil (Präsentationsfolien) finden sich online (bisher nur zum ersten Tag, die nächsten sollten aber demnächst folgen).

Kommen wir also zu den Aufgaben:

  1. Programmausführung
    • Bitte geben Sie folgenden Programmcode ein:
      /* Beispiel für Textausgaben */
      #include <stdio.h>
      
      int main(){
         printf("C-Programmierung ist ganz einfach!n");
         printf("Programm erfolgreich beendet.n");
      
         return 0;
      }
    • Speichern Sie den Programmcode unter dem Namen bsp1.c ab.
    • Übersetzten Sie das Programm mit: gcc -o bsp1.exe bsp1.c
    • Starten Sie das Programm mit: ./bsp1.exe

    Anmerkung:
    Ich verstehe nicht ganz, warum die Programme mit der Endung .exe kompiliert werden sollen. Dies wurde auch in dem Theorieteil immerzu gemacht. Dabei wurden alle Beispiele und Aufgaben auf Linux-Systemen kompiliert! Unter Linux wird eine ausführbare Datei nicht über “.exe” identifiziert, sondern darüber, ob die Ausführung für die Datei gesetzt ist (Executable Flag oder auch X-Bit genannt) oder nicht. Deshalb ist es insgesamt unüblich diese Eigenschaft über eine Endung anzugeben.

    Ob das Bit gesetzt ist, oder nicht, kann man mittels ls -l herausfinden. Wenn eine Datei mit dem gcc kompiliert wird, ist das Kompilat in der Regel mit den richtigen Bits gesetzt.

    pygospa@Laurelin ~/Desktop/c-kurs/tag1 % ls -l
    total 40
    -rwxr-xr-x  1 pygospa  staff  12588 18 Mär 00:32 aufg-1*
    -rw-r--r--  1 pygospa  staff    179 18 Mär 00:32 aufg-1.c

    (Die Kombination von “rwx”-en gleich am Anfang in der 3. Zeile zeigt uns, dass die Datei ausführbar ist. Die dazugehörige Sourcecode-Datei ist nicht ausführbar, hier sind keine x in den Dateieigenschaften gesetzt. Das ubuntuusers-Portal hat in seinem Wiki einen recht akzeptablen Eintrag dazu.)

    Was mich noch weiter irritiert: Eine .exe-Datei unter Windows muss nicht mit dem ./ gestartet werden. In Linux gibt es die so genannte $PATH Umgebungsvariable, die alle Verzeichnisse enthält, in denen Befehle stehen. Alle Befehle die nicht dort stehen, können nicht einfach ohne weiteres ausgeführt werden (die Idee dahinter ist, dass jeder “Nicht-$PATH” Befehl bewusst ausgeführt werden muss. So kann ein Angreifer beispielsweise nicht einfach ein eigenes ls in das Homeverzeichnis eines Users speichern, welches dieser dann statt der Originalvariante ausführt).

    pygospa@telperion ~ % echo $PATH
    /usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/i686-pc-linux-gnu/gcc-bin/4.3.4:/usr/games/bin

    (Beispiel für eine PATH-Variable unter Linux).

    Wenn man einen Befehl ausführen möchte, der nicht in der $PATH-Variable steht, muss man, unter Linux den Pfad angeben. Das kann relativ, oder absolut passieren, also bspw. absolut:

    pygospa@Laurelin c-kurs $ /Users/pygospa/Desktop/c-kurs/tag1/aufg-1 
    C-Programmierung ist ganz einfach!
    Programm erfolgreich beendet.

    Oder relativ:

    pygospa@Laurelin c-kurs $ tag1/aufg-1 
    C-Programmierung ist ganz einfach!
    Programm erfolgreich beendet.

    Der ./ ist eine besondere Pfadangabe. ./ bezeichnet jedes Verzeichnis indem man sich aktuell befindet. Es ist also ebenfalls eine Pfadangabe, und ermöglicht damit das Ausführen der Datei, wenn man sich gerade im gleichen Verzeichnis wie die Datei befindet. Mehr dazu findet man u.A. hier.

    pygospa@Laurelin tag1 $ ./aufg-1
    C-Programmierung ist ganz einfach!
    Programm erfolgreich beendet.

    Windows sucht im Gegensatz dazu immer auch im aktuellen Verzeichnis nach der Datei, die es ausführen soll, weswegen eine Pfadangabe, anders als bei Linux, nicht nur unnötig wird: Windows kennt eine solche Pfadangabe noch nicht einmal! Das Angeben von ./ führt daher sogar zu einem Fehler.

    C:Documents and SettingspygospaDesktopprog>./aufg-1.exe
    ´.´ is not recognized as an internal or external command,
    operable program or batch file.
    
    C:Documents and SettingspygospaDesktopprog>aufg-1.exe
    C-Programmierung ist ganz einfach!
    Programm erfolgreich beendet.
    
    C:Documents and SettingspygospaDesktopprog>

    Ich persönlich finde das sehr verwirrend – es sollen wohl tatsächlich auf einer Linux-Maschine Programme mit der Endung .exe kompiliert werden?!

    Zwar nur eine kleine Anmerkung, ausgelöst dadurch das mich das sehr irritiert hat. Allerdings fand ich es doch wichtig zu erwähnen. Ich denke, es sind solche Irritationen die zu sehr vielen Missverständnissen bei neuen Linuxusern führen. Aber machen wir weiter mit den nächsten Aufgaben 😉

  2. Ein- und Ausgabe von Variablen

    Ändern Sie das Programm aus Aufgabe 1 so ab, dass 1 Integerzahl und eine Gleitkommazahl von der Tastatur eingelesen und anschließend wieder auf dem Bildschirm ausgegeben werden.

    Vorgehensweise:

    • 2 Variablenwerte (xwert und ywert) deklarieren
    • Variablen mit 0 bzw. 0.00 initialisieren
    • die beiden Zahlenwerte mit der scanf-Funktion einlesen
    • Ausgabe der Zahlenwerte mit der printf-Funktion

    Meine Lösung:

    /* aufg-2.c */
    #include <stdio.h>
    
    int main(){
       int xwert = 0;
       float ywert = 0.00;
    
       printf("Bitte geben Sie eine ganze Zahl ein: ");
       scanf("%d",&xwert);
    
       printf("Bitte geben Sie eine Kommazahl ein: ");
       scanf("%f",&ywert);
    
       printf("Ganze Zahl: %d, Kommazahl: %fn",xwert,ywert);
       return 0;
    }
  3. Mathematische Operatoren I

    Schreiben Sie ein Programm, das zwei Integerzahlen und die folgenden Informationen auf dem Bildschirm ausgibt:

    • Summe der beiden Zahlen
    • Produkt der beiden Zahlen
    • Division (mit und ohne Typenumwandlung)
    • Modulo-Operator

    Meine Lösung:

    /* aufg-3.c */
    #include <stdio.h>
    
    int main(){
       int x, y;
    
       printf("Bitte zwei Zahlen eingeben: ");
       scanf("%d %d",&x,&y);
    
       printf("Summe der beiden Zahlen: %dn",x+y);
       printf("Produkt der beiden Zahlen: %dn",x*y);
       printf("Division (ohne Typumwandlung): %dn",x/y);
       printf("Division (mit Typumwandlung): %fn",(float)x/y);
       printf("Modulo: %dn",x%y);
    
       return 0;
    }
  4. Mathematische Operatoren II

    Schreiben Sie ein Programm, das die Oberfläche eines Quaders berechnet.

    Meine Lösung:

    /* aufg-4.c */
    #include <stdio.h>
    
    int main(){
       int a, b, c;
    
       printf("Bitte Länge x Höhe x Breite eines Quaders angeben: ");
       scanf("%d %d %d",&a,&b,&c);
       printf("Die Oberfläche beträgt: %dn",(a*b+a*c+b*c));
    
       return 0;
    }
  5. Mathematische Operatoren III (Zusatzaufgabe)

    Schreiben Sie ein Programm, dass eine Sekundenzahl von der Tastatur einliest und daraus die Anzahl der Stunden, Minuten und Sekunden berechnet.
    Beispielausgabe: Die eingegebenen 3665 Sekunden entsprechen 1 Stunde, 1 Minute und 5 Sekunden

    Meine Lösung:

    /* aufg-5.c */
    #include <stdio.h>
    
    int main(){
       int in, hrs, min, sec;
    
       printf("Bitte eine Zeit in Sekunden angeben: ");
       scanf("%d",&in);
    
       hrs = in/3600;
       min = (in%3600)/60;
       sec = (in%3600)%60;
    
       printf("Die eingegebenen %d Sekunden entsprehcen %d Stunden, %d Minuten und %d Sekunden.n",in,hrs,min,sec);
    
       return 0;
    }
  6. Mathematische Funktionen I

    Schreiben Sie ein Programm, das die Diagonale in einem Rechteck berechnet. Die Rechteckseiten sollen jeweils 10 und 15 Meter lang sein.

    Meine Lösung:

    /* aufg-6.c */
    #include <stdio.h>
    #include <math.h>
    
    int main(){
       float a = 10.0;
       float b = 15.0;
       
       printf("Die Diagonale eines Rechtes mit den Seitenlängen %d und %d 
    beträgt: %fn",(int)a,(int)b,sqrt(a*a + b*b));
    
       return 0;
    }
    

    Anmerkung:
    Wie ich erwähnt hatte, war ich zu dem Vorlesungsteil zu dieser Aufgabe nicht anwensend. Daher bin ich mir nicht ganz sicher, was sich hinter “Mathematische Funktion” genau verbirgt. Ich nehme an, dass es darum geht, vordefinierte Funktionen aus den Bibliotheken zu verwenden. Zwar ist weder in der Aufgabenbeschreibung, noch in den Folien zur Vorlesung etwas dazu zu entnehmen, die nächste Aufgabe hat aber einen direkten Hinweis auf die math.h.
    Die sqrt-Funktion, die ich in der Lösung verwende, benötigt allerdings ebenfalls die math.h Bibliothek. Ich weiß nicht, ob man das hätte anders lösen sollen (z.B. durch Annäherungsverfahren).

  7. Mathematische Funktionen II

    Schreiben Sie ein Programm, das die n-te Wurzel aus einer Zahl berechnet.
    Beispiel: 2^3 = 8, sqrt[3]{8} = 2
    Berechnung in C: 2 = 8^(1/3) → 2 = pow(8,1/3)
    Zur Berechnung benötigen Sie die Potzenzfunktion pow aus der Standardbibliothek math.h.

    Meine Lösung:

    /* aufg-7.c */
    #include <stdio.h>
    #include <math.h>
    
    int main(){
       int a;
       float n;
    
       printf("Bitte geben Sie eine Zahl, und den ganzzahligen Wurzelexponenten ein: ");
       scanf("%d %f",&a,&n);
       printf("Ergebnis: %fn",pow(a,1/n));
    
       return 0;
    }
  8. if-Bedingung
    Schreiben Sie ein Programm, das eine Integer-Zahl von der Tastatur einliest und diese Zahl nur wieder auf dem Bildschirm ausgibt, wenn eine gerade Zahl eingegeben wurde.

    Meine Lösung:

    /* aufg-8.c */
    #include <stdio.h>
    
    int main(){
       int a;
    
       printf("Bitte eine Zahl eingeben: ");
       scanf("%d",&a);
       if(a%2 == 0)
          printf("%dn",a);
    
       return 0;
    }
  9. if-Bediungung
    Ändern Sie das obige Programm so ab, dass zwei Integer-Zahlen eingelesen werden und anschließend folgende Mitteilungen ausgegeben werden können:

    • Sie haben zwei gerade Zahlen eingegeben.
    • Sie haben zwei ungerade Zahlen eingegeben
    • Sie haben eine gerade und eine ungerade Zahl eingegeben.

    Meine Lösung:

    /* aufg-9.c */
    #include <stdio.h>
    
    int main(){
       int a,b;
    
       printf("Bitte geben Sie zwei Zahlen ein: ");
       scanf("%d %d",&a,&b);
    
       if((a%2==0)&&(b%2==0))
          printf("Sie haben zwei gerade Zahlen eingegeben.n");
       else if((a%2==1)&&(b%2==1))
          printf("Sie haben zwei ungerade Zahlen eingegeben.n");
       else
          printf("Sie haben eine gerade und eine ungerade Zahl eingegebenn");
    
       return 0;
    }
  10. Schleifen
    Schreiben Sie jeweils ein Programm mit einer Schleife, dass in 3er-Schritten von 1 bis 100 zählt und den jeweiligen Zahlenwert ausgibt.

    1. Programmcode mit einer for-Schleife
    2. Programmcode mit einer while-Anweilsung
    3. Programmcode mit einer do-while-Anweisung

      Meine Lösungen:

      1. For-Schleife
        /* aufg-10a.c */
        #include <stdio.h>
        
        int main(){
           int i=3;
        
           for(i;i<101;i+=3)
              printf("%dn",i);
        
           return 0;
        }
      2. While-Schleife
        /* aufg-10b.c */
        #include <stdio.h>
        
        int main(){
           int i=0;
        
           while(i<99)
              printf("%dn",i+=3);
        
           return 0;
        }
      3. Do-While-Schleife
        /* aufg-10c.c */
        #include <stdio.h>
        
        int main(){
           int i=0;
        
           do
              printf("%dn",i+=3);
           while(i<99);
        
           return 0;
        }
    • verschachtelte Schleifen
      Schreiben Sie ein Programm das folgende “Baumstruktur” auf dem Bildschirm ausgibt:

                         *
                       ***
                     *****
                   *******
                 *********
               ***********
             *************
           ***************
         *****************
       *******************

      Meine Lösung:

      /* aufg-11.c */
      #include <stdio.h>
      
      int main(){
         int zeilen = 10;
         int spalten = 20;;
         int i, j;
      
         for(i=0;i<zeilen;i++){
      
            for(j=0;j<spalten-(i*2+1);j++)
               printf(" ");
      
            for(j=spalten-(i*2+1);j<spalten;j++)
               printf("*");
      
            printf("n");
         }
      }

      Anmerkung
      Hier bin ich stark am Überlegen, ob es nicht noch eine bessere (d.h. kürzere) Lösung gibt, die nur mit 2 Schleifen auskommt.

    • switch-Anweisung I
      Schreiben Sie ein Programm, das Sie auffordert eine Zahl zwischen 1 und 5 einzugeben. Je nach eingegebener Zahl soll der folgende Satz ausgegeben werden:

      • Mit 1 haben Sie eine gute Wahl getroffen.
      • Der Zahlwert 2 ist auch nicht schlecht.
      • Sie haben die Zahl 3 eingegeben.
      • 4 ist eine gerade Zahl.
      • Sie haben mit 5 wieder die höchst mögliche Zahl eingegeben.

      Meine Lösung:

      /* aufg-12.c */
      #include <stdio.h>
      
      int main(){
         int zahl;
      
         printf("Bitte eine Zahl zwischen 1 und 5 eingeben: ");
         scanf("%d",&zahl);
      
         switch(zahl){
            case 1:
               printf("Mit 1 haben Sie eine gute Wahl getroffen.n");
               break;
            case 2:
               printf("Der Zahlwert 2 ist auch nicht schlecht.n");
               break;
            case 3:
               printf("Sie haben die Zahl 3 eingegeben.n");
               break;
            case 4:
               printf("4 ist eine gerade Zahl.n");
               break;
            case 5:
               printf("Sie haben mit 5 wieder die höchst mögliche Zahl eingegeben.n");
         }
         return 0;
      }
      1. switch-Anweisung II
        Geben Sie den folgenden Programmcode ein und überprüfen Sie ob das Programm korrekt arbeitet. Falls nötig ändern Sie den Code für ein fehlerfreies Arbeiten ab.

        #include <stdio.h>
        int main()
        {  int eingabe;
           printf("Bitte geben Sie die Zahlen 1 oder 2 einn");
           scanf("%d",&eingabe);
           switch(eingabe)
           {
              default:
                 printf("Sie haben weder 1 noch 2 eingegeben n");
              case 1:
                 printf("Sie haben die Zahl 1 eingegeben n");
                 break;
              case 2:
                 printf("Sie haben die Zahl 2 eingegeben n");
                 break;}
           return 0;
        }

        Meine Lösung:

        /* aufg-13a.c */
        #include <stdio.h>
        
        int main(){
           int eingabe;
           printf("Bitte geben Sie die Zahlen 1 oder 2 ein n");
           scanf("%d",&eingabe);
        
           switch(eingabe){
              case 1:
                 printf("Sie haben die Zahl 1 eingegebenn");
                 break;
              case 2:
                 printf("Sie haben die Zahl 2 eingegebenn");
                 break;
              default:
                 printf("Sie haben weder 1 noch 2 eingegebenn");
           }
           return 0;
        }

        Anmerkung:
        Es hätte (zumindest mit dem gcc 4.0.1) auch kein Problem gegeben, wenn man in der 9. Zeile nach der printf-Anweisung ein break einfügen können. Der Code ist danach genau so lauffähig; anders also als in einigen anderen Programmiersprachen (bspw. Scheme) ist die Reihenfolge der Fallunterscheidungen der switch-Anweisung nicht relevant.

      2. switch- und if-else Anweisungen
        Bilden Sie die switch-Anweisung aus Übung 13a mit if-Anweisungen nach.

        Meine Lösung:

        /* aufg-13b.c */
        #include <stdio.h>
        
        int main(){
           int eingabe;
           printf("Bitte geben Sie die Zahlen 1 oder 2 ein n");
           scanf("%d",&eingabe);
        
           if(eingabe==1)
              printf("Sie haben die Zahl 1 eingegebenn");
           else if(eingabe==2)
              printf("Sie haben die Zahl 2 eingegebenn");
           else
              printf("Sie haben weder 1 noch 2 eingegebenn");
           return 0;
        }
    • continue-Anweisung
      Schreiben Sie zwei Programme, mti denen Sie die Summe aller geraden Zahlen von 2 bis 20 berechnen:

      1. ohne Verwendung einer continue-Anweisung
        Meine Lösung:

        /* aufg-14a.c */
        #include <stdio.h>
        
        int main(){
           int i=2;
           int sum=0;
        
           for(i;i<21;i++){
              if(i%2==0)
                 sum+=i;
           }
           printf("Die Summe aller geraden Zahlen von 2 bis 20 ist: %dn",sum);
           return 0;
        }
      2. mit Verwendung einer continue-Anweisung

        Meine Lösung:

        /* aufg-14b.c */
        #include <stdio.h>
        
        int main(){
           int i=2;
           int sum=0;
        
           for(i;i<21;i++){
              if(i%2==1)
                 continue;
              sum+=i;
           }
           printf("Die Summe aller geraden Zahlen von 2 bis 20 ist: %dn",sum);
           return 0;
        }
    • (Zusatzaufgabe)
      Schreiben Sie ein Programm, das folgende Berechnungen durchführen kann:

      • Fläche eines Kreises berechnen (A=PI*r2)
      • Umfang eines Kreises berechnen (U=2*PI*r)
      • Fläche eines Rechtecks berechnen (A=hoehe*breite)
      • Umfang eines Rechtecks berechnen (U=2*(hoehe+breite)

      (PI=3.141592)
      Der Benuzter soll bei jedem Durchlauf auswählen können, welche Berechnung er gerne durchführen möchte.

      Meine Lösung:

      /* aufg-15.c */
      #include <stdio.h>
      
      int main(){
         // Variabelndeklaration und -initialisierung
         int wahl=1;
         float radius, a, b, pi;
         pi = 3.141592;
      
         // Programmschleife, die sich so lange wiederholt, bis der User 0 eingibt
         while(wahl!=0){
            // Wahl einlesen
            printf("Folgende Berechnungen sind Möglich:n");
            printf("t1) Fläche eines Kreises berechnen.n");
            printf("t2) Umfang eines Kreises berechnen.n");
            printf("t3) Fläche eines Rechtecks berechnen.n");
            printf("t4) Umfang eines Rechtecks berechnen.n");
            printf("t0) Programm beenden.n");
            printf("Bitte Treffen sie eine Wahl: ");
      
            scanf("%d",&wahl);
      
            // Abhängig von der Wahl: Benötigte Größen einlesen
            if((wahl>0) && (wahl <3)){
               printf("Bitte geben Sie den Radius an: ");
               scanf("%f",&radius);
            } else if((wahl>2) && (wahl<5)){
               printf("Bitte geben Sie die Seitenlängen des Rechtecks an: ");
               scanf("%f %f",&a,&b);
            }
      
            // Abhängig von der Wahl: Größen berechnen
            switch(wahl){
               case 1:
                  printf("Die Fläche des Kreises beträgt: %fn",(pi*radius*radius));
                  break;
               case 2:
                  printf("Der Umfang des Kreises beträgt: %fn",(2*pi*radius));
                  break;
               case 3:
                  printf("Die Fläche des Rechecks beträgt: %fn",(a*b));
                  break;
               case 4:
                  printf("Der Umfang des Rechtecks beträgt: %fn",(2*(a+b)));
                  break;
               case 0:
                  printf("Das Programm wird beendet!n");
                  break;
               default:
                  printf("Falsche Eingabe. Bitte wiederholen!n");
            }
      
            // Linie zu besseren Darstellung des Menüs
            int i;
            printf("n");
            for(i=0;i<51;i++)
               printf("-");
            printf("nn");
         }
         return 0;
      }
    • (Zusatzaufgabe)
      Schreiben Sie ein Programm, bei dem der Benutzer eine zufällig vom Computer ausgewählte Zahl erraten soll. Der Benuzter soll 5 Versuche haben um die Zahl zu erraten. Falls der Benutzer die richtige Zahl erraten hat, soll sowohl die Zahl als auch die Anzahl der benötigten Versuche ausgegeben werden. Falls die eingegebene Zahl nicht richtig war, wird vom Programm eine Meldung ausgegeben, ob die zu erratende Zahl kleiner oder größer als die eingegebene Zahl ist.
      Nach 5 falschen Versuchen soll das Programm mit einer entsprechenden Meldung abbrechen.
      Anmerkung:
      Zur Erzeugung von Zufallszahlen benötigen Sie die Bibliotheksfunktion rand()%[maxzahl] aus der Standardbibliothek . Ihr Programmcode muss also die Zeile #include enthalten.
      Mit der folgenden Zeile erzeugen Sie eine Zufallszahl zwischen 0 und 100:
      zufall=random()%100;
      Damit der Zufallszahlengenerator nicht immer die gleichen Zahlen ermittelt, muss zunächst der Zufallszahlengenerator über die Bibliotheksfunktion srand((time(0)) mit der Systemzeit initialisiert werden. Beachten Sie, dass Sie für die Funktion time(0) die Headerdatei einbinden müssen.

      Benötigte Include-Dateien:
      #include
      #include

      Ermittlung einer Zufallszahl zwischen 0 und 100:
      srand(time(0));
      zufallszahl=rand()%100;

      Meine Lösung:

      /* aufg-16.c */
      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      
      int main(){
         // Variablendeklarierung und -initialisierung
         int i=0;
         int zahl, eingabe;
      
         // Initialisierung der Zufallszahl
         srand(time(0));
         zahl = (rand()%100)+1;
      
         // Hauptprogramm: Rateschleife
         printf("Raten Sie die Zahl zwischen 1 und 100: ");
         while(i<5 && zahl!=eingabe){
            scanf("%d",&eingabe);
      
            if(eingabe < zahl)
               printf("Die Zahl ist größer. ");
            else if(eingabe > zahl)
               printf("Die Zahl ist kleiner. ");
      
            i++;
         }
      
         // Ergebnis
         if(zahl!=eingabe)
            printf("nDie Zahl die geraten werden sollte, war %dn",zahl);
         else
            printf("nDie Zahl %d wurde mit %d Versuchen richtig geraten!n",zahl,i);
         return 0;
      }

      Anmerkung:
      In dieser Aufgabe ist ein kleiner Fehler. Da ich darüber gegrübelt habe, ob das % der Modulo-Operator sein soll, habe ich in Kernighan/Ritchie: Programmieren in C. Mit dem C-Reference Manual in deutscher Sprache. 2. Ausgabe die rand()-Funktion nachgeschlagen. Dort heißt es:

      int rand(void)
      rand liefert eine ganzzahlige Pseudo-Zufallszahl im Bereich von 0 bis RAND_MAX; dieser Wert ist mindestens 32767

      (S. 251)
      Damit handelt es sich bei dem Ergebnis der rand()-Funktion also tatsächlich um eine Funktion bei der eine ganze Zahl herauskommt. Modulo 100 kann dann also nur eine Zahl zwischen 0 und 99 liefern! Daher hab ich die 1 dazu addiert, um den Bereich von 1-100 zu verschieben.

    Das waren die Aufgaben des ersten Tages. Der zweite und dritte Tag wird in kürze folgen.

    Advertisements

    Please comment. I really enjoy your thoughts!

    Fill in your details below or click an icon to log in:

    WordPress.com Logo

    You are commenting using your WordPress.com account. Log Out / Change )

    Twitter picture

    You are commenting using your Twitter account. Log Out / Change )

    Facebook photo

    You are commenting using your Facebook account. Log Out / Change )

    Google+ photo

    You are commenting using your Google+ account. Log Out / Change )

    Connecting to %s