<?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[Problem mit einer Aufgabe!]]></title><description><![CDATA[<p>Hallo zusammen, habe folgende Aufgabe:</p>
<p>a) Erklaeren Sie schriftlich den Ablauf des Programms, indem Sie die Ausgabe in eine Textdatei kopieren und fuer jede Zeile bzw. jeden zusammengehoerigen Block von Ausgabezeilen erklaeren, welche Funktion (welcher Konstruktor, Operator...) an dieser Stelle aufgerufen wird und warum dies geschieht, d.h. welcher Aufruf des Hauptprogramms den Funktionsaufruf aus welchem Grund ausgeloest hat.</p>
<p>b) Fuehren Sie statische Variablen in die Klasse Sum ein, mit denen Sie zaehlen, wie oft die Konstruktoren, Operatoren und der Destruktor im Programm aufgerufen werden. Schreiben Sie zusaetzlich eine Methode, mit der Sie die Zaehlerstaende am Ende ausgeben. Ueberpruefen Sie die Zaehlerstaende, indem Sie sie mit der Anzahl der zu der jeweiligen Methode gehoerigen Ausgabezeilen des Programms vergleichen.Welcher theoretische Zusammenhang besteht zwischen dem Zaehlerstand des Destruktors und denen der Konstruktoren? Ueberpruefen und erklaeren Sie (schriftlich) anhand Ihrer Ergebnisse.</p>
<p>Das zugehoerige Programm findet ihr unten:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

// Zaehler fuer die Rekursionstiefe

int Tiefe=0; 

// Ausgabe von Leerzeichen:

void Einruecken(int Anz)
{
  for (int i=0; i&lt;Anz; i++)
    { cout &lt;&lt; &quot;  &quot;;}
}

// Klassendefinition

class Sum
{
  // Bildet die Summe der zahlen von 1 bis N, indem rekursiv Vorgaengerobjekte
  // N-1,...,1 angelegt werden und beim Anlegen dieser Objekte deren Werte von &quot;N&quot;
  // in S aufaddiert werden, oder indem zwei existente Objekte addiert werden.

  private:

    Sum* Vorg; // Zeiger auf Vorgaenger-Objekt
    int N;     // betrachtete Zahl
    int S;     // Summe von 1 bis N (=Summe der &quot;N's&quot; aller Vorgaengerobjekte
    	       // und des betrachteten Objekts selbst)

    // Zaehler fuer die Aufrufe der Methoden

    // --&gt; hier einfuegen

  public:

    Sum();     		// Konstruktor ohne Parameter
    Sum(int);  		// Konstruktor mit einem Parameter
    Sum(const Sum&amp;); 	// Copy-Konstruktor
    ~Sum(); 		// Destruktor

    // Methoden zum Setzen und Auslesen der Attribute

    void SetVorg(Sum* Vor) {Vorg=Vor; return;}
    void SetS(int Su)    {S=Su; return;}
    void SetN(int nN)    {N=nN; return;}

    Sum* GetVorg()  {return Vorg;}
    int  GetN()	    {return N;}
    int  GetS()     {return S;}

    Sum operator= (const Sum&amp;); 

    // Methode zur Ausgabe der Zaehlerstaende

    // --&gt; hier einfuegen

};

// Statische Datenelemente initialisieren

// --&gt; z.B. hier einfuegen

Sum::Sum()
{
  Tiefe++;
  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::Sum() begin.&quot; &lt;&lt; endl; 

  // Daten setzen

  Vorg=0; N=1; S=1; 

  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::Sum() end.&quot; &lt;&lt; endl; 
  Tiefe--;
}

Sum::Sum(int Zahl)
{
  Tiefe++;
  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::Sum(int) begin.&quot; &lt;&lt; endl;  

  // Daten setzen und ggf. neues Vorgaengerobjekt anlegen:

  if (Zahl&gt;1)
    {
      N=Zahl;
      Sum* NewSum = new Sum(N-1); // neues Vorgaengerobjekt anlegen
      Vorg=NewSum;		  // Vorgaengerzeiger setzen
      S=N+Vorg-&gt;GetS();
    }
  else
    { 
      Vorg=0;      // kein neues Vorgaengerobjekt anlegen
      N=1;
      S=1; 
    }

  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::Sum(int) end.&quot; &lt;&lt; endl;  
  Tiefe--;
}

