[C] Quersumme aus String auslesen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von s1nu, 15. Oktober 2013 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 15. Oktober 2013
    Zuletzt bearbeitet: 15. Oktober 2013
    Hey Leute,

    brauche mal bitte eure Hilfe und zwar habe ich folgende Aufgabenstellung:

    Erstelle ein programm das Zeichen einliest und die Quersumme errechnet.
    Die Ausgabe des Programms kann wie folgt aussehen:

    Das Einlesen einer Zeichenkette ist kein Problem, nur wie bekomm ich eine Zeichenkette von nem String zu nem Integerwert, sodass ich damit rechnen kann?

    Falls ich die Eingabe als Integer speichere, wie kann ich denn dann drüber iterieren, sodass ich eine Quersumme bilden kann?

    Oder wie löst man das Problem am elegantesten?

    Mein Code aktuell:
    Code:
    #include <stdio.h>
    
    int main(void)
    {
     
     char eingabe[20];
     printf("Bitte geben Sie Ihre Zeichen ein: ");
     fgets(eingabe, 20, stdin);
     
     // Hier fehlt natürlich der weitere Code :(
     
     return 0;
    }
    Vermutlich ist es relativ einfach zu lösen, aber steh hier noch in Kinderschuhen
    Würde mich freuen, wenn mir jemand helfen könnte.
     
  2. 15. Oktober 2013
    Zuletzt bearbeitet: 15. Oktober 2013
    AW: [Hilfe] Quersumme aus String auslesen in C

    Spontan würde ich sagen (mit dem von dir geposteten Code) mit ner for/while schleife und dann atoi() und substr(). Ob das am elegantesten ist weiß ich nicht, sollte aber funktionieren. Man könnte natürlich auch direkt die ASCII Werte nehmen.
     
    1 Person gefällt das.
  3. 16. Oktober 2013
    Zuletzt bearbeitet: 16. Oktober 2013
    AW: [C] Quersumme aus String auslesen

    @MasterJulian

    Wär doch "schöner" statt einen c-string direkt ein integer einzulesen?!
    Würd' ich dementsprechend auch so machen, da die Änderung am Code jetzt nicht sonderlich groß ist. Vorausgesetzt, die Aufgabe verlangt es nicht zwangsweise mit char.

    Und selbst wenn ein c-string genommen werden muss, würde ich den eher Manuell durchlaufen und per Cast den Integerwert einzeln herausfinden (Wie du sagtest, den ASCII Wert nehmen).

    So als grobe Vorlage
    Code:
    integerwert = (int)(s[i] - '0');
    Hätte auch den Vorteil, dass die eingegebene "Zahl" viel größer sein kann als es ein normaler 32bit-Integer erlaubt.
    Bsp. Quersumme von 123456789123456789123456789 = 135

    Diese atoi (und vor Allem itoa) Sache ist mir persönlich zumindest immer etwas suspekt... Aber evl. kommen hier auch gleich viele Aufrufe, und meine Bedenken sind unberechtigt.
     
    1 Person gefällt das.
  4. 16. Oktober 2013
    Zuletzt bearbeitet: 16. Oktober 2013
    AW: [C] Quersumme aus String auslesen

    Code:
    #include <stdlib.h>
    #include <stdio.h>
    
    int main(void) 
    {
     char num[21] = { 0 }, *ptr = num;
     long sum = 0;
    
     scanf("%20[0-9]", num);
    
     while (*ptr) sum += *ptr++ - '0';
     printf("num: %s\nsum: %ld", num, sum);
     
     return 0;
    }
     
    1 Person gefällt das.
  5. 16. Oktober 2013
    AW: [C] Quersumme aus String auslesen

    Danke schonmal an alle für eure Antworten.

    Murdoc kannst du mir das kleine Programm vielleicht etwas erklären? Es tut was es soll, aber ich würde gerne verstehen, wie es funktioniert..

    Vor allem bei dieser Zeilen kenn ich mich nicht aus:
    while (*ptr) sum += *ptr++ - '0';

    Gehört das Argument bei ner While-Schleife nicht in ( )?
    Was macht (*ptr) sum? // wird hier einfach auf den Speicher der sum variable gezeigt?
    *ptr++ zeigt dann auf den nächsten speicherplatz in dem char array?

    Oder wie läuft das? Kann man das auch ohne Zeiger umsetzen?
    Wir haben noch nicht so viel Stoff durchgenommen, daher die vielen Fragen^^
     
  6. 16. Oktober 2013
    Zuletzt bearbeitet: 16. Oktober 2013
    AW: [C] Quersumme aus String auslesen

    *ptr = num

    Damit erstelle ich einen Zeiger auf das erste Element des char array <num>.

    while (*ptr) sum += *ptr++ - '0';


    Solange <ptr> auf ein gültiges Element zeigt (also nicht 0),
    addiere zu <sum> das aktuelle Element <*ptr> minus '0' (*ascii).

    Anschließend wird <ptr> um ein Element verschoben (ptr++).

    Alternative Schreibweise in diesem Fall wäre:
    Code:
    while (*ptr != 0) {
     char chr = *ptr;
     long res = chr - '0';
     sum += res;
     ptr++;
    }
    *ptr++

    Hole das Element auf welches <ptr> gerade zeigt und wechsle anschließend auf nächste Element.

    *ascii

    Ascii Table - ASCII character codes and html, octal, hex and decimal chart conversion

    Angenommen wir haben das Zeichen '1' (ascii 49) und wir ziehen davon das Zeichen '0' (ascii 48) ab.
    Das Ergebnis ist dann 1 als Ganzzahl. Das Funktioniert von '0' bis '9'.

    ('1' - '0') = (49 - 48) = 1
    ('2' - '0') = (50 - 48) = 2
    ('3' - '0') = (51 - 48) = 3
    ...

    Kann man das auch ohne Zeiger umsetzen?

    Streng genommen nein, da char[] selbst bereits ein Zeiger ist
    Aber ich denke du meinst den Zugriff über num[...]. Das geht.

    Code:
    for (long i = 0; i < 21; ++i) {
     if (num[i] == 0)
     break; // (vorzeitiges) ende erreicht
    
     char chr = num[i];
     long res = chr - '0';
     sum += res;
    }
     
  7. 17. Oktober 2013
    AW: [C] Quersumme aus String auslesen

    Vielen vielen Dank. Ich konnte das Beispiel nun lösen. Nachfolgend mein Sourcecode:

    Code:
    #include <stdio.h>
    #include <string.h>
    
    int main(void){
     
     char eingabe[20] = {};
     int quersumme = 0;
     
     printf("Bitte geben Sie ihre Zahlen ein: ");
     fgets(eingabe, 20, stdin);
     
     for(int i = 0; i < strlen(eingabe); i++){
     if(eingabe[i] != '\n'){
     quersumme += eingabe[i] - '0';
     } 
     }
     printf("\nQuersumme: %d", quersumme);
     return 0;
    }
     
  8. 17. Oktober 2013
    Zuletzt bearbeitet: 17. Oktober 2013
    AW: [C] Quersumme aus String auslesen

    Du solltest noch prüfen ob eingabe eine Zahl ist.
    Zudem wäre es sinnvoll strlen(eingabe) auszulagern, da sich die Länge ja innerhalb der Schleife nicht ändert.

    Code:
    for (int i = 0, l = strlen(eingabe); i < l; i++)
     
    1 Person gefällt das.
  9. 18. Oktober 2013
    AW: [C] Quersumme aus String auslesen



    Ja das ist auf jedenfall noch sinnvoll. (Das Überprüfen) Aber ich habe erst seit 3 Wochen Softwareentwicklung und da ist das noch net so tragisch, wenn man das weglässt^^ War eher so, dass ich keine Lust dazu hatte, dass noch schnell zu erweitern.

    Was bringt denn das Auslagern? Was hat man dadurch für Vorteile?

    Ist das:
    Code:
    for (int i = 0, l = strlen(eingabe); i < l; i++)
    und das:
    Code:
    l = strlen(eingabe);
    for (int i = 0, i < l; i++);
    dasselbe?
     
  10. 18. Oktober 2013
    Zuletzt bearbeitet: 18. Oktober 2013
    AW: [C] Quersumme aus String auslesen

    Was bringt denn das Auslagern? Was hat man dadurch für Vorteile?
    Es fällt ein Funktionsaufruf bei jedem Durchgang der Schleife weg.

    Dazu musst du verstehen wie eine Schleife vom Compiler übersetzt wird.
    In der Theorie:

    Code:
    for (int i = 0; i < strlen(str); i++) {
     // weiterer code
    }
    Wird zu: (Achtung: pseudocode)
    Code:
    01 definiere "i" mit dem wert 0
    02 rufe funktion "strlen" mit argument "str" auf und speichere den wert in variable "temp"
    03 wenn der wert in "i" größer oder gleich als der wert in "temp" ist: springe zu zeile 08
    [B]04 lösche die variable "temp"[/B]
    05 ... weiterer code ...
    06 addiere 1 zur variablen "i"
    [B]07 springe zu zeile 02[/B]
    08 beende schleife
    im Vergleich:

    Code:
    for (int i = 0, l = strlen(str); i < l; i++) {
     // weiterer code
    }
    Code:
    01 definiere "i" mit dem wert 0
    02 rufe funktion "strlen" mit argument "str" auf und speichere den wert in variable "l"
    03 wenn der wert in "i" größer oder gleich als der wert in "l" ist: springe zu zeile 07
    04 ... weiterer code ...
    05 addiere 1 zur variablen "i"
    [B]06 springe zu zeile 03[/B]
    07 beende schleife
    In der Praxis hingegen sind Compiler zum Teil schlau genug um solche "Fehler" zu optimieren.
    Dennoch sollte man ein Auge für solche Dinge haben.

    Ist das: ... und das: ... dasselbe?
    Nein.

    Eine for-Schleife erhält einen eigenen lexikalischen Geltungsbereich für die Variablen die du im ersten Statement ( int i = ..., l = ...) definierst.

    D.h.:

    Code:
    // deklaration innerhalb der schleife
    for (int i = 0; i < 10; ++i) {
     // hier exisitiert die variable "i"
    }
    // hier (außerhalb der schleife) existiert keine variable namens "i"
    im Vergleich:
    Code:
    int i; // deklaration außerhalb der schleife
    for (i = 0; i < 10; ++i) {
     // hier existiert die variable "i"
    }
    // hier existiert die variable "i" ebenfalls und belegt weiterhin speicher
     
  11. 18. Oktober 2013
    AW: [C] Quersumme aus String auslesen

    Ah ok, super Erklärung! Ich verstehe nun, wie das gemeint ist.

    Ich wusste davor nichtmal, dass man in einer Schleife mehr als eine Variable initialisieren kann.

    Eine Verständnisfrage habe ich dazu noch.

    Ist diese Aussage richtig, dass der Teil (int i = 0, l = strlen(str); ...) einmalig initialisiert wird?
     
  12. 18. Oktober 2013
    Zuletzt bearbeitet: 18. Oktober 2013
    AW: [C] Quersumme aus String auslesen

    Ich wusste davor nichtmal, dass man in einer Schleife mehr als eine Variable initialisieren kann.
    Das funktioniert generell überall wo ein Komma erlaubt ist.

    Code:
    int a, b, c; // <- deklaration
    int d = 1, e = 2, f = 3; // <- deklaration + initialisierung 
    a = 1, b = 2, c = 3, d = 4, e = 5, f = 6; // <- ausdruck
    Ist diese Aussage richtig, dass der Teil (int i = 0, l = strlen(str); ...) einmalig initialisiert wird?
    Jep.
     
  13. 18. Oktober 2013
    AW: [C] Quersumme aus String auslesen

    Danke für die mehr als ausreichende Unterstützung. Sowas macht Freude!
     
  14. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.