<?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[Schleifen in Schleifen]]></title><description><![CDATA[<p>Hallo,<br />
wie kann ich das realisieren? Ich möchte n Schleifen in Schleifen haben:</p>
<pre><code class="language-cpp">// n soll angeben, wie oft die Schleifen verschaltet werden:
// in diesem Fall wäre n = 3
for ( blablabla )
   for ( blablabla )
      for ( blablabla )
</code></pre>
<p>Ich habe mir gedacht ich mache eine sich selbst aufrufende Funktion (blablabla<br />
ist immer gleich, aber es muss immer eine andere Zählervariable verwendet werden!).</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/202109/schleifen-in-schleifen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 15:45:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/202109.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Jan 2008 17:04:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Schleifen in Schleifen on Mon, 07 Jan 2008 17:04:57 GMT]]></title><description><![CDATA[<p>Hallo,<br />
wie kann ich das realisieren? Ich möchte n Schleifen in Schleifen haben:</p>
<pre><code class="language-cpp">// n soll angeben, wie oft die Schleifen verschaltet werden:
// in diesem Fall wäre n = 3
for ( blablabla )
   for ( blablabla )
      for ( blablabla )
</code></pre>
<p>Ich habe mir gedacht ich mache eine sich selbst aufrufende Funktion (blablabla<br />
ist immer gleich, aber es muss immer eine andere Zählervariable verwendet werden!).</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432572</guid><dc:creator><![CDATA[*D*]]></dc:creator><pubDate>Mon, 07 Jan 2008 17:04:57 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen in Schleifen on Mon, 07 Jan 2008 17:06:06 GMT]]></title><description><![CDATA[<p>D schrieb:</p>
<blockquote>
<p>Ich habe mir gedacht ich mache eine sich selbst aufrufende Funktion</p>
</blockquote>
<p>Rekursion wäre auch mein Vorschlag gewesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432573</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 07 Jan 2008 17:06:06 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen in Schleifen on Mon, 07 Jan 2008 17:10:11 GMT]]></title><description><![CDATA[<p>Ich finde mit Rekursion lässt es sich am einfachste lösen.</p>
<pre><code class="language-cpp">void foo( int n, ... )
{
    for( ...... )
    {
        if( n == 0 )
            return;
        else
            foo( n - 1, ... );
    }

    return;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1432576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432576</guid><dc:creator><![CDATA[recler]]></dc:creator><pubDate>Mon, 07 Jan 2008 17:10:11 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen in Schleifen on Mon, 07 Jan 2008 17:43:07 GMT]]></title><description><![CDATA[<p>Aber wenn die Schleifenvariable immer gleich heißt kann ich in den Schleifen<br />
nicht richtig mit ihnen arbeiten, oder???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432590</guid><dc:creator><![CDATA[*D*]]></dc:creator><pubDate>Mon, 07 Jan 2008 17:43:07 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen in Schleifen on Mon, 07 Jan 2008 18:24:36 GMT]]></title><description><![CDATA[<p>Du mußt dir für jede Ebene eine Zählvariable speichern (am besten in einem Array):</p>
<pre><code class="language-cpp">const int MAXLOOP = 10; // highest number of loops
int r[MAXLOOP], lower[MAXLOOP], upper[MAXLOOP];
int maxloop=0;

void action()
{
  for(int i=0; i&lt;maxloop; i++)
    cout &lt;&lt; r[i] &lt;&lt; ',';
  cout &lt;&lt; endl;
}

void loopfunc(int n)
{
  if(n==0) action();
  else
  {
    n--; // use as index
    for(r[n] = lower[n]; r[n] &lt;= upper[n]; r[n]++)
      loopfunc(n);
  }
}

void do_loop(int n)
{
  maxloop = n;
  loopfunc(n);
}

// Aufruf
//
// todo: initialize lower[x] and upper[x] for 0 &lt;= x &lt; n
do_loop(n);// 0 &lt;= n &lt;= MAXLOOP
</code></pre>
<p>Jetzt kann man das ganze auch noch objektorientiert verpacken und eine eigene Callback-Funktion (action) angeben und ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432610</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Mon, 07 Jan 2008 18:24:36 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen in Schleifen on Mon, 07 Jan 2008 21:57:22 GMT]]></title><description><![CDATA[<p>Th, ich glaube, er hat nicht so dass Programmierverständnis, deinen Code wird er erst nicht kapieren bzw. zu kompliziert finden.</p>
<p>Ich hab dir hier was einfaches zusammengeschrieben:<br />
Wenn du's nicht verstehst, frag nach!</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

void function(int n);

int main()
{

	int n=8; //Anzahl d. Schleifendurchläufe
	function(n);

	//system(&quot;pause&quot;);
	return 0;
}

void function(int n)
{
	if(n&gt;0)
	{
		for(int i=0; i&lt;1;i++)
		{
		cout &lt;&lt; n &lt;&lt; &quot; bla\n&quot;;
		}
		n--;
		function(n);
	}

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1432754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432754</guid><dc:creator><![CDATA[XaTrIxX]]></dc:creator><pubDate>Mon, 07 Jan 2008 21:57:22 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen in Schleifen on Tue, 08 Jan 2008 08:01:47 GMT]]></title><description><![CDATA[<p>Ich kenne zur Lösung dieses Problems auch einen einfachen Zähler. Denn was man im Endeffekt da benötigt ist nichts anderes als alle Permutationen von n Zahlen bzw Schleifenvariablen.</p>
<pre><code class="language-cpp">class Perm
{
  int* num;

  Perm(int n)
  {
    this-&gt;num = new int[n];
  }

  int SetNum(int i)
  {
    this-&gt;num[i]++;
    return this-&gt;num[i];
  }

  int SetNext()
  {
    int i = 0;

    while (SetNum(i) == 0)
      i++;
  }
};
</code></pre>
<p>In num[] steht dann die gewünschte Permutation im n-Schritt drin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432822</guid><dc:creator><![CDATA[Bitte ein Bit]]></dc:creator><pubDate>Tue, 08 Jan 2008 08:01:47 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen in Schleifen on Tue, 08 Jan 2008 08:11:49 GMT]]></title><description><![CDATA[<p>Ja, eine nette Methode, dir den RAM zu zerschießen <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="😃"
    /> Hast du das jetzt schnell hingeschmiert oder ist der Code ausgiebig getestet worden?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16566">@D</a>: brauchst du im innersten Schleifenrumpf die Werte aller Schleifenvariablen? Wenn ja, mußt du mit einem Array (oder besser mit einem std::vector&lt;&gt;) arbeiten, ansonsten reicht eine lokale Zählvariable in der rekursiven Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432828</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 08 Jan 2008 08:11:49 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen in Schleifen on Tue, 08 Jan 2008 10:33:24 GMT]]></title><description><![CDATA[<p>Ich hab beizeiten mal ne Klasse Multicounter geschrieben um solche mehrfach geschachtelten Schleifen in einer zu haben. Es gibt zwei Konstruktoren, einen für die Dimension (gleich Anzahl der geschachtelten Schleifen) und einen gemeinsamen Maximalwert, den anderen für einen vector von Maximalwerten für die einzelnen Schleifen.<br />
Optional kann aus einem von vier Modi gewählt werden:<br />
LEFTRIGHT lässt den ersten counter bis zu seinem Maximalwert laufen, danach den zweiten usw.<br />
RIGHTLEFT fängt beim letzten counter an, lässt ihn zum maximalwert laufen, dann den vorletzten usw.<br />
EQUAL inkrementiert nacheinander den ersten, den zweiten, den dritten... bis zum letzten und fängt dann wieder von vorne an - counter die den Maximalwert erreicht haben, werden übersprungen.<br />
Auf die einzelnen counter kann über den Indexoperator[] zugegriffen werden, genau wie beim vector.</p>
<pre><code class="language-cpp">template &lt;typename T&gt; class Multicounter {
public:
  enum Modus {LEFTRIGHT, RIGHTLEFT, EQUAL, EQUAL_RL};

  Multicounter(std::size_t dim, T const&amp; max, Modus mod = LEFTRIGHT)
    : counters_(dim, T()), maxcount_(dim, max), modus_(mod),
      //incrementation starts left or right
      nextinc_( ((mod == LEFTRIGHT) || (mod == EQUAL))? 0 : dim-1 ) 
  { if (max == T()) nextinc_ = size(); //maximum = 0, nothing to count}

  Multicounter(std::vector&lt;T&gt; const&amp; maxvec, Modus mod = LEFTRIGHT)
    : counters_(maxvec.size(), T()), maxcount_(maxvec), modus_(mod),
      //incrementation starts left or right
      nextinc_( ((mod == LEFTRIGHT) || (mod == EQUAL))? 0 : dim-1 ) 
  { 
    if (counts_[nextinc_] == maxcount_[nextinc_]) {
      if (nextinc_ == 0) setNextInc();
      else setLastInc();
    }
  }

  Multicounter&amp; operator++() {
    if (nextinc_ &gt;= size()) return *this;
    ++(counters_[nextinc_]);
    switch(modus_) {
      case EQUAL:
        setNextInc();
        if (nextinc_ == size()) { //start from first index
          nextinc_ = 0;
          if(counters_[nextinc_] &gt;= maxcount[nextinc_]) setNextInc();
        }
        break;
      case EQUAL_RL:
        setLastInc();
        if (nextinc_ == 0) { //start from last index
          nextinc_ = size()-1;
          if(counters_[nextinc_] &gt;= maxcount[nextinc_]) setLastInc();
        break;
      case LEFTRIGHT:
        if (counters_[nextinc_] &gt;= maxcount_[nextinc_]) setNextInc();
        break;
      case RIGHTLEFT:
        if (counters_[nextinc_] &gt;= maxcount_[nextinc_]) setLastInc();
        break;
      default:
        throw std::out_of_range;
    }
    return *this;
  }

  const Multicounter operator++(int) {
    Mutlicounter tmp(*this);
    ++(*this);
    return tmp;
  }

  const T&amp; operator[](std::size_t index) const {
    return counters_[index];
  }

  Mutlicounter max() const {
    Multicounter maxcnt(*this);
    maxcnt.counters_ = maxcount_;
    return maxcnt;
  }

  Multicounter size() const {
    return counters_.size()
  }

  bool equal(Multicounter const&amp; b) const {
    return (maxcount_ == b.maxcount_ &amp;&amp; counters_ == b.counters_);
  }

private;
  void setNextInc() {
    //set nextinc_ to the next index that can be incremented or to size() 
    while (nextinc_ &lt; size()-1 &amp;&amp; counters_[++nextinc_] &gt;= maxcount_[nextinc_]);
  }
  void setLastInc() {
    //set nextinc_ to the next SMALLER index that can be incremented or to size() 
    while (nextinc_ &gt; 0 &amp;&amp; counters_[--nextinc_] &gt;= maxcount_[nextinc_]);
    if (nextinc_ == 0 &amp;&amp; counters_[nextinc_] &lt; maxcount_[nextinc_]) nextinc_ = size();
  }

  std::vector&lt;T&gt; counters_;
  vstd::ector&lt;T&gt; maxcount_;
  Modus modus_;
  std::size_t nextinc_;

};

template&lt;typename T&gt;
bool operator==(Multicounter&lt;T&gt; const&amp; a, Multicounter&lt;T&gt; const&amp; b)
  {return a.equal(b);}
template &lt;typename T&gt;
bool operator!=(Multicounter&lt;T&gt; const&amp; a, Multicounter&lt;T&gt; const&amp; b)
  {return !(a == b); }
</code></pre>
<p>Beispiel für die Benutzung:</p>
<pre><code class="language-cpp">for(Multicounter&lt;int&gt; icnt(3,16); icnt != icnt.max(); ++icnt) {/*...*/}

//entspricht:
for (int i = 0; i &lt;= 16; ++i)
  for (int j = 0; i &lt;= 16; ++j)
    for (int k = 0; k &lt;= 16; ++k) {/*...*/}
//mit icnt[0] == i usw.

std::vector&lt;long int&gt; iv;
iv.push_back(14);
iv.push_back(74);
iv.push_back(34);
iv.push_back(12);
iv.push_back(124);
iv.push_back(30);
for(Multicounter&lt;long int&gt; jcnt(iv); jcnt != jcnt.max(); ++jcnt) {/*...*/}

//entspricht:
for (long int i = 0; i &lt;= 14; ++i)
  for (long int j = 0; j &lt;= 74; ++j)
    for (long int k = 0; k &lt;= 34; ++k)
      for (long int l = 0; l &lt;= 12; ++l)
        for (long int m = 0; m &lt;= 124; ++m)
          for (long int n = 0; n &lt;= 30; ++n) {/* ... */}

//für Arrays gibts den iterator-range-konstruktor für vectoren:
int maxarr[5] = {12, 23, 4, 4, 3};
for(Multicounter&lt;int&gt; kcnt(std::vector&lt;int&gt;(maxarr, maxarr+5)); kcnt != kcnt.max(); ++kcnt) {/*...*/}
</code></pre>
<p>Ich bin ncihtmehr genau sicher wie weit ich das Dingen damals getestet hab, beim drüberschauen sahs jetzt aber ganz in Ordnung aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432903</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 08 Jan 2008 10:33:24 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen in Schleifen on Tue, 08 Jan 2008 11:22:38 GMT]]></title><description><![CDATA[<p>Ja, die Klasse sieht super aus (nur getestet ist sie anscheinend nicht, denn es sind einige Syntaxfehler drin).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432936</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Tue, 08 Jan 2008 11:22:38 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen in Schleifen on Tue, 08 Jan 2008 13:06:07 GMT]]></title><description><![CDATA[<p>Ich hab jetzt mal die Syntaxfehler verbessert und ein wenig getestet - es hat sich rausgestellt dass ich da leider voelligen Humbug verzapft hab, die Zaehler werden nacheinander hochgezehlt, aber nicht wieder resettet, so dass lange nicht alle moeglichen Kombinationen abgegrast werden - werd mich da spaeter nochmal intensiver mit auseinandersetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432990</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 08 Jan 2008 13:06:07 GMT</pubDate></item><item><title><![CDATA[Reply to Schleifen in Schleifen on Tue, 08 Jan 2008 16:53:18 GMT]]></title><description><![CDATA[<p>An CSToll:</p>
<p>Hey, lass meine Code-Schweinerei in Ruhe. Das wurde alles mit Müh und Not sauber hingeschmiert. <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="😃"
    /></p>
<p>Aber jetzt mal ernst, ich wollte da einfach nur ein Grundgedanke kurz zeigen. Das Ganze ist natürlich unvollständig und sollte, wenn es gebraucht wird, noch um so einige Dinge (obere und untere Grenzen von den einzelnen Variablen,...) erweitert werden. Aber ich habe die Idee schon mehrmals benutzt, beispielsweise bei der Berechnung des Lösungsraums von Mastermind oder auch bei dem Dameproblem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433163</guid><dc:creator><![CDATA[Bitte ein Bit]]></dc:creator><pubDate>Tue, 08 Jan 2008 16:53:18 GMT</pubDate></item></channel></rss>