<?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[[Gelöst] In einem 2 Dimensionalen Array Nachbarsumme ermitteln]]></title><description><![CDATA[<p>Guten Tag erstmal. Ich könnte da mal ein wenig Hilfe brauchen. Hatten 1-2 Übungsaufgaben letztens inner Schule, jedoch leider keine Möglichkeit mehr diese durchzusprechen und am Montag ne schöne Klausur, wo denn ähnliches drankommen könnte.</p>
<p>Also Aufgabe war es ein 2 Dimensionales Array mit Zufallszahlen zu füllen, dann von jeder Zahl die Nachbarn zu addieren und entweder in einem anderen 2 Dimensionalen Array zu schreiben oder eben das ganze als 3 Dimensionales Array zu behandeln und auf der nächsten Schicht wiedergeben, wofür ich mich entschieden hab.</p>
<p>Es funktioniert zwar, jedoch denk ich mal ist die Lösung von mir eher nicht so elegant, daher wollt ich mal fragen ob es Anregungen gibt, wie man dieses Problem schlauer/kompakter lösen könnte.</p>
<pre><code class="language-cpp">//------------------------------------------------------------------------------
#include &lt;iostream.h&gt;
#include &lt;conio.h&gt;
#include &lt;iomanip.h&gt;
//------------------------------------------------------------------------------
const int MAX = 10;
int vek[MAX][MAX][2];
void fuellen();
void ausgeben(int matrix);
void nachbarn();
void main()
{
	srand(time(NULL));
	fuellen();
	ausgeben(0);
	nachbarn();
	cout &lt;&lt; endl &lt;&lt; endl;
	ausgeben(1);
	getch();
}
void fuellen()
{
	for (int zeile = 0;zeile &lt; MAX;zeile++)
	{
		for (int spalte = 0;spalte &lt; MAX;spalte++)
			vek[zeile][spalte][0] = rand()%31 +20;
	}
}
void ausgeben(int matrix)
{
	for (int zeile = 0;zeile &lt; MAX;zeile++)
	{
		for (int spalte = 0;spalte &lt; MAX;spalte++)
			cout &lt;&lt; setw(5) &lt;&lt; vek[zeile][spalte][matrix];
		cout &lt;&lt; endl &lt;&lt; endl;
	}
}
void nachbarn()
{
	for (int z = 0;z &lt; MAX;z++)
	{
		for (int s = 0;s &lt; MAX;s++)
		{
			if (z == 0 &amp;&amp; s == 0) // Oben-Links
				vek[z][s][1] = vek[z][s+1][0] + vek[z+1][s][0] + vek[z+1][s+1][0];
			else if (z == 23 &amp;&amp; s == 0) // Unten-Links
				vek[z][s][1] = vek[z-1][s][0] + vek[z][s+1][0] + vek[z-1][s+1][0];
			else if (z == 0 &amp;&amp; s == 79) // Oben-Rechts
				vek[z][s][1] = vek[z][s-1][0] + vek[z+1][s][0] + vek[z+1][s-1][0];
			else if (z == 23 &amp;&amp; s == 79) // Unten-Rechts
				vek[z][s][1] = vek[z][s-1][0] + vek[z-1][s][0] + vek[z-1][s-1][0];
			else if (z == 0 &amp;&amp; s != 0 &amp;&amp; s != 79)
				vek[z][s][1] = vek[z][s-1][0] + vek[z][s+1][0] + vek[z+1][s][0]
							+ vek[z+1][s-1][0] + vek[z+1][s+1][0]; // Oben
			else if (z == 23 &amp;&amp; s != 0 &amp;&amp; s != 79)
				vek[z][s][1] = vek[z][s-1][0] + vek[z][s+1][0] + vek[z-1][s][0]
							+ vek[z-1][s-1][0] + vek[z-1][s+1][0]; // Unten
			else if (s == 0 &amp;&amp; z != 0 &amp;&amp; z != 23)
				vek[z][s][1] = vek[z-1][s][0] + vek[z+1][s][0] + vek[z-1][s+1][0]
							+ vek[z][s+1][0] + vek[z+1][s+1][0]; // Links
			else if (s == 79 &amp;&amp; z != 0 &amp;&amp; z != 23)
				vek[z][s][1] = vek[z-1][s][0] + vek[z+1][s][0] + vek[z-1][s-1][0]
							+ vek[z][s-1][0] + vek[z+1][s-1][0]; // Rechts
			else
				vek[z][s][1] = vek[z-1][s-1][0] + vek[z-1][s][0] + vek[z-1][s+1][0]
							+ vek[z][s-1][0] + vek[z][s+1][0] + vek[z+1][s-1][0]
							+ vek[z+1][s][0] + vek[z+1][s+1][0];
		}
	}
}
</code></pre>
<p>Genauer dreht es sich natürlich um den Teil in der Funktion <strong>nachbarn</strong></p>
<p>Die ganzen if-Verzweigungen hab ich eben drin, weil es ja theoretisch 9 Möglichkeiten gibt das ganze zu addieren, in den Ecken gibts jeweils nur 3 Nachbarn, in jeweils 4 Ecken, dann an den 4 Rändern jeweils 5 Nachbarn und in der Mitte gibs dann 8, jedoch denk ich mal das sich das bei weiten schöner lösen lässt oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/265069/gelöst-in-einem-2-dimensionalen-array-nachbarsumme-ermitteln</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Jul 2026 17:05:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/265069.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 17 Apr 2010 13:46:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Gelöst] In einem 2 Dimensionalen Array Nachbarsumme ermitteln on Sat, 17 Apr 2010 15:32:39 GMT]]></title><description><![CDATA[<p>Guten Tag erstmal. Ich könnte da mal ein wenig Hilfe brauchen. Hatten 1-2 Übungsaufgaben letztens inner Schule, jedoch leider keine Möglichkeit mehr diese durchzusprechen und am Montag ne schöne Klausur, wo denn ähnliches drankommen könnte.</p>
<p>Also Aufgabe war es ein 2 Dimensionales Array mit Zufallszahlen zu füllen, dann von jeder Zahl die Nachbarn zu addieren und entweder in einem anderen 2 Dimensionalen Array zu schreiben oder eben das ganze als 3 Dimensionales Array zu behandeln und auf der nächsten Schicht wiedergeben, wofür ich mich entschieden hab.</p>
<p>Es funktioniert zwar, jedoch denk ich mal ist die Lösung von mir eher nicht so elegant, daher wollt ich mal fragen ob es Anregungen gibt, wie man dieses Problem schlauer/kompakter lösen könnte.</p>
<pre><code class="language-cpp">//------------------------------------------------------------------------------
#include &lt;iostream.h&gt;
#include &lt;conio.h&gt;
#include &lt;iomanip.h&gt;
//------------------------------------------------------------------------------
const int MAX = 10;
int vek[MAX][MAX][2];
void fuellen();
void ausgeben(int matrix);
void nachbarn();
void main()
{
	srand(time(NULL));
	fuellen();
	ausgeben(0);
	nachbarn();
	cout &lt;&lt; endl &lt;&lt; endl;
	ausgeben(1);
	getch();
}
void fuellen()
{
	for (int zeile = 0;zeile &lt; MAX;zeile++)
	{
		for (int spalte = 0;spalte &lt; MAX;spalte++)
			vek[zeile][spalte][0] = rand()%31 +20;
	}
}
void ausgeben(int matrix)
{
	for (int zeile = 0;zeile &lt; MAX;zeile++)
	{
		for (int spalte = 0;spalte &lt; MAX;spalte++)
			cout &lt;&lt; setw(5) &lt;&lt; vek[zeile][spalte][matrix];
		cout &lt;&lt; endl &lt;&lt; endl;
	}
}
void nachbarn()
{
	for (int z = 0;z &lt; MAX;z++)
	{
		for (int s = 0;s &lt; MAX;s++)
		{
			if (z == 0 &amp;&amp; s == 0) // Oben-Links
				vek[z][s][1] = vek[z][s+1][0] + vek[z+1][s][0] + vek[z+1][s+1][0];
			else if (z == 23 &amp;&amp; s == 0) // Unten-Links
				vek[z][s][1] = vek[z-1][s][0] + vek[z][s+1][0] + vek[z-1][s+1][0];
			else if (z == 0 &amp;&amp; s == 79) // Oben-Rechts
				vek[z][s][1] = vek[z][s-1][0] + vek[z+1][s][0] + vek[z+1][s-1][0];
			else if (z == 23 &amp;&amp; s == 79) // Unten-Rechts
				vek[z][s][1] = vek[z][s-1][0] + vek[z-1][s][0] + vek[z-1][s-1][0];
			else if (z == 0 &amp;&amp; s != 0 &amp;&amp; s != 79)
				vek[z][s][1] = vek[z][s-1][0] + vek[z][s+1][0] + vek[z+1][s][0]
							+ vek[z+1][s-1][0] + vek[z+1][s+1][0]; // Oben
			else if (z == 23 &amp;&amp; s != 0 &amp;&amp; s != 79)
				vek[z][s][1] = vek[z][s-1][0] + vek[z][s+1][0] + vek[z-1][s][0]
							+ vek[z-1][s-1][0] + vek[z-1][s+1][0]; // Unten
			else if (s == 0 &amp;&amp; z != 0 &amp;&amp; z != 23)
				vek[z][s][1] = vek[z-1][s][0] + vek[z+1][s][0] + vek[z-1][s+1][0]
							+ vek[z][s+1][0] + vek[z+1][s+1][0]; // Links
			else if (s == 79 &amp;&amp; z != 0 &amp;&amp; z != 23)
				vek[z][s][1] = vek[z-1][s][0] + vek[z+1][s][0] + vek[z-1][s-1][0]
							+ vek[z][s-1][0] + vek[z+1][s-1][0]; // Rechts
			else
				vek[z][s][1] = vek[z-1][s-1][0] + vek[z-1][s][0] + vek[z-1][s+1][0]
							+ vek[z][s-1][0] + vek[z][s+1][0] + vek[z+1][s-1][0]
							+ vek[z+1][s][0] + vek[z+1][s+1][0];
		}
	}
}
</code></pre>
<p>Genauer dreht es sich natürlich um den Teil in der Funktion <strong>nachbarn</strong></p>
<p>Die ganzen if-Verzweigungen hab ich eben drin, weil es ja theoretisch 9 Möglichkeiten gibt das ganze zu addieren, in den Ecken gibts jeweils nur 3 Nachbarn, in jeweils 4 Ecken, dann an den 4 Rändern jeweils 5 Nachbarn und in der Mitte gibs dann 8, jedoch denk ich mal das sich das bei weiten schöner lösen lässt oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1884261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884261</guid><dc:creator><![CDATA[Velicity]]></dc:creator><pubDate>Sat, 17 Apr 2010 15:32:39 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] In einem 2 Dimensionalen Array Nachbarsumme ermitteln on Sat, 17 Apr 2010 14:10:39 GMT]]></title><description><![CDATA[<p>Schau dir mal an, was der modulo-Operator (%) macht. Damit kannst du eine einfache, allgemeine Formel für die Nachbarindizes aufstellen, die auch am Rand gilt.</p>
<p>P.S.: Das C++ das ihr in eurer Schule lernt ist der letzte Mist. Auf einem standardkonformen Compiler braucht das was du geschrieben hast nicht zu funktionieren. Sag deinem Lehrer mal, er soll sich ein Lehrbuch zulegen, dass weniger als 20 Jahre alt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1884268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884268</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 17 Apr 2010 14:10:39 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] In einem 2 Dimensionalen Array Nachbarsumme ermitteln on Sat, 17 Apr 2010 14:22:53 GMT]]></title><description><![CDATA[<p>Du kannst die Abfragen viel generischer gestalten und auf Fallunterscheidungen verzichten.</p>
<p>Ich habe mal einen Vorschlag für 4 Nachbarn. Den könntest du erweitern. Eine Klasse <code>Array2D</code> mit überladenem <code>operator[]</code> wäre sicher auch eine gute Möglichkeit.</p>
<pre><code class="language-cpp">#include &lt;array&gt;    // für TR1-Klasse std::tr1::array
#include &lt;iostream&gt; // für Ausgabe

const unsigned int size = 3;
typedef std::tr1::array&lt;std::tr1::array&lt;int, size&gt;, size&gt; Array2D;
// ist wie int[size][size], aber besser ;)
// std::tr1::array kann z.B. kopiert werden und prüft im Debug-Modus Indizes

Array2D RandomArray()
{
	Array2D array;
	for (unsigned int x = 0; x &lt; size; ++x)
		for (unsigned int y = 0; y &lt; size; ++y)
			 array[x][y] = rand()%8 + 5;

	return array;
}

int GetValue(const Array2D&amp; array, int x, int y)
{
	if (x &lt; 0 || x &gt;= size || y &lt; 0 || y &gt;= size)
		return 0;
	else
		return array[x][y];
}

Array2D AdjacentSumArray(const Array2D&amp; array)
{
	Array2D result;
	for (unsigned int x = 0; x &lt; size; ++x)
	{
		for (unsigned int y = 0; y &lt; size; ++y)
		{
			 result[x][y] = GetValue(array, x-1, y)
						  + GetValue(array, x+1, y)
						  + GetValue(array, x, y-1)
						  + GetValue(array, x, y+1);
		}
	}

	return result;
}

void Output(const Array2D&amp; array)
{
	for (unsigned int x = 0; x &lt; size; ++x)
	{
		for (unsigned int y = 0; y &lt; size; ++y)
			std::cout &lt;&lt; array[x][y] &lt;&lt; ' ';
		std::cout &lt;&lt; std::endl;
	}
	std::cout &lt;&lt; std::endl;
}

int main()
{
	Array2D array = RandomArray();	
	Array2D result = AdjacentSumArray(array);

	Output(array);
	Output(result);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1884272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884272</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 17 Apr 2010 14:22:53 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] In einem 2 Dimensionalen Array Nachbarsumme ermitteln on Sat, 17 Apr 2010 14:30:13 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Schau dir mal an, was der modulo-Operator (%) macht. Damit kannst du eine einfache, allgemeine Formel für die Nachbarindizes aufstellen, die auch am Rand gilt.</p>
<p>P.S.: Das C++ das ihr in eurer Schule lernt ist der letzte Mist. Auf einem standardkonformen Compiler braucht das was du geschrieben hast nicht zu funktionieren. Sag deinem Lehrer mal, er soll sich ein Lehrbuch zulegen, dass weniger als 20 Jahre alt ist.</p>
</blockquote>
<p>Modulo haben wir auch schon genutzt, jedoch rein dazu um Wertebereiche bei Zufallszahlen anzugeben oder Nachkommastellen bei Berechnungen wie Pfund/Schilling/Pence oder Stunde/Minute/Sekunde bzw. Quersummen, ansonsten haben wir uns kaum damit beschäftigt.</p>
<p>Zum C++, wir nutzen Borland Turbo C++, hab in den Büchern und Tutorials die ich mir bis jetzt angesehen hab auch nie wirklich das gesehen was wir machen, sondern immer &quot;int main&quot; und namespace std:: usw aber naja unsere Schule ist eh etwas &quot;altmodisch&quot; und das nicht nur bei der Programmierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1884279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884279</guid><dc:creator><![CDATA[Velicity]]></dc:creator><pubDate>Sat, 17 Apr 2010 14:30:13 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] In einem 2 Dimensionalen Array Nachbarsumme ermitteln on Sat, 17 Apr 2010 15:23:34 GMT]]></title><description><![CDATA[<p>Ohh, ich hatte nicht genau genug hingeguckt. Ich hatte gedacht, dass du periodische Ränder haben wolltest. Da wäre modulo das Richtige gewesen. Wenn du am Rand einfach abschneiden willst, dann orientier dich an der Lösung von Nexus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1884302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884302</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 17 Apr 2010 15:23:34 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] In einem 2 Dimensionalen Array Nachbarsumme ermitteln on Sat, 17 Apr 2010 15:32:21 GMT]]></title><description><![CDATA[<p>Da hab ich ehrlich gesagt nicht ganz durchgeblickt, hab nun aber selbst was funktionierendes hinbekommen:</p>
<pre><code class="language-cpp">void nachbarn()
{
	for (int z = 0;z &lt; MAX;z++)
		for (int s = 0;s &lt; MAX;s++)
			vek[z][s][1] = nachbarsumme(z, s);
}
int nachbarsumme(int z, int s)
{
	int summe = 0;
	for (int i = z-1; i &lt; z+2;i++)
		for (int o = s-1;o &lt; s+2;o++)
			if (o &gt;= 0 &amp;&amp; i &gt;= 0 &amp;&amp; o &lt; MAX &amp;&amp; i &lt; MAX)
				summe += vek[i][o][0];
	summe -= vek[z][s][0];
	return summe;
}
</code></pre>
<p>trotzdem natürlich vielen Dank <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1884304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884304</guid><dc:creator><![CDATA[Velicity]]></dc:creator><pubDate>Sat, 17 Apr 2010 15:32:21 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] In einem 2 Dimensionalen Array Nachbarsumme ermitteln on Sat, 17 Apr 2010 15:47:45 GMT]]></title><description><![CDATA[<p>Velicity schrieb:</p>
<blockquote>
<p>Da hab ich ehrlich gesagt nicht ganz durchgeblickt</p>
</blockquote>
<p>Du hättest ja auch nachfragen können. Was verstehst du nicht? Und stör dich nicht am <code>std::tr1::array</code> , für die Funktionalität ist das nicht entscheidend.</p>
<p>Velicity schrieb:</p>
<blockquote>
<p>hab nun aber selbst was funktionierendes hinbekommen</p>
</blockquote>
<p>Meiner Ansicht nach braucht man aber recht lange, um den Quellcode zu verstehen. Sinnvolle Bezeichner würden da schon viel ausmachen. Und wenn von den Operatoren <code>&lt;=</code> und <code>&lt;</code> solltest du den jeweils sinnvolleren verwenden.</p>
<pre><code class="language-cpp">for (int i = z-1; i &lt; z+2;i++)
</code></pre>
<p>wird zu</p>
<pre><code class="language-cpp">for (int z = zeile-1; z &lt;= zeile+1; z++)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1884312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884312</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 17 Apr 2010 15:47:45 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] In einem 2 Dimensionalen Array Nachbarsumme ermitteln on Sat, 17 Apr 2010 16:10:08 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Du hättest ja auch nachfragen können. Was verstehst du nicht? Und stör dich nicht am <code>std::tr1::array</code> , für die Funktionalität ist das nicht entscheidend.</p>
<p>Meiner Ansicht nach braucht man aber recht lange, um den Quellcode zu verstehen. Sinnvolle Bezeichner würden da schon viel ausmachen.</p>
</blockquote>
<p>Naja war nur ne schnelle Lösung, inner Schule benutz ich inner Regel sinnvolle Bezeichner und kommentier ein wenig, war halt nur zum rumprobiern, ist aber bei der Größe denk ich noch überblickbar.</p>
<p>Und naja wir programmieren nunmal leicht anders, als die Version von dir und selbst wenn ichs durchblick gäbe es bei sowas gleich Diskussionen mit dem Lehrer ala &quot;so haben wir das aber nicht gemacht, brauchste ne Extrawurst etc pp.&quot;, daher ist mir schon wichtig das die Lösung in etwa dem entspricht was wir bis dato gemacht haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1884319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884319</guid><dc:creator><![CDATA[Velicity]]></dc:creator><pubDate>Sat, 17 Apr 2010 16:10:08 GMT</pubDate></item><item><title><![CDATA[Reply to [Gelöst] In einem 2 Dimensionalen Array Nachbarsumme ermitteln on Sat, 17 Apr 2010 17:20:54 GMT]]></title><description><![CDATA[<p>Okay. Ich meinte eigentlich nicht, dass du meine Lösung nehmen solltest, eher was du an deiner noch verbessern könntest. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Trotzdem schade, dass du in der Schule nicht selbst denken darfst...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1884333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1884333</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 17 Apr 2010 17:20:54 GMT</pubDate></item></channel></rss>