Zeichenketten
-
hallo!
Nachdem ihr mir das letzte Mal so hilfreich gewesen seid. Wende ich mich nochmal an euch.Haben heute 4 weitere Aufgaben bekommen, drei davon habe ich soweit selbst gelöst. bei einer komme ich leider nicht ganz zurecht ich soll eine Funktion qsumme schreiben, die die Quersumme einer positiven ganzen zahl (Typ unsigned int) berechnet. dabei soll ich folgende Hilfsfunktion benutzen:
string ziffern (unsigned int) // was soll diese Funktion? wandelt sie
// eine Zahl in eine Ziffernfolge
// als Zeichenkette (typ string) um??string ziffern (unsigned int x) {
string res = „“;
while (x > 0) {
res = char (‘0’ + (x – (x / 10) * 10) + res;
x = x / 10 ;
}
return res ;
}- unsigned int ziffernQuer (string), diese Funktion soll die Quersumme einer Zahl berechnen, die in Form einer Zeichenkette von Ziffern-Zeichen übergeben wird. Z.B.:
ziffernQuer (´´312´´) = 6.Diese Funktion soll ich selber schreiben. Und freue mich über jede Antwort.
gruß
v.
-
ziffern(123) liefert einen string mit dem inhalt "123"
insofern kannst du mit string[0] auf 1 zugreifen. nicht vergessen '1' ist ein char, '1'+'2' ist also '3' was aber ungleich 3 ist
-
Original erstellt von Shade Of Mine:
'1'+'2' ist also '3' was aber ungleich 3 istAlso '1' + '2' ist bei mir 'c', habs grade mal ausprobiert weil ich mir da nicht wirklich sicher war.
-
'1' + 2 = '3' oder 1 + '2' = '3'
aber das was shade gemeint hat ist wohl klar
-
unsigned int ziffernQuer(std::string str) { int summe = 0; for (int i = 0; i < str.size(); i++) { summe += int(str[i] - '0'); } return summe; }
-
super! danke! habs verstanden!
-
nice. ich hab noch nie vorher bei diesem initialisierungsparameter von accumulate was anderes als 0 angegeben.
#include<iostream> #include<numeric> #include<string> unsigned int ziffernQuer(const std::string& str){ return std::accumulate( str.begin(), str.end(), -'0'*str.size() ); } int main(){ std::cout<<ziffernQuer("124")<<std::endl; return 0; }
-
ok, wie kann ich ein programm schreiben, das eine positive ganze zahl einliest, ihre Quersumme (mit hilfe meiner gunktion qsumme) berechnet und diese dann ausgibt?
ach ja hab noch eine frage zu folgenden operationen:
i = z.lenght () // was soll das?
c = z.at (p) // und das?
z = z1 + z2; // ok, hier ist z eine verkettung der zeichenketten z1 und z2sind das operationen, die man auf zeichenketten benutzen kann?
gruss
v.
-
übrigens, ich hab mit eurer hilfe die funktion qsumme so geschreiben:
#include <iostream>
using namespace std;
unsigned int quersumme(unsigned int zahl)
{
unsigned int summe = 0;
while(zahl>0)
{
summe += (unsigned int) (zahl - (int) (zahl/10) * 10);
zahl /= 10;
}
return summe;
}int main()
{
cout << "Die Quersumme von 12345 = " << quersumme(12345) << endl;
}entspricht den forderungen meines lehrers, ermeinte zwar, dass eure lösungen durchaus richtig seien, allerdings will er uns wohl seine version aufzwingen.
gruss
v.
-
das sind methoden von string. keine ahnung, warum es length und size gibt. at() ist op[] mit bereichspruefung.
-
deine loesung ist falsch. die (zumindest nach deinen angaben) geforderte signatur war
unsigned int ziffernQuer (string)
-
Original erstellt von virtuel:
**summe += (unsigned int) (zahl - (int) (zahl/10) * 10);
**warum schreibt der meyer in basic v2, wenn er nen c++-compiler hat?
diese zeile ist grottenschlechtes c++.ich drösele auf:
(int) (zahl/10)
aha! das ist in basic v2 int(zahl/10).
int ist dort eine funktion, die abrundet.
in c++ geht übrigens auch int(zahl/10).
zahl - (int) (zahl/10) * 10
war in basic v2 die übliche methode, um die fehlende modulo-funktion zu ersetzen. in neuem basic kann man natürlich mod(zahl,10) oder zahl MOD 10 oder wenigstens zahl-zahl\1010 schreiben.
warum wurde nach int gecastet und nicht nach unsigned int?
summe += (zahl - (unsigned int) (zahl/10) * 10);
so bereitet es doch schon bedeutend weniger schmerz.
welches ergebnis bringt wohl eine division von int durch unsigned int? etwas was vom typ unsigned int?
dann wäre ja das hier korrekt.
summe += (zahl - (zahl/10) * 10);
(zu unsicher, dann nimm doch summe += (zahl - (zahl/10u) * 10u);, und du bist sicher, daß alles unsigned bleibt.)
nutzlose klammern weg nach den regeln "punkt vor strich, gleiches (außer zuweisungen) von links nach rechts, erst rechnen, dann zuweisen".
summe += zahl-zahl/1010;
und jetzt kurz nen fachmann fragen, was immer dieses prozent-zeichen in fremdem code bedeutet.
summe += zahl%10;