(Anfänger) Kleinste Zahl zurückgeben



  • Hallo Leute,

    Meine Aufgabenstellung die ich mir gesetzt habe: Schreibe eine Funktion die die kleinste Zahl von einem Array zurückgibt.

    Ich denke das einzige was an meinem Programm nicht funktioniert, ist das "auslesen" der Länge des Arrays.
    Leider bin ich wie oben steht noch ein ziemlicher Anfänger.
    Somit würde ich mich über eine Korrektur und wenn jemand Lust hat auch über eine kleine Erklärung warum mein Programm die Länge nicht richtig ausgibt freuen. 😁

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    
    int returnSmallest( int arr[] ){
      int min = arr[0];
      int length = sizeof(arr) / sizeof(int);
      std::cout<<length<<std::endl; //nur um zu sehen was ich als Länge bekomme
    
      for ( int i = 0; i < length; i ++){
        if ( arr[i] < min ){
          min = arr[i];
        }
      }
      return min;
    }
    
    int main(){
    
      int number[] = {5, 9, 2, 9, 5, 2, 1};
    
      std::cout << returnSmallest(number); //soll die kleinste Zahl ausgeben = 1
    
      return 0;
    }
    

    Freue mich über jede Antwort. Danke!



  • Ein Array als Funktionsparameter hat die größe eines Zeigers. Du musst die Länge im Funktionsuafruf mitgeben.

    Besser wäre std::array oder std::vector statt C-Array. Aber dein Lehrer scheint einer der Schlechten zu sein.

    #include <stdio.h>und #include <stdlib.h> warum?

    In C++ wären das #include <cstdio>und #include <cstdlib>, die brauchst du aber nur, Wenn du C ind C++ programmierst.


  • |  Mod

    Soll das C sein oder C++? Derzeit ist es C mit cout.

    In C ist die Antwort: Du kannst nicht an die Länge kommen. Du musst sie der Funktion mit übergeben. int arr[] mag zwar wie ein Array aussehen, aber in Wirklichkeit ist das nur eine schöne Schreibweise für einen Pointer. Der Pointer zeigt dann zwar auf den Anfang deines Arrays, aber er trägt keinerlei Größeninformation mit sich. (Außer seiner eigenen Größe, die du mit sizeof bekommst, aber die Größe eines Pointers ist konstant und nützt dir wenig.)

    In C++ wäre die Antwort: Nutz keine (rohen) Arrays! std::array oder std::vector machen das gleiche wie Arrays, aber in allen Belangen besser. Unter anderem wissen sie selber, wie groß sie sind. Diese Information geht auch nicht verloren, wenn man sie an Funktionen übergibt. Außerdem solltest du dir in dem Fall einen Lehrer suchen, der dich C++ lehrt anstatt C mit cout. Sonst lernst du weder C noch C++.



  • Okay, danke für die schnellen Antworten!

    Soll heißen eigentlich lerne ich eine Mischung aus beidem und nichts richtig? 😢

    Habt jemand von euch eine gute Quelle wo ich C++ selber erlenern kann?



  • Und wenn ich auf YouTube Tutorials anschaue, dann verbinden die auch immer "cout" mit C++?

    siehe: https://youtu.be/vLnPwxZdW4Y?t=629

    Kann mir jemand sagen warum?



  • @siebererrene
    Hier ist eine offline Quelle



  • Im Falle, dass du C++ lernen willst, würde ich dir ein Buch nahe legen.
    Meine Empfehlung wäre hier "Der C++ Programmier" von Ullrich Breymann ... am besten natürlich in der neusten Ausgabe zu C++17.

    Was du da machst ist eig bisher eher C, aber du verwendest Libraries aus C++, die es in C nicht gibt z.B. iostream. Du solltest dich erstmal entscheiden, was du lernen möchtest, dann können wir dir auch die entsprechenden Tipps geben wie du dein Programm nicht nur zum funktionieren bringst, sondern auch schönen Code schreibst.

    Möglicherweise können wir dir auch bei dieser Entscheidung helfen, zumindest teilweise. Gibt es einen Grund, warum du dir diese Aufgabe gesetzt hast? ... Hast du das im Studium? Einfach nur ein Hobby? Was ist längerfristig das Ziel?



  • @siebererrene sagte in (Anfänger) Kleinste Zahl zurückgeben:

    Und wenn ich auf YouTube Tutorials anschaue, dann verbinden die auch immer "cout" mit C++?

    solltest du lassen. ernsthaft!

    Kann mir jemand sagen warum?

    in c++ läuft alles über streams und der ausgabestream heißt nunmal c(-onsole)out(-put)



  • @siebererrene sagte in (Anfänger) Kleinste Zahl zurückgeben:

    dann verbinden die auch immer "cout" mit C++

    Das Problem ist ja nicht das cout sondern das C statt C++.



  • @siebererrene sagte in (Anfänger) Kleinste Zahl zurückgeben:

    Okay, danke für die schnellen Antworten!

    Soll heißen eigentlich lerne ich eine Mischung aus beidem und nichts richtig? 😢

    Wahrscheinlich ist das so. Ist aber (leider) ein weit verbreitetes Phänomen. So weit verbreitet, dass es sogar einen Talk darüber gibt, dass Lehrende, die C++ lehren, nicht C lehren sollten (Stop teaching C). (Wenn man C lehren will, soll man natürlich C lernen - nur wenn es ein C++-Kurs ist, sollte eben nicht C drin sein)

    Habt jemand von euch eine gute Quelle wo ich C++ selber erlenern kann?

    Hm, das ist immer schwierig. Gute Bücher sind rar. Empehlungen: "Der C++-Programmierer" von Breymann und/oder "C++ Primer" von Lippman et al.

    Und dann gibt es noch die C++ core guidelines (wo in I.13 dein Problem beschrieben wird), die aber vermutlich noch zu fortgeschritten sind.

    Ansonsten möchte ich aber noch anmerken, dass dein Code ansonsten gut aussieht! Insbesondere dass du mit int min = arr[0]; anfängst, finde ich gut. In deiner for-Schleife kannst du dann allerdings das 0. Element überspringen. Das wird nicht kleiner als es selbst sein.

    Wenn du C++ lernen willst, gehört noch Wissen über die STL dazu (Referenzen findest du hier oder hier). Schau dir insbesondere die Referenzen der Header <vector>, <string> und <algorithm> an (in der Reihenfolge).

    Auch für dein Problem gibt es bereits eine fertige Lösung. Sie nennt sich std::min_element (mit Beispielcode in gutem C++!). (mag noch zu fortgeschritten sein - es ist auf jeden Fall kein Fehler, Dinge wie die Suche nach dem Minimum einmal selbst implementiert zu haben)



  • Danke für all eure Antworten!

    Ich werden mir die oben genannten Bücher holen und dann büffeln und ausprobieren was geht!
    Und an alle. Bitte verurteilt meinen Lehrer nicht. Der bin nämlich ICH 🤣
    Ich habe mir bis jetzt alles selber angeeignet. Beziehungsweise versucht..

    @DocShoe danke!

    @Leon0402 zurzeit ist es ein Hobby, das mich aber so sehr interessiert bzw. fasziniert, dass ich es früher oder später zu meinem Beruf machen möchte und dies evt. auch studieren möchte.

    @wob Danke!
    Werde mir deine Ratschläge zu herzen nehmen!

    LG
    Rene


  • |  Mod

    @Wade1234 sagte in (Anfänger) Kleinste Zahl zurückgeben:

    in c++ läuft alles über streams und der ausgabestream heißt nunmal c(-onsole)out(-put)

    char output. Bezüglich Konsolen, Fenstern, Pipes, etc. ist C++ komplett agnostisch.



  • @SeppJ
    das heißt echt char output?


  • |  Mod

    @Wade1234 sagte in (Anfänger) Kleinste Zahl zurückgeben:

    @SeppJ
    das heißt echt char output?

    Ja?



  • @Wade1234 sagte in (Anfänger) Kleinste Zahl zurückgeben:

    @SeppJ
    das heißt echt char output?

    Stroustrup muss es wissen.



  • @Wade1234 sagte in (Anfänger) Kleinste Zahl zurückgeben:

    das heißt echt char output?

    Steht ja doch auch nirgends geschrieben, daß STDOUT und Kollegen an einer Konsole, einem Terminal hängen müssen.

    Auch in Anbetracht daß es auch std::wcout und Co für wide characters gibt, ist character out logischer.

    @siebererrene sagte in (Anfänger) Kleinste Zahl zurückgeben:

    int returnSmallest( int arr[] ){
    

    Dein Stichwort für das da ist Array-to-Pointer decay1). Die eckigen Klammern bei Funktionsparametern sind exakt dasselbe als stüde da für Dein Beispiel

    int returnSmallest(int *arr) {
    

    Nimm in C++ besser std::array<>, oder std::vector<> wenn Du einen Container willst, der in der Größe flexibel ist.

    1) Ja, streng genommen "zerfällt" da nichts, aber der Begriff hat sich nunmal eingebürgert. Der Name eines Arrays entspricht in den meisten Verwendungsfällen der Adresse des ersten Elements des Arrays.



  • Dieser Beitrag wurde gelöscht!

Anmelden zum Antworten