Klausuren.de  
Klausur, Prüfung oder Test erfolgreich bestehen!
 


 Klausuren.de »

Zeiger und Vektoren (Felder)

Inhaltsverzeichnis

Inhalt der Arbeit:

I. DATENSTRUKUREN
Ich habe als Ding-Typ haus gewählt, weil sich hierbei einige sinnvoll Berechnungen durchführen lassen und sich die Struktur gut zum Schachteln eignet.
Wichtig erschien mir in Hinblick auf die geforderte Einfachheit die Anzahl der Zimmer, sowie de-ren Größe und Zustand (vermietet, privat, leer), um Berechnungen durchführen zu können. Die Informationen über das Dach (Größe, Solarfläche, etc.) werden zwar in den nachfolgenden Programmen nicht benutzt, sind aber deshalb wichtig, wenn man z.B. die Heizleistung unter Be-rücksichtigung der Sonnenenergienutzung berechnen will. Aus Gründen der Übersichtlichkeit und weil es in der Übung vornehmlich um die Datenstruktur geht, wurden die Funktionen aber bewußt einfach gehalten.
A. Listing
//
// ********************************
// Übung: Datenstrukturen
// Nummer: 2-1

#include

main()
{ struct haus
{ enum { fossil, elektrisch, solar } heizung;
struct raum
{ int groesse;
enum { leer, privat, vermietet } zustand;
} zimmer[10];
struct
{ int flaeche, solarfl;
float wirkungsgrad;
} dach;
} meinHaus, nachbarHaus, gartenHaus; //Hier werden die drei Objekte angelegt!
}
Die Anzahl der Zimmer wurde auf 10 beschränkt, da dies für die Demonstration der Strukturen-verarbeitung vollkommen ausreicht.
Da nur ausführbarer Code getestet werden kann, muß auf Testplan und Bildschirmdialog ver-zichtet werden.
II. FUNKTIONEN
Obwohl Zeiger noch nicht „offizieller“ Bestandteil der aktuellen Übung ist, habe ich sie dennoch verwendet, um die Eingabe der verschiedenen Daten in einer Funktion zu realisieren. Diese Funktion zeigt gut, wie man auf die einzelnen Elemente der Struktur haus zugreifen muß.
Die Ausgabefunktion bietet sich an, wenn man das Überladen von Funktionen zeigen will. Ich habe mich dafür entschieden, daß man entweder alle Daten eines Hauses oder nur die eines einzelnen Zimmers ausgeben kann. Da hierbei die Anwendungsbereiche sinnverwandt sind, ist es logisch, daß man die Funktionen gleich benennt und somit überlädt.
Die beiden Berechnungsfunktionen werden jeweils mit einem Default-Parameter versehen, der dann einspringt, wenn der Benutzer beim Funktionsaufruf keine brauchbare Berechnungsgrund-lage eingibt.
A. Listing
//
// ********************************
// Übung: Funktionen
// Nummer: 2-2

#include

struct haus
{ enum { fossil, elektrisch, solar } heizung;
struct raum
{ int groesse;
enum { leer, privat, vermietet } zustand;
} zimmer[10];
struct
{ int flaeche, solarfl;
float wirkungsgrad;
} dach;
};


void eingabe(haus*);
void ausgabe(haus);
void ausgabe(haus::raum); //Überladene Funktion
int heizleistung(haus,int lstg=300); //lstg = Heizlst/m² [W]
int miete(haus,int zins=500); //zins = Mietzins/m² [öS]


