Konwersja string do int.

0

Przede wszystkim jako nowy użytkownik chciałbym się przywitać. ;)
Od krótkiego czasu uczę się C# z podręcznika "Wstęp do programowania w C# ".
Jednym z zadań jest:
Zadanie 5.8.
Napisz metodę, która oblicza sumę cyfr liczby naturalnej x. W programie głównym wywołaj funkcję dla x wczytanego z klawiatury. Przykładowo jeśli użytkownik wpisze 125, to metoda powinna zwrócić wartość 8 (1+2+5=8).

Z pomysłem na rozwiązanie nie było problemu. Potraktowałem po prostu pobraną liczbę jako ciąg znaków.

namespace Zadanie_5._10_5._8
{
    class Program
    {
        static void SumaCyfr (string liczba)    
        {
            int Suma = 0;
            Console.WriteLine("Liczba cyfr:" + liczba.Length);  // Sprawdzenie czy poprawnie odczytuje liczbę znaków. Jest OK.
            Console.WriteLine("Znak na pierwszym miejscu:" + liczba[0]);       //Sprawdzenie czy poprawnie odczytuje znak. Jest OK.
            Console.WriteLine("Znak na drugim miejscu:" + liczba[1]);
            Console.WriteLine("Znak na trzecim miejscu:" + liczba[2]);
            
            for (int i=0; i<(liczba.Length); i++)
            {
                Suma = Suma + (Convert.ToInt16(liczba[i])); // Problem jest tutaj. Plan był taki, żeby konwertował znak np. "1" do typu int. Jednak po konwersji "1" przyjmuje wartość 49. 
            }
            Console.WriteLine("Suma cyfr liczby {0} wynosi {1}", liczba, Suma);
        }
        static void Main(string[] args)
        {
            string l;
            Console.WriteLine("Podaj liczbę całkowitą.");
            l = Console.ReadLine();                             // Jako przykładową liczbę dałem jak w zadaniu 125.
            SumaCyfr(l);
            Console.ReadLine();
        }
    }
} 

W czym tkwi problem?
Z góry dzięki za odpowiedzi.

2

Możesz zrobić tak:

var number = 125;
Console.WriteLine(number.ToString().Sum(c => int.Parse(c.ToString())));

Parse w wypadku nieprawidłowego ciągu wejściowego wyrzuca wyjątek, ale kiedy robisz najpierw konwersję z prawdziwego inta (tak jak w tym przypadku) to nie powinno stwarzać problemów.
Konwersja, którą zrobiłeś zamienia Ci znaki na decymalną wartość ich kodów ASCII. http://www.asciitable.com/index/asciifull.gif Jedynka posiada kod 49.

Są generalnie dwie szkoły:

  • Jeżeli konwersja będzie dokonywana często o warto do sprawdzenia ciągu użyć metody int.TryParse zamiast posługiwać się wyjątkami. Poniżej wyjątek nie zostanie wyrzucony w przypadku Not a number:
var number = Console.ReadLine();
var result = 0;
if (int.TryParse(number, out result)) Console.WriteLine(number.Sum(c => int.Parse(c.ToString())));
else Console.WriteLine("Not a number!");
  • Jeżeli konwersja będzie wykonywana np. jeden raz, bez jakiejś np. długiej pętli, albo masz pewność, że string jest na pewno liczbą etc... to można polegać na obsłudze wyjątku:
        try
        {
            var number = Console.ReadLine();
            Console.WriteLine(number.Sum(c => int.Parse(c.ToString())));
        }
        catch (FormatException)
        {
            Console.WriteLine("Not a number!");
        }

Generalnie jeżeli masz pewność, że ciąg wejściowy jest prawidłowy to można użyć spokojnie int.Parse. :)

0

Podejrzewam, że w ramach ćwiczenia sam powinienem stworzyć metodę w oparciu o poznane informacje.
Ale dzięki za alternatywne rozwiązanie. Postaram się je przeanalizować i w ogóle zrozumieć.

0

To jest normalna metoda i każdy ją stosuje. W sumie ja stosuje Convert.ToInt32() dla konwersji string -> int i nie wiem która metoda lepsza, bo się C# zajmuje po godzinach w jednej apce którą utrzymuje.

1

@mr_jaro Tylko, że to zwróci kod ASCII w przypadku char, a nie zamieniony char na int :) Jeżeli robimy sumę cyfr to korzystamy z char, a nie ze string.

http://ideone.com/HomUbw

Lepszy przykład z tą samą cyfrą: http://ideone.com/t0xdFv

@maciej91 Żeby u Ciebie konwersja zadziałała to musiałbyś napisać takie coś Convert.ToInt16(liczba[i].ToString()); Tylko, że w żaden sposób nie sprawdzasz prawidłowości ciągu wejściowego.

0

Dzięki @grzesiek51114
W końcu zadziałało tak jak powinno.
A samo sprawdzenie pominąłem, bo po prostu założyłem poprawność wprowadzony danych.
Dzięki za zaangażowanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1