CKurs - Aufgaben zu C

Google

 

1.Aufgabe

Aufgabenstellung:

while und do-Schleifen

a) Testen Sie folgendes C-Programm:

CCode:

#include <stdio.h>
int main()
{
      int zahl;
      printf("\nBitte Zahl eingeben('0' fuer Ende): ");
      scanf("%d", &zahl);
      while(zahl != 0) {
               printf("%3d hoch 2 = %4d\n", zahl, zahl*zahl);
               printf("\nBitte Zahl eingeben('0' fuer Ende): ");
               scanf("%d", &zahl);
      }
}


b) Ersetzen Sie die while- mit einer do-while-Schleife. Was ist der
Unterschied zwischen beiden Schleifen? 

Lösung

Die Eingabe von

Eingabe stdin:

1
2
34
32
4
3
3
53
3
235
699
1568
0

liefert

Ausgabe stdout:


Bitte Zahl eingeben('0' fuer Ende): 1 hoch 2 = 1

Bitte Zahl eingeben('0' fuer Ende): 2 hoch 2 = 4

Bitte Zahl eingeben('0' fuer Ende): 34 hoch 2 = 1156

Bitte Zahl eingeben('0' fuer Ende): 32 hoch 2 = 1024

Bitte Zahl eingeben('0' fuer Ende): 4 hoch 2 = 16

Bitte Zahl eingeben('0' fuer Ende): 3 hoch 2 = 9

Bitte Zahl eingeben('0' fuer Ende): 3 hoch 2 = 9

Bitte Zahl eingeben('0' fuer Ende): 53 hoch 2 = 2809

Bitte Zahl eingeben('0' fuer Ende): 3 hoch 2 = 9

Bitte Zahl eingeben('0' fuer Ende): 235 hoch 2 = 55225

Bitte Zahl eingeben('0' fuer Ende): 699 hoch 2 = 488601

Bitte Zahl eingeben('0' fuer Ende): 1568 hoch 2 = 2458624

Bitte Zahl eingeben('0' fuer Ende):

Mit do-while erhält man dasselbe Ergebnis, jedoch darf die Eingabe eine 0 sein, ohne dass das Programm abbricht. Das steht im Widerspruch zum Eingabetext und ist somit ein Fehler.



2.Aufgabe Geschachtelte Schleifen

Aufgabenstellung:

Wie sieht die Ausgabe des folgenden C-Programms aus? Wie kann man die
Ausgabe auf den Kopf stellen?

CCode:

#include <stdio.h>

int main()
{
      int zeile,spalte;
      for(zeile=1; zeile <= 20; zeile=zeile+1) {
            for(spalte=1; spalte <= zeile; spalte=spalte+1)
                  printf("*");
            printf("\n");
      }
      return 0;
}

 

Lösung:

Das Programm liefert folgende Ausgabe:

Ausgabe stdout:

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

Die folgenden Änderungen

CCode:

#include <stdio.h>

int
main()
{
int zeile,spalte;
freopen( "stdout.txt", "w", stdout ); //Leitet die Standardausgabe in die Datei stdout.txt um
for(zeile=20; zeile; zeile--) {
for(spalte=1; spalte <= zeile; spalte=spalte+1)
printf("*");
printf("\n");
}
return 0;
}

liefern das gewünschte Ergebnis.

Ausgabe stdout:

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

 

Da Zeile als Boolean ausgewertet wird, ist Zeile=FALSE für alle Werte ungleich 0.



3.Aufgabe Einsmaleins mit Hilfe geschachtelter Schleifen

Aufgabenstellung:

a) Schreiben Sie ein C-Programm, das das kleine Einsmaleins in tabellarischer
   Form erzeugt:

             1   2    3   .   .   10
             2   4    6   .   .   20
              .    .     .   .   .     .
              .    .     .   .   .     . 
             10  20  .  .   .   100

b) Wie kann man das Ergebnis in ein zwei-dimensionales Feld  speichern und anzeigen?

Lösung:

Das Programm

CCode:

#include <stdio.h>

int
main()
{
int i,j,mal[11][11];
freopen( "stdout.txt", "w", stdout ); //Leitet die Standardausgabe in die Datei stdout.txt um
for (i=1; i<=10;i++){
printf("|");
for(j=1;j<=10;j++){
mal[i][j]=i*j;
printf("%3d|",mal[i][j]);
}
printf("\n");
}
return 0;
}

liefert.

 

Ausgabe stdout:

  |  1|  2|  3|  4|  5|  6|  7|  8|  9| 10|
  |  2|  4|  6|  8| 10| 12| 14| 16| 18| 20|
  |  3|  6|  9| 12| 15| 18| 21| 24| 27| 30|
  |  4|  8| 12| 16| 20| 24| 28| 32| 36| 40|
  |  5| 10| 15| 20| 25| 30| 35| 40| 45| 50|
  |  6| 12| 18| 24| 30| 36| 42| 48| 54| 60|
  |  7| 14| 21| 28| 35| 42| 49| 56| 63| 70|
  |  8| 16| 24| 32| 40| 48| 56| 64| 72| 80|
  |  9| 18| 27| 36| 45| 54| 63| 72| 81| 90|
  | 10| 20| 30| 40| 50| 60| 70| 80| 90|100|

wobei "mal" das gewünschte Feld ist.



4. Bedingte Anweisungen und ASCII-Zeichensatz

Aufgabenstellung:

Was tut das folgende Programm? Ergänzen Sie bitte beide printf-Anweisungen in sinnvoller Weise.

CCode:

#include <stdio.h>

int main() {
      char bstb;
      printf("\nBitte keine Umlaute eingeben !\n");
      printf("\nBuchstabe : ");
      bstb=getchar(); /* Was macht diese Funktion? */
      if(bstb < 'A' || bstb > 'z' || bstb > 'Z' && bstb < 'a')  
            printf("\nDas ist kein Buchstabe !");
      else if(bstb >= 'A' && bstb <= 'Z')
            printf("\nSie haben ... eingeben.\n");
      else
            printf("\nSie haben ... eingeben.\n");
      return 0;

}

Lösung:

Die Funktion getchar liest stdin Zeichen für Zeichen als Integerwert ein, aber erst nachdem ENTER (\n) gedrückt wurde.

Die printf Anweisungen könnten so ergänzt werden:

CCode:

else if(bstb >= 'A' && bstb <= 'Z')
printf("\nSie haben den grossen Buchstaben %c eingeben.\n",bstb);
else
printf("\nSie haben den kleinen Buchstaben %c eingeben.\n",bstb);}

Leider klappt das nicht so einfach unter Windows. (Der kopierte C-Code liefert sage und schreibe 32 Exceptions.)

5.Aufgabe

Aufgabenstellung:



Was erzeugen folgende Anweisungen:
   a) for(;;) { /* Anweisungen */}
   b) while(1) { /* Anweisnugen */}
  

Lösung:

Endlosschleifen.