maximo Fragestunde



  • Hi zusammen

    Ich wollt nur fragen, ob mir das jemand erklären kann, da ich es im Buch keine Erklärung finden kann.
    Speziell meine ich:

    if (array[i] > array[y])
             y = i;
    

    Ich habe die for-Schleifen nicht gehabt, da ich von Anfang bis zum Ende lese, trotzdem glaube ich zu verstehen, was eine for-Schleife tut.
    Wie kommt am Ende der y Wert zur Stande?

    Hier der ganze Code:

    int main (void)
    {
       int array[3];
       int i;
       int y = 0;
    
       printf ("Bitte 3 Werte eingeben, getrennt durch Leerzeichen:\n");
       scanf ("%d %d %d", &array[0], &array[1], &array[2]);
    
       for (i = 1; i < 3; i++)
          if (array[i] > array[y])
             y = i;
    
       printf ("Der hoechste Wert war die Nr. %d mit dem Wert %d.\n",
                y + 1, array[y]);
    
       return 0;
    }
    

    Ansonsten dachte ich mir, ich mach nur ein Thread auf und werde dort Fragen stellen, wenn es okay ist?

    Viele Grüße



  • y wird oben mit 0 initialisiert und dann bei jedem schleifendurchlauf, wo die if zutrifft auf den wert gesetzt, den i zu dieser zeit hat.


  • Mod

    tkausl schrieb:

    y wird oben mit 0 initialisiert

    Was übrigens etwas zu kurz gedacht ist, wenn der Datentyp des Feldes (signed) int ist.



  • maximo schrieb:

    Wie kommt am Ende der y Wert zur Stande?

    In y merkst du dir den Index, an dem das größte Element im Array ist.
    Mit der for-Schleife gehst du über (fast) alle Element des Arrays und vergleichst sie mit dem Element mit dem Index y.
    Wenn das Element an der Stelle i größer ist, als das an der Stelle y, wird in y der Wert vom aktuellen i (der Index) gemerkt.

    Und 0 als Startwert für y ist gut, da du so schon einen gültigen Wert hast (ich meine den Inhalt von array[0]).
    Du brauchst dir keine Gedanken machen, was der kleinste mögliche Wert ist, der im Array vorkommt.



  • SeppJ schrieb:

    tkausl schrieb:

    y wird oben mit 0 initialisiert

    Was übrigens etwas zu kurz gedacht ist, wenn der Datentyp des Feldes (signed) int ist.

    Ouch. Aber Du hättst mich fast drangekriegt 😃



  • Ich habe das noch nicht ganz zu 100% verstanden, deshalb eine einfache Frage: Woher weiß das Programm, welcher Wert der höchste ist?
    daran dass i > y ist??

    Je längere und detaillierte Erklärung, desto besser kann ich es verstehen.
    Weil gerade irgendwie, habe ich n "Brett vorm Gesicht".

    Vielen Dank für die Hilfe!


  • Mod

    Ein kleines bisschen Eigeninitiative darf's schon sein. Hast du den Code überhaupt je angeguckt? Wie kommst du zum Beispiel auf die Idee, dass i > y wäre?

    maximo schrieb:

    daran dass i > y ist??

    Was für eine Bedeutung haben deiner Meinung nach überhaupt dieses i und dieses y?



  • Hast du den Code überhaupt je angeguckt?

    Mehrfach.

    Was für eine Bedeutung haben deiner Meinung nach überhaupt dieses i und dieses y?

    Eins weiß ich i steht für die Elemente und die auch per for Schleife "ausgewählt" werden.
    y ist dann für den höchsten Wert?

    Ich versteh das ganze schon, nur das was eben hinter dem i bzw. y steht und wie das abgearbeitet wird, da komme ich noch nicht dahinter.

    Ja, meine Frage ist eben, was das für eine Bedeutung hat, wenn man einfach ... macht:

    if (array[i] > array[y])
    

    Vielleicht habt ihr es schon beantwortet und ich versteh es immer noch nicht?
    Das Problem ist ja, dass im Buch eher auf die einzelnen Sachen eingegangen wird, aber nicht erklärt wird, wie man auf so etwas kommt oder welche Bedeutung es hat.
    Ich versteh natürlich die ganze Bedeutung von dem Ausdruck, nur mir will es nicht "erscheinen", welchen Zweck das auf die eingegebenen Nummern hat.



  • i und y stellen beides Positionen (= Indizes) im Array dar.
    Und durch die Schleife und den Vergleich wird jeweils der an Position i stehende Wert mit dem bisher größten Wert (der an Position y steht) verglichen.
    Und nach der Schleife steht dann eben in y die Position des größten Werts des Arrays (Edit: sofern wie SeppJ schon geschrieben hat, nur positive Werte im Array stehen).



  • Du hast entweder das falsche buch oder einfach nichts verstanden.

    Wenn du weißt was a[b] ist und was if(a < b) ist, musst du das nurnoch kombinieren...



  • maximo l schrieb:

    Ja, meine Frage ist eben, was das für eine Bedeutung hat, wenn man einfach ... macht:

    if (array[i] > array[y])
    

    Du vergleichst zwei Elemente von dem Array array.
    Wenn das Element mit dem Index i größer ist als das mit dem Index y, ist die Bedingung für das if wahr.
    i und y sind int-Variablen, die (bei dir) Werte von 0 bis 2 annehmen.

    Th69 schrieb:

    Und nach der Schleife steht dann eben in y die Position des größten Werts des Arrays (sofern wie SeppJ schon geschrieben hat, nur positive Werte im Array stehen).

    Ich glaub ich bin zu blöd dafür. Was hat der Startwert vom Index mit dem Wertebereich des Arrays zu tun?

    tkausl schrieb:

    Wenn du weißt was a[b] ist und was if(a < b) ist, musst du das nurnoch kombinieren...

    Gegenüber einem Anfänger sind die Bezeichner (nur a und b) aber sehr unglücklich gewählt.


  • Mod

    DirkB schrieb:

    Th69 schrieb:

    Und nach der Schleife steht dann eben in y die Position des größten Werts des Arrays (sofern wie SeppJ schon geschrieben hat, nur positive Werte im Array stehen).

    Ich glaub ich bin zu blöd dafür. Was hat der Startwert vom Index mit dem Wertebereich des Arrays zu tun?

    Nein, nicht du bist zu blöd, sondern ich bin auf Autopilot gefahren: Maximumsfrage? Check. Startwert 0? Check. -> Kommentar über Startwert abgeben, ohne Code genau anzugucken.



  • Es war ja auch sehr früh (oder spät).

    Es sind aber noch andere alte Hasen darauf rein gefallen. 😮

    ^Ich hatte das extra nicht zitiert, damit du das ohne Nebenwirkungen löschen kannst.^


  • Mod

    DirkB schrieb:

    ^Ich hatte das extra nicht zitiert, damit du das ohne Nebenwirkungen löschen kannst.^

    Sehr löblich, aber ich stehe zu solchen Dingen (natürlich nur, wenn es schon jemand gesehen hat und ich nicht erwarten kann, mich mit einer schnellen Löschung aus der Affäre ziehen zu können 😃 )



  • Gegenüber einem Anfänger sind die Bezeichner (nur a und b) aber sehr unglücklich gewählt.

    Auch wenn ich ein Anfänger bin, habe ich doch sofort, naja 3 Sekunden danach, gewusst was er meinte.

    Okay, ja, am Anfang habe ich echt übersehen, dass y = 0 ist, trotzdem hat mich das nur ein Stück weiter gebracht, aber nicht annähernd an das Ziel.

    Da habe ich was nicht mitgekriegt? 😋

    Letzte Frage, da ich einfach aufgebe und hoffe, dass ich das irgendwann in Zukunft kapiere diese Sachen zu kombinieren:
    Wieso macht man da das?
    y = i;

    Wenn ihr genauso frustrierend seid, dann habe ich was anderes, ganz leichtes, also für mich.
    In dem Buch ist es manchmal so manchmal so, deshalb hoffe auf eure Hilfe, weil ich mich vom Autor verarscht fühle.

    Ist das eine Definition?
    int var = 10;

    Ist das Initialisierung?
    int var;

    Ansonsten besten Dank für die mühevolle Hilfe!



  • // Ich geb auf. Bin zu blöd.


  • Mod

    Swordfish schrieb:

    maximo schrieb:

    Ist das eine Definition?
    int var = 10;

    Ist das Initialisierung?
    int var;

    Ersteres ist eine Definition (Deklaration mit gleichzeitiger Initialisierung), zweiteres eine reine Deklaration.

    Nein, das sind beides Definitionen. Die Trennung der Begriffe "Deklaration" und "Definition" hat nichts mit Initialisierung zu tun.

    extern int var;
    

    wäre eine Deklaration. Eine Deklaration ist eine reine Bekanntmachung eines Begriffs, ohne genaue Angabe, was genau dahinter steckt (wobei bei dem extern-Beispiel nicht viel fehlt: Das einzige was man nicht über var weiß ist, wo var lebt. Und wenn man mittels int var; das var definiert, dann ist die Antwort, wo es lebt, einfach "hier!"). Andere (bessere) Beispiele für Deklarationen sind:

    struct foo;
    
    void bar(int i);
    

    Definitionen geben hingegen genau die Eigenschaften eines Begriffs an. Beispiele für Definitionen, die zu den obigen Deklarationen passen, sind:

    struct foo
    {
      int i;
      double d;
    };
    
    void bar(int i)
    {
      printf("%i" ,i);
    }
    

    Bessere Erklärung, als ich das aus dem Stand kann:
    http://www.cprogramming.com/declare_vs_define.html

    for( /* init expression */ int i = 0;
         /* cond expression */ i < 10;
         /* loop expression */ ++i )
    {  // ------------------------------+
        std::cout << i << '\n';  //     +->  loop body
    }  // ------------------------------+
    

    C-Forum, nicht C++.



  • SeppJ schrieb:

    Die Trennung der Begriffe "Deklaration" und "Definition" hat nichts mit Initialisierung zu tun.

    Ja, natürlich recht du hast. Spät schon ist.

    SeppJ schrieb:

    C-Forum, nicht C++.

    Fixed.


  • Mod

    Swordfish schrieb:

    SeppJ schrieb:

    C-Forum, nicht C++.

    Fixed.

    Du hast noch mehr von der Art in deinem Beitrag, was nur in C++ geht. Und einiges, was nur in C99 geht.



  • fixed. finally. 😞


Anmelden zum Antworten