Loading...
misho_999 avatar misho_999 6 Точки

Задача "02. Vapor Store"

Здравейте колеги,

Искам да помоля за малко помощ относно следната задача. Judge ми дава 20/100, а тествайки трите примера от задачата изглежда, че работи но явно само така изглежда след като Judge не е съгласен :)

https://pastebin.com/WeUeihMQ

тук е условието:

https://judge.softuni.bg/Contests/580/CSharp-Basics-More-Exercises

 

Тагове:
0
Programming Fundamentals
Vesso1980 avatar Vesso1980 486 Точки

Здравей колега, имаш малка грешка, която води до големи загуби на проценти :). Проблемът е в променливата priceGame, защото я инициализираш преди while цикъла. Инициализирай я вътре и ще ти даде 100%. 

0
misho_999 avatar misho_999 6 Точки

Много благодаря колега, така се получава!

Икам да попитам какво се променя в алгоритама, че след като се инициализира вътре в  while цикъла дава 100/100, а извън него 20/100. Немога да схвана самият смисъл?

Също така искам да попитам ако ми дава грешки в тестовете след нулевият като 2, 3, 4 и т.н как мога да разбера къде ми е грашката. Има ли някакви насоки към които мога да се ориетирам къде да си търся грешката?

Сигурно за много хора въпросът изглежда глупав, но весе още съм минал сам Basics и явно знанията ми не са достатъчни да си го обясня.

0
24/03/2018 11:27:15
Vesso1980 avatar Vesso1980 486 Точки

Ами разликата е в това , че когато я инициализираш преди while тя може да си пази стойността при различните итерации, ако не се промени вътре в цикъла. Какво имам предивд: задаваш стойност 0 преди цикъла, после влизаш в цикъла и на първото завъртане задаваш друга цена (примерно 39.99) на конкретната игра. После идва второто завъртане на цикъла, но този път играта, която ти задават не съществува и ти изобщо не влизаш в switch условията, където променяш цените и така променливата си пази пак 39.99 и по-надолу където проверяваш if (currentBalance < priceGame)  ->  Console.WriteLine("Too Expensive"), ако балансът ти е под 39.99 ти изписва Too Expensive, без да е съществувала играта. Докато ако я инициализираш вътре в цикъл, на всяко повторение ще се инициализира с 0. 

Ако все пак държиш променливата да ти живее извън цикъла то в default условието на switch трябва да и зададаваш

priceGame = 0.0, за да имаш промяна на цената във всички ситуации. По принцип, когато използваш една променлива само в конкретния {scope} и няма да ти трябва стойността и след това, то по добре си я инизиализирай вътре. Същото важи и за другата ти променлива nameGame, няма смисъл да я инициализираш предварително string nameGame = null и после да я четеш в цикъла. По-добре е направо в цикъла string nameGame = Console.ReadLine();, за да не ти носи старата стойност в новото завъртане.

1
misho_999 avatar misho_999 6 Точки

Вече зацепих :), още веднъж благодаря за подробното обяснение!

0
IvanTs avatar IvanTs 4 Точки

някой може ли да ми обясни какво прави return; в while цикъла ... че немога да го разбера на английски като го прочета ... видях че си го използвал за това питам. Мерси!

0
TeMePyT avatar TeMePyT 142 Точки

return; се използва за приключване на програмата. Примерно изпълнило ти се е някакво условие и не ти трябва да върти другите простотии.

0
Vesso1980 avatar Vesso1980 486 Точки

Return; сам по себе си слага край на текущия метод или функция и ако има код след return то той не се изпълнява. Ако текущия метод е Main() то тогава програмата приключва. Също ako методът не е void той трябва да върне стойност от предварително зададен тип. Примерно в случая по долу трябва да върне int

public static int calculateSum(int a, int b){
return a + b;

}

И извикваме метода с .

int result = calculateSum(5, 10);

result = 15;

По принцип от циклите се излиза с break; и не е много добра практика да се използва return много често, освен ако неможе да се сетим за друг вариант.

0
IvanTs avatar IvanTs 4 Точки

O.o мисля че ще го схвана по- нататък ... засега ще си ползвам брейк за излизане и континю за пропускане :А

0
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки

е то няма какво толкова за схващане break чупи цикъл но не връща нищо. continue пропуска едно завъртане на цикъла return чупи цикъла като  break,но връща и стойност ако се наложи. другия оператор за цикли е goto но тои рядко се ползва. Общо взето как ще счупиш цикъла няма значение,по конвенция с break e ок no нищо не пречи примерно да го счупиш и return и да върнеш и променливата всичко зависи от това какво се иска. Както в swith case чупиш след всеки case с break но може и с return. 

това което и трябва да знаеш е че break просто чупи а return може да връща и value type

0
IvanTs avatar IvanTs 4 Точки

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

0
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки

да въпрос на навик е, return ще го ползвате повече като започнете да работите и пишете методи,а continue не чупи цикъла е прескача моментната итерация и продължава с следващата. примерно  пускаш цикъл от 0-10 да ти печата само нечетните числа и правиш една проверка дали i%2==0 и ако е така му казваш continue и минаваш направо на следващата итерация и реално ако ги пускаш на конзолата ще получиш само 1 3 5 7 9 другите си ги прескочил. Д Внимателно къде и какво чупиш те сега нещата са простички ама по нататък става опасно къде и какво се итерира или прекъсва :Д

0
IvanTs avatar IvanTs 4 Точки

дано да стигна та да видя :)

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