Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zeichenketten

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
07.07.2003, 23:47 Uhr
virtuel



hallo!
Nachdem ihr bzw. du pablo mir das letzte Mal so hilfreich gewesen seid/bist. 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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.07.2003, 01:01 Uhr
Pablo
Supertux
(Operator)


Was string ziffern (unsigned int); macht ist einfach.

Die Funktion liefert ein String zurück und als Parameter soll eine ganzahlige Zahl (int) ohne Vorzeichen weitergegeben werden. D.h. das Vorzeichen spielt hier keine Rolle.

Diese Funktion wandelt alle Zahlen in string, aber ich kann diesen Code nicht kompilieren.
Ich schlage folgendes vor: benutze nicht strings oder chars für sowas, es ist nur kompliziert, mit ints geht es viel einfacher.

Die Funktion unsigned int ziffernQuer (string) addiert die String und gibt als int ohne Vorzeichen zurück. Sei s ein string (string s = "irgendwas"; )
Um die Länge zu bestimmen s.size() aufrufen. Um auf den ersten Buchstabe zugreifen zu können s[0] und auf den letzten s[s.size() -1] aufrufen.

Hier meine Lösung:

C++:
#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;
}



Die interessanteste Stelle ist:

Code:
while(zahl>0)
    {
        summe += (unsigned int) (zahl - (int) (zahl/10) * 10);
        zahl /= 10;
    }


Weil alle nur ints sind, folgt, dass wenn du durch 10 teilst, verschwinden die Nachkommastellen.
Also, 123 / 10 = 12. (1)
Ich will die 3, also gilt 123 - 12 * 10 = 3, oder?
Ich mache casting (int) obwohl es nicht notwendig ist, aber ich tue es damit es eindeutiger für dich ist. Danach tue ich zahl /= zahl, was das selbe ist wie: zahl = zahl / 10. Also 123 / 10 = 12
Und da Zahl 12 ist, können wir weiter machen, bis wir irgendwann am Schluss gelangen. Dann haben wir eine Division von einer Zahl die kleiner als 10 ist, also ist x / 10 = 0, für alle x = {0, ..., 9}

Nachtrag (1)
Das passiert so, wegen der "eager evaluation" von C++. Es gibt wesentlich 2 verschiedene Formen zu "parse" (mir ist kein deutscher Begriff bekannt) (Sytanxerkennung, Pattern Matching, usw.). C/C++ und die meisten OOP (Obejct Orientiert Programming) Sparchen erkennen die Syntax genauso wie wir es in der Realität tun würden. Wir lösen die Klammern, die am tiefsten stehen. Dann ist (a / b) * b nicht unbedingt a, wenn a und b Fließkommazahlen (nie von Pentium Bug gehört?)
Es gibt eine andere Strategie, leazy evaluation, die wird von Funktionalen Sprachen benutzt (bsp. Haskell, Dr. Scheme) und sie machen genau das Gegenteil. Die Klammern die am tiefsten stehen, werden am Schluss erkannt. Unter Umständen kann dies besser sein, aber auch nicht. Zum Beispiel: mit C++ kannst du keine unendlichen Listenerzeugen und daraus die erste 10 Elemente ausgeben. In Scheme oder Hasell schon!
Wenn du diesen Teil nicht verstehst ode wenn es nicht interessant für dich ist, mach ja nix, denn das lernt man später, wenn man sich mit Funktionellen Sprachen. Ich wollte nur erklären, wieso (a / b) * b != a für Fließkommazahlen ist.

Ich hoff, das hilft dir.

@beefy: PS: Weißt du was casting ist?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 08.07.2003 um 01:21 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.07.2003, 19:33 Uhr
~viruel
Gast


nein in diesem zusammenhang weiss ich nicht was casting ist.

sag mal kann ich diese gefordertefunktion auch so schreiben?

unsigned int ziffernQuer(std::string str)
{
int summe = 0;

for (int i = 0; i < str.size(); i++)
{
summe += int(str[i] - '0');
}

return summe;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.07.2003, 19:49 Uhr
Pablo
Supertux
(Operator)


Du hast aber einen kleinen Fehler gemacht,


Code:
summe += int(str-'0');



str ist ein String und str - int ist nicht zulässig. Was du machen musst ist str[ i ], dann gibt str[ i ] (wenn ich mich nicht irre) ein char zurück und dann kannst du das machen. Sonst würdest du n * str als Ergebnis bekommen, falls du keinen Compiler Fehler bekommst.

---------------------------------
Casting ist genau das selbe wie int(str[ i ] - '0')
D.h. Das Ergebnis der Rechnung wird in (datentyp) umgewandelt.

Bsp: int ascii_a = (int) 'a';
'a' wird in int umgewandelt.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.07.2003, 19:51 Uhr
virtuel



ok, hab verstanden! danke!

wie kann ich ein programm schreiben, das eine positive ganze zahl einliest, ihre Quersumme (mit hilfe meiner funktion 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 z2

sind das operationen, die man auf zeichenketten benutzen kann?

gruss
v.

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.07.2003, 19:55 Uhr
Pablo
Supertux
(Operator)


z.size() und z.length() sind äquivalente Funktionen
Ich weiß es nicht, ob es z.at(p) gibt. Wenn ich mich an Java richte, dann ist ganuso wie z[p], d.h. das char Element an der p. Stelle

z = z1 + z2; ist richtig und man kann sie benutzen.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.07.2003, 20:39 Uhr
virtual
Sexiest Bit alive
(Operator)


Ja, es gibt auch für std::string ein at. Der Unterschied zwischen op[] und at ist der, daß bei at ein Rangecheck gemacht wird und ggf. eine Exception geworfen wird, bei op[] wird kein check gemacht. Daher sollte man at() nur anwenden, wenn man sich unsicher ist, ob der Index korrekt ist, weil at() langsamer ist.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: