Hallöchen!
Ich habe in der Hilfe von Visual Studio 2005 keine Möglichkeit gefunden, einen String wieder in einen Integer zu wandeln.
Folgendes möchte ich in einem Unterprogramm machen:
Aus dem String, der nur Ziffern enthält die Quersumme berechnen!
Bsp.:
string a ="12345";
Quersumme = a[0].ToInt() + a[1].ToInt() + a[2].ToInt() + a[3].ToInt() + a[4].ToInt();
Leider gibt es den Befehl char.ToInt() nicht (oder ich finde ihn nicht).
Wie kann man das also am einfachsten machen?
Vielen Dank schon mal im Voraus!
Gruß, Martin
Hallo Weyoun,
int.Parse
herbivore
Danke!
Also so?
Quersumme = int.parse(a[0]). + int.parse(a[1]) + int.parse(a[2]) + int.parse(a[3]) + int.parse(a[4]);
Sorry, falls ich jetzt "totalen Müll" verzapft haben sollte. 😁
Hallo
hatte nicht richtig geguckt. Quersumme ist so besser:
int quersumme = 0;
foreach (char ch in a) {
quersumme += ch - '0';
}
herbivore
Ich hab das immer mit
int foo = Convert.ToInt32(str)
gamacht. Wo is da der Unterschied zu parse?
Original von herbivore
Hallohatte nicht richtig geguckt. Quersumme ist so besser:
int quersumme = 0; foreach (char ch in a) { quersumme += ch - '0'; }
herbivore
Oh Gott, mit "foreach" habe ich noch nie zu tun gehabt.
Zudem leuchtet mir der Quellcode nicht voll ein.
Dehalb noch mal die Frage, ob meine Programmzeile weiter oben stimmt (mit den fünf int.parse Wandlungen).
Gruß, Martin
Hallo v1vec,
Convert.ToInt32 ist implementiert als
public static int ToInt32(string value)
{
if (value == null)
{
return 0;
}
return int.Parse(value, CultureInfo.CurrentCulture);
}
Hallo Weyoun,
hast du es mal ausproiert? Es wird sich nicht compilieren lassen, gell? Und nicht nur weil ein Punkt zu viel ist und Parse kleingeschrieben. 🙂
Ich finde meinen Code sehr einfach. Der String wird Zeichen für Zeichen durchgegangen. Bei jedem Schleifendurchlauf steht das aktuelle Zeichen in ch. Um die Ziffer in dem char ch in einen int mit dem Wert der Ziffer umzuwandeln, muss man den Code der Ziffer Null abziehen.
herbivore
Probiert habe ich es und die Quersumme klappt auch, doch verstehe ich wie gesagt den Quellcode nicht ganz (wie die foreach-Schleife genau funktioniert).
Gruß, Martin
PS: Jetzt habe ich etwas mehr verstanden. 😁
moin,
setze einfach einen Breakpunkt und schaue dann mit F11 was passiert.
raik
Original von kiar
moin,setze einfach einen Breakpunkt und schaue dann mit F11 was passiert.
raik
Genau das habe ich vor 30 Sekunden gemacht und somit herausgefunden, wie das ganze funktioniert. 😁
Mal noch 'ne Frage:
Ich habe diese foreach-Schleife nun innerhalb einer While-Schleife eingebettet.
In kurzen Worten: Es soll so lange die Quersumme berechnet werden, bis der Wert "35" erreicht ist.
Leider wird die Variable "ch" nicht bei jedem Durchlauf "genullt", sondern behält den Wert des letzten Schleifendurchlaufes.
Wie kann ich "ch" am besten vor jedem Durchlauf der While-Schleife auf "0" zurücksetzen? Es ist ja eine lokale Variable, die nur innerhalb der foreach-Schleife exisiteirt, doch innerhalb der foreach-Schleife kann ich ja schlecht >>ch = "0"<< schreiben.
Wie mache ich das am besten?
Gruß, Martin
Hallo Weyoun,
ch behält auf keinen Fall den Wert des letzten Schleifendurchlaufs, sondern hat immer den Wert des aktuellen Schleifendurchlaufs. Egal ob das eine while-Schleife drum ist oder nicht.
herbivore
Hi Weyoun!
Mit herbivores Code passiert das nicht. Zeige doch mal den Code (mit dem drumherum). Vielleicht machst du ja einen anderen fundamentalen Fehler. 😉
der Marcel
:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]
static void Main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int quersumme = 0;
string e = "000000000";
while ((a*b*c < 504) | (a==b) | (b==c) | quersumme != 35)
{
if (c < 9)
{
c++;
}
else
{
if (b < 9)
{
b++; c = 0;
}
else
{
if (a < 9)
{
a++; b = 0; c = 0;
}
}
}
d = (100 * a + 10 * b + c) * (100 * b + 10 * c + a) * (100 * c + 10 * a + b);
e = d.ToString();
foreach (char ch in e)
{
quersumme += ch - '0';
}
}
Console.WriteLine("a = " + a + " b = " + b + " c = " + c + "--> abc * bca * cab = " + (100*a+10*b+c)*(100*b+10*c+a)*(100*c+10*a+b));
Console.ReadKey();
}
So ist mein bisheriges Programm und bereits beim zweiten Durchlauf der While-Schleife stimmt der Wert für "quersumme" nicht mehr.
Gruß, Martin
Hallo Weyoun,
was heitß denn, er stimmt nicht? Wie schon von Marcel und mir gesagt, an der eigentlichen Quersummenberechung wird es nicht liegen.
Du meinst jetzt aber hoffentlich nicht:
quersumme = 0;
foreach (char ch in e)
herbivore
Hi Weyoun!
Das liegt nicht am ch sondern an quersumme! 🙂
In er While-Schleife würde ich als erste Anweisung die quersumme 0 setzen, sonst bleibt der vorherige Wert erhalten.
der Marcel
EDIT: Welchem Zweck dient der Algorithmus eigentlich? 🙂
:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]
Alles klar! 🙂
Zum Zweck des Algorithmusses:
Ich bin gerade dabei, ein Rätsel im Knobelforum zu lösen und habe (damit meine Programmierkenntnisse nicht einrosten) ein Programm geschrieben, dass, wenn ich richtig liege, gleich auf Anhieb die korrekte Lösung ermittelt.
Hier der Originaltext des Rätsels:
Eine Sekretärin sollte eine Aufgabe tippen. In der Aufgabe wurde das Produkt von drei dreistelligen Zahlen gebildet, von denen jede die gleichen Ziffern a, b, c enthielten, nur in anderer Reihenfolge: abc, bca, cab. Beim Schreiben des Produkt-Resultats 234532286 unterlief der Fehler, nur die Endziffer 6 ist korrekt, die anderen Ziffern sind durcheinander geraten. Wie lautet das richtige Resultat?
Ich hoffe, ihr haltet mich jetzt nicht für verrückt. 😁
Gruß, Martin
static void Main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int quersumme = 0;
string e = "000000000";
while (quersumme != 35 | e[8]!="6")
{
if (c < 9)
{
c++;
}
else
{
if (b < 9)
{
b++; c = 0;
}
else
{
if (a < 9)
{
a++; b = 0; c = 0;
}
}
}
d = (100 * a + 10 * b + c) * (100 * b + 10 * c + a) * (100 * c + 10 * a + b);
e = d.ToString();
quersumme = 0;
foreach (char ch in e)
{
quersumme += ch - '0';
}
}
Console.WriteLine("a = " + a + " b = " + b + " c = " + c + "--> abc * bca * cab = " + (100*a+10*b+c)*(100*b+10*c+a)*(100*c+10*a+b));
Console.ReadKey();
}
Hmh, ich habe jetzt, da es zu viele Einzellösungen gibt, versucht, in die While-Schleife eine zweite Bedingung einzuarbeiten, nämlich, dass die letzte Stelle des Strings e genau 6 sein muss -> leider gibt es einen Compilierungsfehler, nämlich das der Operator != nicht auf strings angewendet werden kann.
Kann man das trotzdem irgendwie hinkriegen?
Gruß, Martin
Hallo Weyoun,
e[8]!='6'
herbivore
Danke!
Ist schon schlimm, wenn man mehrmals die Woche unterschiedliche Programmiersprachen benutzt. Da haut man dann irgendwann alles durcheinander. 😁
Leider gibt das Programm keine Lösung heraus (irgendwann bricht es mit einer Fehlermeldung ab "Der Index war außerhalb des Arraybereiches")
Kann es daran liegen, dass, wenn der String mal nur 7 oder 8 Zeichen lang ist (kommt vor, wenn relativ kleine 3-stellige Zahlen miteinander multipilizert werden), kein Vergleich der 9-ten Stelle vorgenommen werden kann?
Das wäre sehr schade, da dann das komplette Programm für die Katz' wäre.
Gruß, Martin
Hallo Weyoun,
du musst sowieso nicht den Umweg über den String gehen, um an die Zifferm eines int zu kommen, einfach mit geteilt und modulo.
Beispielsweise (zahl / 1000) % 10 ist die tausender Stelle. Dann bekommst du keine Probleme mit "Der Index war außerhalb des Arraybereiches".
herbivore
hi!
Original von Weyoun
Leider gibt das Programm keine Lösung heraus (irgendwann bricht es mit einer Fehlermeldung ab "Der Index war außerhalb des Arraybereiches")
Die Fehlermeldungen sind doch sehr prägnant und geben einen guten Anhaltspunkt, was schief läuft.
Original von Weyoun
Kann es daran liegen, dass, wenn der String mal nur 7 oder 8 Zeichen lang ist (kommt vor, wenn relativ kleine 3-stellige Zahlen miteinander multipilizert werden), kein Vergleich der 9-ten Stelle vorgenommen werden kann?
Das wäre sehr schade, da dann das komplette Programm für die Katz' wäre.
Nein, du kannst die 9. Stelle nicht prüfen, wenn der String nur 8 Zeichen hat 😉 Du kannst aber prüfen, ob die Stelle existiert. Also ob der Index größer gleich der Länge ist. Wenn dies der Fall ist, kannst du die Schleife mit break; abbrechen. Dein Programm ist deswegen nicht für die Katz.
der Marcel
:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]
Danke für den Tipp! Werde ich für die Zukunft beherzigen!
Gruß, Martin
PS: Die Lösung lautet übrigens "328245326" -> a = 3; b = 9; c = 8