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



  • Hallo,
    mein Code läuft nach folgendem Prinzip:

    [...]

    int punkt;
    
    printf("Bitte Menüpunkt wählen.");
    scanf("%i", punkt);
    
    if (punkt == 1)
    printf("Folge 1");
    
    else if (punkt == 2)
    printf("Folge 2");
    
    else if (punkt == 3)
    printf("Folge 3");
    
    else if (punkt == 4)
    printf("Folge 4");
    
    else if (punkt == 5)
    printf("Folge 5");
    
    else 
    printf("Ungültige Angabe!");
    
    [...]
    

    Egal welche Zahl ich angebe, es wird immer angezeigt, dass ich eine ungültige Angabe getätigt habe, obwohl doch die Else-If Anweisungen sehr eindeutig gestrickt sind?! 😕

    Gruß RS

    Edit: Da ich am Anfang immer mal ein paar Anfängerfragen habe, möchte ich nicht für jede kleine Frage einen neuen Thread öffnen und denke, dass es so am besten ist,wenn ich diese Thread dazu verwende...



  • scanf("%i", **&**punkt);

    benutz doch eine switch anweisung... nur so als ratschlag



  • Das könnte auch abstürzen...

    Du musst bei scanf die Adresse von punkt übergeben (&punkt), sonst weiss die Implementierung nicht wo das Ergebnis hingeschrieben werden soll 😉

    Mist, 4 Sekunden zu langsam 😃



  • uuuupppss... was so ein kleines Zeichen ausmachen kann... 😃

    Komisch, dass ich das vergessen habe, danke für eure Hilfe.

    RS



  • So, mal wieder ne Sache..

    mache gerade ein Tutorial und da heißt es:

    1. Schreib ein Programm, welches eine Anfangszahl und eine Endzahl einliest. Achte darauf, daß die Anfangszahl kleiner als die Endzahl ist ! Ausgegeben werden soll jede dritte Zahl, die sich zwischen der Anfangszahl und der Endzahl befindet.

    Schreib den Teil der Variablenverarbeitung mit:

    * einer while - Schleife

    Beispielausgabe:

    Eingabe der Anfangszahl: 1

    Eingabe der Endzahl: 15

    Zahlen zwischen den beiden Zahlen: 2 5 8 11 14

    Ich habe das so gemacht, allerdings erhielt ich als Lösung: 4 7 10 13 16

    Und dann gucke ich in der Lösung und da steht folgendes:

    /Die Laufvariable wird hier mit anfang + 1 initialisiert, da die Aufgabe war,
    jede dritte Zahl zwischen den beiden eingegebenen Zahlen auszugeben. Innerhalb der
    Schleife wird der Wert der Laufvariable um 3 erhöht, um jede dritte Zahl zu finden.
    /

    laufvariable = anfang + 1;

    while (laufvariable < ende)
    {
    printf("%i ", laufvariable);
    laufvariable += 3;
    }

    Wer hat jetzt hier nen Logikfehler...er oder ich? 🤡 😃
    Woher soll ich aus der Aufgabenstellung bitteschön wissen, dass die Anfangszahl um 1 erhöht wird? 😕



  • IMHO wäre Deine Lösung richtig, da die 2 (und alle folgenden) weder in den Exklusiv-Bereich noch in den Inklusiv-Bereich "jeder dritten Zahl zwischen 1 und 15" passt. Exklusiv wäre also 1 + 3 eigentlich die erste Zahl.

    Oder spricht irgendein mathematisches Grundverständnis dagegen? (Bin in der Mathematik nicht allzu bewandert muss ich zugeben)



  • Hm..denke ich nämlich auch, dass das so ist..aber egal...

    hier mal wieder ein neues Problem:

    #include <stdio.h>
    
    void main()
    {
    
    /* Variablen definieren */
    
    int anzahl;
    float summe, mittelwert, laufzahl;
    
    summe = 0;
    anzahl = 0;
    mittelwert = 0;
    
    /* Schleife 0 */
    
    do
    {
    printf("\n\nBitte geben Sie eine Zahl ein [negative Zahl bricht ab]: ");
    scanf("%f", &laufzahl);
    
    mittelwert = summe / anzahl;
    
    anzahl = anzahl + 1;
    
    summe = summe + laufzahl;
    
    printf("\nEingegeben: %.0f. Mittelwert: %.1f", laufzahl, mittelwert);
    
    }
    while (laufzahl >= 0);
    
    printf("Programmende!");
    
    getch();
    }
    

    Der Compiler zeigt keinerlei Fehler oder Warnungen an, doch ich werde immer, nachdem ich eine Zahl eingegeben habe, aus dem Programm wieder rausgeschmissen..woran liegts?

    So funktioniet es auch nicht:

    #include <stdio.h>
    
    void main()
    {
    
    /* Variablen definieren */
    
    int anzahl;
    float summe, mittelwert, laufzahl;
    
    summe = 0;
    anzahl = 0;
    mittelwert = 0;
    
    /* Schleife 0 */
    
    while (laufzahl >= 0)
    {
    printf("\n\nBitte geben Sie eine Zahl ein [negative Zahl bricht ab]: ");
    scanf("%f", &laufzahl);
    
    mittelwert = summe / anzahl;
    
    anzahl = anzahl + 1;
    
    summe = summe + laufzahl;
    
    printf("\nEingegeben: %.0f. Mittelwert: %.1f", laufzahl, mittelwert);
    
    }
    
    printf("Programmende!");
    
    getch();
    }
    


  • da kommt nicht etwa noch ein fehler?
    z.B. Division durch null?

    summe = 0;
    anzahl = 0;
    mittelwert = 0;
    ...
    mittelwert = summe / anzahl;
    


  • Hm stimmt. Jetzt funktioniert es.

    Danke.

    Aber welche Werte muss ich denn jetzt auf 0 setzen im Endeffekt?



  • Du solltest alle werte auf null setzten (bzw. Initalisieren),
    bevor du sie benutzt.
    Nur solltest du halt eine Division durch Null vermeiden indem du
    Anzahl vor der Division incrementierst
    (wobei ich anzahl++; als besseren Stil empfinde als anzahl = anzahl +1;)



  • #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)


Log in to reply