Софтуерно Инженерство
Loading...
JOHNY avatar JOHNY 197 Точки

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
Основи на програмирането 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