Probleme bei einlesen von arrays über Console



  • ...und jetzt kannst du anfangen, Funktionen zu verwenden. Ein guter Anhaltspunkt sind übrigens deine eigenen Kommentare. Immer dann, wenn du mit einem Kommentat einen Block beschreibst, sollte dieser Block wohl eine Funktion sein.

    Beispiele:

    1. Zeile 25 bis 34: Dein Kommentar: /*Feld a und b einzeln aufgelistet, damit man die Zahlen einzeln eintippen kann*/
      Du machst 2x das gleiche, nämlich in einer Schleife über ein Array loopen und ausgeben/einlesen. Als Funktion könntest du hier eine allgemeine Funktion zum Einlesen von n Zahlen in EIN Array erstellen udn diese dann für a und b aufrufen.

    2. Zeilen 36-41: /*Feld a in Feld c einfügen*/ - also als allgemeine Funktion vielleicht "ein Feld in ein anderes einfügen"? Allgemein sollten deine Variablen nur einen kleinen Gültigkeitsbereich haben, hier z.B. ai. Die sollte nur hier verfügbar sein, nicht global. (und wozu brauchst du cpr?)

    3. Dann hast du "Feld ausgeben" in Zeile 51 bis 60 und 77 bis 86. Das ist doch 2x das gleiche, nur mit anderen Daten! Also eine Funktion machen und die dann an den beiden Stellen aufrufen.

    4. Und Sortieren in Zeile 64 bis 76 ist doch auch eindeutig eine Funktion.



  • @wob Danke dir für deine ausführliche Hilfe. In meinen neuen Skripten steht etwas über Funktionen und bis jetzt bin ich noch nicht dahinter gestiegen. Ich habe nur gesehen, dass das etwas mit Rückgabewerten und Parametern zu tun hat wie z.B. void bezeichnung (int k) --> das wäre jetzt meines Wissens nach ein Parameter ohne Rückgabewert. Was das genau bedeutet, weiß ich leider noch nicht.



  • @Ravensouth sagte in Probleme bei einlesen von arrays über Console:

    Was das genau bedeutet, weiß ich leider noch nicht.

    Warum nicht? Du kennst doch sicher z.B. trigonometrishe Funktionen wie Sinus. Was machen die? Was sind Parameter, was geben sie zurück? Kannst du das abstrahieren?



  • Hallo @Ravensouth ,
    Eine Funktion (siehe auch Methode) ist so etwas wie ein kleines Unterprogramm. Du vergibst einen sprechenden Namen, wie addiereGanzzahlen, und damit die Funktion weiß, welche Werte sie addieren soll übergibst Du der Funktion addiereGanzzahlen zwei Werte (wert1 und wert2) als Parameter.

    Sieht jetzt schon mal so aus:

    addiereGanzzahlen( int wert1, int wert2);
    

    Voila, jetzt brauchen wir nur noch das Ganzzahl-Ergebnis, das kennzeichnen wir, indem wir den Rückgabetyp davor schreiben…

    int addiereGanzzahlen( int wert1, int wert2);
    

    Jetzt noch die Ausführung definieren (ein bisschen komplexer zum Verständnis)…

    int addiereGanzzahlen( int wert1, int wert2)
    {
      int  retVal = wert1 + wert2; // hier wird addiert und die Summe einer Variablen zugewiesen
      return retVal;  // hier wird der Wert zurückgeliefert
    };
    
    

    Jetzt nutzen wir unsere kleine Funktion:

    ...
    int  meinZuBerechnenderWert = addiereGanzzahlen( 123, 456 );
    ...
    

    meinZuBerechnenderWert sollte jetzt den Wert 579 haben.
    Funktionen, die keinen Rückgabewert liefern sollen, werden mit dem Schlüsselwort void eingeleitet.

    void tuWasOhneWasZuLiefern( … );
    

    Zum Anfang sollte das reichen, ansonsten gibt’s da noch ne Menge nachzulesen.



  • @Mechanics Sowas hatten wir im Abitur. Kommt sicherlich im Studium auch noch dran. Habe sowieso das Gefühl, als würde sich Mathe und Informatik bei uns jetzt ziemlich stark überschneiden wie sonst nie zuvor.



  • @Helmut-Jakoby Ach so. Jetzt verstehe ich wie man die Funktion in der Praxis anwendet. Ein sehr gutes Beispiel. Danke dir 🙂



  • @hustbaer
    Man nutzt überhaupt niemals scanf.
    Man nutzt fgets+sscanf.
    Das funktioniert dann auch in stdin redirections via commandline-Pipe und auch für beliebig viele (vorher unbekannte Anzahl von - alledings gleichtypisierten) Inputs.



  • @Ravensouth sagte in Probleme bei einlesen von arrays über Console:

    Ich habe nmax begrenzt,

    Mache aus "int nmax=40" ein enum { NMAX=40 };
    dann sind deine Arrays keine VLA, und dein Code nähert sich etwas einer professionellen Programmierung.

    Nutze in deinen for-Schleifen für i die initial declaration, also

    for(int i=0;...;...)
    

  • Mod

    @Wutz sagte in Probleme bei einlesen von arrays über Console:

    @hustbaer
    Man nutzt überhaupt niemals scanf.
    Man nutzt fgets+sscanf.
    Das funktioniert dann auch in stdin redirections via commandline-Pipe und auch für beliebig viele (vorher unbekannte Anzahl von - alledings gleichtypisierten) Inputs.

    Was soll denn da bitte der Zusammenhang sein?



  • @SeppJ
    fgets kümmert sich um Newlines & Co, und sscanf kümmert sich um die eigentliche Aufgabe.
    sscanf arbeitet auf dem char-Stream, und somit sauber getrennt vom Inputverfahren.


  • Mod

    Was soll das mit Pipes zu tun haben?

    edit: Beitrag auf das wesentliche beschränkt und Nebendiskussionen entfernt.


Anmelden zum Antworten