Loading...
JOHNY avatar JOHNY 196 Точки

Homework-Introduction-to-programming-Problem-15-Age-after-10-Years - Шантаво решение

Здравейте,

Преди да Ви покажа какво сътворих днес (с невероятната помощ на Пенка за първата част и Катя в продължението - благодаря Ви дами!) искам да уточня, че решението е далеч от зададеното.

Реших да си развинтя фантазията и си създадох мислен алгоритъм за различните ситуации. Казвам мислен и вероятно неясен, защото Пенка днес бая ококорено ме гледаше докато обяснявам, а Катя, която ми помагаше през останалото време каза (цитирам "Работи! Сега разбрах какво си имал предвид!").embarassed

 

Накратко програмката прави следното:

1. Поздравява потребителя и му задава дежурния въпрос за годинките му към днешна дата.

2. Прави проверка дали не е въвел текст и ако е така го връща с междинно текстово съобщение.

3. При въвеждане на число се правят няколко проверки:

  • Ако е в диапазона от 0 до -39 извежда текстово съобщение А (с текст естествено, А е за да Ви е по-лесно да го разберете) и го връща за корекция.
  • Ако е в диапазона от -40 до - колкото успее да понесе (не ми остана време да разуча как да не е int) извежда текстово съобщение Б и го връща за корекция.
  • Ако е в диапазона от 1 до 7 извежда текстово съобщение В и го връща за корекция.
  • Ако е в диапазона от 90 до 100 извежда текстово съобщение Г и го връща за корекция.
  • Ако е над 101 извежда текстово съобщение Д и го връща за корекция.

4. След коректно зададено число за възрастта пита дали вече е имал ЧРД през текущата година. Задават се Y или N като коректни отговори.

  • Прави се проверка дали е въведено Y или N и ако символа е различен го връща за корекция.
  • Ако е въведено Y се задава стойност 0 на конкретна променлива.
  • Ако е въведено N се задава стойност 1 на конкретна променлива.

Идеята на променливата е, че ако пресмятаме за след 10 години примерно, но потребителят ДНЕС все още не е имал ЧРД през тази година, то след тези 10 години той ще е на възраст X, но в края на годината ще е на (X+1). Реших да изведа и двете възможности като резултат - все пак човека одъртява и заслужава уважение, нали?tongue-out

5. Пита се потребителят за какъв диапазон иска да пресметнем.

  • Прави се проверка дали е число, извежда се текстово съобщение ако НЕ е така и го връща за корекция.
  • Прави се проверка дали не е въвел число над 100 (примерно съм го избрал) и се извежда текстово съобщение ако е така (продължава напред).

6. Пресмятат се годините и се извеждат съобщения за:

  • При вече празнуван ЧРД се извежда съобщение "Ще бъдете на Х години"
  • При предстоящ ЧРД се извежда съобщение "Ще бъдете на (X+1) години"

7. Изпращаме го с блага дума и туй-то.

 

Недостатъци:

1. Не ми остана време да се заиграя и да избягам от int. В момента може а се въведе 7848745563.

2. След като добавих кода в pastein усетих, че съм пропуснал да направя проверка за отрицателни стойности да пресмятане "след колко години". В момента е възможно човек да се "подмлади".

3. Кода не е приемливо подреден по две причини. Веднъж, защото го писах в dotnetfiddle.net r го прехвърлях през уърд от комп на лаптоп, че санмо на лаптопа съм със 7-а и Visual) и втори път, защото съм новобранец и нямам достатъчно култура за да го правя грамотно. Вероятно в началото не съм упоменал всички променливи (търпяха развитие докато си играех и развивах идеята). Ще го поправя.

Първият недостатък ще го реша с Ваша помощ или ще се разровя за кодове, а вторият ще го оправя още утре (умирам за сън, но нямах търпение да го пусна и събера съвети).

 

И така - моето недоразумение можете да видите ТУК и Ви моля да тествате с:

1. "На колко години сте сега" - стойности като -41,-30,0,3,91,101 (има ограничения от минус безкрайност до -40, от нула до -40, от 0 до 7, от 7 до 90, от 90 до 99, над 100), текст вместо числа.

