<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>1. Semester (B. Sc.) Archive - Maximilian Krieg</title>
	<atom:link href="https://maximiliankrieg.de/category/studium/bachelor-of-science/1-semester-b-sc/feed/" rel="self" type="application/rss+xml" />
	<link>https://maximiliankrieg.de/category/studium/bachelor-of-science/1-semester-b-sc/</link>
	<description>Wissen, Technik &#38; Erfahrungen</description>
	<lastBuildDate>Tue, 10 Mar 2026 00:04:35 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://maximiliankrieg.de/wp-content/uploads/2026/05/cropped-20260524_logo_2_512-2-32x32.png</url>
	<title>1. Semester (B. Sc.) Archive - Maximilian Krieg</title>
	<link>https://maximiliankrieg.de/category/studium/bachelor-of-science/1-semester-b-sc/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Programmieren, Algorithmen und Datenstrukturen 1 (Probeklausur)</title>
		<link>https://maximiliankrieg.de/2012/04/programmieren-algorithmen-und-datenstrukturen-1-probeklausur/</link>
					<comments>https://maximiliankrieg.de/2012/04/programmieren-algorithmen-und-datenstrukturen-1-probeklausur/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Mon, 02 Apr 2012 05:14:00 +0000</pubDate>
				<category><![CDATA[Programmieren 1]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1521</guid>

					<description><![CDATA[<p>Aufgabe 0 Legen Sie ein Arbeitsverzeichnis Name_Vorname.Matrikelnumer an. Legen Sie darin ein neues C++ Projekt&#160;LiwanzenVZ&#160;an. Aufgabe 1 a)&#160;Deklarieren Sie zunächst Folgendes, und definieren Sie es&#8230;</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/04/programmieren-algorithmen-und-datenstrukturen-1-probeklausur/">Programmieren, Algorithmen und Datenstrukturen 1 (Probeklausur)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">Aufgabe 0</h3>



<p class="wp-block-paragraph">Legen Sie ein Arbeitsverzeichnis Name_Vorname.Matrikelnumer an. Legen Sie darin ein neues C++ Projekt&nbsp;<strong>LiwanzenVZ</strong>&nbsp;an.</p>



<h3 class="wp-block-heading">Aufgabe 1</h3>



<p class="wp-block-paragraph"><strong>a)&nbsp;</strong>Deklarieren Sie zunächst Folgendes, und definieren Sie es danach. &nbsp;<strong>Region</strong>&nbsp;ist ein Enumerator (ndef, amer, apac, emea ), der auch Klassenmember ist. Der Einfachheit halber muss jedes Mitglied des sozialen Netzwerks LiwanzenVZ einen eindeutigen Namen habe.&nbsp;<strong>b)&nbsp;</strong>Auf der Grundlage von 1a) – aber für die Implementierung nicht unbedingt darauf beschränkt – entwickeln Sie nun die folgenden Funktionalitäten aus main :</p>



<p class="wp-block-paragraph"><strong>i.&nbsp;</strong>Legen Sie ein geeignetes Objekt namens vL für die Speicherung von beliebig vielen LiwanzenVZ-Mitgliedern an und füllen Sie es im Quellcode über eine Supportfunktion namens populate mit sechs Mitgliedern:</p>



<p class="wp-block-paragraph"><em>Joey (amer), Johnny (amer), DeeDee (amer), Tommy (emea), Suzy (apac) und Sheena (amer).</em></p>



<p class="wp-block-paragraph">Geben Sie mittels einer weiteren Supportfunktion namens&nbsp;<strong>print_LVZMembers</strong>&nbsp;eine komplette Liste mit allen gespeicherten Mitgliedern und ihren Details möglichst benutzerfreundlich zeilenweise aus (d.h. beispielsweise auch, dass Region nicht als Zahl erscheint).</p>



<p class="wp-block-paragraph"><strong>ii.&nbsp;</strong>Lassen Sie den Benutzer mittels einer Supportfunktion namens add_Liwanze beliebig viele weitere Mitglieder hinzufügen, wobei jeder Name in der Liste eindeutig sein muss. Lassen Sie zur Vereinfachung keine Eingaben für die Region zu, die Sie hier immer auf&nbsp;<strong>ndef</strong>&nbsp;setzen. Die Eingabe eines bereits vorhandenen Namens wird abgelehnt, eine sinnvolle Meldung wird ausgegeben und das Programm fordert den Benutzer erneut zur Eingabe auf. Bei sonstigen Eingabefehlern werfen Sie eine Ausnahme, die zum Programmabbruch mit Fehlermeldung führt.</p>



<p class="wp-block-paragraph">Nach jeder geglückten Registrierung einer neuen &#8222;Liwanze&#8220; wird eine komplette Liste mit allen Mitgliedern und deren Details im LiwanzenVZ möglichst benutzerfreundlich ausgegeben. Durch Eingabe von&nbsp;<strong>q</strong>&nbsp;wird die Registrierung&nbsp;weiterer Mitglieder beendet.</p>



<h3 class="wp-block-heading">Aufgabe 2</h3>



<p class="wp-block-paragraph"><strong>a)&nbsp;</strong>Erweitern Sie nun die Lösung aus Aufgabe 1 wie folgt: &nbsp;Die Methode&nbsp;<strong>connects</strong>&nbsp;überprüft, ob es zu der Liwanze im Zeigerargument eine direkte Verbindung<em>&nbsp;(im sog.&nbsp;<strong>&#8222;tier one&#8220;</strong>)</em>&nbsp;gibt. Die Methode&nbsp;<strong>connected</strong>&nbsp;überprüft, ob es von der Liwanze<em>&nbsp;(im Zeigerargument)</em>&nbsp;eine direkte Verbindung<em>&nbsp;(im sog.<strong>&nbsp;&#8222;tier one&#8220;</strong>)</em>&nbsp;gibt. Vergessen Sie nicht, ggf. auch Ihre bisherigen Programmteile anzupassen.&nbsp;<strong>b)</strong>&nbsp;Auf der Grundlage von 2a) – aber für die Implementierung nicht darauf beschränkt – entwickeln Sie Ihr Programm nun wie folgt weiter:</p>



<p class="wp-block-paragraph"><strong>i.</strong>&nbsp;Vernetzen Sie im Quellcode die sechs ursprünglich registrierten Mitglieder über eine Supportfunktion namens&nbsp;<strong>init_connections</strong>&nbsp;wie folgt:</p>



<p class="wp-block-paragraph">Lösen Sie dies mit einer Methode namens&nbsp;<strong>make_connection</strong>, die aus&nbsp;<strong>init_connections</strong>&nbsp;aufgerufen wird; setzen Sie&nbsp;<strong>make_connection</strong>&nbsp;auch im nächsten Aufgabenteil 2 b) ii. ein. Geben Sie durch geeignete Supportfunktionen / Methoden das Netzwerk komplett&nbsp;und so übersichtlich und benutzerfreundlich wie möglich aus.</p>



<p class="wp-block-paragraph"><strong>ii.</strong>&nbsp;Lassen Sie den Benutzer das Netzwerk beliebig durch Eingabe von zwei unterschiedlichen Mitgliedernamen erweitern – es wird dann vom zuerst eingegebenen Name zu dem zweiten eingegebenen Namen eine Verbindung gewünscht. Ist mindestens einer der beiden Namen nicht registriert, wird dies mit&nbsp;einer sinnvollen Meldung abgefangen und erneut zur Eingabe zweier Namen aufgefordert<em>&nbsp;(bei sonstigen Eingabefehlern wird eine Ausnahme geworfen, die zu einer Fehlermeldung und zum Programmabbruch führt)</em>.</p>



<p class="wp-block-paragraph">Ist die Verbindung bereits vorhanden, wird eine informative Meldung angezeigt und es wird erneut zur Eingabe zweier Namen aufgefordert. Ist die Verbindung noch nicht vorhanden, wird sie erstellt, es wird eine Erfolgsmeldung ausgegeben und wiederum zur Eingabe zweier Namen aufgefordert.</p>



<p class="wp-block-paragraph">Stellen Sie sicher, dass jede Verbindung konsistent unter beiden Namen entsprechend abgespeichert wird, werfen Sie bei Verletzung dieser Konsistenz unbedingt eine Ausnahme, die zu einer Fehlermeldung mit Programmabbruch führt.</p>



<p class="wp-block-paragraph">Nach jeder geglückten Erweiterung wird das vollständige Tier-One-Netzwerk<em>&nbsp;(d.h. alle direkten Beziehungen)</em>&nbsp;des ersten Namens und des zweiten Namens, mit allen Details&nbsp;<em>(einschließlich der Anzahlen der jeweils ein- und ausgehenden Beziehungen)</em>&nbsp;möglichst benutzerfreundlich angezeigt.</p>



<p class="wp-block-paragraph">Durch Eingabe von<strong>&nbsp;q</strong>&nbsp;wird die Erweiterung des Netzwerks<em>&nbsp;(und damit das Programm)</em>&nbsp;schließlich beendet.</p>



<h4 class="wp-block-heading">Error.h</h4>



<pre class="wp-block-code"><code>
#ifndef ERROR_H
#define	ERROR_H

#include
#include

using std::string;
using std::runtime_error;

void error (string s)
{throw runtime_error(s);}

void error (string s1, string s2)
{error(s1+s2);}
#endif	/* ERROR_H */
</code></pre>



<h4 class="wp-block-heading">LiwanzenVZ.cpp</h4>



<pre class="wp-block-code"><code>
#include "LiwanzenVZ.h"
using namespace std;

Liwanze::Liwanze() :
name(""), loc(ndef)
{}

Liwanze::Liwanze(string sname, Region location) :
name(sname), loc(location)
{}

string Liwanze::get_name() const
{return name;}

Liwanze::Region Liwanze::get_loc()const
{return loc;}

void Liwanze::print() const
{
    cout &lt;&lt; "Name:\t" &lt;&lt; name &lt;&lt; endl;
    if (loc==ndef) cout &lt;&lt; "Region:\t\t" &lt;&lt; "Nicht definiert" &lt;&lt; endl;
    if (loc==amer) cout &lt;&lt; "Region:\t\t" &lt;&lt; "Americas" &lt;&lt; endl;
    if (loc==apac) cout &lt;&lt; "Region:\t\t" &lt;&lt; "Asia-Pacific" &lt;&lt; endl;
    if (loc==emea) cout &lt;&lt; "Region:\t\t" &lt;&lt; "Europe, Middle East, Africa" &lt;&lt; endl;
}

void populate(vector&amp; vL) {
    vL.push_back(Liwanze("Joey", Liwanze::amer));
    vL.push_back(Liwanze("Johnny", Liwanze::amer));
    vL.push_back(Liwanze("DeeDee", Liwanze::amer));
    vL.push_back(Liwanze("Tommy", Liwanze::emea));
    vL.push_back(Liwanze("Suzy", Liwanze::apac));
    vL.push_back(Liwanze("Sheena", Liwanze::amer));
}

void print_LVZMembers(const vector&amp; vL)
{
    for (int i = 0; i &lt; vL.size(); i++) {
        cout &lt;&lt; i+1 &lt;&lt; ". ";
        vL&#91;i].print();
        vL&#91;i].print_tierone();
        cout &lt;&lt; "\n";
    }

}

void add_Liwanze(vector&amp; vL, string sname)
{
    if (b_check_ok(vL, sname)==true)
    {vL.push_back(Liwanze(sname, Liwanze::ndef));}
    else
    {
        while (b_check_ok(vL, sname)==false)
        {
            cout &lt;&lt; "Benutzer bereits vorhanden.";
            cout &lt;&lt; "Bitte geben Sie einen gültigen Namen ein:";             cin &gt;&gt; sname;
        }
        vL.push_back(Liwanze(sname, Liwanze::ndef));
    }
}

