CKurs - Aufgaben zu C

Google

1.Aufgabe

Aufgabenstellung:

Welche Ausgabe liefert das folgende Programm:

CCode:

#include <stdio.h>

int
main()
{
    printf("\nDas Ergebnis von\n12 durch 4 ist %d\n.", 3);
    return 0;
}

Lösung

Das Problem liegt darin, dass man die Standardausgabe auf dem Bildschirm nicht sieht, weil das Programm sofort nach Ausführung beendet wird. Durch einen kleinen Trick kann man aber die Standardausgabe in eine Datei umlenken. Der Befehl freopen( "u1.1out.txt", "w", stdout );
tut dieses. Wird die Standardausgabe in die Datei u1.1out.txt im Arbeitsverzeichnis umgelenkt, so sieht man dann das folgende Ergebnis:

Ausgabe stdout:


Das Ergbis von
12 durch 4 ist 3
.

Alternativ hätte man das Programm auch einfach über die Commandline /Shell ausführen können.

2.Aufgabe

Aufgabenstellung:

Welches Ergebnis liefert dieses Programm?
      Überlegen Sie sie zunächst, welches Ergebnis Sie erwarten.
      Führen Sie das Programm danach aus und vergleichen Sie.

CCode:

#include <stdio.h>

int
main()
{
    printf("4 + 7 / 2 = %d\n", 4+7/2);

    return 0;
}

Lösung

Erwartung: Da %d für vorzeichenbehaftete Integer Werte steht, ertwartet man die Ausgabe 4+7/2=7 da integer(7/2)=3. (Es wird nicht gerundet, sondern abgebrochen, nachdem der Rest kleiner 1 ist.)

Ergebnis

Ausgabe stdout:

4 + 7 / 2 = 7

3.Aufgabe

Aufgabenstellung:

Welche der folgenden Zuweisungen sind falsch?

a) summe = summe + 10;
b) x*x = x*5;
c) 5a = anfang + ende;
d) wert = eingabe + alter_wert * 2
e) g_betrag = betrag * 1.14;
f) gesamt-wert = wert1 + wert2 + wert3 ;

Lösung

Eingabe des Programms und Analyse der Buildfehler:

  1. gültige Zuweisung OK
  2. Zuweisung nur an Variablen und nicht an Ausdrücke möglich fehler
  3. Variablennamen dürfen nicht mit einer Zahl beginnen fehler
  4. Fehlendes Semikolon wäre aber unter machen Kompilern am Ende einer Prozedur möglich fehler
  5. gültige Zuweisung OK
  6. Zuweisung nur an Variablen und nicht an Ausdrücke möglich fehler

4.Aufgabe

Aufgabenstellung:

Warum liefert das folgende Programm unter Umständen ein falsches Ergebnis?
      Korrigieren Sie das Programm, schreiben Sie dabei die Summation mit "+=".

CCode:

#include <stdio.h>

int
main() {
    double summe, zahl;
    zahl = 10;
    summe = summe + zahl;
    summe = summe + zahl;
    printf("Ergebnis = %f\n",summe);

    return 0;
}

 

Lösung

Das Programm liefert unter Umständen ein falsches Ergebnis, weil die Zahl 2-Mal addiert wird und so die Summe um das doppelte der Zahl wächst. Falls das beabsichtigt ist, wäre die Zuweisung summe = summe + 2 * zahl;sicherlich zu bevorzugen. Außerdem wird bei der ersten Addition die Variable "summe" verwendet, obwohl sie noch nicht initialisiert wurde (ihr kein Wert zugewiesen wurde).

Das korrigierte Programm sieht schließlich so aus:

CCode:

#include <stdio.h>

int
main()
{
double summe, zahl;
freopen( "stdout.txt", "w", stdout ); //Leitet die Standardausgabe in die Datei stdout.txt um
zahl = 10;
summe=0;
summe += zahl;
printf("Ergebnis = %f\n",summe);
return 0;
}

und erzeugt folgende Ausgabe

Ausgabe stdout:

Ergebnis = 10.000000

 

5.Aufgabe

Aufgabenstellung:

Ein einfaches Rechenprogramm fuer zwei ganze (Interger) Zahlen

CCode:

#include <stdio.h>