2. "Имахте ли вече рожден ден" - вместо Y или N каквото си изберете.

3. "Имахте ли вече рожден ден" - варианти Y и N и техните производни.

4. "След колко години искате да пресметна...?" - под 100, над 100 (подсещам, че отрицателните числа се приемат, а не трябва)

 

Приемам всякакви критики и съвети, защото както споменах по-горе - това ми е сефтето със C# и със сигурност има пропуски и недостатъци. Ако съм пропуснал нещо от описанието - извинявайте, бая е късничко, а и десетина часа пред компа в учене на новости със сигурност са ми дошли в повече.

 

Благодаря предварително на отзовалите се!

 

 

2
Programming Basics 05/04/2015 01:17:10
Petya:
Дублирана тема: https://softuni.bg/Forum/179/Homework-CSharp-Basics-Introduction-To-Programming-Problem-15-Age-after-10-Years
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Здравей пак Иване :)

Програмата ти е много амбициозно направена, вярно е че казах "Работи! Сега разбрах какво си имал предвид!" :)

На първо място - личи си че си учил друг програмен език преди. Имаш ясното разбиране какви проверки за инпут са необходими. Валидация на данни в книгата Въведение в програмирането на господин Наков се обсъжда за първи път в глава 9 Методи. А според това, което видях в лекциите на предишните курсове C# Basics ниво 0 - методи се преподават чак преди самия изпит, в C# Advanced Topics 1 & 2.

Сега конкретно на въпроса:

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

В C# наистина съществуват по-добри варианти за многократно изпълнение на един блок от код, такъв блок от код всъщност представлява метод, който извършва определена функция - затова може такъв блок от код да се дефинира като метод, и да се извиква там, където ни потрябва, толкова пъти колкото ни потрябва.

Фактът че си използвал goto в случая помага, защото означава че ти е ясно, че има код който ти е необходим многократно - и остава само да приложиш извикването на този код (сега ще се казва метод) по нов начин, но по принцип - в същите случаи, в който вече си преценил че ще го извикваш.

На този линк направих нов вариант на твоята програма, съвсем леко променен - закоментирала съм всеки goto statement и съм го замeнила с извикване на метод. И всъщност цялата валидация е с

        do 
        {
            AskForAge(out AgeNowStr, out AgeNow, out isNumber);

        } while (!isNumber || AgeNow < 7 || AgeNow > 98);

и сега според диапазона в който се намира подаденото число - печатаме различни съобщения, но самото извикване на метода отново е само в една точка - ако (!isNumber || AgeNow < 7 || AgeNow > 98).

На този етап ти е малко рано самостоятелно да съставяш методи - но ако ползваш Visual Studio - всеки път когато видиш в програмата си блок от код, който искаш да извикаш многократно - само го маркирай, десен кликм избери Refactor, Extract Method, и само дай име на метода - както сега правиш с goto стартовите точки - и Visual Studio ще ти дефинира метода, под основния Main() метод, ще го извика на мястото на маркирания блок от код - и после този начин на извикване на метода можеш да си го приложиш и в други точки на програмата.

If/else конструкциите ти работеха почти безупречно още в оригиналния код, направих там много малки подобрения - идеяата е да се спазва точно поредицата if/ else if /else - тъй като в отсъствие на goto те отчасти поемат функцията да контролират program flow.

Например в този блок от код:

          if (BirthdayAlready == "Y") // Проверяваме дали е натиснал Y //
......
          if (BirthdayAlready == "N") // Проверяваме дали е натиснал N //
......
          else
         {
              Console.Write("Изрично упоменах Y или N! Я, да опитаме пак дали познаваш буквите!"); // Подсещаме го, че трябва да натисне Y или N //
              goto AskBirthAgain; // И го връщаме обратно //
          }

понеже имаш if (програмата влиза тук и проверява), после имаш втори if (програмата е длъжна да влезе във всеки if, и дори импута да е бил Y, пак проверява за N, не е N, така че отива в else и го изпълнява!)

Все едно ако не не N, не е коректен инпут - за да избегнеш това - спазвай if/ else if (второто)/ else конструкцията.

Още веднъж, поздравления за толкова професионалната ти C# програма!

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