Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ......
Transcript of Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ......
Skript
Skript zur VorlesungProf. Dipl.-Ing. Ulrich Thalhofer
IngenieurinformatikGrundlagen der Programmierung in C++
WS10/11 Prof. Dipl.-Ing.Ulrich ThalhoferTelefon +49 821 55 86-3159Fax +49 821 55 [email protected]
1 Einführung
„Der Computer ist eine Maschinerie, die in 2 Sekunden ebenso viele Fehler machen kann wie 50 Leute in 200 Jahren, wenn sie Tag und Nacht arbeiten würden!“
Dieses Zitat aus unbekannter Quelle soll Sie nicht abschrecken, denn wir lernen bekanntlich ja alle vor allem aus Fehlern! Sie haben sich als Maschinenbaustudent sicherlich schon die Frage gestellt, warum denn nun gerade Sie das Programmieren lernen sollen. Es gibt ja schließlich Informatiker, deren Lebensaufgabe darin besteht Programme zu erstellen, die vom nicht programmierenden Teil der Bevölkerung verwendet werden können. Wozu also das Ganze, wozu die Mühe? Mir fallen auf diese Frage nur zwei Antworten ein: Wir arbeiten alle mit Produkten der EDV, vielleicht kann es ja gar nicht schaden etwas hinter die Kulissen zu schauen und etwas mehr Verständnis für dieses moderne Werkzeug zu bekommen. Das hat Sie noch nicht überzeugt? Dann lassen Sie es mich mit Antwort 2 probieren: Wer programmiert, lernt strukturiert zu denken. Wenn Sie das auch noch nicht auf meine Seite gebracht hat, dann noch eine Antwort, die nicht ganz offiziell ist, weil sie als Frage formuliert ist: Vielleicht macht es Ihnen ja auch irgendwann Spaß?
Ich wünsche Ihnen in diesem Semester (und natürlich auch später) viel Erfolg und Spaß beim Programmieren! Und nicht vergessen: Aller Anfang ist schwer!
1.1 Die Stufen der Programmierung
Alle Programme, die Sie am Computer verwenden (von Textverarbeitung über CAD bis zum Computerspiel) sind von Menschen erstellt worden. Das ist auch der Grund dafür, dass sie fehlerhaft sind! Leider versteht der Computer noch nicht Umgangssprache. Sein Wortschatz ist begrenzt, sehr begrenzt! Er kennt nur die beiden Zustände „1“ und „0“ oder „ein“ und „aus“ oder „wahr“ oder „falsch“ oder „schwarz“ oder „weiß“. Wahrscheinlich fallen Ihnen noch mehr Wortpaare ein (gut und böse, Student und Dozent?).
Hält man sich jedoch an ein paar Regeln, sogenannte Syntaxregeln, dann klappt die Verständigung. Man nennt das dann eine höhere Programmiersprache, wie z.B. C++. Der Computer kann diese Formulierungen in einfache Anweisungen übersetzen, die speziell auf seine Möglichkeiten zugeschnitten sind. Man nennt das dann Maschinenbefehle, die innerhalb von Prozessorfamilien gleich sind. Als Mensch, besonders als Programmierer kann man diese Kommandos immer noch verstehen und bezeichnet dies als Assembler. Daraus wird dann zuletzt eine Folge von Nullen und Einsen, die sogenannte Maschinensprache, die allerdings für Nichtcomputer so schwer verständlich ist wie Nieselregen für einen Bewohner der afrikanischen Dürrezone. Im nachfolgenden Bild ist dieser Sachverhalt nochmals dargestellt.
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript01(2008/10/06) Kapitel 1 Seite 1
→Höhere Programmiersprache Assembler Maschinensprache(problemorientiert) (maschinenorientiert)c = a + b; load a 0001 0011
add b 0011 0010store c 0010 1011
Höhere Programmiersprachen gibt es sehr viele. Die nächste Darstellung zeigt die Entwicklung der Programmiersprachen auf.
Die drei folgenden Programme summieren sechs Zahlen.
Program Test;Var i : Integer; a, summe : Real;Begin summe := 0; For i:= 1 To 6 Do Begin ReadLn (a); summe := summe + a; End; WriteLn ('Summe : ', summe:10:2);End.Programm 1.1
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript01(2008/10/06) Kapitel 1 Seite 2
ALGOL
Pascal
Fortran
BASIC COBOL
PL/I
C
C++
Smalltalk
JAVA
SUMME = 0FOR K = 1 TO 6 INPUT A SUMME = SUMME + ANEXT KPRINT “Summe : “; SUMMEENDProgramm 1.2
#include <iostream>using namespace std;int main () { int i; double summe = 0, a; for ( i = 0; i<6; i++){ cin >> a; summe += a; } cout << “Summe: “ << summe; return 0;}Programm 1.3
Das erste Programm ist in Pascal, das zweite in BASIC und das dritte in C++ programmiert. Ähnlichkeiten mit anderen Programmiersprachen sind nicht zufällig. Irgend jemand hat einmal die Äußerung gemacht, dass C++-Programme so aussehen, wie wenn beim Ausdruck der Drucker unterschiedliche und falsche Zeichen und davon auch nicht alle auf das Papier bringt. C++ ist besser als sein Vorgänger C (hieß ganz früher auch B und noch früher A). „++” bedeutet auch „um eins mehr”, also C = C+1. C++ ist schwerer zu erlernen als manch andere Sprache und man kann auch leichter Fehler einbauen, die schwer zu finden sind. Warum verwenden wir dann diese Programmiersprache? Die Vorteile sind folgende:
• weit verbreitet in der Praxis• universell einsetzbar• schnell• standardisiert (hardwareunabhängig)• objektorientiert
Über die zu verwendende Programmiersprache haben wir uns also geeinigt. Wie erstellt man aber nun ein Computerprogramm? Dazu braucht man einen Editor, einen Compiler und einen Linker. In diesem Skript wird Dev-C++ Version 4.9.9.2 (http://www.bloodshed.net/devcpp.html) verwendet und darin finden sich alle obengenannten Werkzeuge oder Tools, wie man sagt. Der generelle Ablauf sieht so aus:
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript01(2008/10/06) Kapitel 1 Seite 3
Die Zeit, die auf Fehlerkorrekturen verwendet wird, sollte nicht unterschätzt werden. Auch wenn das Programm läuft, heißt es noch nicht, dass es auch richtig funktioniert.
Konkret verläuft die Programmerstellung mit Dev-C++ so ab:
• Datei – Neu – Quelldatei• Programm eintippen• Ausführen – Kompilieren+Ausführen
Und nicht vergessen: Ab und zu das Erarbeitete sichern! Leider schließt das Programm automatish das DOS-Fenster, in dem das Ergebnis des Programms angezeigt wird. Deshalb sollten in die Datei folgende Zeilen aufgenommen werden:
#include <iostream>using namespace std;int main () { // hier stehen die // Anweisungen des Programms system (”pause”); return 0;}
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript01(2008/10/06) Kapitel 1 Seite 4
Erzeugung eines lauffähigen Programmes
Problembeschreibung
Modellbildung (Entwurf von Datenstrukturen und Algorithmen)
Quellprogramm editieren
Compilieren (Übersetzen)
Linken (Binden der Objektprogramme)
Ausführen und Testen
Fertiges Programm
Editor (Quellcode)
Compiler (Objektcode)
Linker (executable)
Fehlerkorrektur/ Vervollständigung
Sollten Sie lieber den Visual C++-Compiler (Version 6.0) von Microsoft verwenden, so sind folgende Schritte zur Programmerstellung nötig:
• Visual C++ starten• Neue CPP-Datei erstellen:
Datei > NeuDateien: C++-Quellcodedatei
• Datei speichern:Datei > Speichern (z.B. uebung1.cpp) Wichtig: In Ihrem Ordner speichern!!
• Programm eintippen und speichern• Datei kompilieren:
Erstellen > Kompilieren von uebung1.cppMeldung: Der Befehl „Erstellen erfordert... > ja
• Programm ausführen:Erstellen > Ausführen von uebung1.exe
Das Grundgerüst sieht dann etwa so aus:
#include <iostream> //falls benötigtint main () { // hier stehen die // Anweisungen des Programms return 0;}
Die include-Datei (wird im nächsten Kapitel erklärt) kann als iostream oder iostream.h geschrieben werden.
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript01(2008/10/06) Kapitel 1 Seite 5
2 Programmaufbau
Beispiel:
#include <iostream> // Einbindung Ein- und// Ausgabefunktionen
using namespace std; // legt Standardbereich festint main () { // Beginn des Hauptprogramms/* Berechnung von Umfang und Fläche eines Kreises
Erstellt von: am:*/const float PI = 3.14159265; // konstante Wertefloat radius, flaeche, umfang; // variable Wertecout << "Eingabe Radius: "; // Eingabecin >> radius;flaeche = radius * radius * PI; // Berechnungumfang = 2 * radius * PI;cout << "Fläche: " << flaeche << endl; // Ausgabecout << "Umfang: " << umfang << endl;system ("pause"); // hält DOS-Fenster offenreturn 0; } // Ende des Programms
Header-Datei
#include <iostream>using namespace std;• der Inhalt der Datei „iostream.h“ wird eingefügt• Bibliothek mit Definitionen• iostream.h: cin, cout• Der „namespace“ (Bereich) wird auf Standard eingestellt.
main
int main () { // hier beginnt der Computer zu arbeiten
return 0; } // hier endet das Programm
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript02(2006/10/05) Kapitel 2 Seite 1
Kommentar
• nicht nötig, aber sehr nützlich• ein Kommentar wird vom Computer nicht beachtet
Beispiele:
/* Dies sind Infos für den Programmierer.*/y = sqrt(x); // Vorsicht bei negativen x-Werten!
Konstante
const float PI = 3.1416;
float: DatentypPI : Bezeichner3.1416: Wert
ein konstanter reeller Wert mit Namen PI und dem Wert 3,1416
kann im Programm nicht auf einen anderen Wert gesetzt werden
Variable
float radius;
float: Datentypradius: Bezeichner
eine Variable mit Namen radius (kein Wert zugewiesen)
float radius = 0; (mit Wertzuweisung)
Bezeichner
• Groß- und Kleinschreibung wird unterschieden• Länge des Bezeichners vom verwendeten C++-Compiler abhängig (meist 32 Zeichen
signifikant)• erstes Zeichen muss Buchstabe sein• Sonderzeichen (!, $, ä, +, Leerzeichen, ....) nicht erlaubt
zulässig: h2s04, uebung1, uebung_1unzulässig: 1a, V2A-Stahl, main, Übung13, uebung 1
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript02(2006/10/05) Kapitel 2 Seite 2
Block
int main () { //ein Block in geschweiften Klammern
return 0; }
geschweifte Klammern fassen Anweisungen zusammen
Anweisungen
enden mit einem „ ; “
z.B.:
summe = f1 + f2; a = 3.4; cout << "hallo";
Ein-/Ausgabe
#include <iostream.h>cout << "Eingabe Radius:";Oder: cout << "Eingabe Radius:" << endl; //neue Zeilecin >> radius;
ACHTUNG: bei cin können nur Variable stehen!!
FALSCH: cin >> radius >> endl;cin >> "hallo";
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript02(2006/10/05) Kapitel 2 Seite 3
Übungsaufgaben:
Aufgabe 2.1:
Schreiben Sie jeweils ein C++-Programm, das
• die Temperatur in Grad Celsius einliest, die entsprechende Temperatur in Grad Fahrenheit errechnet und ausgibt.
• die umgekehrte Umrechnung ausführt.
Formel: fahrenheit = 9.0/5.0 ∙ celsius + 32.0;
Kontrollieren Sie das Ergebnis!
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript02(2006/10/05) Kapitel 2 Seite 4
3 Datentypen und Operatoren
3.1 Einfache Datentypen
Alle Daten werden vom Computer im Binärformat gespeichert. Damit der Computer weiß, um welche Daten (Zahlen, Texte, logische Größen) es sich handelt,muß ihm der Datentyp mitgeteilt werden.
3.1.1 Ganze Zahlen
Datentyp Anzahl Bits Wertebereichshort 16 -32 768 ... 32 767 -215 ... 215 - 1unsigned short 16 0 ... 65 535 0 ... 216 - 1int 32 -2 147 483 648 ... -231 ... 231 - 1unsigned int 32 0 ... 4 294 967 295 0 ... 232 - 1long 32 -2 147 483 648 ... -231 ... 231 - 1unsigned long 32 0 ... 4 294 967 295 0 ... 232 - 1
Achtung: Zahlendarstellung kann von Compiler und Rechner abhängen!Bei Bereichüberschreitung keine Fehlermeldung!
Dualsystem:
0010 1011 = 1⋅20 + 1⋅21 + 0⋅22 + 1⋅23 + 0⋅24 + 1⋅25 = 1 + 2 + 8 + 32 = 43
115 = 64 + 32 + 16 + 2 + 1 = 1⋅26 + 1⋅25 + 1⋅24 + 0⋅23 + 0⋅22 + 1⋅21 + 1⋅20 = 0111 0011
Vorzeichenlose Zahlen mit 3 Bit:
000 001 010 011 100 101 110 1110 1 2 3 4 5 6 7 (23 – 1)
Vorzeichenbehaftete Zahlen mit 3 Bits:
linksseitiges Bit für Vorzeichen ( 0: positiv, 1: negativ)positive Zahlen: 000 001 010 011
0 1 2 3
negative Zahlen: Zweierkomplement (alle Bits invertieren, dann 1 adieren)-1 : 001 → 110 + 1 = 111
111 110 101 100-1 -2 -3 -4
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript03 (2007/03/17) Kapitel 3 Seite 1
3.1.2 Reelle Zahlen
Datentyp Anzahl Bits Wertebereich Genauigkeitfloat 32 ± 3,4⋅10-38...± 3,4⋅1038 7double 64 ± 1,7⋅10-308...± 1,7⋅10308 15long double 80 ± 3,4⋅10-4932...± 3,4⋅104932 19
Achtung: Wertebereich und Genauigkeit sind auch hier rechner- bzw. compilerabhängig!Die Genauigkeit bezieht sich immer auf die Gesamtanzahl der Stellen der Zahl!Sehr kleine und sehr große Zahlen sind nicht darstellbar!
Beispiele zur Ein-/Ausgabe:
23.786 23,7860.5E2 0,5⋅102 = 503.4e-3 0,0034
Beispiel für Berechnung von Genauigkeit und Wertebereich:
64 bit: 1 Vorzeichen Bit + 52 Mantisse-Bits252 ≈ 4,5⋅1015 → 15 Stellen Genauigkeit
1 Exp. Vorzeichen Bit + 10 Exponenten Bits210 = 1024 → 21024 ≈ 10308
3.1.3 Zeichen
Buchstaben, Ziffern und Sonderzeichen werden als Zeichen (Character) in einer Tabelle (ASCII-Tabelle) codiert.
ASCII = American Standard Code for Information Interchange
Beispiel: '0' = 48 '9' = 57'A' = 65 'a' = 97'Z' = 90 'z' = 122
Beispiel zur Verwendung von Zeichen in einem Programmteil:
char zeichen, x;
zeichen = 'a';x = '8';
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript03 (2007/03/17) Kapitel 3 Seite 2
Unterschied zwischen einer Ziffer und einem Zeichen:
char zeichen;int zahl;
zeichen = '8'; // char-Variable hat den Wert 56 (das // Zeichen '8') gespeichert
zahl = 8; // int-Variable hat den Wert 8 gespeichert
3.1.4 Logischer Datentyp
Dieser Datentyp kann nur die beiden Werte wahr (true =1) oder falsch (false = 0) annehmen.
bool logisch;logisch = 0; // false
3.2 Operatoren
3.2.1 Arithmetische Operatoren
• für ganze Zahlen:+ Addition- Subtraktion* Multiplikation/ Division für ganze Zahlen (9/5 ergibt 1, da 5 in 9 1-mal enthalten ist)% Modulo (9 % 5 ergibt 4, bei der Ganzzahldivison bleibt ein Rest von 4)
• für reelle Zahlen:+ Addition- Subtraktion* Multiplikation/ Division ( 9.0 / 5 ergibt 1.8 )
Auch in C++ gilt: Punkt vor Strich! Soll die Reihenfolge geändert werden, so sind runde Klammern zu verwenden!
a = 9.0/5 + 2; // a enthält den Wert 3.8
b = 8.0 / (5-1); // b enthält den Wert 2
• C++ - spezifische Operatoren:
i++; i=i+1;i--; i=i-1;++i; i=i+1;--i; i=i-1;
Vorsicht bei Verwendung in Kombination mit dem Zuweisungsoperator:
i=5;a =++i;// a enthält 6 und i enthält 6
i=5;a=i++;// a enthält 5 und i enthält 6
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript03 (2007/03/17) Kapitel 3 Seite 3
weitere Beispiele:
a += 5; a = a+5;a *= 5; a = a*5;a /= 5; a = a/5;usw.
• Zuweisungsoperator:
a = a + 3; // addiere zur Variablen a den Wert 3 und speichere das Ergebnis // in der Variablen a
3.2.2 Logische Operatoren
a) Vergleichsoperatoren
Operator Bedeutung
== gleich (identisch)< kleiner<= kleiner gleich> größer>= größer gleich!= ungleich
bool x; x = 3.14 > 3; // x enthält den Wert true x = 'A' > 'B'; // x enthält den Wert false
b) Verknüpfungsoperatoren
Es können nur logische Werte verknüpft werden!
Operator Bedeutung
&& und || oder ! nicht
Ausführungsreihenfolge: ! - && - ||
Wahrheitstabellen
NICHT true falsefalse true
ODER true falsetrue true truefalse true false
UND true falsetrue true falsefalse false false
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript03 (2007/03/17) Kapitel 3 Seite 4
Bereichsdarstellung:
mathematisch: 0 < a ≤ 2in C++: 0 < a && a <= 2
3.3 Standardfunktionen
mathematische Funktionen:
#include <cmath> hier werden die math. Funktionen definiert
Hinweis: in cmath.h ist auch meistens die Konstante π gespeichert (M_PI)
;xy = y = fabs (x);
;fxy = y = pow (x,f);
;xy = y = sqrt (x);
;sin xy = y = sin (x); x im Bogenmaß für alle trigonometr. Funktionen!
;cos xy = y = cos (x):
;tan xy = y = tan (x);
;arcsin xy = y = asin (x);
;cosh xy = y = cosh (x);
;xey = y = exp (x);
;ln xy = y = log (x);
;lg xy = y = log10 (x);
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript03 (2007/03/17) Kapitel 3 Seite 5
Übungsaufgaben:
Aufgabe 3.1
Schreiben Sie ein C++ - Programm, das das bestimmte Integral
in den Grenzen ux und ox berechnet. Der Parameter a kann frei gewählt werden.
Formel zur Berechnung:
Benötigte mathematische Formeln in C++:
mathematisch C++ (in cmath)
sin x sin (x)tan x tan (x)ln x log (x)|x| fabs (x)tan x tan (x)
Aufgabe 3.2: Zahlentauschen
Schreiben Sie ein C++ - Programm, das 3 ganze Zahlen einliest und in umgekehrter Reihenfolge wieder ausgibt.
Beispiel: Eingabe: 15 47 12 Ausgabe: 12 47 15
Aufgabe 3.3: Wortdrehung
Schreiben Sie ein C++ - Programm, das ein Wort mit vier Buchstaben einliest, die Buchstaben verdreht und das gedrehte Wort ausgibt.
Beispiel: Eingabe: RABE Ausgabe: EBAR
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript03 (2007/03/17) Kapitel 3 Seite 6
dxaxaxox
ux∫ )cos(
)(sin 2
+⋅+−=∫ 42
tanln1)sin()cos()(sin 2 πax
aaaxdx
axax
Aufgabe 3.4: Datumsformate
Schreiben Sie ein C++ - Programm, das
• eine Datumsangabe in amerikanischer Form ( MM /TT /JJJJ ) einliest
Beispiel: 4/2/2001 oder 11/22/1954
• in die deutsche Schreibweise ( TT.MM.JJJJ ) umwandelt und ausgibt.
Beispiel: 2.4.2001 oder 22.11.1954
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript03 (2007/03/17) Kapitel 3 Seite 7
4 Kontrollstrukturen
4.1 Verzweigungen
bisher: Ausführung der Anweisungen in sequentieller ReihenfolgeVerzweigung: Überspringen von Anweisungen
4.1.1 if-Anweisung
Beispiel zur Berechnung der Quadratwurzel:
#include <iostream>#include <cmath>#include <cstdlib>using namespace std;int main () { /* Berechnung der Quadratwurzel bei negativer Zahl erfolgt eine Fehlermeldung */double x, y;cout << "Zahl eingeben: "; cin >> x;
if (x >= 0) { // geschweifte Klammern nur nötig, wenn hier mehr// als eine Anweisung steht
y = sqrt(x); cout << "Ergebnis: " << y << endl; } else { // geschweifte Klammern hier eigentlich
// nicht nötig cout << "Fehler: Negative Eingabe!" << endl; }system ("pause");return 0;}
allgemeines Schema:
if (Bedingung) { Anweisungsteil 1 }else { Anweisungsteil 2 }
Wenn die Bedingung wahr ist, dann wird Anweisungsteil 1 ausgeführt, andernfalls Anweisungsteil 2.Der else-Zweig muss nicht vorhanden sein, dann wird die Anweisung nach dem Anweisungsteil 1 ausgeführt, wenn die Bedingung nicht wahr ist.
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 1
if-Anweisungen dürfen geschachtelt werden:
a > 5 ja nein b = 0 0<= c < 10 ja nein ja nein
A B C c >= 10 ja nein
D E
if (a > 5){ if (b == 0){ ... //A } if (b != 0){ ...//B } }if (a <= 5){ if (0 <= c && c < 10){ ...//C } if (c >= 10){ ...//D } if (c < 0){ ...//E } }
besser mit else:
if (a > 5){ if (b == 0){ ...//A } else { ...//B } }else { if (0 <= c && c < 10){ ...//C } else { if (c >= 10) { ...//D } else { ...//E } } }
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 2
Achtung: Fehler 1: Nach der Bedingung der if-Anweisung darf kein „;“ stehenFALSCH: if (a < 0) ;else ;
Fehler 2: if (a < 0) ...
else (a>=0) // bei else darf keine Bedingung stehen!
Fehler 3: if (a = b)ist falsch und sollte if (a == b) heißen!
Auf richtige Klammerung achten:
1. Fall:
if (x == 1) if (y == 1) cout << "x == 1 y == 1"; else // else gehört zu (y == 1) cout << "x == 1 y != 1";
2. Fall:
if (x == 1){ if (y == 1) cout << "x und y sind 1"; }else // else gehört zu (x == 1) cout << "x != 1 y beliebig";
Beispiel 1: Maximum von 2 Zahlen bestimmen
#include <iostream>#include <cstdlib>using namespace std;int main () { double d1, d2, max; cout << "2 reelle Zahlen:"; cin >> d1 >> d2; if (d1 > d2) max = d1; else max = d2; cout << "Maximum: " << max; system ("pause"); return 0;}
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 3
Beispiel 2: Maximum von 3 Zahlen bestimmen
#include <iostream>#include <cstdlib>using namespace std;int main () { double d1, d2, d3, max; cout << "3 reelle Zahlen:"; cin >> d1 >> d2 >> d3; if (d1 > d2 && d1 > d3) max = d1; else if (d2 > d1 && d2 > d3) max = d2; else max = d3; cout << "Maximum: " << max; system ("pause"); return 0;}
Alternative Lösung:
#include <iostream>#include <cstdlib>using namespace std;int main () { double d1, d2, d3, max; cout << "3 reelle Zahlen:"; cin >> d1 >> d2 >> d3; max = d1; if (d2 > max) max = d2; if (d3 > max) max = d3; cout << "Maximum: " << max; system ("pause"); return 0;}
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 4
Übungsaufgaben:
Aufgabe 4.1: if-Anweisung (Quadratische Gleichung)
Schreiben Sie ein C++ - Programm, das die allgemeine quadratische Gleichung löst:
Dazu sollen die Koeffizienten a, b und c eingelesen und die Lösungen nach der bekannten Formel berechnet werden:
Hinweise:
• Benützen Sie die Diskriminante acbD 42 −= zur Fallunterscheidung• Betrachten Sie reelle und komplexe Lösungen• Der Sonderfall a = 0 soll abgefangen werden
Test:
• 4 x² - 36 x + 81 = 0;
• 2 x² + 2 x - 12 = 0;
• x² - 2 x + 2 = 0;
Aufgabe 4.2: Zahlenfolge (if-Anweisung)
Schreiben Sie ein C++-Programm, das 4 verschiedene Zahlen vom Bildschirm einliest, die größte und die zweitgrößte Zahl bestimmt und am Bildschirm ausgibt.
Beispiel:
Eingabe: 4 3 8 -1
Ausgabe: größte Zahl: 8Zweitgrößte Zahl: 4
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 5
02 =++ cbxax
aacbbx
242
2/1−±−=
Bemerkungen:
• Bestimmen Sie die größte und die zweitgrößte Zahl nicht getrennt, sondern in einer logischen Struktur.
• Verarbeiten Sie zunächst 2 Zahlen und nehmen Sie die beiden anderen Zahlen einzeln hinzu.
Aufgabe 4.3:
Ergänzen Sie das Programm aus Aufgabe 4.2 so, daß Sie alle 4 Zahlen nach fallender Größe ausgeben können.
Beispiel:
Eingabe: 4 3 8 –1 Ausgabe: 8 4 3 –1
Bemerkung:
Der Algorithmus von Aufgabe 4.2 soll dabei so weit wie möglich verwendet werden.
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 6
4.1.2 switch-Anweisung
Verwendung der switch-Anweisung:
• Auswahl mehrerer Möglichkeiten• nur Aufzählungstypen (ganze Zahlen, Zeichen) erlaubt• keine Bereichsangaben ( 'A' bis 'Z') möglich
Beispiel:
In einer Variablen tag wird der Wochentag gespeichert. Je nach Inhalt der Variablen (1,2,..,7) soll der Wochentag (Montag, Dienstag, ..., Sonntag) auf dem Bildschirm ausgegeben werden.
Programmierung mit if-Anweisung:
#include <iostream>#include <cstdlib>using namespace std;int main () { int tag; tag = 2; // für Testzwecke if (tag ==1) cout << "Montag" << endl; if (tag ==2) cout << "Dienstag" << endl; if (tag ==3) cout << "Mittwoch" << endl; if (tag ==4) cout << "Donnerstag" << endl; if (tag ==5) cout << "Freitag" << endl; if (tag ==6) cout << "Samstag" << endl; if (tag ==7) cout << "Sonntag" << endl; if (tag <1 || tag > 7) cout << "fehlerhafte Eingabe" << endl; system ("pause"); return 0; }
Programmierung mit switch-Anweisung:
#include <iostream>#include <cstdlib>using namespace std;int main () { int tag; tag = 2; // für Testzwecke switch (tag){ case 1: cout << "Montag" << endl; break; case 2: cout << "Dienstag" << endl; break;
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 7
case 3: cout << "Mittwoch" << endl; break; case 4: cout << "Donnerstag" << endl; break; case 5: cout << "Freitag" << endl; break; case 6: cout << "Samstag" << endl; break; case 7: cout << "Sonntag" << endl; break; default: cout << "fehlerhafte Eingabe!" << endl; } system ("pause"); return 0;}
Beispiel: Eingabe der Buchstaben A, B, C in Groß- oder Kleinschreibung
Ausgabe der Lage im Alphabet (1,2,3)
#include <iostream>#include <cstdlib>using namespace std;int main () { char buchstabe; buchstabe = 'B'; // für Testzwecke switch (buchstabe){ case 'A': case 'a': cout << "1.Buchstabe im Alphabet" << endl; break; case 'B': case 'b': cout << "2.Buchstabe im Alphabet" << endl; break; case 'C': case 'c': cout << "3.Buchstabe im Alphabet" << endl; break; default: cout << "fehlerhafte Eingabe!" << endl; } system ("pause"); return 0;}
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 8
allgemeines Schema:
switch (Ausdruck) { // Ausdruck: aufzählbarer// Datentyp (z.B. int, char)
case wert11: // wert11 muss konstant sein case wert12: Anweisung1; break; // Verlassen der switch-Anweisung case wert21: case wert22: Anweisung2; break; default: alternative Anweisung; // optional }
switch-Anweisungen können geschachtelt werden (statt Anweisung1 kann wieder eine
switch-Anweisung stehen)
Übungsaufgaben:
Aufgabe 4.4
Geben Sie einen Monat (1, 2, ...., 12) ein und das Programm ermittelt die Anzahl der Tage
des Monats (ohne Schaltjahr).
Aufgabe 4.5
Wandeln Sie eine römische Ziffer in den zugehörigen Dezimalwert um.
I, i → 1
V, v → 5
X, x → 10
L, l → 50
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 9
Aufgabe 4.6
Schreiben Sie ein C++ - Programm, das 2 reelle Zahlen einliest. Danach wird einer der Operatoren (+,-,*,/) eingegeben. Je nach Operator werden die beiden Zahlen verknüpft und das Ergebnis ausgegeben.
• Bei der Division ist zu beachten, dass der Nenner nicht null sein darf.
• Bei falscher Eingabe des Operators erfolgt eine Fehlermeldung.
• Das Programm ist in Eingabeteil, Berechnung und Ausgabeteil zu gliedern.
Aufgabe 4.7
Ergänzen Sie das Programm aus Aufgabe 4.6 so, dass als weitere Operation die Ganzzahl-Division und die Ermittlung des Restes durchgeführt werden kann. Dazu werden die reellen Zahlen in Ganzzahlen umgewandelt. Bei Ganzzahl-Division erfolgt immer die Ermittlung des Restes (kein weiterer Operator).
Beispiel für Ganzzahl-Division:
Geben Sie zwei reelle/ganze Zahlen ein: 19 5Geben Sie einen Operator ein (+,-,*,/,%): %Ergebnis: 3 Rest 4
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 10
4.2 Schleifen
Literaturhinweis: Breymann C++ 8.Auflage S.72-75
Wiederholung einer Teilaufgabe in einem Programm
4.2.1 while-Schleife
Beispiel: Ein Programm wiederholt solange eine Eingabe, bis nicht mehr 'J' eingegeben wird
#include <iostream>#include <cstdlib>#include <cctype> // siehe toupper()using namespace std;int main () { char antwort = 'J'; // Vorbelegung ist nötig while (antwort == 'J'){ cout << "Eingabe von J oder j --> weiterfragen "; cin >> antwort; antwort = toupper (antwort); // wandelt Klein- in // Großbuchstaben um } system ("pause"); return 0; }
allgemeines Schema:
while (Bedingung) // Bedingung wahr, dann wird Anweisung ausgeführt
Anweisung // wenn Bedingung falsch, dann wird Anweisung nicht mehr
// ausgeführt
Wenn die Bedingung von Anfang an nicht wahr ist, dann wird die Schleife nie durchlaufen!
weiteres Beispiel:
Bestimmung des größten gemeinsamen Teilers zweier natürlicher Zahlen (Algorithmus nach
Euklid)
Beispiel: ggT(84,36) = 12
84 = 2 * 2 * 3 * 7
36 = 2 * 2 * 3 * 3
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 11
Algorithmus nach Euklid:
• ggT(x,x) = x
• ggT(x,y) = ggT(x, y-x) falls x<y
#include <iostream>#include <cstdlib>using namespace std;int main () { unsigned int x, y; cout << "2 natuerliche Zahlen: "; cin >> x >> y; cout << "ggT von " << x << " und " << y << " ist: " ; while (x != y){ if (x > y) x = x - y; else y = y - x; } cout << x << endl; system ("pause"); return 0; }
4.2.2 do while-Schleife
Literaturhinweis: Breymann C++ 8.Auflage S.75f
Beispiel: Ein Programm zwingt den Benutzer solange eine Zahl einzugeben, bis sie größer als
Null ist.
#include <iostream>#include <cstdlib>using namespace std;int main () { int x; do { cout << "Ganze Zahl > 0: "; cin >> x; }while (x <= 0); system ("pause"); return 0; }
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 12
allgemeines Schema:
do {
Anweisung
} while (Bedingung);
Die do while-Schleife wird immer mindestens ein Mal ausgeführt.
Verwendung:
• Abfrage von Zahlen solange bis richtige Eingabe erfolgt
• Wiederholung des Programms ohne Neustart (siehe folgendes Beispiel)
#include <iostream>#include <cstdlib>#include <cctype>using namespace std;int main () { char weiter; do { cout << "Programm wiederholen? [J/N] "; cin >> weiter; weiter = toupper (weiter); }while (weiter == 'J'); // (weiter != 'N') ??? system ("pause"); return 0; }
4.2.3 for-Schleife
Literaturhinweis: Breymann C++ 8.Auflage S.76-79
Beispiel: Ausgabe der Zeichen und Codierungen in der ASCII-Tabelle von 65 bis 122
#include <iostream>#include <cstdlib>using namespace std;int main () { int i; for (i=65; i<= 122; i++){ cout.width(3); // sorgt dafür, dass 3 Stellen
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 13
// ausgegeben werden für i cout << i << " " << (char)i << endl;
// (char) i gibt das Zeichen und// nicht den Zahlenwert an
} system ( "pause "); return 0; }
Allgemeine Syntax:
for (Initialisierung; Bedingung; Veränderung)
Anweisung
Verwendung der for-Schleife, wenn die Anzahl der Durchläufe bekannt ist!
Weiteres Beispiel:
Berechnung der Fakultät einer Zahl
4! = 1 * 2 * 3 * 4 = 24
#include <iostream>#include <cstdlib>using namespace std;int main () { unsigned int n, i; unsigned long fakul = 1; cout << "Positive, ganze Zahl: "; cin >> n; for (i=2; i<= n; i++){ fakul = fakul * i; } cout << "Fakultaet von " << n << " ist: " << fakul; system ("pause"); return 0; }
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 14
4.2.4 break und continue
Literaturhinweis: Breymann C++ 8.Auflage S.80-82
break: Verlassen der Schleife
continue: Überspringen des restlichen Schleifenkörpers
Beispiel:
#include <iostream>#include <cstdlib>using namespace std;int main () { char c; while (true) { // Endlosschleife, auch
// for (;;) möglich cout << "Auswahl a, b oder x = Ende : "; cin >> c; if (c == 'a') { cout << "Programm a wird ausgefuehrt! " << endl; continue; // zurück zur Auswahl } if (c == 'b') { cout << "Programm b wird ausgefuehrt! " << endl; continue; // zurück zur Auswahl } if (c == 'x') break; // Schleife verlassen cout << "Falsche Eingabe! " << endl; } cout << "Programmende! " << endl; system ("pause"); return 0; }
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 15
Übungsaufgaben
Aufgabe 4.8
Formulieren Sie das Programm aus Kapitel 4.2.4 um, so dass ein äquivalentes Programm entsteht ohne die Verwendung von break und continue. Statt der if-Anweisung soll switch benutzt werden.
Aufgabe 4.9Welche Ausgabe liefert folgendes Programm?
Schachtelung von for-Schleifen
#include <iostream>#include <cstdlib>using namespace std;int main () { int i, j, k; for (i=1; i<=2; i++) for (j=1; j<=3; j++) for (k=1; k<=4; k++) cout << i << " " << j << " " << k << endl; system ("pause"); return 0;}
Ausgabe:
i j k i j k1 132 143 154 165 176 187 198 209 21
10 2211 2312 24
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 16
Aufgabe 4.10Welche Ausgabe liefert folgendes Programm?
#include <iostream>#include <cstdlib>using namespace std;int main () { int i, j, k, ksum=0, sum=0; for (i=1; i<=3; i++) for (j=i; j<=3; j++) for (k=j-i; k<=j; k++){ cout << i << " " << j << " " << k << endl; ksum++; sum = sum + k; } cout << ksum << " " << sum; system ("pause"); return 0; }
Ausgabe:
i j k123456789
10111213141516
ksum = sum =
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 17
Aufgabe 4.11
Bisektionsverfahren
Bei der Untersuchung des Schubkurbelgetriebes tritt die Bestimmungsgleichung auf
f x = x3−x 2−x0,04=0
Bestimmen Sie mit Hilfe des Bisektionsverfahrens diese Nullstelle auf 5 Dezimalstellengenau. Ermitteln Sie dabei die Anzahl der Iterationen, die zur Bestimmung notwendig sind.
Lösung: x = 0,038570
Aufgabe 4.12
Fünf Leute haben versucht, die Summe der Zahlen von 1 bis 100 zu berechnen. Beurteilen Sie die folgenden Lösungsvorschläge:
(a) int n = 1, sum = 0;while (n <= 100) { ++n;
sum = sum + n;}
(b) int n = 1, sum = 1;while (n < 100) n = n + 1; sum = sum + n;
(c) int n = 100;int sum = n*(n+1)/2;
(d) int n = 1, sum;while (n < 100) { sum = 0; n = n + 1; sum = sum + n;}
(e) int n = 1, sum = 0;while (n <= 100) { sum = sum + n; n++;}
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 18
Aufgabe 4.13
Schreiben Sie ein C++ - Programm, das für die Funktion
8sin2,0)( π−⋅−= xxxf
eine Nullstelle im Bereich 2
0 π<< x berechnet. Die Anzahl der benötigten Iterationsschritte ist
auszugeben.
Als Iterationsformel ist der Ansatz nach Newton-Raphson zu verwenden.
Newton-Raphson: )()(
1i
iii xf
xfxx
′−=+
Anmerkungen:
• Bestimmen Sie die Nullstelle auf 5 Dezimalstellen genau.• Verwenden Sie eine do- while – Schleife.• Geben Sie einen Startwert für x vor, der im angegebenen Bereich liegt. Sollte die
Iterationsformel nicht zu einem Ergebnis konvergieren (Die Unterschiede der berechneten xi
sollte immer kleiner werden!), so muss das Programm nach einer bestimmten Anzahl von Iterationsschritten abbrechen.
Aufgabe 4.14
Unter Primzahlen versteht man natürliche Zahlen, die nur durch 1 und sich selbst teilbar sind.
Beispiel: 1, 2, 3, 5, 7, 11, 13, 17, 19, 23 ...
Schreiben Sie ein Programm, das eine natürlich Zahl > 2 einliest und die Primfaktorzerlegung berechnet.
Beispiel:
Eingabe: 728Ausgabe: 728 = 2 * 2 * 2 * 7 * 13
Aufgabe 4.15
Numerische Integration (Trapezregel)
Schreiben Sie ein Programm, das mit der Trapezregel die Funktion f(x) = sin (x) + cos (2x) innerhalb beliebiger Grenzen a und b numerisch integriert.
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 19
Die Trapezformel lautet:
n: Anzahl der Intervalle T(n): Integralwert bei n Intervallen a: linke Integrationsgrenze b: rechte Integrationsgrenze h: Schrittweite h = (b-a)/n Geben Sie a, b und n ein!
Aufgabe 4.16
Numerische Integration (Simpsonformel)
Berechnen Sie das Integral obiger Funktion mit der Simpson-Formel.
1 für i = 0 oder i = nCi = 4 für i ungerade
2 für i gerade, i ≠ 0, i ≠ n
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript04 (2007/03/17) Kapitel 4 Seite 20
⋅+⋅++= ∑
−
=
1
1
)(2)()(2
)(n
i
hiafbfafhnT
∑=
⋅+⋅⋅=n
ii hiafchnS
0
)(3
)(
5 Erweiterte Datentypen
5.1 Arrays
5.1.1 Eindimensionale Felder
Aufgabe: Belegung von 4 Variablen mit den Werten 1 ... 4
int z1, z2, z3, z4;z1 = 1;z2 = 2;z3 = 3;z4 = 4;
Erweiterung der Aufgabenstellung:
Belegung von 100 Variablen mit den Werten 1 .. 100
int z[100], i;for (i=0; i<100; i++) z[i] = i+1;
Definition von eindimensionalen Feldern:
Datentyp Feldname [ Anzahl_der_Elemente ];Anzahl_der_Elemente muss ein konstanter Wert sein!
Beispiel: int a[100]; // 100 ganzzahlige Werte
double x[3000], messwerte [67]; // 3000 x-Werte (reelle Zahlen), ...
const int ANZ = 100;double werte[ANZ];
Initialisierung von Feldern:int feld[3] = {-1, 300, 6};
Zugriff auf einzelne Elemente des Feldes:
feld[0] = -1;feld[1] = 300;feld[2] = 6;
WICHTIG: Die untere Feldgrenze ist immer Null, somit ist der höchste Index
Anzahl_der_Elemente – 1! Bereichsüberschreitungen werden vom Compiler nicht
gemeldet! Dies kann zu unvorhersehbaren Fehlern im Programm führen!
Ingenieurinformatik FH Augsburg/FMaschinenbau/Prof. U.Thalhofer/ini_skript05 (2006/10/05) Kapitel 5 Seite 1
Initialisierung eines Teiles der Elemente:int a[100] = {1, 2, 3}; // die restlichen Elemente werden mit null belegt!!
Ein- und Ausgabe von Feldern:
int a[20];cout << "Geben Sie 20 ganzzahlige Werte ein: ";for (i=0; i<20; i++)cin >> a[i];
cout << "Elemente des Feldes :" << endl;for (i=0; i<20; i++)cout << a[i];
Eine Ausgabe cout << a; ist nicht möglich!
Beispiel: Erstellen Sie ein Programm, das aus der Zahlenfolge
10, -3.5, 4, 6, 9, -1, 22, 11, 4.9, 10.6
die größte und kleinste Zahl ermittelt und ausgibt.
Lösung:
#include <iostream>#include <cstdlib>using namespace std;int main () { const int N = 10; double x[N] = {10, -3.5, 4, 6, 9, -1, 22, 11, 4.9, 10.6}, xmax, xmin; int i; xmax = x[0]; xmin = x[0]; for (i=0; i<N; i++){ if (x[i] > xmax) xmax = x[i]; if (x[i] < xmin) xmin = x[i]; } cout << "Maximum: " << xmax << endl << "Minimum: " << xmin << endl; system ("pause"); return 0;}
Ingenieurinformatik FH Augsburg/FMaschinenbau/Prof. U.Thalhofer/ini_skript05 (2006/10/05) Kapitel 5 Seite 2
5.1.2 Mehrdimensionale Felder
Definition eines zweidimensionalen Feldes:
int m[2][3] = {{ 2, 4, -5}, {10, -1, 11}};
m=[ 2 4 −510 −1 11]
Eingabe eines zweidimensionalen Feldes:
cout << "Matrix mit 2 Zeilen und 3 Spalten eingeben: " << endl;for (i=0; i<2; i++) for (j=0; j<3; j++) cin >> m[i][j];
Ausgabe eines zweidimensionalen Feldes:
cout << "Matrix m = " << endl;for (i=0; i<2; i++){ for (j=0; j<3; j++) cout << m[i][j]; cout << endl; }
Beispiel: Erstellen Sie ein Programm, das zwei Matrizen addiert.
Lösung:
#include <iostream>#include <cstdlib>using namespace std;int main () { const int ZEILEN = 3, SPALTEN = 4; int a[ZEILEN][SPALTEN] = {10, -3, 4, 6, 9, -1, 22, 11, 4, 9, 10, 6}, b[ZEILEN][SPALTEN] = { 1, 14, 7, 5, 2, 12,-11, 0, 7, 2, 1, 5}, c[ZEILEN][SPALTEN], i, j;
Ingenieurinformatik FH Augsburg/FMaschinenbau/Prof. U.Thalhofer/ini_skript05 (2006/10/05) Kapitel 5 Seite 3
for (i=0; i<ZEILEN; i++) for (j=0; j<SPALTEN; j++) c[i][j]=a[i][j] + b[i][j]; for (i=0; i<ZEILEN; i++){ for (j=0; j<SPALTEN; j++){ cout.width(4); // 4 Stellen pro Matrixelement cout << c[i][j]; } cout << endl; // nach jeweils 4 Spalten eine neue
// Zeile} system ("pause"); return 0;}
5.1.3 Zeichenketten
Texte können in char-Arrays gespeichert werden.
Beispiel:
Konstanter Text mit max. 19 Zeichen:
#include <iostream>#include <cstdlib>using namespace std;int main () { char z[20] = "Text mit 19 Zeichen"; // 19 Zeichen + Terminator (ASCII-Null) cout << z << endl; system ("pause"); return 0;}
Text wird eingelesen:#include <iostream>#include <cstdlib>using namespace std;int main () { char z[20]; cout << "Text mit 19 Zeichen:"; cin >> z; //Leerzeichen beendet Eingabe cout << z << endl; system ("pause“); return 0; }
Ingenieurinformatik FH Augsburg/FMaschinenbau/Prof. U.Thalhofer/ini_skript05 (2006/10/05) Kapitel 5 Seite 4
Eingabe mit Leerzeichen:
#include <iostream>#include <cstdlib>using namespace std;int main () { char z[20]; cout << "Text mit 19 Zeichen: "; cin.getline(z,20); //liest auch Leerzeichen cout << z; system ("pause"); return 0; }
Belegung der einzelnen Elemente des Feldes:
#include <iostream>#include <cstdlib>using namespace std;int main () { char z[20]; int i; cout << "Text mit 19 Zeichen: "; for (i=0; i<19; i++) cin >> z[i]; z[19]='\0'; cout << z;system ("pause"); return 0; }
Ingenieurinformatik FH Augsburg/FMaschinenbau/Prof. U.Thalhofer/ini_skript05 (2006/10/05) Kapitel 5 Seite 5
5.2 Aufzählungstypen
Will man die Wochentage nicht mit Zahlen bezeichnen, so kann man einen Datentyp
„Wochentag“ definieren.
#include <iostream>#include <cstdlib>#include <cstring>using namespace std;int main () { enum Wochentag {Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag}; Wochentag heute; //char *ausgabe = "Donnerstag"; char ausgabe [20]; heute = Montag; cout << heute; //besser: switch (heute) { case Montag: strcpy(ausgabe, "Montag"); break; case Dienstag: strcpy(ausgabe, "Dienstag"); break; // usw. } cout << "Heute ist " << ausgabe << endl; system ("pause"); return 0; }
Ingenieurinformatik FH Augsburg/FMaschinenbau/Prof. U.Thalhofer/ini_skript05 (2006/10/05) Kapitel 5 Seite 6
Übungsaufgaben:
Aufgabe 5.1
Schreiben Sie ein Programm, das zwei quadratische (3 x 3) Matrizen A und B einliest und das Matrixprodukt C = A * B berechnet.
Formel:
∑=
==3
1
3....1,*j
jkijik kibac
Programmablauf:
• Einlesen der Matrix A• Einlesen der Matrix B• Berechnung der Matrix C = A * B nach obiger Formel• Ausgabe der Matrix C (in bekanntem Matrixschema)
Beispiel:
−
−−=
−
−
−
471731340529
832512103
*523110241
Ingenieurinformatik FH Augsburg/FMaschinenbau/Prof. U.Thalhofer/ini_skript05 (2006/10/05) Kapitel 5 Seite 7
6 Modulare Programmierung (Functions)
6.1 Definition
Programmteile, die öfter in einem Programm verwendet werden, können als Unterprogramme
vereinbart werden.
Bei der Verwendung von Unterprogrammen (Functions) sind folgende Regeln einzuhalten:
1. Definition eines Prototypen vor dem Aufruf der Function
2. Aufruf mit passenden Argumenten
Die Definition von Prototypen sieht folgendermaßen aus:
Datentyp Function-Name (Datentyp Argument1, Datentyp Argument2, ...);
Vor jedem Argument muss der Datentyp stehen, auch wenn alle Argumente vom gleichen
Datentyp sind! So kann bereits der Compiler feststellen, dass Prototyp und Aufruf der Function
nicht übereinstimmen und das Programm merkt dies nicht erst bei der Programmausführung.
Die Namen der Argumente (Argument1 und Argument2) können weggelassen werden.
Der Aufruf der Function geschieht über den Function-Namen. In runden Klammern folgen
dahinter die Argumente. Hat die Function keine Argumente, so werden nur die leeren
Klammern angegeben. Die Syntax eines Function-Aufrufs kann folgendermaßen geschrieben
werden:
Function-Name (Arument1, Arument2, ...);
Nach Ausführung der Function wird die Programmausführung automatisch bei der auf den
Function-Aufruf folgenden Anweisung fortgesetzt. Liefert die Function einen Wert
(Funktionswert) zurück, dann muss sie die Anweisung
return Funktionswert;
enthalten. An dieser Stelle erfolgt die Rückkehr ins aufrufende Programm, unabhängig davon,
ob die Function komplett abgearbeitet wurde oder nicht.
In Programm 6.1 wird eine einfache Function verwendet, die als Funktionswert das Doppelte
des Arguments liefert, wenn das Argument positiv ist. Bei negativem Argument wird als
Funktionswert der doppelte positive Wert zurückgegeben.
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript06 (2007/03/17) Kapitel 6 Seite 1
#include <cstdlib>#include <iostream> // Ist für Haupt- und
// Unterprogramm gültig!using namespace std;int doppelt (int x); // Prototypint main () { int i, r; cout << "Eingabe ganze Zahl: "; cin >> i; r = doppelt (i); // Aufruf des Unterprogramms,
// mit dem Argument i // und dem Funktionswert r
cout << r << endl; system ("pause"); return 0;} // Hier endet das Hauptprogramm!// Hier beginnt die Definition des Unterprogrammsint doppelt (int x) { //der Wert von i wird in x eingesetzt int d; if (x > 0 ) d = 2*x; else d = -2*x; return d; // der Wert von d wird an das aufrufende Programm
// zurückgegeben}
Programm 6.1
Programm 6.2 entspricht Programm 6.1 bis auf folgende Änderungen:
1. Der Prototyp verwendet keinen Argumentnamen, was zulässig ist.
2. Das Argument ist eine Konstante (der Zahlenwert 7).
3. Es gibt keine Variable, die den Funktionswert aufnimmt (wie „r“ im vorigen Beispiel). Es
erfolgt direkt die Weitergabe des Funktionswertes an cout.
4. Im Unterprogramm wird keine zusätzliche Variable (d) benötigt, da direkt in der Verzweigung
der Wert für das Produkt zurückgegeben wird.
#include <iostream>#include <cstdlib>using namespace std;
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript06 (2007/03/17) Kapitel 6 Seite 2
int doppelt (int ); // Prototyp ohne Argument
int main () {
cout << doppelt (7) << endl; system ("pause"); return 0; }
int doppelt (int x) { if (x > 0 ) return 2*x; else return -2*x; }
Programm 6.2
In Programm 6.2 wird deutlich, dass der Name des Arguments x in der Function nicht mit dem
Namen der Variablen im Hauptprogramm in der Parameterliste (hier die Konstante
7)übereinstimmen kann und auch nicht muss. Auch der Name des Funktionswertes, den es
hier gar nicht gibt, ist im Unterprogramm völlig unabhängig vom Namen im Hauptprogramm.
Am Besten stellt man sich das Unterprogramm als Black Box vor. Man weiß, was reingeht (in
unserem Beispiel ein ganzzahliges Argument) und was rauskommt (ein ganzzahliger
Funktionswert).
Function doppelt
Eingabe: int Ausgabe: int
(Argument) Funktionswert
Wenn man die Beschreibung der Function und den Prototypen kennt, dann kann man ohne
Kenntnis des Unterprogramms damit arbeiten.
Beschreibung des Unterprogramms:
Das Unterprogramm „doppelt“ verlangt einen Eingabewert vom Datentyp int. Dieser Wert wird,
wenn er positiv ist, verdoppelt und zurückgegeben. Ist er negativ, dann wird er auch verdoppelt,
jedoch mit -1 multipliziert. Der Funktionswert ist vom Datentyp int.
Prototyp: int doppelt (int);
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript06 (2007/03/17) Kapitel 6 Seite 3
Es sind natürlich auch mehrere Argumente möglich. Es gibt jedoch immer nur einen
Funktionswert. Sollen mehrere Werte zurückgegeben werden, dann geschieht dies nicht über
den Funktionswert (siehe 6.2).
In Programm 6.3 werden zwei Argumente benötigt. Wenn das erste Argument (int) gerade ist,
dann wird das zweite Argument (double) mit 2 multipliziert, andernfalls mit 4. Der
Funktionswert ist somit auch ein double-Wert.
#include <iostream>#include <cstdlib>using namespace std;
double faktor (int f, double x );
int main () { cout << faktor (3, 4.2) << endl; system ("pause"); return 0; }
double faktor (int f, double x) { if (f%2 == 0 ) return 2*x; else return 4*x; }
Programm 6.3
Gibt es Unterprogramme, die keine Argumente haben und vielleicht auch keinen Funktionswert
zurückgeben? Programm 6.4 gibt dazu ein einfaches Beispiel, da es nur einen Text auf den
Bildschirm schreibt.
#include <iostream>#include <cstdlib>using namespace std;
void nurTextAufSchirm ();
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript06 (2007/03/17) Kapitel 6 Seite 4
int main () { nurTextAufSchirm (); system("pause"); return 0; }
void nurTextAufSchirm () { cout << "Nur Text auf Schirm! " << "Keine Argumente und auch kein Funktionswert!"; }Programm 6.4
„void“ bedeutet, dass kein Funktionswert zurückgegeben wird und die leeren Klammern, die
unbedingt angegeben werden müssen, enthalten keine Argumente.
Functions können nicht nur von einem Hauptprogramm aufgerufen werden. In Programm 6.5
wird die Function f(x) in der Function sumf verwendet, um Funktionswerte einer
mathematischen Funktion aufzusummieren.
#include <iostream>#include <cstdlib>using namespace std;// Prototypendouble f(double x);double sumf (double start, double end, int inkr);// Hauptprogrammint main () {// Summation der Funktionswerte von f(x) = sin(x) + 2*x// zwischen linkeGrenze und rechteGrenze double linkeGrenze, rechteGrenze, summe; int n; cout << "Eingabe linker x-Wert und rechter x-Wert: "; cin >> linkeGrenze >> rechteGrenze; cout << "Eingabe Anzahl der Werte: "; cin >> n; summe = sumf (linkeGrenze, rechteGrenze, n); cout << summe; system ("pause"); return 0;}
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript06 (2007/03/17) Kapitel 6 Seite 5
// Function f#include <cmath> // wird nur in f benötigtdouble f(double x) { return sin(x) + 2*x;}// Function sumfdouble sumf (double start, double end, int inkr) { int i; double h, s=0; h = (end-start)/(inkr-1); for (i=0; i<inkr; i++) s = s + f(start+i*h); return s;}
Programm 6.5
Beachten Sie bitte, dass in Programm 6.5 nur die Werte in der Variablenliste stehen, die von
außen angegeben werden müssen. Die Variablen, die nur in sumf benötigt werden (i, h, s)
werden dort intern verwendet und gehen nicht nach draußen!
Übungsaufgaben:
Aufgabe 6.1Schreiben Sie ein Unterprogramm, das zwei double-Werte addiert und das Ergebnis als
Funktionswert zurückgibt. Der Aufruf im Hauptprogramm sieht z.B. folgendermaßen aus:
y = add1 (2.3, 4.5);
Aufgabe 6.2Schreiben Sie ein Unterprogramm, das die x-Werte und die y-Werte der Funktion y = x² + 3x
am Bildschirm ausgibt. Der Benutzer definiert linke Grenze, rechte Grenze und die Anzahl der
auszugebenden Werte. Die Funktionswerte sollen in einer eigenen Function berechnet werden.
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript06 (2007/03/17) Kapitel 6 Seite 6
6.2 Werteparameter und Variablenparameter
Bisher konnten mehrere Werte an das Unterprogramm übergeben, jedoch nur ein Wert per
Funktionswert an das aufrufende Programm zurückgegeben werden. Soll mehr als ein Wert an
das aufrufende Programm gegeben werden, so benötigt man variable Parameter, die in der
Parameterliste stehen.
Beispiel:
Ein Programm bekommt drei Werte und berechnet den Mittelwert (3 Eingabewerte, 1
Ausgabewert)
#include <iostream>#include <cstdlib>using namespace std;double mittel (double , double , double );int main () { cout << mittel (2.3, 4.5, 6.0); system ("pause"); return 0; }double mittel (double m1, double m2, double m3) { return (m1+m2+m3)/3; }
Programm 6.6
Das Programm 6.7 soll nun den Mittelwert und die Summe zurückgeben. Bisher wurden die
Parameter „per Wert“ (by value) definiert, jetzt kann nicht mehr nur der Wert, sondern die
Variable selbst (by reference) muss zum Ändern an das Unterprogramm gegeben werden. Dies
geschieht in der Parameterliste durch Voranstellen eines „&“ vor den Parameter.
#include <iostream>#include <cstdlib>using namespace std;void mittel (double , double , double, double & , double & );int main () { double m, s; mittel (2.3, 4.5, 6.0, m, s); cout << "Mitelwert: " << m << " Summe: " << s; system ("pause"); return 0; }
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript06 (2007/03/17) Kapitel 6 Seite 7
void mittel (double m1, double m2, double m3, double &mit, double &sum) {
sum = m1+m2+m3; mit =sum / 3; }
Programm 6.7
Man könnte in Programm 6.7 auch einen Wert (z.B. den Mittelwert) als Funktionswert und
einen als variablen Parameter (z.B. die Summe) zurückgeben.
Man kann Werteparameter in einem Unterprogramm nicht ändern, Variablenparameter jedoch
schon. Programm 6.8 zeigt ein einfaches Beispiel.
#include <iostream>#include <cstdlib>using namespace std;void test (int , int & );int main () { int wert=10, variabel=12; test (wert, variabel); cout << wert << " " << variabel; // Ausgabe: 10 66 system ("pause"); return 0; }void test (int w, int &v) { w = 33; v = 66; }
Programm 6.8
Der erste Parameter wird nur als Wert übergeben, er kann im Unterprogramm also nicht
verändert werden, da nur eine Kopie der Variablen an das Unterprogramm gegeben wird, auf
das Original kann nicht zugegriffen werden. Der zweite Parameter wird als Variable, also im
Original an das Unterprogramm übergeben und kann somit beliebig geändert werden.
In Programm 6.8 kann man auch schreiben:
test (10, variabel);
Es ist jedoch nicht möglich zu schreiben: test (10,66);
Der zweite Parameter muss, wie der Name (Variablenparameter) schon sagt, eine Variable
sein!
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript06 (2007/03/17) Kapitel 6 Seite 8
Im Programm 6.9 soll der Inhalt zweier Variablen getauscht werden.
#include <iostream>#include <cstdlib>using namespace std;
void tausch (int &, int & );int main () { int a=2, b=5; tausch (a,b); cout << a << " " << b << endl; system ("pause"); return 0; }void tausch ( int &x, int &y){ int tmp; tmp = x; x = y; y = tmp; }
Programm 6.9
Übungsaufgaben
Aufgabe 6.3Schreiben Sie ein Unterprogramm, das aus vier reellen Zahlen die kleinste und größte Zahl und
den Mittelwert berechnet.
Eingabeparameter: 4 reelle Zahlen (kein Array)
Ausgabeparameter: Minimum, Maximum und Mittelwert (kein Funktionswert, sondern variable
Parameter)
Schreiben Sie auch ein kleines Hauptprogramm, das das Unterprogramm testet.
Aufgabe 6.4
Die Lösung der quadratischen Gleichung ax² + bx + c = 0 lautet x1,2=−b±b2−4ac
2a.
Für b2−4ac≥0 sollen die reellen Lösungen betrachtet werden.
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript06 (2007/03/17) Kapitel 6 Seite 9
Schreiben Sie ein Unterprogramm
int nullst (double a, double b, double c, double &x1, double &x2), das
a) den Funktionswert 1 liefert, falls es reelle Lösungen gibt.
x1 und x2 sind dann die (unter Umständen identischen) Lösungen.
b) den Funktionswert 0 liefert, falls es keine reellen Lösungen gibt.
x1 und x2 werden nicht berechnet.
Schreiben Sie ein kleines Hauptprogramm, das das Unterprogramm testet.
a = 4, b = -36, c = 81 , x1 = x2 = 4.5a = 2, b = 2, c = -12 , x1 = 2, x2 = -3a = 1, b = -2, c = 2 , keine reelle Lösungen
6.3 Arrays als Parameter
Da ein Array immer aus mehreren Elementen besteht, ist es sicherlich nicht möglich ein ganzes
Array als Funktionswert an das aufrufende Programm zu geben. (Das Arbeiten mit Zeigern ist
nicht Gegenstand dieser Vorlesung!) Soll ein Array mit 100 Elementen an ein Unterprogramm
weitergereicht werden, dann ist bei einer Übergabe per Wert das Kopieren von 100 Werten
erforderlich. Das ist kein sehr effizientes Arbeiten! Arrays werden automatisch als variable
Parameter übergeben und können also auch immer im Unterprogramm verändert werden, auch
wenn dies nicht gewünscht ist. Der fortgeschrittene Programmierer weiß auch hier Abhilfe, da
hier jedoch nur die Grundlagen der C++-Programmierung erläutert werden sollen, wird dies hier
nicht behandelt.
Im Programm 6.10 wird ein Vektor (eindimensionales Feld) mit 20 Werten an das
Unterprogramm übergeben, das die 20 Werte aufsummiert und den Summenwert als
Funktionswert an das aufrufende Programm zurückgibt.
#include <iostream>#include <cstdlib>using namespace std;double vektorSum (double [], int );const int N=20;int main (){ double vec[N], sum; int i; // Belegung des Vektors zum Testen for (i=0; i<N; i++) vec[i] = i+1; sum = vektorSum (vec, N); cout << sum << endl;
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript06 (2007/03/17) Kapitel 6 Seite 10
system ("pause"); return 0;}double vektorSum (double x[], int n){ int i; double s=0; for (i=0; i<n; i++) s = s+x[i]; return s;}Programm 6.10
Programm 6.11 zeigt, wie ein Unterprogramm aufgebaut sein kann, wenn es dazu dient, eine
Matrix einzulesen. Im Hauptprogramm werden über die Function zwei Matrizen eingelesen.
#include <iostream>#include <cstdlib>using namespace std;const int N=2;void liesMatrix (int [][N]);int main () { int a[N][N], b[N][N]; cout << "Matrix a einlesen: " << endl; liesMatrix (a); cout << "Matrix b einlesen: " << endl; liesMatrix (b); system ("pause"); return 0; }
void liesMatrix ( int x[][N]){ int i, j; for (i=0; i<N; i++) for (j=0; j<N; j++) cin >> x[i][j]; }
Programm 6.11
Im Prototypen und in der Definition könnte es auch int [2][2] und int x[2][2] heissen. Es reicht
jedoch, wenn die Anzahl an Spalten pro Zeile vorgegeben werden für das Unterprogramm. Eine
Bereichsüberschreitung des Arrays sollte auf jeden Fall vermieden werden. Ein Vektor
(eindimensionales Array) kann als v[] übergeben werden. Bitte beachten Sie, dass im
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript06 (2007/03/17) Kapitel 6 Seite 11
Hauptprogramm nur liesMatrix (a) steht. Hier sind keine eckigen Klammern erforderlich, da nur
die Anfangsadresse des Arrays an das Unterprogramm übergeben wird.
Übungsaufgaben
Aufgabe 6.5
Für eine reelle quadratische nxn-Matrix ist die Matrixnorm gegeben durch:
∣A∣=∑i , k=1n
a ik2
d.h.: alle Matrixelemente quadrieren, die Quadrate aufsummieren, aus der Summe die Wurzel
ziehen.
Schreiben Sie ein Unterprogramm, das eine entsprechende Matrix als Eingabeparameter erhält
und die Matrix-Norm als Rückgabewert (Funktionswert) zurückgibt.
Schreiben Sie ein Hauptprogramm, das obiges Unterprogramm testet.
Bsp.:
[1.5 2.3 −1.03.6 1.7 1.28.9 10.0 1.5 ]
Ergebnis: Matrix-Norm = 14.3976
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript06 (2007/03/17) Kapitel 6 Seite 12
6.4 Strukturierung umfangreicher Programme
Stellen Sie sich vor, Sie dürfen ein Programm entwickeln, das mit der Methode der Finiten
Elemente ebene Fachwerke auf Verschiebungen berechnet. Dazu sind folgende Aufgaben
durchzuführen (siehe Lehrveranstaltung numerische Lösungsverfahren):
1. Einlesen der Daten zur Berechnung (Knoten, Elemente, Material- und
Elementparameter, Lager, Lasten)
2. Erstellung der Elementsteifigkeitsmatrizen
3. Zusammenbau der Gesamtsteifigkeitsmatrix
4. Kraftvektor aufstellen
5. Lagerbedingungen einführen
6. Gleichungssystem lösen
7. Ergebnisse darstellen
Diese Aufgaben alle in ein Programm zu packen, ergibt ein riesiges, unübersichtliches
Programm, das nicht nur schwer verständlich ist, sondern auch nicht handhabbar, d.h.
Fehlersuche und Erweiterungen sind nur ganz schwierig durchzuführen. Wird die Aufgabe
jedoch in kleinere Teilprobleme zerlegt, so entsteht ein modularer Aufbau des Programms.
Jedes Modul hat eine ganz spezifische Aufgabe und kann für sich getestet werden.
Beispiel eines Hauptprogramms, das die Unterprogramme für die Teilaufgaben aufruft:// ... Prototypenint main () {// hier sollten die benötigten Variablen stehenlese (......); // alle Daten einlesenfor (i=0; i<anzEl; i++){ // Schleife über alle Elemente eSteif (...); // Elementsteifigkeit berechnen gSteif (...); } // in Gesamtsteifigkeitsmatrix // einfügen lasten (....); // Kraftvektorlager (...); // Lagerbedingungenloesen (...); // Gleichungssystem lösenresultate (...); // Verschiebungen anzeigen
return 0;}Programm 6.12
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript06 (2007/03/17) Kapitel 6 Seite 13
Die einzelnen Teilaufgaben (Unterprogramme) können sogar in getrennten Dateien bearbeitet
werden und werden über eine so genannte Projektdatei (oder Make-Datei) miteinander
verbunden.
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript06 (2007/03/17) Kapitel 6 Seite 14
7 Ein- und Ausgabe mit Dateien
Wenn ein Programm größere Datenmengen bearbeitet, dann macht es wenig Sinn diese
Zahlenkolonnen immer wieder über die Tastatur einzugeben. Ein Brief, der am Computer
erstellt wird, wird ja auch nicht nach dem ersten Drucken gelöscht und dann wieder eingetippt,
da noch Änderungen nötig sind. Sie speichern diesen Brief in einer Datei auf der Festplatte des
Computers.
Im folgenden Programm werden drei Zahlenwerte aus einer Datei eingelesen und am
Bildschirm ausgegeben. Die Datei „quelle.txt“ sieht dabei so aus:
1.2 4.5 -2.7
Und das Programm sollte so lauten:#include <fstream>#include <iostream>#include <cstdlib>using namespace std;int main () { double z1, z2, z3; ifstream eingabe; eingabe.open ("quelle.txt"); //eingabe.open ("quelle.txt", ios::nocreate); MS!!! if (!eingabe) { cout << "Datei quelle.txt nicht vorhanden!" << endl;
} else { eingabe >> z1 >> z2 >> z3; cout << z1 << " " << z2 << " " << z3 << endl; } eingabe.close (); system ("Pause"); return 0;}
Programm 7.1Erklärungen:
1. In fstream.h stehen alle Definitionen für das Lesen und Schreiben einer Datei.
2. ifstream eingabe bedeutet, dass die Datei, von der Sie lesen wollen (z.B. quelle.txt) den
internen Dateinamen eingabe erhält.
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript07 (2007/03/17) Kapitel 7 Seite 1
3. Dem internen Dateinamen eingabe wird mit dem Kommando eingabe.open („quelle.txt“); die
Datei quelle.txt auf der Platte des Computers zugewiesen.
Bei Verwendung von MS-Visual C ist ios::nocreate anzufügen, da sonst die Datei sofort
erstellt wird, falls sie nicht existiert.
4. if (!eingabe) überprüft, ob die Datei existiert. Sollte dies nicht der Fall sein, dann kann
natürlich nicht von ihr gelesen werden und das Programm wird beendet.
5. Existiert die Datei, dann werden mit eingabe >> z1 >> z1 >> z2; die drei Variablen mit den
ersten drei Werten in der Datei belegt. Dabei können die Werte in der Datei beliebig
untereinander oder nebeneinander stehen (genauso wie bei der Eingabe über Tastatur mit
cin >> z1 >> z2 >> z3;).
6. Soll mit der Datei nicht mehr gearbeitet werden, dann wird sie mit eingabe.close();
geschlossen. Beim Beenden des Programms geschieht dies eigentlich automatisch, so dass
diese Anweisung an dieser Stelle nicht erforderlich wäre.
In ähnlicher Weise kann auf eine Datei geschrieben werden. Und man kann auch gleichzeitig
von einer Datei Daten lesen und auf eine andere Datei schreiben. Die Betonung liegt dabei auf
eine andere Datei, da ein Lesen und Schreiben von einer Datei mit den hier verwendeten
Textdateien (Sie können diese Datei mit jedem Editor oder auch mit einem
Textverarbeitungsprogramm ansehen!) nicht möglich ist.
In Programm 7.2 wird auf eine Datei geschrieben. Sollte die Datei bereits existieren, dann wird
sie einfach überschrieben. Also Vorsicht, wenn Sie die Daten noch brauchen! Nach dem
Schreibvorgang steht in „ziel.txt“ in Ihrem Arbeitsverzeichnis
3.4 3 ?
Doch nun zum Programm.
#include <fstream>#include <iostream>#include <cstdlib>using namespace std;int main () { double d1=3.4; int i2= 3; char c3='?'; ofstream ausgabe; ausgabe.open ("ziel.txt"); if (!ausgabe) { cout << "Datei ziel.txt konnte nicht erstellt
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript07 (2007/03/17) Kapitel 7 Seite 2
werden!" << endl; } else { ausgabe << d1 << " " << i2 << " " << c3; } ausgabe.close (); system ("Pause"); return 0;}
Programm 7.2
In Programm 7.2 kommt es dann zu einer Fehlermeldung, wenn die Datei aus irgendeinem
Grund (Platte voll!) nicht angelegt werden kann. Der Schreibvorgang verläuft analog zum
Lesen.
Es kommt relativ häufig vor, dass die Anzahl der Zahlen oder Zeichen in einer Datei nicht
bekannt ist. Deshalb gibt es eine Anweisung, die solange einliest, bis das Ende der Datei (end
of file) erreicht ist In der Datei zahlen.txt steht eine beliebige Anzahl von Zahlen untereinander
oder auch nebeneinander, die alle aufsummiert werden sollen. Im Programm wird nicht
angegeben, wieviele Zahlen zu lesen sind. Mit dem Kommando eof() wird dann nicht mehr
weitergelesen, wenn keine Daten mehr in der Datei vorhanden sind, das heißt, wenn das Ende
der Datei erreicht ist.
#include <fstream>#include <iostream>#include <cstdlib>using namespace std;int main () { double z1, sum = 0; ifstream eingabe; eingabe.open ("zahlen.txt"); if (!eingabe) { cout << "Datei zahlen.txt nicht vorhanden!" << endl; } else { while (!eingabe.eof()){ eingabe >> z1; sum = sum + z1; }
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript07 (2007/03/17) Kapitel 7 Seite 3
} eingabe.close (); cout << "Summe = " << sum << endl; system ("Pause"); return 0; }
Programm 7.3
Die Datei zahlen.txt könnte z.B. so aussehen:
1.2 5.65.3 3.14.2 8.9
Ist der Name der Datei im Programm nicht bekannt, so kann der Benutzer diesen Namen auch
eingeben. Dazu ist zuallererst ein Array aus Zeichen erforderlich und dann kann der Name
abgefragt und in der Variablen gespeichert werden. Das Öffnen der Datei geschieht dann nicht
über einen konstanten Namen. Programm 7.4 enthält den Teil des Programms zu Einlesen des
Dateinamens.
#include <fstream>#include <iostream>#include <cstdlib>using namespace std;int main () { char fname [80]; //max. 79 Zeichen ifstream eingabe; cout << "Zu lesende Datei: "; cin >> fname; eingabe.open (fname); ..... system ("Pause"); return 0;}
Programm 7.4
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript07 (2007/03/17) Kapitel 7 Seite 4
ÜbungsaufgabenAufgabe 7.1
Grundgrößen der Festigkeitslehre (Dateien)Die Querschnittsfläche von Flächen, die von Polygonzügen mit den Stützpunkten P1…Pn
berandet werden, lassen sich aus den Koordinaten der Stützpunkte Pi(xi, yi) berechnen.
Fläche: A=12∑i=1
n
x i y i1−x i1 yi
Statische Momente bezüglich der x- und y-Achse:
S x=16∑i=1
n
x i y i1−x i1 y i⋅ yi y i1
S y=16∑i=1
n
x i yi1− x i1 y i⋅x ix i1
Schwerpunktskoordinaten:
x s=S yA; y s=
S xA;
Hinweise:1. Bei allen Formeln müssen die Punkte in mathematisch positiver Umlaufrichtung nummeriert
werden.2. Der Index i = n+1 ist mit dem Index i = 1 identisch.
Schreiben Sie ein Programm, das die Fläche, die statischen Momente bezüglich der x- und der y-Achse und die Schwerpunktkoordinaten für die folgenden Beispiele berechnet. Legen Sie dazu die Koordinaten der Punkte in einer Textdatei ab.
Datei: Ergebnis:
1 1 A = 85 1 sx = 18.673 5 sy = 241 1 xs = 3
ys = 2.33
Ingenieurinformatik FH Augsburg/Maschinenbau/Prof. U.Thalhofer/ini_skript07 (2007/03/17) Kapitel 7 Seite 5
y
x
P1(x
1, y
1)
P2(x
2, y
2)
P3(x
3, y
3)
P4(x
4, y
4)
P5(x
5, y
5)
(3, 5)
(5, 1)(1, 1)
Übung 1
Schreiben Sie ein C++-Programm, das für einen einseitig fest eingespannten Balken die maximale Durchbiegung berechnet.
Eingabegrößen:
• Kraft F• Länge des Balkens l• E-Modul• Durchmesser des kreisförmigen Balkenquerschnitts d
Ausgabegröße:
• Maximale Durchbiegung f
Formeln: f = F⋅l 3
3⋅E⋅I; I=
⋅d 4
64;
Testdaten: F = 212,8 Nl = 2456,4 mmE = 210 000 N/mm²d = 95,67 mm
f = 1,2 mm
Ingenieurinformatik Übung 1 FHA/FM/TH
Übung 2a
Schreiben Sie ein C++-Programm, das zwei ganze Zahlen einliest und eine Ganzzahldivision durchführt.
Beispiel für Ein- und Ausgabe am Bildschirm:
Uebung 2aGeben Sie 2 ganze Zahlen ein: 23 44 ist 5 mal in 23 enthalten, Rest 3
Übung 2b
Schreiben Sie ein C++-Programm, das aus einer Zeitdauer in Stunden, Minuten und Sekunden (Eingabe im Format h:m:s) die Gesamtanzahl in Sekunden, Minuten und Stunden ausrechnet.
Beispiel für Ein- und Ausgabe am Bildschirm:
Uebung 2bGeben Sie eine Zeitdauer in Stunden, Minuten und Sekunden (h:m:s) an: 2:31:11
Sekunden: 9071Minuten : 151.1833Stunden : 2.5197
Ingenieurinformatik Übung 2 FHA/FM/TH
Übung 3
Ändern Sie das Programm von Übung 2b so, dass die Eingabewerte überprüft werden und bei ungültigen Werten eine Fehlermeldung erfolgt. Für alle ganzzahligen Werte ist der Datentyp int zu verwenden.
Beispiele:
Eingabe: -1:23:25Ausgabe: Fehlerhafte Eingabe der Stunden
Eingabe: 12:67:12Ausgabe: Fehlerhafte Eingabe der Minuten
Eingabe: 12:55:-3Ausgabe: Fehlerhafte Eingabe der Sekunden
Eingabe: 12?45:4Ausgabe: Fehlerhafte Eingabe des Delimiters
Welchen Wert darf die Anzahl der Stunden keineswegs überschreiten, damit die berechnete Sekundenanzahl im erlaubten Darstellungsbereich für den Datentyp int liegt? Programmieren Sie diese Abfrage in Ihr Programm ein.
Ingenieurinformatik Übung 3 FHA/FM/TH
Übung 4
Eine dreistellige ganze und positive Zahl mit unterschiedlichen Ziffern soll eingegeben werden. Falls die Zahl diese Bedingungen nicht erfüllt, wird das Programm mit einer Fehlermeldung beendet.
Prüfen Sie nach, ob diese Zahl durch ihre Ziffern teilbar ist. Testen Sie alle Möglichkeiten!
Beispiele:
Dreistellige ganze positive Zahl mit unterschiedlichen Ziffern: 123
Die Zahl 123 ist durch 1 und 3 teilbar.
Dreistellige ganze positive Zahl mit unterschiedlichen Ziffern: 247
Die Zahl 247 ist nicht durch ihre Ziffern teilbar.
Ingenieurinformatik FHA/FBM/TH
Übung 5
Erstellen Sie ein C++ Programm, das für drei unterschiedliche Funktionen wahlweise die Funktionswerte in einem beliebigen Bereich mit beliebiger Schrittweite berechnet. Das Programm soll solange die Anwahl der Funktionen anbieten, bis der Benutzer das Programm beendet. Die Eingabe von Groß- und Kleinbuchstaben bei der Wahl ist identisch. Verwenden Sie eine switch-Anweisung!
Beispiel:
Berechnung von Funktionswerten folgender Funktionen:
A) f(x) = sin xB) f(x) = cos xC) f(x) = sin x + cos x
Geben Sie A, B, C oder X (= Ende) ein: a
Startwert: 0Endwert: 3.1416Schrittweite: 0.4
0 00.4 0.3890.8 0.7171.2 0.9321.6 1 2 0.9092.4 0.6752.8 0.335
Übung 6
Erstellen Sie ein C++-Programm, das aus 12 ganzen, positiven und unterschiedlichen Zahlen die drei größten Zahlen ermittelt.
Verwenden Sie ein eindimensionales Array für die 12 Zahlen (x[...]). Die Ermittlung der Werte muß in einer Schleife erfolgen, ebenso die Eingabe der 12 Zahlen.
Beispiel: 3 6 5 1 7 9 12 44 2 53 11 4
Die drei größten Zahlen: 53 44 12
Übung 7
Das gegebene Gleichungssystem soll mit einem C++-Programm gelöst werden.
[ 9 3 63 5 −26 −2 12 ]⋅[ x1
x2
x3]=[ 39
546]
Das iterative Jacobi-Verfahren soll verwendet werden. Die Rechenvorschrift lautet:
x i[n1]= 1
aii⋅bi− ∑
j=i1
z
aij⋅x j[n]−∑
j=1
i−1
aij⋅x j[n ]
Für obiges Beispiel ergibt sich das Ergebnis zu x = [2 1 3] nach 115 Iterationen.
Die Matrix a und der Vektor b sollen vom Benutzer eingegeben werden. Zu Testzwecken kann beides zuerst fest im Programm vorgegeben werden. Das Programm ist so zu gestalten, dass ohne große Änderungen auch größere Gleichungssysteme zu lösen sind. Die Anzahl der Iterationen ist auch Bestandteil des Ergebnisses.
Hinweise:
● Starten Sie mit einem Vektor x0 (0,0,0) und berechnen Sie daraus x1 (4.33, 1, 3.833) .● Erstellen Sie eine do...while-Schleife um die Rechenvorschrift, die aus dem alten x (xalt) ein
neues x (xneu) berechnet. Dies soll solange geschehen, bis der Unterschied zwischen xalt und xneu kleiner als 1e-8 ist.
● Falls das Verfahren nicht konvergiert, sollte nach 1000 Berechnungsschritten abgebrochen werden.
Übung 8
Berechnen Sie mit einem C++ - Programm den Abstand h eines Punktes T von einer Geraden durch zwei Punkte A und B in der xy-Ebene.
Sollten die beiden Punkte A und B identisch sein, so ist der Abstand zwischen T und A zu berechnen.
h=xT−x A⋅ yB− y A− yT− yA⋅x B−x A
sab;
sab= xB−x A2 yB− y A2
A und B identisch:
h=xT−x A2 yT− y A2
Zum Berechnen des Abstands soll ein Unterprogramm verwendet werden.
Testbeispiele: A (1.5, 2.7), B(4.6, 3.2), T(3.0, 1.1) : h = 1.82 A (1.5, 2.7), B(1.5, 2.7), T(3.0, 1.1) : h = 2.19
Übung 9
Aufgabe 9.1
Erstellen Sie ein C++ - Programm, das mit einer Function eine dreistellige positive Zahl in ihre Ziffern zerlegt. Im Hauptprogramm wird die Zahl eingegeben und auf Gültigkeit untersucht. Das Ergebnis wird vom Hauptprogramm am Bildschirm ausgegeben.
Aufruf der Function im Hauptprogramm: digits (zahl, ziffer1, ziffer2, ziffer3);
Aufgabe 9.2
Eine Function soll mit dem Bisektionsverfahren die Nullstelle der Funktion
f(x) = x³ – x² – x +0,04 (Bereich: 0 <= x <= 1)
berechnen (Lösung: 0,038570)
Der Aufruf der Function im Hauptprogramm lautet folgendermaßen:
iter = bisect (li, re, x0);
Die Function bekommt als Parameter vom Hauptprogramm die linke und die rechte Grenze des Intervalls (li, re), in dem die Nullstelle gesucht werden soll. An das Hauptprogramm wird die Nullstelle (x0) und die Anzahl der benötigten Iterationen (iter) zurückgegeben. Sollte keine Nullstelle im Intervall sein, so wird iter in der Function auf -1 gesetzt. Die Ausgabe der Ergebnisse erfolgt auch hier ausschließlich im Hauptprogramm.
Übung 10
Aufgabe 1
Erstellen Sie ein C++ - Programm, das mit einer Function eine maximal fünfstellige positive Zahl in ihre Ziffern zerlegt. Im Hauptprogramm wird die Zahl ein- und auch das komplette Ergebnis ausgegeben.
Das Unterprogramm prüft, ob die Zahl gültig ist (1 - 99 999) und gibt als Funktionswert die Anzahl der Stellen zurück.
Aufruf im Hauptprogramm: f = digit5 ( zahl, c);f : Anzahl der Stellen der Zahl (1-5, bzw. -1 bedeutet ungültige
Zahl)zahl: Eingabeparameter (int)c[5] : Ausgabeparameter, char-Feld für max. 5 Ziffern
Beispiel: Eingabe: 3506 Ausgabe: Die Zahl hat 4 Stellen: 3, 5, 0, 6,
Übung 11Grundgrößen der Festigkeitslehre (Dateien)
Die Querschnittsfläche von Flächen, die von Polygonzügen mit den Stützpunkten P1…Pn berandet werden, lassen sich aus den Koordinaten der Stützpunkte Pi(xi, yi) berechnen.
Fläche: A=12∑i=1
n
x i y i1−x i1 yi
Statische Momente bezüglich der x- und y-Achse:
S x=16∑i=1
n
x i y i1−x i1 y i⋅ yi y i1
S y=16∑i=1
n
x i yi1− x i1 y i⋅x ix i1
Schwerpunktskoordinaten:
x s=S yA; y s=
S xA;
Hinweise:• Bei allen Formeln müssen die Punkte in mathematisch positiver Umlaufrichtung nummeriert
werden.• Der Index i = n+1 ist mit dem Index i = 1 identisch.
Schreiben Sie ein Programm, das die Fläche, die statischen Momente bezüglich der x- und der y-Achse und die Schwerpunktkoordinaten für die folgenden Beispiele berechnet. Legen Sie dazu die Koordinaten der Punkte in einer Textdatei ab. Der Name der Textdatei wird vom Benutzer erfragt.
Datei: Ergebnis:
1 1 A = 85 1 sx = 18.673 5 sy = 241 1 xs = 3
ys = 2.33
y
x
P1(x
1, y
1)
P2(x
2, y
2)
P3(x
3, y
3)
P4(x
4, y
4)
P5(x
5, y
5)
(3, 5)
(5, 1)(1, 1)
Fachhochschule Augsburg Name: _______________________Fakultät für Maschinenbau Vorname: _____________________
Matrikelnr.: ____________________
Ingenieurinformatik WS06/07 Seite 1/9
Prüfungstermin: 8.2.2007Erstprüfer: Prof. Thalhofer
Hilfsmittel: alle Unterlagen, keine Rechner Prüfungsdauer: 90 min Zweitprüfer: Prof. Dr. Zacherl
1 ( 15 ) 2 ( 19 ) 3 ( 22 ) 4 ( 28 ) 5 ( 12 ) Summe ( 96 ) Note
Bitte beantworten Sie alle Aufgaben ausschließlich auf den Angabeblättern (Bei Bedarf Rückseite verwenden!). Als Programmiersprache ist ausschließlich C++ zu verwenden! Viel Erfolg!
1 Datentypen
1.1 Was bedeutet es, wenn eine reelle Zahl 7 Stellen Genauigkeit hat? Geben Sie ein Beispiel an.
[4| ]
FHA FB Maschinenbau Ingenieurinformatik WS06/07 Seite 2/9
1.2 Wieso kann man ein Feld (Array) von char-Variablen c[100] in der Form
cout << c;
ausgeben ohne Verwendung einer Schleife? Wie sieht die Ausgabe unter Verwendung einer Schleife aus?
[7| ]
1.3 Worin unterscheidet sich eine Ganzzahldivision in C++ von einer Division von reellen Zahlen? Welchen zusätzlichen Operator gibt es für Ganzzahlen, den es für reelle Zahlen nicht gibt?
[4| ]
FHA FB Maschinenbau Ingenieurinformatik WS06/07 Seite 3/9
2 Kontrollstrukturen
2.1 Gegeben ist eine mathematische Funktion f(x) = x³ + x² - 6 , die genau eine Nullstelle besitzt. Schreiben Sie einen Programmteil mit Variablendeklaration, der solange eine linke und rechte Intervallgrenze als Eingabe bekommt, bis sich in diesem Intervall die Nullstelle befindet.
Beispiel: Geben Sie linke und rechte Grenze ein: 4 6Keine Nullstelle!Geben Sie linke und rechte Grenze ein: 1 2Nullstelle im Intervall! --- Programmende ---
[7| ]
2.2 Was gibt folgender Programmteil am Bildschirm aus? [6| ]
Ausgabe: int a=0, b=0;
while ( a != 6 ){ b = b + a + 1; cout << b << endl;
a++;}
FHA FB Maschinenbau Ingenieurinformatik WS06/07 Seite 4/9
2.3 Für die Berechnung von a1/3 gilt folgende Iterationsformel:
xneu=132⋅xalt
axalt2
Erstellen Sie einen Programmteil mit Variablendeklaration, der mit Hilfe obiger Formel a1/3 mit einer Genauigkeit von 10-3 berechnen kann.
[6| ]
3 Arrays3.1 Im Array a[100] stehen 100 ganzzahlige Werte. Kopieren Sie diese so in ein
Array b[100], dass die Reihenfolge der Werte vertauscht wird, d.h. im ersten Element von b befindet sich das 100.Elemente von a, usw. Erstellen Sie den Programmteil mit Variablendeklaration, der das Feld a nach b kopiert.Bsp.:a: 3 7 1 4 .... 8 9 5
b: 5 9 8 .... 4 1 7 3[5| ]
FHA FB Maschinenbau Ingenieurinformatik WS06/07 Seite 5/9
3.2 In einem zweidimensionalen Feld (3x3-Matrix) soll bei Angabe einer Zeilennummer diese Zeile in einem eindimensionalen Feld (Vektor) gespeichert werden.
Beispiel: a=[−7 8 12 3 01 6 5] Zeilennummer: 2 b=[ 2 3 0 ]
Erstellen Sie das komplette Programm, einschließlich Eingabe der Matrix über Tastatur, Eingabe der gewünschten Zeile und Kontrollausgabe des Vektors.
[8| ]
FHA FB Maschinenbau Ingenieurinformatik WS06/07 Seite 6/9
3.3 In einer 10x10-Matrix mit reellen, positiven und unterschiedlichen Werten soll der zweitgrößte Wert ermittelt werden. Schreiben Sie einen Programmteil mit Variablendeklaration. Die Matrix ist darin nicht mit Werten zu belegen. Geben Sie den gesuchten Wert aus. Hinweis: Die Werte der Matrix dürfen verändert werden.
[9| ]
FHA FB Maschinenbau Ingenieurinformatik WS06/07 Seite 7/9
4 Unterprogramme
4.1 Ein Unterprogramm soll einen reellen Wert (Geldbetrag in Euro und Cent) als Eingabewert bekommen und als Ausgabeparameter zwei ganzzahlige Werte (Euro, Cent) zurückgeben.
Beispiel: Eingabeparameter: 12.78 (1 Zahl mit 2 Nachkommastellen)Ausgabeparameter: 12 78 ( 2 ganze Zahlen)
[14| ]
Wie sieht der Prototyp aus?
Erstellen Sie das Unterprogramm.
Erstellen Sie ein kurzes Hauptprogramm, um das Unterprogramm zu testen.
FHA FB Maschinenbau Ingenieurinformatik WS06/07 Seite 8/9
4.2 Erstellen Sie ein Unterprogramm, das ein Feld mit maximal 100 double-Werten und die Anzahl der Werte im Feld als Eingabeparameter bekommt und den Mittelwert (Funktionswert!) und ein Feld mit den Abweichungen der Werte vom Mittelwert an das aufrufende Programm übergibt.
Beispiel (mit 3 Werten): 1.23 4.70 3.07Mittelwert: 3.00
Abweichungen: 1.77 1.70 0.07. [14| ]
FHA FB Maschinenbau Ingenieurinformatik WS06/07 Seite 9/9
5 Textdateien
Das folgende Programm liest ganzzahlige Werte aus der Textdatei Text.txt bis der Wert -1 gelesen wird. Hier stoppt das Programm und gibt die Position dieses Wertes in der Datei auf dem Bildschirm aus. Korrigieren Sie die Fehler und ergänzen Sie, wenn nötig.
[12| ]
#include <iostream>
using namespace std;int main () {ofstream ein;int n;ein.open ( text.txt);if ( ein()) cout << "Fehler"; return 0;while ( eof.ein ) { cin >> x;
if ( x = -1) { cout << n << endl; continue; }}system ("pause");return 0;}
Fachhochschule Augsburg Name: _______________________Fakultät für Maschinenbau Vorname: _____________________
Matrikelnr.: ____________________
Ingenieurinformatik SS07 Seite 1/9
Prüfungstermin: 24.7.2007Erstprüfer: Prof. Thalhofer
Hilfsmittel: alle Unterlagen, keine Rechner Prüfungsdauer: 90 min Zweitprüfer: Prof. Dr. Zacherl
1 ( 9 ) 2 ( 16 ) 3 ( 33) 4 ( 32 ) 5 ( 10 ) Summe ( 100 ) Note
Bitte beantworten Sie alle Aufgaben ausschließlich auf den Angabeblättern (Bei Bedarf Rückseite verwenden!). Als Programmiersprache ist ausschließlich C++ zu verwenden! Viel Erfolg!
1 Datentypen
1.1 Was passiert, wenn Sie zwei ganze Zahlen addieren, die zusammen den Darstellungsbereich des gewählten Datentyps überschreiten?
[2| ]
Ergebnis liegt im negativen Bereich
keine Fehlermeldung
1.2 Was ergeben folgende Operationen? Geben Sie an, ob das Ergebnis als ganze Zahl oder als reelle Zahl gespeichert wird.
[4| ]5 / 2.5 = 2.0 reell
8 % 3 = 2 ganz
6 + 1 / 3 = 6 ganz
6.0 + 1 / 3 = 6.0 reell
FHA FB Maschinenbau Ingenieurinformatik SS07 Seite 2/9
1.3 Welchen Wahrheitswert nehmen die Bedingungen der folgenden Verzwei-gungen an? Begründung!
[3| ]
a = 1; b = 2; c = 0;if (a == b) false, da Zahlen ungleich ....if (a = b) true, da b ungleich Null .....if (a = c) false, da c gleich Null .....
FHA FB Maschinenbau Ingenieurinformatik SS07 Seite 3/9
2 Kontrollstrukturen
2.1 Was wird von diesem Programmteil am Bildschirm angezeigt?
[6| ]
int i, x, y;for (i=0; i<3; i++) { x = 2; y = 2; while (x != 0 || y == 0){ x--; y++; cout << i << " " << x << " " << y << endl;
}}
0 1 3
0 0 4
1 1 3
1 0 4
2 1 3
2 0 4
FHA FB Maschinenbau Ingenieurinformatik SS07 Seite 4/9
2.2 Schreiben Sie einen Programmteil, in dem von 10 Werten jeweils der Kehrwert
gebildet wird und diese Werte aufsummiert werden. Beachten Sie dabei, dass
die Messwerte auch den Wert Null annehmen können. Diese Fälle werden
gezählt und mit dem Ergebnis der Summation ausgegeben. Die Messwerte
müssen vom Benutzer eingegeben und sollen nicht in einem Array gespeichert
werden.
Formel: s=∑i=1
10 1x i
für x i≠0
Beispiel: 10 Werte: 2 3 0 5 0 6 0 3 1 0Ausgabe: Summe der Kehrwerte: 2.53333
Anzahl Nullwerte: 4
[10| ]
int x, i, null=0; double s=0;
for (i=0; i<10; i++){
cout << "Wert: "; cin >> x; if (x != 0)
s = s + 1.0/x; else
null++;
}
cout << s << " " << null << endl;
FHA FB Maschinenbau Ingenieurinformatik SS07 Seite 5/9
3 Arrays3.1 Erstellen Sie ein Programm, das aus 100 Werten, die in einem
eindimensionalen Feld stehen, den größten und kleinsten herausfindet und die Position der beiden Werte tauscht.Beispiel mit 6 Werten: 7.6 8.9 3.7 -1.6 -1.2 4.3 (vorher)
7.6 -1.6 3.7 8.9 -1.2 4.3 (nachher) [18| ]
#include <iostream>
using namespace std;
int main () {
int i, posMax, posMin;
double x[6]= {7.6, 8.9, 3.7, -1.6, -1.2, 4.3}, tmp, min, max;
min = x[0];
max = x[0];
for (i=0; i<6; i++){
if (x[i] >= max){
max = x[i];
posMax = i;}
if (x[i] <= min){
min = x[i];
posMin = i;}
}
tmp = x[posMax];
x[posMax] = x[posMin];
x[posMin] = tmp;
for (i=0; i<6; i++)
cout << x[i] << " ";
cout << endl;
system ("pause");
return 0; }
FHA FB Maschinenbau Ingenieurinformatik SS07 Seite 6/9
3.2 Erstellen Sie ein Programm, das in einer 100x100-Matrix die Spalten einer Zeile aufsummiert und dann die Summe der Spalten der geraden Zeilen von den ungeraden abzieht.
Beispiel für n= 4: m=[1 4 −1 35 7 −8 −32 −1 0 75 −4 3 9 ]
S1=7S2=1S 3=8S 4=13
S=S1−S2S3−S4=1
Die Matrix ist im Programm für Testzwecke als 4x4-Matrix vorgegeben und muss nicht vom Benutzer eingegeben werden.
[15| ]
#include <iostream>#include <cmath>using namespace std;int main () {int m[4][4]= {1,4,-1,3, 5,7,-8,-3, 2,-1,0,7, 5,-4,3,9}, i, j, s[4]={0}, sum=0;for (i=0; i<4; i++){ for (j=0; j<4; j++) s[i]=s[i]+m[i][j]; sum = sum + pow(-1.0,i)*s[i];}cout << sum << endl;system ("pause");return 0; }
FHA FB Maschinenbau Ingenieurinformatik SS07 Seite 7/9
4 Unterprogramme
4.1 Schreiben Sie ein Unterprogramm, das zwei reelle Zahlen und ein Zeichen als Eingabeparameter bekommt. Das Zeichen kann folgende gültige Inhalte haben:
+, -, *Je nach Operator werden die beiden Zahlen addiert, subtrahiert bzw. multipliziert. Als Funktionswert wird das Ergebnis der Rechenoperation an das aufrufende Programm zurückgegeben. Falls ein ungültiger Operator übergeben wird, wird der Funktionswert auf -55 555 gesetzt.Erstellen Sie auch ein kurzes Hauptprogramm zum Testen und den Prototypen.
[18| ] #include <iostream>
using namespace std;
double calc (double, double, char);
int main () {double erg;
erg = calc (3.4, 1.2, '+');
if (erg == -55555) cout << "Ungueltiger Operator!" << endl;else
cout << erg << endl;
system ("pause");
return 0; }
double calc (double a, double b, char o) {
switch (o) {
case '+': return a+b;
case '-': return a-b;
case '*': return a*b; default: return -55555;
}
}
FHA FB Maschinenbau Ingenieurinformatik SS07 Seite 8/9
4.2 Programm mit Fehlern
Das folgende Programm soll die Werte in zwei Vektoren miteinander vergleichen, indem der Betrag der Differenz der beiden Werte gebildet wird. Korrigieren Sie die Fehler und ergänzen Sie, wenn nötig.
Beispiel: Vektor 1: 2 4 7 1Vektor 2: 3 7 1 0 Vektor 3: 1 3 6 1
. [14| ]
#include <isodream>using namespace std;int main () {int vgl ( int, int, int &);int m1[4]= {2,4,7,1}, m2[4]={3,7,1,0}, m3[4] ;vgl ( a, b, c );
cout << m3[i];system ("pause");return 0;}
int vgl (int a, int b, int c) {int i;for (i=1; i<=4; i++) fabs (a[i] – b[i]) = c[i];return c; }
FHA FB Maschinenbau Ingenieurinformatik SS07 Seite 9/9
4.2 Programm mit Fehlern (Lösung)
Das folgende Programm soll die Werte in zwei Vektoren miteinander vergleichen, indem der Betrag der Differenz der beiden Werte gebildet wird. Korrigieren Sie die Fehler und ergänzen Sie, wenn nötig.
Beispiel: Vektor 1: 2 4 7 1Vektor 2: 3 7 1 0 Vektor 3: 1 3 6 1
. [14| ]
#include <iostream>using namespace std;void vgl ( int [], int [], int []);int main () {int m1[4]= {2,4,7,1}, m2[4]={3,7,1,0}, m3[4], i ;vgl ( m1, m2, m3 );for (i=0; i<4; i++) cout << m3[i];system ("pause");return 0;}#include <cmath>void vgl ( int a[], int b[], int c[]) {int i;for (i=0; i<4; i++) c[i] = fabs (a[i] – b[i]) ;// return c; }
FHA FB Maschinenbau Ingenieurinformatik SS07 Seite 10/9
5 Textdateien
Erstellen Sie ein Programm, das aus der Textdatei „lesen.txt“ 10 Zeichen einliest und diese am Bildschirm anzeigt. Prüfen Sie nach, ob die Datei existiert, wenn dies nicht der Fall ist, wird das Programm mit einer Fehlermeldung beendet.
[10| ]
#include <iostream>
#include <fstream>
using namespace std;
int main () {ifstream e;
int i;
char c;
e.open ("lesen.txt");if (!e){
cout << "Datei nicht gefunden!" << endl, system ("pause");
return 0;}
for (i=1; i<=10; i++){ e >> c; cout << c;}
cout << endl;
e.close();
system ("pause");return 0; }
Fachhochschule Augsburg Name: _______________________Fakultät für Maschinenbau Vorname: _____________________
Matrikelnr.: ____________________
Ingenieurinformatik WS07/08 Seite 1/11
Prüfungstermin: 7.2.2008Erstprüfer: Prof. Thalhofer
Hilfsmittel: alle Unterlagen, keine Taschenrechner Prüfungsdauer: 90 min Zweitprüfer: Prof. Dr. Zacherl
1 ( 14) 2 ( 20) 3 ( 20) 4 ( 30 ) 5 ( 10 ) Summe ( 104 ) Note
Bitte beantworten Sie alle Aufgaben ausschließlich auf den Angabeblättern (Bei Bedarf Rückseite verwenden!). Als Programmiersprache ist ausschließlich C++ zu verwenden! Viel Erfolg!
1 Datentypen, Operatoren, Standardfunktionen
1.1 Warum ist eine Unterscheidung in ganzzahlige und reelle Datentypen beim Programmieren nötig? Worin unterscheiden sich diese Datentypen?
[4| ]
- unterschiedliche Darstellungsformen
- ganze Zahlen: Darstellungsbereich
- reelle Zahlen: Darstellungsbereich und Genauigkeit
1.2 Ein reeller Datentyp habe 6 Stellen Genauigkeit. Wie sieht das Ergebnis der folgenden Operation aus?
[2| ]16405.0 + 1.64317 = 16406.6
FHA FB Maschinenbau Ingenieurinformatik WS07/08 Seite 2/11
1.3 Wie kann man feststellen, ob der ganzzahlige Teil einer reellen Zahl durch 7 teilbar ist? Schreiben Sie die nötigen Programmzeilen (mit Variablen-deklaration).
[4| ]
double zahl=21.78;
if (int(zahl)%7 == 0)
cout << "teilbar " << endl;
1.4 Die Fläche eines Dreiecks lässt sich mit der Formel
F=12⋅a⋅ba−cos2 mit cos= c
2−a2b22ab
berechnen. Erstellen Sie die Programmzeilen dazu (mit Variablendeklaration).[4| ]
#include <cmath>
double cgam, a, b, c, f;
cgam = (c*c - (a*a + b*b))/(2*a*b);
f = 0.5*a*b*sqrt (a-cgam*cgam);
FHA FB Maschinenbau Ingenieurinformatik WS07/08 Seite 3/11
2 Kontrollstrukturen
2.1 Geben Sie einen logischen Ausdruck an, der die folgenden Bedingungen repräsentiert.
[6| ]
a) x ist größer als 20 und gleichzeitig kleiner oder gleich 25
x > 20 && x <= 25
b) x ist kleiner oder gleich 20 oder größer als 25
x <= 20 || x > 25
2.2 Welche Ausgaben liefern die folgenden Schleifen?
[10| ]
a)
for (j=0; j<3; j=j+2) for (k=j; k<2*j; k++) cout << j << " " << k << endl;
2 22 3
b)i = 1;m = 6;do { cout << i << " " << m << endl; m--; i++;} while (m>i); i m
1 62 53 4
FHA FB Maschinenbau Ingenieurinformatik WS07/08 Seite 4/11
2.3 Welchen Wert haben folgende Terme?[4| ]
37/(4*3) = 3
37/4/3 = 3
37%4%4 = 1
37%(14%5) = 1
FHA FB Maschinenbau Ingenieurinformatik WS07/08 Seite 5/11
3 Arrays3.1 Schreiben Sie ein Programm, das zwei 9x9-Matrizen a und b vom Bildschirm
einliest, die Elemente von a und b vergleicht und das Ergebnis in einer 9x9-Matrix c vom Datentyp Character ablegt und ausgibt.Die Ergebnismatrix ermittelt sich zu:
Element von a kleiner als Element von b, dann setze 'K' in cElement von a grösser als Element von b, dann setze 'G' in cElement von a identisch Element von b, dann setze 'I' in c
Bsp. für eine 2x2-Matrix: a=[7 50 −3]; b=[9 5
−1 4]; c=[K IG K];
[12| ]
FHA FB Maschinenbau Ingenieurinformatik WS07/08 Seite 6/11
#include <iostream>
using namespace std;
int main () {
const int N=9;
int a[N][N], b[N][N], i, j;
char c[N][N];
cout << "Matrix a eingeben: " << endl;
for (i=0; i<N; i++)
for (j=0; j<N; j++)
cin >> a[i][j];
cout << "Matrix b eingeben: " << endl;
for (i=0; i<N; i++)
for (j=0; j<N; j++){
cin >> b[i][j];
if (a[i][j] < b[i][j]) c[i][j]='K';
else if (a[i][j] > b[i][j]) c[i][j]='G';
else c[i][j]='I';
}
for (i=0; i<N; i++){
for (j=0; j<N; j++)
cout << c[i][j] << " ";
cout << endl; }
system ("pause");
return 0;}
FHA FB Maschinenbau Ingenieurinformatik WS07/08 Seite 7/11
3.2 In einem Vektor v[1000] mit ganzzahligen und positiven Werten kommt ein Wert genau zweimal vor. Die anderen Zahlen sind unterschiedlich. Diese Zahl soll am Bildschirm ausgegeben werden. Die Eingabe des Vektors ist nicht erforderlich.Bsp: 2, 4, 7, 9, 12, 7, 8, 3, ... Ergebnis: 7
[8| ]
#include <iostream>
using namespace std;
int main (){
const int N=8;
int v[N]={2,4,7,9,12,2,8,3},i,j;
for (i=0; i<N; i++)
for (j=i+1; j<N; j++)
if (v[i] == v[j])
cout << v[i] << endl;
system ("pause");
return 0;}
FHA FB Maschinenbau Ingenieurinformatik WS07/08 Seite 8/11
4 Unterprogramme
4.1 Die Vergleichsspannung σV berechnet sich für den ebenen Spannungszustand zu
V= x2 y2− x yxy2Schreiben Sie ein Unterprogramm, das aus den drei Spannungen σx, σy und τxy
die Vergleichsspannung σV berechnet.[10| ]
#include <cmath>
double sv (double sx, double sy, double txy){
return sqrt (sx*sx+sy*sy-sx*sy+txy*txy);}
FHA FB Maschinenbau Ingenieurinformatik WS07/08 Seite 9/11
4.2 Ein Unterprogramm soll eine Temperatur TC in °C in Temperaturen in Rankine TR, Kelvin TK bzw. Fahrenheit TF umrechnen.
T K=T C273,15T R=T C⋅1,8491,67T F=T C⋅1,832
Ein Eingabeparameter gibt an, welche Umrechnung durchgeführt werden soll. Der Aufruf des Programms sieht folgendermaßen aus:
tempRech ( Tein, Taus, welche);
Tein: Eingabetemperatur in °CTaus: Ausgabetemperaturwelche = 1 : Umrechnung in Kelvin
= 2: Umrechnung in Rankine= 3: Umrechnung in Fahrenheit
. [11| ]
Wie sieht der Prototyp aus?
void tempRech ( double, double&, int);
Erstellen Sie das Unterprogramm.
void tempRech ( double Tein, double& Taus, int welche){
switch (welche) {
case 1: Taus = Tein + 273.15;
break;
case 2: Taus = Tein*1.8 + 491.67;
break;
case 3: Taus = Tein*1.8 + 32;
}
}
FHA FB Maschinenbau Ingenieurinformatik WS07/08 Seite 10/11
4.3 Programm mit Fehlern
Die Fibonacci-Folge errechnet den Wert xn aus der Summe der beiden vorhergehenden Werte xn-1 und xn-2.Bsp.: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, .....
Das folgende Programm errechnet die n-te Zahl aus dieser Folge. (Bsp.: Eingabe 11 Ausgabe 55)
Korrigieren Sie die Fehler!. [9| ]
#include <icecream>
void fibo (int);int main(){cout << x = fibo(11)<< endl;system ("prause");return 0;}int fibo (int 11){
int xalt=0, xneu=1; for (i=0; i<=n; i++){ tmp = xneu; xneu = xalt + xneu;
} return xneu;}
FHA FB Maschinenbau Ingenieurinformatik WS07/08 Seite 11/11
4.3 Programm mit Fehlern (Lösung)
Die Fibonacci-Folge errechnet den Wert xn aus der Summe der beiden vorhergehenden Werte xn-1 und xn-2.Bsp.: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, .....
Das folgende Programm errechnet die n-te Zahl aus dieser Folge. (Bsp.: Eingabe 11 Ausgabe 55)
Korrigieren Sie die Fehler!. [9| ]
#include <iostream>using namespace std;int fibo (int);int main(){cout << fibo(11)<< endl;system ("pause");return 0;}int fibo (int n){
int i, tmp; int xalt=0, xneu=1; for (i=3; i<=n; i++){ tmp = xneu; xneu = xalt + xneu;
xalt = tmp; }
return xneu;}
FHA FB Maschinenbau Ingenieurinformatik WS07/08 Seite 12/11
5 Textdateien
Erstellen Sie ein Programm, das aus der Textdatei c:\test\werte.txt, deren Inhalt folgendermaßen aussieht
1 3.2 4.63 6.7 1.24 1.5 -7.97 -3.5 1.4........
jeweils die Zeilen am Bildschirm ausgibt, deren ganzzahliger Wert durch 3 teilbar ist (in unserem Beispiel wäre dies 3 6.7 1.2).
[10| ]
#include <fstream>
#include <iostream>
using namespace std;
int main (){
ifstream ein;
int z;
double a,b;
ein.open ("c:\\test\\werte.txt");
if (!ein)
cout << "Datei nicht gefunden!" << endl;
else {
while (!ein.eof()) {
ein >> z >> a >> b;
if (z%3 == 0)
cout << z << " " << a << " " << b << endl;
}
ein.close();
}
system ("pause");
return 0;}
Hochschule Augsburg Name: _______________________Fakultät für Maschinenbau Vorname: _____________________
Matrikelnr.: ____________________
Ingenieurinformatik SS08 Seite 1/11
Prüfungstermin: 14.7.2008Erstprüfer: Prof. Thalhofer
Hilfsmittel: alle Unterlagen, keine Taschenrechner Prüfungsdauer: 90 min Zweitprüfer: Prof. Dr. Zacherl
1 ( 20) 2 (20) 3 (20) 4 (31) 5 (11 ) Summe (102 ) Note
Bitte beantworten Sie alle Aufgaben ausschließlich auf den Angabeblättern (Bei Bedarf Rückseite verwenden!). Als Programmiersprache ist ausschließlich C++ zu verwenden! Viel Erfolg!
1 Kurzfragen
1.1 Schreiben Sie eine Anweisung mit der Sie folgende Eingabewerte über die Tastatur einlesen können. Geben Sie dazu die Deklaration der benötigten Variablen und das cin-Kommando an.
[5| ]14,11a16.7
Variablendklaration:
int i1,i2; char c1,c2; double d1;
cin >> i1 >> c1 >> i2 >> c2 >> d1;
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik SS08 Seite 2/11
1.2 Welche Ergebnisse liefern folgende Anweisungen?
[3| ](14.5 + 10.5) / 3 ergibt ... 8.3331/3 * (14.5 + 10.5) ergibt .. 0(14 + 11) / 3 ergibt ... 8
1.3 Wozu dient "#include <cmath>"?[2| ]
Definition der mathematischen Standardfunktionen
und π
1.4 Nennen Sie mathematische Operatoren, die für reelle Zahlen verwendet werden können.
[4| ]
+, -, * , /
1.5 Nennen Sie Vergleichsoperatoren.[3| ]
< <=
> >=
== !=
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik SS08 Seite 3/11
1.6 Was wird auf dem Bildschirm ausgegeben? Begründung![3| ]
int x=0;if (x) cout << "eins";else cout << "zwei";
zwei, da 0 dem Wahrheitsgehalt false entspricht
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik SS08 Seite 4/11
2 Kontrollstrukturen
2.1 Welche Ausgaben liefert folgender Programmteil?
[8| ]int i, j, k=0, l=0;for (i=1; i<4; i=i+2) for (j=4; j>i; j--){ k = k-i;
l = l+j; cout << i << " " << j << " " << k << " " << l << endl;
}
1 4 -1 41 3 -2 71 2 -3 93 4 -6 13
2.2 Die Multiplikation von Ganzzahlen soll als Addition programmiert werden.Beispiel: 8*3 = 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 allg.: k*m = m + m + ....
Erstellen Sie einen Programmteil mit Variablendeklaration, der dies bewerkstelligt [4| ]
int s=0, m=3, k=8, i;
for (i=1; i<=k; i++)
s = s + m;
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik SS08 Seite 5/11
2.3 Ein Anweisungsteil ist dann auszuführen, wenn
0 < a <= 10 und gleichzeitig b ein Großbuchstabe ist.
Wie lautet diese Bedingung in C++?
0 < a && a <= 10 && b >= 'A' && b <= 'Z'
Wie lautet die gegenteilige Bedingung (a liegt außerhalb des Bereichs usw. )?
[8| ]
! ( 0 < a && a <= 10 && b >= 'A' && b <= 'Z')
oder:
0 >= a || a > 10 || b < 'A' || b > 'Z'
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik SS08 Seite 6/11
3 Arrays3.1 Von 100 Zahlen im Array a sind die ersten 50 positiv und die nächsten 50
negativ. Kopieren Sie die Zahlen von a so ins Array b, dass auf eine positive
Zahl immer die nächste negative folgt.Bsp.: n=10: a: 7 8 9 3 2 -3 -1 -11 -13 -5
b: 7 -3 8 -1 9 -11 3 -13 2 -5Nur Variablendeklaration und Programmteil! [9| ]
const int N=100;int i, a[N], b[N], k=N/2-1, l=-1;
for (i=0; i<N; i++) if (i%2==0){ l++; b[i]=a[l];} else { k++; b[i]=a[k];}
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik SS08 Seite 7/11
3.2 Eine 3x3-Matrix (Erweiterbarkeit auf nxn muss möglich sein!) soll mit den folgenden Werten belegt werden:
m=[1 2 34 5 67 8 9]
Wie sieht ein Programmteil (mit Variablendeklaration) aus, der diese Belegung zu Testzwecken vornimmt und danach überprüft, ob die Summe der Elemente der Hauptdiagonalen größer ist als die Summe der restlichen Matrixelemente?Bsp.: Summe Hauptdiagonale: 1+5+9=15
Summe Rest: 2+3+4+6+7+8=30[11| ]
const int N=3;
int i,j, m[N][N], k=1, sd=0, sr=0;
for (i=0; i<N; i++) for (j=0; j<N;j++){ m[i][j]=k; k++;}
for (i=0; i<N; i++) for (j=0; j<N;j++) if (i==j) sd = sd+m[i][j]; else sr = sr+m[i][j];
if (sd > sr) cout << sd << " größer " << sr << endl; else cout << sd << " kleiner " << sr << endl;
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik SS08 Seite 8/11
4 Unterprogramme
4.1 Schreiben Sie ein Programm, das mit der Faßregel von Kepler die Funktion f(x) = x² innerhalb beliebiger Grenzen a und b numerisch integriert.
Die Faßregel lautet:
S=b−a6⋅ f a4⋅ f m f b;
a: linke Integrationsgrenzeb: rechte Integrationsgrenzem = (a+b)/2;
Das Hauptprogramm soll die Eingabe der Größen a und b ermöglichen und den Integralwert S als Ergebnis ausgeben. Die Berechnung des Integralwertes soll
in einer Function erfolgen. Auch die Funktionswerte f(x) sollen in einer eigenen Function errechnet werden.
[17| ]
#include <iostream>using namespace std;
double fass (double, double);double f (double);
int main () { double li, re; cout << "Linke und rechte Grenze: "; cin >> li >> re; cout << fass (li, re) << endl; system ("pause"); return 0;}
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik SS08 Seite 9/11
double fass (double a, double b) { double m; m = (a+b)/2; return (b-a)/6*(f(a)+4*f(m)+f(b));}
double f (double x) { return x*x;}
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik SS08 Seite 10/11
4.2 Das folgende Programm tauscht den Inhalt zweier Variablen ohne Verwendung einer Hilfsvariablen. Markieren Sie die Fehler (keinen Rotstift verwenden!) und überprüfen Sie die Funktionalität des Programms.
. [14| ]
#include <iocream>
double tausch (double , double );
int main ()
int z1, z2;
tausch ( z2, z1 );
cout >> z1 >> " " >> z2 >> end ;
system ("pause"); return 0; }
double tausch ( double a, double b) {
a = a+b;
b = a-b;
a = a-b; }
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik SS08 Seite 11/11
4.2 Lösung:
#include <iostream>
using namespace std;void tausch (double &, double &);
int main (){
double z1=1, z2=2;
tausch ( z2, z1 );
cout << z1 << " " << z2 << endl ;
system ("pause"); return 0; }
void tausch ( double &a, double &b) {
a = a+b;
b = a-b;
a = a-b; }
Algorithmus ist in Ordnung!
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik SS08 Seite 12/11
5 Textdateien
In einer Textdatei (c:\test\zahlen.txt) steht eine unbekannte Anzahl von reellen Zahlenwerten. Lesen Sie diese in ein Feld mit maximal 1000 Speicherplätzen ein. Das Einlesen soll dann beendet sein, wenn das Feld voll ist oder wenn das Ende der Datei erreicht ist.
[11| ]
#include <iostream>#include <fstream>using namespace std;
int main (){ ifstream ein; double a[1000]; int n=0; ein.open ("c:\\test\\zahlen.txt");
// c:/test/zahlen.txt geht auch! if (!ein) cout << "Fehler: Datei nicht vorhanden!" << endl; else { while (!ein.eof() && n<=1000){ ein >> a[n]; n++;} } ein.close (); system ("pause"); return 0; }
Hochschule Augsburg Name: _______________________Fakultät für Maschinenbau Vorname: _____________________
Matrikelnr.: ____________________
Ingenieurinformatik WS08/09 Seite 1/8
Prüfungstermin: 23.1.2009Erstprüfer: Prof. Thalhofer
Hilfsmittel: alle Unterlagen, keine Taschenrechner Prüfungsdauer: 90 min Zweitprüfer: Prof. Dr. Weiß
1 ( 21) 2 (19) 3 (24) 4 (16) Summe (80) Note
Bitte beantworten Sie alle Aufgaben ausschließlich auf den Angabeblättern. Bei Bedarf Rückseite verwenden! Als Programmiersprache ist ausschließlich C++ zu verwenden! Viel Erfolg!
1 Kurzfragen
1.1 Wie kann man Kommentarzeilen in ein Programm einfügen und wozu dienen
sie?[5| ]
/* …...... */ mehrzeilige Kommentare
// ….... erstreckt sich nur über den Rest der Zeile
Dokumentation durch Kommentare
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS08/09 Seite 2/8
1.2 Schreiben Sie einen Programmteil, der x12 in einer Schlife berechnet. Die Verwendung von mathematischen Standardfunktionen aus cmath.h ist dabei nicht erlaubt.
[5| ]
double x=2, xalt;xalt = x;
for (i=2; i<=12; i++) x = x * xalt;
1.3 Geben Sie die Bildschirmanzeige folgenden Programmteils an. int i, k;i = 20;k = i;while ( k > 15 && i > 10 ) { cout << k << " " << i << endl; i = i + 2; k = k – i/10; }
[6| ]
k i20 2018 2216 24
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS08/09 Seite 3/8
1.4 Nennen Sie mathematische Operatoren, die für ganze Zahlen verwendet werden können.
[5| ]
+ - * / %
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS08/09 Seite 4/8
2 Arrays (Felder)
2.1 Von einem ganzzahligen Vektor, der 100-Elemente gespeichert hat, soll jedes Element aufsummiert werden, das größer als 10 bzw. kleiner als 5 ist. Der Vektor ist vom Benutzer einzugeben.
Beispiel: Vektor: -1 2 7 8 0 9 12 ….. Ausgabe: 13
(Bemerkung: 13 = -1+2+0+12)[13| ]
#include <iostream>
using namespace std;
int main (){
int v[100], i, sum=0;
cout << "Vektor: ";
for (i=0;i<100; i++){
cin >> v[i];
if (v[i] > 10 || v[i]<5)
sum = sum + v[i];
}
cout << "Summe = " << sum << endl;
system ("pause");
return 0;}
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS08/09 Seite 5/8
2.2 Wie sieht das Einlesen des Vektors aus, wenn der Vektor maximal 100 Elemente lang sein darf (Überschreitung der 100 Werte darf nicht möglich sein) und das Einlesen beendet wird, wenn der Benutzer -777 eingibt? Die Anweisung « break » darf nicht verwendet werden. Nur der Programmteil ist zu erstellen, der das Einlesen betrifft. Verwenden Sie eine do-while-Schleife zum Einlesen. [6| ]
i=-1;
do {
i++;
cin >> v[i];
}while (i<99 && v[i] != -777);
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS08/09 Seite 6/8
3 Unterprogramme (Functions)3.1 Wie sieht der Prototyp eines Unterprogramms mit Namen test32 aus, das 3
reelle Werte als Eingabeparameter bekommt und 2 ganze Zahlen als Parameter an das aufrufende Programm zurückgibt? [7| ]
void test32 ( double, double, double, int&, int& );
3.2 Ein Unterprogramm bekommt eine ganze Zahl (int) und soll als Funktionswert die Anzahl der Stellen dieser Zahl zurückgeben. Ist die Zahl negativ, so ist auch dieser Rückgabewert negativ. Erstellen Sie die Funktion und auch ein kleines Hauptprogramm zum Testen.Beispiel: 714122 Rückgabewert: 6
-312 Rückgabewert: -3[17| ]
#include <iostream>
using namespace std;
int stellen (int);
int main (){
int s;
s = stellen (7122);
cout << "Anzahl Stellen: " << s << endl;
system ("pause");
return 0;}
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS08/09 Seite 7/8
int stellen (int z){
int i=0, zz=z;
do {
zz=zz/10;
i++;
} while (zz!=0);
if (z<0)
return -i;
else
return i;
}
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS08/09 Seite 8/8
4 Programm mit Fehlern
Das aufgelistete Programm liest reelle Werte von einer Datei. Die Anzahl der Werte ist nicht bekannt. Jeweils 10 Werte werden gemeinsam am Bildschirm angezeigt. Durch Drücken einer beliebigen Taste kann der Benutzer die nächsten 10 Werte anzeigen bis keine Werte mehr auf der Datei zu lesen sind. Korrigieren und ergänzen Sie das Programm.
[16| ]#include <iodream>using namespace std;int main (){ ofdream rein;
char DateiName ;cout << "DateiName:";cin >> DateiName >> endl;
if (rein){ while (notEOF.rein) {
rein >> wert;cout << wert << endl;
} // end-while
} //end-ifelse;
cout << "Fehler!" << endl; system ("prause"); rerun 0; }
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS08/09 Seite 9/8
#include <iostream>#include <fstream>
using namespace std;int main (){ ifstream rein;
double wert; int i=0;
char DateiName [80];cout << "DateiName:";cin >> DateiName >> endl;
rein.open (DateiName);if (rein){ while (!rein.eof()) {
rein >> wert;cout << wert << endl;
i++; if (i%10 == 0) system ("pause"); } // end-while rein.close (); } // end-if else ; cout << "Fehler!" << endl;
system ("pause");return 0; }
Hochschule Augsburg Name: _______________________Fakultät für Maschinenbau Vorname: _____________________
Matrikelnr.: ____________________
Ingenieurinformatik WS09/10 Seite 1/11
Prüfungstermin: 11.1.2010Erstprüfer: Prof. Thalhofer
Hilfsmittel: alle Unterlagen, keine Taschenrechner Prüfungsdauer: 90 min Zweitprüfer: Prof. Dr. Weiß
1 ( 38) 2 (22) 3 (30) Summe (90) Note
Bitte beantworten Sie alle Aufgaben ausschließlich auf den Angabeblättern. Bei Bedarf Rückseite verwenden! Als Programmiersprache ist ausschließlich C++ zu verwenden! Viel Erfolg!
1 Kurzfragen
1.1 Formulieren Sie die Bedingung für eine while-Schleife, die dann abgebrochen wird, wenn folgende Bedingung erfüllt ist:
i kleiner gleich 12 und c gleich 'J'[3| ]
while (i<12 || c!='J')
ODER:
while (!(i<=12 && c=='J')
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS09/10 Seite 2/11
1.2 Geben Sie einen sinnvollen Datentyp für die Variablen a und b an! Welche Zahl ist jeweils im Speicher des Rechners abgelegt?
[4| ]
a = 4; int 4
b = '4'; char 4+48=52
1.3 Ergänzen Sie die Bildschirmanzeige folgenden Programmteils. [5| ]
int i = 3, j; while ( i<=6) { cout << i << " : " ; if ( i%3 == 0){ j = i; while ( j>0 ){ cout << j << " - "; j=j-2; } } cout << endl; i++;}Ausgabe: (bitte j ergänzen)3: 3-1-
4:5:6: 6-4-2-
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS09/10 Seite 3/11
1.4 Geben Sie den Prototyp für ein Unterprogramm mit Namen modulo an, das den Modulo-Operator ersetzen kann.
[4| ]
int modulo (int, int);
1.5 Welche Möglichkeiten gibt es in C++ bei Verwendung von cout die Ausgabe zu formatieren? (Breite, Anzahl der Stellen, ...)
[5| ]
iomanip
cout << setw
left
right
setprecision
setiosflags (ios::fixed)
1.6 Geben Sie mehrere Möglichkeiten, wie Sie die Konstante π in einem Programm definieren können.
[4| ]
cmath M_PI
const double PI = 3.14;
PI = 4 * atan(1); (cmath, keine Konstante!)
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS09/10 Seite 4/11
1.7 Schreiben Sie die for-Schleife
for (i=12; i>=-1; i--) cout << i << endl;
in eine while- und in eine do-while-Schleife um.[6| ]
i=12; while (i>=-1){ cout << i << endl; i--; }
i=12; do{ cout << i << endl; i--; }while (i>=-1);
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS09/10 Seite 5/11
1.7 Schreiben Sie einen Programmteil, der vom Benutzer die Eingabe eines der
folgenden Zeichen (e,f,s,x) verlangt und mit einer switch-Anweisung das Wort
„Rakete“ ins Englische (rocket), ins Französische (fusee) oder ins Spanische
(cohete) übersetzt und am Bildschirm ausgibt.
[7| ]
char c;
cout << "Rakete in Englisch (e), französisch (f), spanisch(s) --- Ende (x)";
cin >> c;
switch (c){
case 'e':
cout << "rocket" << endl;
break;
case 'f':
cout << "fusee" << endl;
break;
case 's':
cout << "cohete" << endl;
break;
case 'x':
cout << "Ende" << endl;
system ("pause"); return 0;
default:
cout << "Falche Eingabe!" << endl;
}
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS09/10 Seite 6/11
2 Arrays (Felder)
2.1 Ein Programm verlangt die Eingabe von 6 reellen Zahlen, die alle positiv sein sollen. Falls der Benutzer eine negative Zahl eingibt, soll er die Möglichkeit haben, solange eine neue Zahl einzugeben, bis diese positiv ist. Hinweis: Die Zahlen werden komplett eingegeben, dann erfolgt die Überprüfung.Beispiel: Geben Sie 6 positive Zahlen ein: 2.4 2.3 7.5 -3.1 -1.0 6.7
Die 4.Zahl ist negativ (-3.1). Bitte erneut eingeben: -1.2Die 4.Zahl ist negativ (-1.2). Bitte erneut eingeben: 5.6Die 5.Zahl ist negativ (-1.0). Bitte erneut eingeben: 9.96 positive Zahlen eingegeben: 2.4 2.3 7.5 5.6 9.9 6.7 [11| ]
#include <iostream>
using namespace std;int main () { double x[6]; int i; cout << "Geben Sie 6 positive Zahlen ein: "; for (i=0; i<6; i++){ cin >> x[i];} for (i=0; i<6;i++){ while (x[i]<0){ cout << "Die " << i+1 << ". Zahl ist negativ (" <<
x[i]<<"). Bitte erneut eingeben: "; cin >> x[i]; } } cout << "6 positive Zahlen eingegeben: "; for (i=0; i<6;i++) cout << x[i] << " "; cout << endl; system ("pause"); return 0;}
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS09/10 Seite 7/11
2.2 Die Determinante einer Dreieckmatrix berechnet sich aus dem Produkt der Hauptdiagonalelemente. Schreiben Sie einen Programmteil mit Variablen-deklaration, der die Determinante einer 3x3-Matrix berechnet. Die Matrix wird zum Testen im Programm vorgegeben. Das Programm soll auch größere Matrizen verarbeiten können.
[5| ]
Beispiel: x=[1 8 −10 4 60 0 3 ] obere Dreieckmatrix
Determinante = 1 x 4 x 3 = 12;
double x[3][3]={1,8,-1,
0,4,6,
0,0,3},
det=1;
int i;
for (i=0;i<3;i++)
det = det * x[i][i];
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS09/10 Seite 8/11
2.3 Wie sieht ein Programmteil aus, der überprüft, ob es sich um eine obere Dreieckmatrix handelt? Gestalten Sie das Programm so, dass auch Matrizen mit mehr Zeilen und Spalten bearbeitet werden können. (Es soll nur überprüft werden, ob die Elemente unter der Hauptdiagonalen Null sind.) Falls es sich um keine obere Dreieckmatrix handelt, soll die boolsche Variable „dreieck“ auf „false“ gesetzt werden.
[6| ]
double x[3][3]={1,2,3,
0,4,5,
1,0,6},
int i,j;
bool dreieck = true;
for (i=1;i<3;i++)
for (j=0;j<i;j++)
if (x[i][j] != 0)
dreieck=false;
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS09/10 Seite 9/11
3 Unterprogramme (Functions)Erstellen Sie eine Function zur Berechnung der Nullstelle von f(x)=x7+x3-x-9; mit dem Newton-Raphson-Verfahren.Das Unterprogramm soll die Anzahl der Iterationen als Funktionswert und die Nullstelle als variablen Parameter an das aufrufende Programm zurückgeben. Eingabewerte sind der Startwert für die Iteration und die Genauigkeit (Anzahl der Nachkommastellen). Das Verfahren wird nach 1000 Iterationen abgebrochen, falls keine Nullstelle gefunden wurde.
Aufruf des Unterprogramms: iter = NewRaph (start, eps, x); iter: Anzahl der benötigten Iterationen = -99 (falls keine Nullstelle gefunden wurde) start: Startwert für die Iteration eps: Anzahl d. Dezimalstellen (z.B. 6), die
sich bei der Iteration nicht mehr ändern x: Nullstelle
Bsp: Bei start=1 und eps=6 ergibt sich eine Nullstelle bei 1.34389.
3.1 Wie muss der Prototyp aussehen? [4| ]
int NewRaph(double, int ,double &);
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS09/10 Seite 10/11
3.2 Erstellen Sie das Unterprogramm.[12| ]
#include <cmath>int NewRaph (double start, int eps, double &x){int iter=0;double xn,e,f,fs; e = pow(10.0,-eps); xn=start; do { x=xn; f=pow(x,7)+pow(x,3)-x-9; fs=7*pow(x,6)+3*x*x-1; xn = x - f/fs; iter++; }while (fabs(xn-x) > e && iter < 1000); if (iter == 1000) iter =-99;return iter;}
Hochschule Augsburg Fakultät für Maschinenbau Ingenieurinformatik WS09/10 Seite 11/11
3.3 Erstellen Sie ein Hauptprogramm zum Testen des Unterprogramms.[8| ]
int main () { int iter; double x; iter = NewRaph( 1, 6, x); if (iter != -99) cout << x << endl; else cout << "Keine Konvergenz!" << endl;system ("pause");return 0;}
3.4 Wie sieht der Prototyp aus, wenn statt der Nullstelle alle berechneten x-Werte beginnend mit dem Startwert an das aufrufende Programm zurückgegeben werden (max. 1000 Werte)? [2| ]
int NewRaph(double, int ,double []);
3.5 Ohne Beachtung von Aufgabe 3.4 soll das Programm mit nur 2 Parametern aufgerufen werden. Es müssen aber nach wie vor dieselben Parameter ins Unterprogramm gelangen und auch die bereits beschriebenen Parameter zurückgegeben werden. Ist dies möglich? Wenn ja, was hat es für Folgen? [4| ]
ist möglich: int NewRaph (int, double &);
Eingabe Startwert und
Ausgabe Nullstelle
Folge: Startwert kann nicht mehr als konstanter Wert
eingegeben werden.