int
main() {
        int x,y;
        x = 12;
        y = 3;
        printf("\n\t1 .  R e c h e n p r o g r a m m\n");
        printf("\n %d + %d ist %d",x,y,x+y);
        printf("\n %d - %d ist %d",x,y,x-y);
        printf("\n %d * %d ist %d",x,y,x*y);
        printf("\n %d / %d ist %d",x,y,x/y);
        printf("\n %d %% %d ist %d",x,y,x%y);

    return 0;
}



a) Bitte Ändern Sie das Programm, sodass der Benutzer die zwei Intergerzahlen frei eingeben kann.¹
b) Bitte machen Sie das Rechenprogramm fliesskommazahlenfähig.

¹ Zu a) Die Funktion scanf() dient der Eingabe von Daten.
 Zuerst kommt eine Zeichenkette mit einem Platzhalter fuer die einzugebende Variable
 (z.B. %d fuer eine Integer-Zahl) und dahinter die Variable selbst mit vorangestelltem &.
 Beispiel: scanf ("%d", &x)  

Lösung

a) man ändert das Programm wie folgt:

CCode:

#include <stdio.h>

int
main()
{
int x,y;

freopen( "stdout.txt", "w", stdout ); //Leitet die Standardausgabe in die Datei stdout.txt um
freopen( "stdin.txt", "r", stdin );

printf("\n\t1 . R e c h e n p r o g r a m m\n");
printf("\nBitte 2 Zahlen eingeben\n");

scanf("%d",&x);
scanf("%d",&y);

printf("\nSie haben die Zahlen %d und %d eingegeben!",x,y);

printf("\n %d + %d ist %d",x,y,x+y);
printf("\n %d - %d ist %d",x,y,x-y);
printf("\n %d * %d ist %d",x,y,x*y);
printf("\n %d / %d ist %d",x,y,x/y);
printf("\n %d %% %d ist %d",x,y,x%y);
return 0;
}

freopen( "stdin.txt", "r", stdin ); dient hierbei nur dazu, dass die Standardeingabe auch aus einer Datei kommt.

Für Integer-Zahlen klappt schon alles:

Eingabe stdin:

125
5

Ausgabe stdout:


1 . R e c h e n p r o g r a m m

Bitte 2 Zahlen eingeben

Sie haben die Zahlen 125 und 5 eingegeben!
125 + 5 ist 130
125 - 5 ist 120
125 * 5 ist 625
125 / 5 ist 25
125 % 5 ist 0

Allerdings ist das Ergebnis bei Eigabe von Floatwerten wie

Eingabe stdin:

12.5
0.5

unsinnig.

Ausgabe stdout:

1 . R e c h e n p r o g r a m m

Bitte 2 Zahlen eingeben

Sie haben die Zahlen 12 und 4207304 eingegeben!
12 + 4207304 ist 4207316
12 - 4207304 ist -4207292
12 * 4207304 ist 50487648
12 / 4207304 ist 0
12 % 4207304 ist 12

Ändert man allerdings die Formate für x und y wie folgt klappt alles.

CCode:

#include <stdio.h>

int
main()
{
double x,y;
int ix,iy;

freopen( "stdout.txt", "w", stdout ); //Leitet die Standardausgabe in die Datei stdout.txt um
freopen( "stdin.txt", "r", stdin );

printf("\n\t1 . R e c h e n p r o g r a m m\n");
printf("\nBitte 2 Zahlen eingeben\n");

scanf("%lf",&x); //%f ist eine Ausnahme
scanf("%lf",&y);

printf("\nSie haben die Zahlen %f und %f eingegeben!",x,y);

printf("\n %f + %f ist %f",x,y,x+y);
printf("\n %f - %f ist %f",x,y,x-y);
printf("\n %f * %f ist %f",x,y,x*y);
printf("\n %f / %f ist %f",x,y,x/y);

//Probleme gibt es mit dem % Operator

ix=x;
iy=y;
if (ix==x & iy==y)
{
printf("\n %d %% %d ist %d",ix,iy,ix%iy);
}else{
printf("\nDer %% Operator ist nur im Intergerbereich definiert!",x,y);
}
return 0;
}

