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
JOHNY avatar JOHNY 196 Точки

Благодаря за подсещането.

Използвах го, защото ми е познато (от преди пет петилетки) при "Правец 82", а и предполагам имаш идея колко е трудно/невъзможно да изговаряш правилни изречения, когато още сричаш и единичните думи. Не всичко става за един ден и горният код е абсолютно потв ърждение на максимата. Извън това, че съм доволен, че изобщо работи (факт е на 6-7 чаа заигравка и много помощ от гореспоменатите дами и без бъкел познания на материята от моя страна), ще ти бъда благодарен да споменеш и заместителите на "комунистическата команда" goto.

Със сигурност ще бъде полезно не само за мен, а и за останалите "нулокурсници".

Благодаря предварително.

 

1
quickben avatar quickben 966 Точки

всякаква логика която влияе на поведението на програмата замества goto :)

break, continue, if/else if/else, switch

Има лекция относно control-flow logic там е обяснено(мисля, че лекцията се казваше така)

1
DHristoskov avatar DHristoskov 211 Точки

Без претенции, че идеята ми е много добра бих ти дал съвет:

Вместо goto да ползваш do-while  като в while да поставиш условие за спиране на цикъла, когато даните са коректно попълнени,и да преминеш към момента на печатане, по този начиин ще си спестиш писане и ще избягаш от goto.

Също за проверка на некоректни данни (string,double вместо integer )бих ползвал try-catch(System.Format.Exeption).

Незнам дали в конкретния случай не би било удачно да прочетеш Date.Time.Structure по този начин можеш да си спестиш въпроса дали рождения ден е минал или не.

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

като пример мога да ти дам нещо, което направих доста по различно е от твоята задача, но ако се абстрахираш от останалата част от кода можеш да видиш цикъла do-while и try- catch и да схванеш идеята, това е малка игра морски шах.

TicTacToe

 

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