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
.
2.Aufgabe
Aufgabenstellung:
Welches Ergebnis liefert dieses Programm?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:
4.Aufgabe
Aufgabenstellung:
Warum liefert das folgende Programm unter Umständen ein falsches Ergebnis?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) ZahlenCCode:
#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.5unsinnig.
Ausgabe stdout:
1 . R e c h e n p r o g r a m mBitte 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.5liefert 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ösung
Das Programm
CCode:
#include <stdio.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>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:
100Ausgabe 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:
1000000000Ausgabe 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:
48Ausgabe 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;}