<?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>Programmieren 2 Archive - Maximilian Krieg</title>
	<atom:link href="https://maximiliankrieg.de/category/studium/bachelor-of-science/2-semester-b-sc/programmieren-2/feed/" rel="self" type="application/rss+xml" />
	<link>https://maximiliankrieg.de/category/studium/bachelor-of-science/2-semester-b-sc/programmieren-2/</link>
	<description>Wissen, Technik &#38; Erfahrungen</description>
	<lastBuildDate>Sat, 30 May 2026 20:02:07 +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>Programmieren 2 Archive - Maximilian Krieg</title>
	<link>https://maximiliankrieg.de/category/studium/bachelor-of-science/2-semester-b-sc/programmieren-2/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 20)</title>
		<link>https://maximiliankrieg.de/2012/06/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-20/</link>
					<comments>https://maximiliankrieg.de/2012/06/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-20/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Tue, 19 Jun 2012 20:00:00 +0000</pubDate>
				<category><![CDATA[Programmieren 2]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=2534</guid>

					<description><![CDATA[<p>Quicksort</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/06/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-20/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 20)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Quicksort</h2>



<pre class="wp-block-code"><code>/*&nbsp;
&nbsp;* File: &nbsp; main.cpp
&nbsp;* Author: maximilian.krieg
&nbsp;*
&nbsp;* Created on 19. rechtsuni 2012, 14:36
&nbsp;*/

#include 
#include 
#include 
using namespace std;

/*
&nbsp;*&nbsp;
&nbsp;*/
void ausgabe(vectorvi) {
&nbsp; &nbsp; for (int i = 0; i &lt; vi.size(); i++) {
	cout &lt;&lt; vi&#91;i];
&nbsp; &nbsp; }
&nbsp; &nbsp; cout &lt;&lt; endl;
}

void quicksort(vector&amp; vi, int ui, int oi) {
&nbsp; &nbsp; // Start bei UI und Element links von OI
&nbsp; &nbsp; // OI == Pivot-Element
&nbsp; &nbsp; int links = ui;
&nbsp; &nbsp; int rechts = oi - 1;
&nbsp; &nbsp; int pivot = oi;

&nbsp; &nbsp; // Solange die Zeiger noch auf ihrer Seite sind
&nbsp; &nbsp; while (links &lt;= rechts) {

	// Laufen bis Element gefunden, das kleiner als Pivot
	while (vi&#91;rechts] &gt; vi&#91;pivot])&nbsp;
	{rechts--;}

	// Laufen bis Element gefunden, das größer als Pivot
	while (vi&#91;links] &lt; vi&#91;pivot])&nbsp;
	{links++;}

	// Tausch der beiden Elemente an dem die Zeiger stehen geblieben sind
	// Nur solange die Zeiger noch nicht die Teilbäume gewechselt haben
	if (links &lt;= rechts) {
	 &nbsp; &nbsp;// Tauschen
	 &nbsp; &nbsp;int tmp = vi&#91;links];
	 &nbsp; &nbsp;vi&#91;links] = vi&#91;rechts];
	 &nbsp; &nbsp;vi&#91;rechts] = tmp;
	 &nbsp; &nbsp;
	 &nbsp; &nbsp;// Noch einen Schritt weiter gehen um&nbsp;
	 &nbsp; &nbsp;links++;
	 &nbsp; &nbsp;rechts--;
	}
&nbsp; &nbsp; }

&nbsp; &nbsp; // Vertauschen des kleinsten Elements im rechten Teilbaum mit Pivot-Element
&nbsp; &nbsp; // Links steht nun auf dem 1. Element im rechten Teilbaum
&nbsp; &nbsp; int tmp = vi&#91;pivot];
&nbsp; &nbsp; vi&#91;pivot] = vi&#91;links];
&nbsp; &nbsp; vi&#91;links] = tmp;

  &nbsp; // Rechts = neuer OI für linke Seite
&nbsp; &nbsp; // Wenn eine Seite noch mehr als 1 Element enthält..
&nbsp; &nbsp; if (ui &lt; rechts)
	quicksort(vi, ui, rechts);
&nbsp; &nbsp;&nbsp;
&nbsp; &nbsp; // Links = neuer UI für rechte Seite
&nbsp; &nbsp; // Wenn eine Seite noch mehr als 1 Element enthält..
&nbsp; &nbsp; if (oi &gt; links)
	quicksort(vi, links, oi);
}

int main() {

&nbsp; &nbsp; // Initialisieren und befüllen des Vektors
&nbsp; &nbsp; vector vi;
&nbsp; &nbsp; vi.push_back(4);
&nbsp; &nbsp; vi.push_back(7);
&nbsp; &nbsp; vi.push_back(2);
&nbsp; &nbsp; vi.push_back(8);
&nbsp; &nbsp; vi.push_back(1);
&nbsp; &nbsp; vi.push_back(9);
&nbsp; &nbsp; vi.push_back(0);
&nbsp; &nbsp; vi.push_back(6);
&nbsp; &nbsp; vi.push_back(3);
&nbsp; &nbsp; vi.push_back(5);
&nbsp; &nbsp;&nbsp;
&nbsp; &nbsp; // Ausgabe des unsortierten Vektors
&nbsp; &nbsp; ausgabe(vi);
&nbsp; &nbsp;&nbsp;
&nbsp; &nbsp; // Parameter für Suche initialisieren
&nbsp; &nbsp; int ui = 0;
&nbsp; &nbsp; int oi = vi.size() - 1;
&nbsp; &nbsp;&nbsp;
&nbsp; &nbsp; // Aufruf der Suche
&nbsp; &nbsp; quicksort(vi, ui, oi);
&nbsp; &nbsp;&nbsp;
&nbsp; &nbsp; // Ausgabe des sortierten Vektors
&nbsp; &nbsp; ausgabe(vi);
&nbsp; &nbsp; return 0;
}</code></pre>



<p class="wp-block-paragraph"></p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/06/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-20/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 20)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2012/06/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-20/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 19)</title>
		<link>https://maximiliankrieg.de/2012/06/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-19/</link>
					<comments>https://maximiliankrieg.de/2012/06/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-19/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Tue, 12 Jun 2012 19:58:00 +0000</pubDate>
				<category><![CDATA[Programmieren 2]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=2532</guid>

					<description><![CDATA[<p>Streuwert-Tabellen Anwendung Beispiel: H&#160; &#160; &#160; &#160; &#160; &#160;&#160;A&#160; &#160; &#160; &#160; &#160; &#160;N&#160; &#160; &#160; &#160; &#160; &#160; &#160;&#160;S 8&#160; &#160; &#160; &#160; &#160;&#8230;</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/06/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-19/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 19)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">Streuwert-Tabellen</h3>



<ul class="wp-block-list">
<li>Als Indexstruktur werden Streuwerttabellen verwendet um Datenelemente in einer großen Datenmenge aufzufinden</li>



<li>Streuerttabellen zeichnen sich durch einen üblicherweise konstanten Zeitaufwand bei Einfüge- bzw. Entfernen-Operationen aus</li>



<li>Die Größe M einer Streuwerttabelle sollte eine Primzahl sein, da bei nicht-Primzahlen beim Addieren eines Vielfachen von M zum Schlüsselwert der selbe Streuwert erzeugt werden kann → Kollision</li>
</ul>



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



<ul class="wp-block-list">
<li>Zeichenketten können in ganzzahlen umgerechnet werden
<ul class="wp-block-list">
<li>Diese können dann modular gestreut werden</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">Beispiel:</p>



<ul class="wp-block-list">
<li>Schlüssel seien Zeichenketten aus vier Großbuchstaben</li>
</ul>



<p class="wp-block-paragraph">H&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;A&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;N&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;S 8&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;14&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;19 01000 &nbsp; &nbsp;&nbsp;00001 &nbsp; &nbsp;&nbsp;01110 &nbsp; &nbsp; &nbsp;&nbsp;10011 8*32^3&nbsp;+&nbsp;1*32^2&nbsp;+&nbsp;14*32^1&nbsp;+&nbsp;19*32^0&nbsp;=&nbsp;<strong>263635</strong>&nbsp;<strong>263635</strong>&nbsp;≡ x (mod 101) →&nbsp;x =&nbsp;<strong>25&nbsp;</strong>&nbsp;<em>Beim Rechnen mit langen Zeichenketten können Zahlen entstehen, die für die meisten Computer zu groß sind</em></p>



<ul class="wp-block-list">
<li>Rechentrick: Hornerschema (Beispiel: L05 &#8211; S. 44)
<ul class="wp-block-list">
<li>Bei jeder Rechnung wird nur mit dem Rest modulo M weitergerechnet</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">Kollisionsbehandlung: getrennte Verkettung</h3>



<ul class="wp-block-list">
<li>Für jede Tabellenadresse wird eine verkettete Liste angelegt, die alle Knoten enthält, deren Schlüssel auf diese Adresse abgebildet wurden.</li>
</ul>



<h3 class="wp-block-heading">Kollisionsbehandlung: offene Adressierung</h3>



<ul class="wp-block-list">
<li>Voraussetzungen
<ul class="wp-block-list">
<li>Maximale Anzahl der Elemente, die gespeichert werden sollen kann vorher ungefähr abgeschätzt werden</li>



<li>genug zusammenhängender Speicher vorhanden</li>
</ul>
</li>



<li>Streuwerttabelle wird gleich als Datenfeld erzeugt</li>



<li>Bei Kollisionen wird auf die freien Plätze in der Streuwert-Tabelle ausgewichen</li>
</ul>



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



<ul class="wp-block-list">
<li>Zwei Extrema
<ul class="wp-block-list">
<li>Ohne Speicherbeschränkung, mit beliebig großen Streuwert-Tabellenkönnte jede Suche mit nur einem einzigen Speicherzugriff realisiert werden.</li>



<li>Ohne Zeitbeschränkung könnte jede Suche mit nur minimalem Speicherplatz realisiert werden</li>
</ul>
</li>



<li>Mit Streuwerttabellen kann das Verhältnis zwischen diesen beiden Richtungen beliebig bestimmt werden.
<ul class="wp-block-list">
<li>Durch Anpassung der Größe der Tabelle</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">Letzte Vorlesungseinheit: Fortgeschrittenes Sortieren</h3>



<p class="wp-block-paragraph">Insertionsort:</p>



<pre class="wp-block-code"><code> void insSort( vector&lt;T&gt;&amp; vV, int ui, int oi ) {
    int i(0), j(0); T tmp = T();
    for( i=oi; i&gt;ui; --i ) swap_if( vV&#91;i-1], vV&#91;i] );
    for( i=ui+2; i&lt;=oi; ++i ) {
        j = i; tmp = vV&#91;i];
        while( tmp&lt;vV&#91;j-1] ) {
            vV&#91;j] = vV&#91;j-1];
            --j;
        }
        vV&#91;j] = tmp;
    }
 }
</code></pre>



<p class="wp-block-paragraph"><em>Problem:&nbsp;Elemente, die sich in den ursprünglichen, unsortierten Daten weit entfernt vonihrer späteren, endgültigen Position innerhalb der sortierten Daten befinden,&nbsp;müssen mit vielen benachbarten Elementen einzeln vertauscht werden.</em></p>



<h3 class="wp-block-heading">Lösung: Shellsort</h3>



<ul class="wp-block-list">
<li>Elemente, die weit voneinander entfernt liegen, werden zuerst direkt vertauscht</li>



<li>h-sortierte Daten: Daten werden h-sortiert genannt, wenn man durch Entnahme jedes h-ten Elements sortierte Daten erhält.</li>
</ul>



<p class="wp-block-paragraph">Beispiel: absteigend 3-sortierte Daten&nbsp;<strong>25 &nbsp;</strong>830 &nbsp;67 &nbsp;<strong>17 &nbsp;</strong>320 &nbsp;55 &nbsp;<strong>14 &nbsp;</strong>288 &nbsp;49 &nbsp;<strong>11 &nbsp;</strong>245 &nbsp;33 &nbsp;<strong>9</strong>&nbsp;&nbsp;170 &nbsp;24 &nbsp;<strong>6</strong>&nbsp;&nbsp;143 &nbsp;21 &nbsp;<strong>4</strong>&nbsp;&nbsp;99 &nbsp;16 25 &nbsp;<strong>830 &nbsp;</strong>67 &nbsp;17 &nbsp;<strong>320</strong>&nbsp;&nbsp;55 &nbsp;14 &nbsp;<strong>288 &nbsp;</strong>49 &nbsp;11 &nbsp;<strong>245 &nbsp;</strong>33 &nbsp;9 &nbsp;<strong>170 &nbsp;</strong>24 &nbsp;6 &nbsp;<strong>143 &nbsp;</strong>21 &nbsp;4 &nbsp;<strong>99 &nbsp;</strong>16 25 &nbsp;830 &nbsp;<strong>67 &nbsp;</strong>17 &nbsp;320 &nbsp;<strong>55 &nbsp;</strong>14 &nbsp;288 &nbsp;<strong>49 &nbsp;</strong>11 &nbsp;245 &nbsp;<strong>33 &nbsp;</strong>9 &nbsp;170 &nbsp;<strong>24 &nbsp;</strong>6 &nbsp;143 &nbsp;<strong>21 &nbsp;</strong>4 &nbsp;99 &nbsp;<strong>16</strong></p>



<ul class="wp-block-list">
<li>Beobachtung:
<ul class="wp-block-list">
<li>h-sortiert man k-sortierten Daten, ist das Ergebnis sowohl h- als auch k-sortiert</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">Beispiel:&nbsp;<em>Eine 1-Sortierung entspricht der Insertion Sort. Durch das Sortieren bei &#8222;Shell-Sort&#8220; werden ungünstige Fälle aussortiert.</em></p>



<h3 class="wp-block-heading"><em>Implementierung</em></h3>



<pre class="wp-block-code"><code>template&lt;class T&gt; void shlsrt( vector&lt;T&gt; vV,    int ui, int oi ) {
  int i(0), j(0), h(0), d(-1);
  T tmp = T();
  while( h &lt;= (oi-ui+1)/9 ) h = (3*h)+1; // Startwert für h
    for( ; h&gt;0; h /= 3 ) {
      while( ++d &lt; h ) {
// kleinstes Element jeweils an den Anfang:
        for( i=oi-d; i&gt;=ui+h; i-=h ) swap_if(   vV&#91;i-h], vV&#91;i] );
// sortieren:
        for( i+=h; i&lt;=oi; i+=h ) {
          j=i; tmp = vV&#91;i];
          while( tmp &lt; vV&#91;j-h] )
        }
      } // "d-Schleife"
    d = -1;
 } // "h-Schleife"
}
</code></pre>



<h3 class="wp-block-heading">Eigenschaften von Shellsort</h3>



<ul class="wp-block-list">
<li>Leistungseigenschaften können nur ungenau beschrieben werden
<ul class="wp-block-list">
<li>Niemand konnte den Algorithmus bis wirklich analysieren</li>
</ul>
</li>



<li>Hat keinen Worst-Case
<ul class="wp-block-list">
<li>ist nicht abhängig von ursprünglichen Ordnung</li>
</ul>
</li>



<li>kein stabiles Sortierverfahren
<ul class="wp-block-list">
<li>Ein stabiles Sortierverfahren ist ein <a href="http://de.wikipedia.org/wiki/Sortierverfahren">Sortieralgorithmus</a>, der die Reihenfolge der <a href="http://de.wikipedia.org/wiki/Datensatz">Datensätze</a>, deren <a href="http://de.wikipedia.org/wiki/Schl%C3%BCssel_(Datenorganisation)">Sortierschlüssel</a> gleich sind, bewahrt.</li>
</ul>
</li>



<li>sehr kurzes Programm und einfach zu implementieren</li>
</ul>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/06/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-19/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 19)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2012/06/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-19/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 18)</title>
		<link>https://maximiliankrieg.de/2012/06/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-18/</link>
					<comments>https://maximiliankrieg.de/2012/06/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-18/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Tue, 05 Jun 2012 19:55:00 +0000</pubDate>
				<category><![CDATA[Programmieren 2]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=2528</guid>

					<description><![CDATA[<p>Traversierung Baum Einfügen wird durch Vergleich mit aktuellem Element und wandern bis zur ersten freien Stelle mit ständigen Vergleichen realisiert entartet, wenn man sortierte Listen einfügt</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/06/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-18/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 18)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">Traversierung</h3>



<ul class="wp-block-list">
<li>Jeden Knoten einmal besuchen</li>
</ul>



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



<p class="wp-block-paragraph"><strong>Einfügen</strong> wird durch Vergleich mit aktuellem Element und wandern bis zur ersten freien Stelle mit ständigen Vergleichen realisiert</p>



<p class="wp-block-paragraph">entartet, wenn man sortierte Listen einfügt</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/06/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-18/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 18)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2012/06/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-18/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 17)</title>
		<link>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-17/</link>
					<comments>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-17/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Thu, 31 May 2012 19:56:00 +0000</pubDate>
				<category><![CDATA[Programmieren 2]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=2530</guid>

					<description><![CDATA[<p>Fortgeschrittenes Suchen Bäume → Mathematische Struktur, Graph Wurzelbaum Geordneter Baum M-wertiger Baum Binärbaum Die Implementierung eines Binärbaums in C++ sieht wie folgt aus:</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-17/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 17)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">Fortgeschrittenes Suchen</h3>



<ul class="wp-block-list">
<li>Für die Algorithmenanalyse ist oft der durchschnittliche Fall am wichtigsten</li>



<li>Stirling-Zahl (1. Art)
<ul class="wp-block-list">
<li>Anzahl der Permutationen einer n-elementigen Menge, die genau k Zyklen haben (<em>Wikipedia</em>)</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"><em>Bäume</em></h3>



<p class="wp-block-paragraph">→ Mathematische Struktur, Graph</p>



<ul class="wp-block-list">
<li>Knoten
<ul class="wp-block-list">
<li>sind miteinander verbunden</li>



<li>haben</li>
</ul>
</li>



<li>Kanten</li>



<li>Pfad
<ul class="wp-block-list">
<li>Weg von einem Knoten zu einem anderen über eine oder mehrere Kanten</li>



<li>In einem Baum gibt es immer genau einen Pfad</li>



<li>Kanten sind zunächst ungerichtet</li>
</ul>
</li>
</ul>



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



<ul class="wp-block-list">
<li>Knoten sind als Wurzel gekennzeichnet
<ul class="wp-block-list">
<li>Gegenteil: freier Baum</li>
</ul>
</li>



<li>Kanten zeigen zur Wurzel oder von ihr weg (es kann auch beides der Fall sein)
<ul class="wp-block-list">
<li>Kanten sind gerichtet</li>
</ul>
</li>



<li>Die Wurzel befindet sich oben
<ul class="wp-block-list">
<li>ein Knoten y liegt über dem Knoten x, wenn er sich näher an der Wurzel befindet</li>
</ul>
</li>



<li>Jeder Knoten bildet die Wurzel für einen weiteren Teilbaum</li>



<li>Jeder Knoten, der nicht die Wurzel ist, hat einen Vorgänger (Knoten direkt über ihm) und Nachfolger (Knoten direkt unter ihm)</li>



<li>Knoten ohne Nachfolger heißen Blätter</li>
</ul>



<ul class="wp-block-list">
<li>Knotenebene
<ul class="wp-block-list">
<li>Ebene der Wurzel ist &#8222;0&#8220;</li>



<li>Ebene ist der Abstand vom Knoten zur Wurzel</li>
</ul>
</li>



<li>Pfadlänge
<ul class="wp-block-list">
<li>Summer aller Ebenen</li>
</ul>
</li>



<li>Höhe eines Wurzelbaums
<ul class="wp-block-list">
<li>Die höchste Ebene unter allen Knoten</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">Geordneter Baum</h3>



<ul class="wp-block-list">
<li>Reihenfolge der Nachfolger jedes Knotens ist systematisch festgelegt</li>
</ul>



<h3 class="wp-block-heading">M-wertiger Baum</h3>



<ul class="wp-block-list">
<li>Jeder Knoten muss eine bestimmte Anzahl &#8222;M&#8220; von Nachfolgern haben</li>



<li>Pseudoknoten, äußerer Knoten
<ul class="wp-block-list">
<li>werden als Nachfolger von Knoten gesetzt, die keine &#8222;M&#8220; Nachfolger haben</li>



<li>werden im Vergleich zu den runden &#8222;inneren&#8220; Knoten eckig dargesetellt</li>
</ul>
</li>



<li>Nullkanten
<ul class="wp-block-list">
<li>Kanten zu Pseudoknoten</li>
</ul>
</li>



<li>Blätter haben nur Pseudoknoten als Nachfolger</li>
</ul>



<h3 class="wp-block-heading">Binärbaum</h3>



<ul class="wp-block-list">
<li>geordneter M-wertiger Baum mit M=2</li>



<li>2 Typen von Knoten:
<ul class="wp-block-list">
<li>Äußere Knoten</li>



<li>Innere Knoten</li>
</ul>
</li>



<li>geordnet
<ul class="wp-block-list">
<li>linker Nachfolger</li>



<li>rechter Nachfolger</li>



<li>jeder Knoten hat genau 2 Nachfolger</li>
</ul>
</li>



<li>Blätter haben 2 äußere Knoten als Nachfolger</li>



<li>äußere Pfadlänge
<ul class="wp-block-list">
<li>Summe der Ebenen aller äußeren Knoten</li>
</ul>
</li>



<li>innere Pfadlänge
<ul class="wp-block-list">
<li>Summe der Ebenen aller inneren Knoten</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph"><em>Die Implementierung eines Binärbaums in C++ sieht wie folgt aus:</em></p>



<pre class="wp-block-code"><code>struct node { char c; node* left; node* right; }
</code></pre>



<ul class="wp-block-list">
<li>Ein Binärbaum von N Knoten hat N-1 Kanten</li>



<li>Ein Binärbaum von N inneren Knoten hat N+1 äußere Knoten</li>



<li>Ein Binärbaum mit N inneren Knoten hat 2N Kanten</li>



<li>Die äußere Pfadlänge eimes Binärbaums mit N inneren Knoten ist um 2N größer als seine innere Pfadlänge</li>



<li>Die Höhe eines Binärbaums mit N inneren Knoten beträgt
<ul class="wp-block-list">
<li>mindestens log2 (N)</li>



<li>höchstens N</li>
</ul>
</li>



<li>Die innere Pfadlänge eines Binärbaums mit N inneren Knoten beträgt mindestens log2 (N/4) und höchstens N (N-1) / 2</li>
</ul>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-17/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 17)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-17/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Programmieren, Algorithmen und Datenstrukturen 2 (Praktikum 3)</title>
		<link>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-praktikum-3/</link>
					<comments>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-praktikum-3/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Fri, 25 May 2012 22:08:00 +0000</pubDate>
				<category><![CDATA[Programmieren 2]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=2371</guid>

					<description><![CDATA[<p>Aufgabe 1 a)&#160;Kehren Sie zu den Ergebnissen aus der Aufgabe 2 des zweiten Praktikums zurück, und implementieren Sie die Shape und Frame Klassen(-hierarchie) zur Darstellung&#8230;</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-praktikum-3/">Programmieren, Algorithmen und Datenstrukturen 2 (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 zu den Ergebnissen aus der Aufgabe 2 des zweiten Praktikums zurück, und implementieren Sie die Shape und Frame Klassen(-hierarchie) zur Darstellung geometrischer Figuren als Punkteraster auf der Konsole zu Ende. Ihre Implementierung des Bresenham-Algoritmus zur Ermittlung der Rasterpunkte einer geraden Linie wird zur Methode&nbsp;<strong>void Line::draw( Frame* )</strong>&nbsp;und die Frame Klassenhierarchie wird weiter verwendet. Erweitern Sie Ihren Testplan und Ihren&nbsp;<strong>main()</strong>&nbsp;Treiber entsprechend, überprüfen Sie alles systematisch und wiederholbar. Dokumentieren Sie die Testplanung und die Ergebnisse.</p>



<p class="wp-block-paragraph"><strong>b)</strong>&nbsp;Erweitern Sie die Klassenstruktur um&nbsp;<strong>class Triangle : public shape</strong>, damit entsprechend zu den bisherigen Figurtypen nun auch Dreiecke mit&nbsp;<strong>draw()</strong>&nbsp;und&nbsp;<strong>move()</strong>&nbsp;behandelt werden können. Ermöglichen Sie Dreiecke durch Übergabe der Koordinaten der drei Eckpunkte. Konzentrieren Sie sich beim Test auf die Methode, die prüft, ob die drei übergebenen Punkte ein gültiges Dreieck darstellen. Testen Sie wieder geplant, systematisch und ausführlich, dokumentieren Sie wieder alle Tests und Ergebnisse.</p>



<p class="wp-block-paragraph"><strong>c)</strong>&nbsp;Erweitern Sie den Typ Triangle so, dass man Triangle Objekte auch erzeugen kann, indem man einem weiteren Konstruktor die horizontale und vertikale Koordinate eines Bezugspunktes (&#8222;links-unten&#8220;) sowie drei int Werte übergibt, die die Seitenlängen des Dreiecks darstellen:&nbsp;<strong>Triangle( int hor, int ver, int len1, int len2, int len3 ) //…</strong>&nbsp;Konzentrieren Sie sich beim Test auf die Methode, die prüft, ob die drei übergebenen Längen ein gültiges Dreieck darstellen. Erweitern Sie den Testplan, dokumentieren Sie die Ergebnisse.</p>



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



<pre class="wp-block-code"><code>/*
 * File:   main.cpp
 * Author: maximilian.krieg
 *
 * Created on 20. April 2012, 12:41
 */

#include "headers.h"
using namespace std;

int main() {

    Frame frame1;
    Frame* pFrame1 = &amp;frame1;

    // Standardkonstruktor Linie
    Line test0();
    dump_all_shapes(pFrame1);

    // Ungültige Linie
    Line test1(5,5,XMAX+1,YMAX+1);
    dump_all_shapes(pFrame1);

    // Linie auf den Frame schieben
    test1.move(-2,-2);
    dump_all_shapes(pFrame1);

    return 0;
}

    //        // Test #0: Start
    //        //&lt;editor-fold defaultstate="collapsed" desc="Testfall #0: Ungültige Linien zeichnen, Std. Konstruktor + Korrektur"&gt;

//    //Standard-Konstruktor aufrufen
//    Line test0();
//
//    //Ungültige Linie zeichnen
//    Line test1(-1, 0, 5, -7);
//
//    // Gültige Linie zeichnen und ins Aus schieben
//    Line test2(5,5,XMAX-5,YMAX-5);
//    dump_all_shapes(pFrame1);
//    test2.set(-1,-5,XMAX+1,YMAX+1);
//    dump_all_shapes(pFrame1);
//
//    // Linie neu setzen
//    pFrame1-&gt;frame_reset();
//    test2.set(5,5,XMAX-5,5);
//    dump_all_shapes(pFrame1);

    //        //&lt;/editor-fold&gt;
    //        // Test #0: Ende

    //        // Test #1: Start
    //        //&lt;editor-fold defaultstate="collapsed" desc="Testfall #1: Stern zeichnen + Fehler: Linien ins Aus verschieben"&gt;
    //
    //        // Stern-Linien setzen
    //        Line line1(10,10 , 10, 20); // Norden
    //        Line line2(10,10 , 20, 10); // Osten
    //        Line line3(10,10 , 10, 0); // Süden
    //        Line line4(10,10 , 0,10); // Westen
    //        Line line5(10,10 , 0, 0); // Südwesten
    //        Line line6(10,10 , 20, 0); // Südosten
    //        Line line7(10,10 , 20, 20); // Nordosten
    //        Line line8(10,10 , 0, 20); // Nordwesten
    //        dump_all_shapes(pFrame1);
    //
    //        // Fehler: Stern-Linien ins Aus schieben
    //        line1.move((-XMAX) - 1, 0);
    //        line2.move((XMAX) + 1, 0);
    //        line3.move(0, YMAX + 1);
    //        line4.move(0, (-YMAX) - 1);
    //        dump_all_shapes(pFrame1);
    //
    //
    //        //&lt;/editor-fold&gt;
    //        // Test #1: Ende

    //        // Test #2: Start
    //        //&lt;editor-fold defaultstate="collapsed" desc="Testfall #2: Haus zeichnen + Linien erfolgreich verschieben"&gt;
    //        // Haus-Koordinaten
    //
    //        // Haus-Linien
    //        Line line9(15, 30, 25, 20);
    //        Line line10(25, 20, 5, 20);
    //        Line line11(5, 20, 15, 30);
    //        Line line12(5, 20, 5, 0);
    //        Line line13(5, 0, 25, 0);
    //        Line line14(25, 0, 25, 20);
    //        Line line15(5, 0, 25, 20);
    //        Line line16(5, 20, 25, 0);
    //        dump_all_shapes(pFrame1);
    //
    //        // Haus #2
    //        pFrame1-&gt;frame_reset();
    //        line9.move(25, 0);
    //        line10.move(25, 0);
    //        line11.move(25, 0);
    //        line12.move(25, 0);
    //        line13.move(25, 0);
    //        line14.move(25, 0);
    //        line15.move(25, 0);
    //        line16.move(25, 0);
    //        dump_all_shapes(pFrame1);
    //        //&lt;/editor-fold&gt;
    //        // Test #2: Ende

    //        // Test #3: Start
    //        //&lt;editor-fold defaultstate="collapsed" desc="Testfall #3: 2 Dreiecke zeichnen"&gt;
    //        //Dreieck #1: Rechtwinklig
    //        Triangle triangle1(5,40, 10, 40, 5,55);
    //
    //        //Dreieck #2: Gleichschenklig
    //        Triangle triangle2(30,40,50,40,40,60);
    //        dump_all_shapes(pFrame1);
    //        //&lt;/editor-fold&gt;
    //        // Test #3: Ende

    //        // Test #4: Start
    //        //&lt;editor-fold defaultstate="collapsed" desc="Testfall #4: Dreieck zeichnen + verschieben + Fehler: Ins Aus verschieben"&gt;
    //
    //        //Dreieck #3: Beliebig
    //        Triangle triangle3(9,63,42,40,32,65);
    //        dump_all_shapes(pFrame1);
    //
    //        // Dreieck #3: Verschieben
    //        pFrame1-&gt;frame_reset();
    //        triangle3.move(-5, -37);
    //        dump_all_shapes(pFrame1);
    //
    //        // Fehler: Dreieck ins Aus schieben
    //        triangle3.move(200, 0);
    //        triangle3.move(-200, 0);
    //        triangle3.move(0, +200);
    //        triangle3.move(0, -200);
    //        dump_all_shapes(pFrame1);
    //
    //        //&lt;/editor-fold&gt;
    //        // Test #4: Ende

    //        // Test #5: Start
    //        //&lt;editor-fold defaultstate="collapsed" desc="Testfall #5: Dreieck im Aus zeichnen und auf den Frame schieben"&gt;
    //
    //        // Dreieck #4 im Aus zeichnen
    //        Triangle triangle4(15,15,30, YMAX+1,(-5),30);
    //        dump_all_shapes(pFrame1);
    //
    //        // Dreieck 4 auf den Frame schieben
    //        triangle4.move(+10, -10);
    //        dump_all_shapes(pFrame1);
    //        //&lt;/editor-fold&gt;
    //        // Test #5: Ende

    //            // Test #6: Start
    //    //&lt;editor-fold defaultstate="collapsed" desc="Testfall #6: Ungültiges Dreieck zeichnen + Korrektur"&gt;
    //        // Ungültiges Dreieck #5 zeichnen (2 Punkte identisch)
    //        Triangle triangle5(15,15, 15,15,5,5);
    //        dump_all_shapes(pFrame1);
    //
    //        // Ungültiges Dreieck #5 zeichnen: Punkte neu setzen (3 Punkte bilden eine Gerade)
    //        triangle5.set(15,15,10,10,20,20);
    //        dump_all_shapes(pFrame1);
    //
    //        // Dreieck #5: Die Punkte korrekt setzen
    //        triangle5.set(20,7,41,10,23,21);
    //        dump_all_shapes(pFrame1);
    //
    //    //&lt;/editor-fold&gt;
    //        // Test #6: Ende

</code></pre>



<pre class="wp-block-code"><code>/*
 * File:   headers.h
 * Author: maximilian.krieg
 *
 * Created on 27. April 2012, 10:34
 */

#ifndef HEADERS_H
#define	HEADERS_H

// Präprozessordirektiven aller Header
#include &lt;iostream&gt;
#include "Frame.h"
#include "Shape.h"
#include "Line.h"
#include "Triangle.h"

// Deklaration aller Klassen
class Coordinate;
class Frame;
class Shape;
class Line;
class Triangle;

#endif	/* HEADERS_H */

</code></pre>



<pre class="wp-block-code"><code>/*
 * File:   Frame.h
 * Author: maximilian.krieg
 *
 * Created on 20. April 2012, 12:42
 */

#ifndef FRAME_H
#define	FRAME_H

const int XMAX = 55; // Zeichen pro Frame-Zeile (55)
const int YMAX = 70; // Zeilen pro Frame   (34)

class Frame {
public:

    enum color {
	on = ' ', off = 254
    };

    Frame();
    void put_point(int, int); // Punkt im Frame speichern
    void frame_reset(); // Frame "leeren"
    void frame_dump() const; // Frame auf die Konsole ausgeben
    bool on_frame(int, int) const; // "Clipping"

private:
    char frame&#91;XMAX]&#91;YMAX];
};
#endif	/* FRAME_H */
</code></pre>



<pre class="wp-block-code"><code>/*
 * File:   Frame.cpp
 * Author: maximilian.krieg
 *
 * Created on 20. April 2012, 12:42
 */

#include "headers.h"
using std::cout;
using std::endl;
using std::string;

// Standardkonstruktor für Frames

Frame::Frame() {
    frame_reset();
}

// Punkt im Frame speichern

void Frame::put_point(int x, int y) {
    if (on_frame(x, y)) {
	frame&#91;x]&#91;y] = on;
    }
}

// Frame "leeren"

void Frame::frame_reset() {
    for (int x = 0; x &lt; XMAX; x++) {
	for (int y = 0; y &lt; YMAX; y++) {
	    frame&#91;x]&#91;y] = off;
	}
    }
}

// Frame auf die Konsole ausgeben

void Frame::frame_dump() const {
    for (int y = YMAX - 1; y &gt;= 0; --y) {
	for (int x = 0; x &lt; XMAX; x++) {
	    cout &lt;&lt; frame&#91;x]&#91;y];
	}
	cout &lt;&lt; endl;
    }
    cout &lt;&lt; endl;
}

// "Clipping"

bool Frame::on_frame(int x, int y) const {
    if (x &gt;= 0 &amp;&amp; x &lt; XMAX &amp;&amp; y &gt;= 0 &amp;&amp; y &lt; YMAX) {
	return true;
    } else {
	return false;
    }
}

</code></pre>



<pre class="wp-block-code"><code>/*
 * File:   Shape.h
 * Author: maximilian.krieg
 *
 * Created on 27. April 2012, 10:09
 */
#include "headers.h"

#ifndef SHAPE_H
#define	SHAPE_H

class Shape {
public:

    Shape();
    Shape* next; // Zeiger auf die nächste Figur
    static Shape* list; // Zeiger auf die Liste aller erzeugten Figuren

    virtual void draw(Frame* ptarget) = 0; // rein virtuelle Methode
    virtual void move(int hor, int ver) = 0; // rein virtuelle Methode

};

// gibt die abgeleiteten Shape Objekte auf Frame* aus
void dump_all_shapes(Frame*);

#endif	/* SHAPE_H */

</code></pre>



<pre class="wp-block-code"><code>/*
 * File:   Shape.cpp
 * Author: maximilian.krieg
 *
 * Created on 27. April 2012, 10:09
 */

#include "headers.h"

Shape* Shape::list = 0; // initialisiert den static Member mit dem Nullzeiger

Shape::Shape() :
next(list) {
    list = this;
}

void dump_all_shapes(Frame* pFrame) // gibt die abgeleiteten Shape Objekte auf Frame* aus
{
    for (Shape* s = Shape::list; s; s = s-&gt;next) {
	s-&gt;draw(pFrame);
    }
    pFrame-&gt;frame_dump();
}
</code></pre>



<pre class="wp-block-code"><code>/*
 * File:   Line.h
 * Author: maximilian.krieg
 *
 * Created on 27. April 2012, 10:19
 */
#include "headers.h"
#ifndef LINE_H
#define	LINE_H

class Line : public Shape {
public:
    // Konstruktoren
    Line(); // Standardkonstruktor
    Line(int, int, int, int); // Konstruktor mit 2 Koordinaten (A&#91;x/y];B&#91;x/y])

    // Modifizieren der Linie ( neu setzen oder verschieben )
    void set(int, int, int, int); // Koordinaten neu setzen (A&#91;x/y];B&#91;x/y])
    void move(int, int); // rein virtuelles shape::move() überschreiben

    // Print-Methode
    void draw(Frame*); // rein virtuelles shape::draw()überschreiben

    // Check-Methoden
    bool checkpos(int, int) const; // Gültigkeit der Koordinaten prüfen
private:
    int AX, AY, BX, BY; // Koordinaten (A&#91;x/y];B&#91;x/y])
};

#endif	/* LINE_H */

</code></pre>



<pre class="wp-block-code"><code>/*
 * File:   Line.cpp
 * Author: maximilian.krieg
 *
 * Created on 27. April 2012, 10:19
 */

#include "headers.h"
using std::cerr;
using std::endl;

Line::Line() // Definition des Standardkonstruktors
: Shape(), AX(-1), AY(-1), BX(-1), BY(-1) { // Koordinaten werden ungültig gesetzt
}

Line::Line(int ax, int ay, int bx, int by) // Def. des weiteren Konstuktors
: Shape(), AX(ax), AY(ay), BX(bx), BY(by) {
    if (checkpos(0, 0) == false) {
	AX = -1;
	AY = -1;
	BX = -1;
	BY = -1;
	cerr &lt;&lt; "Linie konnte wegen ungültigen Koordinaten nicht gesetzt werden." &lt;&lt; "Bitte alle Koordinaten neu setzen oder Linie verschieben." &lt;&lt; endl;
    }
}

bool Line::checkpos(int h, int v) const {

    if (AX + h &gt; XMAX || AX + h &lt; 0) {
	cerr &lt;&lt; "Koordinate liegt nicht auf dem Frame: ";
	return false;
    }
    if (AY + v &gt; YMAX || AY + v &lt; 0) {
	cerr &lt;&lt; "Koordinate liegt nicht auf dem Frame: ";
	return false;
    }
    if (BX + h &gt; XMAX || BX + h &lt; 0) {
	cerr &lt;&lt; "Koordinate liegt nicht auf dem Frame: ";
	return false;
    }
    if (BY + v &gt; YMAX || BY + v &lt; 0) {
	cerr &lt;&lt; "Koordinate liegt nicht auf dem Frame: ";
	return false;
    }
    return true;
}

void Line::set(int ax, int ay, int bx, int by) {
    int backup_ax=AX;
    int backup_ay=AY;
    int backup_bx=BX;
    int backup_by=BY;

    AX = ax;
    AY = ay;
    BX = bx;
    BY = by;

    if (checkpos(0,0)== false)
    {
	AX=backup_ax;
	AY=backup_ay;
	BX=backup_bx;
	BY=backup_by;
	cerr &lt;&lt; "Koordinaten wurden zurückgesetzt." &lt;&lt; endl;
    }
}

void Line::move(int h, int v) { // Def. der line::move() Methode
    if (checkpos(h, v) == true) {
	AX = AX + h;
	AY = AY + v;
	BX = BX + h;
	BY = BY + v;
	std::cout &lt;&lt; "Linie erfolgreich verschoben." &lt;&lt; endl;
    } else {
	cerr &lt;&lt; "Linie kann nicht verschoben werden." &lt;&lt; endl;
    }
}

// Tauschen von Variablen

void swap(int&amp; a, int&amp; b) {
    int help = 0;
    help = a;
    a = b;
    b = help;
}

// Bresenham Algorithmus

void Line::draw(Frame* pFrame) {

    bool bMerker1 = false;
    bool bMerker2 = false;

    int iX_end = BX;
    int iX_start = AX;
    int iY_start = AY;
    int iY_end = BY;

    if (iX_end &lt; iX_start) {

	// Start- und Endpunkt vertauschen
	swap(iX_start, iX_end);
	swap(iY_start, iY_end);
    }

    if (iY_end &lt; iY_start) {
	// Vorzeichen beider Y-Koordinaten umdrehen
	iY_end = -iY_end;
	iY_start = -iY_start;
	//und dafür einen Merker setzen
	bMerker1 = true;
    }

    if ((iX_end - iX_start) &lt; (iY_end - iY_start)) {

	swap(iX_start, iY_start); // iX_start mit iY_start vertauschen
	swap(iX_end, iY_end); // iX_end mit iY_end vertauschen
	bMerker2 = true; // dafür einen weiteren Merker setzen
    }

    int dx = iX_end - iX_start;
    int dy = iY_end - iY_start;
    int d = (2 * dy) - dx;
    int y = iY_start;

    for (int x = iX_start; x &lt;= iX_end; ++x) {

	// flach &amp; steigend
	if (bMerker1 == false &amp;&amp; bMerker2 == false) {
	    pFrame-&gt;put_point(x, y); // Punkt im Frame setzen
	}

	// flach &amp; fallend
	if (bMerker1 == true &amp;&amp; bMerker2 == false) {
	    pFrame-&gt;put_point(x, -y); // Punkt im Frame setzen
	}

	// steil &amp; steigend
	if (bMerker1 == false &amp;&amp; bMerker2 == true) {
	    pFrame-&gt;put_point(y, x); // Punkt im Frame setzen
	}

	// steil &amp; fallend
	if (bMerker1 == true &amp;&amp; bMerker2 == true) {
	    pFrame-&gt;put_point(y, -x); // Punkt im Frame setzen
	}

	//error = error + delta; // Fehler aktualisieren
	if (d &lt; 0) {
	    d = d + 2 * dy; // Fehler anpassen
	} else {
	    y++; // Rechts und hoch gehen
	    d = d + 2 * (dy - dx);
	}
    }
}

</code></pre>



<pre class="wp-block-code"><code>/*
 * File:   Triangle.h
 * Author: maximilian.krieg
 *
 * Created on 27. April 2012, 11:00
 */

#include "headers.h"

#ifndef TRIANGLE_H
#define	TRIANGLE_H

class Triangle : public Shape {
public:
    //Konstruktoren
    Triangle(); // Standard-Konstruktor
    Triangle(int, int, int, int, int , int); //Konstruktor mit 3 Koordinaten A&#91;x/y], B&#91;x/y], C&#91;x/y]
    Triangle(int ax, int ay, int laenge_a, int laenge_b, int laenge_c);

    //Koordinaten neu setzen A&#91;x/y], B&#91;x/y], C&#91;x/y]
    void set(int , int , int , int , int , int);

    // Dreieck auf dem Frame zeichnen. ( 3 Linien zeichnen )
    void draw(Frame*);

    //Dreick verschieben um h ( x-Achse )und v ( y-Achse )
    void move(int, int);

    // Prüfen, ob das Dreieck auf dem Frame liegt
    bool checkpos(int, int);

private:
    int AX, AY; // Koordinaten von Punkt A
    int BX, BY; // Koordinaten von Punkt B
    int CX, CY; // Koordinaten von Punkt C
    Line ab; // Linie von A zu B
    Line bc; // Linie von B zu C
    Line ac; // Linie von A zu C
};

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



<pre class="wp-block-code"><code>/*
 * File:   Triangle.cpp
 * Author: maximilian.krieg
 *
 * Created on 27. April 2012, 11:00
 */

#include "headers.h"
#include &lt;math.h&gt;
using std::cout;
using std::cerr;
using std::endl;

// Standard-Konstruktor
Triangle::Triangle() :
Shape(), AX(-1), AY(-1), BX(-1), BY(-1), CX(-1), CY(-1) {
}

// Konstruktor für 3 Koordinaten A&#91;x/y], B&#91;x/y], C&#91;x/y]
Triangle::Triangle(int ax, int ay, int bx, int by, int cx, int cy) :
Shape(), AX(ax), AY(ay), BX(bx), BY(by), CX(cx), CY(cy) {
    if (checkpos(0, 0) == true) {
	ac.set(ax, ay, cx, cy);
	ab.set(ax, ay, bx, by);
	bc.set(bx, by, cx, cy);
    } else {
	cerr &lt;&lt; "Dreieck kann nicht gezeichnet werden." &lt;&lt; endl;
    }
}

// Überschreiben der virtuellen draw-Methode von Shape
void Triangle::draw(Frame* pFrame) {
    ac.draw(pFrame);
    bc.draw(pFrame);
    ab.draw(pFrame);
}

// Dreieck verschieben um h (x-Achse) und v (y-Achse).
// Prüfung erfolgt mittels Vorbedingung.
void Triangle::move(int h, int v) {

    // Prüfen, ob das Dreieck nach dem Verschieben gültig wäre
    if (checkpos(h, v) == true) {
	AX = AX + h;
	AY = AY + v;
	BX = BX + h;
	BY = BY + v;
	CX = CX + h;
	CY = CY + v;

	// Linien neu setzen
	ac.set(AX, AY, CX, CY);
	ab.set(AX, AY, BX, BY);
	bc.set(BX, BY, CX, CY);

	cout &lt;&lt; "Dreieck erfolgreich verschoben." &lt;&lt; endl;
    } else {
	cerr &lt;&lt; "Dreieck kann nicht verschoben werden." &lt;&lt; endl;
    }
}

// Länge einer Linie berechnen
double laenge(int ax, int ay, int bx, int by) {
    double dlaenge = ((bx - ax)*(bx - ax)) + ((by - ay)*(by - ay));
    dlaenge = sqrt(dlaenge);
    return dlaenge;
}

// Prüfen, ob ein Dreieck gültig ist.
bool Triangle::checkpos(int h, int v) {

    // Position prüfen, liegt die neue Koordinate auf dem Frame?, liegt die neue Koordinate auf dem Frame?
    if (AX + h &gt; XMAX || AX + h &lt; 0) {
	std::cerr &lt;&lt; "Dreieck liegt nicht auf dem Frame: ";
	return false;
    }
    // Position prüfen, liegt die neue Koordinate auf dem Frame?
    if (AY + v &gt; YMAX || AY + v &lt; 0) {
	std::cerr &lt;&lt; "Dreieck liegt nicht auf dem Frame: ";
	return false;
    }
    // Position prüfen, liegt die neue Koordinate auf dem Frame?
    if (BX + h &gt; XMAX || BX + h &lt; 0) {
	std::cerr &lt;&lt; "Dreieck liegt nicht auf dem Frame: ";
	return false;
    }
    // Position prüfen, liegt die neue Koordinate auf dem Frame?
    if (BY + v &gt; YMAX || BY + v &lt; 0) {
	std::cerr &lt;&lt; "Dreieck liegt nicht auf dem Frame: ";
	return false;
    }
    // Position prüfen, liegt die neue Koordinate auf dem Frame?
    if (CX + h &gt; XMAX || CX + h &lt; 0) {
	std::cerr &lt;&lt; "Dreieck liegt nicht auf dem Frame: ";
	return false;
    }
    // Position prüfen, liegt die neue Koordinate auf dem Frame?
    if (CY + v &gt; YMAX || CY + v &lt; 0) {
	std::cerr &lt;&lt; "Dreieck liegt nicht auf dem Frame: ";
	return false;
    }

    // Punkte auf Gleichheit prüfen.
    if ((CX == BX &amp;&amp; BY == CY) || (BX == AX &amp;&amp; BY == AY) || (CX == AX &amp;&amp; CY == AY)) {
	std::cerr &lt;&lt; "Zwei oder mehr Punkte sind identisch. Kein gültiges Dreieck: ";
	return false;
    }

    // Prüfen, ob 1 Punkt auf der Linie der anderen 2 Punkte liegt.
    double laenge_ac = laenge(AX, AY, CX, CY);
    double laenge_ab = laenge(AX, AY, BX, BY);
    double laenge_bc = laenge(BX, BY, CX, CY);

    if (((laenge_ac + laenge_ab) &lt;= laenge_bc) || (laenge_ac + laenge_bc &lt;= laenge_ab) || (laenge_ab + laenge_bc &lt;= laenge_ac)) {
	std::cerr &lt;&lt; "Die Laenge einer Seite ist gleich oder größer als die Summe der anderen Zwei Seiten. Kein gültiges Dreieck: ";
	return false;
    }

    return true;
}

// Koordinaten eines Dreiecks neu setzen.
// Prüfung erfolgt mittels Nachbedingung.
void Triangle::set(int ax, int ay, int bx, int by, int cx, int cy) {

    // Sichern der Koordinaten für etwaiges Zurückspielen
    int backup_ax = AX;
    int backup_ay = AY;
    int backup_bx = BX;
    int backup_by = BY;
    int backup_cx = CX;
    int backup_cy = CY;

    // Übertragen der Koordinaten
    AX = ax;
    AY = ay;
    BX = bx;
    BY = by;
    CX = cx;
    CY = cy;

    // Gültigkeit der neuen Koordinaten prüfen
    if (checkpos(0, 0) == true) {

	// Setzen der Linien
	ac.set(ax, ay, cx, cy);
	ab.set(ax, ay, bx, by);
	bc.set(bx, by, cx, cy);
    } else {

	// Zurücksetzen auf alte Koordinaten
	AX = backup_ax;
	AY = backup_ay;
	BX = backup_bx;
	BY = backup_by;
	CX = backup_cx;
	CY = backup_cy;
	std::cerr &lt;&lt; "Punkte des Dreiecks können nicht gesetzt werden." &lt;&lt; std::endl;
    }

}</code></pre>



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



<ul class="wp-block-list">
<li><a href="https://ghadbuloth.dyndns.org/kosi-studium/wp-content/uploads/2012/05/Testf%C3%A4lle_P3.xlsx">Testfälle</a></li>
</ul>



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



<ul class="wp-block-list">
<li>Probleme bei dem Testfall triangle(1,1,7,7,7), da in der ursprünglichen Lösung der berechnete Double-Wert der Längen zwischen Zwei punkten mittels return als Integer-Wert übergeben wurde. Somit wurden die Kommastellen  und es kam zu dem Fehler, dass das Dreieck nicht gezeichnet wurde. Dies betraf jedoch nur Längen mit einer Nachkommastelle größer als .5, dieser Fall wurde jedoch bei den Tests nicht erzeugt.</li>



<li><strong>Künftig müssen die Methoden gründlicher getestet werden!</strong></li>
</ul>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-praktikum-3/">Programmieren, Algorithmen und Datenstrukturen 2 (Praktikum 3)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-praktikum-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 16)</title>
		<link>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-16/</link>
					<comments>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-16/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Thu, 24 May 2012 08:28:00 +0000</pubDate>
				<category><![CDATA[Programmieren 2]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=2506</guid>

					<description><![CDATA[<p>Assoziative Container Verschlüsselung Suchen</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-16/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 16)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">Assoziative Container</h3>



<ul class="wp-block-list">
<li>Map noch nicht in allen Compilern verfügbar</li>
</ul>



<h3 class="wp-block-heading">Verschlüsselung</h3>



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

int main( ) {

string name1 = "shuffled.txt";
string name2 = "klar.txt";
ifstream is( name1.c_str() );
if( !is ) error( "Kein Lesezugriff auf ", name1 );
if( ifstream( name2.c_str() ) )
error( "Datei existiert schon: ", name2 );
ofstream os( name2.c_str() );
if( !os ) error( "Kein Schreibzugriff auf ", name2 );
char c(' ');

// Entschlüsselung
while( (c=is.get()) != EOF ) os.put( (unsigned char)(c^4421)^883 );
return 0;
}
</code></pre>



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



<ul class="wp-block-list">
<li>v[0] = 0.3141</li>



<li>v[1] = 0.3141</li>



<li>v[2] = 0.5555</li>



<li>v[3] = 0.0</li>
</ul>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-16/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 16)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-16/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 15)</title>
		<link>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-15/</link>
					<comments>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-15/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Tue, 22 May 2012 08:28:00 +0000</pubDate>
				<category><![CDATA[Programmieren 2]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=2504</guid>

					<description><![CDATA[<p>Stream-Iteratoren Erstellen einer Wortliste aus einem Textfile</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-15/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 15)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">Stream-Iteratoren</h3>



<ul class="wp-block-list">
<li>cin >> from >> to;  ← es werden keine Fehler abgefangen</li>



<li>.c_str() Char-Array-String, der mit 0 terminiert wird &#8222;Test&#8220; = &#8218;T&#8216; &#8218;e&#8216; &#8217;s&#8216; &#8218;t&#8216; &#8218;\0&#8216;</li>



<li>Wir müssen STL-String in Char-Array umwandeln, weil das OS es so verlangt</li>



<li>ifstream = input file stream</li>



<li>istream_iterator&lt;string> eos; ← Standardmäßig auf letztem Element</li>
</ul>



<p class="wp-block-paragraph">Erstellen einer Wortliste aus einem Textfile</p>



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

int main( ) {
	// Dateinamen für Quell- und Zieldatei einlesen:
	string from, to;
	cin &gt;&gt; from &gt;&gt; to;
	// Ein- und Ausgabe-Stream erstellen:
	ifstream is( from.c_str() ); ofstream os( to.c_str() );
	// Stream-Iterator zur Eingabe:
	istream_iterator&lt;string&gt; ii( is );
	// "end-of-stream" (wird standardmäßig auf EOF/end-of-file gesetzt):
	istream_iterator&lt;string&gt; eos;
	// Stream-Iterator zur Ausgabe, der jedesmal "\n" anhängt:
	ostream_iterator&lt;string&gt; oo( os, "\n" );
	// Das set-Objekt namens buffer wird mit dem Input initialisiert:
	set&lt;string&gt; buffer( ii, eos );
	//multiset&lt;string&gt; buffer( ii, eos );
	// buffer wird in die Ausgabedatei kopiert (set ist bereits sortiert und ohne Duplikate)
	copy( buffer.begin(), buffer.end(), oo );
	return 0;
}</code></pre>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-15/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 15)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-15/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 14)</title>
		<link>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-14/</link>
					<comments>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-14/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Tue, 15 May 2012 08:27:00 +0000</pubDate>
				<category><![CDATA[Programmieren 2]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=2502</guid>

					<description><![CDATA[<p>Binärer Suchbaum Ternärer Suchbaum Klausur Beispiel für map</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-14/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 14)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">Binärer Suchbaum</h3>



<ul class="wp-block-list">
<li>Wie wäre ein binärer Suchbaum mit den sechs Knoten aus dem vorigen Beispiel maximal unvorteilhaft aufgebaut? → Ein komplett einseitig balancierter Baum</li>
</ul>



<h3 class="wp-block-heading">Ternärer Suchbaum</h3>



<ul class="wp-block-list">
<li>Es müssen maximal log<sub>3</sub>( N ) Knoten besucht werden</li>
</ul>



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



<ul class="wp-block-list">
<li>STL-Container kommen dran</li>
</ul>



<h3 class="wp-block-heading">Beispiel für map</h3>



<pre class="wp-block-code"><code>/*
 * File:   main.cpp
 * Author: maximilian.krieg
 *
 * Created on 15. Mai 2012, 14:44
 */

#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;map&gt;
#include &lt;numeric&gt;

using namespace std;

    double value_product(const pair&lt;string, double&gt;&amp; a, const pair&lt;string, double&gt;&amp; b)
    {
	return a.second * b.second;
    }

int main() {
    // Deutscher Aktienindex, 3-Jan-2012
    map&lt;string, double&gt; dax; // pair(symbol,price)
    dax&#91;"DAI"] = 36.11;
    dax&#91;"DTE"] = 9.13;
    dax&#91;"VOW"] = 122.10;
    // …
    map&lt;string, double&gt; dax_weight; // pair(symbol,weight)
    dax_weight.insert(make_pair("DAI", 5.7727));
    dax_weight.insert(make_pair("DTE", 5.3815));
    dax_weight.insert(make_pair("VOW", 3.3586));
    // …
    map&lt;string, string&gt; dax_name; // pair(symbol,name)
    dax_name&#91;"DAI"] = "Daimler";
    dax_name&#91;"DTE"] = "Deutsche Telekom";
    dax_name&#91;"VOW"] = "Volkswagen";
    // …

    double daimler_price = dax&#91;"DAI"]; // Werte aus der map lesen
    double volkswagen_price = dax&#91;"VOW"];

    if (dax.find("SOW") != dax.end()) // Eintrag suchen
	cout &lt;&lt; "Software AG ist im DAX!\n";
    // über die map Elemente iterieren:

    typedef map&lt;string, double&gt;::const_iterator dax_iterator;

    for (dax_iterator p = dax.begin(); p != dax.end(); ++p) {
	const string&amp; symbol = p-&gt;first; // das Symbol im "Ticker"
	cout &lt;&lt; symbol &lt;&lt; '\t' &lt;&lt; p-&gt;second &lt;&lt; '\t'
		&lt;&lt; dax_name&#91;symbol] &lt;&lt; '\n';
    }

    double dax_index =
	    inner_product(dax.begin(), dax.end(), // alle Firmen im DAX
	    dax_weight.begin(), // deren Gewichtung
	    0.0, // Initialisierung mit 0.0
	    plus&lt;double&gt;(), // addieren
	    value_product // zuerst multiplizieren
	    );

    cout &lt;&lt; dax_index;
}</code></pre>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-14/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 14)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-14/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 13)</title>
		<link>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-13/</link>
					<comments>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-13/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Thu, 10 May 2012 08:25:00 +0000</pubDate>
				<category><![CDATA[Programmieren 2]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=2500</guid>

					<description><![CDATA[<p>Klassenbibliotheken STL Vector Liste Iterator Accumulate Funktoren Klausur Multiplies Matrizen Der map-Container Ende: Seite 42</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-13/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 13)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">Klassenbibliotheken</h3>



<ul class="wp-block-list">
<li>Vorgefertigte Container mit vielseitigen Funktionen</li>



<li>Größtenteils standardisiert</li>
</ul>



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



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



<li>Begin() und End() sind die wichtigsten Interatoren einer Elementsequenz</li>



<li>Ein Iterator ist ein Typ der mindestens die Operationen &#8222;++&#8220;, &#8222;*&#8220; und &#8222;==&#8220; beherrscht</li>
</ul>



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



<ul class="wp-block-list">
<li>lückenloses und gekapseltes Datenfeld</li>



<li>Zeiger zeigt auf das erste Element</li>



<li>Beim Einfügen / Insert von Elementen werden alle Folgenden verschoben</li>



<li>Wenn das letzte Element eingefügt wird muss nichts verschoben werden</li>



<li>Alle Zeiger sind nach einem Insert / Delete unbrauchbar → neu bestimmen</li>
</ul>



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



<ul class="wp-block-list">
<li>Funktionsweise nach außen hin wie bei Vector</li>



<li>Aufbau &#8222;unter der Haube&#8220; jedoch ganz anders</li>



<li>leere List enthält mindestens das leere Element</li>
</ul>



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



<ul class="wp-block-list">
<li>Verbesserte Funktion der Zeiger</li>
</ul>



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



<ul class="wp-block-list">
<li>Enthalten in &lt;numeric></li>



<li>Verschieben des Zeigers auf das 1. Element um 1</li>



<li>Addition der Summe + &#8222;1. Element&#8220;</li>



<li>Überladen mit 4 Parametern</li>
</ul>



<pre class="wp-block-code"><code>template
T accumulate( IterIn first, IterIn last, T init ){
while( first!=last ) {
init = init + *first;
++first;
}
return init;
}

//Anwendungsbeispiel
void f( vector&amp; vd, int* p, int n )
{
	// addiere die Elemente von vd:
	// der Typ des 3. Arguments bestimmt auch die Rechengenauigkeit
	double sum = accumulate( vd.begin(), vd.end(), 0.0 );

	// addiere die int Werte in ein int (Überlauf gut möglich):
	// p+n kann man sich grob als &amp;p&#91;n] vorstellen
	int si = accumulate( p, p+n, 0 );

	// addiere die int Werte in ein long:
	long sl = accumulate( p, p+n, long(0) );

	// addiere die int Werte in ein double:
	double s2 = accumulate( p, p+n, 0.0 );

	// die Variable für den Rückgabewert kann im Initialisierer verwendet werden
	double s3 = 0;
	s3 = accumulate( vd.begin(), vd.end(), s3 );
}

int main()
{
	int sum = accumulate( v.begin(), v.end(), 0 );
	// sum wird 10
	// StdLib Header für accumulate(): numeric
}</code></pre>



<pre class="wp-block-code"><code>template
T accumulate( IterIn first, IterIn last, T init, BinOp op )
{
	while( first!=last )
		{
			init = op( init, *first );
			// d.h. "init op *first"
			++first;
		}
	return init;
}

//Anwendungsbeispiel für Multiplikation
#include
void f( list&amp; ld ) {
	double product = accumulate( ld.begin(), ld.end(), 1.0,
	multiplies() );
}</code></pre>



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



<ul class="wp-block-list">
<li>Objekt, dass sich wie eine Funktion verhält und einen Rückgabetyp hat</li>



<li>Erzeugung mittels Überladung der Operatorfunktion &#8222;()&#8220;</li>
</ul>



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



<ul class="wp-block-list">
<li>Funktoren könnten dran kommen</li>
</ul>



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



<ul class="wp-block-list">
<li>bei nicht standardisierten Datentypen muss dieser Funktor überladen werden</li>
</ul>



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



<ul class="wp-block-list">
<li>Objekt im 3. Raum → Tensor</li>
</ul>



<h3 class="wp-block-heading">Der map-Container</h3>



<ul class="wp-block-list">
<li>Beinhaltet eine geordnete Sequenz von Schlüssel- Wert-Paaren, in der man anhand des Schlüssels nach dem zugehörigen Wert suchen kann</li>
</ul>



<pre class="wp-block-code"><code>int main() {
  map&lt;string,int> words; // Worte und ihre Häufigkeit
  string s;
  while( cin>>s &amp;&amp; s!="quit" )
    ++words&#91;s]; // der Schlüssel von words ist vom Typ string
                // die int Werte von words werden mit 0 initialisiert
                // wenn s schon enthalten ist, erhöht map dessen Wert mit ++ um 1
                // wenn s noch nicht enthalten ist, wird ein (s,0)-Paar
                // eingefügt und mit ++ auf den Wert 1 erhöht
                // words&#91;s] liefert int&amp; als Anzahl des Worts s
  typedef map&lt;string,int>::const_iterator Iter;
  for( Iter p = words.begin(); p != words.end(); ++p )
    cout &lt;&lt; p->first &lt;&lt; ':' &lt;&lt; p->second &lt;&lt; '\n';
  return 0;
}</code></pre>



<p class="wp-block-paragraph"><strong>Ende: Seite 42</strong></p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-13/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 13)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-13/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 12)</title>
		<link>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-12/</link>
					<comments>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-12/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Tue, 08 May 2012 08:23:00 +0000</pubDate>
				<category><![CDATA[Programmieren 2]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=2498</guid>

					<description><![CDATA[<p>Organisatorisches Iteratoren Sentinel Templates myIterator</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-12/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 12)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">Organisatorisches</h3>



<ul class="wp-block-list">
<li>Verschiebung aller Praktika um 1 Woche</li>
</ul>



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



<ul class="wp-block-list">
<li>bilden eine Isolierschicht zu Containern</li>



<li>sind eine Klasse innerhalb einer anderen Klasse</li>



<li><strong>erfüllen mindestens die Kriterien:</strong>
<ul class="wp-block-list">
<li>a==b</li>



<li>a!=b</li>



<li>*a</li>



<li>*a=wert</li>



<li>wert = *a</li>



<li>++a</li>
</ul>
</li>



<li><strong>Typen:</strong>
<ul class="wp-block-list">
<li>input</li>



<li>output</li>



<li>forward</li>



<li>bidirectional</li>



<li>random access</li>
</ul>
</li>
</ul>



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



<ul class="wp-block-list">
<li>ist ein Iterator ( Eingebettete Klasse der Liste )</li>



<li>eine Stelle hinter dem letzten Element = .end()</li>



<li>verhindert, dass man über die Liste hinaus geht</li>



<li>ermöglicht den direkten Vergleich begin==end → leere Liste</li>
</ul>



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



<ul class="wp-block-list">
<li>Ohne Standardkonstruktor lässt es sich nicht kompilieren</li>
</ul>



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



<ul class="wp-block-list">
<li>myNode&lt;Elem>* _curr() const; <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2194.png" alt="↔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> wichtig zum Debuggen</li>
</ul>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-12/">Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 12)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2012/05/programmieren-algorithmen-und-datenstrukturen-2-vorlesung-12/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
