Quersummenprogramm



  • Hi ich habe folgendes Problem ich soll nen Programm schreiben, was die Quersumme bilden soll.

    Ich hab mir also folgendes Programm erdacht:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>
    
    int feld[20];
    int erg=0;
    int n=0;
    
    int main()
    {
    
    printf("Bitte Geben Sie eine beliebige Zahl ein\n");
    scanf("%i",&feld);
    
    for(n=0; n<sizeof(feld); n++)
    {
    
    erg=erg+feld[n];
    printf("%i\n",erg);   // nur zur überprüfung 
    }
    
    printf("%i\n",erg);
    
    return 0;
    }
    

    Problem ist das ich nicht die Quersumme erhalte.
    Bei quersumme von 12 zb erhalte ich nicht 3 sondern als endwert irgendeine komische zahl, nur warum ist das so? Ich kann den fehler nicht finden.



  • Hi,

    ich bin zwar kein C Programmierer, aber ich würde mal sagen du liest hier

    scanf("%i",&feld);
    

    deine eingegebene Zahl in feld[0] ein.

    D.h. du addierst hier

    erg=erg+feld[n];
    

    zu "erg" irgendwelche nicht initialisierten Werte dazu.



  • &feld kannst du bei strings benutzen bzw. chararrays

    wenn du so die quersumme ausrechnen willst dann musst du deine eingabe als string eingeben und dann jedes element berechnen [0] , [1] usw.

    ah und nochwas dein array ist immer 80 !
    du hast ja dein feld mit 20 int´s initialiersiert als 20*4 = 80, das ist kein variabler wert



  • Hi,

    ich würde wohl so vorgehen:

    Die Zahl in char-Array 'str' einlesen (fgets)
    
    Für jedes Element in 'str' 
      Konvertiere das Element in ein int (schau dir ne ASCII-Tabelle dafür an)
      Erhöhe die Gesamtsumme um den aktuellen int-Wert
    
    Gib Summe aus
    

    Im Übrigen stimmt die Schleifenbedingung nicht. sizeof(feld) wird nicht 20 zurückliefern. sizeof(feld)/sizeof(int) hätte geklappt, aber besser ist, wenn du ne Konstante SIZE definierst, und dann die für's Array und die Schleife hernimmst.

    So. Ablauf hast du, jetzt musst du's nur noch nach C bringen. Versuch's mal, bevor hier einer die Komplettlösung postet...



  • Also ich weis nicht wie ich das auf jedes elemnetim feld beziehen soll , ich kann nur ne einzelnen teil des feldes mit - '0' bzw 48 in nen int umwandeln bei der ausgabe.
    Krieg das nicht in ne schleife rein.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>
    
    char feld[20];
    int erg;
    int n=0;
    int x;
    int main()
    {
    
    printf("Bitte Geben Sie eine beliebige Zahl ein\n");
    gets(feld);
    
    printf("%s\n",feld);
    
    printf("%i\n",feld[0] -'0');
    printf("%i\n",feld[1] -'0');
    
    for(n=0; n<sizeof(feld);n++)
    {
    	x=feld[n] - '0';
    
    	erg=erg+x;
    	printf("%i",erg);
    }
    

    return 0;
    }



  • vielleicht solltest du (a) nur bis strlen(feld) gehen (sizeof wird dir IMMER 20 liefern, egal wie lang die eingegebene Zahl wird - und dann addierst du undefinierte Speicherwerte auf deine Quersumme drauf) und (b) mit isdigit() kontrollieren, ob du überhaupt eine Ziffer in der Hand hältst.

    PS: Und ausgeben mußt du dein Ergebnis erst hinter der Schleife.



  • Also bin jetzt soweit

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>
    
    char feld[20];
    int erg=0;
    int n;
    int x;
    int main()
    {
    
    printf("Bitte Geben Sie eine beliebige Zahl ein\n");
    gets(feld);
    
    printf("%s\n",feld);
    
    printf("%i\n",feld[0] -'0');
    printf("%i\n",feld[1] -'0');
    
    for(n=0; n<strlen(feld);n++)
    {
    	x=feld[n] - '0';
    
    	erg=erg+x ;
    	printf("%i",erg );
    }
    
    	printf("%i",erg);
    
    return 0;
    }
    

    Was is dieses digit?
    Irgendwie bekomme ich immer noch nur mist als ausgabe.

    wenn ich zb 123 eingebe bekomm ich statt 3 , 1366 als ausgabe...



  • isdigit: http://www.cppreference.com/stdstring/isdigit.html

    wenn ich zb 123 eingebe bekomm ich statt 3 , 1366 als ausgabe...

    Das stimmt wohl beides nicht 😉



  • Eventuell solltest du auch das printf() aus der Schleife rausnehmen - in Wahrheit schreibt dir das Programm nämlich gar nicht "1366", sondern nacheinander die Zwischenergebnisse "1", "3", "6" und das Endergebnis "6".

    PS: Und Variablen darfst du auch IN der main()-Funktion definieren.



  • achja , stimmt an einfaches \n vergessen bin ich garnicht gekommen.
    Die printf da drinnen war nur zu test zwecken.

    manchmal siehtman echt den wald vor lauter bäumen nicht...
    edit:
    Also habs hinbekommen^^
    Das fertige Programm lautet:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>
    
    int main()
    {
    
    char feld[20];
    int erg=0;
    int n;
    int int_feld;
    float div_erg;
    
    printf("Bitte Geben Sie eine beliebige Zahl ein\n");
    printf("0 zum Beenden\n");
    gets(feld);
    
    if(feld[0] != 0)
    {
    
    for(n=0; n<strlen(feld);n++)
    {
    	int_feld=feld[n] -'0';
    
    	erg=erg+int_feld ;
    
    }
    
    	printf("Die Quersumme lautet %i\n",erg);
        div_erg= (float) erg/3;
    	printf("Die Division durch 3\nergibt %.2f\n",div_erg);
    
    	if(erg%3 ==0)
    	{
    		printf("Also ist die Zahl durch 3 teilbar\n");
    	}
    
    	else
    	{
    		printf("Also ist die Zahl nicht durch 3 teilbar\n");
    	}
    
    }
    
    return 0;
    }
    


  • Ja, das sieht schonmal nicht schlecht aus. Nur einige Anmerkungen:

    • die Abfrage if(feld[0]!=0)... prüft nicht, ob der Nutzer "0" eingegeben hat, sondern fängt eine leere Eingabe ab.
    • nimm statt gets() lieber fgets(), damit kannst du scherstellen, daß du nicht über deinen Speicher hinauschreibst.

Anmelden zum Antworten