<?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[Benutzerdefinierter Dateityp: Operatoren definieren]]></title><description><![CDATA[<p>Unsere Aufgabe in dieser Woche ist es, Felder eines beliebigen Datentyps ElemT<br />
einzulesen und zu sortieren.<br />
Die Sortieralgorithmen habe ich bereits in der letzten Woche programmiert, und<br />
muss sie somit nur noch anpassen.</p>
<p>Insgesamt müssen 3 Felder sortiert werden:<br />
double-Feld doubles.txt<br />
string-Feld strings.txt<br />
Student-Feld student.txt</p>
<p>Für den benutzerdef. Datentyp 'Student' steht bereits ein Grundgerüst bereit,<br />
das um einen Ausgabeoperator '&lt;&lt;', sowie Vergleichsoperatoren '&lt;', '==' und '!='<br />
ergänzt werden soll.<br />
Und hier enstehen für mich als absoluten Anfänger direkt Schwierigkeiten:</p>
<p>Hier einmal das Grundgerüst:</p>
<pre><code>#include &quot;student.h&quot;

// Eingabeoperator &quot;&gt;&gt;&quot;
std::istream&amp; operator&gt;&gt; ( std::istream&amp; s, Student&amp; a)
{
    s &gt;&gt; a.Vorname &gt;&gt; a.Nachname &gt;&gt; a.MatNr &gt;&gt; a.Note;
    return s;
}

// Ausgabeoperator &quot;&lt;&lt;&quot;
std::ostream&amp; operator&lt;&lt; ( std::ostream&amp; s, const Student&amp; a)
{
    // hier den Ausgabeoperator definieren
}

// Vergleichsoperator &quot;&lt;&quot;
bool operator&lt; ( const Student&amp;, const Student&amp;)
{
    // hier fehlt was
}

// Vergleichsoperatoren &quot;==&quot; bzw. &quot;!=&quot;
bool operator== ( const Student&amp;, const Student&amp;)
{
    // hier fehlt was
}

bool operator!= ( const Student&amp;, const Student&amp;)
{
    // hier fehlt was
}
</code></pre>
<p>Meine Ideen:<br />
- Ausgabeoperator: Ich weiß leider nicht wie ich die 4 Merkmale (Vorn., Nachn., <a href="http://Matr.nr" rel="nofollow">Matr.nr</a>. und Note wie gewünscht ausgeben kann)</p>
<p>- Vergleichsoperator &lt;:<br />
Hier vergleiche ich Zeichen für Zeichen:<br />
Ist a[i] &lt; b[i] so ist a&lt;b.<br />
- Vergleichsoperator ==:<br />
Zuerst Länge vergleichen: untersch. Längen =&gt; false<br />
Ansonsten Zeichen für Zeichen: if a[i] != b[i], dann false<br />
- Vergleichsoperator !=:<br />
Umkehrfkt. zu ==, also dessen Ergebnis negieren.</p>
<p>Im Code würde das bei mir nun so ausschauen:</p>
<pre><code>#include &quot;student.h&quot;

// Eingabeoperator &quot;&gt;&gt;&quot;
std::istream&amp; operator&gt;&gt; ( std::istream&amp; s, Student&amp; a)
{
    s &gt;&gt; a.Vorname &gt;&gt; a.Nachname &gt;&gt; a.MatNr &gt;&gt; a.Note;
    return s;
}

// Ausgabeoperator &quot;&lt;&lt;&quot;
std::ostream&amp; operator&lt;&lt; ( std::ostream&amp; s, const Student&amp; a)
{
    // hier den Ausgabeoperator definieren
}

// Vergleichsoperator &quot;&lt;&quot;
bool operator&lt; ( const Student&amp; a, const Student&amp; b)
{
std::size_t min_length = std::min(a.length(), b.length());

    for(std::size_t i = 0; i &lt; min_length; ++i){
        if(a[i] &lt; b[i]){
            return true;
        }
        if(a[i] &gt; b[i]){
            return false;
        }
    }

    if(a.length() &gt;= b.length()){
        return false;
    }

    return true;
}

// Vergleichsoperatoren &quot;==&quot; bzw. &quot;!=&quot;
bool operator== ( const Student&amp; a, const Student&amp; b)
{
if(a.length() != b.length()){
        return false;
    }

    for(std::size_t i = 0; i &lt; a.length(); ++i){
        if(a[i] != b[i]){
            return false;
        }
    }

    return true;
}

bool operator!= ( const Student&amp; a, const Student&amp; b)
{
return !(a == b);
}
</code></pre>
<p>Wäre für jeden Tipp, sowie Hilfe (vor allem bei dem Ausgabeoperator) dankbar <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>VG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/332552/benutzerdefinierter-dateityp-operatoren-definieren</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 22:00:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332552.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 07 May 2015 20:55:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Benutzerdefinierter Dateityp: Operatoren definieren on Thu, 07 May 2015 20:55:05 GMT]]></title><description><![CDATA[<p>Unsere Aufgabe in dieser Woche ist es, Felder eines beliebigen Datentyps ElemT<br />
einzulesen und zu sortieren.<br />
Die Sortieralgorithmen habe ich bereits in der letzten Woche programmiert, und<br />
muss sie somit nur noch anpassen.</p>
<p>Insgesamt müssen 3 Felder sortiert werden:<br />
double-Feld doubles.txt<br />
string-Feld strings.txt<br />
Student-Feld student.txt</p>
<p>Für den benutzerdef. Datentyp 'Student' steht bereits ein Grundgerüst bereit,<br />
das um einen Ausgabeoperator '&lt;&lt;', sowie Vergleichsoperatoren '&lt;', '==' und '!='<br />
ergänzt werden soll.<br />
Und hier enstehen für mich als absoluten Anfänger direkt Schwierigkeiten:</p>
<p>Hier einmal das Grundgerüst:</p>
<pre><code>#include &quot;student.h&quot;

// Eingabeoperator &quot;&gt;&gt;&quot;
std::istream&amp; operator&gt;&gt; ( std::istream&amp; s, Student&amp; a)
{
    s &gt;&gt; a.Vorname &gt;&gt; a.Nachname &gt;&gt; a.MatNr &gt;&gt; a.Note;
    return s;
}

// Ausgabeoperator &quot;&lt;&lt;&quot;
std::ostream&amp; operator&lt;&lt; ( std::ostream&amp; s, const Student&amp; a)
{
    // hier den Ausgabeoperator definieren
}

// Vergleichsoperator &quot;&lt;&quot;
bool operator&lt; ( const Student&amp;, const Student&amp;)
{
    // hier fehlt was
}

// Vergleichsoperatoren &quot;==&quot; bzw. &quot;!=&quot;
bool operator== ( const Student&amp;, const Student&amp;)
{
    // hier fehlt was
}

bool operator!= ( const Student&amp;, const Student&amp;)
{
    // hier fehlt was
}
</code></pre>
<p>Meine Ideen:<br />
- Ausgabeoperator: Ich weiß leider nicht wie ich die 4 Merkmale (Vorn., Nachn., <a href="http://Matr.nr" rel="nofollow">Matr.nr</a>. und Note wie gewünscht ausgeben kann)</p>
<p>- Vergleichsoperator &lt;:<br />
Hier vergleiche ich Zeichen für Zeichen:<br />
Ist a[i] &lt; b[i] so ist a&lt;b.<br />
- Vergleichsoperator ==:<br />
Zuerst Länge vergleichen: untersch. Längen =&gt; false<br />
Ansonsten Zeichen für Zeichen: if a[i] != b[i], dann false<br />
- Vergleichsoperator !=:<br />
Umkehrfkt. zu ==, also dessen Ergebnis negieren.</p>
<p>Im Code würde das bei mir nun so ausschauen:</p>
<pre><code>#include &quot;student.h&quot;

// Eingabeoperator &quot;&gt;&gt;&quot;
std::istream&amp; operator&gt;&gt; ( std::istream&amp; s, Student&amp; a)
{
    s &gt;&gt; a.Vorname &gt;&gt; a.Nachname &gt;&gt; a.MatNr &gt;&gt; a.Note;
    return s;
}

// Ausgabeoperator &quot;&lt;&lt;&quot;
std::ostream&amp; operator&lt;&lt; ( std::ostream&amp; s, const Student&amp; a)
{
    // hier den Ausgabeoperator definieren
}

// Vergleichsoperator &quot;&lt;&quot;
bool operator&lt; ( const Student&amp; a, const Student&amp; b)
{
std::size_t min_length = std::min(a.length(), b.length());

    for(std::size_t i = 0; i &lt; min_length; ++i){
        if(a[i] &lt; b[i]){
            return true;
        }
        if(a[i] &gt; b[i]){
            return false;
        }
    }

    if(a.length() &gt;= b.length()){
        return false;
    }

    return true;
}

// Vergleichsoperatoren &quot;==&quot; bzw. &quot;!=&quot;
bool operator== ( const Student&amp; a, const Student&amp; b)
{
if(a.length() != b.length()){
        return false;
    }

    for(std::size_t i = 0; i &lt; a.length(); ++i){
        if(a[i] != b[i]){
            return false;
        }
    }

    return true;
}

bool operator!= ( const Student&amp; a, const Student&amp; b)
{
return !(a == b);
}
</code></pre>
<p>Wäre für jeden Tipp, sowie Hilfe (vor allem bei dem Ausgabeoperator) dankbar <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>VG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452921</guid><dc:creator><![CDATA[danooh]]></dc:creator><pubDate>Thu, 07 May 2015 20:55:05 GMT</pubDate></item><item><title><![CDATA[Reply to Benutzerdefinierter Dateityp: Operatoren definieren on Thu, 07 May 2015 21:39:19 GMT]]></title><description><![CDATA[<p>Du weißt wie die Daten eingelesen werden sollen. Damit weißt du ja auch, wie sie geschrieben werden könnten.<br />
Du brauchst nur ein Trennzeichen zwischen den Werten.<br />
(Wie stehen sie denn in student.txt? <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>Wie sollen denn die Studenten sortiert werden?<br />
(Was macht das length oder []-Operator?)</p>
<p>Sollten bei Vergleichen nicht alle Eigenschaften verglichen werden?</p>
<p>Btw, du musst nur operator&lt; implementieren... == und != lassen sich damit ausdrücken.</p>
<p>std::string::compare könnte das vereinfachen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452922</guid><dc:creator><![CDATA[lagalopex]]></dc:creator><pubDate>Thu, 07 May 2015 21:39:19 GMT</pubDate></item><item><title><![CDATA[Reply to Benutzerdefinierter Dateityp: Operatoren definieren on Thu, 07 May 2015 22:03:15 GMT]]></title><description><![CDATA[<p>Ein Beispiel:<br />
Carl-Friedrich Gauss 111111 1.0</p>
<p>student.txt besteht aus 12 solcher Einträge.</p>
<p>Die Einträge sollen aufsteigend nach Nachnamen, bei gleichen Nachn. nach Vornamen, sortiert werden.</p>
<p>Jetzt fällt mir auf, dass ich die Operatoren da wohl noch anpassen muss <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="😃"
    /><br />
(bzgl. der versch. Eigenschaften)</p>
<p>Ich versuche das mal für '&lt;':</p>
<pre><code>bool operator&lt; ( const Student&amp; a, const Student&amp; b)
{
std::size_t min_nachname = std::min(a.Nachname.length(), b.Nachname.length());
std::size_t min_vorname = std::min(a.Vorname.length(), b.Vorname.length());
    //gleiche Nachnamen
    if(a.Nachname == b.Nachname){ 
       for(std::size_t i = 0; i &lt; min_vorname; ++i){
           if(a.Vorname[i] &lt; b.Vorname[i]){
              return true;
           }
           if(a.Vorname[i] &gt; b.Vorname[i]){
              return false;
           }
       }
       if(a.Vorname.length() &gt;= b.Vorname.length()){
         return false;
       }

       return true;

    }
    for(std::size_t i = 0; i &lt; min_nachname; ++i){
        if(a.Nachname[i] &lt; b.Nachname[i]){
            return true;
        }
        if(a.Nachname[i] &gt; b.Nachname[i]){
            return false;
        }
    }

    if(a.Nachname.length() &gt;= b.Nachname.length()){
        return false;
    }

    return true;
}
</code></pre>
<p>Hier stellt sich mir noch eine Frage:<br />
In der Abfrage</p>
<pre><code>if(a.Nachname == b.Nachname)
</code></pre>
<p>greife ich ja auf den '=='-Operator zurück.<br />
Nun weiß ich nicht wie ich '==' mit '&lt;' ausdrücken kann <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>EDIT: Werde mir das mit dem std::string::compare mal ansehen. Das scheint einfacher zu sein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452925</guid><dc:creator><![CDATA[danooh]]></dc:creator><pubDate>Thu, 07 May 2015 22:03:15 GMT</pubDate></item><item><title><![CDATA[Reply to Benutzerdefinierter Dateityp: Operatoren definieren on Thu, 07 May 2015 22:05:02 GMT]]></title><description><![CDATA[<p>Um deine direkte Frage zu beantworten: Wenn etwas weder &lt; noch &gt; ist, dann ist es ==. Und &gt; kannst du als &lt; schreiben, indem du einfach beide Seiten umdrehst.</p>
<p><strong>Aber</strong>: Der Vergleich der einzelnen Namensbestandteile ist nicht Aufgabe des Studenten-Vergleichsoperators. Haben die Datentypen für Vor- und Nachname denn keine eigenen Vergleichsoperatoren? Falls sie welche haben: Nutze diese! Falls sie keine haben: Schreib welche und nutze diese!</p>
<p>Somit wird dann der Studenten-Vergleichsoperator sowohl einfacher als auch robuster gegen Änderungen und Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452926</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 07 May 2015 22:05:02 GMT</pubDate></item><item><title><![CDATA[Reply to Benutzerdefinierter Dateityp: Operatoren definieren on Thu, 07 May 2015 22:21:51 GMT]]></title><description><![CDATA[<p>Habe jetzt noch im Netz nachgeschaut (bin wirklich ein absoluter Neuling in Sachen C++):</p>
<p>In C++ kann ich Zeichenketten vom Typ string einfach mit Hilfe von<br />
==, !=, &lt;, &gt;, &lt;=, =&gt; miteinander vergleichen oder?</p>
<p>Nun nehme ich mal 2 Dateien vom Typ student:</p>
<p>Pierre-Louis Lions 301979 1.3<br />
Jacques-Louis Lions 271954 1.3</p>
<p>Angenommen es sei<br />
a= Pierre-Louis Lions 301979 1.3,<br />
b= Jacques-Louis Lions 271954 1.3<br />
Weiß C++, dass a.Nachname vom Typ string ist?</p>
<p>Dann würde mein '&lt;' für Student ja wie folgt ausschauen:</p>
<pre><code>// Vergleichsoperator &quot;&lt;&quot;
bool operator&lt; ( const Student&amp; a, const Student&amp; b)
{
    if (a.Nachname == b.Nachname){ //gl. Nachname
      if(a.Vorname &lt; b.Vorname){
         return true;
        }
      return false;
    } 
    if (a.Nachname &lt; b.Nachname){
       return true;
    }
    return false;
}
</code></pre>
<p>EDIT: Oder kann ich durch</p>
<pre><code>string a.Nachname, b.Nachname;
</code></pre>
<p>die einzelnen Einträge jeweils dem Typ string zuweisen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452927</guid><dc:creator><![CDATA[danooh]]></dc:creator><pubDate>Thu, 07 May 2015 22:21:51 GMT</pubDate></item><item><title><![CDATA[Reply to Benutzerdefinierter Dateityp: Operatoren definieren on Thu, 07 May 2015 22:25:05 GMT]]></title><description><![CDATA[<p>Student definiert Nachname. Da musst du nichts mehr machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452928</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Thu, 07 May 2015 22:25:05 GMT</pubDate></item><item><title><![CDATA[Reply to Benutzerdefinierter Dateityp: Operatoren definieren on Thu, 07 May 2015 22:25:27 GMT]]></title><description><![CDATA[<p>Die Variable &quot;Nachname&quot; hat doch schon einen Datentyp, schau mal in die Klasse &quot;Student&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452929</guid><dc:creator><![CDATA[tkausl]]></dc:creator><pubDate>Thu, 07 May 2015 22:25:27 GMT</pubDate></item><item><title><![CDATA[Reply to Benutzerdefinierter Dateityp: Operatoren definieren on Thu, 07 May 2015 22:35:56 GMT]]></title><description><![CDATA[<p>Stimmt,<br />
Habe es nun in einer anderen Datei gesehen.</p>
<pre><code>struct Student
{
    std::string Vorname, Nachname;
    int         MatNr;
    double      Note;
};
</code></pre>
<p>D.h. dass ich Nachnamen also mit '&lt;' usw. vergleichen kann.</p>
<p>Edit: Ich füge mal die anderen Operatoren hinzu (bin gerade dabei)</p>
<pre><code>// Vergleichsoperatoren &quot;==&quot; bzw. &quot;!=&quot;
bool operator== ( const Student&amp; a, const Student&amp; b)
{
    if(a &lt; b){
       return false;
    }
    if(a &gt; b){ //muss noch implementiert werden
       return false;
    }
    return true;
}

bool operator!= ( const Student&amp; a, const Student&amp; b)
{
    return !(a == b); //auf == zurückgreifen, und das Ergebnis negieren 
}

bool operator&gt; ( const Student&amp; a, const Student&amp; b) //Mein Versuch für '&gt;'
{
    if (a.Nachname == b.Nachname){ //gl. Nachname
      if(a.Vorname &gt; b.Vorname){
         return true;
        }
      return false;
    }
    if (a.Nachname &gt; b.Nachname){
       return true;
    }
    return false;
}
</code></pre>
<p>Wie schaut es soweit aus? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452930</guid><dc:creator><![CDATA[danooh]]></dc:creator><pubDate>Thu, 07 May 2015 22:35:56 GMT</pubDate></item><item><title><![CDATA[Reply to Benutzerdefinierter Dateityp: Operatoren definieren on Fri, 08 May 2015 06:15:40 GMT]]></title><description><![CDATA[<p>Wenn nicht a&gt;b und nicht b&gt;a gilt, gilt dann nach deiner Implementierung a==b? Immer?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452944</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 08 May 2015 06:15:40 GMT</pubDate></item><item><title><![CDATA[Reply to Benutzerdefinierter Dateityp: Operatoren definieren on Sat, 09 May 2015 00:49:59 GMT]]></title><description><![CDATA[<p>Hab's heute fertig gestellt.<br />
Danke an alle <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2453051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2453051</guid><dc:creator><![CDATA[danooh]]></dc:creator><pubDate>Sat, 09 May 2015 00:49:59 GMT</pubDate></item></channel></rss>