Loading...
fumanbest avatar fumanbest 10 Точки

Конвертиране на стринг към интегер в C#

Уважаеми колеги,

при изучаване на PB за C# или Python лично аз стигнах до заключението, че или наистина не съм внимавал на лекциите( понеже съм онлайн), или просто много малко е било застъпено конвертирането на стринг към интегер. Моята истина е (когато се разрових в упражненията и видеата), че обясненията са доста повърхностни, много малко на брой, бързи и за мен най-вече недостатъчно ясни. Тук пускам една задача, на пръв поглед наистина лесна за сглобяване. Реших я след около 4 часа стъкмяване, четене на примери от stackoverflow и яки псувни наум. Но минава на 100 % в Judge . На основата на подобна трудоемкост, не реших и една или две задачи от два изпита - C# и Python. 

Предлагам за подробен коментар тази тема, понеже това може директно да прецака десетки кандидат-студенти като мен. И моля, който се включи да не ни препраща към сайтове, а да пуска всички обяснения тук.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace Christmas_Gifts

{

    class Program

    {

        static void Main(string[] args)

        {

            string command = Console.ReadLine();

            int age = 0;

            int toyPrice = 5;

            int sweaterPrice = 15;

            int count16 = 0;

            int countAbove = 0;

            int toysMoney = 0;

            int sweaterMoney = 0;

            while (command != "Christmas")   

            {

                age = int.Parse(command[VS1] );

                if (age <= 16)

                {

                    count16++;

                    toysMoney += toyPrice;

                }

                else

                {

                    countAbove++;

                    sweaterMoney += sweaterPrice;

                }

                command = Console.ReadLine();

                if ("Christmas" == command)[VS2] 

                {

                    break;

                }

            }

            Console.WriteLine($"Number of adults: {countAbove}");

            Console.WriteLine($"Number of kids: {count16}");

            Console.WriteLine($"Money for toys: {toysMoney}");

            Console.WriteLine($"Money for sweaters: {sweaterMoney}");

        }

    }

}


 

1.        [VS1] Защо е възможно стрингът да е в скобите, без да даде грешка ?

 

2.        [VS2] Защо е направо задължително command да е равен на Console.ReadLine, а не просто на две кавички - (” ”) ?

3.        И защо command е именно най-отдолу, а не някъде другаде из кода ?

 

 

      Моля да коментирате кода !

Моля също да коментирате защо кодът в зелено е правилно да е точно така, а не например string command да е равен само на две кавички - (" "). Идеята на Вашия коментар е да затвърди моите и на десетки други колеги познания за тънкостите (бих казал пенизите) за  конвертирането или дори може би "смесването" на стринг с интегер. И кога се налага това ? А и всъщност, как може да се заобиколи, ако може ?

 И най-вече - весела Нова година !

 

Тагове:
-2
Важни съобщения 31/12/2018 14:55:16
kostanikolov avatar kostanikolov 45 Точки

/ 2. Защо е направо задължително command да е равен на Console.ReadLine, а не просто на две кавички - (” ”) ? /

Колега, не си дал условие на задачата, но това което виждам е, че има while цикъл, и съответно "n" на брой команди (не се знае колко точно ще бъдат те). Съответно command = " "; няма да ти се получи, понеже нали трябва с Console.ReadLine() да си прочетеш всеки вход (команда) от конзолата. while (command != "Christmas") работи като проверка, дали командата е някакво число или стринг и дали този стринг не е "Christmas", Ако е "Christmas" ("Christmas" != "Christmas") while цикълът приключва - връща false, защото са еднакви, не са различни. Следователно тази проверка if (command == "Christmas") { break; } е напълно излишна, понеже while (command != "Christmas") се грижи за тази проверка.

 

/  3. И защо command е именно най-отдолу, а не някъде другаде из кода ? /

Кодът се изпълнява ред по ред. Съответно когато си вътре в цикъла, след като се изпълнят всички редове, преди да започне следващата ротация се иска да се прочете новата команда от конзолата и това се случва точно преди да се провери дали не е "Christmas". Както споменах, ако е "Christmas" цикълът не се изпълнява, ами приключва.

 

/  Защо е възможно стрингът да е в скобите, без да даде грешка ? /

Този въпрос не го разбирам, за кой стринг говориш и кои скоби?

0
fumanbest avatar fumanbest 10 Точки

За command в age = int.Parse(command);

1
kostanikolov avatar kostanikolov 45 Точки

int.Parse( ) \ тук в скобите се подава някакъв стринг, който ти очакваш със сигурност да е някакво число \ "33" "44" "69" и т.н. Ако command = "Christmas" и подадеш command на int.Parse(command) тогава ще гръмне, защото ти се опитваш да преобразуваш стринга Christmas в число, което е невъзможно. А когато подадеш да кажем "33" в int.Parse( ) този стринг "33" става на числото 33 (без скобичките) в случаят int

0
fumanbest avatar fumanbest 10 Точки

В случая, както виждате нямаме числа. Но няма и гръмване. Мисля, че ми гърмеше, когато аge от условието беше = на Console.ReadLine, a не на 0, както съм го изписал аз. И всъщност в цикъла става връзката между age и command.

0
kostanikolov avatar kostanikolov 45 Точки

Как така нямаме числа?!

16

20

46

12

8

20

49

Christmas

Това е примерен вход... Мисля, че има нещо генерално, което не сте разбрали. Всяко число, което съм показал, се подава като стринг от конзолата към int.Parse() и от string то става на int age...

0
fumanbest avatar fumanbest 10 Точки

Ааа, точно това не съм го бил доразбрал. Знаех , че всичко е стринг, но превръщането съм го пропуснал. Весела Нова година !

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.