*Edit by RS - Wenn ich mal wieder mit meinem Latein am Ende bin.. ;-)



  • OK, dann nehmen wir mal folgendes BEispiel an:

    /* variablendefintion etc... */
    
    /* ... ... ... ... */
    
    /* ... ... ... ... */
    
    [b]/* dann kommt hier die erste schleife: */[/b]
    

    Ist nun die Sortierung des Codes vor der Schleife irrelevant, da sowieso erstmal alle Befelhle bis zur Schleife sicher ausgeführt werden oder nicht?



  • Wenn man von Schleifen, Funktionsaufrufen und Verzweigungen (und goto's) absieht, wird dein Programm von oben nach unten abgearbeitet - da ist die Reihenfolge schon wichtig. Nur wenn zwei Anweisungen keinen Bezug zueinander nehmen, kannst du sie eventuell austauschen.

    Beispiel gefällig?

    int i,j;
    i=100;
    j=i+1;
    //Ergebnis: i=100, j=101
    
    int i,j;
    j=i+1;
    i=100;
    //Ergebnis: i=100, j ist undefiniert
    

    (PS: In welcher Reihenfolge du deine Funktionen definierst, ist übrigens egal - solange du sicherstellst, daß die verwendeten Unterfunktionen bekannt sind)



  • CStoll schrieb:

    Wenn man von Schleifen, Funktionsaufrufen und Verzweigungen (und goto's) absieht, wird dein Programm von oben nach unten abgearbeitet - da ist die Reihenfolge schon wichtig. Nur wenn zwei Anweisungen keinen Bezug zueinander nehmen, kannst du sie eventuell austauschen.

    Beispiel gefällig?

    int i,j;
    i=100;
    j=i+1;
    //Ergebnis: i=100, j=101
    
    int i,j;
    j=i+1;
    i=100;
    //Ergebnis: i=100, j ist undefiniert
    

    (PS: In welcher Reihenfolge du deine Funktionen definierst, ist übrigens egal - solange du sicherstellst, daß die verwendeten Unterfunktionen bekannt sind)

    Danke, verstanden, super Beispiel.



  • Hm...neue Frage...

    wie kann ich denn eine Bedingung erstellen, die dem Nutzer verbietet, in einer Variable, die mit int deklariert wurde, bei dem Einlesen eine float-Zahl hineinzuschreiben?

    Also Beispiel:

    int auswahl;
    
    printf("Bitte Auswahl eingeben: ");
    scanf("%i", &auswahl);
    

    Ich möchte diese Bedingung irgendwie in eine Schleife miteinbinden..

    zZ. habe ich nur folgende Bedingung geknüpft:
    ((auswahl <= 0) || (auswahl > 4))

    Jetzt brauche ich wie gesagt noch die Bedingung von dem oben geschriebene..

    gruss RS



  • %i heisst, es wird ein int gelesen und der rest bleibt im eingabepuffer.



  • c.rackwitz schrieb:

    %i heisst, es wird ein int gelesen und der rest bleibt im eingabepuffer.

    Hm...wenn es doch nur so wäre... also nochmal zur Erinnerung..ich habe 4 auswahlmöglichkeiten eingestellt und die dann mit der case-methode eingestellt..mit 4 verschiedenen folgen..

    wenn ich in diese Variable zB. "4.55" eingebe, wird die 4 gewertet und die zwei 5-er werden schon mit in die nächste Schleife genommen...

    wenn ich in diese Variable zB. "5.55" eingebe, wird gar nichts gewertet und das Programm wird "unbrauchbar", da die Zeile in der Schleife immer wieder wiederholt wird, undzwar in einem riesen Tempo...

    Achja, dann nochwas:

    Ich möchte eine Rechnung mit Klammern durchführen, also zB. 2* (3+6).

    Wie erstelle ich die Klammern in c, ohne dass der Compiler diese als normale abgerundete Klammern interpretiert? 😕



  • wenn im buffer kein int ist, also nur ein ".55", gibt scanf irgendeinen fehlerwert zurueck und weiter gehts -> endlosschleife in deinem fall



  • c.rackwitz schrieb:

    wenn im buffer kein int ist, also nur ein ".55", gibt scanf irgendeinen fehlerwert zurueck und weiter gehts -> endlosschleife in deinem fall

    Hm, gut. Und was kann ich dagegen machen?

    und dann wie gesagt noch das Problem mit den Klammern in Rechnungen..?



  • "klammern in rechnungen": such mal nach compilerbau, tokenisieren, lexen, parsen. effektiv willst du die eingabe zerlegen in: zahlen, operatoren (evtl variablen). waehrend du das machst, kannst du gleich den baum draus machen (kannst du aber auch nach dem tokenisieren machen). auf den baum wendest du dann alles weitere an.

    den eingabepuffer loeschst du NICHT MIT FFLUSH!!, sondern mit dem da:

    int c;
    while ((c = getchar()) != EOF && c != '\n');



  • BTW: scanf( ) gibt die Anzahl der korrekt gelesenen Felder und im Fehlerfall EOF zurück:

    #include <stdio.h>
    
    int main( )
    {
        int number, ch;
    
        while( scanf( "%i", &number ) != 1 ) {
    
            while( ( ( ch = getchar( ) ) != EOF ) && ( ch != '\n' ) )
                ;
        }
    
        printf( "Sie haben %i eingegeben\n", number );
    }
    

    Da kann man aber immer noch zB. 2.12 eingeben.

    Greetz, Swordfish



  • c.rackwitz schrieb:

    "klammern in rechnungen": such mal nach compilerbau, tokenisieren, lexen, parsen. effektiv willst du die eingabe zerlegen in: zahlen, operatoren (evtl variablen). waehrend du das machst, kannst du gleich den baum draus machen (kannst du aber auch nach dem tokenisieren machen). auf den baum wendest du dann alles weitere an.

    den eingabepuffer loeschst du NICHT MIT FFLUSH!!, sondern mit dem da:

    int c;
    while ((c = getchar()) != EOF && c != '\n');

    Gut, das Problem hätten wir dann schonmal gelöst, danke.

    Und wie siehts jetzt aus mit den Klammern?

    Ich habe nach deinen vorgeggeben Begriffen per google gesucht, aber auf das richtige bin ich nicht gestoßen.
    Muss man da nicht einfach so ein \ oder / vor die Klammern setzen, damit der Compiler diese als Bestandteil der Rechnung interpretiert? 😕



  • RollingStones schrieb:

    Muss man da nicht einfach so ein \ oder / vor die Klammern setzen, damit der Compiler diese als Bestandteil der Rechnung interpretiert? 😕

    Gegenfrage: Was genau hast du vor?

    In einer normalen Rechnung wie "m = (a+b)/2;" gehört die Klammer zur Rechnung und dient dazu, die Operationen umzuordnen (ohne Klammern erhältst du "m=a+b/2;", was wegen der bekannten Vorrangregeln (Punkt vor Strich) etwas anderes liefert als den Mittelwert).



  • CStoll schrieb:

    RollingStones schrieb:

    Muss man da nicht einfach so ein \ oder / vor die Klammern setzen, damit der Compiler diese als Bestandteil der Rechnung interpretiert? 😕

    Gegenfrage: Was genau hast du vor?

    In einer normalen Rechnung wie "m = (a+b)/2;" gehört die Klammer zur Rechnung und dient dazu, die Operationen umzuordnen (ohne Klammern erhältst du "m=a+b/2;", was wegen der bekannten Vorrangregeln (Punkt vor Strich) etwas anderes liefert als den Mittelwert).

    also ich möchte folgende Rechnung erstmal vollziehen:

    ergebnisvier = (laengevier * breitevier + laengevier * hoehevier + breitevier * hoehevier) * 2

    außerhalb einer print-Anweisung beispielsweise sieht das ja einfach folgendermaßen aus:

    ergebnisvier = (laengevier * breitevier + laengevier * hoehevier + breitevier * hoehevier) * 2;
    

    wenn ich diese Sache aber in einer print-Anweisung machen will, kann ich das ja nicht wegen den Klammern machen wegen den Klammern von der Printf-Anweisung!

    printf(" [b]([/b]ergebnisvier = (laengevier * breitevier + laengevier * hoehevier + breitevier * hoehevier[b])[/b] * 2");
    

    Geht ja so nicht!



  • Bist du dir überhaupt klar, was du damit erreichst? die printf()-Anweisung dort gibt deine Rechenvorschrift so auf den Monitor aus, wie sie da steht. Wenn du das Ergebnis der Berechnung ausgeben willst, sieht das etwas anders aus:

    ergebnisvier = (laengevier * breitevier + laengevier * hoehevier + breitevier * hoehevier) * 2;
    printf("Die Lösung ist %d\n",ergebnisvier);
    

    das %d wird von man: printf(3) durch den Wert von ergebnisvier ersetzt (und das \n am Ende entspricht einem Zeilenumsprung).



  • Jo, so habe ich es auch schon gemacht in meinem Code.

    Das printf war jetztauch ein schlechtes Beispiel, da es wirklich nicht viel bringen würde...vielleicht in Ausnahmefällen...
    aber trotzdem..wie würde man das machen, dass diese Rechenvorschrift mit den Klammern in der print-Anweisung steht?



  • Zum Beispiel so - die Formel wird direkt berechnet und ausgegeben:

    printf("Die Lösung ist %d\n",(l4 * b4 + l4 * h4 + b4 * h4) * 2);
    


  • @RollingStones:
    wie waere es wenn du dir ein ordentliches buch ueber c programmierung kaufst, bevor wir dir hier alles vorkauen?!


Anmelden zum Antworten