Laden...

Int.ToString() -> aber rückwärts, wie?

Erstellt von Weyoun vor 17 Jahren Letzter Beitrag vor 17 Jahren 5.622 Views
W
Weyoun Themenstarter:in
71 Beiträge seit 2006
vor 17 Jahren
Int.ToString() -> aber rückwärts, wie?

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

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Weyoun,

int.Parse

herbivore

W
Weyoun Themenstarter:in
71 Beiträge seit 2006
vor 17 Jahren

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. 😁

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo

hatte nicht richtig geguckt. Quersumme ist so besser:


int quersumme = 0;
foreach (char ch in a) {
   quersumme += ch - '0';
}

herbivore

V
52 Beiträge seit 2006
vor 17 Jahren

Ich hab das immer mit

int foo = Convert.ToInt32(str)

gamacht. Wo is da der Unterschied zu parse?

W
Weyoun Themenstarter:in
71 Beiträge seit 2006
vor 17 Jahren

Original von herbivore
Hallo

hatte 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

49.485 Beiträge seit 2005
vor 17 Jahren

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

W
Weyoun Themenstarter:in
71 Beiträge seit 2006
vor 17 Jahren

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. 😁

K
231 Beiträge seit 2005
vor 17 Jahren

moin,

setze einfach einen Breakpunkt und schaue dann mit F11 was passiert.

raik

W
Weyoun Themenstarter:in
71 Beiträge seit 2006
vor 17 Jahren

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. 😁

W
Weyoun Themenstarter:in
71 Beiträge seit 2006
vor 17 Jahren

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

49.485 Beiträge seit 2005
vor 17 Jahren

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

564 Beiträge seit 2006
vor 17 Jahren

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 😁 :]

W
Weyoun Themenstarter:in
71 Beiträge seit 2006
vor 17 Jahren
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

49.485 Beiträge seit 2005
vor 17 Jahren

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

564 Beiträge seit 2006
vor 17 Jahren

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 😁 :]

W
Weyoun Themenstarter:in
71 Beiträge seit 2006
vor 17 Jahren

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

W
Weyoun Themenstarter:in
71 Beiträge seit 2006
vor 17 Jahren
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

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Weyoun,

e[8]!='6'

herbivore

W
Weyoun Themenstarter:in
71 Beiträge seit 2006
vor 17 Jahren

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

49.485 Beiträge seit 2005
vor 17 Jahren

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

564 Beiträge seit 2006
vor 17 Jahren

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 😁 :]

W
Weyoun Themenstarter:in
71 Beiträge seit 2006
vor 17 Jahren

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