<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Distanzgraph einlesen + Klasse erstellen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>meine Aufgabe ist es, den Algorithmus von Dijkstra zu implementieren.<br />
Mit diesem soll in einem gegebenen Distanzgraphen von einem Knoten aus<br />
die kürzesten Wege zu den übrigen Knoten berechnet werden.</p>
<p>Ich weiß jedoch nicht, wie ich die gegebenen Dateien einlese:</p>
<p>Als Beispiel: &quot;Graph1.dat&quot;</p>
<blockquote>
<p>4<br />
5</p>
<p>0 1 2.0<br />
0 2 1.5<br />
1 0 1.0<br />
1 2 3.0<br />
3 1 1.0</p>
</blockquote>
<p>Das Eingabeformat ist dabei wie folgt festgelegt: Als erstes kommen die Anzahl der Knoten 𝑁 und die Anzahl der Kanten |𝐸|, anschließend folgen für jede Kante 𝑒 des Graphen der Start- und der Endknoten sowie die Kosten 𝛽(𝑒).</p>
<p>Das Problem liegt für mich darin, dass sich die ersten beiden Zeilen von den<br />
übrigen unterscheiden.<br />
Anderenfalls hätte ich mir den Eingabeoperator wie folgt definiert:</p>
<pre><code>std::istream&amp; operator&gt;&gt; ( std::istream&amp; s, DistGraph&amp; g)
{
    s &gt;&gt; g.Start &gt;&gt; g.Ende &gt;&gt; g.Kosten;
    return s;
}
</code></pre>
<p>Nur wie handhabe ich nun die ersten beiden Zeilen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Für's Einlesen habe ich mir überlegt eine Template-Funktion zu wählen</p>
<pre><code>template&lt;typename ???&gt;
void einlesen( std::ifstream&amp; ifs, /*std::unordered_map&lt;...&gt;&amp; daten ??*/)
{

	while (!ifs.eof())
	{
		ifs &gt;&gt; daten;
		if(!ifs.fail())
			//...
	}

}
</code></pre>
<p>Wäre sehr dankbar, wenn mir jemand mit Tipps zur Seite stehen könnte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Bin ein absoluter Anfänger in C++</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/332643/distanzgraph-einlesen-klasse-erstellen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 16:35:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332643.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 May 2015 02:06:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Distanzgraph einlesen + Klasse erstellen on Thu, 14 May 2015 02:06:45 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>meine Aufgabe ist es, den Algorithmus von Dijkstra zu implementieren.<br />
Mit diesem soll in einem gegebenen Distanzgraphen von einem Knoten aus<br />
die kürzesten Wege zu den übrigen Knoten berechnet werden.</p>
<p>Ich weiß jedoch nicht, wie ich die gegebenen Dateien einlese:</p>
<p>Als Beispiel: &quot;Graph1.dat&quot;</p>
<blockquote>
<p>4<br />
5</p>
<p>0 1 2.0<br />
0 2 1.5<br />
1 0 1.0<br />
1 2 3.0<br />
3 1 1.0</p>
</blockquote>
<p>Das Eingabeformat ist dabei wie folgt festgelegt: Als erstes kommen die Anzahl der Knoten 𝑁 und die Anzahl der Kanten |𝐸|, anschließend folgen für jede Kante 𝑒 des Graphen der Start- und der Endknoten sowie die Kosten 𝛽(𝑒).</p>
<p>Das Problem liegt für mich darin, dass sich die ersten beiden Zeilen von den<br />
übrigen unterscheiden.<br />
Anderenfalls hätte ich mir den Eingabeoperator wie folgt definiert:</p>
<pre><code>std::istream&amp; operator&gt;&gt; ( std::istream&amp; s, DistGraph&amp; g)
{
    s &gt;&gt; g.Start &gt;&gt; g.Ende &gt;&gt; g.Kosten;
    return s;
}
</code></pre>
<p>Nur wie handhabe ich nun die ersten beiden Zeilen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Für's Einlesen habe ich mir überlegt eine Template-Funktion zu wählen</p>
<pre><code>template&lt;typename ???&gt;
void einlesen( std::ifstream&amp; ifs, /*std::unordered_map&lt;...&gt;&amp; daten ??*/)
{

	while (!ifs.eof())
	{
		ifs &gt;&gt; daten;
		if(!ifs.fail())
			//...
	}

}
</code></pre>
<p>Wäre sehr dankbar, wenn mir jemand mit Tipps zur Seite stehen könnte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Bin ein absoluter Anfänger in C++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2453469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2453469</guid><dc:creator><![CDATA[danooh]]></dc:creator><pubDate>Thu, 14 May 2015 02:06:45 GMT</pubDate></item><item><title><![CDATA[Reply to Distanzgraph einlesen + Klasse erstellen on Thu, 14 May 2015 02:34:01 GMT]]></title><description><![CDATA[<p>Du liest es eben einfach am Anfang ein, wo ist das Problem?</p>
<pre><code>stream &gt;&gt; anzahl_knoten &gt;&gt; anzahl_kanten;
while (stream &gt;&gt; kante)
  graph.füge_kante_ein(kante);

// eventuell prüfen, ob Anzahl der Knoten und Kanten passt
</code></pre>
<p>Ein paar Dinge, die mir an deinem Code auffallen:</p>
<blockquote>
<pre><code>std::istream&amp; operator&gt;&gt; ( std::istream&amp; s, DistGraph&amp; g)
{
    s &gt;&gt; g.Start &gt;&gt; g.Ende &gt;&gt; g.Kosten;
    return s;
}
</code></pre>
</blockquote>
<p>Deine Klasse für die Kante scheint dumm benannt zu sein.</p>
<blockquote>
<p>Für's Einlesen habe ich mir überlegt eine Template-Funktion zu wählen</p>
</blockquote>
<p>Wieso nicht so wie oben, mit einem operator&gt;&gt;, aber eben für deine Graphenklasse? Im Prinzip ist mein Codebeispiel schon der fast fertige operator&gt;&gt; für den Graphen.</p>
<blockquote>
<pre><code>while (!ifs.eof())
    {
        ifs &gt;&gt; daten;
        if(!ifs.fail())
            //...
    }
</code></pre>
</blockquote>
<p>Kommt dir das nicht ein wenig umständlich vor? Erst prüfst du auf Fehler, dann liest du, dann prüfst du auf Fehler, dann verarbeitest du, dann wieder von vorne. Da ist doch eine Prüfung total überflüssig. Warum nicht: Lesen, Prüfen, Verarbeiten? Siehe, wie ich das oben in meinem Pseudocode gemacht habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2453470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2453470</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 14 May 2015 02:34:01 GMT</pubDate></item><item><title><![CDATA[Reply to Distanzgraph einlesen + Klasse erstellen on Thu, 14 May 2015 12:44:06 GMT]]></title><description><![CDATA[<p>Das Ganze soll mittels einer Klasse 'DistGraph' implementiert werden.</p>
<p>Und diese Klasse muss (meiner Meinung nach) fünf Attribute aufweisen:</p>
<pre><code>int knoten, kanten, start, ende;
double kosten;
</code></pre>
<p>Und hier versteh' ich nun nicht wie ich mittels operator&gt;&gt;<br />
die erste Zeile als Anzahl 'knoten', die zweite als Anzahl<br />
'kanten', und die restlichen Zeilen eben als 'start' 'ende' 'kosten'.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<blockquote>
<pre><code>while (!ifs.eof())
    {
        ifs &gt;&gt; daten;
        if(!ifs.fail())
            //...
    }
</code></pre>
</blockquote>
<p>Kommt dir das nicht ein wenig umständlich vor? Erst prüfst du auf Fehler, dann liest du, dann prüfst du auf Fehler, dann verarbeitest du, dann wieder von vorne. Da ist doch eine Prüfung total überflüssig. Warum nicht: Lesen, Prüfen, Verarbeiten? Siehe, wie ich das oben in meinem Pseudocode gemacht habe.</p>
</blockquote>
<p>Nunja, in meinem letzten Programm habe ich zuerst nur mit</p>
<pre><code>while (!ifs.eof())
</code></pre>
<p>gearbeitet. Dann wurde die letzte Zeile der .txt Datei jedoch immer doppelt eingelesen. Die zweite Prüfung hat das Problem gelöst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2453490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2453490</guid><dc:creator><![CDATA[danooh]]></dc:creator><pubDate>Thu, 14 May 2015 12:44:06 GMT</pubDate></item><item><title><![CDATA[Reply to Distanzgraph einlesen + Klasse erstellen on Thu, 14 May 2015 13:12:15 GMT]]></title><description><![CDATA[<p>danooh schrieb:</p>
<blockquote>
<p>Das Ganze soll mittels einer Klasse 'DistGraph' implementiert werden.</p>
<p>Und diese Klasse muss (meiner Meinung nach) fünf Attribute aufweisen:</p>
<pre><code>int knoten, kanten, start, ende;
double kosten;
</code></pre>
</blockquote>
<p>Das kommt aber nicht so ganz hin.</p>
<p>Offenbar willst du einen Graphen mit Knotengewichten/kosten modellieren. Ein Graph besteht dabei aus n Knoten und m Kanten (die ersten 2 Zahlend einer Datei). Jede Kante wiederum besteht aus einem Start- und einem Endknoten und einem Gewicht (die folgenden zeilen deiner Datei).</p>
<p>D.h. du willst deinen Graph einlesen, was beinhaltet, dass du im Zuge dessen Kanten einliest.</p>
<p>Ich würde das in etwa so machen:</p>
<pre><code>#include &lt;fstream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;iterator&gt;

class Edge
{
	std::size_t start;
	std::size_t end;
	double weight;

public:
	friend std::istream&amp; operator &gt;&gt;(std::istream &amp; is, Edge &amp; e)
	{
		is &gt;&gt; e.start &gt;&gt; e.end &gt;&gt; e.weight;
		return is;
	}
};

class Graph
{
	std::size_t vertices;
	std::vector&lt;Edge&gt; edges;

public:
	friend std::istream&amp; operator &gt;&gt;(std::istream &amp; is, Graph &amp; e)
	{
		std::size_t edgeCount;
		is &gt;&gt; e.vertices &gt;&gt; edgeCount;

		e.edges.resize(edgeCount);
		std::copy_n(std::istream_iterator&lt;Edge&gt;(is), edgeCount, std::begin(e.edges));

		return is;
	}
};

int main()
{
	std::ifstream file(&quot;graph.txt&quot;);

	Graph g;

	file &gt;&gt; g;

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2453491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2453491</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 14 May 2015 13:12:15 GMT</pubDate></item></channel></rss>