Vollständige Version anzeigen : [C] Quersumme aus String auslesen


s1nu
15.10.2013, 19:46

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:

Geben Sie bitte eine Zahl ein: 2345
Die Quersumme ist 14


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:
#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. ;)

Hardware Preisvergleich | Amazon Blitzangebote!

Videos zum Thema
Video Loading...
MasterJulian
15.10.2013, 20:07

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.


xXsoureXx
16.10.2013, 00:10

;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
integerwert = (int)(s - '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 [I]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. :)


Murdoc
16.10.2013, 03:01

#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;
}


s1nu
16.10.2013, 09:33

#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;
}


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^^


Murdoc
16.10.2013, 10:16

*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:
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 (;;;asciitable~com/)

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.

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;
}


s1nu
17.10.2013, 20:54

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

#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;
}


Murdoc
17.10.2013, 21:07

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

for (int i = 0, l = strlen(eingabe); i < l; i++)


s1nu
18.10.2013, 16:30

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

for (int i = 0, l = strlen(eingabe); i < l; i++)


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:
for (int i = 0, l = strlen(eingabe); i < l; i++)
und das:
l = strlen(eingabe);
for (int i = 0, i < l; i++);

dasselbe?


Murdoc
18.10.2013, 19:44

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:

for (int i = 0; i < strlen(str); i++) {
// weiterer code
}


Wird zu: (Achtung: pseudocode)
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
04 lösche die variable "temp"
05 ... weiterer code ...
06 addiere 1 zur variablen "i"
07 springe zu zeile 02
08 beende schleife


im Vergleich:

for (int i = 0, l = strlen(str); i < l; i++) {
// weiterer 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"
06 springe zu zeile 03
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 (;en;wikipedia~org/wiki/Scope_%28computer_science%29#Lexical_scoping) für die Variablen die du im ersten Statement ( int i = ..;, l = ..;) definierst.

D;h;:

// 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:
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


s1nu
18.10.2013, 20:34

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?


Murdoc
18.10.2013, 20:55

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

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.


s1nu
18.10.2013, 21:44

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

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;


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


Ähnliche Themen zu [C] Quersumme aus String auslesen
  • [Java] ComboBox String Index auslesen
    Hey, hab folgenden Code bis jetzt: Beachtet die ganzen imports nicht :D import java;awt;*; import java;awt;datatransfer;*; import java;awt;event;*; import java;awt;Point; import java;awt;print;*; import java;awt;Toolkit; import java;io;*; import java;net;*; import javax;swing;*; im [...]

  • [Batch/Bash] string auslesen und in txt speichern
    Ich habe eine sehr sehr große liste mit vielen handynummern meiner bekannten und arbeitskollegen, wie kann ich unter windows schnell mit einer batchdatei folgendes machen durchsuche friends;txt , extrahiere alle strings die 11 zeichen lang sind und speicher sie unter handynr;txt unter linux i [...]

  • [C/C++] Textteile mit einem String auslesen
    Moin moin, habe folgendes Problem: Ich habe einen String der max 20 Zeichen lang sein soll. Daraus soll ein Teilstring ausgelesen werden und der ausgewählte Textteil soll in einem neuen String gespeichert werden. Und der User soll entscheiden welchen Texteil er "kopieren" möchte. Nur [...]

  • [Java] string auslesen
    Hallo alle zusammen. Ich muss für die Schule eine Grafische benutzeroberfläche machen welche Euro in Schweizer Franken umrechnen kann. Das designen ist kein problem nur die frage wie ich es schaffe die eingabe in einem Textfeld in eine zahl umzuwandeln, zu berechnen und diese dann wieder als te [...]



raid-rush.ws | Imprint & Contact pr