bool b_check_ok(const vector&amp; vL, string sname)
{
    for (int i=0; i    {
        if (vL&#91;i].get_name()==sname){return false;}
    }
    return true;
}

bool Liwanze::connects(Liwanze* a) const
{
    for (int i=0; iget_name()==connectsTo&#91;i]) return true;
    }
    return false;
}

bool Liwanze::connected(Liwanze* a) const
{
    for (int i=0; iget_name()==connectedFrom&#91;i]) return true;
    }
    return false;
}

void Liwanze::print_tierone() const
{
    int i=0;
    int j=0;
    cout &lt;&lt; "Connects to:\t";
    for (i=0; i    {
        if (i        {cout &lt;&lt; connectsTo&#91;i] &lt;&lt; ", ";}
        else
        {
            cout &lt;&lt; connectsTo&#91;i];
        }

    }
    cout &lt;&lt;  "\n";

    cout &lt;&lt; "Connected from:\t";
    for (j=0; i    {
        if (i        {cout &lt;        else
        {
            cout &lt;&lt; connectedFrom&#91;i];
        }
    }
    cout &lt;&lt; "\nAusgehend:" &lt;&lt; i &lt;&lt; endl;
    cout &lt;&lt; "Eingehend:" &lt;&lt; j &lt;&lt; endl;
    cout &lt;&lt;  "\n"; } void Liwanze::add_connTo(Liwanze* a) {     if (this-&gt;connects(a))
    {
        cerr &lt;&lt; "Verbindung besteht bereits" &lt;&lt; endl;     }     else     {         connectsTo.push_back(a-&gt;get_name());
    }

}

void Liwanze::add_connFrom(Liwanze* a)
{
    if (this-&gt;connected(a))
    {
        cerr &lt;&lt; "Verbindung besteht bereits" &lt;&lt; endl;     }     else     {         connectedFrom.push_back(a-&gt;get_name());
    }
}

void Liwanze::make_connection(string sTo, vector&amp; vL)
{
    Liwanze* To=0;
    for (int i=0; iconnects(To)==false &amp;&amp; To-&gt;connected(this)==false)
            {
                this-&gt;add_connTo(To);
                To-&gt;add_connFrom(this);

                if (this-&gt;connects(To)==true &amp;&amp; To-&gt;connected(this)==true)
                {
                    cout &lt;&lt; "Verbindung erfolgreich hergestellt.\n";
                    cout &lt;&lt; "\n" &lt;&lt; this-&gt;get_name() &lt;&lt; " \n";                     this-&gt;print_tierone();
                    cout &lt;&lt; "\n" &lt;&lt; To-&gt;get_name() &lt;&lt; " \n";                     To-&gt;print_tierone();
                    return;

                }
                else
                {

                   error("Inkonsitente Daten");
                }
            }
            else
            {
                cerr &lt;&lt; "Verbindung besteht bereits." &lt;&lt; endl;
                return;
            }

        }
        if (i==vL.size()-1)
        {
            cout &lt;&lt; "2. Benutzer " &lt;&lt; sTo &lt;&lt; " konnte nicht gefunden werden. Bitte Namen erneut eingeben: \n";             cin &gt;&gt; sTo;
            i=-1;
        }

    }

}

void connect_2(vector&amp; vL)
{
    string sa="&lt;&gt;";
    string sb="&lt;&gt;";

    cout &lt;&lt; "\nVon Mitglied 1:";     cin &gt;&gt; sa;
    cout &lt;&lt; "Zu Mitglied 2:";     cin &gt;&gt; sb;

    for (int i=0; i    {
        if (vL&#91;i].get_name()==sa)
        {
             vL&#91;i].make_connection(sb, vL);
             return;
        }
        if (i==vL.size()-1)
        {
            cout &lt;&lt; "1. Benutzer " &lt;&lt; sa &lt;&lt; " konnte nicht gefunden werden. Bitte Namen erneut eingeben: \n";             cin &gt;&gt; sa;
            i=-1;
        }
    }

}

void init_connections(vector&amp; vL)
{
    for (int i=0; i    {
        if (vL&#91;i].get_name()=="Joey")
        {
            vL&#91;i].make_connection("Johnny", vL);
            vL&#91;i].make_connection("DeeDee", vL);
            vL&#91;i].make_connection("Suzy", vL);
            vL&#91;i].make_connection("Sheena", vL);
        }

        if (vL&#91;i].get_name()=="Johnny")
        {
            vL&#91;i].make_connection("Joey", vL);
            vL&#91;i].make_connection("Suzy", vL);
        }

        if (vL&#91;i].get_name()=="DeeDee")
        {vL&#91;i].make_connection("Suzy", vL);}

        if (vL&#91;i].get_name()=="Tommy")
        {vL&#91;i].make_connection("Suzy", vL);}

        if (vL&#91;i].get_name()=="Sheena")
        {vL&#91;i].make_connection("Joey", vL);
        }
    }
}</code></pre>



<h4 class="wp-block-heading">Main.cpp</h4>



<pre class="wp-block-code"><code>
#include "error.h"
#include "LiwanzenVZ.h"
using namespace std;

int main() {
    try{

    string sname = "";
    char cend = 'a';
    vector  vL;

    populate(vL);
    init_connections(vL);
    print_LVZMembers(vL);
    cout &lt;&lt; "\n";

    while (cend != 'q' &amp;&amp; cend!='Q')
    {
        cout &lt;&lt; "Möchten Sie ein neues Mitglied hinzufügen? (C) Continue, (Q) Quit." &lt;&lt; endl;         cin &gt;&gt; cend;
        if (cend=='c' || cend=='C')
        {
                cout &lt;&lt; "Name des neuen Mitglieds:";                 if (cin &gt;&gt; sname)
                {
                        add_Liwanze(vL, sname);
                        print_LVZMembers(vL);
                        cout &lt;&lt; "\n";
                }
        }
        else
        {
            if (cend=='q' || cend=='Q'){}
            else{error("Ungültige Eingabe");}
        }
    }
    while (1!=0)
    {
        cout &lt;&lt; "\nZwei Mitglieder miteinander verbinden:";
        connect_2(vL);
    }
    print_LVZMembers(vL);
    return 0;
    }
    catch (exception &amp;e)
    {cerr &lt;&lt; e.what();}
    catch (...)
    {cerr &lt;&lt; "Unbekannter Fehler";}
}
</code></pre>



<h4 class="wp-block-heading">LiwanzenVZ.h</h4>



<pre class="wp-block-code"><code>
#include
#include
using namespace std;

#ifndef LIWANZENVZ_H
#define	LIWANZENVZ_H

class Liwanze;

void populate(vector&amp;);
void print_LVZMembers(const vector&amp;);
void add_Liwanze(vector&amp;, string);
bool b_check_ok(const vector&amp;, string);
void init_connections(vector&amp;);
void add_2(vector&amp;);
void connect_2(vector&amp;);
void error (string);
void error (string, string);

class Liwanze{
public:
    enum Region{ndef, amer, apac, emea};
    Liwanze();
    Liwanze( string, Region );
    string get_name() const;
    Region get_loc() const;
    void print() const;
    bool connects(Liwanze*) const;
    bool connected(Liwanze*) const;
    void print_tierone() const;
    void add_connTo(Liwanze*);
    void add_connFrom(Liwanze*);
    void make_connection(string, vector&amp;);

private:
    string name;
    Region loc;
    vector connectsTo;
    vector connectedFrom;
};
#endif	/* LIWANZENVZ_H */</code></pre>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/04/programmieren-algorithmen-und-datenstrukturen-1-probeklausur/">Programmieren, Algorithmen und Datenstrukturen 1 (Probeklausur)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2012/04/programmieren-algorithmen-und-datenstrukturen-1-probeklausur/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Programmieren, Algorithmen und Datenstrukturen 1 (Praktikum 3)</title>
		<link>https://maximiliankrieg.de/2012/02/programmieren-algorithmen-und-datenstrukturen-1-praktikum-3/</link>
					<comments>https://maximiliankrieg.de/2012/02/programmieren-algorithmen-und-datenstrukturen-1-praktikum-3/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Sun, 05 Feb 2012 06:20:00 +0000</pubDate>
				<category><![CDATA[Programmieren 1]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1527</guid>

					<description><![CDATA[<p>Aufgabe 1 a)&#160;Kehren Sie zum ggT Programm (aus Grundlagen, Teil 2) zurück. Überarbeiten Sie das Programm so, dass es mittels C++ Ausnahmen mögliche Fehler abfängt.&#8230;</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/02/programmieren-algorithmen-und-datenstrukturen-1-praktikum-3/">Programmieren, Algorithmen und Datenstrukturen 1 (Praktikum 3)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">Aufgabe 1</h3>



<p class="wp-block-paragraph"><strong>a)</strong>&nbsp;Kehren Sie zum ggT Programm (aus Grundlagen, Teil 2) zurück. Überarbeiten Sie das Programm so, dass es mittels C++ Ausnahmen mögliche Fehler abfängt. Nach dem Abfangen eines Fehlers soll das Programm eine vernünftige Fehlermeldung ausgeben und sich beenden.</p>



<pre class="wp-block-code"><code>#include "MEIN_EIGENER_HEADER.h"
// Einbinden der eigenen Header-Datei
using namespace std;

int main() {
try {
	bool bend = false;
	int i1 = 0, i2 = 0, tmp = 0, n = 1;

	while (bend == false)
	{
		cout &lt;&lt; "Zwei positive ganze Zahlen eingeben: "; 		if (cin &gt;&gt; i1) // Wenn der eingelesene Wert in i1 gespeichert werden kann,
		{
			if (cin &gt;&gt; i2) // Wenn der eingelesene Wert in i2 gespeichert  werden kann,
			{
				if (i1 &gt; 0 &amp;&amp; i2 &gt; 0) // Wenn i1 größer als 0 und i2 größer als 0
				{
					while (i1 != i2) // Solange i1 ungleich i2
					{
						cout &lt;&lt; "\t(" &lt;&lt; i1 &lt;&lt; "," &lt;&lt; i2 &lt;&lt; ")" &lt;&lt; endl;
						if (i1 &lt; i2) // Wenn i1 kleiner als i2
						{
							i2 = i2 - i1;
						}
						else
						{
							tmp = i1;
							i1 = i2;
							i2 = tmp - i1;
						}
						++n;
					} // Ende von while

					cout &lt;&lt; "\t(" &lt;&lt; i1 &lt;&lt; "," &lt;&lt; i2 &lt;&lt; ")" &lt;&lt; endl;
					cout &lt;&lt; n &lt;&lt; " Schritte zum ggT\n" &lt;&lt; endl;

				}
				else
				{
					error("i1 und i2 muessen positiv sein.");
				}
			}
			else // Wenn der eingelesene Wert nicht in i2 gespeichert werden kann
			{
			error("i2 ist keine ganze Zahl.");
			}
		}
		else // Wenn der eingelesene Wert nicht in i1 gespeichert werden kann
		{
			error("i1 ist keine ganze Zahl.");
		}
	} // Ende von while
}

catch (exception &amp;e)
{
	cerr &lt;&lt; e.what();
}

catch (...) // Fängt alle anderen Ausnahmefehler ab
{
	cerr &lt;&lt; "Fehler unbekannt.";
}
}</code></pre>



<p class="wp-block-paragraph"><strong>b)</strong>&nbsp;Kehren Sie zum Ziffer/Zeichenketten Programm – Aufgabe 6 aus dem 2. Praktikumsblatt – zurück. Überarbeiten Sie auch dieses Programm entsprechend der obigen Aufgabenstellung a).</p>



<pre class="wp-block-code"><code>#include
#include "MEIN_EIGENER_HEADER.h"
using namespace std;

int main() {
try {
	string stmp = "&lt;&gt;";
	int itmp = 0;
	vector vNames;
	vector vScores;

	while (cin &gt;&gt; stmp &gt;&gt; itmp &amp;&amp; (stmp != "noname" || itmp != 0)) // Solange die Eingabe in stmp, itmp gespeichert werden kann und stmp ungleich noname und itmp ungleich 0 ist
	{
		for (int i = 0; i &lt; vNames.size(); i++) // Prüfen, ob ein Name bereits eingegeben wurde
		{
			if (vNames&#91;i] == stmp)
			{
				error("Achtung, es wurde ein Name doppelt eingegeben.\n\"" + stmp + "\" ist schon einmal vorhanden.\nProgramm wird nun beendet.\n");
				return 1;
			}
		}

		vScores.push_back(itmp); // Speichern des eingelesenen Wertes itmp im  Vektor vScores
		vNames.push_back(stmp);	// Speichern des eingelesenen Wertes stmp im  Vektor vNames
	}
	if (cin.fail()) // Wenn die Eingabe fehlschlägt
	{
		error("Fehlerhafte Eingabe. Der erste Begriff muss ein Name, der zweite Begriff eine Zahl, sein.");
	}
	else // Ansonsten Ausgabe der Daten
	{
		cout &lt;&lt; "Folgende Daten wurden einegegeben:\n" &lt;&lt; endl;

		for (int i = 0; i &lt; vNames.size(); i++)
		{
			cout &lt;&lt; vNames&#91;i] &lt;&lt; ", " &lt;&lt; vScores&#91;i] &lt;&lt; endl;
		}
	}

	return 0;

	}

catch (exception &amp;e)
{
	cerr &lt;&lt; e.what();
}

catch (...)
{
	cerr &lt;&lt; "Fehler nicht bedacht." &lt;&lt; endl;
}
}</code></pre>



<p class="wp-block-paragraph"><strong>c) (Optional)</strong>&nbsp;Überarbeiten Sie entsprechend alle bisher durchgenommenen Programmbeispiele, die keine Fehlerbehandlung mit C++ Exceptions enthalten.</p>



<h3 class="wp-block-heading">Aufgabe 2</h3>



<p class="wp-block-paragraph"><strong>a)</strong>&nbsp;Schreiben Sie ein Programm, das eine Reihe von Zahlen einliest und in einem vector&lt;int&gt; Container speichert. Nachdem der Benutzer eine beliebige Anzahl von Zahlen eingegeben hat, fragt das Programm, wie viele Zahlen davon aufaddiert werden sollen. Lautet die Antwort n, werden die ersten n Elemente des vector Containers sowie deren Summe ausgegeben.</p>



<p class="wp-block-paragraph"><strong>Beispielsweise:</strong>&nbsp;Geben Sie einige Zahlen ein (mit &#8218;q&#8216; beenden Sie die Eingabe): 12 23 13 24 15 q Wie viele Zahlen sollen aufaddiert werden: 3 Die Summe der erste 3 Elemente 12, 23 und 13 ist 48.</p>



<p class="wp-block-paragraph">Verwenden Sie Ausnahmen, um möglichst alle Fehler zu behandeln. Behandeln Sie v.a. alle möglichen Eingaben. Stellen Sie auch sicher, dass eine vernünftige Fehlermeldung ausgegeben wird, wenn mehr Zahlen addiert werden sollen als im vector vorhanden sind.</p>



<pre class="wp-block-code"><code>#include
#include "MEIN_EIGENER_HEADER.h"
#include
using namespace std;

int main() {
try {
	vector vzahlen;
	int itemp = 0, iausgabe = 0, isumme = 0;
	char cend = 'a';

	cout &lt;&lt; "Geben Sie einige Zahlen ein (mit 'q' beenden Sie die Eingabe):" &lt;&lt; endl; 	while (cend != 'q') // Solange nicht q eingegeben wurde 	{ 		if (cin &gt;&gt; itemp) // Wenn die Eingabe itemp gespeichert werden kann
		{
			vzahlen.push_back(itemp);
		}
		else // Schreibe Wert in Vektor
		{
			cin.clear();
			if (cin &gt;&gt; cend &amp;&amp; cend != 'q')  // Wenn die Eingabe erfolgreich und nicht q eingegeben wurde
			{
				error("Es duerfen nur 'q' oder ganze Zahlen als Operatoren eingegeben werden. Programm wird nun beendet.");
			}
		}
	}

	cout &lt;&lt; "Wie viele Zahlen sollen aufaddiert werden:" &lt;&lt; endl; 	if (cin &gt;&gt; iausgabe) // Wenn Eingabe in iausgabe gespeichert werden kann
	{}
	else
	{
		error("Eingegebener Wert ungueltig. Programm wird nun beendet.");
	}

	if (vzahlen.size() &gt;= iausgabe) // Wenn weniger Zahlen aufaddiert werden sollen, als im Vektor gespeichert sind
	{
		cout &lt;&lt; "Die Summe der ersten " &lt;&lt; iausgabe &lt;&lt; " Elemente ";
		for (int i = 0; i &lt; iausgabe; i++) // Aufaddieren der Werte
		{
			cout &lt;&lt; vzahlen&#91;i];
			isumme = isumm e + vzahlen&#91;i];
			if (i &lt; iausgabe - 2) // Formatierung der Ausgabe,
			{
				cout &lt;&lt; ", ";
			}
			else
			{
				if (i &lt; iausgabe - 1)
				{
					cout &lt;&lt; " und ";
				}
			}
		}
		cout &lt;&lt; " ist " &lt;&lt; isumme &lt;&lt; endl;
	}
	else
	{
		error("Zu wenig Stellen");
	}

	return 0;
}

catch (exception &amp;e)
{	// Fangen des Fehlers error
	cerr &lt;&lt; e.what();
	return 1;
}
catch (...)
{ // Fangen von allen anderen Ausnahmefehlern
	cerr &lt;&lt; "Unbekannter Fehler. Programm wird beendet.";
	return 1;
}
}</code></pre>



<p class="wp-block-paragraph"><strong>b)</strong>&nbsp;Erweitern Sie das Programm so, dass double-Werte statt int-Werte verwendet werden. Erstellen Sie einen zusätzlichen vector Container mit double-Werten für die (n-1) Differenzen zwischen den jeweils nacheinander eingegebenen Werten. Geben Sie auch die Differenzen aus.</p>



<pre class="wp-block-code"><code>#include
#include "MEIN_EIGENER_HEADER.h"
using namespace std;

void dsumme(const vector&amp; vzahlen, const int&amp; iausgabe) // Anlegen einer Funktion dsumme ohne Rückgabewert, die die Summe der ersten X Werte berechnet
{
	double dsum = 0.0;
	cout &lt;&lt; "Die Summe der ersten " &lt;&lt; iausgabe &lt;&lt; " Elemente ";
	for (int i = 0; i &lt; iausgabe; i++)
	{
		cout &lt;&lt; vzahlen&#91;i];
		dsum = dsum + vzahlen&#91;i];
		if (i &lt; iausgabe - 2) // Formatierung der Ausgabe
		{
			cout &lt;&lt; ", ";
		}
		else
		{
			if (i &lt; iausgabe - 1)
			{
				cout &lt;&lt; " und ";
			}
		}
	}

	cout &lt;&lt; " ist " &lt;&lt; dsum &lt;&lt; endl;
}

void ddifferenzen(const vector&amp; vdifferenzen) // Funktion zur Ausgabe der n-1 Differenz
{
	cout &lt;&lt; "Die Differenz der Zahlen lautet: ";
	for (int i = 0; i &lt; vdifferenzen.size(); i++)
	{
		cout &lt;&lt; vdifferenzen&#91;i];
		if (i &lt; vdifferenzen.size() - 2) // Formatierung der Ausgabe
		{
			cout &lt;&lt; ", ";
		}
		else
		{
			if (i &lt; vdifferenzen.size() - 1)
			{
				cout &lt;&lt; " und ";
			}
		}
	}

	cout &lt;&lt; endl;
	return 0;

}

int main() {
try {
	vector vzahlen;
	vector vdifferenzen;
	double itemp = 0;
	int iausgabe = 0;
	char cend = 'a';

	cout &lt;&lt; "Geben Sie einige Zahlen ein (mit 'q' beenden Sie die Eingabe):" &lt;&lt; endl; 	while (cend != 'q') {	// Solange nicht q eingegeben wurde 		if (cin &gt;&gt; itemp) // Wenn die Eingabe in itemp gespeichert werden kann
		{
			vzahlen.push_back(itemp); // Schreibe itemp in den Vektor
			if (vzahlen.size() &gt; 1) // Berechnung der Differenzen nur möglich, wenn mehr als ein Wert eingegeben wurde
 			{
				if (vzahlen&#91;vzahlen.size() - 2] &gt;= vzahlen&#91;vzahlen.size() - 1]) // Dieses if-else Konstrukt ermittelt den Betrag zwischen zwei Zahlen, immer größere Zahl - kleinere und schreibt die Differenz in einen eigenen Vektor
				{
					vdifferenzen.push_back(vzahlen&#91;vzahlen.size() - 2] - vzahlen&#91;vzahlen.size() - 1]);
				}
				else
				{
					vdifferenzen.push_back(vzahlen&#91;vzahlen.size() - 1] - vzahlen&#91;vzahlen.size() - 2]);
				}
			}
		}
		else
		{
			cin.clear();
			if (cin &gt;&gt; cend &amp;&amp; cend != 'q')
			{
				error("Es duerfen nur 'q' oder ganze Zahlen als Operatoren eingegeben werden.");
			}
		}
	} // Ende von while

	cout &lt;&lt; "Wie viele Zahlen sollen aufaddiert werden?" &lt;&lt; endl; 	if (cin &gt;&gt; iausgabe) // Wenn die Eingabe in iausgabe gespeichert werden kann, tue nichts
	{}
	else
	{
		error("Eingegebener Wert ist ungueltig.");
	}

	if (vzahlen.size() &gt;= iausgabe) // Wenn Vektorgröße größer gleich der eingegebenen Zahl
	{
		dsumme(vzahlen, iausgabe); // Funktionsaufruf dsumme und Übergabe der Parameter
		ddifferenzen(vdifferenzen); // Funktionsaufruf ddifferenzen und Übergabe der Parameter
	}
	else
	{
		error("Es wurden weniger Zahlen eingegeben, als ausgegeben werden sollen.");
	}

	return 0;
}

catch (exception &amp;e) // Abfangen von error
{
	cerr &lt;&lt; e.what();
	return 1;
}
}</code></pre>



<h3 class="wp-block-heading">Aufgabe 3</h3>



<p class="wp-block-paragraph"><strong>a)</strong>&nbsp;Zeichnen Sie einen Parserbaum nach den vorgestellten formalen Grammatikregeln für den Rechenausdruck (17-4)/(5-1).</p>



<p class="wp-block-paragraph"><strong>b)</strong>&nbsp;Erweitern Sie das Mini-Rechner Programm aus der Vorlesung so, dass auch negative Zahlen direkt eingegeben werden können. Ein Rechenausdruck wie -7*3 soll auch so eingegeben werden können, und nicht wie bislang nur als (0-7)*3 akzeptiert werden.&nbsp;<strong>Hinweise:</strong>&nbsp;Sie müssen dafür die wie folgt erweiterte Grammatik implementieren:</p>



<p class="wp-block-paragraph"><strong>Primary :</strong>&nbsp;Number &#8218;(&#8218; Expression &#8218;)&#8216; &#8218;-&#8218; Primary &#8218;+&#8216; Primary</p>



<p class="wp-block-paragraph"><strong>Faktor (Punktoperand) :</strong>&nbsp;Zahl &#8218;(&#8218; Rechenausdruck &#8218;)&#8216; &#8218;-&#8218; Faktor &#8218;+&#8216; Faktor</p>



<p class="wp-block-paragraph">Implementieren Sie unäres Minus und unäres Plus.</p>



<pre class="wp-block-code"><code>#ifndef TOKEN_H
#define	TOKEN_H

class Token
{

	public:
		char kind; // Kategorien
		double value; // Bei Zahlenkategorie: ein Wert

		Token(char ch) //  Memberfunktion: erstelle ein Token aus einem char
		: kind(ch), value(0)
		{} /* mache nichts sonst */

		Token(char ch, double val) //Memberfunktion: erstelle ein Token aus einem char und einem double
		: kind(ch), value(val)
		{}/* mache nichts sonst */
 };

class Token_stream
{
	public:
		Token_stream() : full(false), buffer(' ')
		{} // Konstruktor

		void putback(Token t) // Token "zurückstellen"
		{
			if (full) error("Token_stream::putback(), Puffer voll!\n");
			buffer = t;
			full = true;
		};

		Token get(); // Token aus cin erzeugen

	private:
		bool full; // ist buffer voll?
		Token buffer;
};

Token Token_stream::get()
{
	if (full)
	{
		full = false;
		return buffer;
	}

	char ch;
	cin &gt;&gt; ch;

	switch (ch)
	{
		case 'h': case 'H':
		{
			return Token('h');
		}

		case ';': // Ende eines Rechenausdrucks

		case 'q': // Programmende

		case '(': case ')': case '+': case '-': case '*': case '/':
		{
			return Token(ch); // jedes Zeichen ist sein eigenes Token
		}

		case '.': case '0': case '1': case '2': case '3': case '4':// Zahl als Token
		case '5': case '6': case '7': case '8': case '9':
		{
			cin.putback(ch); // der cin Stream kennt auch ein putback()
			double val;
			cin &gt;&gt; val;
			return Token('9', val);
		}

		default: error("Token Token_stream::get(), unbekanntes Token!\n");
	}
}
#endif	/* TOKEN_H */</code></pre>



<pre class="wp-block-code"><code>#ifndef FUNCTIONS_H
#define	FUNCTIONS_H
double rechenausdruck(Token_stream &amp;Ts);
double faktor(Token_stream &amp;Ts);
double summand(Token_stream &amp;Ts);

double rechenausdruck(Token_stream &amp;Ts) // "plus" und "minus" behandeln
{
	double li = summand(Ts);
	Token t = Ts.get();
	while (true)
	{
		switch (t.kind)
		{
			case '+':
			{
				li += summand(Ts);
				t = Ts.get();
				break;
			}
			case '-':
			{
				li -= summand(Ts);
				t = Ts.get();
				break;
			}
			default:
			{
				Ts.putback(t);
				return li;
			}
		}
	}
}

double summand(Token_stream &amp;Ts) // "mal" und "geteilt durch" behandeln
{
	double li = faktor(Ts);
	Token t = Ts.get();
	while (true)
	{
		switch (t.kind)
		{
			case '*':
			{
				li *= faktor(Ts);
				t = Ts.get();
				break;
			}
			case '/':
			{
				double d = faktor(Ts);
				if (d == 0) error("Div. durch 0!\n");
				li /= d;
				t = Ts.get();
				break;
			}
			default:
			{
				Ts.putback(t);
				return li;
			}
		}
	}
}

double faktor(Token_stream &amp;Ts) // Zahlen und Klammern behandeln
{
	Token t = Ts.get();
	switch (t.kind)
	{
		case '(':
		{
			double d = rechenausdruck(Ts);
			t = Ts.get();
			if (t.kind != ')') error(") erwartet!\n");
			return d;
		}
		case '9':
		{
			return t.value;
		}
		case '+':
		{
			return faktor(Ts);
		}
		case '-':
		{
			return faktor(Ts) * -1;
		}
		default:
		{
			error("Faktor erwartet!\n");
		}
	}
}

#endif	/* FUNCTIONS_H */</code></pre>



<pre class="wp-block-code"><code>using namespace std;
#include "MEIN_EIGENER_HEADER.h"
#include "token.h"
#include "functions.h"

int main() {
try {
	Token_stream T;
	while (cin)
	{

		Token t = T.get();

		while (t.kind == ';')
		{
			t = T.get();
		}

		if (t.kind == 'q')
		{
			return 0;
		}

		T.putback(t);
		cout &lt;&lt; "=" &lt;&lt; rechenausdruck(T) &lt;&lt; endl;

	}
	return 0;
}

catch (exception &amp;e)
{
	cerr &lt;&lt; e.what();
	return 1;
}
}</code></pre>



<p class="wp-block-paragraph"><strong>c)</strong>&nbsp;Erstellen Sie einen Satz von Eingabedaten und die dazu gehörenden, von Ihnen erwarteten Ausgaben zum Testen des Mini-Rechner Programms. Wonach sollten Sie Ausschau halten? Ist Ihre Liste mit Testdaten vollständig? Denken Sie auch an extreme Werte und „unsinnige“ Eingaben.&nbsp;<strong>Additon</strong></p>



<ul class="wp-block-list">
<li>1+1;</li>



<li>1++1;</li>



<li>+1+1;</li>



<li>++1++1;</li>



<li>0+1;</li>



<li>1+0;</li>
</ul>



<p class="wp-block-paragraph"><strong>Subtraktion</strong></p>



<ul class="wp-block-list">
<li>1-1;</li>



<li>1&#8211;1;</li>



<li>-1-1;</li>



<li>&#8211;1&#8211;1;</li>



<li>1-0;</li>



<li>0-1;</li>
</ul>



<p class="wp-block-paragraph"><strong>Mixed</strong></p>



<ul class="wp-block-list">
<li>+1-1;</li>



<li>-1+1;</li>



<li>+-1+-1;</li>
</ul>



<p class="wp-block-paragraph"><strong>Multiplikation Plus</strong></p>



<ul class="wp-block-list">
<li>1*1;</li>



<li>+1*+1;</li>



<li>++1*++1;</li>



<li>0*(+1);</li>
</ul>



<p class="wp-block-paragraph"><strong>Multiplikation Minus</strong></p>



<ul class="wp-block-list">
<li>1*-1;</li>



<li>-1*-1;</li>



<li>&#8211;1*&#8211;1;</li>



<li>0*(-1);</li>
</ul>



<p class="wp-block-paragraph"><strong>Mixed</strong></p>



<ul class="wp-block-list">
<li>-(+1)*-(+1);</li>



<li>+(-1)*+(-1);</li>



<li>-+1*-+1;</li>



<li>+-1*+-1;</li>
</ul>



<p class="wp-block-paragraph"><strong>Division</strong></p>



<ul class="wp-block-list">
<li>1/1;</li>



<li>+1/+1;</li>



<li>-1/-1;</li>



<li>+1/-1;</li>



<li>-1/+1;</li>



<li>+(1/1);</li>



<li>-(1/1);</li>
</ul>



<p class="wp-block-paragraph"><strong>d)</strong>&nbsp;Jedes Programm sollte dem Benutzer irgendeine Form von Hilfe anbieten. Ändern Sie das Mini-Rechner Programm so, dass bei der Eingabe von h oder H einige Anweisungen zur Bedienung ausgegeben werden.</p>



<pre class="wp-block-code"><code>using namespace std;
#include "MEIN_EIGENER_HEADER.h"
#include "token.h"
#include "functions.h"

int main()
{
try{
	cout &lt;&lt; "Taschenrechner:" &lt;&lt; endl;
 	cout &lt;&lt; "Bitte geben Sie die zu berechnenden Terme ein."&lt;&lt; endl;

	Token_stream T;
	while (cin)
	{
 	 	Token t = T.get();

 	 	while (t.kind == ';')
		{
			t = T.get();
		}

 	 	if (t.kind == 'q')
		{
 	 	 	return 0;
 	 	}
		else
		{
 	 		if (t.kind == 'h')
			{
				cout &lt;&lt; "Hilfe" &lt;&lt; endl;
                		cout &lt;&lt; "Rechenoperatoren: '+', '-', '*', '/'" &lt;&lt; endl;
                		cout &lt;&lt; "Rechenoperanden: Zahlen, '(', ')'" &lt;&lt; endl;
 	 	 	}
			else
			{
 	 	 	 	T.putback(t);
 	 	 	 	cout &lt;&lt; "=" &lt;&lt; rechenausdruck(T) &lt;&lt; endl;
	 	 	}
	 	}
	}
 	return 0;
}
catch (exception &amp;e)
{
	cerr &lt;&lt; e.what();
	return 1;
}
}</code></pre>



<pre class="wp-block-code"><code>Token Token_stream::get()
{
	if (full)
	{
		full = false;
		return buffer;
	}

	char ch;
	cin &gt;&gt; ch;
	switch (ch)
	{
		case 'h': case 'H':
		{
			return Token('h');
		}

		case ';': // Ende eines Rechenausdrucks

		case 'q': // Programmende

		case '(': case ')': case '+': case '-': case '*': case '/':
		{
			return Token(ch); // jedes Zeichen ist sein eigenes Token
		}

		case '.': case '0': case '1': case '2': case '3': case '4':
		case '5': case '6': case '7': case '8': case '9': // Zahl als Token
		{
			cin.putback(ch); // der cin Stream kennt auch ein putback()
			double val;
			cin &gt;&gt; val;
			return Token('9', val);
		}

		default:
		{
			error("Token Token_stream::get(), unbekanntes Token!\n");
		}
	}
}</code></pre>



<p class="wp-block-paragraph"><strong>e) (Optional)</strong>&nbsp;Sie werden feststellen, dass Ein- und Ausgabeprompt</p>



<p class="wp-block-paragraph">&gt; _ bzw. = 42</p>



<p class="wp-block-paragraph">des Mini-Rechner Programms sich unter bestimmten Umständen seltsam verhalten. Verbessern Sie das Programm so, dass immer eine korrekte Ein- bzw.&nbsp;Ausgabeaufforderung angezeigt wird. Hinweis: Sie könnten die formatierte Eingabe mit cin &gt;&gt; durch die unformatierte Eingabe mit cin.get() ersetzen und unerwünschte Zeichen selbst filtern.Plus.</p>



<h3 class="wp-block-heading">Aufgabe 4</h3>



<p class="wp-block-paragraph"><strong>a)</strong>&nbsp;Lesen Sie über die Standardeingabe Wochentag/Wert-Paare ein,</p>



<p class="wp-block-paragraph"><strong>Beispielsweise:</strong>&nbsp;Donnerstag 23 Freitag 56 Donnerstag -3 Dienstag 99</p>



<p class="wp-block-paragraph">Sammeln Sie für jeden Wochentag die eingegebenen Werte in einem eigenen vector&lt;int&gt; Container. Beenden Sie die Eingabe durch q als Wochentag. Geben Sie die Werte in den sieben Wochentage-Containern aus. Geben Sie die Summe der Werte in jedem Container aus. Ignorieren Sie unzulässige Wochentage wie „Freutag“, aber lassen Sie geläufige Abkürzungen (wie „Fr“) zu. Geben Sie die Anzahl der wegen unzulässigem Tag abgelehnten Werte aus.</p>



<pre class="wp-block-code"><code>#include "MEIN_EIGENER_HEADER.h"
#include &lt;iostream&gt;
#include &lt;vector&gt;
using namespace std;

int isumme (vector&lt;int&gt; &amp;vtage)
{
	int result =0;
	for (int i=0; i&lt;vtage.size();i++)
	{
		result = result + vtage&#91;i];
	}
	return result;
}

int main() {
try {
	string stemp = "";
	int itemp = 0;
	int iilegaldays = 0;

	vector&lt;int&gt; vmontag;
	vector&lt;int&gt; vdienstag;
	vector&lt;int&gt; vmittwoch;
	vector&lt;int&gt; vdonnerstag;
	vector&lt;int&gt; vfreitag;
	vector&lt;int&gt; vsamstag;
	vector&lt;int&gt; vsonntag;

	while (stemp != "q")
	{

		cin &gt;&gt; stemp;

		if (cin &gt;&gt; itemp)
		{
			if (stemp == "Montag" || stemp == "Mo")
			{
				vmontag.push_back(itemp);
			}
			else
			{
				if (stemp == "Dienstag" || stemp == "Di")
				{
					vdienstag.push_back(itemp);
				}
				else
				{
					if (stemp == "Mittwoch" || stemp == "Mi")
					{
						vmittwoch.push_back(itemp);
					}
					else
					{
						if (stemp == "Donnerstag" || stemp == "Do")
						{
							vdonnerstag.push_back(itemp);
						}
						else
						{
							if (stemp == "Freitag" || stemp == "Fr")
							{
								vfreitag.push_back(itemp);
							}
								else
								{
								if (stemp == "Samstag" || stemp == "Sa")
								{
									vsamstag.push_back(itemp);
								}
								else
								{
									if (stemp == "Sonntag" || stemp == "So") {
										vsonntag.push_back(itemp);
									}
									else
									{
										iilegaldays++;
									}
								}
							}
						}
					}
				}
			}

		}
		else
		{
			cin.clear();
			if (cin &gt;&gt; stemp &amp;&amp; stemp != "q")
			{
				error("Ungueltige Eingabe fuer Wochentag oder Wert.");
			}
			else
			{
				cout &lt;&lt; "'q' wurde als Zahl eingegeben." &lt;&lt; endl;
				cout &lt;&lt; "Fuehre automatische Korrektur durch." &lt;&lt; endl;
			}
		}
	}

	cout &lt;&lt; "Anzahl der falsch eingegebenen Tage: "&lt;&lt;iilegaldays &lt;&lt;endl;
	cout &lt;&lt; "Montage: "&lt;&lt;isumme(vmontag) &lt;&lt;endl;
	cout &lt;&lt; "Dienstage: "&lt;&lt;isumme(vdienstag) &lt;&lt;endl;
	cout &lt;&lt; "Mittwoche: "&lt;&lt;isumme(vmittwoch) &lt;&lt;endl;
	cout &lt;&lt; "Donnerstage: "&lt;&lt;isumme(vdonnerstag) &lt;&lt;endl;
	cout &lt;&lt; "Freitage: " &lt;&lt;isumme(vfreitag) &lt;&lt;endl;
	cout &lt;&lt; "Samstage: " &lt;&lt;isumme(vsamstag) &lt;&lt;endl;
	cout &lt;&lt; "Sonntage: " &lt;&lt;isumme(vsonntag) &lt;&lt;endl;

	return 0;

}

catch (exception &amp;e)
{
	cerr &lt;&lt; e.what();
	return 1;
}
}</code></pre>



<p class="wp-block-paragraph"><strong>b)</strong>&nbsp;Definieren Sie nun eine Klasse Name_values, die einen string und ein vector&lt;int&gt; enthält. Statten Sie die Klasse mit einem Konstruktor und mit den erforderlichen Memberfunktionen zur Speicherung von Werten und zur Ausgabe aus. Überarbeiten Sie das Programm aus a) so, dass statt sieben vector Container nur noch ein vector&lt;Name_values&gt; Container verwendet wird.</p>



<pre class="wp-block-code"><code>#include "class.h"
#include "methods.h"
#include "MEIN_EIGENER_HEADER.h"
#include &lt;vector&gt;

using namespace std;

int main() {
try {
	vector&lt;name_value&gt; vnamevalues(7);
	string strDay;
	int ivalue = 0, iilegal = 0;

	vnamevalues&#91;0] = name_value("Montag");
	vnamevalues&#91;1] = name_value("Dienstag");
	vnamevalues&#91;2] = name_value("Mittwoch");
	vnamevalues&#91;3] = name_value("Donnerstag");
	vnamevalues&#91;4] = name_value("Freitag");
	vnamevalues&#91;5] = name_value("Samstag");
	vnamevalues&#91;6] = name_value("Sonntag");

	while (strDay != "q")
	{
		cin &gt;&gt; strDay;
		if (cin &gt;&gt; ivalue)
		{
			if (strDay == "Montag" || strDay == "Mo")
			{vnamevalues&#91;0].set(ivalue);}
			else
			{
				if (strDay == "Dienstag" || strDay == "Di")
				{vnamevalues&#91;1].set(ivalue);}
				else
				{
					if (strDay == "Mittwoch" || strDay == "Mi")
					{vnamevalues&#91;2].set(ivalue);}
					else
					{
						if (strDay == "Donnerstag" || strDay == "Do")
						{vnamevalues&#91;3].set(ivalue);}
						else
						{
							if (strDay == "Freitag" || strDay == "Fr")
							{vnamevalues&#91;4].set(ivalue);}
							else
							{
								if (strDay == "Samstag" || strDay == "Sa")
								{vnamevalues&#91;5].set(ivalue);}
								else
								{
									if (strDay == "Sonntag" || strDay == "So")
									{vnamevalues&#91;6].set(ivalue);}
									else
									{iilegal++;}
								}
							}
						}
					}
				}
			}
		}
		else
		{
			cin.clear();
			if (cin &gt;&gt; strDay &amp;&amp; strDay == "q")
			{
				cout &lt;&lt; "Bitte \"q\" nur fuer den ersten Wert eingeben." &lt;&lt; endl;
				cout &lt;&lt; "Fuehre Korrektur durch." &lt;&lt; endl;
			}
			else
			{
				error("Ungueltige Eingabe fuer den Wert.");
			}
		}
	}

	cout &lt;&lt; "Sie haben folgende Werte eingegeben: " &lt;&lt; endl;

	for (int i = 0; i &lt; vnamevalues.size(); i++) //Alle Tage durchlaufen
	{cout &lt;&lt; vnamevalues&#91;i].get() &lt;&lt; ": " &lt;&lt; vnamevalues&#91;i].isumme() &lt;&lt; endl;}

	cout &lt;&lt; "Anzahl der falsch eingegebenen Tage: " &lt;&lt; iilegal &lt;&lt; endl;

	return 0; //reguläres Programmende
}
catch (runtime_error &amp;e)
{
	cerr &lt;&lt; e.what(); //Fehlerausgabe
	return 1; //Programmende nach Fehler
}
}</code></pre>



<pre class="wp-block-code"><code>#ifndef METHODS_H
#define	METHODS_H

name_value::name_value() : //Standardkonstruktor
sname("Montag"),vvalue() {}

name_value::name_value(string strDay) :
sname(strDay), vvalue() { }

void name_value::set(int ivalue)
{
	vvalue.push_back(ivalue);
}

int name_value::size()
{
	return vvalue.size();
}

int name_value::isumme()
{
	int iergebnis = 0;
	for (int i = 0; i &lt; vvalue.size(); i++)
	{
		iergebnis = iergebnis + vvalue&#91;i];
	}
	return iergebnis;
}

string name_value::get()
{
	return sname;
}
#endif	/* METHODS_H */</code></pre>



<pre class="wp-block-code"><code>#ifndef NAME_VALUES_H
#define	NAME_VALUES_H

#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;stdexcept&gt;

using namespace std;

class name_value
{
	public:
		name_value();
		name_value(string strDay);

		void set(int);
		int size();
		int isumme();
		string get();

	private:
		string sname;
		vector&lt;int&gt; vvalue;
};
#endif	/* NAME_VALUES_H */</code></pre>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/02/programmieren-algorithmen-und-datenstrukturen-1-praktikum-3/">Programmieren, Algorithmen und Datenstrukturen 1 (Praktikum 3)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2012/02/programmieren-algorithmen-und-datenstrukturen-1-praktikum-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Programmieren, Algorithmen und Datenstrukturen 1 (Praktikum 2)</title>
		<link>https://maximiliankrieg.de/2012/02/programmieren-algorithmen-und-datenstrukturen-1-praktikum-2/</link>
					<comments>https://maximiliankrieg.de/2012/02/programmieren-algorithmen-und-datenstrukturen-1-praktikum-2/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Sat, 04 Feb 2012 06:19:00 +0000</pubDate>
				<category><![CDATA[Programmieren 1]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1525</guid>

					<description><![CDATA[<p>Aufgabe 1 a)&#160;Schreiben Sie ein Programm, das eine Gleitkommazahl als Benutzereingabe einliest und&#160;die Quadratwurzel dieser Zahl ausgibt.&#160;Eingabeaufforderung:&#160;Geben Sie eine Gleitkommazahl &#62;= 0 ein: Antwort des&#8230;</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/02/programmieren-algorithmen-und-datenstrukturen-1-praktikum-2/">Programmieren, Algorithmen und Datenstrukturen 1 (Praktikum 2)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">Aufgabe 1</h3>



<p class="wp-block-paragraph"><strong>a)</strong>&nbsp;Schreiben Sie ein Programm, das eine Gleitkommazahl als Benutzereingabe einliest und&nbsp;die Quadratwurzel dieser Zahl ausgibt.&nbsp;<strong>Eingabeaufforderung:</strong>&nbsp;Geben Sie eine Gleitkommazahl &gt;= 0 ein: Antwort des Programms (z.B. bei Eingabe von 9.7): Die Quadratwurzel von 9.7 ist 3.1145&nbsp;<strong>Hinweis:</strong>&nbsp;Die C++ StdLib stellt über den Header cmath eine Schnittstelle zur Funktion&nbsp;double sqrt( double )&nbsp;zur Verfügung, die Sie in Ihrem Programm verwenden sollten.&nbsp;Wählen Sie alle Ihre Namen nach der „Ungarischen Notation“.</p>



<pre class="wp-block-code"><code>#include &lt;iostream&gt;
#include &lt;cmath&gt;
using namespace std;

int main()
{
	double dwurzel=0.0;
	cout &lt;&lt; "Geben Sie eine Gleitkommazahl &gt;= 0 ein:";
	cin &gt;&gt; dwurzel;
	cout &lt;&lt; "Die Quadratwurzel von " &lt;&lt; dwurzel &lt;&lt; " ist " &lt;&lt; sqrt( dwurzel );
}</code></pre>



<p class="wp-block-paragraph"><strong>b)</strong>&nbsp;Schreiben Sie das Quadratwurzel Programm jetzt so, dass die Wurzelberechnung ohne den&nbsp;Einsatz von Bibliotheksfunktionen und nur mit dem Kontrollprimitiv Sequenz, ohne&nbsp;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?</p>



<pre class="wp-block-code"><code>#include &lt;iostream&gt;
#include &lt;cmath&gt;
#include &lt;cstdlib&gt;
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 &lt;&lt; "Geben Sie eine Gleitkommazahl &gt;= 0 ein:";
	cin &gt;&gt; dwurzel;
	cout &lt;&lt; "Die Quadratwurzel von " &lt;&lt; dwurzel &lt;&lt; " ist " &lt;&lt; wurzelberechnung(dwurzel);
	return 0;
}</code></pre>



<p class="wp-block-paragraph"><strong>c)</strong>&nbsp;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.</p>



<pre class="wp-block-code"><code>#include &lt;iostream&gt;
using namespace std;

double wurzelberechnung(double dwurzel, int igenauigkeit)
{
	double danfangswert = dwurzel;
	for (int i = 0; i &lt; igenauigkeit; i++)
	{
		 dwurzel = (dwurzel + (danfangswert / dwurzel)) / 2;
	}
	return dwurzel;
}

int main() {
	double dzahl = 0.0;
	double dwurzel = 0.0;
	int igenauigkeit = 1;
	cout &lt;&lt; "Geben Sie eine Gleitkommazahl &gt;= 0 ein:";
	cin &gt;&gt; dzahl;
	cout &lt;&lt; "Geben Sie eine Genauigkeit &gt; 0 ein:";
	cin &gt;&gt; igenauigkeit;
	dwurzel = wurzelberechnung(dzahl, igenauigkeit);
	cout &lt;&lt; "Die Quadratwurzel von " &lt;&lt; dzahl &lt;&lt; " ist " &lt;&lt; dwurzel &lt;&lt; "\n";
	cout &lt;&lt; "Die Genauigkeit betraegt: " &lt;&lt; igenauigkeit &lt;&lt; "\n";
	cout &lt;&lt; "Der Prueftwert betraegt: " &lt;&lt; dwurzel &lt;&lt; "*" &lt;&lt; dwurzel &lt;&lt; "=" &lt;&lt; (dwurzel * dwurzel) &lt;&lt; "\n";
	return 0;
}</code></pre>



<p class="wp-block-paragraph"><strong>d)</strong>&nbsp;Warum sollte man lieber die Bibliotheksfunktion verwenden?&nbsp;<strong>Gründe:</strong></p>



<ul class="wp-block-list">
<li>Die Verwendung von Funktionen aus der Standardbibliothek ermöglichen den Einsatz des Programms auf jeglichem System</li>



<li>Ergebnis ist durch Standardisierung der Bibliothek verfiziert (Fehlerfreiheit)</li>



<li>Prinzip der Wiederverwendung</li>
</ul>



<h3 class="wp-block-heading">Aufgabe 2</h3>



<p class="wp-block-paragraph"><strong>a)</strong>&nbsp;Ändern Sie den Programmablaufplan (PAP) des ggT Programms (aus der Vorlesung / Hörsaalübung) so, dass der Programmablauf nach Abschluss der Berechnung und Ausgabe&nbsp;der Ergebnisse wieder zurückkehrt zur Eingabeaufforderung für die beiden Zahlen, und&nbsp;alles wieder von vorne losgeht.</p>



<p class="wp-block-paragraph"><strong>b)</strong>&nbsp;Schreiben Sie das Programm nach dem von Ihnen geänderten PAP um.</p>



<pre class="wp-block-code"><code>#include &lt;iostream&gt;
using namespace std;
int main()

{
	int i1 = 0, i2 = 0, tmp = 0, n = 1;
	bool bflagend = false;
	while (bflagend == false) {
		 cout &lt;&lt; "Zwei positive ganze Zahlen eingeben: "; 		 cin &gt;&gt; i1 &gt;&gt; i2;
		 while (i1 != i2) {
			  cout &lt;&lt; "\t(" &lt;&lt; i1 &lt;&lt; "," &lt;&lt; i2 &lt;&lt; ")" &lt;&lt; endl;
			  if (i1 &lt; i2) i2 = i2 - i1;
			  else {
					tmp = i1;
					i1 = i2;
					i2 = tmp - i1;
			  }
			  ++n;
		 }
		 cout &lt;&lt; "\t(" &lt;&lt; i1 &lt;&lt; "," &lt;&lt; i2 &lt;&lt; ")" &lt;&lt; endl;
		 cout &lt;&lt; n &lt;&lt; " Schritte zum ggT\n" &lt;&lt; endl;
	}
}</code></pre>



<h3 class="wp-block-heading">Aufgabe 3</h3>



<p class="wp-block-paragraph">Schreiben Sie ein Programm, das einen Operator und zwei Operanden einliest, die &nbsp;gewünschte&nbsp;Operation durchführt und das Ergebnis anzeigt, zum Beispiel: $&gt; Operation: + 34.5 99 $&gt; Operation: * 3 8.2 $&gt; Ergebnis: 133.5 $&gt; Ergebnis: 24.6 Berücksichtigen Sie die Operatoren +, -, * und / mit den offensichtlichen Bedeutungen.&nbsp;Lesen Sie den Operator in eine string-Variable und die Operanden in double-Variablen.&nbsp;Stellen Sie mittels if fest, welche Operation ausgeführt werden soll, z.B.: if(str_opSym=&nbsp;=&#8220;+&#8220;).</p>



<pre class="wp-block-code"><code>#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
using namespace std;

int main()
{
	double doperand1 = 0.0, doperand2 = 0.0;
	string soperator = "+";
	cout &lt;&lt; "Bitte zwei Operatoren und einen Operand eingeben:\n";
	cout &lt;&lt; "Summe a+b mit '+', Differenz a-b mit '-', Produkt a*b mit '*' und Quotient a/b mit '/':\n"; 	cin &gt;&gt; doperand1 &gt;&gt; doperand2 &gt;&gt; soperator;
	if (soperator == "+")
	{
		 cout &lt;&lt; "Summe aus " &lt;&lt; doperand1 &lt;&lt; "+" &lt;&lt; doperand2 &lt;&lt; "=" &lt;&lt; doperand1 + doperand2;
	}
	else
	{
		 if (soperator == "-")
		 {
			  cout &lt;&lt; "Differenz aus " &lt;&lt; doperand1 &lt;&lt; "-" &lt;&lt; doperand2 &lt;&lt; "=" &lt;&lt; doperand1 - doperand2;
		 }
		 else
		 {
			  if (soperator == "*")
			  {
					cout &lt;&lt; "Produkt aus " &lt;&lt; doperand1 &lt;&lt; "*" &lt;&lt; doperand2 &lt;&lt; "=" &lt;&lt; doperand1 * doperand2;
			  }
			  else
			  {
					if (soperator == "/")
					{
						 if (doperand2 != 0.0)
						 {
							  cout &lt;&lt; "Quotient aus " &lt;&lt; doperand1 &lt;&lt; "/" &lt;&lt; doperand2 &lt;&lt; "=" &lt;&lt; doperand1 / doperand2;
						 }
						 else
						 {
							  cout &lt;&lt; "Division durch 0 nicht erlaubt.";
						 }
					}
					else
					{
						 cout &lt;&lt; "Kein gueltiger Operator eingegeben.";
					}
			  }
		 }
	}
}</code></pre>



<h3 class="wp-block-heading">Aufgabe 4</h3>



<p class="wp-block-paragraph">Der Median einer Zahlenreihe ist definiert als die Zahl, bei der höchstens die Hälfte der Zahlen&nbsp;aus der Zahlenreihe größer und höchstens die Hälfte der Zahlen aus der Zahlenreihe kleiner ist.&nbsp;Ändern Sie den Programmteil zur Berechnung des Medians aus dem Vorlesungsbeispiel so,&nbsp;dass der Median korrekt berechnet wird.&nbsp;<strong>Hinweis:</strong>&nbsp;Bei einer geraden Anzahl von Beobachtungen gibt es kein einziges mittleres Element,&nbsp;sondern zwei. Verwenden Sie für eine gerade Anzahl von Temperaturwerten das arithmetische&nbsp;Mittel der beiden mittleren Beobachtungswerte.</p>



<pre class="wp-block-code"><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
using namespace std;

int main( )
{
	vector vTemps; // Temperaturwerte
	double temp;
	double dmedian=0.0;
	while( cin &gt;&gt; temp ) // einlesen /*&amp;&amp; temp != -274*/
	{
		 vTemps.push_back( temp ); // speichern
	}
	// arithm. Mittel
	double sum = 0;
	for( int i=0; i	{
		 sum += vTemps&#91;i];
	}
	cout &lt;&lt; "Temperaturmittel: " &lt;&lt; sum/vTemps.size() &lt;&lt; endl; // Mittelwert aller Elemente im Vektor vTemps ausgeben 	sort( vTemps.begin(), vTemps.end() ); // sortieren mit Funktion aus StdLib, Header algorithm 	if (vTemps.size() % 2 &gt; 0)
	{
		dmedian = vTemps&#91; vTemps.size()/2 ];
	}
	else
	{
		 dmedian =  (vTemps&#91; vTemps.size()/2 -1] + vTemps&#91; vTemps.size()/2 ])/2;
	}
	cout &lt;&lt; "Median: " &lt;&lt; dmedian &lt;&lt; endl;
}</code></pre>



<h3 class="wp-block-heading">Aufgabe 5</h3>



<p class="wp-block-paragraph"><strong>a)</strong>&nbsp;Richten Sie einen vector ein, der die zehn Zeichenketten „null“, „eins“, „zwei“, „drei“, usw.&nbsp;bis „neun“ enthält. Verwenden Sie diesen in einem Programm, das für eine einzulesende&nbsp;Ziffer ihren entsprechenden ausgeschriebenen Wert ausgibt.</p>



<pre class="wp-block-code"><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
using namespace std;

int main()
{
	int ipointer=0;
	vector vZahlen(10);

	vZahlen&#91;0]="null";
	vZahlen&#91;1]="eins";
	vZahlen&#91;2]="zwei";
	vZahlen&#91;3]="drei";
	vZahlen&#91;4]="vier";
	vZahlen&#91;5]="fünf";
	vZahlen&#91;6]="sechs";
	vZahlen&#91;7]="sieben";
	vZahlen&#91;8]="acht";
	vZahlen&#91;9]="neun";

	cout &lt;&lt; "Bitte Ziffer eingeben:"; 	cin &gt;&gt; ipointer;
	cout &lt;&lt; vZahlen &#91; ipointer ];
}</code></pre>



<p class="wp-block-paragraph"><strong>b)</strong>&nbsp;Erweitern Sie das Programm so, dass auch ausgeschriebene Ziffern wie „sieben“ als&nbsp;Eingabe möglich sind, und das Programm dann die Ziffer aus der entsprechenden Zahl –&nbsp;oder, je nach Eingabe, die ausgeschriebene Zahl aus der Ziffer – ausgibt.</p>



<pre class="wp-block-code"><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
using namespace std;

void vektorsuche(int izahl)
{
	vector vZahlen(10);

	vZahlen&#91;0] = "null";
	vZahlen&#91;1] = "eins";
	vZahlen&#91;2] = "zwei";
	vZahlen&#91;3] = "drei";
	vZahlen&#91;4] = "vier";
	vZahlen&#91;5] = "fünf";
	vZahlen&#91;6] = "sechs";
	vZahlen&#91;7] = "sieben";
	vZahlen&#91;8] = "acht";
	vZahlen&#91;9] = "neun";

	if (izahl &gt; 0 &amp;&amp; izahl &lt; 10)
	{
		 cout &lt;&lt; "Die gesuchte Zahl lautet: " &lt;&lt; vZahlen&#91;izahl];
	}
	else
	{
		 cout &lt;&lt; "Die gesuchte Zahl wurde nicht gefunden.";
	}
}

int vektorsuche(string szahl)
{
	vector vZahlen(10);

	vZahlen&#91;0] = "null";
	vZahlen&#91;1] = "eins";
	vZahlen&#91;2] = "zwei";
	vZahlen&#91;3] = "drei";
	vZahlen&#91;4] = "vier";
	vZahlen&#91;5] = "fünf";
	vZahlen&#91;6] = "sechs";
	vZahlen&#91;7] = "sieben";
	vZahlen&#91;8] = "acht";
	vZahlen&#91;9] = "neun";

	for (int i = 0; i &lt; 10; i++)
	{
		 if (vZahlen&#91;i] == szahl)
		 {
			cout &lt;&lt; "Die gesuchte Zahl lautet " &lt;&lt; i;
			return 0;
		 }
	}

	cout &lt;&lt; "Die gesuchte Zahl wurde nicht gefunden.";
}

int main()
{
	int izahl = 0;
	string szahl = "&lt;&gt;";
	cin &gt;&gt; izahl;

	if (cin)
	{
		 vektorsuche(izahl);
	}
	else
	{
		 if (!cin)
		 {
			cin.clear();
			cin &gt;&gt; szahl;
			vektorsuche(szahl);
		 }
	}
	return 0;
}</code></pre>



<h3 class="wp-block-heading">Aufgabe 6</h3>



<p class="wp-block-paragraph">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 &nbsp;vorkommt&nbsp;und beenden Sie das Programm mit einer informativen Fehlermeldung, wenn ein Name ein&nbsp;zweites Mal eingegeben wird. Geben sie die (Name, Punkte)-Paare zeilenweise aus.</p>



<pre class="wp-block-code"><code>#include &lt;vector&gt;
#include &lt;iostream&gt;
using namespace std;

int main() {
	string stmp = "&lt;&gt;";
	int itmp = 0;
	vector vNames;
	vector vScores;
	while (cin &gt;&gt; stmp &gt;&gt; itmp &amp;&amp; (stmp != "noname" || itmp != 0))
	{
		 for (int i = 0; i &lt; vNames.size(); i++)
		 {
			  if (vNames&#91;i] == stmp)
			{
					cerr &lt;&lt; "Achtung, es wurde ein Name doppelt eingegeben.\n\"" &lt;&lt; stmp &lt;&lt; "\" ist schon einmal vorhanden.\nProgramm wird nun beendet.\n";
					return 1;
			}
		 }
		 vScores.push_back(itmp);
		 vNames.push_back(stmp);
	}

	cout &lt;&lt; "Folgende Daten wurden einegegeben:\n";

	for (int i = 0; i &lt; vNames.size(); i++)
	{
		 cout &lt;&lt; vNames&#91;i] &lt;&lt; ", " &lt;&lt; vScores&#91;i] &lt;&lt; "\n";
	}
	return 0;
}</code></pre>



<h3 class="wp-block-heading">Aufgabe 7 (optional)</h3>



<p class="wp-block-paragraph">Ä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&nbsp;Wörterbuch jedes Wort nur einmal speichert und Duplikate eliminiert. Das Programm soll&nbsp;zusätzlich auch die Anzahl der Wörter insgesamt sowie die Anzahl der gefundenen Duplikate&nbsp;ausgeben. Versuchen Sie (wie immer, aber hier ganz besonders), eine möglichst elegante und&nbsp;klare Lösung zu finden.</p>



<pre class="wp-block-code"><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
using namespace std;

int main()
{
	vector  vWords;
	string temp;
	bool bdoppler = false;
	int icounter = 0;

	while (cin &gt;&gt; temp &amp;&amp; temp != "quit")
	{
		for (int i = 0; i &lt; vWords.size(); ++i)
		{
			if (temp == vWords&#91;i])
			{
				bdoppler = true;
				icounter = icounter + 1;
			}
		}

		if (bdoppler == false)
		{
			vWords.push_back(temp);
		}

	bdoppler = false;
	}

	cout &lt;&lt; "Anzahl der Woerter: " &lt;&lt; vWords.size() &lt;&lt; endl;
	cout &lt;&lt; "Anzahl der gefundenen Duplikate: " &lt;&lt; icounter &lt;&lt; endl;
	sort(vWords.begin(), vWords.end());

	for (int i = 0; i &lt; vWords.size(); ++i)
	{
		 cout &lt;&lt; vWords&#91;i] &lt;&lt; endl;
	}
}</code></pre>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/02/programmieren-algorithmen-und-datenstrukturen-1-praktikum-2/">Programmieren, Algorithmen und Datenstrukturen 1 (Praktikum 2)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2012/02/programmieren-algorithmen-und-datenstrukturen-1-praktikum-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Internetrecht (Vorlesung 10)</title>
		<link>https://maximiliankrieg.de/2011/12/internetrecht-vorlesung-10/</link>
					<comments>https://maximiliankrieg.de/2011/12/internetrecht-vorlesung-10/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Thu, 22 Dec 2011 22:24:00 +0000</pubDate>
				<category><![CDATA[Internetrecht]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1730</guid>

					<description><![CDATA[<p>Verordnung zur Einführung der Domäne oberster Stufe „.eu“: Erwägungsgründe: Artikel: US-amerikanisches Recht: § 1125(D) – CYBERPIRACY PREVENTION Fall: sexquisit.de Regeln im Online-Kauf: Fall: „ricardo.de“ Gericht&#8230;</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/internetrecht-vorlesung-10/">Internetrecht (Vorlesung 10)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Verordnung zur Einführung der Domäne oberster Stufe „.eu“:</h2>



<ul class="wp-block-list">
<li>TLD = Top Level Domain</li>



<li>Windhundverfahrens=Prioritätsprinzip</li>
</ul>



<h3 class="wp-block-heading">Erwägungsgründe:</h3>



<ul class="wp-block-list">
<li><strong>#16: </strong>2. Chance für Registrare zum Zug zu kommen &#8211; z.B.: xyz.de ist schon belegt</li>



<li><strong>#17: </strong>Verstoß gegen die öffentliche Ordnung = Radikale Namen, Aufhetzung, etc.</li>



<li><strong>#20: </strong>First come, first serve &#8211; Prioritätsprinzip</li>
</ul>



<h3 class="wp-block-heading">Artikel:</h3>



<ul class="wp-block-list">
<li><strong>Artikel 1, Absatz 1:</strong>
<ul class="wp-block-list">
<li>Bedingungen</li>



<li>Benennung eines Registers</li>



<li>allgemeine Regelungsrahmen für die Arbeit des Registers</li>
</ul>
</li>



<li><strong>Artikel 18:</strong>
<ul class="wp-block-list">
<li>Domänenname wird gesperrt nach gerichtlichem Entscheid, wenn er:
<ul class="wp-block-list">
<li>verleumderisch oder rassistisch ist</li>



<li>gegen die öffentliche Ordnung verstößt</li>
</ul>
</li>



<li>Domäne bleibt gesperrt, solange das Urteil gilt</li>
</ul>
</li>



<li><strong>Artikel 21, Absatz 1:</strong>
<ul class="wp-block-list">
<li>Widerruf eines Domänennamens, wenn er:
<ul class="wp-block-list">
<li>verwirrend ähnlich ist mit einem anderen Namen</li>



<li>identisch ist mit einem anderen Namen</li>
</ul>
</li>
</ul>
</li>



<li><strong>Artikel 21</strong>
<ul class="wp-block-list">
<li>Öffentliche Einrichtungen, Regierungen etc. haben Vorrecht auf Domänennamen</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">US-amerikanisches Recht:</h2>



<h3 class="wp-block-heading">§ 1125(D) – CYBERPIRACY PREVENTION</h3>



<ul class="wp-block-list">
<li>Markenrechtlich angelehnt</li>



<li>Bevorzugung der Gewerbetreibenden</li>



<li>Anticybersquatting = Domäne &#8222;verstopfen&#8220;</li>



<li>Unternehmen darf zivilrechtliche Klage gegen Person einleiten, wenn Person:
<ul class="wp-block-list">
<li>den Namen verwendet um Gewinn zu machen</li>



<li>unter diesem Namen Handel betreibt</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Fall: sexquisit.de</h2>



<ul class="wp-block-list">
<li>Domain seit 1999 registriert auf Unternehmen A</li>



<li>Marke seit 2002 bei Unternehmen B registriert</li>



<li>Prioritätsprinzip aufgrund vorheriger Zeit</li>
</ul>



<h2 class="wp-block-heading">Regeln im Online-Kauf:</h2>



<ol class="wp-block-list">
<li>Wählen Sie sichere Paßwörter und geben Sie diese niemals an Dritte weiter!</li>



<li>Achten Sie auf technische Sicherheit (Verschlüsselung) bei der Datenübertragung!</li>



<li>Überprüfen Sie die Seriosität des Anbieters! (Nicht immer eindeutig überprüfbar)</li>



<li>Prüfen Sie Artikelbeschreibung sowie Versan dund Lieferbedingungen!</li>



<li>Wählen Sie sichere Zahlungsmethoden, Bargeld-Transferservices sind nicht geeignet!</li>



<li>Achten Sie auf Ihr Widerrufs- oder Rückgaberecht bei gewerblichen Anbietern!</li>



<li>Schützen Sie sich vor „Datenklau“!</li>
</ol>



<h2 class="wp-block-heading">Fall: „ricardo.de“</h2>



<ul class="wp-block-list">
<li>Deutsche Auktionsseite</li>



<li>Student kauft Autos im Auslang</li>



<li>Studen verkauft Autos im Inland</li>



<li>Gemäß AGBs ist er Versteigerer, Erstnutzer, Verkäufer und Offerent</li>



<li>Gemäß AGBs ist der potentielle Käufer Ersteigerer, Zweitnutzer, Käufer und Annehmender</li>



<li>Käufer ersteigert für 26.500€ (Neu 52.000€)</li>



<li>Verkäufer verweigert die Herausgabe</li>
</ul>



<h3 class="wp-block-heading">Gericht</h3>



<ul class="wp-block-list">
<li>LG Münster sagt, dass der Verkäufer recht hat</li>



<li>OLG Hamm sagt, dass der Käufer recht hat</li>



<li>BGH sagt, dass Käufer recht hat</li>
</ul>



<h3 class="wp-block-heading">Unterschied zu realen Auktionshäusern:</h3>



<ul class="wp-block-list">
<li>Bieter und Auktionator stehen sich nicht gegenüber</li>



<li>Kein tatsächlicher Auktionator, der den Zuschlag durchführt</li>



<li>ricardo.de nicht als Auktionshaus angemeldet</li>
</ul>



<h2 class="wp-block-heading">Willenserklärungen:</h2>



<ul class="wp-block-list">
<li><strong>empfangsbedürftig:</strong> Partner muss informiert werden</li>



<li><strong>nicht empfangsbedürftig:</strong> Partner muss nicht informiert werden</li>



<li><strong>körperlos</strong>
<ul class="wp-block-list">
<li>Sprache</li>



<li>Internet</li>



<li>Beides verschwindet sobald das Medium erlischt</li>
</ul>
</li>
</ul>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/internetrecht-vorlesung-10/">Internetrecht (Vorlesung 10)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2011/12/internetrecht-vorlesung-10/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Rechnerarchitektur (Praktikum 6)</title>
		<link>https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-6/</link>
					<comments>https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-6/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Thu, 22 Dec 2011 21:06:00 +0000</pubDate>
				<category><![CDATA[Rechnerarchitektur]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1574</guid>

					<description><![CDATA[<p>Ziele: Algorithmen in Assemblerprogramme mit möglichst geringer Codegröße umzusetzen, sowie der&#160;Umgang Debugger und Simulator. Arbeitsverzeichnis: Kopieren Sie sich das Verzeichnis, welches Ihnen im Praktikum zur&#8230;</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-6/">Rechnerarchitektur (Praktikum 6)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Ziele:</h2>



<p class="wp-block-paragraph">Algorithmen in Assemblerprogramme mit möglichst geringer Codegröße umzusetzen, sowie der&nbsp;Umgang Debugger und Simulator.</p>



<h2 class="wp-block-heading">Arbeitsverzeichnis:</h2>



<p class="wp-block-paragraph">Kopieren Sie sich das Verzeichnis, welches Ihnen im Praktikum zur Verfügung gestellt wird, in Ihr&nbsp;persönliches Verzeichnis. Dort stehen Ihnen dann alle benötigten Dateien zur Verfügung.</p>



<h2 class="wp-block-heading">Vorbereitung</h2>



<p class="wp-block-paragraph">Überlegen Sie sich ein Unterprogramm (Funktion), welches eine Zeichenkette in einem Text suchen soll.&nbsp;Die Funktion bekommt die Anfangsadresse des zu durchsuchenden Textes und die Anfangsadresse der&nbsp;zu suchenden Zeichenkette in den Registern R0 und R1 übergeben. Im Register R0 soll zurückgegeben&nbsp;werden , wie oft die zu suchende Zeichenkette im Text gefunden wurde. Bei einer leeren zu suchenden&nbsp;Zeichenkette liefert &nbsp;die Funktion den Wert 0 zurück. Handelt es sich bei dem zu durchsuchenden Text&nbsp;um eine leere Zeichenkette, so liefert die Funktion den Wert 0 zurück.</p>



<h2 class="wp-block-heading">Mögliche Aufrufe:</h2>



<pre class="wp-block-code"><code>int searchStringInString(char*, char*);

int main (void)
{
int Anzahl;
char* Text="hallo Alles klar?";
char* Suchstring="ll";
char* Leerstring=““;
Anzahl = searchStringInString(Text, Suchstring);
Anzahl = searchStringInString(Text, Leersrtring);
Anzahl = searchStringInString(Leerstring, Suchstring);
Anzahl = searchStringInString(Leerstring, Leerstring);
return 0;
}</code></pre>



<p class="wp-block-paragraph">Überlegen Sie sich noch weitere Testfälle</p>



<h2 class="wp-block-heading">Aufgabe 1:</h2>



<p class="wp-block-paragraph">Schreiben Sie Ihr Programm und testen es bevor Sie es im Praktikum vorführen.</p>



<pre class="wp-block-code"><code>.file "searchStringInString.s"
.text
.align 2
.global searchStringInString
.type searchStringInString, %function
searchStringInString:
..
..
..</code></pre>



<h2 class="wp-block-heading">Lösung 1</h2>



<pre class="wp-block-code"><code>@ in R0 wird die Adresse des zu durchsuchenden Text erwartet.
@ in R1 wird die Adresse des zu suchendenn Text erwartet.
@ sollte R0 auf einen leeren String zeigen,
@ oder der gesuchte Text nicht gefunden werden,
@ so wird in R0 der Wert 0 zurueck geliefert.
@ zeigt R1 auf einen leeren String so wird in R0 der Wert 0 zurueck gegeben

.file "searchStringInString.S"
.text
.align 2
.global searchStringInString
.type searchStringInString, %function

searchStringInString:

stmfd sp!, {r4,r5,lr}

mov r4, r0 // Neues Register für den zu durchsuchenden Text

ldr r5,&#91;r0]
cmp r5,#0x0
mov r0,#0x0 // Zähler auf 0 setzen
ldmeqfd sp!, {r4,r5,pc}

mov r3, r1 // Neues Register für den zu suchenden Text
mov r5, r3 // Sicherung der Adresse des zu suchenden Textes

//ldrb r1,&#91;r3]
loop: // Schleife

LDRB r2, &#91;r4],#1 // Erstes bzw. nächstes Zeichen des zu durchsuchenden Strings laden

CMP r1,r2 // Vergleich zu suchendes Zeichen = Zeichen in Zeichenkette
LDREQB r1, &#91;r3],#1 // Wenn r1=r2 dann nächstes zu suchendes Zeichen laden

CMP r1,#0x0 // Vergleich ob r1 das letzte Zeichen war
ADDEQ r0,#0x1 // Zähler um 1 erhöhen
MOVEQ r3, r5 // r1 zurücksetzen

CMP r3, r5
LDREQB r1, &#91;r3],#1

CMP r2, #0x0 // Prüfen ob r2 das letzte Zeichen war

BNE loop // Schleifenaufruf, wenn r2 nicht fertig ist

ldmfd sp!, {r4,r5,pc}

.size searchStringInString, .-searchStringInString</code></pre>



<h2 class="wp-block-heading">Zusatzaufgabe:</h2>



<p class="wp-block-paragraph">Überlegen Sie sich ein Unterprogramm (Funktion), welches eine Zeichenkette in einem Text suchen soll.&nbsp;Die Funktion bekommt die Anfangsadresse des zu durchsuchenden Textes und die Anfangsadresse der&nbsp;zu suchenden Zeichenkette in den Registern R0 und R1 übergeben. Im Register R0 soll zurückgegeben&nbsp;werden , wie oft die zu suchende Zeichenkette im Text gefunden wurde. Bei einer leeren zu suchenden&nbsp;Zeichenkette liefert die Funktion die Länge des zu durchsuchenden Text zurück. Handelt es sich bei dem zu durchsuchenden Text um eine leere Zeichenkette, so liefert die Funktion den Wert 0 zurück.</p>



<h2 class="wp-block-heading">Lösung Zusatzaufgabe</h2>



<pre class="wp-block-code"><code>@ in R0 wird die Adresse des zu durchsuchenden Text erwartet.
@ in R1 wird die Adresse des zu suchendenn Text erwartet.
@ sollte R0 auf einen leeren String zeigen,
@ oder der gesuchte Text nicht gefunden werden,
@ so wird in R0 der Wert 0 zurueck geliefert.
@ zeigt R1 auf einen leeren String so wird in R0 der Wert 0 zurueck gegeben

.file "searchStringInString.S"
.text
.align 2
.global searchStringInString
.type searchStringInString, %function

searchStringInString:

stmfd sp!, {r4,r5,lr}

mov r4, r0 // Neues Register für den zu durchsuchenden Text

ldr r5,&#91;r0]
cmp r5,#0x0
mov r0,#0x0 // Zähler auf 0 setzen
ldmeqfd sp!, {r4,r5,pc}

mov r3, r1 // Neues Register für den zu suchenden Text
mov r5, r3 // Sicherung der Adresse des zu suchenden Textes

loop: // Schleife

LDRB r2, &#91;r4],#1 // Erstes bzw. nächstes Zeichen des zu durchsuchenden Strings laden

CMP r1,r2 // Vergleich zu suchendes Zeichen = Zeichen in Zeichenkette
LDREQB r1, &#91;r3],#1 // Wenn r1=r2 dann nächstes zu suchendes Zeichen laden

CMP r1,#0x0 // Vergleich ob r1 das letzte Zeichen war
ADDEQ r0,#0x1 // Zähler um 1 erhöhen
MOVEQ r3, r5 // r1 zurücksetzen

CMP r3, r5
LDREQB r1, &#91;r3],#1

CMP r2, #0x0 // Prüfen ob r2 das letzte Zeichen war

BNE loop // Schleifenaufruf, wenn r2 nicht fertig ist

ldmfd sp!, {r4,r5,pc}

.size searchStringInString, .-searchStringInString</code></pre>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-6/">Rechnerarchitektur (Praktikum 6)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Netzwerke (Vorlesung 10)</title>
		<link>https://maximiliankrieg.de/2011/12/netzwerke-vorlesung-10/</link>
					<comments>https://maximiliankrieg.de/2011/12/netzwerke-vorlesung-10/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Tue, 20 Dec 2011 00:00:00 +0000</pubDate>
				<category><![CDATA[Netzwerke]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1779</guid>

					<description><![CDATA[<p>Routing Tabelle Leistungsmerkmale Dynamisches Routing Kosten Distance Vector Algorithmus</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/netzwerke-vorlesung-10/">Netzwerke (Vorlesung 10)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Routing Tabelle</h2>



<ul class="wp-block-list">
<li>Router interessiert nur der Netzteil</li>
</ul>



<h2 class="wp-block-heading">Leistungsmerkmale</h2>



<ul class="wp-block-list">
<li>Leistungsrate(engl. Line Rate) = Paketgröße * pps(Paketpro Sekunde)</li>



<li>Hersteller verwenden verschiedene Paketgröße</li>
</ul>



<h2 class="wp-block-heading">Dynamisches Routing</h2>



<ul class="wp-block-list">
<li>Lastverteilung</li>



<li>Redundanz</li>



<li>Router informieren nächsten Hop über Änderungen</li>
</ul>



<h2 class="wp-block-heading">Kosten</h2>



<ul class="wp-block-list">
<li>HopCount = Primär genutzt</li>
</ul>



<h2 class="wp-block-heading">Distance Vector Algorithmus</h2>



<ul class="wp-block-list">
<li>Konvergiert = Alle kennen alle Routen</li>
</ul>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/netzwerke-vorlesung-10/">Netzwerke (Vorlesung 10)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2011/12/netzwerke-vorlesung-10/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Internetrecht (Vorlesung 9)</title>
		<link>https://maximiliankrieg.de/2011/12/internetrecht-vorlesung-9/</link>
					<comments>https://maximiliankrieg.de/2011/12/internetrecht-vorlesung-9/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Thu, 15 Dec 2011 22:19:00 +0000</pubDate>
				<category><![CDATA[Internetrecht]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1728</guid>

					<description><![CDATA[<p>HGB (Ausschließlichkeit der Firma) BGB (SCHADENSERSATZPFLICHT) Fall: Shell.de BGB &#160;PRIORITÄTSPRINZIP LÖSUNG Fall: Weideglück Unlauterer Wettbewerb (UWG) Prioritätsprinzip</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/internetrecht-vorlesung-9/">Internetrecht (Vorlesung 9)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">HGB (Ausschließlichkeit der Firma)</h2>



<ul class="wp-block-list">
<li><strong>§30, Absatz 1:</strong>
<ul class="wp-block-list">
<li>Alle am selben Ort/Gemeinde liegenden Firmen müssen sich deutlich unterscheiden</li>
</ul>
</li>



<li><strong>§30, Absatz 2:</strong>
<ul class="wp-block-list">
<li>Wer zuerst eingetragen wird hat den Vorrang.</li>



<li>Alle Nachzügler müssen einen Zusatz zur Firma wählen, der sich deutlich unterscheidet</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">BGB (SCHADENSERSATZPFLICHT)</h2>



<ul class="wp-block-list">
<li><strong>§823, Absatz 1:</strong>
<ul class="wp-block-list">
<li>Bei vorsätzlichem oder fahrlässigem Handeln das Leben, den Körper, die gesundheit, die Freiheit, das Eigentum oder das Recht verletzt ist Schadensersatzpflichtig.</li>



<li><strong>Rechte:</strong>
<ul class="wp-block-list">
<li>Eigentumsähnliche Rechte</li>



<li>Besitz</li>



<li>Allgemeine Persönlichkeitsrechte</li>



<li>Recht am eingerichteten und ausgeübten Gewerbebetrieb</li>
</ul>
</li>
</ul>
</li>



<li><strong>§823, Absatz 2:</strong>
<ul class="wp-block-list">
<li>Betrifft den Fall, dass jemand gegen ein Gesetz verstößt, welches dieses schützt</li>
</ul>
</li>



<li><strong>§826: </strong>
<ul class="wp-block-list">
<li>Sittenwidrige Schadensersatzpflicht</li>



<li>Gilt, wenn jemand gegen die guten Sitten und vorsätzlich Schaden zufügt</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Fall: Shell.de</h2>



<h3 class="wp-block-heading">BGB</h3>



<ul class="wp-block-list">
<li><strong>§823:</strong>
<ul class="wp-block-list">
<li>Domäne ist kein Eigentum (Rechtsgut)</li>



<li>Sonstiges Gesetz (möglicher Einstieg)</li>
</ul>
</li>



<li><strong>§826:</strong>
<ul class="wp-block-list">
<li>Nicht sittenwidrig</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">&nbsp;PRIORITÄTSPRINZIP</h3>



<ul class="wp-block-list">
<li>Herr Shell war zuerst da, greift somit nicht</li>
</ul>



<h3 class="wp-block-heading">LÖSUNG</h3>



<ul class="wp-block-list">
<li>Wenn mehrere Berechtigte zusammen kommen, muss abgewogen werden, wer ein größeres Interesse und größeren Bekanntheitsgrad hat, kann/darf/muss der bisherige Domain-Inhaber sich einen Zusatz in der Domain zulegen.</li>
</ul>



<h2 class="wp-block-heading">Fall: Weideglück</h2>



<ul class="wp-block-list">
<li>Domäne vergeben an jemanden, der nicht Weideglück heißt</li>



<li>Molkerei Weideglück verlangt die Domäne</li>



<li>Anklage wegen Namensraub und Schädigungsabsicht</li>



<li>Domäne musste abgetreten werden</li>
</ul>



<h2 class="wp-block-heading">Unlauterer Wettbewerb (UWG)</h2>



<ul class="wp-block-list">
<li><strong>§4 &#8211; Beispiele:</strong>
<ul class="wp-block-list">
<li>Geschäftliche Unerfahrenheit von Kindern und Jugendlichen ausnutzen</li>



<li>Angst oder Zwangslage von Benutzern ausnutzen</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Prioritätsprinzip</h2>



<ul class="wp-block-list">
<li>Wer zuerst kommt, mahlt zuerst</li>
</ul>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/internetrecht-vorlesung-9/">Internetrecht (Vorlesung 9)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2011/12/internetrecht-vorlesung-9/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Netzwerke (Vorlesung 9)</title>
		<link>https://maximiliankrieg.de/2011/12/netzwerke-vorlesung-9/</link>
					<comments>https://maximiliankrieg.de/2011/12/netzwerke-vorlesung-9/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Mon, 12 Dec 2011 23:52:00 +0000</pubDate>
				<category><![CDATA[Netzwerke]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1777</guid>

					<description><![CDATA[<p>Spanning Tree Port-States Forwarding BlockingKeine Traffiweiterleitung, Lese BPDUs ListeningKeine Traffiweiterleitung, Lese und Sende BPDUs Learning Disabled Internetworking</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/netzwerke-vorlesung-9/">Netzwerke (Vorlesung 9)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Spanning Tree</h2>



<ol class="wp-block-list">
<li>..</li>



<li>..</li>



<li>Designierte Bridge für jedes LAN Segment festlegen</li>
</ol>



<h2 class="wp-block-heading">Port-States</h2>



<p class="wp-block-paragraph">Forwarding</p>



<p class="wp-block-paragraph">BlockingKeine Traffiweiterleitung, Lese BPDUs</p>



<p class="wp-block-paragraph">ListeningKeine Traffiweiterleitung, Lese und Sende BPDUs</p>



<p class="wp-block-paragraph">Learning</p>



<p class="wp-block-paragraph">Disabled</p>



<h2 class="wp-block-heading">Internetworking</h2>



<ul class="wp-block-list">
<li>Wenn Paket zu Groß und Fragmentieren = 0, dann wird Paket verworfen und ICMP-Nachricht informiert Sender darüber</li>
</ul>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/netzwerke-vorlesung-9/">Netzwerke (Vorlesung 9)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2011/12/netzwerke-vorlesung-9/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Internetrecht (Vorlesung 8)</title>
		<link>https://maximiliankrieg.de/2011/12/internetrecht-vorlesung-8/</link>
					<comments>https://maximiliankrieg.de/2011/12/internetrecht-vorlesung-8/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Thu, 08 Dec 2011 22:16:00 +0000</pubDate>
				<category><![CDATA[Internetrecht]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1726</guid>

					<description><![CDATA[<p>Fall: Shell.de MarkenG Domänenrecht Kennzeichenrecht (Gewerblicher Rechtsschutz) &#160;GEWERBLICHE KENNZEICHEN Marke MarkenG Fall: Champagner.de Handelsgesetzbuch (HGB)</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/internetrecht-vorlesung-8/">Internetrecht (Vorlesung 8)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Fall: Shell.de</h2>



<h3 class="wp-block-heading">MarkenG</h3>



<ul class="wp-block-list">
<li><strong>§14 Abs. 2:</strong>
<ol class="wp-block-list">
<li>Keine Marken/Produktpiraterie, weil kein Logo, andere Produkte bzw. Dienstleistung</li>



<li>Keine Verwechslungsgefahr, weil kein ähnliches Logo verwendet wird bzw. das Zeichen nur für Mineralöl geschützt ist</li>



<li>Im Inland bekannt, kein ähnliches Zeichen (unterschiedliche Bereiche), aber keine ungerechtfertigte Ausnutzung bzw. Beeinträchtigung</li>
</ol>
</li>



<li><strong>§15 Abs. 2:</strong>
<ul class="wp-block-list">
<li>Kein unbegründet/unlauterer Zweck durch Namensverwendung (Er heißt so)</li>
</ul>
</li>



<li><strong>§15 Abs. 3:</strong>
<ul class="wp-block-list">
<li>Kein unbegründet/unlauterer Zweck durch Namensverwendung (Er heißt so)</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Domänenrecht</h2>



<h3 class="wp-block-heading">Kennzeichenrecht (Gewerblicher Rechtsschutz)</h3>



<ul class="wp-block-list">
<li><strong>Beispiel:</strong>
<ul class="wp-block-list">
<li>Kampf Samsung vs. Apple &#8211; Geschmacksmuster</li>
</ul>
</li>



<li><strong>Bereiche</strong>
<ul class="wp-block-list">
<li>Patente &#8211; Neuheit, Erfindungshöhse, gewerblich Anwendbar</li>



<li>Marken &#8211; Unterscheidungskraft, Name, Slogans, Symbol</li>



<li>Gebrauchsmuster &#8211; Neuheit, Erfindungshöhse, gewerblich Anwendbar</li>



<li>Geschmacksmuster &#8211; Neuheit und Eigenart, Design</li>
</ul>
</li>



<li><strong>Schutz des geistig-gewerblichen Eigentums</strong>
<ul class="wp-block-list">
<li>Unterlassung</li>



<li>Schadensersatz</li>
</ul>
</li>



<li><strong>Sonderschutzrechte</strong>
<ul class="wp-block-list">
<li>Urheberrecht: Persönliche Geistesschöpfung (Werk) &#8211; Automatisch in Deutschland zugewiesen</li>



<li>Patent: technische Leistung (Erfindung)</li>



<li>Gebrauchsmuster: technische Leistung (Erfindung)</li>



<li>Geschmacksmuster:ästhetische Leistung (Muster/Modell)</li>



<li>Kennzeichnungsrechte: Marketingleistung (Kennzeichen)</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">&nbsp;GEWERBLICHE KENNZEICHEN</h3>



<ul class="wp-block-list">
<li><strong>Arten:</strong>
<ul class="wp-block-list">
<li>Waren- oder Dienstleistungsbezeichnung:
<ul class="wp-block-list">
<li>Eingetragene Marken (MarkenG §4 Nr. 1)</li>



<li>Benutzte Marken (MarkenG §4 Nr. 2)</li>



<li>Notorisch bekannte Marke (MarkenG §4 Nr. 3)</li>
</ul>
</li>



<li>Unternehmensbezeichnung:
<ul class="wp-block-list">
<li>Name/Firma (HGB §12 BGB/§§ 17 ff.)</li>
</ul>
</li>
</ul>
</li>



<li><strong>Geschäftliche Bezeichnungen:</strong>
<ul class="wp-block-list">
<li>Unternehmenskennzeichen:
<ul class="wp-block-list">
<li>Name des Unternehmens (Deutsche Shell AG)</li>



<li>Firmenschlagwörter (Shell)</li>



<li>Prägender Bestandteil der Firma</li>
</ul>
</li>



<li>Werktitel:
<ul class="wp-block-list">
<li>Büchername</li>



<li>Filme</li>



<li>Musiktitel</li>



<li>Musicals</li>



<li>Theaterstück</li>
</ul>
</li>
</ul>
</li>



<li><strong>Förmliche Rechte</strong>
<ul class="wp-block-list">
<li>Materielle Voraussetzung &amp; formelles Verfahren beim Amt
<ul class="wp-block-list">
<li>Patent</li>



<li>Gebrauchsmuster</li>



<li>Geschmacksmuster</li>



<li>Eingetragene Marke</li>



<li>Nur neue Dinge erlaubt</li>
</ul>
</li>
</ul>
</li>



<li><strong>Sachliche Rechte </strong>
<ul class="wp-block-list">
<li>Materielle Voraussetzung, aber kein formelles Verfahren
<ul class="wp-block-list">
<li>Urheberrecht (automatische Entstehung)</li>



<li>Benutzte Marke (Erlangung durch Verkehrsgeltung/Bekanntheit)
<ul class="wp-block-list">
<li>Probleme beim Nachweis auf offizielle Existanz</li>
</ul>
</li>



<li>Unternehmenskennzeichen</li>



<li>Werktitel</li>



<li>Geschäftsabzeichen</li>
</ul>
</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">Marke</h3>



<ul class="wp-block-list">
<li><strong>Funktion</strong>
<ul class="wp-block-list">
<li>Adressfunktion</li>



<li>Marktdurchsetzung und Unterscheidung</li>



<li>Schutz vor anderen Unternehmen</li>



<li>Werbung</li>



<li>Herkunft</li>



<li>Garantie</li>



<li>usw..</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">MarkenG</h3>



<ul class="wp-block-list">
<li><strong>§4: Entstehung des Markenschutzes</strong>
<ul class="wp-block-list">
<li><strong>Benutzungsmarke:</strong>
<ul class="wp-block-list">
<li>Benutzung mit Verkehrsgeltung</li>



<li>Bei Problemen gilt Alter und Bekanntheitsgrad</li>
</ul>
</li>



<li><strong>Notorische Marke:</strong>
<ul class="wp-block-list">
<li>notorische Bekanntheit</li>



<li>International Anerkannt</li>



<li>Muss nicht überall angemeldet werden | Ca, Tesa, Tempo)</li>
</ul>
</li>



<li><strong>Eintragungsmarke:</strong>
<ul class="wp-block-list">
<li>Eintragung beim Amt</li>



<li>Wer zuerst kommt malt zuerst</li>
</ul>
</li>
</ul>
</li>



<li><strong>§14: Ausschließliches Recht des Inhabers einer Marke</strong>
<ul class="wp-block-list">
<li>Niemand darf ohne Erlaubnis Marke mitbenutzen</li>



<li>Unterlassungsanspruch</li>



<li>Schadensersatzanspruch</li>
</ul>
</li>



<li><strong>§14, Absatz 2:</strong>
<ul class="wp-block-list">
<li>Dritten ist es untersagt ohne Zustimmung des Markeninhabers diese im geschäftlichen Bereich zu verwenden
<ol class="wp-block-list">
<li><strong>Identitätsschutz:</strong> Schutz vor Verletzung der Marke durch identisches geschütztes Zeichen/Namen (Marken-/Produktpiraterie)</li>



<li><strong>Verwechslungsschutz:</strong> Verwendung eines Zeichens, dass so ähnlich ist, dass man die Unternehmen gleichsetzt oder verwechselt (Stärke des Namens/Bekanntheit durch Gericht zu urteilen)</li>



<li><strong>Bekanntheitsschutz:</strong> Verwendung eines ähnlichen Zeichens, das nicht geschützt ist, aber Inland bekannt ist und die Bekanntheit in unlauterer Weise ausnutzt oder beeinträchtigt</li>
</ol>
</li>
</ul>
</li>



<li><strong>§15, Absatz 1: (Ausschließlichkeitsrecht)</strong>
<ul class="wp-block-list">
<li>Erwerb des Schutzes einer geschäftlichen Bezeichnung gewährt ihrem Inhaber ein ausschließliches Recht</li>
</ul>
</li>



<li><strong>§15, Absatz 2: (Unterlassungsanspruch)</strong>
<ul class="wp-block-list">
<li>Dritten ist es untersagt die geschäftliche Bezeichnung oder ähnliches Zeichen im geschäftlichen Verkehr unbefugt zu benutzen, die geeignet ist Verwechslungen mit der geschützten Bezeichnung hervorzurufen</li>
</ul>
</li>



<li><strong>§15, Absatz 3: (Schadensersatzanspruch)</strong>
<ul class="wp-block-list">
<li>Im Inland bekannt, geschäftliche Bezeichnung oder ähnliches Zeichen verwendend, Absatz 2 greift nicht, Ausnutzung/Benutzung ohne rechtfertigenden Grund auf unlautere Weise ausnutzt oder beeinträchtigt</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">Fall: Champagner.de</h3>



<ol class="wp-block-list">
<li>Private, nicht-gewerbliche Seite von Deutschen: champagner.de</li>



<li>Franzosen aus der Champagne klagen vor deutschen Gerichten gegen den Namen</li>



<li>Markenrecht greift somit nicht weil sie nicht-gewerblich ist</li>



<li>Keine Schädigung, da die Seite eher positive Werbung erzeugt hat</li>
</ol>



<h3 class="wp-block-heading">Handelsgesetzbuch (HGB)</h3>



<ul class="wp-block-list">
<li><strong>Formen der Firma:</strong>
<ul class="wp-block-list">
<li>Einzelfirma &#8211; &#8222;Vorname+Nachname..e. Kfm&#8220;</li>



<li>Gesellschaftsfirma &#8211; &#8222;Vorname+Nachname..GmbH&#8220;</li>



<li>Personenforma &#8211; &#8222;Vorname+Nachname e. Kfm&#8220;</li>



<li>Sachfirma &#8211; &#8222;Deutsche Telekom AG&#8220;</li>



<li>Mischfirma &#8211; &#8222;Darmstadter Schreibwaren Vorname+Nachname GmbH&#8220;</li>



<li>Phantasiefirma &#8211; &#8222;XYZ GmbH&#8220;</li>
</ul>
</li>



<li><strong>Funktionen der Firma</strong>
<ul class="wp-block-list">
<li>Kennzeichnung &#8211; Identifizieren und Unterscheidung</li>



<li>Auskunft &#8211; Informationen über Unternehmensträger und Inhalte der Firma usw. (&#8222;Spielwarenladen&#8220;)</li>



<li>Werbung &#8211; Aussagekräftig Firma wirbt für Unternehmen</li>



<li>Wertträger &#8211; &#8230;</li>
</ul>
</li>



<li><strong>§1, Abs. 1: (Kaufmann kraft Betätigung)</strong>
<ul class="wp-block-list">
<li>Kaufmann ist der, wer ein Handelsgewerbe betreibt</li>
</ul>
</li>



<li><strong>§17, Absatz 1: (Begriff der Firma)</strong>
<ul class="wp-block-list">
<li>Firma eines Kaufmanns ist der Name eines Unternehmens, unter dem er die Geschäfte betreibt und die Unterschrift abgibt</li>
</ul>
</li>



<li><strong>§17, Absatz 2:</strong>
<ul class="wp-block-list">
<li>Kaufmann kann unter der Firma klagen und verklagt werden</li>
</ul>
</li>



<li><strong>§18, Absatz 1: (Grundsätze der Firmenbildung)</strong>
<ul class="wp-block-list">
<li>Muss Unterscheidungskraft besitzen</li>



<li>Eignung zur Kennzeichnung des Kaufmanns vorausgesetzt</li>



<li>Darf nicht wie eine Branche heißen (Grenzfall: Software AG)</li>
</ul>
</li>



<li><strong>§18, Absatz 2:</strong>
<ul class="wp-block-list">
<li>Gesellschaftszusatz muss stimmen (GmbH darf sich nicht AG nennen)</li>



<li>Darf keinen Geschäftszweck publizieren, den man nicht bedient (Bäcker, der sich Tankstelle nennt)</li>
</ul>
</li>
</ul>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/internetrecht-vorlesung-8/">Internetrecht (Vorlesung 8)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2011/12/internetrecht-vorlesung-8/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Rechnerarchitektur (Praktikum 5)</title>
		<link>https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-5/</link>
					<comments>https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-5/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Wed, 07 Dec 2011 20:43:00 +0000</pubDate>
				<category><![CDATA[Rechnerarchitektur]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1569</guid>

					<description><![CDATA[<p>Ziele: Verständnis für STACK Befehle und deren Nutzung bei Unterprogrammen. Ziel ist es Programme mit&#160;möglichst geringer Codegröße zu implementieren, sowie der Umgang mit einem Debugger/Simulator.&#8230;</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-5/">Rechnerarchitektur (Praktikum 5)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Ziele:</h2>



<p class="wp-block-paragraph">Verständnis für STACK Befehle und deren Nutzung bei Unterprogrammen. Ziel ist es Programme mit&nbsp;möglichst geringer Codegröße zu implementieren, sowie der Umgang mit einem Debugger/Simulator.</p>



<h2 class="wp-block-heading">Arbeitsverzeichnis:</h2>



<p class="wp-block-paragraph">Kopieren Sie sich das Verzeichnis, welches Ihnen im Praktikum zur Verfügung gestellt wird, in Ihr&nbsp;persönliches Verzeichnis. Dort stehen Ihnen dann alle benötigten Dateien zur Verfügung.</p>



<h2 class="wp-block-heading">Vorbereitung</h2>



<p class="wp-block-paragraph">Arbeiten Sie sich in folgende Befehle des ARM-Prozessors und in den ARM Procedure Call Standard&nbsp;(APCS) ein:</p>



<p class="wp-block-paragraph">Instruktion := Bedeutung<br>STMFD R13, {R1-R4, LR} := Speichert die Registerwerte R1 bis R4 sowie LR&nbsp;(=R14) an die Adresse, die in R13 (=SP) steht, als&nbsp;voll absteigender Stack</p>



<p class="wp-block-paragraph">LDMFD R13, {R1-R4, PC} := Lädt den Speicherinhalt von der Adresse, die in&nbsp;R13 (=SP) steht, in Form eines voll absteigenden&nbsp;Stacks in die Register R1 bis R4 sowie PC (=R15)</p>



<h2 class="wp-block-heading">Aufgabe 1:</h2>



<p class="wp-block-paragraph">In folgenden Tabellen ist jeweils ein Speicherauszug gezeigt. Welche Werte stehen in den Registern&nbsp;nach Ausführung des Blocktransferbefehls? R9 = 0x8000</p>



<pre class="wp-block-code"><code>LDMDA R9, {R1, R2, R6}
R1: 4
R2: 5
R6: 6

LDMFD R9, {R1, R2, R6}
R1: 6
R2: 7
R6: 8</code></pre>



<pre class="wp-block-code"><code>// Aufgabe 1: Blocktransferbefehle"
// Name: Matrikelnummer: 
// Datum: 

.file "aufgabe1.S"
.text @ legt eine Textsection fuer PrgrammCode + Konstanten an
.align 2 @ sorgt dafuer, dass nachfolgende Anweisungen auf einer durch 4 teilbaren Adresse liegen
@ unteren 2 Bit sind 0
.global main @ nimmt das Symbol main in die globale Sysmboltabelle auf
.type main,function
main:
stmfd sp!, {r6, r9, lr}
ldr r9, =0x8000

ldmda r9, {r1, r2, r6}
ldmfd r9, {r1, r2, r6}

ldmfd sp!, {r6, r9, pc}
.Lfe1:
.size main,.Lfe1-main

// End of File</code></pre>



<h2 class="wp-block-heading">Aufgabe 2:</h2>



<p class="wp-block-paragraph">Schreiben Sie ein beliebiges, kleines Programm in ARM Assembler, das durch&nbsp;Unterprogramme strukturiert wird. Folgende Anforderungen werden an das Programm&nbsp;gestellt:</p>



<ul class="wp-block-list">
<li>Die APCS Konvention wird eingehalten</li>



<li>Das Programm benutzt (mindestens) drei Unterprogramme (UP):
<ul class="wp-block-list">
<li>UP1 benutzt nur Scratchregister und stellt keine Blattroutine dar (ruft somit weitere Unterprogramme auf)</li>



<li>UP2 benutzt nur Scratchregister und stellt eine Blattroutine dar (ruft somit keine weiteren Unterprogramme auf)</li>



<li>UP3 benutzt Nicht-Scratchregister und stellt keine Blattroutine dar</li>
</ul>
</li>
</ul>



<pre class="wp-block-code"><code>// Befehle = 19, Programmgröße = 19*4 Byte= 76 Byte
.file "aufgabe2.S"
.text @ legt eine Textsection fuer PrgrammCode + Konstanten an
.align 2 @ sorgt dafuer, dass nachfolgende Anweisungen auf einer durch 4 teilbaren
Adresse liegen
@ unteren 2 Bit sind 0
.global main @ nimmt das Symbol main in die globale Sysmboltabelle auf
.type main,function
main: // 5 Befehle
push {lr}
bl up1 // Unterprogramm 1 aufrufen
bl up2 // Unterprogramm 2 aufrufen
bl up3 // Unterprogramm 3 aufrufen
pop {pc}

// UP1 benutzt nur Scratchregister und stellt keine Blattroutine dar (ruft somit weitere Unterprogramme auf
up1: // 7 Befehle
push {lr}
MOV r0, #0x0 // r0=0
MOV r1, #0x1 // r1=1
bl up2 // Unterprogramm 2 aufrufen
MOV r1,#0x2
bl up2 // Unterprogramm 2 aufrufen
pop {pc}

// UP2 benutzt nur Scratchregister und stellt eine Blattroutine dar (ruft somit keine weiteren Unterprogramme auf)
up2: // 3 Befehle
push {lr}
ADD R0, R0, R1 // r0 und r1 addieren, Ergebnis nach r0 schreiben
pop {pc}

//UP3 benutzt Nicht-Scratchregister und stellt keine Blattroutine dar (ruft somit weitere Unterprogramme auf)
up3: // 4 Befehle
stmfd sp!, {r4, lr} // r4 und lr sichern
ADD r4, r4, #0x1 // r4 um 1 erhöhen
bl up2 // Unterprogramm 2 aufrufen
ldmfd sp!, {r4, pc} // r4 und lr -&gt; pc zurück laden

.Lfe1:
.size main,.Lfe1-main

// End of File
</code></pre>



<h2 class="wp-block-heading">Aufgabe 3:</h2>



<p class="wp-block-paragraph">Schreiben Sie das Programmbeispiel aus Termin 2 (selbst modifizierender Code )in ARM7-Assembler und testen Sie dieses. Beobachten Sie die sich ändernden Speicherstellen/Befehle.&nbsp;Beschäftigen Sie sich mit den Problemen, welches dieses Programm machen kann.</p>



<p class="wp-block-paragraph"><strong>Warum funktioniert das Programm im Simulator?</strong></p>



<ul class="wp-block-list">
<li>Das Programm funktioniert, da innerhalb des Simulators alle Programme im RAM stehen.</li>
</ul>



<p class="wp-block-paragraph"><strong>Wie groß dürfte die Werteliste werden?</strong></p>



<pre class="wp-block-code"><code>// Befehle = 16, Programmgröße = 16*4 Byte = 64 Byte

.file "aufgabe3.S"
.text @ legt eine Textsection fuer PrgrammCode + Konstanten an
.align 2 @ sorgt dafuer, dass nachfolgende Anweisungen auf einer durch 4 teilbaren
Adresse liegen
@ unteren 2 Bit sind 0
.global main @ nimmt das Symbol main in die globale Sysmboltabelle auf
.type main,function
main:

loop:
ADR r0, Total // Accumulate total
LDR r1, &#91;r0]

Add_instr: // Add_instr

ADR r2, Table
LDR r3, &#91;r2],#4

add r5, r1, r3 // Speichere r3 + r1 in r5
str r5, Total // Speichere r5 unter „Total“

LDR r3, Add_instr
add r3, r3,#4 //Speichere r3 + 4 in r3
str r3, Add_instr // Speichere r3 unter „Add_instr“

ldr r6, Count
subs r6,r6,#1 // Speichere r6 – 1 in r6, setze die Statusbits
str r6, Count // Speichere r6 unter „Count“
BGE loop
STR r5, Total // Speichere r5 unter „Total“
b Halt // STP ; Halt execution

Halt:
b Halt

Total: .word 0
One: .word 4
Count: .word 4
Table: .word 39, 25, 4, 98, 17

.Lfe1:
.size main,.Lfe1-main
// End of File
</code></pre>



<h2 class="wp-block-heading">Aufgabe 4:</h2>



<p class="wp-block-paragraph">Berichtigen Sie das Programm nun so, dass der Programmcode (kein sich selbst<br>modifizierenden Code) im ROM (Read Only Memory) und die sich ändernden Daten im RAM&nbsp;(Random Acces Memory) stehen.</p>



<pre class="wp-block-code"><code>// Befehle = 10  Programmgröße = 10 * 4 Byte = 40 Byte
.file "aufgabe4.S"
.text @ legt eine Textsection fuer PrgrammCode + Konstanten an
.align 2 @ sorgt dafuer, dass nachfolgende Anweisungen auf einer durch 4 teilbaren
Adresse liegen
@ unteren 2 Bit sind 0
.global main @ nimmt das Symbol main in die globale Sysmboltabelle auf
.type main,function

main:

LDR r1, =Table // Laden der Adresse von Table
MOV r0, #0x0 // Ergebnisregister auf 0 setzen
LDR r3, =Count // Laden der Adresse der Zähl-Variable
LDR r3, &#91;r3] // Laden des Wertes der Zähl-Variable

loop:
LDR r2, &#91;r1], #4 // Laden des ersten Wertes der Tabelle nach r2, inkrement danach
ADD r0, r2, r0 // Ergebniswert = Ergebniswert + Tabellenwert
SUBS r3, r3, #1 // Zählvariable dekrementieren mit Status
BPL loop // Solange r3 &gt;=0 ist wiederhole die Loop
STR r0, Total // r0 nach Total speichern

BX LR

.Lfe1:
.size main,.Lfe1-main

.data
Total: .word 0
Count: .word 4
Table: .word 39, 25, 4, 98, 17

// End of File</code></pre>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-5/">Rechnerarchitektur (Praktikum 5)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2011/12/rechnerarchitektur-praktikum-5/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