Sum::Sum(const Sum&amp; SumRef)
{
  Tiefe++;

  // Daten setzen

  N=SumRef.N;
  S=SumRef.S;

  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::Sum(const Sum&amp; SumRef) begin.&quot; &lt;&lt; endl;  

  // Pruefen ob Vorgaengerobjekt existiert und ggf. auch dieses kopieren

  if (SumRef.Vorg!=0)
    { Vorg=new Sum(*(SumRef.Vorg)); }
  else
    { Vorg=0; }

  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::Sum(const Sum&amp; SumRef) end.&quot; &lt;&lt; endl;  
  Tiefe--;
}

Sum::~Sum()
{
  Tiefe++;
  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::~Sum() begin.&quot;;
  cout &lt;&lt; &quot;N: &quot; &lt;&lt; N &lt;&lt; &quot; S: &quot; &lt;&lt; S &lt;&lt; endl;

  // Objekt zerstoeren

  if (Vorg!=0)
    { delete(Vorg); }

  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::~Sum() end. &quot; &lt;&lt; endl;
  Tiefe--;
}

Sum Sum::operator = (const Sum&amp; SumObj)
{
  Tiefe++;
  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::operator= begin.&quot; &lt;&lt; endl;

  // Daten setzen

  N=SumObj.N; 
  S=SumObj.S; 

  // Vorgaegerzeiger kopieren (keine neuen Vorgaengerobjekte anlegen)

  if (SumObj.Vorg!=0)
    { Vorg=new Sum(*(SumObj.Vorg)); }
  else
    { Vorg=0; }

  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::operator= end.&quot; &lt;&lt; endl;
  Tiefe--;
  return *this;
}

// *********************************************************

void PrintAll (Sum SumObj)
{ 
  // Ausgabe inclusive existierender Vorgaengerobjekte

  Tiefe++;
  Einruecken(Tiefe);

  cout &lt;&lt; &quot;PrintAll begin. N: &quot; &lt;&lt; SumObj.GetN() &lt;&lt; &quot; S: &quot; &lt;&lt; SumObj.GetS() &lt;&lt; endl;

  // Ausgabe der Vorgaenger, falls existent

  if (SumObj.GetVorg()!=0) 
    {
      PrintAll(*(SumObj.GetVorg()));
    }
  else
    {
      Einruecken(Tiefe);
      cout &lt;&lt; &quot;Null pointer found. &quot; &lt;&lt; endl;
    }
  Einruecken(Tiefe);
  cout &lt;&lt; &quot;PrintAll end.&quot; &lt;&lt; endl;
  Tiefe--;
  return;
}

Sum SumAdd (Sum SumObj1, Sum SumObj2)
{
  Tiefe++;
  Einruecken(Tiefe);
  cout &lt;&lt; &quot;SumAdd begin.&quot; &lt;&lt; endl;

  // Rueckgabeobjekt anlegen und belegen

  Sum RetObj; 
  RetObj.SetN(SumObj1.GetN()+SumObj2.GetN());
  RetObj.SetS(SumObj1.GetS()+SumObj2.GetS()+SumObj1.GetN()*SumObj2.GetN());
  RetObj.SetVorg(0);

  Einruecken(Tiefe);
  cout &lt;&lt; &quot;SumAdd end.&quot; &lt;&lt; endl;
  Tiefe--;
  return RetObj;
}

