Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ......

138
Skript Skript zur Vorlesung Prof. Dipl.-Ing. Ulrich Thalhofer Ingenieurinformatik Grundlagen der Programmierung in C++ WS10/11 Prof. Dipl.-Ing. Ulrich Thalhofer Telefon +49 821 55 86-3159 Fax +49 821 55 86-3160 [email protected]

Transcript of Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ......

Page 1: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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]

Page 2: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen
Page 3: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 4: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

→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

Page 5: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 6: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 7: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 8: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 9: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 10: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 11: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

Ü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

Page 12: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 13: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 14: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 15: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 16: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 17: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

Ü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

Page 18: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 19: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 20: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 21: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 22: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 23: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

Ü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−±−=

Page 24: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 25: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 26: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 27: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 28: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 29: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 30: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 31: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 32: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

// 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

Page 33: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 34: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

Ü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

Page 35: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 36: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 37: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 38: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

)(

Page 39: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 40: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 41: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 42: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 43: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 44: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 45: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

Ü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

Page 46: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 47: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

#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

Page 48: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 49: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 50: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 51: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

// 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

Page 52: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 53: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 54: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 55: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 56: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 57: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 58: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 59: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 60: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 61: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 62: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 63: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

} 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

Page 64: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

Ü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)

Page 65: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

Ü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

Page 66: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

Ü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

Page 67: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

Ü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

Page 68: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

Ü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

Page 69: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

Ü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

Page 70: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

Ü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

Page 71: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

Ü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.

Page 72: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

Ü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

Page 73: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

Ü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.

Page 74: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

Ü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,

Page 75: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

Ü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)

Page 76: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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| ]

Page 77: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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| ]

Page 78: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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++;}

Page 79: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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| ]

Page 80: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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| ]

Page 81: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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| ]

Page 82: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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.

Page 83: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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| ]

Page 84: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;}

Page 85: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 86: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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 .....

Page 87: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 88: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;

Page 89: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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; }

Page 90: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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; }

Page 91: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;

}

}

Page 92: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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; }

Page 93: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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; }

Page 94: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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; }

Page 95: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 96: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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);

Page 97: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 98: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 99: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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| ]

Page 100: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;}

Page 101: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;}

Page 102: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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);}

Page 103: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;

}

}

Page 104: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;}

Page 105: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;}

Page 106: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;}

Page 107: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;

Page 108: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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| ]

< <=

> >=

== !=

Page 109: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 110: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;

Page 111: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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'

Page 112: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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];}

Page 113: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;

Page 114: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;}

Page 115: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;}

Page 116: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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; }

Page 117: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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!

Page 118: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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; }

Page 119: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 120: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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

Page 121: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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| ]

+ - * / %

Page 122: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;}

Page 123: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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);

Page 124: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;}

Page 125: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;

}

Page 126: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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; }

Page 127: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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; }

Page 128: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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')

Page 129: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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-

Page 130: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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!)

Page 131: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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);

Page 132: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;

}

Page 133: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;}

Page 134: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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];

Page 135: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;

Page 136: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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 &);

Page 137: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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;}

Page 138: Skript - hs-augsburg.dethalhof/downloads/iniskript.pdf · Skript zur Vorlesung Prof. Dipl.-Ing. ... die in 2 Sekunden ebenso viele Fehler machen kann wie ... (Entwurf von Datenstrukturen

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.