Pointer/ Probleme im Codee



  • Hallo liebe C++ Community,
    ich bin gerade beim Erlernen von Pointern und dazu müssen wir ein Notenauswertungsprogramm programmieren. Die Noten sollen in Arrays gespeichert werden und dann soll mit Hilfe der Zeigerarithmetik der Mittelwert berechnet werden, die Eingabe funktioniert aber beim Mittelwert wird immer 0 ausgegeben.
    Der Code dazu lautet:

    int notendurchschnitt(int *noten, int wieviele, float mittelwert)
    {
    
       int summe=0;
    
       for(int i=0; i<wieviele; i++)
       {
           summe=summe+(*(noten+i));
       }
    
       mittelwert=summe/wieviele;
    
       return mittelwert;
    
    
    }
    

    Ich kann es mir nicht erklären.
    Danke im Voraus
    Lg Sandra



  • @sandra1 Wie rufst du die Funktion auf?

    Das mittelwert vom Funktionsaufruf ist kein Rückgabewert.

    Die Berechnung erfolgt als Ganzzahldivision.



  • This post is deleted!


  • @DirkB

    Ich rufe die Funktion so auf:

    mittelwert2=notendurchschnitt(noten2, wieviele2, mittelwert2);
    

    Ich will ja zum Schluss eine Dezimalzahl, besser gesagt kann ich dir mit der Ganzzahldivision nicht ganz folgen.



  • @sandra1

    float notendurchschnitt(int *noten, int wieviele)
    {
       float mittelwert;
       int summe=0;
    
       for(int i=0; i<wieviele; i++)
       {
           summe=summe+(*(noten+i));
       }
    
       mittelwert=summe/wieviele;
    
       return mittelwert;
    }
    


  • Warum ist mittelwert ein Parameter der Funktion ? Warum gibt die Funktion ein int zurück?

    OT:
    Herzliches Beileid, dein Lehrer ist YAIT (yet another incompetent teacher).



  • @sandra1 kommt dir das mit dem doppelten mittelwert2 nicht komisch vor?

    Warum übergibst du mittelwert2 an die Funktion.
    Innerhalb wird doch nur ein Wert zugewiesen.

    Zudem ist der Rückgabewert der Funktion vom Typ int.

    Bei mittelwert=summe/wieviele; sind summe und wieviele vom Typ int (Ganzzahlen). Darum wird auch die Division ganzzahlig durchgeführt. (Grundschulrechnen).

    Die Zuweisung an eine Fließkommavariable geschieht erst danach.



  • @sandra1 sagte in Pointer/ Probleme im Codee:

       summe=summe+(*(noten+i));
    

    Mal was anderes, was soll das eigentlich? Das schreibt man besser summe = summe + noten[i]. Und bevor du protestierst: Das IST AUCH Zeigerarithmetik, das ist nichts anderes als eine einfachere Schreibweise für das, was du da hast. (Man sollte es auch noch zu summe += noten[i]; verkürzen, aber das ist ein separater Punkt.)

    Was mit "mit Hilfe der Zeigerarithmetik" gemeint sein kann, ist, auf das Array überhaupt nicht durch einen numerischen Index zuzugreifen, sondern durchgängig nur Zeiger zu benutzen:

    int* noten_ptr;
    for (noten_ptr = noten; noten_ptr < noten + wieviele; ++noten_ptr)
      summe += *noten_ptr;
    

    (Es kann natürlich sein, dass dein Lehrer das nicht gemeint hat. Ich würde keinem direkt Inkompetenz unterstellen, aber Lehrer sind halt keine Programmierer und wissen auch nur das, was sie für die paar Unterrichtsstunden wissen müssen.)



  • also korrekter weise müsste der funktionskopf int notendurchschnitt(int *noten, int wieviele, float *mittelwert) lauten und dann müsstest du es mit notendurchschnitt(noten2, wieviele2, &mittelwert2); aufrufen und in der funktion müsstest du auch *mittelwert = summe / wieviele; schreiben.

    mach dir nichts draus, es gehört alles zum lernfortschritt dazu.



  • @Wade1234 sagte in Pointer/ Probleme im Codee:

    also korrekter weise müsste der funktionskopf int notendurchschnitt(int *noten, int wieviele, float *mittelwert) lauten

    Wozu? Wofür ist das return-value vom Typ int? Wenn das weg kann wovon ich ausgehe, wofür dann Rückgabe des Mittelwerts über Parameter? Nenene.

    @Wutz sagte in Pointer/ Probleme im Codee:

    float notendurchschnitt(int *noten, int wieviele)
    {
       float mittelwert;
       int summe=0;
    
       for(int i=0; i<wieviele; i++)
       {
           summe=summe+(*(noten+i));
       }
    
       mittelwert=summe/wieviele;
    
       return mittelwert;
    }
    
    #include <cassert>
    #include <cstddef>
    
    float arithmetic_mean(int *values, std::size_t count)
    {
        assert(values && count);
    
        float sum = 0;
        for (std::size_t i = 0; i != count; ++i)
            sum += values[i];
        return sum / count;
    }
    


  • @Swordfish es ist nicht unüblich, werte auf diese weise zurück zu geben. dies verbunden mit der tatsache, dass zeiger geübt werden sollen und die funktion einen parameter namens mittelwert hat...... der rückgabewert der funktion hat dann wohl eher die aufgabe, irgendwelche fehlercodes zurück zu geben.

    also klar: eigentlich nimmt man dafür referenzen, aber bei mir war das so, dass ich erst zeiger gelernt habe und dann wurden die vorteile von referenzen gegenüber zeigern aufgezeigt. und weil das eben eine übungsaufgabe sein wird, ging ich einfach davon aus, dass da ein zeiger in den kopf gehört.🙄



  • @Swordfish
    Was willst du mit diesem C++ Quatsch beweisen? Dessen Blähfaktor bei einfachsten Implementierungen?

    float notendurchschnitt(int *noten, int wieviele)
    {
       int summe=0, w=wieviele;
    
       while(w--) summe += *noten++;
    
       return summe/wieviele;
    }
    


  • @Wutz sagte in Pointer/ Probleme im Codee:

    C++ Quatsch

    Was daran ist jetzt genau "C++ Quatsch"?



  • @Wutz sagte in Pointer/ Probleme im Codee:

    @Swordfish
    Was willst du mit diesem C++ Quatsch beweisen? Dessen Blähfaktor bei einfachsten Implementierungen?

       while(w--) summe += *noten++;
    

    Die Steigerung davon ist, ausschließlich in for-Schleifen ohne Schleifenkörper zu programmieren. Kannte mal so jemanden und die Anzahl der Leute, die sich darum gerissen haben, seinen Code zu debuggen, war sehr überschaubar 😉

    IMHO sollte Lesbarkeit immer Vorrang vor kompaktem Code haben. In dieser einen Zeile da oben passiert mir einfach zu viel an zu vielen verschiedenen Speicherstellen. Da ist die Gefahr grösser, etwas zu übersehen.

    Das ist allerdings noch ein relativ zahmes Beispiel, ich habe da schon schlimmeres gesehen. Kurioserweise jedoch häufiger ausgerechnet in C und seltener in "C++-Quatsch-Blähcode".


  • Mod

    Threadersteller sandra1 hat übrigens die Angewohnheit, nach Beantwortung einer Frage, alle Beiträge zu löschen. Man möge selber entscheiden, ob einem die Mühe einer Antwort wert ist für einen später nutzlosen Thread.



  • @Swordfish sagte in Pointer/ Probleme im Codee:

    float arithmetic_mean(int *values, std::size_t count)
    // ...

    float arithmetic_mean(int* values, int count)
    {
        assert(values && count > 0);
    
        float sum = 0;
        for (int i = 0; i < count; ++i)
            sum += values[i];
        return sum / count;
    }
    

    FTFY 😃

    (Spaß...)


Log in to reply