int main()
{
  cout &lt;&lt; &quot;Anfang: &quot; &lt;&lt; endl;
  Sum S1(3);
  Sum S2(2);
  Sum S3;
  PrintAll(S2);
  S3=SumAdd(S1,S2);
  PrintAll(S3);
  cout &lt;&lt; &quot;Ende. &quot; &lt;&lt; endl;

  return 0;
}
</code></pre>
<p>Ich danke allen die mir helfen!<br />
grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/169831/problem-mit-einer-aufgabe</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 20:32:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/169831.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Jan 2007 12:55:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit einer Aufgabe! on Tue, 09 Jan 2007 12:55:35 GMT]]></title><description><![CDATA[<p>Hallo zusammen, habe folgende Aufgabe:</p>
<p>a) Erklaeren Sie schriftlich den Ablauf des Programms, indem Sie die Ausgabe in eine Textdatei kopieren und fuer jede Zeile bzw. jeden zusammengehoerigen Block von Ausgabezeilen erklaeren, welche Funktion (welcher Konstruktor, Operator...) an dieser Stelle aufgerufen wird und warum dies geschieht, d.h. welcher Aufruf des Hauptprogramms den Funktionsaufruf aus welchem Grund ausgeloest hat.</p>
<p>b) Fuehren Sie statische Variablen in die Klasse Sum ein, mit denen Sie zaehlen, wie oft die Konstruktoren, Operatoren und der Destruktor im Programm aufgerufen werden. Schreiben Sie zusaetzlich eine Methode, mit der Sie die Zaehlerstaende am Ende ausgeben. Ueberpruefen Sie die Zaehlerstaende, indem Sie sie mit der Anzahl der zu der jeweiligen Methode gehoerigen Ausgabezeilen des Programms vergleichen.Welcher theoretische Zusammenhang besteht zwischen dem Zaehlerstand des Destruktors und denen der Konstruktoren? Ueberpruefen und erklaeren Sie (schriftlich) anhand Ihrer Ergebnisse.</p>
<p>Das zugehoerige Programm findet ihr unten:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

// Zaehler fuer die Rekursionstiefe

int Tiefe=0; 

// Ausgabe von Leerzeichen:

void Einruecken(int Anz)
{
  for (int i=0; i&lt;Anz; i++)
    { cout &lt;&lt; &quot;  &quot;;}
}

// Klassendefinition

class Sum
{
  // Bildet die Summe der zahlen von 1 bis N, indem rekursiv Vorgaengerobjekte
  // N-1,...,1 angelegt werden und beim Anlegen dieser Objekte deren Werte von &quot;N&quot;
  // in S aufaddiert werden, oder indem zwei existente Objekte addiert werden.

  private:

    Sum* Vorg; // Zeiger auf Vorgaenger-Objekt
    int N;     // betrachtete Zahl
    int S;     // Summe von 1 bis N (=Summe der &quot;N's&quot; aller Vorgaengerobjekte
    	       // und des betrachteten Objekts selbst)

    // Zaehler fuer die Aufrufe der Methoden

    // --&gt; hier einfuegen

  public:

    Sum();     		// Konstruktor ohne Parameter
    Sum(int);  		// Konstruktor mit einem Parameter
    Sum(const Sum&amp;); 	// Copy-Konstruktor
    ~Sum(); 		// Destruktor

    // Methoden zum Setzen und Auslesen der Attribute

    void SetVorg(Sum* Vor) {Vorg=Vor; return;}
    void SetS(int Su)    {S=Su; return;}
    void SetN(int nN)    {N=nN; return;}

    Sum* GetVorg()  {return Vorg;}
    int  GetN()	    {return N;}
    int  GetS()     {return S;}

    Sum operator= (const Sum&amp;); 

    // Methode zur Ausgabe der Zaehlerstaende

    // --&gt; hier einfuegen

};

// Statische Datenelemente initialisieren

// --&gt; z.B. hier einfuegen

Sum::Sum()
{
  Tiefe++;
  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::Sum() begin.&quot; &lt;&lt; endl; 

  // Daten setzen

  Vorg=0; N=1; S=1; 

  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::Sum() end.&quot; &lt;&lt; endl; 
  Tiefe--;
}

Sum::Sum(int Zahl)
{
  Tiefe++;
  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::Sum(int) begin.&quot; &lt;&lt; endl;  

  // Daten setzen und ggf. neues Vorgaengerobjekt anlegen:

  if (Zahl&gt;1)
    {
      N=Zahl;
      Sum* NewSum = new Sum(N-1); // neues Vorgaengerobjekt anlegen
      Vorg=NewSum;		  // Vorgaengerzeiger setzen
      S=N+Vorg-&gt;GetS();
    }
  else
    { 
      Vorg=0;      // kein neues Vorgaengerobjekt anlegen
      N=1;
      S=1; 
    }

  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::Sum(int) end.&quot; &lt;&lt; endl;  
  Tiefe--;
}

Sum::Sum(const Sum&amp; SumRef)
{
  Tiefe++;

  // Daten setzen

  N=SumRef.N;
  S=SumRef.S;

  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::Sum(const Sum&amp; SumRef) begin.&quot; &lt;&lt; endl;  

  // Pruefen ob Vorgaengerobjekt existiert und ggf. auch dieses kopieren

  if (SumRef.Vorg!=0)
    { Vorg=new Sum(*(SumRef.Vorg)); }
  else
    { Vorg=0; }

  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::Sum(const Sum&amp; SumRef) end.&quot; &lt;&lt; endl;  
  Tiefe--;
}