Zusammfassung: Man tausche %d gegen %f aus und beachte, dass beim Einlesen aus (mir unbekannten Gründen) %lf statt %f verwendet werden muss. Man behebe das Problem, sodass % nur für Integer definiert ist: Indem man die eigelesenen Werte in Integerwerte konvertiert und anschließend mit den Floatwerten vergleicht und testet. Man guckt ob dieses die Werte ändert. Falls nicht, kann man das Ergenis für die Integerwerte ausgeben.

Die Eingabe

Eingabe stdin:

12.5
0.5

liefert nun jedenfalls das gewünschte Ergebnis

Ausgabe stdout:



1 . R e c h e n p r o g r a m m

Bitte 2 Zahlen eingeben

Sie haben die Zahlen 12.500000 und 0.500000 eingegeben!
12.500000 + 0.500000 ist 13.000000
12.500000 - 0.500000 ist 12.000000
12.500000 * 0.500000 ist 6.250000
12.500000 / 0.500000 ist 25.000000
Der % Operator ist nur im Intergerbereich definiert!

 

 

6.Aufgabe

Aufgabenstellung:

Schreiben Sie bitte ein C-Programm, das die Summe der Integer-Zahlen 1-100 addiert.
Lösen Sie das Problem mit Hilfe einer for- und einer while-Schleife

Lösung

Das Programm

CCode:

#include <stdio.h>
#include <time.h>

int
main()
{
long i,e,steps;

freopen( "stdout.txt", "w", stdout ); //Leitet die Standardausgabe in die Datei stdout.txt um

steps=100;
e=0;
for(i=0;i<=steps;i++){
e+=i;
}

printf( "For Schleife berechnete %ld \n",e);

e=0;
i=0;
while(i<steps){
i++;
e+=i;
}

printf( "While Schleife berechnete %ld \n",e);

return 0;
}

tut dieses. Interessiert man sich noch für die Laufzeit kann man folgendes hinzufügen:

CCode:

#include <stdio.h>
#include <time.h>

int
main()
{
long i,e,steps;
clock_t start, finish;
double duration;
freopen( "stdout.txt", "w", stdout ); //Leitet die Standardausgabe in die Datei stdout.txt um
freopen( "stdin.txt", "r", stdin ); //Standardeingabe = stddin.txt

scanf("%ld",&steps);
e=0;
start=clock();

for(i=0;i<=steps;i++){
e+=i;
}
finish=clock();
duration = (double)(finish - start);

printf("For Schleife berechnete %ld \n in %f ticks =%f Sekunden.\n",e,duration,duration/CLOCKS_PER_SEC);

e=0;
i=0;
start=clock();
while(i<steps){
i++;
e+=i;
}
finish=clock();
duration = (double)(finish - start);
printf("While Schleife berechnete %ld \n in %f ticks =%f Sekunden.\n",e,duration,duration/CLOCKS_PER_SEC);

return 0;
}

Das Programm liefert nun für

Eingabe stdin:

100

Ausgabe stdout:

For Schleife berechnete 5050
in 0.000000 ticks =0.000000 Sekunden.
While Schleife berechnete 5050
in 0.000000 ticks =0.000000 Sekunden.

Eingabe stdin:

1000000000

Ausgabe stdout:

For Schleife berechnete -243309312
in 1140.000000 ticks =1.140000 Sekunden.
While Schleife berechnete -243309312
in 1156.000000 ticks =1.156000 Sekunden.

Hier tritt ein overflow ein, da es keinen intrinsichen Zahlenbereich gibt, der Zahlen dieser Größe verarbeiten kann.

 

7.Aufgabe

Aufgabenstellung:

Schreiben Sie  bitte ein C-Programm, das die groessere Zahl von zwei Integer-Zahlen bestimmt.

Lösung

CCode:

#include <stdio.h>

int
main()
{
int i,j;
freopen( "stdout.txt", "w", stdout ); //Leitet die Standardausgabe in die Datei stdout.txt um
freopen( "stdin.txt", "r", stdin ); //Liest die Standardeingabe aus der Datei stdin.txt um
scanf("%d",&i);
scanf("%d",&j);
if(i>j){
printf("%d",i);
}else{
printf("%d",j);
}

return 0;

Eingabe stdin:

48
5

Ausgabe stdout:

48

Alternativ kurzschreibweise über shell:

CCode:

#include <stdio.h>

int main(){
int i, j;
scanf("%d", &i); scanf("%d", &j);
printf("%d\n", i>j ? i : j);
return 0;}