Negative Zahlen in einer Schleife



  • Hallo zusammen,
    ich möchte durch eine For-Schleife Werte für eine Funktion erhalten. Dabei sollen es die Zahlen von -15 bis +15 sein.

    for (int I = 0; I<16; I++)
     {
      ....(Funktion) 
     }
    

    Wenn ich nun "int I = -15" schreibe kommt eine Fehlermeldung, nämlich: "Listenindex überschreitet das Maximum (-15)"

    Was mache ich falsch. Ich habe bisher noch nicht mit negativen Zahlen in C++ gearbeitet und weiß daher nicht, wie ich damit umgehen muss.

    Vielen Dank
    lg, freakC++



  • Bitte poste den ganzen Quelltext, so wie es aussieht stimmt der Inhalt der Schleifenvariable, nur später erfolgt dann eine Anweisung, die die Meldung verursacht.



  • Hi,
    also es muss an einer StringGrid liegen, in der ich die Werte darstellen möchte. Wenn ich diese entferne, funktioniert das Programm.

    for (int I = -15; I<16; I++)
     {
       A[I] = 125 * I;
    
       StringGrid1->Cells[0][0] = "--------------------";
       StringGrid1->Cells[1][0] = "Wert für A";
       StringGrid1->Cells[0][I] = "Y = " + FloatToStr (I);
       StringGrid1->Cells[1][I] = FloatToStrF (A[I], ffNumber, 8, 2);
     }
    


  • Mir fällt gerade ein: Kann es sein, dass es keine negativen Zeilen bzw Spalten von einer StingGrid gibt? Wenn dies der Fehler ist, wie könnte man trotzdem die entsprechende Zeile/Spalte ansprechen?

    Vielen Dank
    lg, freakC++



  • Hallo,

    mit Ihrer ID 😕

    bei 0 gehts los ^^

    mfg, Micha!



  • I+15



  • Hi,
    auf die eigentlich simple Lösung bin ich dann auch gekommen 😃 . Trotzdem vielen Dank. Es gibt aber noch ein Problem. Ich arbeite mit einer anderen Funktion, die etwas komplizierter ist. Auch diese soll in einer Wertetabelle von -15 bis 15 dargestellt werden. Es muss eine Hyperbel herauskommen, d.h. die Werte der entsprechenden Zahlen sind gleich.

    Bsp. Wenn ich -1 und +1 einsetze kommt das gleiche heraus 😉

    for (int I = -15; I<16; I++)
     {
       R=15;
       A[I] = (CGM * R) / pow(pow(R, 2) + pow(I, 2), 0.75);
    
       StringGrid1->Cells[0][0] = "--------------------";
       StringGrid1->Cells[1][0] = "Wert für V";
       StringGrid1->Cells[0][I+15] = "Y = " + FloatToStr (I);
       StringGrid1->Cells[1][I+15] = FloatToStrF (A[I], ffNumber, 8, 2);
     }
    

    So sieht der Quelltext aus. Dabei ist es leider so, dass alle Werte von -15 bis 0 richtig sind, danach kommt aber voll der Müll heraus. CGM ist 587,88 und R ist 15.

    Wenn ich jedoch eine neue Anwendung mache und dort den Quelltext hineinschreibe, dann sind alle Wert von -4 bis 14 richtig. Der Rest ist falsch. Der Quelltext sieht sehr ähnlich aus:

    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      int A[30];
      int CGM = 587.88;
      int R = 15;
    
      for (int I = -15; I<16; I++)
     {
       R=15;
       A[I] = (CGM * R) / pow(pow(R, 2) + pow(I, 2), 0.75);
    
       StringGrid1->Cells[0][0] = "--------------------";
       StringGrid1->Cells[1][0] = "Wert für V";
       StringGrid1->Cells[0][I+15] = "Y = " + FloatToStr (I);
       StringGrid1->Cells[1][I+15] = FloatToStrF (A[I], ffNumber, 8, 2);
     }
    }
    

    Warum erhalte ich nur nicht die richtigen Werte??? 😕

    Vielen dank für euer Hilfe
    lg, freakC++



  • Ich hab noch ein bissl herumgespielt. CGM wird außerhalb der for-Schleife berechnet. Wenn ich diese Berechnung aber auch noch in die Schleife stecke, dann stimmen plötzlich die Ergebnisse. Warum ist das so 😕
    Das ist doch eigentlich egal, wann CGM berechnet wird!!

    lg, freakC++



  • Dein Array A besitzt die Elemente 0..29. Du greifst aber auf das Element A[-15] zu. Dadurch erzeugt Deine Anwendung undefiniertes Verhalten.



  • mmh...und wie vereinbart man ein Variablenfeld von -15 bis 15????



  • gar nicht.

    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      int A[30];
      int CGM = 587.88;
      int R = 15;
    
      for (int I = 0; I<30; I++)
     {
       R=15;
       A[I] = (CGM * R) / pow(pow(R, 2) + pow(I - 15, 2), 0.75);
    
       StringGrid1->Cells[0][0] = "--------------------";
       StringGrid1->Cells[1][0] = "Wert für V";
       StringGrid1->Cells[0][I+15] = "Y = " + FloatToStr (I - 15);
       StringGrid1->Cells[1][I+15] = FloatToStrF (A[I], ffNumber, 8, 2);
     }
    }
    

    BTW, Was machst Du mit pow(, 0.75)? Riecht ein bisschen nach ziehen von Wurzeln aus negativen Werten.



  • ich seh da keine Wurzeln aus negativen Zahlen! Das ist schon richtig so!!

    Vielen Dank für eure Hilfe

    lg, freakC++



  • void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    
      int CGM = 587.88;
    

    ISt int nicht ganzzahlig? Vielleicht solltest du mit double arbeiten. Also auch

    double A[30]
    

    mfg



  • freakC++ schrieb:

    ich seh da keine Wurzeln aus negativen Zahlen! Das ist schon richtig so!!

    Vielen Dank für eure Hilfe

    lg, freakC++

    und was ist das für I<15? 😡

    pow(I - 15, 2)
    


  • So, ne kleine Mathestunde:
    Wenn ich eine negative Zahl quadriere, dann kommt immer eine positive Zahl herus!! Daher kann in dieser Funktion keine negative Zahl herauskommen und daher kann ich einen reelen Exponenten nutzen!!!!!

    A[I] = (CGM * R) / pow(pow(R, 2) + pow(I - 15, 2), 0.75);

    So, ich hoffe, dass ihr verstanden habt, dass ich recht habe 😃 😃 😃
    lg, freakC++

    PS: Code Tags ham irgendwie net gefunzt!!!



  • freakC++ schrieb:

    PS: Code Tags ham irgendwie net gefunzt!!!

    Das liegt an den zusätzlichen Formatierungstags die du im Code hast.

    A[I] = (CGM * R) / pow(pow(R, 2) + pow(I - 15, 2), 0.75);
    

    bis bald
    akari



  • Entschuldigung, da habe ich wohl nicht richtig hingeschaut. 🙂
    Wenn ich ein pow sehe denke ich halt nicht an Quadrieren, da das ja der blanke Overkill ist.



  • freakC++ schrieb:

    So, ne kleine Mathestunde:
    Wenn ich eine negative Zahl quadriere, dann kommt immer eine positive Zahl herus!!

    Darum ging es doch gar nicht. pow(x,.75) heißt x^(3/4). Die Frage ist doch, ob die Summe der beiden Quadrate, die x bilden negativ wird. Wenn das der Fall ist, ermittelst Du das Kubik von x, welches dann ebenfalls negativ wäre und dann die 4. Wurzel aus dieser negativen Zahl... .
    Aber die Summe der beiden Quadrate wird nicht negativ, Braunstein hat wohl übersehen, dass ich die Schleifenvariable bei 0 und nicht bei -15 starten lasse, denn dann hätte er recht!



  • witte schrieb:

    Die Frage ist doch, ob die Summe der beiden Quadrate, die x bilden negativ wird.

    Hi,

    ich will mich ni einmischen, aber wie soll denn aus zwei positiven Werten - die zwangsläufig positiv sind wenn der negative Wert quadriert wird - was negatives werden? 😕

    mfg, Micha!



  • Yep, das stimmt. OMG, ich brauche Urlaub!


Anmelden zum Antworten