Sum::~Sum()
{
  Tiefe++;
  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::~Sum() begin.&quot;;
  cout &lt;&lt; &quot;N: &quot; &lt;&lt; N &lt;&lt; &quot; S: &quot; &lt;&lt; S &lt;&lt; endl;

  // Objekt zerstoeren

  if (Vorg!=0)
    { delete(Vorg); }

  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::~Sum() end. &quot; &lt;&lt; endl;
  Tiefe--;
}

Sum Sum::operator = (const Sum&amp; SumObj)
{
  Tiefe++;
  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::operator= begin.&quot; &lt;&lt; endl;

  // Daten setzen

  N=SumObj.N; 
  S=SumObj.S; 

  // Vorgaegerzeiger kopieren (keine neuen Vorgaengerobjekte anlegen)

  if (SumObj.Vorg!=0)
    { Vorg=new Sum(*(SumObj.Vorg)); }
  else
    { Vorg=0; }

  Einruecken(Tiefe);
  cout &lt;&lt; &quot;Sum::operator= end.&quot; &lt;&lt; endl;
  Tiefe--;
  return *this;
}

// *********************************************************

void PrintAll (Sum SumObj)
{ 
  // Ausgabe inclusive existierender Vorgaengerobjekte

  Tiefe++;
  Einruecken(Tiefe);

  cout &lt;&lt; &quot;PrintAll begin. N: &quot; &lt;&lt; SumObj.GetN() &lt;&lt; &quot; S: &quot; &lt;&lt; SumObj.GetS() &lt;&lt; endl;

  // Ausgabe der Vorgaenger, falls existent

  if (SumObj.GetVorg()!=0) 
    {
      PrintAll(*(SumObj.GetVorg()));
    }
  else
    {
      Einruecken(Tiefe);
      cout &lt;&lt; &quot;Null pointer found. &quot; &lt;&lt; endl;
    }
  Einruecken(Tiefe);
  cout &lt;&lt; &quot;PrintAll end.&quot; &lt;&lt; endl;
  Tiefe--;
  return;
}

Sum SumAdd (Sum SumObj1, Sum SumObj2)
{
  Tiefe++;
  Einruecken(Tiefe);
  cout &lt;&lt; &quot;SumAdd begin.&quot; &lt;&lt; endl;

  // Rueckgabeobjekt anlegen und belegen

  Sum RetObj; 
  RetObj.SetN(SumObj1.GetN()+SumObj2.GetN());
  RetObj.SetS(SumObj1.GetS()+SumObj2.GetS()+SumObj1.GetN()*SumObj2.GetN());
  RetObj.SetVorg(0);

  Einruecken(Tiefe);
  cout &lt;&lt; &quot;SumAdd end.&quot; &lt;&lt; endl;
  Tiefe--;
  return RetObj;
}

