<?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[Zahlen sortieren, rekursive Funktion]]></title><description><![CDATA[<p>Hallo,</p>
<p>meine Aufgabe ist es Zahlen, die eingelesen werden in einer rekursiven Funktion zu sortieren, leider habe ich nie zuvor Rekursionen verwendet und stehe etwas auf der Leitung.</p>
<p>Die rekursive Funktion lässt sich am besten mit Zeigern lösen, der Zeiger muss dann das erste Feld nicht mehr mitberechnen. (siehe Text, bzw. Angabe)</p>
<p>Angabe:</p>
<blockquote>
<p>Schreiben Sie ein Programm, das beliebig viele Zahlen (maximal 50) einliest und fallend sortiert wieder ausgibt. Verwenden Sie zum Sortieren folgenden rekursiven Algorithmus: Zunächst wird das Maximum gesucht und an die erste Stelle der Liste gesetzt. Dann wird dieser Vorgang mit der restlichen (um ein Element kürzeren) Liste wiederholt, so lange bis die Länge der Liste 1 ist.<br />
Bemerkung: Die Programmierung kann recht einfach erfolgen, wenn für die Liste ein globales Feld verwendet wird.</p>
</blockquote>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int feld[50]; 

int maximum(int *n=feld) 
{ 
	if (!n) // Welchen Ansatz brauche ich um die rekursive Funktion zu beenden?
	return 0;

    int i=0, x[1], y, max=0;

    for(;feld[i]; i++) { 
		if (feld[i] &gt; max){ max = feld[i]; y = i;}; //das Maximum der Zahlen wird bestimmt
    } 

	x[0] = feld[0]; //der größte Wert wird an den Anfang gesetzt
	feld[0] = feld[y];
	feld[y] = x[0];

	for(int q = 0; feld[q];q++)
	cout &lt;&lt; feld[q] &lt;&lt; endl;

	return maximum(n++); // Wie verkürze ich den Zeiger auf das Feld richtig?
}
int main () {

	cout &lt;&lt; &quot;Wieviele Zahlen möchten Sie eingeben?: &quot; &lt;&lt; endl;
	int anzahl, i = 0;
	cin &gt;&gt; anzahl;
	cout &lt;&lt; endl;

	for(;i&lt;anzahl;i++)
		{
		cin &gt;&gt; feld[i];	// Alle Werte werden eingelesen
		}

	cout &lt;&lt; endl;
	maximum();
	cin &gt;&gt; i;

return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/277589/zahlen-sortieren-rekursive-funktion</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 20:06:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277589.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 21 Nov 2010 13:00:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Sun, 21 Nov 2010 13:00:20 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>meine Aufgabe ist es Zahlen, die eingelesen werden in einer rekursiven Funktion zu sortieren, leider habe ich nie zuvor Rekursionen verwendet und stehe etwas auf der Leitung.</p>
<p>Die rekursive Funktion lässt sich am besten mit Zeigern lösen, der Zeiger muss dann das erste Feld nicht mehr mitberechnen. (siehe Text, bzw. Angabe)</p>
<p>Angabe:</p>
<blockquote>
<p>Schreiben Sie ein Programm, das beliebig viele Zahlen (maximal 50) einliest und fallend sortiert wieder ausgibt. Verwenden Sie zum Sortieren folgenden rekursiven Algorithmus: Zunächst wird das Maximum gesucht und an die erste Stelle der Liste gesetzt. Dann wird dieser Vorgang mit der restlichen (um ein Element kürzeren) Liste wiederholt, so lange bis die Länge der Liste 1 ist.<br />
Bemerkung: Die Programmierung kann recht einfach erfolgen, wenn für die Liste ein globales Feld verwendet wird.</p>
</blockquote>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int feld[50]; 

int maximum(int *n=feld) 
{ 
	if (!n) // Welchen Ansatz brauche ich um die rekursive Funktion zu beenden?
	return 0;

    int i=0, x[1], y, max=0;

    for(;feld[i]; i++) { 
		if (feld[i] &gt; max){ max = feld[i]; y = i;}; //das Maximum der Zahlen wird bestimmt
    } 

	x[0] = feld[0]; //der größte Wert wird an den Anfang gesetzt
	feld[0] = feld[y];
	feld[y] = x[0];

	for(int q = 0; feld[q];q++)
	cout &lt;&lt; feld[q] &lt;&lt; endl;

	return maximum(n++); // Wie verkürze ich den Zeiger auf das Feld richtig?
}
int main () {

	cout &lt;&lt; &quot;Wieviele Zahlen möchten Sie eingeben?: &quot; &lt;&lt; endl;
	int anzahl, i = 0;
	cin &gt;&gt; anzahl;
	cout &lt;&lt; endl;

	for(;i&lt;anzahl;i++)
		{
		cin &gt;&gt; feld[i];	// Alle Werte werden eingelesen
		}

	cout &lt;&lt; endl;
	maximum();
	cin &gt;&gt; i;

return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1983607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983607</guid><dc:creator><![CDATA[downandout]]></dc:creator><pubDate>Sun, 21 Nov 2010 13:00:20 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Sun, 21 Nov 2010 13:15:48 GMT]]></title><description><![CDATA[<p>Nimm so einen Funktionskopf:</p>
<pre><code class="language-cpp">void maximum(int *n, int anzahl)
{
  // Die for-Schleifen lauten jetzt:
  for (int i=0; i&lt;anzahl; ++i) {
    ...
  }

  // Am Schluss:
  if (anzahl &gt; 1)
    maximum(n+1, anzahl-1);
}
</code></pre>
<p>Das swappen kannst du übrigens auch noch einfacher implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983618</guid><dc:creator><![CDATA[Rekurs]]></dc:creator><pubDate>Sun, 21 Nov 2010 13:15:48 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Sun, 21 Nov 2010 13:29:44 GMT]]></title><description><![CDATA[<p>Ok, machen wir es mal mit Arrays. Ist in C++ zwar unnötig umständlich, aber wenn du auf Selbstquälerei stehst, ist das nicht mein Problem:</p>
<pre><code class="language-cpp">int feld[50];
</code></pre>
<p>Nicht nur, dass du Arrays benutzt, jetzt sind sie auch noch global. Extrem schlechter Stil und ganz ohne Not, dass du dies tust.</p>
<pre><code class="language-cpp">int maximum(int *n=feld)
</code></pre>
<ul>
<li>Ich dachte, die Funktion soll sortieren, warum heißt sie maximum?</li>
<li>Was soll der Returnwert? Vom Namen her würde man ja erwarten, dass ein Maximum zurückgegeben wird, aber das passt überhaupt nicht zu deinem Code. Und falls es eine Sortierfunktion auf einem Feld sein soll, dann ist der Rückgabewert doch wohl eher void.</li>
<li><code>int *n=feld</code> Weißt du überhaupt, was das macht?</li>
<li>Wenn du schon Arrays benutzt, dann solltest du auch wissen, dass man die Größe mit übergeben muss.</li>
<li>Insgesamt: <code>void sortieren(int *n, int size)</code> wäre eine wesentlich geeignetere Funktionssignatur</li>
</ul>
<pre><code class="language-cpp">if (!n) // Welchen Ansatz brauche ich um die rekursive Funktion zu beenden?
</code></pre>
<p>Jetzt wo du die Größe hast, wäre size==1 eine geeignete Abbruchbedingung</p>
<pre><code class="language-cpp">return 0;
</code></pre>
<p>Mir ist immer noch nicht klar, was der Returnwert überhaupt bedeuten soll. Falsl du meinen Vorschlag von oben übernimmst, gehört hier ein einfaches return hin.</p>
<pre><code class="language-cpp">int i=0, x[1], y, max=0;

    for(;feld[i]; i++) {
        if (feld[i] &gt; max){ max = feld[i]; y = i;}; //das Maximum der Zahlen wird bestimmt
    }
</code></pre>
<ul>
<li>Was sind das für blöde Variablennamen? i geht ja noch als traditioneller Name für Zahlvariablen, aber x und y sagen überhaupt nichts aus.</li>
<li>Was soll die Abbruchbedingung?</li>
<li>Inwiefern ist 0 ein guter Startwert für max?</li>
<li>Hat es einen tieferen Sinn, i nicht innerhalb des Schleifenkopfes zu deklarieren?</li>
</ul>
<pre><code class="language-cpp">x[0] = feld[0]; //der größte Wert wird an den Anfang gesetzt
    feld[0] = feld[y];
    feld[y] = x[0];
</code></pre>
<ul>
<li>Wozu muss dafür x vom Typ int[1] sein?</li>
<li>Wieso so umständlich? Wozu hast du dir denn sonst vorher das max gemerkt?</li>
</ul>
<pre><code class="language-cpp">for(int q = 0; feld[q];q++)
    cout &lt;&lt; feld[q] &lt;&lt; endl;
</code></pre>
<p>Schon wieder eine völlig sinnlose Abbruchbedingung</p>
<pre><code class="language-cpp">return maximum(n++); // Wie verkürze ich den Zeiger auf das Feld richtig?
</code></pre>
<p>Warum willst du n um 1 erhöhen? Du willst doch bloß einen um eins größeren Wert an die Funktion übergeben, also n+1.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983627</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 21 Nov 2010 13:29:44 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Sun, 21 Nov 2010 20:28:56 GMT]]></title><description><![CDATA[<p>Danke, für die Kritik hatte sie dringend nötig!<br />
Echt vielen Dank, hat mir sehr weitergeholfen!</p>
<p>Programm funktioniert jetzt.</p>
<p>Habe, aber noch ein paar Fragen, um meine Programmierung für später zu verbessern!</p>
<p>Warum ist das Anlegen eines Feldes umständlich? Alternativen?</p>
<p>Wie vermeide ich in diesem Fall das globale Feld?</p>
<p>Ich habe den kleinsten Integer Wert eingegeben, aber soviel ich weiß ist dieser ja in C++ nicht definiert, wie kann ich den kleinsten möglichen Integer Wert für jedes beliebe System, andem ich mein Programm ausführe ermitteln?</p>
<p>Wie vermeide ich, das mehr als 50 Werte eingegeben werden, wenn die Anzahl der einzugebenden Werte nicht vorher definiert wurde?</p>
<p>Kann ich mein Programm noch verbessern?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int feld[50]; 

void sortieren (int *n, int size) 
{ 

    int positionmax, max=-2147483648;

    for(int i=0;n[i]; i++) { 
		if (n[i] &gt; max){ max = n[i]; positionmax = i;}; 
    } 

	n[positionmax] = n[0];
	n[0] = max;

	  if (size &gt; 1) 
    sortieren(n+1, size-1);

	return;
}
int main () {

	cout &lt;&lt; &quot;Wieviele Zahlen moechten Sie eingeben?: &quot; &lt;&lt; endl;
	int anzahl;
	cin &gt;&gt; anzahl;
	cout &lt;&lt; endl;

	int size = 0;
	for(;size&lt;anzahl;size++)
		{
		cin &gt;&gt; feld[size];
		}

	cout &lt;&lt; endl;

	int *n=feld;
	sortieren(n,size);

		for(int q = 0; feld[q];q++)
	cout &lt;&lt; feld[q] &lt;&lt; endl;

	int i;
	cin &gt;&gt; i;

return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1983863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983863</guid><dc:creator><![CDATA[downandout]]></dc:creator><pubDate>Sun, 21 Nov 2010 20:28:56 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Sun, 21 Nov 2010 20:40:18 GMT]]></title><description><![CDATA[<p>downandout schrieb:</p>
<blockquote>
<pre><code class="language-cpp">cout &lt;&lt; &quot;Wieviele Zahlen moechten Sie eingeben?: &quot; &lt;&lt; endl;
int anzahl;
cin &gt;&gt; anzahl;
cout &lt;&lt; endl;
	
int size = 0;
for(;size&lt;anzahl;size++) {
  cin &gt;&gt; feld[size];
}

cout &lt;&lt; endl;

int *n=feld;
sortieren(n,size);
</code></pre>
</blockquote>
<p>Das hätte ich so umgeschrieben:</p>
<pre><code class="language-cpp">cout &lt;&lt; &quot;Wieviele Zahlen moechten Sie eingeben?: &quot; &lt;&lt; endl;
int anzahl;
cin &gt;&gt; anzahl;
int *feld = new int[anzahl]; // damit ersparst du dir das globale Array
for (int i=0; i&lt;anzahl; i++) {
  cin &gt;&gt; anzahl[size];
}
sortieren(feld, size);
</code></pre>
<p>Das return auf Zeile 25 kannst du dir sparen und max (Z. 11) hätte ich mit n[0] initialisiert ;).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983869</guid><dc:creator><![CDATA[Rekurs]]></dc:creator><pubDate>Sun, 21 Nov 2010 20:40:18 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Sun, 21 Nov 2010 20:46:19 GMT]]></title><description><![CDATA[<p>downandout schrieb:</p>
<blockquote>
<p>Warum ist das Anlegen eines Feldes umständlich? Alternativen?</p>
</blockquote>
<p>Du könntest auch einen std::vector nehmen. Den kann man beliebig vergrößern und verkleinern, er hat eine Kopiersemantik und er kennt seine eigene Größe.</p>
<blockquote>
<p>Wie vermeide ich in diesem Fall das globale Feld?</p>
</blockquote>
<p>Indem du es nicht global machst? Warum ist es das im Moment überhaupt? Ich sehe nirgendwo, dass du diese Eigenschaft benutzt (und das ist auch gut so).</p>
<blockquote>
<p>Ich habe den kleinsten Integer Wert eingegeben, aber soviel ich weiß ist dieser ja in C++ nicht definiert, wie kann ich den kleinsten möglichen Integer Wert für jedes beliebe System, andem ich mein Programm ausführe ermitteln?</p>
</blockquote>
<p>1. Der kleinste Wert ist definiert. Iim climits-Header. Sowohl als Makro als auch in der Klasse numric_limits&lt;int&gt;.<br />
2. Aber besser: Setz es doch einfach auf den ersten Wert.</p>
<blockquote>
<p>Wie vermeide ich, das mehr als 50 Werte eingegeben werden, wenn die Anzahl der einzugebenden Werte nicht vorher definiert wurde?</p>
</blockquote>
<p>Das ist schon ok. Alternativ könntest du bei den Eingaben mitzählen. Die willkürliche Grenze 50 macht in der Aufgabenstellung aber an sich keinen Sinn. Würdest du std::vector benutzen, gäbe es gar keinen Grund sich einzuschränken.</p>
<blockquote>
<p>Kann ich mein Programm noch verbessern?</p>
</blockquote>
<p>Sieht recht gut aus. Frag aber auf jeden Fall noch ab, ob die eingegebene Anzahl auch kleiner als 50 ist. Ansonsten siehe oben. Dein Einrückungsstil ist noch ein wenig ungewöhnlich.</p>
<p>edit: <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Ganz wichtig! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Du hast keine Abbruchbedingung für die Rekursion!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983872</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 21 Nov 2010 20:46:19 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Sun, 21 Nov 2010 21:59:22 GMT]]></title><description><![CDATA[<p>@ Rekurs:</p>
<p>Deine Schleifen-Abbruchbedingungen funktionieren so nicht - bzw. nur zufällig. Gib mal 5 Werte ein und eine 0 darin... Öha!</p>
<p>Frage: was macht das n[i] (bzw. das feld[q]) in der for-Schleife?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983906</guid><dc:creator><![CDATA[minstaros]]></dc:creator><pubDate>Sun, 21 Nov 2010 21:59:22 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Sun, 21 Nov 2010 22:09:58 GMT]]></title><description><![CDATA[<p>oh, ich meinte <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/25012">@downandout</a>...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983921</guid><dc:creator><![CDATA[minstaros]]></dc:creator><pubDate>Sun, 21 Nov 2010 22:09:58 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Sun, 21 Nov 2010 22:15:17 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Du hast keine Abbruchbedingung für die Rekursion!</p>
</blockquote>
<p>Die hat er doch?</p>
<p>downandout schrieb:</p>
<blockquote>
<pre><code class="language-cpp">if (size &gt; 1)
    sortieren(n+1, size-1);
return;
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1983927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983927</guid><dc:creator><![CDATA[Rekurs]]></dc:creator><pubDate>Sun, 21 Nov 2010 22:15:17 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Sun, 21 Nov 2010 22:23:16 GMT]]></title><description><![CDATA[<p>Rekurs schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Du hast keine Abbruchbedingung für die Rekursion!</p>
</blockquote>
<p>Die hat er doch?</p>
<p>downandout schrieb:</p>
<blockquote>
<pre><code class="language-cpp">if (size &gt; 1)
    sortieren(n+1, size-1);
return;
</code></pre>
</blockquote>
</blockquote>
<p>Oh stimmt. Hatte zuerst gedacht, dass sie fehlt, weil ich nur am Anfang der Funktion geguckt habe, wo sie vorher stand.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983933</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 21 Nov 2010 22:23:16 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Sun, 21 Nov 2010 22:41:28 GMT]]></title><description><![CDATA[<p>Sepp3 hat in sofern recht: Die Abbruchbedingung der Rekursion ist am <em>Beginn</em> der Funktion oft geschickter. Warum:<br />
Was passiert, wenn das Feld nur 1 Element oder gar 0 hat?<br />
Die Eleganz der Rekursion kommt eigentlich in dem Moment, wo man zu Beginn</p>
<pre><code class="language-cpp">if( size &lt;= 1 ) return;
</code></pre>
<p>sagen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983940</guid><dc:creator><![CDATA[minstaros]]></dc:creator><pubDate>Sun, 21 Nov 2010 22:41:28 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Mon, 22 Nov 2010 00:34:20 GMT]]></title><description><![CDATA[<p>minstaros schrieb:</p>
<blockquote>
<p>@ Rekurs:</p>
<p>Deine Schleifen-Abbruchbedingungen funktionieren so nicht - bzw. nur zufällig. Gib mal 5 Werte ein und eine 0 darin... Öha!</p>
<p>Frage: was macht das n[i] (bzw. das feld[q]) in der for-Schleife?</p>
</blockquote>
<p>Wie meinst du das mit den Schleifen-Abbruchbedingungen, bzw. wie würdest das lösen?</p>
<p>Schleife wird beendet sobald n[i] negativ wird also &quot;False&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983966</guid><dc:creator><![CDATA[downandout]]></dc:creator><pubDate>Mon, 22 Nov 2010 00:34:20 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Mon, 22 Nov 2010 00:40:28 GMT]]></title><description><![CDATA[<p>Rekurs schrieb:</p>
<blockquote>
<p>downandout schrieb:</p>
<blockquote>
<pre><code class="language-cpp">cout &lt;&lt; &quot;Wieviele Zahlen moechten Sie eingeben?: &quot; &lt;&lt; endl;
int anzahl;
cin &gt;&gt; anzahl;
cout &lt;&lt; endl;
	
int size = 0;
for(;size&lt;anzahl;size++) {
  cin &gt;&gt; feld[size];
}

cout &lt;&lt; endl;

int *n=feld;
sortieren(n,size);
</code></pre>
</blockquote>
<p>Das hätte ich so umgeschrieben:</p>
<pre><code class="language-cpp">cout &lt;&lt; &quot;Wieviele Zahlen moechten Sie eingeben?: &quot; &lt;&lt; endl;
int anzahl;
cin &gt;&gt; anzahl;
int *feld = new int[anzahl]; // damit ersparst du dir das globale Array
for (int i=0; i&lt;anzahl; i++) {
  cin &gt;&gt; anzahl[size];
}
sortieren(feld, size);
</code></pre>
<p>Das return auf Zeile 25 kannst du dir sparen und max (Z. 11) hätte ich mit n[0] initialisiert ;).</p>
</blockquote>
<p>Wie funktioniert dieser Zeiger auf ein new int Feld, welchen Geltungsbereich hat der Zeiger, das ganze Programm über auch in den Funktionen sobald dieser Befehl aufgerufen wurde? --&gt; gibts da nicht einen delete() befehl dazu?!</p>
<p>Warum sind globale Variablen überhaupt so eine schlimme Sünde? Ich arbeite bis jetzt gerne mit denen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1983967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983967</guid><dc:creator><![CDATA[downandout]]></dc:creator><pubDate>Mon, 22 Nov 2010 00:40:28 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Mon, 22 Nov 2010 07:26:57 GMT]]></title><description><![CDATA[<p>downandout schrieb:</p>
<blockquote>
<p>Wie funktioniert dieser Zeiger auf ein new int Feld, welchen Geltungsbereich hat der Zeiger, das ganze Programm über auch in den Funktionen sobald dieser Befehl aufgerufen wurde? --&gt; gibts da nicht einen delete() befehl dazu?!</p>
</blockquote>
<p>Vergiss das lieber mit dem new und delete. Das ist absolut kein Anfängerthema und hier absolut nicht angemessen. Das globale Array kannst du dir auch sparen, indem du die Definition einfach in die main schreibst, wo du das Array benutzt.</p>
<blockquote>
<p>Warum sind globale Variablen überhaupt so eine schlimme Sünde? Ich arbeite bis jetzt gerne mit denen <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>
</blockquote>
<p>Sie machen dir bei komplexen Programmen das Leben zur Hölle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983992</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 22 Nov 2010 07:26:57 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Mon, 22 Nov 2010 08:30:15 GMT]]></title><description><![CDATA[<p>downandout schrieb:</p>
<blockquote>
<p>minstaros schrieb:</p>
<blockquote>
<p>@ Rekurs:</p>
<p>Deine Schleifen-Abbruchbedingungen funktionieren so nicht - bzw. nur zufällig. Gib mal 5 Werte ein und eine 0 darin... Öha!</p>
<p>Frage: was macht das n[i] (bzw. das feld[q]) in der for-Schleife?</p>
</blockquote>
<p>Wie meinst du das mit den Schleifen-Abbruchbedingungen, bzw. wie würdest das lösen?</p>
<p>Schleife wird beendet sobald n[i] negativ wird also &quot;False&quot;.</p>
</blockquote>
<p>Nö - n[i] kann ruhig negativ sein - das führt zu keinem Abbruch (und soll es ja auch nicht). Wenn n[i] allerdings 0 ist wird abgebrochen.<br />
Will man das? Nein. Es könnte doch durchaus sein, dass man die Zahl 0 eingegeben hat. Das soll natürlich nicht zu einem Abbruch führen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984016</guid><dc:creator><![CDATA[inter2k3]]></dc:creator><pubDate>Mon, 22 Nov 2010 08:30:15 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Mon, 22 Nov 2010 10:21:55 GMT]]></title><description><![CDATA[<p>downandout schrieb:</p>
<blockquote>
<p>Wie meinst du das mit den Schleifen-Abbruchbedingungen, bzw. wie würdest das lösen?</p>
<p>Schleife wird beendet sobald n <em>negativ wird also &quot;False&quot;.</em></p>
</blockquote>
<p>*Vorsicht, Du verwechselst ein paar Dinge.</p>
<ul>
<li>For-Schleifen laufen so lange, so lange die Bedingung im mittleren Argument &quot;wahr&quot; ist. Das ist in den meisten Fällen ein Vergleich (z.B. i &lt; 5 ), kann aber auch eine Variable/Pointer oder ein Funktionsaufruf sein.</li>
<li>&quot;wahr&quot; (besser: true) ist alles, was nicht gleich 0 ist, d.h. umgekehrt 0 --&gt; false. Hat also mit negativem oder positivem Wertebereich nichts zu tun. Zudem: <strong>Wie</strong> sollte ein n[ i ] in Deinem Sortierarray auf einmal negativ werden?</li>
<li>n[ i ] entspricht dem Inhalt des Elements i Deines Arrays. Wenn Du also z.B. 5 Elemente hast, wird beim Durchlauf mit i==5 bereits der Inhalt des <strong>6.</strong> Elements angesprochen. Dieses liegt bereits <strong>hinter</strong> dem erlaubten Bereich: Du darfst aber nur die Elemente n[0] bis n[4] verwenden!<br />
Nur durch Zufall waren bei Deinen Probeläufen die anderen Elemente auch 0, daher hat die Schleife scheinbar korrekt abgebrochen, aber da das Array nicht initialisiert ist, kannst Du Dich nicht darauf verlassen. Wenn nämlich alle Elemente des Array-Speichers zufällig != 0 sind (und ggf. auch die 10000 Bytes danach), wird Deine Schleife &quot;etwas&quot; mehr zu tun bekommen. Und da im Anschluß noch Elemente in diesem Speicher kopiert werden, knallt es. Eine Art Buffer overflow.</li>
</ul>
<p>Ein weiterer Punkt ist die Variable <strong>positionmax</strong>. Da diese nicht initialisiert wird, kann jeder beliebige Wert drin stehen! Was passiert nun mit positionmax, wenn Du sortieren( ) mit size = 0 aufrufst? (Unabhängig der Diskussion, ob das [i]sinnvoll* ist: Es ist <em>möglich</em>, und ein size vom Typ int erlaubt auch eine 0, daher muss man das berücksichtigen. Korrekter wäre übrigens ein <em>unsigned int</em>.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984051</guid><dc:creator><![CDATA[minstaros]]></dc:creator><pubDate>Mon, 22 Nov 2010 10:21:55 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Mon, 22 Nov 2010 10:40:04 GMT]]></title><description><![CDATA[<p>PS: Das Problem mit positionmax besteht auch bei <em>beliebigem</em> size, wenn die Liste vorher bereits korrekt sortiert ist (beobachte positionmax im Zusammenhang mit der if-Abfrage in der For-Schleife).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984066</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984066</guid><dc:creator><![CDATA[minstaros]]></dc:creator><pubDate>Mon, 22 Nov 2010 10:40:04 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Tue, 23 Nov 2010 21:01:16 GMT]]></title><description><![CDATA[<p>minstaros schrieb:</p>
<blockquote>
<p>downandout schrieb:</p>
<blockquote>
<p>Wie meinst du das mit den Schleifen-Abbruchbedingungen, bzw. wie würdest das lösen?</p>
<p>Schleife wird beendet sobald n <em>negativ wird also &quot;False&quot;.</em></p>
</blockquote>
<p>*Vorsicht, Du verwechselst ein paar Dinge.</p>
<ul>
<li>For-Schleifen laufen so lange, so lange die Bedingung im mittleren Argument &quot;wahr&quot; ist. Das ist in den meisten Fällen ein Vergleich (z.B. i &lt; 5 ), kann aber auch eine Variable/Pointer oder ein Funktionsaufruf sein.</li>
<li>&quot;wahr&quot; (besser: true) ist alles, was nicht gleich 0 ist, d.h. umgekehrt 0 --&gt; false. Hat also mit negativem oder positivem Wertebereich nichts zu tun. Zudem: <strong>Wie</strong> sollte ein n[ i ] in Deinem Sortierarray auf einmal negativ werden?</li>
<li>n[ i ] entspricht dem Inhalt des Elements i Deines Arrays. Wenn Du also z.B. 5 Elemente hast, wird beim Durchlauf mit i==5 bereits der Inhalt des <strong>6.</strong> Elements angesprochen. Dieses liegt bereits <strong>hinter</strong> dem erlaubten Bereich: Du darfst aber nur die Elemente n[0] bis n[4] verwenden!<br />
Nur durch Zufall waren bei Deinen Probeläufen die anderen Elemente auch 0, daher hat die Schleife scheinbar korrekt abgebrochen, aber da das Array nicht initialisiert ist, kannst Du Dich nicht darauf verlassen. Wenn nämlich alle Elemente des Array-Speichers zufällig != 0 sind (und ggf. auch die 10000 Bytes danach), wird Deine Schleife &quot;etwas&quot; mehr zu tun bekommen. Und da im Anschluß noch Elemente in diesem Speicher kopiert werden, knallt es. Eine Art Buffer overflow.</li>
</ul>
<p>Ein weiterer Punkt ist die Variable <strong>positionmax</strong>. Da diese nicht initialisiert wird, kann jeder beliebige Wert drin stehen! Was passiert nun mit positionmax, wenn Du sortieren( ) mit size = 0 aufrufst? (Unabhängig der Diskussion, ob das [i]sinnvoll* ist: Es ist <em>möglich</em>, und ein size vom Typ int erlaubt auch eine 0, daher muss man das berücksichtigen. Korrekter wäre übrigens ein <em>unsigned int</em>.)</p>
</blockquote>
<p>Hat n[ i ] kein /0 Array? n[] muss ja irgendwann auf dieses /0 treffen und dann brichts ja automatisch ab wegen false oder? Oder versteh ich da jetzt was falsch?!</p>
<p>positionmax wird ja eh nicht verwendet oder? und erst nachher zugewiesen.. So schlimm? Oder meint ihr das das Spielraum für Fehler lässt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984844</guid><dc:creator><![CDATA[downandout]]></dc:creator><pubDate>Tue, 23 Nov 2010 21:01:16 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren, rekursive Funktion on Tue, 23 Nov 2010 22:22:26 GMT]]></title><description><![CDATA[<p>downandout schrieb:</p>
<blockquote>
<p>Hat n[ i ] kein /0 Array? n[] muss ja irgendwann auf dieses /0 treffen und dann brichts ja automatisch ab wegen false oder? Oder versteh ich da jetzt was falsch?!</p>
<p>positionmax wird ja eh nicht verwendet oder? und erst nachher zugewiesen.. So schlimm? Oder meint ihr das das Spielraum für Fehler lässt?</p>
</blockquote>
<p>Nein, Arrays sind keine Strings. Wenn Du ein Array machst mit 5 Elementen, dann hast Du genau diese 5 Element, und jedes davon kann dann <em>alle</em> int-Werte enthalten (von -xxx bis +xxx <em>einschließlich</em> 0). Ein Array weiß die Anzahl seiner Elemente nicht, es ist <em>nur</em> der dafür benötigte Speicherbereich. Daher musst Du Dir die Anzahl <em>getrennt</em> davon merken, daher die Variable size.</p>
<p>Deswegen haben ja schon einige andere hier empfohlen, den in der C++ Stantardbibliothek angebotenen Container &quot;vector&quot; zu verwenden, denn ein Vector kennt seine Größe. Aber bleib erstmal beim Array, da lernst Du mehr.</p>
<p>Nochmal zurück zu Deiner ersten Frage: Ja, die Schleife bricht ab, wenn ein Element 0 ist, aber das ist auch der Fall, wenn Du eine 0 zwischen all den zu sortierenden Zahlen hast. Folge: Du kannst n[ i ] nicht als Abbruchbedingung nehmen.</p>
<p>Bis wann willst Du die Schleife laufen lassen? Antwort: bis der Zähler i das letzte Element erreicht hat (einschließlich). Und das ist (beim Beispiel mit 5 Elementen) der Fall bei i == 4. So, zudem hast Du die Variable &quot;size&quot; mit Inhalt 5. Nun, was setzt Du also als Abbruchbedingung ein?</p>
<p>Zur zweiten Frage: Richtig, posistionmax wird unter Umständen gar nicht verwendet. Da die Variable aber nicht initialisiert wird, kann <em>jeder beliebige</em> Wert darin stehen (es wird <em>nicht</em> automatisch 0 reingeschrieben, wie das noch bei BASIC war!).</p>
<p>Nach der For-Schleife kommt dann das &quot;n[ positionmax ] = n[ 0 ] ...&quot;, das heißt, Du schreibst an eine <em>beliebige</em> Speicherzelle! Könnte sein, dass Dein Betriebssystem das gar nicht mag und eine Speicherschuzverletzung ausgibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984897</guid><dc:creator><![CDATA[minstaros]]></dc:creator><pubDate>Tue, 23 Nov 2010 22:22:26 GMT</pubDate></item></channel></rss>