Aufgabe 1
a) Schreiben Sie ein Programm, das eine Gleitkommazahl als Benutzereingabe einliest und die Quadratwurzel dieser Zahl ausgibt. Eingabeaufforderung: Geben Sie eine Gleitkommazahl >= 0 ein: Antwort des Programms (z.B. bei Eingabe von 9.7): Die Quadratwurzel von 9.7 ist 3.1145 Hinweis: Die C++ StdLib stellt über den Header cmath eine Schnittstelle zur Funktion double sqrt( double ) zur Verfügung, die Sie in Ihrem Programm verwenden sollten. Wählen Sie alle Ihre Namen nach der „Ungarischen Notation“.
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double dwurzel=0.0;
cout << "Geben Sie eine Gleitkommazahl >= 0 ein:";
cin >> dwurzel;
cout << "Die Quadratwurzel von " << dwurzel << " ist " << sqrt( dwurzel );
}
b) Schreiben Sie das Quadratwurzel Programm jetzt so, dass die Wurzelberechnung ohne den Einsatz von Bibliotheksfunktionen und nur mit dem Kontrollprimitiv Sequenz, ohne Selektions- und Iterationsprimitiv (d.h. ohne Schleifen und Verzweigungen) erfolgt. Hinweis: Die Quadratwurzel einer Zahl x0 lässt sich berechnen, indem sie als Grenzwert einer Folge gesehen wird: xn+1 = ( xn + a(xn)-1 ) 2-1 mit beliebigem Anfangswert a (z.B. a = x0). Für n= 0, 1, … konvergiert xn schnell gegen die Quadratwurzel von x0. In Ihrem Programm können Sie bei n = 8 abbrechen das Ergebnis ausgeben. Was bemerken Sie, wenn Sie die Quadratwurzel auf diese Art berechnen und weder Bibliotheksfunktion noch Selektions- und Iterationsprimitiv einsetzen?
#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
double wurzelberechnung (double dwurzel)
{
double danfangswert=dwurzel;
dwurzel=(dwurzel+(danfangswert/dwurzel))/2;
dwurzel=(dwurzel+(danfangswert/dwurzel))/2;
dwurzel=(dwurzel+(danfangswert/dwurzel))/2;
dwurzel=(dwurzel+(danfangswert/dwurzel))/2;
dwurzel=(dwurzel+(danfangswert/dwurzel))/2;
dwurzel=(dwurzel+(danfangswert/dwurzel))/2;
dwurzel=(dwurzel+(danfangswert/dwurzel))/2;
dwurzel=(dwurzel+(danfangswert/dwurzel))/2;
dwurzel=(dwurzel+(danfangswert/dwurzel))/2;
return dwurzel;
}
int main()
{
double dwurzel=0.0;
cout << "Geben Sie eine Gleitkommazahl >= 0 ein:";
cin >> dwurzel;
cout << "Die Quadratwurzel von " << dwurzel << " ist " << wurzelberechnung(dwurzel);
return 0;
}
c) Schreiben Sie das Quadratwurzel Programm nochmals ohne Bibliotheksfunktionen (Sie dürfen nur iostream für Ein- und Ausgabe verwenden), aber mit Selektions- und Iterationsprimitiven. Brechen Sie die Schleife ab, sobald eine frei wählbare Genauigkeit der Berechnung erreicht ist. Geben Sie die erzeilte Genauigkeit und einen Prüfwert aus.
#include <iostream>
using namespace std;
double wurzelberechnung(double dwurzel, int igenauigkeit)
{
double danfangswert = dwurzel;
for (int i = 0; i < igenauigkeit; i++)
{
dwurzel = (dwurzel + (danfangswert / dwurzel)) / 2;
}
return dwurzel;
}
int main() {
double dzahl = 0.0;
double dwurzel = 0.0;
int igenauigkeit = 1;
cout << "Geben Sie eine Gleitkommazahl >= 0 ein:";
cin >> dzahl;
cout << "Geben Sie eine Genauigkeit > 0 ein:";
cin >> igenauigkeit;
dwurzel = wurzelberechnung(dzahl, igenauigkeit);
cout << "Die Quadratwurzel von " << dzahl << " ist " << dwurzel << "\n";
cout << "Die Genauigkeit betraegt: " << igenauigkeit << "\n";
cout << "Der Prueftwert betraegt: " << dwurzel << "*" << dwurzel << "=" << (dwurzel * dwurzel) << "\n";
return 0;
}
d) Warum sollte man lieber die Bibliotheksfunktion verwenden? Gründe:
- Die Verwendung von Funktionen aus der Standardbibliothek ermöglichen den Einsatz des Programms auf jeglichem System
- Ergebnis ist durch Standardisierung der Bibliothek verfiziert (Fehlerfreiheit)
- Prinzip der Wiederverwendung
Aufgabe 2
a) Ändern Sie den Programmablaufplan (PAP) des ggT Programms (aus der Vorlesung / Hörsaalübung) so, dass der Programmablauf nach Abschluss der Berechnung und Ausgabe der Ergebnisse wieder zurückkehrt zur Eingabeaufforderung für die beiden Zahlen, und alles wieder von vorne losgeht.
b) Schreiben Sie das Programm nach dem von Ihnen geänderten PAP um.
#include <iostream>
using namespace std;
int main()
{
int i1 = 0, i2 = 0, tmp = 0, n = 1;
bool bflagend = false;
while (bflagend == false) {
cout << "Zwei positive ganze Zahlen eingeben: "; cin >> i1 >> i2;
while (i1 != i2) {
cout << "\t(" << i1 << "," << i2 << ")" << endl;
if (i1 < i2) i2 = i2 - i1;
else {
tmp = i1;
i1 = i2;
i2 = tmp - i1;
}
++n;
}
cout << "\t(" << i1 << "," << i2 << ")" << endl;
cout << n << " Schritte zum ggT\n" << endl;
}
}
Aufgabe 3
Schreiben Sie ein Programm, das einen Operator und zwei Operanden einliest, die gewünschte Operation durchführt und das Ergebnis anzeigt, zum Beispiel: $> Operation: + 34.5 99 $> Operation: * 3 8.2 $> Ergebnis: 133.5 $> Ergebnis: 24.6 Berücksichtigen Sie die Operatoren +, -, * und / mit den offensichtlichen Bedeutungen. Lesen Sie den Operator in eine string-Variable und die Operanden in double-Variablen. Stellen Sie mittels if fest, welche Operation ausgeführt werden soll, z.B.: if(str_opSym= =“+“).
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
double doperand1 = 0.0, doperand2 = 0.0;
string soperator = "+";
cout << "Bitte zwei Operatoren und einen Operand eingeben:\n";
cout << "Summe a+b mit '+', Differenz a-b mit '-', Produkt a*b mit '*' und Quotient a/b mit '/':\n"; cin >> doperand1 >> doperand2 >> soperator;
if (soperator == "+")
{
cout << "Summe aus " << doperand1 << "+" << doperand2 << "=" << doperand1 + doperand2;
}
else
{
if (soperator == "-")
{
cout << "Differenz aus " << doperand1 << "-" << doperand2 << "=" << doperand1 - doperand2;
}
else
{
if (soperator == "*")
{
cout << "Produkt aus " << doperand1 << "*" << doperand2 << "=" << doperand1 * doperand2;
}
else
{
if (soperator == "/")
{
if (doperand2 != 0.0)
{
cout << "Quotient aus " << doperand1 << "/" << doperand2 << "=" << doperand1 / doperand2;
}
else
{
cout << "Division durch 0 nicht erlaubt.";
}
}
else
{
cout << "Kein gueltiger Operator eingegeben.";
}
}
}
}
}
Aufgabe 4
Der Median einer Zahlenreihe ist definiert als die Zahl, bei der höchstens die Hälfte der Zahlen aus der Zahlenreihe größer und höchstens die Hälfte der Zahlen aus der Zahlenreihe kleiner ist. Ändern Sie den Programmteil zur Berechnung des Medians aus dem Vorlesungsbeispiel so, dass der Median korrekt berechnet wird. Hinweis: Bei einer geraden Anzahl von Beobachtungen gibt es kein einziges mittleres Element, sondern zwei. Verwenden Sie für eine gerade Anzahl von Temperaturwerten das arithmetische Mittel der beiden mittleren Beobachtungswerte.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main( )
{
vector vTemps; // Temperaturwerte
double temp;
double dmedian=0.0;
while( cin >> temp ) // einlesen /*&& temp != -274*/
{
vTemps.push_back( temp ); // speichern
}
// arithm. Mittel
double sum = 0;
for( int i=0; i {
sum += vTemps[i];
}
cout << "Temperaturmittel: " << sum/vTemps.size() << endl; // Mittelwert aller Elemente im Vektor vTemps ausgeben sort( vTemps.begin(), vTemps.end() ); // sortieren mit Funktion aus StdLib, Header algorithm if (vTemps.size() % 2 > 0)
{
dmedian = vTemps[ vTemps.size()/2 ];
}
else
{
dmedian = (vTemps[ vTemps.size()/2 -1] + vTemps[ vTemps.size()/2 ])/2;
}
cout << "Median: " << dmedian << endl;
}
Aufgabe 5
a) Richten Sie einen vector ein, der die zehn Zeichenketten „null“, „eins“, „zwei“, „drei“, usw. bis „neun“ enthält. Verwenden Sie diesen in einem Programm, das für eine einzulesende Ziffer ihren entsprechenden ausgeschriebenen Wert ausgibt.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int ipointer=0;
vector vZahlen(10);
vZahlen[0]="null";
vZahlen[1]="eins";
vZahlen[2]="zwei";
vZahlen[3]="drei";
vZahlen[4]="vier";
vZahlen[5]="fünf";
vZahlen[6]="sechs";
vZahlen[7]="sieben";
vZahlen[8]="acht";
vZahlen[9]="neun";
cout << "Bitte Ziffer eingeben:"; cin >> ipointer;
cout << vZahlen [ ipointer ];
}
b) Erweitern Sie das Programm so, dass auch ausgeschriebene Ziffern wie „sieben“ als Eingabe möglich sind, und das Programm dann die Ziffer aus der entsprechenden Zahl – oder, je nach Eingabe, die ausgeschriebene Zahl aus der Ziffer – ausgibt.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void vektorsuche(int izahl)
{
vector vZahlen(10);
vZahlen[0] = "null";
vZahlen[1] = "eins";
vZahlen[2] = "zwei";
vZahlen[3] = "drei";
vZahlen[4] = "vier";
vZahlen[5] = "fünf";
vZahlen[6] = "sechs";
vZahlen[7] = "sieben";
vZahlen[8] = "acht";
vZahlen[9] = "neun";
if (izahl > 0 && izahl < 10)
{
cout << "Die gesuchte Zahl lautet: " << vZahlen[izahl];
}
else
{
cout << "Die gesuchte Zahl wurde nicht gefunden.";
}
}
int vektorsuche(string szahl)
{
vector vZahlen(10);
vZahlen[0] = "null";
vZahlen[1] = "eins";
vZahlen[2] = "zwei";
vZahlen[3] = "drei";
vZahlen[4] = "vier";
vZahlen[5] = "fünf";
vZahlen[6] = "sechs";
vZahlen[7] = "sieben";
vZahlen[8] = "acht";
vZahlen[9] = "neun";
for (int i = 0; i < 10; i++)
{
if (vZahlen[i] == szahl)
{
cout << "Die gesuchte Zahl lautet " << i;
return 0;
}
}
cout << "Die gesuchte Zahl wurde nicht gefunden.";
}
int main()
{
int izahl = 0;
string szahl = "<>";
cin >> izahl;
if (cin)
{
vektorsuche(izahl);
}
else
{
if (!cin)
{
cin.clear();
cin >> szahl;
vektorsuche(szahl);
}
}
return 0;
}
Aufgabe 6
Schreiben Sie ein Programm, das zuerst eine Reihe von Name-Wert Paaren der Form Barbara 22 oder Ben 17 einliest. Legen Sie von jedem Paar den Namen in einem vector namens vNames ab und den Wert in einem vector namens vScores, wobei die Positionen gleich sein sollen (d.h. wenn vNames[7]==Barbara dann auch vScores[7]==22). Beenden Sie die Eingabe durch noname 0. Stellen Sie sicher, dass jeder Name nur einmal vorkommt und beenden Sie das Programm mit einer informativen Fehlermeldung, wenn ein Name ein zweites Mal eingegeben wird. Geben sie die (Name, Punkte)-Paare zeilenweise aus.
#include <vector>
#include <iostream>
using namespace std;
int main() {
string stmp = "<>";
int itmp = 0;
vector vNames;
vector vScores;
while (cin >> stmp >> itmp && (stmp != "noname" || itmp != 0))
{
for (int i = 0; i < vNames.size(); i++)
{
if (vNames[i] == stmp)
{
cerr << "Achtung, es wurde ein Name doppelt eingegeben.\n\"" << stmp << "\" ist schon einmal vorhanden.\nProgramm wird nun beendet.\n";
return 1;
}
}
vScores.push_back(itmp);
vNames.push_back(stmp);
}
cout << "Folgende Daten wurden einegegeben:\n";
for (int i = 0; i < vNames.size(); i++)
{
cout << vNames[i] << ", " << vScores[i] << "\n";
}
return 0;
}
Aufgabe 7 (optional)
Ändern Sie das einfache Wörterbuch Programm aus der Vorlesung so, dass bei mehrfach gleichen Wörtern nicht nur die Ausgabe unterdrückt wird, sondern dass das einfache Wörterbuch jedes Wort nur einmal speichert und Duplikate eliminiert. Das Programm soll zusätzlich auch die Anzahl der Wörter insgesamt sowie die Anzahl der gefundenen Duplikate ausgeben. Versuchen Sie (wie immer, aber hier ganz besonders), eine möglichst elegante und klare Lösung zu finden.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector vWords;
string temp;
bool bdoppler = false;
int icounter = 0;
while (cin >> temp && temp != "quit")
{
for (int i = 0; i < vWords.size(); ++i)
{
if (temp == vWords[i])
{
bdoppler = true;
icounter = icounter + 1;
}
}
if (bdoppler == false)
{
vWords.push_back(temp);
}
bdoppler = false;
}
cout << "Anzahl der Woerter: " << vWords.size() << endl;
cout << "Anzahl der gefundenen Duplikate: " << icounter << endl;
sort(vWords.begin(), vWords.end());
for (int i = 0; i < vWords.size(); ++i)
{
cout << vWords[i] << endl;
}
}