Zahlen sortieren



  • Hallo! ich bin ganz neu bei C(wie man beim code sicher schnell sehen wird! 😉 ). Ich hab einen teil einer aufgabe herausgenommen, hier wollte ich einfach nur die 12 zahlen die vom benutzer eingegeben werden in zwei arrays "ordnen" damit ich nachher dann damit weiterrechnen kann.
    Jetzt hab ich halt den code nach meiner logik dazu geschrieben der höchstwahrscheinlich ziemlich falsch ist... wollte nur um ein bisschen hilfe fragen wie ich diesen verbessern kann oder wenn er komplett falsch ist wie ichs ansetzten soll...
    Danke!
    LG

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    
        int gerade [7];
        int ungerade [7];
        int i='0', j='0', x;
    
        while(i<=12) {
        scanf("%d", &x);
    
            if(x='0'||x='2'||x='4'||x='6'||x='8') {
            i++;
            gerade[i]=gerade[i]+x;
            }
            else() {
            j++
            ungerade[j]=ungerade[j]+x;
            }
        }
    
    printf("%d\t%d", gerade[7],ungerade[7]);
    
    }
    


  • Hallo,

    daß du ein C-Neuling bist, merkt man sofort an deinem Code. Da sind einige gravierende Fehler drin (so daß dein Programm im besten Fall abstürzt ;-):
    - Initialisierung von i und j sollte "int i = 0, j = 0" sein
    - deine while-Bedingung "i<=12" ergibt keinen Sinn, da dies ja der Array-Index darstellen soll (dein Array aber nur von 0 bis 6 geht)
    - wenn man bei x eine andere Zahl als die if-Bedingung eingibt (also z.B. -2, 1 oder 10) spring er in den else-Zweig für ungerade...
    - die Anweisung "gerade[i]=gerade[i]+x;" ergibt m.E. keinen Sinn, denn das Array ist nicht initialisiert: du meinst wohl eher "gerade[i] = x;"
    - mit gerade[7] sowie ungerade[7] (beim printf) greifst du auf ein nichtdefiniertes Element deines Arrays zu - du solltest die printf-Ausgabe also in einer Schleife von 0 - 6 durchführen.

    Wie du siehst, solltest du dir also besser die Grundlagen noch mal anschauen, bevor du solche Aufgaben angehst (So ganz verstehe ich aber sowieso nicht, wie die genaue Aufgabenstellung aussieht).



  • Hi!
    Ein paar Vorschläge hätte ich da für dich:
    Du kannst mit dem Modulo-Operator prüfen, ob eine ganze Zahl gerade oder ungerade ist:

    int x = -10;
    
    	if ( 0 == ( x % 2 ))
    		printf ("%d ist gerade\n", x);
    	else
    		printf ("%d ist ungerade\n", x);
    

    Die Funktion scanf gibt einen Wert zurück, den man verarbeiten sollte.
    Dann musst du nochmal über deine Arraygrenzen nachdenken ...



  • C ist eine typisierte Sprache. C bietet zwar eine Reihe von 'impliziten' Typumwandlungen an (ohne Compilerwarnungen), aber diese brauchst du hier nicht.
    i,j,x sind vom Typ int, du benutzt jedoch Zeichenliterale '' vom Typ char.
    In C ist der Gleichheitsoperator == und nicht =.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    
        int gerade [7];
        int ungerade [7];
        int i=0, j=0, x;
    
        while(i<=12) {
        scanf("%d", &x);
    
            if(x==0||x==2||x==4||x==6||x==8) {
            i++;
            gerade[i]=x;
            }
            else() {
            j++
            ungerade[j]=x;
            }
        }
    
    printf("%d\t%d", gerade[7],ungerade[7]); /* was soll das hier bringen? */
    
    }
    


  • Könnte mir bitte jemand verraten, warum

    #include <stdio.h>
    
    int main( void )
    {
            int ch = 0;
            int i = 0;
            int input;
            int odd[ 12 ];
            int odd_count = 0;
            int even[ 12 ];
            int even_count = 0;
    
            puts( "Bitte geben Sie 12 natürliche Zahlen ein:\n" );
    
            for( ; i < 12; ++i ) {
    
                    printf( "\n%2i. Zahl: ", i + 1 );
    
                    if( scanf( "%d", &input ) ) {
    
                            if( input % 2 ) {
    
                                    odd[ odd_count ] = input;
                                    ++odd_count;
    
                            } else {
    
                                    even[ even_count ] = input;
                                    ++even_count;
                            }
                    } else {
    
                            puts( "\nFehlerhafte Eingabe!");
                            while( ( ch = getchar() ) != EOF && ch != '\n' )
                                    ;
                            --i;
                    }
            }
    
            puts( "\n\nEingegebene ungerade Zahlen:" );
            for( i = 0; i < odd_count; ++i ) {
    
                    printf( "%d ", odd[ i ] );
            }
    
            puts( "\n\nEingegebene gerade Zahlen:" );
            for( i = 0; i < even_count; ++i ) {
    
                    printf( "%d ", even[ i ] );
            }
    }
    

    auf ideone einen Runtime Error gibt?


  • Mod

    Weil C im Gegensatz zu C++ kein implizites return 0 in main hat. Daher gibt dein Programm irgendeinen Müllwert zurück und die Laufzeitumgebung denkt, es wäre ein Fehlerwert.



  • SeppJ schrieb:

    Weil C im Gegensatz zu C++ kein implizites return 0 in main hat.

    C99 5.1.2.2.3 schrieb:

    Program termination
    If the return type of the main function is a type compatible with int, a return from the initial call to the main function is equivalent to calling the exit function with the value returned by the main function as its argument; reaching the } that terminates the main function returns a value of 0. If the return type is not compatible with int, the termination status returned to the host environment is unspecified.

    ?


  • Mod

    C99. ideone benutzt C89. Wutz hat schon nicht ganz unrecht, wenn er hier im Forum immer gegen C99-Nutzung außerhalb des privaten Gebrauchs wettert. Die neuen C-Standards haben sich eben einfach nie so richtig durchgesetzt. Selbst der GCC, der wohl einer der wenigen Compiler mit C11 ist, benutzt in der Standardeinstellung C89. (Deswegen ist ideone auch C89, denn die nutzen intern den GCC)



  • SeppJ schrieb:

    C99. ideone benutzt C89.

    Danke.


Anmelden zum Antworten