kleines Problem mit logischen Bitoperatoren in If



  • ich initalisiere doch minimum oben oder nicht?



  • Rammsteiner schrieb:

    ich initalisiere doch minimum oben oder nicht?

    Wo hast du eine Zuweisung ( minimum = ) vor der ersten Abfrage ( eingabe<=minimum ) von minimum?



  • ich erkenne das problem, aber wie könnte man sowas programmtechnisch lösen? Ich mein ich kann ja schlecht sagen am anfang des programms minimum = eingabe oder so ... steh gerade irgendwie auf dem schlauch ..



  • maximum hast du ja auch initialisiert.

    Am besten ist es du setzt nach der ersten (und nur bei der ersten) Eingabe sowohl maximum als auch minimum auf eingabe .



  • danke, ich habe es nun folgendermaßen gelöst:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    main(void){
    
    int eingabe;
    float durchschnitt, summe=0, minimum=0, maximum=0, anzahleingaben=0;
    
        do{
    
            printf("Bitte geben sie Ganzzahlen ein. (Die Eingabe wird mit 0 beendet):");
            scanf("%i",&eingabe);
    
            fflush(stdin);
    
                if(anzahleingaben==0){
                    maximum=eingabe;
                    minimum=eingabe;
                    }
    
            anzahleingaben++;
            summe=summe+eingabe;
    
            if(eingabe>maximum)
                maximum=eingabe;
    
            else if(eingabe<=minimum && eingabe != 0)
                minimum=eingabe;
    
            }while(eingabe!=0);
    
    durchschnitt = summe / (anzahleingaben-1);
    
    printf("\n%.0f \t\t= Maximum\n", maximum);
    printf("%.0f \t\t= Minimum\n", minimum);
    printf("%.0f \t\t= Anzahl der Eingaben\n", (anzahleingaben-1));
    printf("%.0f \t\t= Summe\n", summe);
    printf("%.2f \t\t= Durchschnitt\n", durchschnitt);
    }
    


  • Warum hast du eigentlich summe, minimum, maximum und anzahleingaben als float und eingabe als int ?

    maximum, minimum und summe können doch nur vom gleichen Typ wie eingabe sein.
    anzahleingaben geht nur ganzzaglig und nur positiv. Also unsigned

    Und float nimmt man nur noch, wenn man sehr große Arrays davon hat.
    double ist die Wahl für Fließkommazahlen.



  • jetz sieht es folgendermaßen aus:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    main(void){
    
    unsigned int anzahleingaben=0;
    double eingabe, durchschnitt, summe=0, minimum=0, maximum=0;
    
        do{
    
            printf("Bitte geben sie Ganzzahlen ein. (Die Eingabe wird mit 0 beendet):");
            scanf("%lf",&eingabe);
    
            fflush(stdin);
    
                if(anzahleingaben==0){
                    maximum=eingabe;
                    minimum=eingabe;
                    }
    
            anzahleingaben++;
            summe=summe+eingabe;
    
            if(eingabe>maximum)
                maximum=eingabe;
    
            else if(eingabe<=minimum && eingabe != 0)
                minimum=eingabe;
    
            }while(eingabe!=0);
    
    durchschnitt = summe / (anzahleingaben-1);
    
    printf("\n%.0lf \t\t= Maximum\n", maximum);
    printf("%.0lf \t\t= Minimum\n", minimum);
    printf("%u \t\t= Anzahl der Eingaben\n", (anzahleingaben-1));
    printf("%.0lf \t\t= Summe\n", summe);
    printf("%.2lf \t\t= Durchschnitt\n", durchschnitt);
    }
    


  • Schon mal als erstes eine 0 eingegeben?



  • Was sollen "logische Bitoperatoren" sein?
    Also entweder Logik- oder Bitoperator.
    Du testest Fließkommazahlen auf Gleichheit, das ist Anfängerschrott.
    scanf liefert einen Rückgabewert, genau diesen kannst du für deinen Anwendungsfall sehr einfach nutzen und nicht am Ergebniswert "eingabe" rumrätseln, was der Anwender wohl eingetippt hat.



  • Wutz schrieb:

    Was sollen "logische Bitoperatoren" sein?

    &, |, ^ und ~, im Gegensatz zu << und >>, würde ich darunter verstehen. (Trotzdem unglücklich bezeichnet.)

    Du testest Fließkommazahlen auf Gleichheit, das ist Anfängerschrott.

    Wenn Eingabe von 0 die Schleife beenden soll, dann ist das genau das richtige. 0.00000000000000001 soll die Schleife nicht beenden. Reflexhaft überall Vergleiche zu vermeiden, das ist Anfängerschrott.



  • wenn ich am anfang eine null eingebe, wird das programm einfach beendet. Die ausgaben stimmen alle bis auf der durchschnitt ... da wird dann irgendein "blödsinn" ausgespuckt. Es handelt sich bei diesem Programm um eine alte Tafelübung vom prof, ich denke wenn sowas in der Klausur rangekommen wäre, hätte ich nicht komplett versagt, mir is es in der regel "egal" was anfängerschrott ist und was nicht. Ich habe respekt vor informatikern und vor denen die c programmieren können bzw. im allgemeinen programmieren können.

    Ich lerne c weil ich es muss, nicht weil es mir spaß macht, wobei ich gestehen muss, dass es anfängt spaß zu machen, wenn man erfolge sieht.

    Ich muss mich an gewissen stellen einfach an die vorgaben vom prof halten. Wenn in seinem skript steht, dass er hinter jedem scanf(); ein fflush(stdin); haben will muss ich das auch akzeptieren, auch wenn die letzten tage mir gezeigt haben, das dieser befehl alles andere macht als den tastaturpuffer zu leeren ..



  • Rammsteiner schrieb:

    wenn ich am anfang eine null eingebe, wird das programm einfach beendet. Die ausgaben stimmen alle bis auf der durchschnitt ... da wird dann irgendein "blödsinn" ausgespuckt.

    Du willst in diesem Fall ja auch 0.0 / 0 berechnen.



  • hmm in mathe hab ich mal gelernt das ein teilen durch null nicht definiert ist. weiß sowas c ?



  • Das ist deine Sache als Programmierer darauf zu achten, dass das nicht passiert.

    ~(Darum auch die Auforderung gleich eine 0 einzugeben)~



  • ok, danke 🙂



  • Bashar schrieb:

    Wenn Eingabe von 0 die Schleife beenden soll, dann ist das genau das richtige. 0.00000000000000001 soll die Schleife nicht beenden. Reflexhaft überall Vergleiche zu vermeiden, das ist Anfängerschrott.

    Soso.
    Ich glaube eher, dass deine Reaktion reflexhaft wäre, wenn du Code warten/weiterentwickeln solltest, wo irgendwelche nicht mehr greifbaren Vorgänger genau nach diesem Motto vorgegangen sind, ... ich weiß genau was hier passiert, ich kenne den Anwendungsfall, ich kenne alle möglichen Benutzereingaben, ...
    Die wenigsten Projekte haben ausreichend automatische Testabdeckung und mögen solcherlei 'Annahmen' gar nicht, es sein denn, es handelt sich um Remote-Debugging Fetischisten.


Anmelden zum Antworten