зад. 04.Cat Food [Programming Basics Online Exam] - 16 and 17 June 2018
Някой може ли да открие грешка в това решение, аз определено зациклих...
Judge ми дава 70/100, а виждам че все пак има и такива със 100/100
Или има грешни тестове... , а тези със 100/100 са трейнърите...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CatFood
{
class Program
{
static void Main(string[] args)
{
int numbOfCats = int.Parse(Console.ReadLine());
int catCounter = 1;
int group1 = 0;
int group2 = 0;
int group3 = 0;
double totalFoodWeightGrams = 0;
while (catCounter <= numbOfCats)
{
double foodWeightInGrams = double.Parse(Console.ReadLine());
totalFoodWeightGrams += foodWeightInGrams;
if (foodWeightInGrams >= 100 && foodWeightInGrams < 200)
{
group1++;
}
else if (foodWeightInGrams >= 200 && foodWeightInGrams < 300)
{
group2++;
}
else if (foodWeightInGrams >= 300 && foodWeightInGrams <= 400)
{
group3++;
}
catCounter++;
}
double priceForFood = (totalFoodWeightGrams / 1000) * 12.45;
Console.WriteLine($"Group 1: {group1} cats.");
Console.WriteLine($"Group 2: {group2} cats.");
Console.WriteLine($"Group 3: {group3} cats.");
Console.WriteLine($"Price for food per day: {priceForFood:F2} lv.");
}
}
}
Значи от това F2 идва грешката така ли ...
не разбирам значи не е дообяснено в условието както трябва
как би трябвало да се сетя за такова нещо ако ми се падне подобна задача на изпит
F2 само реже, а с Math.Floor(priceForFood * 100) / 100 закръгляш до втория знак.
Здравейте,
При мен също се получават 70/100 точки. Аз също съм позлвала F2, за да закръгля до втория знак както е в условието. Когато опитам с Math.floor ми дава 0 точки, което очаквах понеже доколкото съм запозната Math.Floor закръгля към по ниското число резултата, а това съответно го променя. Моля за малко помощ и благодаря предварително!
Линк към кода: https://pastebin.com/ptHUmv9D
нормално е да дава грешка с math.floor закръгля на по долното число.. за да закръглиш до втория знак ти трябва math.round колегата е малко се е объркал
казваш му math.round(x,2) и толкова като х-ти е променливата. няма го условието затова не мога да коментирам повече. Но има съществена разлика между това какво прави math.floor и math.round :Д
ето тук кое как се закръгля е важно. но без условието толкова.
С добавянето на този ред си става 100/100
moneyForFood = Math.Round(moneyForFood * 100) / 100;
Колегата е прав, че в случая е Math.Round.
Здравейте,
Много Ви благодаря за съветите! Помогнахте ми и си взех 100те точки :)
Колега @TeodorStefanovPld аз съм постнал моето решение при задаване на въпроса още в началото, можеш ли да кажеш защо с F2 не взимам 100/100,
а с добавянето на priceForFood = Math.Floor(priceForFood * 100) / 100; преди последния Console.WriteLine.... ги вземам
Ето и условието на задачата: https://softuni.bg/downloads/svn/programming-basics/2018-04/Exam/Problem%2004-CatFood.pdf
защото ето тук не взимаш math.round и ти се получава число говорим за първия ви нулев пример 17.728 и от това като вземеш f2 ще върнеш 17.72 a те искат 17.73
а с мath.round с# компилатора автоматично ще го направи 17.73 защото знае че трябва да закръгли до втория знак при тази math функция., а това колегата което е показал общо взето правиш едно математическо преобразование на 2та знака след 10тичната запетая с това умножение и деление на по 100. и затова ти се получава.
Дали е правилно чисто математически е ок. но от гледна точка на код при положение че имаш готови неща от ms. Както винаги ни казват на лекции ползвайте служебните неща и класове когато е възможно тогава ако има проблем няма да идва от логиката а от този които доставя ide-то за работа. и 2та варианта работят въпрос на преценка аз гледам да пиша изчистен код ще го напиша с Math.round и ако случайно гърми тогава ще кажа fuck off така работят дадените ми инструменти оправяйте се.
Бтв тая грешка се хваща относително лесно. реално ако са ти минали нулевите по големите числа явно ги закръгля но при 17.75 17.74 примерно там е изгърмяло за да имаш 70/100 защото не помня как компилатора точно закгръляше май при 4 надолу при 5 нагоре но това е липсата на закръглянето при priceoffood
Извинявай колега @TeodorStefanovPld ,
но точно нулевите тестове ми минават всички и примера който даваш че при 17,7288 с F2 не връща 17,72 а 17,73.
Т.е. до колкото съм запознат начинът на действие на Fxx, където хх е 0-99 при примера с F2 кодът зад F2 създава нов стринг като проверява третата цифра в числото което се форматира (т.е.първата която е извън скоупа на зададеният precision specifier - в случая 2) ако е 5 и повече закръгля във стринга втората цифра на горе, а ако е под 5 не я променя...
Разчитайки на тази логика съм построил и решението си но явно според мен който е сътворил задачата е направил тестовете да разчитат по някакъв начин на Math.Round() и за това получавам гръм на три от тях...
Както и да е смятам проблема за решен тъй като все пак успях да си взема 100/100, но по важното е че заради него се позарових в нета и научих нещо ново за мен.
Благодаря на всички който ми отговориха и се опитаха да ми помогнат.
Успех на предстоящия изпит!
@markovood
И аз това се чудя, каква е разликата между Math.Round(priceForFood, 2) и {priceForFood:F2} като и двете закръгляват до втория знак след десетичната точка и използват един и същи метод за закръгляване.
Разликата е всъщност много дребна и не се усеща на пръв поглед а именно
при Math.Round(priceForFood, 2) реално закръгляш дадената double променлива в скобите до втория знак в случая, а
при {priceForFood:F2} кодът зад F2 създава нов стринг в който се записват указания брой знаци след точката като последният от тях се закръгля но само в стринговата репрезентация, оригиналната double променлива остава не променена което ЛИЧНО СПОРЕД МЕНЕ не би трябвало да влияе в контекста на тази конкретна задача тъй като никъде не ползвам променливата след като съм я отпечатал форматирано...
Надявам се това обяснение да е разбираемо...
Е, не е точно така. Math.Round връща закръглената стойност и в случая ти просто я присвояваш на същата променлива, затова се променя стойността на priceForFood. А в другия случай се вика priceForFood.ToString(). Както и да е.
Затова казвам, че разликата е всъщност много дребна и не се усеща на пръв поглед...
Math.Round(); е метод който връща стойност от тип който е същия като този който си подал (double, decimal и т.н.), докато форматирането е операция върху стринг, т.е.работи със стрингове, връща стринг...
с други думи не можеш да използваш форматиране за да извършиш операцията закръгляне на число
За judge е важно какво ще отпечаташ (демек стринга), а не как си стигнал до него!!!
виж тук за справка: https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings#FFormatString
И в двата случая се извършва форматиране (и закръгляване) за да се получи изходния стринг.
В примера който си дал, ако използваш Math.Round ще получиш абсолютно същия резултат. Пробвай това
Човек ти си бил много упорит бе... в хубавия смисъл разбира се...
Това което се опитвах да обясня е че Math.Round() е математическа операция която работи върху числови стойности , а Fxx е вид форматиране и се извършва върху текст...
Пробвай някъде да закръглиш стойност с Fxx и да използваш после тази закръглена стойност по надолу в кода си - няма да можеш не и ако не я кастнеш към числова стойност
Колега ти пробва ли да закръглиш число с F2 и да използваш това закръгленото число по надолу в кода си... Пробвай после прочети линка който дадох по горе и ще разбереш евентуално
като си го parse-неш пак това число ще си работи нормално,ти по-скоро не разбираш какво ти обесняваме, че f2 е форматиране на tostring на числото а math.round форматира реалното число и после можеш да го ползваш пак в кода си без проблем. и :fх се ползва само при принтиране на резултат или подаването му някъде и тн. какво сте се заели да го обсъждате толкова :Д явно имате доста свободно време.