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



  • #include <stdio.h>
    
    // void main() laut Standard:
    
    int main( )
    {
    
        /* Variablen definieren */
        // Du definierst hier nicht, sondern deklarierst bloß.
    
        int anzahl;
    
        // zur Fehlerprüfung:
        int result;
        char ch;
    
        float summe, mittelwert, laufzahl;
    
        summe = 0;
        // anzahl = 0;
        anzahl = 1;
        mittelwert = 0;
    
        do {
    
            // Fehlerprüfung ist nie schlecht...
            do {
    
                printf( "\n\nBitte geben Sie eine Zahl ein [negative Zahl bricht ab]: " );
                result = scanf( "%f", &laufzahl );
    
                // Übriggebliebene Zeichen aus stdin entfernen:
                while( ( ( ch = getchar( ) ) != EOF ) && ( ch != '\n' ) )
                    ;
    
            } while( result != 1 );
    
            // bei der Eingabe einer negativen Zahl soll doch die Berechnung nicht mehr
            // durchgeführt werden, oder?
            // also:
    
            if( laufzahl >= 0 ) {
    
                // vorher summe berechnen!
                summe += laufzahl;
    
                mittelwert = summe / ( ( float ) anzahl++ );
                ++anzahl;
    
                printf( "\nEingegeben: %0.3f. Mittelwert: %0.3f", laufzahl, mittelwert );
            }
    
        } while( laufzahl >= 0 );
    
        printf( "\n\nProgrammende!" );
    
        // getch(); ist nicht in <stdio.h> und auch kein ANSI-C!
    
        getchar( );
    }
    

    Greetz, Swordfish



  • Swordfish schrieb:

    /* Variablen definieren */
        // Du definierst hier nicht, sondern deklarierst bloß.
    

    beides würd' ich sagen...



  • @Swordfish:

    Sorry, aber so weit bin ich leider noch nicht, um deinen Code so interpretieren zu können, dass ich weiß, welchen Zweck jetzt deine eingestzten Codeschnipsel da haben, trotzdem Danke für die MÜhe, die Du dir gemacht hast.

    Ich mache gerade ein Tutorial durch und da ist es eben die Aufgabe so ein spezielles Script zu erstellen mit den Mitteln, die man selber schon kennt. Naja, mal weiter probieren.

    Doch eine Allgemeine Frage hätte ich da noch:

    Warum initialisiert man eigetnlich Variablen gleich am Anfang mit "= 0"?
    Wenn man dies nicht tun würde, stehen diese Variablen doch am Anfang auch = 0 oder wie wird sonst eine einfachdastehende Variable ohne Initialisierung vom Compiler interpretiert?



  • Auto-Variablen werden nicht automatisch initialisiert. Globale und statische Variablen dagegen schon. Siehe Speicherklassen in einem Buch/Tutorial deiner Wahl.

    Edit: das heisst:

    int a;
    
    int main(void){
        static int b;
        int c;
    
        // hier sind a und b sicher mit 0 initialisiert
        // c hat aber einen "zufälligen Wert
    
    }
    


  • RollingStones schrieb:

    Sorry, aber so weit bin ich leider noch nicht, um deinen Code so interpretieren zu können, dass ich weiß, welchen Zweck jetzt deine eingestzten Codeschnipsel da haben, trotzdem Danke für die MÜhe, die Du dir gemacht hast.

    Nun, du könntest meinen Code nach deinem Gutdünken mit Kommentaren versehen und zu unverständlichen Stellen Fragen stellen...

    Greetz, Swordfish



  • Hm..also die größten Probleme habe ich immer mit den Schleifen...

    Nehmen wir mal folgendes Beispiel an:

    /* variablendefintion etc... */
    
    /* dann kommt hier die erste schleife: */
    
    /* Die sachen, die nun hier unten stehen...werden die erst ausgeführt, wenn die schleife beendet wurde oder werden die sowieso "Zeitgleich" mit der schleife ausgeführt?
    


  • wenn es nicht mehr im schleifenrumpf steht, dann wird es nach beendigung ausgefuehrt...

    for(i = 0; i <= 5; i++)
         printf("Hallo");
    
    printf("Dies ist ein Test");
    

    hier wird dann zunaechst 6 mal 'Hallo' ausgegeben und dann 'Dies ist ein Test'



  • Moh schrieb:

    wenn es nicht mehr im schleifenrumpf steht, dann wird es nach beendigung ausgefuehrt...

    for(i = 0; i <= 5; i++)
         printf("Hallo");
    
    printf("Dies ist ein Test");
    

    hier wird dann zunaechst 6 mal 'Hallo' ausgegeben und dann 'Dies ist ein Test'

    OK, verstanden, hatte ich mir auch schon gedacht, dass das so abläuft. Aber spielt es denn jetzt eigentlich eine ROlle, in welcher Reihfenfolge allgemein der Code geschrieben ist?
    Also andersrum gesagt: Liest der Compiler bzw. der Computer den Quelltext in C generell von oben nach unten und sorum ist dann auch der Ablauf (von oben nach unten), in dem die Befehle ausgeführt werden??



  • immer von oben nach unten... 🙂

    wie auch sonst, es muss ja auch ein logisches vorgehen geben



  • RollingStones schrieb:

    Also andersrum gesagt: Liest der Compiler bzw. der Computer den Quelltext in C generell von oben nach unten und sorum ist dann auch der Ablauf (von oben nach unten), in dem die Befehle ausgeführt werden??

    das liegt wohl daran, dass die erfinder solcher programmiersprachen gewohnt waren texte von links nach rechts und von oben nach unten zu lesen. wie die meisten computer was damit anfangen steht da: http://www.weihenstephan.de/dvs/scripten/edv1/einteilung5.pdf (die ersten beiden seiten)



  • 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


Anmelden zum Antworten