Quersumme mit Modulo bzw. Array



  • Hallo liebe Community,

    Ich bin noch ein Neuling bei der C-Programmierung und habe eine Frage.
    Ich habe ein Programm mit Modulo, um die Quersumme einer Zahl zu bekommen.

    #include <stdio.h>
    
    int main () {
        int zahl, ziffernsumme;
        ziffernsumme = 0;
    
        printf ("Bitte Zahl eingeben: ");
        scanf ("%d", &zahl);
    
        ziffernsumme = zahl/100 + (zahl/10)%10 + zahl%10;
    
        printf ("Die Quersumme ist: %d\n", ziffernsumme);
    
    return (0);
    }
    

    Funktioniert alles wunderbar, aber leider nur für drei stellige Zahlen. Gibt es eine Möglichkeit mit dieser Methode das Programm dazu zu kriegen, dass es mit mehr als drei Ziffern klappt?

    Ansonsten habe ich gelesen, dass man bei einer Zahl per Array oder String die Ziffern einzeln einlesen kann und diese dann addieren kann, um die Quersumme zu erhalten. Könnte mir da jemand einen Denkanstoß geben, wie man das aufschreibt?
    Leider gibt es so viele verschiedene Antworten zu solchen Fragen, dass ich langsam ein wenig verwirrt bin.

    Würde mich über jede Antwort freuen!
    Schonmal vielen Dank!



  • Ungefähr so:

    ...
    int rest;
    ...
    
    while(zahl)
    {
      rest = zahl % 10;
      ziffernsumme = ziffernsumme + rest;
      zahl = zahl / 10;
    }
    


  • Wingman1896 schrieb:

    Ansonsten habe ich gelesen, dass man bei einer Zahl per Array oder String die Ziffern einzeln einlesen kann und diese dann addieren kann, um die Quersumme zu erhalten. Könnte mir da jemand einen Denkanstoß geben, wie man das aufschreibt?
    Leider gibt es so viele verschiedene Antworten zu solchen Fragen, dass ich langsam ein wenig verwirrt bin.

    Dabei liest man die Eingabe nicht in eine Integervariable sondern zeichenweise. Entweder erst in ein char[], dass man später analysiert oder gleich von der Tastatur.
    Man macht dann "zu Fuß", was

    scanf ("%d", &zahl);
    

    über die Bibliotheksfunktion auch macht.

    #include <stdio.h>
    
    int main () {
        int ziffernsumme = 0;
        char ziffern_als_text[80];
        char *stelle_im_text;
    
        printf "Bitte Zahl eingeben: ");
        scanf ("%80s", ziffern_als_text); /* Ginge auch mit schnellerer Funktion wie fgets, Begrenzung gegen Ueberlauf, kann man auch mit Konstante realisieren */
    
        for (stelle_im_text = ziffern_als_text;isdigit(*stelle_im_text);stelle_im_text++) /*Abbruch bei der ersten Nichtziffer*/
            ziffernsumme += atoi(*stelle_im_text); /* Ginge auch mit ASCII-Arithemtik */ 
    
        printf ("Die Quersumme ist: %d\n", ziffernsumme);
    
    return (0);
    }
    

    Ciao, Allesquatsch



  • Der Name ist Programm.

    Allesquatsch schrieb:

    char ziffern_als_text[80];
    
        scanf ("%80s", ziffern_als_text);
    

    Bei scanf gibt man an, wieviel Platz für die Zeichen da sind. Den Platz für die terminierende '\0' muss man selber berücksichtigen.
    Also entweder das Array mit 81 Elementen definieren oder bei scanf nur 79 angeben.

    Allesquatsch schrieb:

    ziffernsumme += atoi(*stelle_im_text);
    

    Das ist nicht nur Quatsch, sondern Müll.
    Das schmeißt dir der Compiler um die Ohren, da atoi einen Zeiger auf einen Nullterminierten String erwartet.
    Und selbst wenn du den * weglässt, versuch atoi die ganze Ziffernfolge umzuwandeln und nicht nur ein einzelnes Zeichen.



  • DirkB schrieb:

    Der Name ist Programm.

    Allesquatsch schrieb:

    char ziffern_als_text[80];
    
        scanf ("%80s", ziffern_als_text);
    

    Bei scanf gibt man an, wieviel Platz für die Zeichen da sind. Den Platz für die terminierende '\0' muss man selber berücksichtigen.
    Also entweder das Array mit 81 Elementen definieren oder bei scanf nur 79 angeben.

    Du hast recht. Hatte die Funktion auch erst mit fgets realisiert. Mir fehlt etwas die Praxis, die Feinheiten richtig zu machen.

    DirkB schrieb:

    Allesquatsch schrieb:

    ziffernsumme += atoi(*stelle_im_text);
    

    Das ist nicht nur Quatsch, sondern Müll.
    Das schmeißt dir der Compiler um die Ohren, da atoi einen Zeiger auf einen Nullterminierten String erwartet.

    Und selbst wenn du den * weglässt, versuch atoi die ganze Ziffernfolge umzuwandeln und nicht nur ein einzelnes Zeichen.

    Du hast recht. Hatte auch erst *stelle_im_text - '0', dachte aber dann, dass es da doch eine Funktion ala isdigit gäbe. atoi war es definitiv nicht.

    Danke für die Korrektur

    Ciao, Allesquatsch



  • Rekursion ftw.

    #include <stdio.h>
    
    unsigned quersumme(unsigned x) {
      return x != 0 ? x % 10 + quersumme(x / 10) : 0;
    }
    
    int main(void) {
      unsigned x;
    
      if(1 == scanf("%u", &x) {
        printf("%u\n", quersumme(x));
      } else {
        return -1;
      }
    
      return 0;
    }
    


  • unsigned qsum ( unsigned z )
    {
       return z ? z % 10 + qsum ( z / 10 ) : 0;
    }
    
    int main ( void )
    {
    	char buf[128]={0}, *p=buf;
    	unsigned num = 1234, sum=0;
    	printf ( "%u\n", qsum ( num ));
    
    	puts("Positive ganze Zahl eingeben: ");
    	fgets(buf, sizeof(buf), stdin);
    	while (isdigit(*p))
    		sum += *p++-48;
    	printf("%u\n", sum);
    	return 0;	
    }
    


  • @pille palle
    Beim nächsten mal dann

    sum += *p++-'0';
    

    Wenn kümmerts, dass die '0' in irgendeinem Code den Wert 48 hat. 🤡


Log in to reply