<?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[Arbeit mit Datenstrukturen - ZAHLENOBJEKT]]></title><description><![CDATA[<p>Hallo ,</p>
<p>ersteinmal hallo allerseits. Ich habe bemerkt, dass dieses Forum eine sehr kompetente Basis für die C++ Programmierung darstellt. Ersteinmal Respekt vor eurer Arbeit.</p>
<p>Leider habe ich ein Problem mit einer Programmieraufgabe. Ich habe mich schon mehrere Stunden damit beschäftigt, aber leider gelingt es mir nicht die Vorgaben zu durchdringen. Ich werde nun die Aufgabenstellung und die Vorgaben hineinkopieren. Mir geht es vor allen Dingen darum herauszufinden, wie die Vorgaben arbeiten und was sie genau machen, damit ich das Problem bzw. die Aufgaben lösen kann.</p>
<p>Vielen Dank im Voraus für eure Hilfe...</p>
<blockquote>
<p>In Haskell konnten beliebig große natürliche Zahlen dargestellt werden. In C/C++ gibt es keinen Standarddatentypen, der das erlaubt. In dieser Aufgabe ist eine dynamische Datenstruktur vorgegeben, mit der eine nicht negative Zahl als Dezimalbruch mit beliebig vielen Vor- und Nachkommastellen gespeichert werden kann. Diese Datenstruktur wird aus Instanzen der zwei Strukturen TZiffer und TZahl aufgebaut:<br />
struct TZiffer {<br />
char ziffer;<br />
TZiffer* links;<br />
TZiffer* rechts;<br />
};<br />
struct TZahl {<br />
TZiffer* vkStelle;// Vorkommastelle<br />
int nkStellen; // Nachkommastellen<br />
int vkStellen; // Vorkommastellen<br />
TZiffer* aktPos; // Position in Liste<br />
};</p>
<p>Der Dezimalbruch wird durch ein Zahlenobjekt repräsentiert, das eine Instanz der Struktur TZahl ist. Diese Struktur enthält die Anzahl der Vor- und Nachkommastellen der gespeicherten Zahl (vkStellen/nkStellen) sowie zwei Verweise (vkStelle/aktPos) auf eine doppelt verkettete Liste. Jedes Element dieser doppelt verketteten Liste hat den Typ TZiffer, speichert den Wert einer Ziffer und enthält einen Verweis auf die linke bzw. rechte Nachbarziffer. Falls keine Nachbarziffer existiert, ist der entsprechende Verweis 0. Der Wert – nicht das Zeichen! – der Ziffer wird in der Komponente ziffer gespeichert. Der Zeiger vkStelle in der Struktur TZahl verweist immer auf die Ziffer direkt vor dem Komma und legt somit die Kommaposition fest.<br />
Es ist bereits eine Funktion erzeugeNull in der Vorgabe enthalten, die die Datenstruktur für den Dezimalbruch 0.0 aufbaut.</p>
<p>Implementieren Sie die folgenden weiteren Funktionen, die von der Funktion read in der Vorgabe benötigt werden, um einen als Text gegebenen Dezimalbruch in ein Zahlenobjekt umzuwandeln:<br />
•<br />
void zifferVorKomma(char ziffer, TZahl* zahl): Fügt in das übergebenen Zahlenobjekt zahl die übergebene Ziffer ziffer unmittelbar vor dem Komma ein. Alle anderen Ziffern vor dem Komma verschieben sich in dem Zahlenobjekt um eine Position nach links. Der Nachkommaanteil bleibt unverändert. ziffer speichert wieder den Wert der Ziffer und nicht das Zeichen.<br />
•<br />
void zifferNachKomma(char ziffer, TZahl* zahl): Fügt in das übergebenen Zahlenobjekt zahl die übergebene Ziffer ziffer unmittelbar nach dem Komma ein. Alle anderen Ziffern nach dem Komma verschieben sich in dem Zahlenobjekt um eine Position nach rechts. Der Vorkommaanteil bleibt unverändert.<br />
Zur Ausgabe eines als Zahlenobjekt gegebenen Dezimalbruchs auf dem Bildschirm durch die vorgegebene Funktion druckeZahl werden weitere Funktionen benötigt, die den Zeiger aktPos in der Struktur TZahl nutzen und korrekt modifizieren. Implementieren Sie diese Funktionen:<br />
•<br />
TZiffer* posLinks(TZahl* zahl): Setzt den Zeiger aktPos im Zahlenobjekt zahl auf die am weitesten links stehende Ziffer in diesem Zahlenobjekt und gibt einen Verweis auf diese Ziffer zurück.<br />
•<br />
TZiffer* posRechts(TZahl* zahl): Setzt den Zeiger aktPos im Zahlenobjekt zahl auf die am weitesten rechts stehende Ziffer in diesem Zahlenobjekt und gibt einen Verweis auf diese Ziffer zurück.<br />
•<br />
TZiffer* nachLinks(TZahl* zahl): Falls die Ziffer, auf die aktPos im Zahlenobjekt zahl verweist einen linken Nachbarn hat, so wird aktPos auf diesen Nachbarn gesetzt. Ansonsten wird aktPos nicht verändert. Die Funktion gibt den Verweis auf die Ziffer zurück, auf die aktPos dann zeigt.<br />
•<br />
TZiffer* nachRechts(TZahl* zahl): Falls die Ziffer, auf die aktPos im Zahlenobjekt zahl verweist einen rechten Nachbarn hat, so wird aktPos auf diesen Nachbarn gesetzt. Ansonsten wird aktPos nicht verändert. Die Funktion gibt den Verweis auf die Ziffer zurück, auf die aktPos dann zeigt.<br />
Jeder in einem Zahlenobjekt gespeicherte Dezimalbruch soll noch normalisiert werden können. Das bedeutet, dass der Vorkommaanteil mit genau einer führenden 0 beginnt und der Nachkommaanteil mit genau einer 0 endet. Diese Nullen sollen in den Variablen vkStellen und nkStellen nicht mitgezählt werden. Die oben angegebene Speicherung der 0.0 entspricht damit bereits dieser geforderten Normalisierung. Implementieren Sie eine Funktion<br />
void normalisiere(TZahl* zahl),<br />
die führende und abschließende Nullen – bis auf jeweils eine – in einem Zahlenobjekt streicht oder ergänzt, falls keine führende/abschließende 0 vorhanden ist.</p>
</blockquote>
<p><strong>Hier noch meine Vorgaben (die ich leider nicht ganz verstehe)</strong></p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

struct TZiffer {
  char ziffer;
  TZiffer* links;
  TZiffer* rechts;
};

struct TZahl {
  TZiffer* vkStelle; // Vorkommastelle
  int nkStellen;     // Nachkommastellen
  int vkStellen;     // Vorkommastellen
  TZiffer* aktPos;   // aktuelle Position in der liste
};

// Erzeugt den Dezimalbrucch 0.0
TZahl* erzeugeNull()
{
  TZahl* Null;

  Null = (TZahl*)malloc(sizeof(TZahl));
  Null-&gt;vkStellen = 0;
  Null-&gt;nkStellen = 0;
  // Vorkommastelle mit 0 initialisieren
  Null-&gt;vkStelle = (TZiffer*)malloc(sizeof(TZiffer));
  Null-&gt;vkStelle-&gt;ziffer = 0;
  Null-&gt;vkStelle-&gt;links = 0;
  // Nachkommastelle erzeugen
  Null-&gt;vkStelle-&gt;rechts = (TZiffer*)malloc(sizeof(TZiffer));
  Null-&gt;vkStelle-&gt;rechts-&gt;links = Null-&gt;vkStelle;
  Null-&gt;vkStelle-&gt;rechts-&gt;rechts = 0;
  Null-&gt;vkStelle-&gt;rechts-&gt;ziffer = 0;

  return Null;
}

// Gibt 1 zurueck, falls aktPos auf die erste Nachkommastelle zeigt
int ersteNKStelle(TZahl* zahl)
{
  return zahl-&gt;aktPos == zahl-&gt;vkStelle-&gt;rechts;
}

void zifferVorKomma(char ziffer, TZahl* zahl)
{
}

void zifferNachKomma(char ziffer, TZahl* zahl)
{
}

TZiffer* posLinks(TZahl* zahl)
{
}

TZiffer* posRechts(TZahl* zahl)
{
}

TZiffer* nachRechts(TZahl* zahl)
{
}

TZiffer* nachLinks(TZahl* zahl)
{
}

void normalisiere(TZahl* zahl)
{
}

// Zum Erzeugen eines Zahlenobjekts aus einem Text
// Zum Beispiel: text = &quot;12.500600&quot;
TZahl* read(char* text)
{
  TZahl* zahl;

  zahl = erzeugeNull();

  while(*text != '.' &amp;&amp; *text) {
    zifferVorKomma(*text - '0',zahl);
    text++;
  }

  if(!*text)
    return zahl;

  while(*text)
    text++;

  text--;
  while(*text != '.') {
    zifferNachKomma(*text - '0',zahl);
    text--;
  }

  return zahl;
}

// Zum Ausgeben der Ziffern eines Zahlenobjekts einschliesslich
// des Kommas
void druckeZahl(TZahl* zahl)
{
  TZiffer* ziffer;

  ziffer = posLinks(zahl);

  do {
    if(ersteNKStelle(zahl))
      printf(&quot;.&quot;);
    printf(&quot;%c&quot;,ziffer-&gt;ziffer + '0');
    ziffer = nachRechts(zahl);
  }while(ziffer);
}

int main(int argc, char* argv[])
{
  char eingabe[1024];
  TZahl* zahl;

  // Zum Testen der Implementierung. Die eingegebene Zahl darf nur aus
  // Ziffern und einem Punkt bestehen und sollte einen Vor- und Nachkommaanteil 
  // haben, die durch einen Punkt getrennt sind. Zum Beispiel: 47.11
  gets(eingabe);
  zahl = read(eingabe);
  druckeZahl(zahl);
  printf(&quot;\n&quot;);
  normalisiere(zahl);
  druckeZahl(zahl);
  printf(&quot;\n&quot;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/232478/arbeit-mit-datenstrukturen-zahlenobjekt</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 06:43:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/232478.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 23 Jan 2009 10:15:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Arbeit mit Datenstrukturen - ZAHLENOBJEKT on Fri, 23 Jan 2009 10:15:50 GMT]]></title><description><![CDATA[<p>Hallo ,</p>
<p>ersteinmal hallo allerseits. Ich habe bemerkt, dass dieses Forum eine sehr kompetente Basis für die C++ Programmierung darstellt. Ersteinmal Respekt vor eurer Arbeit.</p>
<p>Leider habe ich ein Problem mit einer Programmieraufgabe. Ich habe mich schon mehrere Stunden damit beschäftigt, aber leider gelingt es mir nicht die Vorgaben zu durchdringen. Ich werde nun die Aufgabenstellung und die Vorgaben hineinkopieren. Mir geht es vor allen Dingen darum herauszufinden, wie die Vorgaben arbeiten und was sie genau machen, damit ich das Problem bzw. die Aufgaben lösen kann.</p>
<p>Vielen Dank im Voraus für eure Hilfe...</p>
<blockquote>
<p>In Haskell konnten beliebig große natürliche Zahlen dargestellt werden. In C/C++ gibt es keinen Standarddatentypen, der das erlaubt. In dieser Aufgabe ist eine dynamische Datenstruktur vorgegeben, mit der eine nicht negative Zahl als Dezimalbruch mit beliebig vielen Vor- und Nachkommastellen gespeichert werden kann. Diese Datenstruktur wird aus Instanzen der zwei Strukturen TZiffer und TZahl aufgebaut:<br />
struct TZiffer {<br />
char ziffer;<br />
TZiffer* links;<br />
TZiffer* rechts;<br />
};<br />
struct TZahl {<br />
TZiffer* vkStelle;// Vorkommastelle<br />
int nkStellen; // Nachkommastellen<br />
int vkStellen; // Vorkommastellen<br />
TZiffer* aktPos; // Position in Liste<br />
};</p>
<p>Der Dezimalbruch wird durch ein Zahlenobjekt repräsentiert, das eine Instanz der Struktur TZahl ist. Diese Struktur enthält die Anzahl der Vor- und Nachkommastellen der gespeicherten Zahl (vkStellen/nkStellen) sowie zwei Verweise (vkStelle/aktPos) auf eine doppelt verkettete Liste. Jedes Element dieser doppelt verketteten Liste hat den Typ TZiffer, speichert den Wert einer Ziffer und enthält einen Verweis auf die linke bzw. rechte Nachbarziffer. Falls keine Nachbarziffer existiert, ist der entsprechende Verweis 0. Der Wert – nicht das Zeichen! – der Ziffer wird in der Komponente ziffer gespeichert. Der Zeiger vkStelle in der Struktur TZahl verweist immer auf die Ziffer direkt vor dem Komma und legt somit die Kommaposition fest.<br />
Es ist bereits eine Funktion erzeugeNull in der Vorgabe enthalten, die die Datenstruktur für den Dezimalbruch 0.0 aufbaut.</p>
<p>Implementieren Sie die folgenden weiteren Funktionen, die von der Funktion read in der Vorgabe benötigt werden, um einen als Text gegebenen Dezimalbruch in ein Zahlenobjekt umzuwandeln:<br />
•<br />
void zifferVorKomma(char ziffer, TZahl* zahl): Fügt in das übergebenen Zahlenobjekt zahl die übergebene Ziffer ziffer unmittelbar vor dem Komma ein. Alle anderen Ziffern vor dem Komma verschieben sich in dem Zahlenobjekt um eine Position nach links. Der Nachkommaanteil bleibt unverändert. ziffer speichert wieder den Wert der Ziffer und nicht das Zeichen.<br />
•<br />
void zifferNachKomma(char ziffer, TZahl* zahl): Fügt in das übergebenen Zahlenobjekt zahl die übergebene Ziffer ziffer unmittelbar nach dem Komma ein. Alle anderen Ziffern nach dem Komma verschieben sich in dem Zahlenobjekt um eine Position nach rechts. Der Vorkommaanteil bleibt unverändert.<br />
Zur Ausgabe eines als Zahlenobjekt gegebenen Dezimalbruchs auf dem Bildschirm durch die vorgegebene Funktion druckeZahl werden weitere Funktionen benötigt, die den Zeiger aktPos in der Struktur TZahl nutzen und korrekt modifizieren. Implementieren Sie diese Funktionen:<br />
•<br />
TZiffer* posLinks(TZahl* zahl): Setzt den Zeiger aktPos im Zahlenobjekt zahl auf die am weitesten links stehende Ziffer in diesem Zahlenobjekt und gibt einen Verweis auf diese Ziffer zurück.<br />
•<br />
TZiffer* posRechts(TZahl* zahl): Setzt den Zeiger aktPos im Zahlenobjekt zahl auf die am weitesten rechts stehende Ziffer in diesem Zahlenobjekt und gibt einen Verweis auf diese Ziffer zurück.<br />
•<br />
TZiffer* nachLinks(TZahl* zahl): Falls die Ziffer, auf die aktPos im Zahlenobjekt zahl verweist einen linken Nachbarn hat, so wird aktPos auf diesen Nachbarn gesetzt. Ansonsten wird aktPos nicht verändert. Die Funktion gibt den Verweis auf die Ziffer zurück, auf die aktPos dann zeigt.<br />
•<br />
TZiffer* nachRechts(TZahl* zahl): Falls die Ziffer, auf die aktPos im Zahlenobjekt zahl verweist einen rechten Nachbarn hat, so wird aktPos auf diesen Nachbarn gesetzt. Ansonsten wird aktPos nicht verändert. Die Funktion gibt den Verweis auf die Ziffer zurück, auf die aktPos dann zeigt.<br />
Jeder in einem Zahlenobjekt gespeicherte Dezimalbruch soll noch normalisiert werden können. Das bedeutet, dass der Vorkommaanteil mit genau einer führenden 0 beginnt und der Nachkommaanteil mit genau einer 0 endet. Diese Nullen sollen in den Variablen vkStellen und nkStellen nicht mitgezählt werden. Die oben angegebene Speicherung der 0.0 entspricht damit bereits dieser geforderten Normalisierung. Implementieren Sie eine Funktion<br />
void normalisiere(TZahl* zahl),<br />
die führende und abschließende Nullen – bis auf jeweils eine – in einem Zahlenobjekt streicht oder ergänzt, falls keine führende/abschließende 0 vorhanden ist.</p>
</blockquote>
<p><strong>Hier noch meine Vorgaben (die ich leider nicht ganz verstehe)</strong></p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

struct TZiffer {
  char ziffer;
  TZiffer* links;
  TZiffer* rechts;
};

struct TZahl {
  TZiffer* vkStelle; // Vorkommastelle
  int nkStellen;     // Nachkommastellen
  int vkStellen;     // Vorkommastellen
  TZiffer* aktPos;   // aktuelle Position in der liste
};

// Erzeugt den Dezimalbrucch 0.0
TZahl* erzeugeNull()
{
  TZahl* Null;

  Null = (TZahl*)malloc(sizeof(TZahl));
  Null-&gt;vkStellen = 0;
  Null-&gt;nkStellen = 0;
  // Vorkommastelle mit 0 initialisieren
  Null-&gt;vkStelle = (TZiffer*)malloc(sizeof(TZiffer));
  Null-&gt;vkStelle-&gt;ziffer = 0;
  Null-&gt;vkStelle-&gt;links = 0;
  // Nachkommastelle erzeugen
  Null-&gt;vkStelle-&gt;rechts = (TZiffer*)malloc(sizeof(TZiffer));
  Null-&gt;vkStelle-&gt;rechts-&gt;links = Null-&gt;vkStelle;
  Null-&gt;vkStelle-&gt;rechts-&gt;rechts = 0;
  Null-&gt;vkStelle-&gt;rechts-&gt;ziffer = 0;

  return Null;
}

// Gibt 1 zurueck, falls aktPos auf die erste Nachkommastelle zeigt
int ersteNKStelle(TZahl* zahl)
{
  return zahl-&gt;aktPos == zahl-&gt;vkStelle-&gt;rechts;
}

void zifferVorKomma(char ziffer, TZahl* zahl)
{
}

void zifferNachKomma(char ziffer, TZahl* zahl)
{
}

TZiffer* posLinks(TZahl* zahl)
{
}

TZiffer* posRechts(TZahl* zahl)
{
}

TZiffer* nachRechts(TZahl* zahl)
{
}

TZiffer* nachLinks(TZahl* zahl)
{
}

void normalisiere(TZahl* zahl)
{
}

// Zum Erzeugen eines Zahlenobjekts aus einem Text
// Zum Beispiel: text = &quot;12.500600&quot;
TZahl* read(char* text)
{
  TZahl* zahl;

  zahl = erzeugeNull();

  while(*text != '.' &amp;&amp; *text) {
    zifferVorKomma(*text - '0',zahl);
    text++;
  }

  if(!*text)
    return zahl;

  while(*text)
    text++;

  text--;
  while(*text != '.') {
    zifferNachKomma(*text - '0',zahl);
    text--;
  }

  return zahl;
}

// Zum Ausgeben der Ziffern eines Zahlenobjekts einschliesslich
// des Kommas
void druckeZahl(TZahl* zahl)
{
  TZiffer* ziffer;

  ziffer = posLinks(zahl);

  do {
    if(ersteNKStelle(zahl))
      printf(&quot;.&quot;);
    printf(&quot;%c&quot;,ziffer-&gt;ziffer + '0');
    ziffer = nachRechts(zahl);
  }while(ziffer);
}

int main(int argc, char* argv[])
{
  char eingabe[1024];
  TZahl* zahl;

  // Zum Testen der Implementierung. Die eingegebene Zahl darf nur aus
  // Ziffern und einem Punkt bestehen und sollte einen Vor- und Nachkommaanteil 
  // haben, die durch einen Punkt getrennt sind. Zum Beispiel: 47.11
  gets(eingabe);
  zahl = read(eingabe);
  druckeZahl(zahl);
  printf(&quot;\n&quot;);
  normalisiere(zahl);
  druckeZahl(zahl);
  printf(&quot;\n&quot;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1650717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650717</guid><dc:creator><![CDATA[BartMan]]></dc:creator><pubDate>Fri, 23 Jan 2009 10:15:50 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeit mit Datenstrukturen - ZAHLENOBJEKT on Fri, 23 Jan 2009 12:33:30 GMT]]></title><description><![CDATA[<p>Kurz gesagt: Wir sollen deine Hausaufgaben machen?</p>
<p>Mit der richtigen Bezahlung vielleicht, ansonsten nein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1650803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650803</guid><dc:creator><![CDATA[The-Kenny]]></dc:creator><pubDate>Fri, 23 Jan 2009 12:33:30 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeit mit Datenstrukturen - ZAHLENOBJEKT on Fri, 23 Jan 2009 12:43:16 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Null = (TZahl*)malloc(sizeof(TZahl)); 
  Null-&gt;vkStellen = 0; 
  Null-&gt;nkStellen = 0; 
  // Vorkommastelle mit 0 initialisieren 
  Null-&gt;vkStelle = (TZiffer*)malloc(sizeof(TZiffer)); 
  Null-&gt;vkStelle-&gt;ziffer = 0; 
  Null-&gt;vkStelle-&gt;links = 0; 
  // Nachkommastelle erzeugen 
  Null-&gt;vkStelle-&gt;rechts = (TZiffer*)malloc(sizeof(TZiffer)); 
  Null-&gt;vkStelle-&gt;rechts-&gt;links = Null-&gt;vkStelle; 
  Null-&gt;vkStelle-&gt;rechts-&gt;rechts = 0; 
  Null-&gt;vkStelle-&gt;rechts-&gt;ziffer = 0;
</code></pre>
<p>Wenn du weißt, was hier passiert und eine Vorstellung hast, weißt du, wie du die ersten 4 Funktionen schaffst. Die anderen sind ein bisschen anders, aber auch so ähnlich.<br />
Ein sehr gutes onlinetutorial über die Zeiger und der dynamischen Speicherverwaltung und dynamischen Datenstrutktoren gibt es hier::</p>
<p><a href="http://www.hs-augsburg.de/~sandman/c_von_a_bis_z/c_014_000.htm#Xxx999328" rel="nofollow">http://www.hs-augsburg.de/~sandman/c_von_a_bis_z/c_014_000.htm#Xxx999328</a></p>
<p>Links ist das Inhaltsverzeichniss. Wenn du das hier durchgehst(ich selber brauchte nur 60-90 minuten), brauchst du für die ersten 4 Funktionen maximal(!) nur 1h. <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>MFG Majin_Clodan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1650810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650810</guid><dc:creator><![CDATA[Majin_Clodan]]></dc:creator><pubDate>Fri, 23 Jan 2009 12:43:16 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeit mit Datenstrukturen - ZAHLENOBJEKT on Fri, 23 Jan 2009 13:08:07 GMT]]></title><description><![CDATA[<p>Erstmal vorne weg: Bei dem Code, den Du als 'Vorgaben' gepostet hast, handelt es sich fast ausschließlich um C (ausgenommen der Deklaration der structs). Und selbst wenn Du soviel lernst, dass Du diese Aufgabe zu 100% und ganz zügig lösen kannst, so hast Du anschließend von C++ praktisch keine Ahnung.<br />
Die Aufgabestellung lehnt sich auch in keiner Weise an Vorgehensweisen an, die in C++ üblich sind (z.B. Einsatz von Klassen/Strukturen und Container-Schnittstellen).</p>
<p>Zur Erklärung:<br />
- TZahl* erzeugeNull()<br />
erzeugt ein Objekt von TZahl und initialisiert es. Ebenso wird jeweils ein Objekt von TZiffer für je eine Vor- und ein Nachkommastelle erzeugt und initialisiert. Die Anzahl wird jeweils mit 0 initialisiert, obwohl jeweils eine Stelle existiert (?) Der Member aktpos ist vergessen worden.</p>
<p>- TZahl* read(char* text)<br />
es wird ein TZahl erzeugt (s.o.) dann wird solange zifferVorKomma mit dem Wert der Ziffer auf dem erzeugten TZahl-Objekt aufgerufen, bis ein Dezimal-Trenner erscheint oder der String zu Ende ist. Ist der Test zu Ende wird die Funktion verlassen. Falls nicht 'spult' er den Zeiger 'text' auf den Text bis zum Textende und ruft dann von hinten für jede Ziffer ZifferNachKomma auf. (?)</p>
<p>- void druckeZahl(TZahl* zahl)<br />
besorgt sich mit posLinks einen Zeiger auf das TZiffer-Objekt. In der Schleife wird solange der Wert der Ziffer ausgeben und der Zeiger mit nachRechts weiter geschaltet bis dieser zu 0 wird. Wenn derweil irgendwann die Funktion ersteNKStelle true liefert, so wird noch ein '.' eingefügt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1650830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650830</guid><dc:creator><![CDATA[Werner_logoff]]></dc:creator><pubDate>Fri, 23 Jan 2009 13:08:07 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeit mit Datenstrukturen - ZAHLENOBJEKT on Fri, 23 Jan 2009 16:07:11 GMT]]></title><description><![CDATA[<p>Danke zunächst für eure Antworten!</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20885">@Majin_Clodan</a><br />
Das Tutorial ist wirklich ganz gut. Ich hab es nun durchgearbeitet. Ich habe mit der Funktion posLinks begonnen. Der Zugriff auf die Elemente ist mir nun klar. Nur wie kann ich jetzt den Zeiger auf die &quot;linkeste&quot; Ziffer setzen??</p>
<p>Mein bisheriger Ansatz dafür:</p>
<pre><code class="language-cpp">TZiffer* posLinks(TZahl* zahl)
{
zahl = (TZahl*)malloc(sizeof(TZahl)); // Speicherreservierung
zahl-&gt;aktPos-&gt;links;                  // Hier versuch ich den Zeiger zu setzen
}
</code></pre>
<p>Was mach ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1650967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1650967</guid><dc:creator><![CDATA[BartMan]]></dc:creator><pubDate>Fri, 23 Jan 2009 16:07:11 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeit mit Datenstrukturen - ZAHLENOBJEKT on Fri, 23 Jan 2009 17:29:04 GMT]]></title><description><![CDATA[<p>BartMan schrieb:</p>
<blockquote>
<pre><code class="language-cpp">zahl-&gt;aktPos-&gt;links;                  // Hier versuch ich den Zeiger zu setzen
</code></pre>
<p>Was mach ich falsch?</p>
</blockquote>
<p>In dieser Zeile machst du gar nichts. Da könntest du genausogut &quot;3;&quot; in die Zeile schreiben. Da steht nur ein Wert, der keiner Variable zugewiesen wird. Der Compiler wird eine solche Zeile wegkürzen, da ohne Funktion. Tipp: &quot;=&quot; ist der Zuweisungsoperator! <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/1651036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651036</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 23 Jan 2009 17:29:04 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeit mit Datenstrukturen - ZAHLENOBJEKT on Fri, 23 Jan 2009 18:15:46 GMT]]></title><description><![CDATA[<p>BartMan, hast du Werners Beitrag auch gelesen? Das ist kein bisschen C++, was du da machst.</p>
<p>Wieso verwendest du nicht <code>new</code> und <code>delete</code> ? Oder Klassen? Oder C++-Cast-Operatoren wie <code>static_cast</code> ? Oder gleich Container?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1651061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651061</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 23 Jan 2009 18:15:46 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeit mit Datenstrukturen - ZAHLENOBJEKT on Sat, 24 Jan 2009 08:05:48 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">TZiffer* posLinks(TZahl* zahl) 
{ 
zahl = (TZahl*)malloc(sizeof(TZahl)); // Speicherreservierung 
zahl-&gt;aktPos-&gt;links;                  // Hier versuch ich den Zeiger zu setzen 
}
</code></pre>
<p>Ja, wie gesagt, wo zeigst du den Zeiger hin?<br />
Ich gebe dir mal was vor und du machst dann einfach weiter:</p>
<pre><code class="language-cpp">TZiffer* neuZiffer = (TZiffer*)malloc(sizeof(TZiffer)); /**Neuer Objektblock**/

    neuZiffer-&gt;links = zahl-&gt;vkStelle;   /**Zeigung Links vom neuen Objektblock ausgehend**/

    neuZiffer-&gt;rechts = zahl-&gt;vkStelle-&gt;rechts; /**Zeigung rechts vom neuen Objektblock ausgehend**/

    neuZiffer-&gt;ziffer = ziffer; /**Wert im Block, der erstellt wurde**/
</code></pre>
<p>Versuche zu verstehen, was hier passiert und wieso es so ist. Damit die Funktion nun vollständig wird, fehlen nur noch 2 Zeilen. <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="😉"
    /> Aber wenn du das oben verstehst, wirst du das auch hinbekommen. <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>
<p>MFG Majin_Clodan</p>
<p>PS: Ich habe es in C programmiert. Kannst auch in C++ machen, aber damit hab ich bisher zu wenig gearbeitet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1651254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651254</guid><dc:creator><![CDATA[Majin_Clodan]]></dc:creator><pubDate>Sat, 24 Jan 2009 08:05:48 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeit mit Datenstrukturen - ZAHLENOBJEKT on Sun, 25 Jan 2009 10:56:09 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

struct TZiffer {
  char ziffer;
  TZiffer* links;
  TZiffer* rechts;
};

struct TZahl {
  TZiffer* vkStelle; // Vorkommastelle
  int nkStellen;     // Nachkommastellen
  int vkStellen;     // Vorkommastellen
  TZiffer* aktPos;   // aktuelle Position in der liste
};

// Erzeugt den Dezimalbrucch 0.0
TZahl* erzeugeNull()
{
  TZahl* Null;

  Null = (TZahl*)malloc(sizeof(TZahl));
  Null-&gt;vkStellen = 0;
  Null-&gt;nkStellen = 0;
  // Vorkommastelle mit 0 initialisieren
  Null-&gt;vkStelle = (TZiffer*)malloc(sizeof(TZiffer));
  Null-&gt;vkStelle-&gt;ziffer = 0;
  Null-&gt;vkStelle-&gt;links = 0;
  // Nachkommastelle erzeugen
  Null-&gt;vkStelle-&gt;rechts = (TZiffer*)malloc(sizeof(TZiffer));
  Null-&gt;vkStelle-&gt;rechts-&gt;links = Null-&gt;vkStelle;
  Null-&gt;vkStelle-&gt;rechts-&gt;rechts = 0;
  Null-&gt;vkStelle-&gt;rechts-&gt;ziffer = 0;

  return Null;
}

// Gibt 1 zurueck, falls aktPos auf die erste Nachkommastelle zeigt
int ersteNKStelle(TZahl* zahl)
{
  return zahl-&gt;aktPos == zahl-&gt;vkStelle-&gt;rechts;
}

void zifferVorKomma(char ziffer, TZahl* zahl)
{
  int x = ziffer - '0';
  TZahl* AddL;

  AddL = (TZahl*)malloc(sizeof(TZahl));
  ++(AddL-&gt;vkStelle);
  AddL-&gt;vkStellen = (zahl-&gt;vkStellen) +1;
  AddL-&gt;nkStellen = (zahl-&gt;nkStellen);
  zahl-&gt;aktPos = AddL-&gt;aktPos;
  // Vorkommastelle mit ziffer initialisieren
  AddL-&gt;vkStelle = (TZiffer*)malloc(sizeof(TZiffer));
  AddL-&gt;vkStelle-&gt;links = zahl-&gt;vkStelle;
  AddL-&gt;vkStelle-&gt;ziffer = x;
  AddL-&gt;vkStelle-&gt;rechts = 0;
}

void zifferNachKomma(char ziffer, TZahl* zahl)
{
  int y = ziffer - '0';
  TZahl* AddR;

  AddR = (TZahl*)malloc(sizeof(TZahl));
  AddR-&gt;vkStellen = (zahl-&gt;vkStellen);
  AddR-&gt;nkStellen = (zahl-&gt;nkStellen) +1;
  ++(AddR-&gt;aktPos);
  AddR-&gt;vkStelle = zahl-&gt;vkStelle;
  // Nachkommastelle mit ziffer initialisieren
  AddR-&gt;vkStelle-&gt;rechts = (TZiffer*)malloc(sizeof(TZiffer));
  AddR-&gt;vkStelle-&gt;rechts-&gt;links = zahl-&gt;vkStelle-&gt;links;
  AddR-&gt;vkStelle-&gt;rechts-&gt;rechts = zahl-&gt;vkStelle;
//  for (AddR-&gt;nkStellen !=0) {

 // }

  AddR-&gt;vkStelle-&gt;rechts-&gt;ziffer = y;

}

TZiffer* posLinks(TZahl* zahl)
{
  while (zahl-&gt;aktPos-&gt;links)
      --(zahl-&gt;aktPos);
  return  zahl-&gt;aktPos;
}

TZiffer* posRechts(TZahl* zahl)
{
   while (zahl-&gt;aktPos-&gt;rechts)
      ++(zahl-&gt;aktPos);   
   return  zahl-&gt;aktPos;
}

TZiffer* nachRechts(TZahl* zahl)
{
         if (zahl-&gt;aktPos-&gt;rechts) ++(zahl-&gt;aktPos);
         else return 0;
}

TZiffer* nachLinks(TZahl* zahl)
{
         if (zahl-&gt;aktPos-&gt;links) --(zahl-&gt;aktPos);
         else return 0;
}

void normalisiere(TZahl* zahl)
{
      if (zahl-&gt;aktPos-&gt;links) (zahl-&gt;aktPos)--;
      //for (1) {
          //free (AddL-&gt;aktPos);
          //if ((zahl-&gt;aktPos-&gt;links-&gt;ziffer) != '0') break;
      //}
}

// Zum Erzeugen eines Zahlenobjekts aus einem Text
// Zum Beispiel: text = &quot;12.500600&quot;
TZahl* read(char* text)
{
  TZahl* zahl;

  zahl = erzeugeNull();

  while(*text != '.' &amp;&amp; *text) {
    zifferVorKomma(*text - '0',zahl);
    text++;
  }

  if(!*text)
    return zahl;

  while(*text)
    text++;

  text--;
  while(*text != '.') {
    zifferNachKomma(*text - '0',zahl);
    text--;

  }
  return zahl;

}

// Zum Ausgeben der Ziffern eines Zahlenobjekts einschliesslich
// des Kommas
void druckeZahl(TZahl* zahl)
{
  TZiffer* ziffer;

  ziffer = posLinks(zahl);

  do {
    if(ersteNKStelle(zahl))
      printf(&quot;.&quot;);
    printf(&quot;%c&quot;,ziffer-&gt;ziffer + '0');
    ziffer = nachRechts(zahl);
  }while(ziffer);
}

int main(int argc, char* argv[])
{
  char eingabe[1024];
  TZahl* zahl;

  // Zum Testen der Implementierung. Die eingegebene Zahl darf nur aus
  // Ziffern und einem Punkt bestehen und sollte einen Vor- und Nachkommaanteil 
  // haben, die durch einen Punkt getrennt sind. Zum Beispiel: 47.11
  gets(eingabe);
  zahl = read(eingabe);
  druckeZahl(zahl);
  printf(&quot;\n&quot;);
  normalisiere(zahl);
  druckeZahl(zahl);
  printf(&quot;\n&quot;);
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Hilfe XD</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1651899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651899</guid><dc:creator><![CDATA[kibi_kibi]]></dc:creator><pubDate>Sun, 25 Jan 2009 10:56:09 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeit mit Datenstrukturen - ZAHLENOBJEKT on Sun, 25 Jan 2009 17:57:17 GMT]]></title><description><![CDATA[<p>kibi_kibi schrieb:</p>
<blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Hilfe XD</p>
</blockquote>
<p>wobei? konkreten Fragen wären hilfreich.</p>
<p>Der Code enthält einige schwere Fehler. Z.B.:</p>
<p>kibi_kibi schrieb:</p>
<blockquote>
<pre><code class="language-cpp">TZiffer* posLinks(TZahl* zahl)
{
  while (zahl-&gt;aktPos-&gt;links)
      --(zahl-&gt;aktPos);
  return  zahl-&gt;aktPos;
}
</code></pre>
</blockquote>
<p>wenn Du in einer Liste einen Pointer 'weiter schaltest' so wird dieser nicht in- oder dekrementiert, sondern auf den Pointer gesetzt, den das Listen-Element vorgibt. Z.B.</p>
<pre><code class="language-cpp">zahl-&gt;aktPos = zahl-&gt;aktPos-&gt;rechts; // aktpos auf das rechts stehende Element weiterschalten
</code></pre>
<p>und die Rückgabe der ganz links - also am Anfang - stehenden Ziffer sollte mit</p>
<pre><code class="language-cpp">// Setzt den Zeiger aktPos im Zahlenobjekt zahl auf die am weitesten links stehende Ziffer in diesem Zahlenobjekt und gibt einen Verweis auf diese Ziffer zurück
TZiffer* posLinks( TZahl* zahl )
{
    return zahl-&gt;aktPos = zahl-&gt;vkStelle;
}
</code></pre>
<p>.. zu erledigen sein.</p>
<p>Gruß<br />
Werner</p>
<p>PS.: bist Du BartMan?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1652164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1652164</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 25 Jan 2009 17:57:17 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeit mit Datenstrukturen - ZAHLENOBJEKT on Sun, 25 Jan 2009 18:22:05 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>PS.: bist Du BartMan?</p>
</blockquote>
<p>hehe nein ;P aber wir haben das gleiche Aufgabe.<br />
Danke für Hilfe.<br />
Meine konkrete Frage: was ist hier falsch?.... in Fuktionen ersteNKStelle(TZahl* zahl), zifferVorKomma(char ziffer, TZahl* zahl), zifferNachKomma(char ziffer, TZahl* zahl), nachRechts(TZahl* zahl), nachLinks(TZahl* zahl), normalisiere(TZahl* zahl).</p>
<p>Ich habe versucht das zu schreiben, aber bis jetzt weiß ich nicht, ob ich das richtig mache oder nicht XD.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1652188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1652188</guid><dc:creator><![CDATA[kibi_kibi]]></dc:creator><pubDate>Sun, 25 Jan 2009 18:22:05 GMT</pubDate></item><item><title><![CDATA[Reply to Arbeit mit Datenstrukturen - ZAHLENOBJEKT on Sun, 25 Jan 2009 19:01:49 GMT]]></title><description><![CDATA[<p>kibi_kibi schrieb:</p>
<blockquote>
<p>Meine konkrete Frage: was ist hier falsch?.... in Fuktionen ersteNKStelle(TZahl* zahl), zifferVorKomma(char ziffer, TZahl* zahl), zifferNachKomma(char ziffer, TZahl* zahl), nachRechts(TZahl* zahl), nachLinks(TZahl* zahl), normalisiere(TZahl* zahl).</p>
<p>Ich habe versucht das zu schreiben, aber bis jetzt weiß ich nicht, ob ich das richtig mache oder nicht XD.</p>
</blockquote>
<p>- ersteNKStelle (s.o.)<br />
- zifferVorKomma &quot;Fügt in das übergebenen Zahlenobjekt zahl die übergebene Ziffer ziffer unmittelbar vor dem Komma ein. Alle anderen Ziffern vor dem Komma verschieben sich in dem Zahlenobjekt um eine Position nach links. Der Nachkommaanteil bleibt unverändert. ziffer speichert wieder den Wert der Ziffer und nicht das Zeichen. &quot;</p>
<pre><code class="language-cpp">void zifferVorKomma(char ziffer, TZahl* zahl)
{
  int x = ziffer - '0';
  // AddL = (TZahl*)malloc(sizeof(TZahl)); // Du must eine neue TZiffer erzeugen, eine TZahl hast Du ja schon
  // ++(AddL-&gt;vkStelle);  // &lt;- das geht überhaupt nicht (s. mein Kommentar im letzen Posting)

  // -- Ziffer erzeugen und alle Member belegen
  TZiffer* AddL = new TZiffer;
  AddL-&gt;ziffer = x;
  TZiffer* letzteVkStelle = zahl-&gt;vkStelle;
  for( int vk = zahl-&gt;vkStellen; vk &gt; 0; --vk, letzteVkStelle = letzteVkStelle-&gt;rechts )
      ; // letzteVKstelle über alle VK-Stellen laufen lassen, bis zur letzten; Achtung: führende 0 beachten!
  AddL-&gt;links = letzteVkStelle;
  AddL-&gt;rechts = letzteVkStelle-&gt;rechts;

  // -- dann die Zeiger zwischen 'letzteVKstelle' und seinem rechten Nachfolger umhängen
  letzteVkStelle-&gt;rechts-&gt;links = AddL;
  letzteVkStelle-&gt;rechts = AddL;

  // -- und mitzählen nicht vergessen
  ++(zahl-&gt;vkStellen);
}
</code></pre>
<p>(ohne Gewähr)</p>
<p>BTW: was bedeute der Member TZahl::vkStellen genau?</p>
<p>- zifferNachKomma<br />
so ähnlich sie zifferVorKomma, versuch's mal selber.</p>
<p>- nachRechts, nachLinks<br />
siehe mein letztes Posting</p>
<p>- normalisiere(TZahl* zahl)<br />
&quot;Implementieren Sie eine Funktion void normalisiere(TZahl* zahl), die führende und abschließende Nullen – bis auf jeweils eine – in einem Zahlenobjekt streicht oder ergänzt, falls keine führende/abschließende 0 vorhanden ist. &quot;</p>
<pre><code class="language-cpp">void normalisiere( TZahl* zahl )
{
    for( TZiffer* digit = zahl-&gt;vkStelle; zahl-&gt;vkStellen &gt; 0 &amp;&amp; digit-&gt;rechts-&gt;ziffer == 0; --(zahl-&gt;vkStellen) )
    {
        // rechts von der ersten 0 steht auch eine 0 also erstere entfernen
        digit-&gt;rechts-&gt;links = 0; // rechte 0 wird zur ersten 0
        zahl-&gt;vkStelle = digit-&gt;rechts;
        free( digit );
        digit = zahl-&gt;vkStelle;
    }
    TZiffer* digit = zahl-&gt;vkStelle;
    for( ; digit-&gt;rechts != 0; digit = digit-&gt;rechts )
        ; // letze Nachkommastelle suchen
    for( ; zahl-&gt;nkStellen &gt; 0 &amp;&amp; digit-&gt;links-&gt;ziffer == 0; --(zahl-&gt;nkStellen) )
    {
        // links von der letzen 0 steht auch eine 0 also die letzte entfernen
        digit-&gt;links-&gt;rechts = 0; // linke 0 wird zur letzen 0
        TZiffer* tmp = digit;
        digit = digit-&gt;links;
        free( tmp );
    }
}
</code></pre>
<p>(auch nicht getestet)<br />
Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1652217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1652217</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 25 Jan 2009 19:01:49 GMT</pubDate></item></channel></rss>