int main()
{
  cout &lt;&lt; &quot;Anfang: &quot; &lt;&lt; endl;
  Sum S1(3);
  Sum S2(2);
  Sum S3;
  PrintAll(S2);
  S3=SumAdd(S1,S2);
  PrintAll(S3);
  cout &lt;&lt; &quot;Ende. &quot; &lt;&lt; endl;

  return 0;
}
</code></pre>
<p>Ich danke allen die mir helfen!<br />
grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1206305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1206305</guid><dc:creator><![CDATA[aschlechter]]></dc:creator><pubDate>Tue, 09 Jan 2007 12:55:35 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit einer Aufgabe! on Tue, 09 Jan 2007 12:58:11 GMT]]></title><description><![CDATA[<p>Ach und nochwas!</p>
<p>Wenn ich das ganze dann compiliere dann kommt sowas heraus:</p>
<pre><code>Anfang:
  Sum::Sum(int) begin.
    Sum::Sum(int) begin.
      Sum::Sum(int) begin.
      Sum::Sum(int) end.
    Sum::Sum(int) end.
  Sum::Sum(int) end.
  Sum::Sum(int) begin.
    Sum::Sum(int) begin.
    Sum::Sum(int) end.
  Sum::Sum(int) end.
  Sum::Sum() begin.
  Sum::Sum() end.
  Sum::Sum(const Sum&amp; SumRef) begin.
    Sum::Sum(const Sum&amp; SumRef) begin.
    Sum::Sum(const Sum&amp; SumRef) end.
  Sum::Sum(const Sum&amp; SumRef) end.
  PrintAll begin. N: 2 S: 3
    Sum::Sum(const Sum&amp; SumRef) begin.
    Sum::Sum(const Sum&amp; SumRef) end.
    PrintAll begin. N: 1 S: 1
    Null pointer found.
    PrintAll end.
    Sum::~Sum() begin.N: 1 S: 1
    Sum::~Sum() end.
  PrintAll end.
  Sum::~Sum() begin.N: 2 S: 3
    Sum::~Sum() begin.N: 1 S: 1
    Sum::~Sum() end.
  Sum::~Sum() end.
  Sum::Sum(const Sum&amp; SumRef) begin.
    Sum::Sum(const Sum&amp; SumRef) begin.
    Sum::Sum(const Sum&amp; SumRef) end.
  Sum::Sum(const Sum&amp; SumRef) end.
  Sum::Sum(const Sum&amp; SumRef) begin.
    Sum::Sum(const Sum&amp; SumRef) begin.
      Sum::Sum(const Sum&amp; SumRef) begin.
      Sum::Sum(const Sum&amp; SumRef) end.
    Sum::Sum(const Sum&amp; SumRef) end.
  Sum::Sum(const Sum&amp; SumRef) end.
  SumAdd begin.
    Sum::Sum() begin.
    Sum::Sum() end.
  SumAdd end.
  Sum::operator= begin.
  Sum::operator= end.
  Sum::Sum(const Sum&amp; SumRef) begin.
  Sum::Sum(const Sum&amp; SumRef) end.
  Sum::~Sum() begin.N: 5 S: 15
  Sum::~Sum() end.
  Sum::~Sum() begin.N: 5 S: 15
  Sum::~Sum() end.
  Sum::~Sum() begin.N: 3 S: 6
    Sum::~Sum() begin.N: 2 S: 3
      Sum::~Sum() begin.N: 1 S: 1
      Sum::~Sum() end.
    Sum::~Sum() end.
  Sum::~Sum() end.
  Sum::~Sum() begin.N: 2 S: 3
    Sum::~Sum() begin.N: 1 S: 1
    Sum::~Sum() end.
  Sum::~Sum() end.
  Sum::Sum(const Sum&amp; SumRef) begin.
  Sum::Sum(const Sum&amp; SumRef) end.
  PrintAll begin. N: 5 S: 15
  Null pointer found.
  PrintAll end.
  Sum::~Sum() begin.N: 5 S: 15
  Sum::~Sum() end.
Ende.
  Sum::~Sum() begin.N: 5 S: 15
  Sum::~Sum() end.
  Sum::~Sum() begin.N: 2 S: 3
    Sum::~Sum() begin.N: 1 S: 1
    Sum::~Sum() end.
  Sum::~Sum() end.
  Sum::~Sum() begin.N: 3 S: 6
    Sum::~Sum() begin.N: 2 S: 3
      Sum::~Sum() begin.N: 1 S: 1
      Sum::~Sum() end.
    Sum::~Sum() end.
  Sum::~Sum() end.
</code></pre>
<p>Aber ich weiss nicht was ich mit dem ganzen anfangen soll!</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1206309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1206309</guid><dc:creator><![CDATA[aschlechter]]></dc:creator><pubDate>Tue, 09 Jan 2007 12:58:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit einer Aufgabe! on Tue, 09 Jan 2007 13:09:48 GMT]]></title><description><![CDATA[<p>Jede der Methoden gibt freundlicherweise aus, wo sie beginnt (z.B. &quot; <code>Sum::Sum(int) begin.</code> &quot; - der Ctor startet und wo sie endet (&quot; <code>Sum::Sum(int) end.</code> &quot;) und durch die Einrückungen solltest du eigentlich auch verfolgen können, welche dieser Aufrufe zusammengehören. Jetzt mußt du nur noch die Aufrufe, beginnend bei der main(), durch deinen Programmablauf verfolgen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1206313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1206313</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 09 Jan 2007 13:09:48 GMT</pubDate></item></channel></rss>