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
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки

честно ли ... я по-добре се върни на pb явно нищо не ис разбрал кое защо и как работят логическите проверки

   age = int.Parse(command[VS1] ); - това работи защото знаеш че ще ти дадат число но то идва като стринг и трябва да го parse-неш да вземеш числото ако не знаеш със сигурност дали е инт ползваш tryparse 

          if ("Christmas" == command)[VS2]  - това дори е кофти проверка ако ти пусна примерно chrismas ще те изгърмя веднага защото тея проверки са case  sensitive c  и C имат различен аscii номер и ще ти счупя проверката.

А защо и какво зависи от самото условие,но без да го дадеш, толкова мога да гадая само

Но да я се върни в pb и почети порешавай,това е толкова ясно че незнам кое е объркващо честно,ако това те обърква какво остава за масивите обхождането им ооп и тн :Д

десетки студенти като теб няма как това да ги прецака,това че ти не си внимавал или не вникваш,е отделна тема,това са просто basic oперации с string...

-3
31/12/2018 16:01:17
fumanbest avatar fumanbest 10 Точки

Moже за Вас да е било ясно веднага. Но за работещ 52 годишен почти дядо като мен, не беше толкова лесно. Но - да, прав Сте - трябва задачи и опит. Аз малко пренебрегнах тези неща. Благодаря Ви !

0
fumanbest avatar fumanbest 10 Точки

Задача 4. Коледни подаръци

Коледа наближава и Иван решава да купи по един подарък на всеки от семейството си. Той си прави списък с хората, на които иска да подари нещо. Това, какъв подарък ще купи зависи от възрастта хората в списъка му:

·         Всички до 16 години, влизат в графа деца и ще получат играчка, а всички останали, се считат за възрастни и ще получат коледен пуловер.

·         Цената на всяка играчка е 5 лв., а цената на един пуловер е 15 лв.

Напишете програма, която пресмята колко души от семейството на Иван са до 16 години, и колко са над тази възраст, също и колко пари ще струват подаръците на децата и възрастните.

Вход

От конзолата се четат поредица от редове до получаване на команда "Christmas":

·         Годините на всеки - цяло число в интервала [1 … 130]

Изход

Да се отпечатат на конзолата четири реда:

·         "Number of adults: {брой клиенти над 16 години}"

·         "Number of kids: {брой клиенти до 16 години}"

·         "Money for toys: {сумата за всички играчки}"

·         "Money for sweaters: {сума за всички пуловери}"

Примерен вход и изход

Вход

Изход

Обяснения

16

20

46

12

8

20

49

Christmas

Number of adults: 4

Number of kids: 3

Money for toys: 15

Money for sweaters: 60

Първият човек е на 16 години, 16 <= 16 -> спада към децата и за него ще бъде закупена играчка на стойност 5 лв.

Вторият човек е на 20 години, 20 > 16 -> спада към възрастните и за нещо ще бъде закупен пуловер на стойност 15 лв.

Вход

Изход

Вход

Изход

16

16

16

16

16

Christmas

Number of adults: 0

Number of kids: 5

Money for toys: 25

Money for sweaters: 0

18

20

48

45

56

37

12

14

Christmas

Number of adults: 6

Number of kids: 2

Money for toys: 10

Money for sweaters: 90

0
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки

ами да пределно ясна е прост while цикъл дори не знам защо си го кръстил command стринга може да е просто input 

аз не бих го написал точно така има и по смислени начини, но да четеш входа и докато не е "коледа" правиш неща и после принтираш нищо сложно и объркващо.

Но ти сам си отговори,на 50 работещ ами да малко ти е късно явно.

Смисъл и аз работя но съм на 35 и само онлайн,но си има причина според статистиката на софтуни около 20-30% да изкарвт до края.Честно казано дори не мисля че някои после ще те вземе на работа,на 50+ без опит и стаж те дори сега се мръщят.Но няма лошо като хоби или интерес.

Честно тая задача е lame дори за домашно по-скоро,къде по кофти неща има, не всеки става това е истината.

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