Quersumme Problem



  • @ alle die das hier lesen,

    Ich wollte ein Programm schreiben welches die Quersumme einer Zahl berechnet.

    Bis jetzt hab ich diesen Code:

    //---------------------------------------------------------------------------
    #include <stdio.h>
    #include <conio.h>
    #include <vcl.h>
    #pragma hdrstop
    
    //---------------------------------------------------------------------------
    
    #pragma argsused
    
    int a, b, erg, zahl;
    int main(int argc, char* argv[])
    {
            printf("\n\n Quersumme einer ganzen Zahl");
            printf("\n Geben Sie eine ganze Zahl ein deren Quersumme berechnet"
            "werden soll");
            scanf("%i",&zahl);
            a=0;
            do
            {
                    b=a;
                    scanf("%1i",&a);
                    if(a!=10)
                    {
                            erg=a+b;
                    }
                    else{}
            }while(a!=10);
            printf("Die Quersumme aus %i",zahl," lautet %i",erg," !");
            getch();
            return 0;
    }
    //---------------------------------------------------------------------------
    

    Irgendwie scheint die Abbruchbedingung nicht richtig zu sein. Das Programm soll das Einlesen und Addieren der einzelnen Ziffern beenden wenn Return gedrückt wurde.



  • Weshalb muss der Anwender die Ziffern eingeben?
    Viel schöner wäre doch:

    #include <stdio.h> 
    #include <string.h>
    
    int main (void) { 
    
     char buf[15+1]; 
     int quersumme = 0; 
     register int i,laenge = 0; 
    
     printf ("Geben sie die Zahl ein deren Quersumme gebildet werden soll. "); 
     gets (buf); 
     laenge = strlen (buf);
     while (i < laenge ) { 
      quersumme += (buf[i] - '0'); 
      i++; 
    
     } 
    
     printf ("\nDie Quersumme ist %d", quersumme); 
    
     getchar ();
    
     return 0; 
    }
    

    Edit:
    Dummer Fehler unterlaufen 🤡

    Edit2:
    Hab ja ganz vergessen dass die Quersumme über 10 ja weiter berechnet werden muss,
    wart mal 5min dann liefer ich ne richtige Version



  • Vielleicht hab ich da was falsch verstanden, aber der Anwender gibt die Zahl in einem ein, und wenn er Return drückt soll das Programm das Ergebnis ausgeben.
    Noch ein Problem: Ich bin C noch am lernen und kenne einige Befehle gar nicht.
    Strings, Arrays und Zeiger hatten wir noch gar nicht.

    Also was ich eigentlich wissen wollte war: Wie check ich ob Return gedrückt wurde (am Ende der Eingabe).



  • Also Return muss gedrückt werden, damit dein Programm überhaupt die eingegebenen
    Zeichen erhält.
    Wenn ihr das alles noch nicht hattet wird es etwas schwerer, du musst die Zahl
    dann in ihre Ziffern zerlegen, ich mach dir das mal fix, meine jetztige Methode
    hätte mit ner rekursiven Funktion und nem Zeiger gearbeitet, aber wenn ihr das
    noch nicht hattet, dann mach ich es anderst.



  • Ich dachte mit diesem Algorithmus

    do{
    
       scanf("%1i",&a); // %1i liest ein integer ein
                        // %1c liest ein char ein; oder nicht??
    
    }while(Abbruchbedingung)
    

    würde man immer nur ein Zeichen einlesen.



  • Ja so liest du immer ein Zeichen ein, wenn der Benutzer also die Quersumme von
    52 wollte müsste er einmal die 5 und einmal die 2 eingeben, was dazu führen würde,
    dass er genau wissen muss wie er die Quersumme errechnen kann und was außerdem
    umständlich ist, viel einfacher wäre es doch einfach "52" einzugeben und der PC
    berechnet die Quersumme, was 7 wäre und gibt sie aus.

    Deine Abbruchbedingung ist auch nicht ganz optimal, bei a != 10, würde er nur bei
    10 abbrechne, jedoch muss er nur so lange rechnen wie a > 9 ist, also 10 und höher,
    unter 10 ist er fertig und kann die Quersumme ausgeben.

    Edit:
    Ich muss gleich los und komme gerade nicht mehr darauf wie man Zahlen in ihre
    Ziffern zerlegen kann, hatte das erst vor kurzem mal ausgetüftelt, aber mir fällt
    es einfach nicht mehr ein 😞

    Also das Konzept:
    -Zahl vom Benutzer einlesen (int zahl)
    -Ergebnis den Wert von Zahl zuweisen
    -So lange das Ergebnis (int ergebnis) größer oder gleich 10 ist weitermachen
    in der Schleife
    -In der Schleife Ergebnis in Ziffern zerlegen und diese addieren, entweder direkt
    zu Ergebnis oder in eine Temp-Variable, am Ende der Schleife Ergebnis den
    Wert der Temp-Variable zuweisen

    Du brauchst gar keine do-while Schleife, eine while reicht, denn wenn a <= 9
    ist, dann hast du die Quersumme ja schon und kannst sie direkt ausgeben.

    Mal zu dem ganzen Pseudocode, denke das gekrakel da oben hilft dir nicht.

    int ergebnis;
    int temp;

    scanf ("%d",&ergebnis),

    while ( ergebnis >= 10) {
    temp = ergebnis_ziffer_1+ergebnis_ziffer_2+ergebnis_ziffer_x;
    ergebnis = temp;
    }

    printf ("Quersumme %d",ergebnis

    so sieht das dann aus, aber wie gesagt mir fällt grad nicht mehr ein wie man
    die Ziffern einer Zahl bekommt.



  • weiß auch nicht wie ich auf 10 gekommen bin. man müsste doch '\n' als Abbruchbedingung eingeben.



  • Verwende doch einfach a != 'e' , wenn der benutzer ein e eingibt, dann bricht
    das ganze ab, aber eine while-schleife wäre da besser, da sonst die ASCII-Zahl
    von dem e auch noch mitaddiert wird.
    Eine 0 würde sich auch anbieten, da man bei der Quersumme ja keine 0 zu addieren braucht.



  • TheSilence schrieb:

    weiß auch nicht wie ich auf 10 gekommen bin. man müsste doch '\n' als Abbruchbedingung eingeben.

    ASCII Wert von '\r' und '\n' sind 10 und 13
    ein Zeilenumbruch unter Windows ist ein "\r\n"

    So bist du vermutlich darauf gekommen.

    Aber bedenke: schreibe NIE ASCII Code in den Quelltext - das bringt nix.

    Ein '\n' ist viel deutlicher

    Um alle Ziffern einer eingegebenen Zahl zu bekommen empfehle ich ein:

    int c;
    int sum=0;
    while((c=getchar())!='\n')
    {
      if(!isdigit(c)) continue;
      sum+=c-'0';
    }
    


  • Shade Of Mine schrieb:

    int c;
    int sum=0;
    while((c=getchar())!='\n')
    {
      if(!isdigit(c)) continue;
      sum+=c-'0';
    }
    

    So hast du zwar alle Ziffern am Anfang,das kann mein erstes oben auch, aber
    was wenn sum > 9 ist?
    Wie rechnest du nun weiter?



  • SirLant schrieb:

    So hast du zwar alle Ziffern am Anfang,das kann mein erstes oben auch, aber
    was wenn sum > 9 ist?
    Wie rechnest du nun weiter?

    Verstehe ich nicht 😞

    sum ist ein int - dh da passt eigentlich genug rein, und mehr als 9 sowieso.

    Was meinst du genau?



  • SirLant schrieb:

    Ich muss gleich los und komme gerade nicht mehr darauf wie man Zahlen in ihre
    Ziffern zerlegen kann, hatte das erst vor kurzem mal ausgetüftelt, aber mir fällt
    es einfach nicht mehr ein 😞

    Man kann eine Zahl mit dem modulus Operator ( % ) in ihre Ziffern zerlegen.

    int quersumme=0;
    while(zahl>0) {
       quersumme+=zahl%10;
       zahl/=10;
    }
    

    Aber ich würde empfehlen die Methode von Shade Of Mine zu benutzen.


Anmelden zum Antworten