void main()
{ int i, z;
haus meinHaus, nachbarHaus, gartenHaus;
haus* aHaus;

do
{ cout << "\nWelches Haus moechten Sie bearbeiten?";
cout << "\n1. Mein Haus" << "\n2. Nachbarhaus" << "\n3. Gartenhaus"
<< "\n0. Ende";
cout << "\nIhre Wahl: ";
cin >> i;

switch(i)
{ case 1: aHaus=&meinHaus; break;
case 2: aHaus=&nachbarHaus; break;
case 3: aHaus=&gartenHaus; break;
default: ;
}
if(i)
{ cout << "\nWas moechten Sie tun?";
cout << "\n1. Daten eingeben" << "\n2. Hausdaten ausgeben"
<< "\n3. Zimmerdaten ausgeben" << "\n4. Heizleistung berechnen"
<< "\n5. Miete berechnen" << "\n0. Abbruch";
cout << "\nIhre Wahl: ";
cin >> i;

switch(i)
{ case 1: eingabe(aHaus); break;
case 2: ausgabe(*aHaus); break;
case 3: do
{ cout << "\nWelches Zimmer? ";
cin >> z;
}
while((z<0)||(10 ausgabe(aHaus->zimmer[z]);
break;
case 4: cout << "\nErforderliche Heizleistung [W/m²]: ";
cin >> z;
cout << "Gesamtheizleistung: ";
if(z) cout << heizleistung(*aHaus,z);
else cout << heizleistung(*aHaus); //Default bei 0
break;
case 5: cout << "\nMietzins [öS/m²]: ";
cin >> z;
cout << "Gesamtmiete: ";
if(z) cout << miete(*aHaus,z);
else cout << miete(*aHaus); //Default bei 0
break;
default: ;
}
}
}
while(i);
cin >> i; //Dummy
}

void eingabe(haus* aHaus)
{ for(int i=0;i<10;i++)
{ cout << "\nGeben Sie die Zimmergroesse " << i << " ein: ";
cin >> aHaus->zimmer[i].groesse;
if (aHaus->zimmer[i].groesse == 0) break; //Eingabe abschließen bei "0"
cout << "\nGeben Sie den Zustand ein (0/1/2): ";
cin >> (int)aHaus->zimmer[i].zustand; //Vermeidet WARNING
}
cout << "\n\nGeben Sie die Dachflaeche ein: ";
cin >> aHaus->dach.flaeche;
cout <<"\nGeben Sie die Solarflaeche ein: ";
cin >>aHaus->dach.solarfl;
cout << "\nGeben Sie den Solarwirkungsgrad: ";
cin >> aHaus->dach.wirkungsgrad;
cout << "\nGeben Sie den Heizungstyp ein (0/1/2): ";
cin >> (int)aHaus->heizung; //Vermeidet WARNING
}


void ausgabe(haus aHaus)
{ int i=0;
while((i<10)&&(aHaus.zimmer[i].groesse))
{ cout << "\nZimmergroesse " << i << ": " << aHaus.zimmer[i].groesse;
cout << "\nZustand: ";
switch(aHaus.zimmer[i].zustand)
{ case 0: cout << "leer"; break;
case 1: cout << "privat"; break;
case 2: cout << "vermietet"; break;
default: ;
}
i++;
}
cout << "\n\nDachflaeche: " << aHaus.dach.flaeche;
cout <<"\nSolarflaeche: " << aHaus.dach.solarfl;
cout << "\nSolarwirkungsgrad: " << aHaus.dach.wirkungsgrad;
cout << "\nHeizungstyp: ";
switch(aHaus.heizung)
{ case 0: cout << "fossil"; break;
case 1: cout << "elektrisch"; break;
case 2: cout << "solar"; break;
default: ;
}
}

void ausgabe(haus::raum aRaum)
{ cout << "\nZimmergroesse: " << aRaum.groesse;
cout << "\nZustand: ";
switch(aRaum.zustand)
{ case 0: cout << "leer"; break;
case 1: cout << "privat"; break;
case 2: cout << "vermietet"; break;
default: ;
}
}

int heizleistung(haus aHaus,int lstg) //lstg = Heizlst/m² [kw]
{ int i=0,sumFl=0;
while((i<10)&&(aHaus.zimmer[i].groesse))
{ if(aHaus.zimmer[i].zustand) sumFl+=aHaus.zimmer[i].groesse;
i++; //Gesamtfläche der BENUTZTEN Zimmer
}
return(sumFl*lstg);
}


int miete(haus aHaus,int zins) //zins = Mietzins/m² [öS]
{ int i=0,sumFl=0;
while((i<10)&&(aHaus.zimmer[i].groesse))
{ if(aHaus.zimmer[i].zustand==2) sumFl+=aHaus.zimmer[i].groesse;
i++; //Gesamtfläche der VERMIETETEN Zimmer
}
return(sumFl*zins);
}
B. Testplan, Test und Bildschirmdialog
Aufgrund eines diesbezüglichen Hinweises von Hrn. Strasser in der Übungsstunde wird die EXE-Datei, die aus dieser CPP-Datei erzeugt wird, nicht separat getestet. Die nächste Aufgabe beinhaltet exakt den gleichen Code, jedoch gesplittet auf mehrere Dateien, die der Compi-ler/Linker als Project wieder zusammenführt und eine EXE-Datei erzeugt.
Der Test dieser Datei ist gleichwertig!
III. MODULE
Der Code aus der CPP-Datei der Aufgabe 2 wird (mit Ausnahme der Funktion main) in eine ei-genständige CPP-Datei kopiert.
Die Prototypen und die Definition des Ding-Typs wird in eine H-Datei kopiert, die den gleichen Namen trägt. Durch Präprozessoranweisungen wird sichergestellt, daß keine ungewollten Mehr-fachdefinitionen vorkommen können. Diese Datei enthält keinen ausführbaren Code, sondern stellt lediglich eine Schnittstellendefinition der zugrundeliegenden CPP-Datei dar.
Die H-Datei wird sowohl von der zugehörigen CPP-Datei als auch vom Testtreiber inkludiert. Somit stehen die Funktionen und selbsterstellten Datenstrukturen im Testtreiber zur Verfügung. Dieser besteht im wesentlichen ja nur aus der Funktion main aus Aufgabe 2, ist also ein „richti-ger“ Testtreiber, der nur die Funktionen des anderen Moduls benutzt.
Das erstellte Project wird wie gewohnt compiliert/gelinkt, wobei die IDE automatisch erkennt, ob eine oder mehrere Komponenten geändert wurden. Diese werden dann neu kompiliert und die Object-Dateien zum fertigen EXE-Programm gelinkt.
Zu beachten ist allerdings, daß die Borland C++ 5.0 IDE nicht erkennt, ob ein Modul mit den korrekten Einstellungen kompiliert wurde! So kann es z.B. sein, daß man selbst ein Modul als DOS (16 Bit) OBJ kompiliert hat, das Project aber als Basis auf WIN32 aufsetzt. In diesem Fall ist das DOS OBJ nach wie vor gültig, weil ja keine Veränderungen vorgenommen wurden! Der Linker versucht in diesem Fall 16- und 32-Bit-Code zu vereinen, was ihm unter der Ausgabe besonders kryptischer Fehlermeldungen z.T. gelingt, das fertige Programm jedoch im DOS-Subsystem CPU-Ausnahmefehler verursacht.
Mit Hilfe von Hrn. Strasser ist es mir dann gelungen, diese Fehlermeldungen richtig zu deuten und den „Fehler“ zu beheben, sprich: alle Source-Dateien neu im Project zu kompilieren.
A. Listings
1. Testtreiber
//
// ********************************
// Übung: Module
// Nummer: 2-3

// Testtreiber

#include
#include "haus.h"

void main()
{ int i, z;
haus meinHaus, nachbarHaus, gartenHaus;
haus* aHaus;

do
{ cout << "\nWelches Haus moechten Sie bearbeiten?";
cout << "\n1. Mein Haus" << "\n2. Nachbarhaus" << "\n3. Gartenhaus"
<< "\n0. Ende";
cout << "\nIhre Wahl: ";
cin >> i;

switch(i)
{ case 1: aHaus=&meinHaus; break;
case 2: aHaus=&nachbarHaus; break;
case 3: aHaus=&gartenHaus; break;
default: ;
}
if(i)
{ cout << "\nWas moechten Sie tun?";
cout << "\n1. Daten eingeben" << "\n2. Hausdaten ausgeben"
<< "\n3. Zimmerdaten ausgeben" << "\n4. Heizleistung berechnen"
<< "\n5. Miete berechnen" << "\n0. Abbruch";
cout << "\nIhre Wahl: ";
cin >> i;

switch(i)
{ case 1: eingabe(aHaus); break;
case 2: ausgabe(*aHaus); break;
case 3: do
{ cout << "\nWelches Zimmer? ";
cin >> z;
}
while((z<0)||(10 ausgabe(aHaus->zimmer[z]);
break;
case 4: cout << "\nErforderliche Heizleistung [W/m²]: ";
cin >> z;
cout << "Gesamtheizleistung: ";
if(z) cout << heizleistung(*aHaus,z);
else cout << heizleistung(*aHaus); //Default bei 0
break;
case 5: cout << "\nMietzins [öS/m²]: ";
cin >> z;
cout << "Gesamtmiete: ";
if(z) cout << miete(*aHaus,z);
else cout << miete(*aHaus); //Default bei 0
break;
default: ;
}
}
}
while(i);
cin >> i; //Dummy
}
2. Schnittstellen Definition


// ********************************
// Übung: Module
// Nummer: 2-3

// Schnittstellendatei

#ifndef haus__H
#define haus__H

struct haus
{ enum { fossil, elektrisch, solar } heizung;
struct raum
{ int groesse;
enum { leer, privat, vermietet } zustand;
} zimmer[10];
struct
{ int flaeche, solarfl;
float wirkungsgrad;
} dach;
};


void eingabe(haus*);
void ausgabe(haus);
void ausgabe(haus::raum); //Überladene Funktion
int heizleistung(haus,int lstg=300); //lstg = Heizlst/m² [W]
int miete(haus,int zins=500); //zins = Mietzins/m² [öS]

#endif
3. Implementierungs-Modul
// ********************************
// Übung: Module
// Nummer: 2-3

// Implementierungsdatei

#include
#include "haus.h"

void eingabe(haus* aHaus)
{ for(int i=0;i<10;i++)
{ cout << "\nGeben Sie die Zimmergroesse " << i << " ein: ";
cin >> aHaus->zimmer[i].groesse;
if (aHaus->zimmer[i].groesse == 0) break; //Eingabe abschließen bei "0"
cout << "\nGeben Sie den Zustand ein (0/1/2): ";
cin >> (int)aHaus->zimmer[i].zustand; //Vermeidet WARNING
}
cout << "\n\nGeben Sie die Dachflaeche ein: ";
cin >> aHaus->dach.flaeche;
cout <<"\nGeben Sie die Solarflaeche ein: ";
cin >>aHaus->dach.solarfl;
cout << "\nGeben Sie den Solarwirkungsgrad: ";
cin >> aHaus->dach.wirkungsgrad;
cout << "\nGeben Sie den Heizungstyp ein (0/1/2): ";
cin >> (int)aHaus->heizung; //Vermeidet WARNING
}


void ausgabe(haus aHaus)
{ int i=0;
while((i<10)&&(aHaus.zimmer[i].groesse))
{ cout << "\nZimmergroesse " << i << ": " << aHaus.zimmer[i].groesse;
cout << "\nZustand: ";
switch(aHaus.zimmer[i].zustand)
{ case 0: cout << "leer"; break;
case 1: cout << "privat"; break;
case 2: cout << "vermietet"; break;
default: ;
}
i++;
}
cout << "\n\nDachflaeche: " << aHaus.dach.flaeche;
cout <<"\nSolarflaeche: " << aHaus.dach.solarfl;
cout << "\nSolarwirkungsgrad: " << aHaus.dach.wirkungsgrad;
cout << "\nHeizungstyp: ";
switch(aHaus.heizung)
{ case 0: cout << "fossil"; break;
case 1: cout << "elektrisch"; break;
case 2: cout << "solar"; break;
default: ;
}
}

void ausgabe(haus::raum aRaum)
{ cout << "\nZimmergroesse: " << aRaum.groesse;
cout << "\nZustand: ";
switch(aRaum.zustand)
{ case 0: cout << "leer"; break;
case 1: cout << "privat"; break;
case 2: cout << "vermietet"; break;
default: ;
}
}

int heizleistung(haus aHaus,int lstg) //lstg = Heizlst/m² [kw]
{ int i=0,sumFl=0;
while((i<10)&&(aHaus.zimmer[i].groesse))
{ if(aHaus.zimmer[i].zustand) sumFl+=aHaus.zimmer[i].groesse;
i++; //Gesamtfläche der BENUTZTEN Zimmer
}
return(sumFl*lstg);
}


int miete(haus aHaus,int zins) //zins = Mietzins/m² [öS]
{ int i=0,sumFl=0;
while((i<10)&&(aHaus.zimmer[i].groesse))
{ if(aHaus.zimmer[i].zustand==2) sumFl+=aHaus.zimmer[i].groesse;
i++; //Gesamtfläche der VERMIETETEN Zimmer
}
return(sumFl*zins);
}
B. Testplan, Test und Bildschirmdialog
Vorbemerkung: Da ich es überlas, daß ja nur mit einem „Ding“ zu rechnen wäre, habe ich mit-tels Zeiger eine Wahlmöglichkeit in bezug auf das zu bearbeitende Ding einge-baut.
Da dies jedoch wie gesagt nicht explizit verlangt war, wird im Test darauf nicht gesondert eingegangen.
„Es ist ausreichend, einen Bildschirmdialog zu erstellen, d.h. es müssen keine Eingabe- bzw. Ausgabedateien vorhanden sein.“ (Zitat Strasser, WWW) Daher lege ich auch keine derartigen Dateien mehr bei!
Da mir der Übung 0 mein Bildschirmdialog bemängelt worden war, habe ich in der Übungsstunde diesbezüglich Hrn. Strasser um seine Meinung gefragt. Er hat mir zugestanden, den entsprechenden Screen-Shot beim jeweiligen Test zu plazieren. Ich habe diese Methode bereits im ersten Semester angewandt, weil (meiner Meinung nach) so der Test übersichtlicher ist, wenn man zum Testfall gleich die entsprechenden Bildschirmausgaben „zur Hand“ hat.
Es soll gezeigt werden, daß die Zugriffe auf die Elemente der Strukturen korrekt implementiert wurden (wobei hier der Compiler bereits eine große Hilfe darstellt).
Die prinzipielle Korrektheit demonstriert eine einfache Ein-/Ausgabe Operation. Tiefere Einbli-cke gewähren dann die div. Funktionen, die auch mit bzw. ohne Default-Parameter eingesetzt werden.
Nicht getestet wird, wie das Programm auf illegale Eingaben reagiert! Die eingegebenen Werte müssen den verlangten Typen entsprechen!
Welches Haus moechten Sie bearbeiten?
1. Mein Haus
2. Nachbarhaus
3. Gartenhaus
0. Ende
Ihre Wahl: 1

Was moechten Sie tun?
1. Daten eingeben
2. Hausdaten ausgeben
3. Zimmerdaten ausgeben
4. Heizleistung berechnen
5. Miete berechnen
0. Abbruch
Ihre Wahl: 1

Geben Sie die Zimmergroesse 0 ein: 10

Geben Sie den Zustand ein (0/1/2): 1

Geben Sie die Zimmergroesse 1 ein: 20

Geben Sie den Zustand ein (0/1/2): 2

Geben Sie die Zimmergroesse 2 ein: 0


Geben Sie die Dachflaeche ein: 100

Geben Sie die Solarflaeche ein: 120

Geben Sie den Solarwirkungsgrad: 0.10

Geben Sie den Heizungstyp ein (0/1/2): 1

Welches Haus moechten Sie bearbeiten?
1. Mein Haus
2. Nachbarhaus
3. Gartenhaus
0. Ende
Ihre Wahl: 1

Was moechten Sie tun?
1. Daten eingeben
2. Hausdaten ausgeben
3. Zimmerdaten ausgeben
4. Heizleistung berechnen
5. Miete berechnen
0. Abbruch
Ihre Wahl: 2

Zimmergroesse 0: 10
Zustand: privat
Zimmergroesse 1: 20
Zustand: vermietet

Dachflaeche: 100
Solarflaeche: 120
Solarwirkungsgrad: 0.1
Heizungstyp: elektrisch
1. Normale Ein-/Ausgabe
Ein kompletter Datensatz wird ein- und anschließend wieder ausgegeben.
2. Test der überladenen Funktion
Die „zweite“ Ausgabefunktion, die nur die Daten eines Zimmers ausgibt, wird aufgrund der ein-zigartigen Funktionssignatur erkannt und aufgerufen. Da das Programm nach dem 1. Test nicht beendet wurden, sind die Daten nach wie vor im Speicher und müssen nicht neu eingegeben werden.
Gut zu erkennen ist, daß der Sourcecode durch die Nutzung überladener Funktionen wesentlich an Übersichtlichkeit gewinnt.
Welches Haus moechten Sie bearbeiten?
1. Mein Haus
2. Nachbarhaus
3. Gartenhaus
0. Ende
Ihre Wahl: 1

Was moechten Sie tun?
1. Daten eingeben
2. Hausdaten ausgeben
3. Zimmerdaten ausgeben
4. Heizleistung berechnen
5. Miete berechnen
0. Abbruch
Ihre Wahl: 3

Welches Zimmer? 1

Zimmergroesse: 20
Zustand: vermietet
3. Berechnung der Heizleistung
Welches Haus moechten Sie bearbeiten?
1. Mein Haus
2. Nachbarhaus
3. Gartenhaus
0. Ende
Ihre Wahl: 1

Was moechten Sie tun?
1. Daten eingeben
2. Hausdaten ausgeben
3. Zimmerdaten ausgeben
4. Heizleistung berechnen
5. Miete berechnen
0. Abbruch
Ihre Wahl: 4

Erforderliche Heizleistung [W/m?]: 500
Gesamtheizleistung: 15000
Diese Funktion kann sowohl mit als auch ohne (0) Parameter verwendet werden, was insbe-sondere dann nützlich ist, wenn man mit der Eingabetaste den Dafaultwert nur mehr bestätigen muß. Dies wäre möglich, indem man einen String einließt und, falls diese nicht leer ist, in eine Zahl umwandelt. Im vorliegenden Programm wurde dies jedoch nicht implementiert, der Dafaultwert wird verwendet, wenn man 0 eingibt.
Hier der Test, bei dem der Defaultwert überschrieben wird.
Da beide Zimmer bewohnt werden, wird die Heizleistung für 30m² berechnet.
4. Berechnung der Heizleistung mit Default-Parameter
Jetzt wird kein Wert eingegeben, also mit dem Defaultwert von 300W/m² gerechnet. Zudem werden neue Daten eingegeben, um zu zeigen, daß leere Zimmer tatsächlich nicht mitgerech-net werden.
Welches Haus moechten Sie bearbeiten?
1. Mein Haus
2. Nachbarhaus
3. Gartenhaus
0. Ende
Ihre Wahl: 2

Was moechten Sie tun?
1. Daten eingeben
2. Hausdaten ausgeben
3. Zimmerdaten ausgeben
4. Heizleistung berechnen
5. Miete berechnen
0. Abbruch
Ihre Wahl: 1

Geben Sie die Zimmergroesse 0 ein: 10

Geben Sie den Zustand ein (0/1/2): 0

Geben Sie die Zimmergroesse 1 ein: 20

Geben Sie den Zustand ein (0/1/2): 1

Geben Sie die Zimmergroesse 2 ein: 30

Geben Sie den Zustand ein (0/1/2): 2

Geben Sie die Zimmergroesse 3 ein: 0


Geben Sie die Dachflaeche ein: 100

Geben Sie die Solarflaeche ein: 120

Geben Sie den Solarwirkungsgrad: 0.10

Geben Sie den Heizungstyp ein (0/1/2): 2

Welches Haus moechten Sie bearbeiten?
1. Mein Haus
2. Nachbarhaus
3. Gartenhaus
0. Ende
Ihre Wahl: 2

Was moechten Sie tun?
1. Daten eingeben
2. Hausdaten ausgeben
3. Zimmerdaten ausgeben
4. Heizleistung berechnen
5. Miete berechnen
0. Abbruch
Ihre Wahl: 4

Erforderliche Heizleistung [W/m?]: 0
Gesamtheizleistung: 15000
5. Berechnung der Miete
Welches Haus moechten Sie bearbeiten?
1. Mein Haus
2. Nachbarhaus
3. Gartenhaus
0. Ende
Ihre Wahl: 2

Was moechten Sie tun?
1. Daten eingeben
2. Hausdaten ausgeben
3. Zimmerdaten ausgeben
4. Heizleistung berechnen
5. Miete berechnen
0. Abbruch
Ihre Wahl: 5

Mietzins [÷S/m?]: 100
Gesamtmiete: 3000
Wie bei der Heizleistung werden hier Defaultparameter verwendet, die jedoch vom Benutzer überschrieben werden können. Jetzt werden aber nicht nur die leeren, sondern auch die privat genutzten Zimmer bei der Berechnung ignoriert.
Der niedrige Mietzins läßt aber darauf schließen, daß an Verwandte vermietet wird!
Welches Haus moechten Sie bearbeiten?
1. Mein Haus
2. Nachbarhaus
3. Gartenhaus
0. Ende
Ihre Wahl: 2

Was moechten Sie tun?
1. Daten eingeben
2. Hausdaten ausgeben
3. Zimmerdaten ausgeben
4. Heizleistung berechnen
5. Miete berechnen
0. Abbruch
Ihre Wahl: 5

Mietzins [÷S/m?]: 0
Gesamtmiete: 15000
6. Berechnung der Miete mit Default-Parameter
Der Defaultwert wird wiederum „aktiviert“, wenn man als Mietzins 0 eingibt.
IV. KONVERTIEREN EINES OBERON- IN EIN C++-PROGRAMM
Prinzipiell kann die Prozedur wegen der Schachtelung nicht in C++ übernommen werden. Es wäre möglich, eine normale Rekursion zu programmieren, wobei aber berücksichtigt werden muß, daß die Variablen, die die Rekursion von der sie umgebenden Prozedur benutzt, explizit übergeben oder global definiert werden müssen.
Es fällt auch auf, daß das Ergebnis der mathematischen Funktion durch die Rekursion auf eine sehr komplizierte Weise errechnet wird. Viel leichter verständlich ist es, die math. Funktion di-rekt auf einen Algorithmus abzubilden! Eine einfache Zählschleife (entspricht der Summenfunk-tion) erfüllt diesen Zweck besser als eine Rekursion.
A. Listing
// Autor: Michael A. Gütlbauer
// Matrikel#: 9655226
// Kennzahl: 175
// LVA-Leiter: Thomas Strasser
// ********************************
// Übung: Funktion (Zusatz)
// Nummer: 2-4

#include

int sum(int,int);

void main()
{ int limit,start;
cout << "\nStart: "; cin >> start;
cout << "\nLimit: "; cin >> limit;
cout << sum(limit,start);

cin >> start; //Dummy
}


int sum(int limit,int start)
{ int sum=start;
for(int i=1;i<=limit;i++) //Direkte Umsetzung der Formel
sum+=(i+start);
return(sum);
}
B. Testplan, Test und Bildschirmdialog
Mehr als die mathematische Korrektheit des Algorithmus kann bei diesem Miniprogramm wohl kaum überprüft werden!
Durch die Wahl von kleinen Zahlenwerten kann die Überprüfung sehr leicht erfolgen. Werte-überläufe werden nicht getestet!
Start: 0

Limit: 5
15
1. Positive Zahlen, start=0
Start wird der Einfachheit halber 0 gesetzt. Mit limit=5 müßte sich ein Ergebnis von 15 ergeben (im Kopf leicht zu errechnen).
Start: 1

Limit: 5
21
2. Positive Zahlen
Mit start=1 und limit=5 müßte sich ein Ergebnis von 15+5+1=21 ergeben.
Start: -1

Limit: 5
9
3. Negative start-Variable
Mit start=-1 und limit=5 müßte sich 15-5-1=9 ergeben.
Copyright 2012 Klausuren.de | Impressum | Cookies