Loading...
markovood avatar markovood 11 Точки

зад. 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.");
        }
    }
}

 

Тагове:
0
Programming Basics 23/07/2018 23:35:24
boykopk avatar boykopk 147 Точки
Best Answer

 

Здравей,

добави този ред преди Console.Writeline и става 100/100

priceForFood = Math.Floor(priceForFood * 100) / 100;

Това е един от начините да оставиш само 2 числа зад точката.

0
markovood avatar markovood 11 Точки

Значи от това F2 идва грешката така ли ...

не разбирам значи не е дообяснено в условието както трябва

как би трябвало да се сетя за такова нещо ако ми се падне подобна задача на изпит

0
24/07/2018 11:27:07
boykopk avatar boykopk 147 Точки

F2 само реже, а с Math.Floor(priceForFood * 100) / 100 закръгляш до втория знак.

0
Hristomira avatar Hristomira 1 Точки

Здравейте,

При мен също се получават 70/100 точки. Аз също съм позлвала F2, за да закръгля до втория знак както е в условието. Когато опитам с Math.floor ми дава 0 точки, което очаквах понеже доколкото съм запозната Math.Floor закръгля към по ниското число резултата, а това съответно го променя. Моля за малко помощ и благодаря предварително! 

Линк към кода: https://pastebin.com/ptHUmv9D

0
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки

нормално е да дава грешка с math.floor закръгля на по долното число.. за да закръглиш до втория знак ти трябва math.round колегата е малко се е объркал 

казваш му math.round(x,2) и толкова като х-ти е променливата. няма го условието затова не мога да коментирам повече. Но има съществена разлика между това какво прави math.floor и math.round :Д

доколкото виждам от кода 

  1.   amountForFood = amountForFood / 1000;

  2.             double moneyForFood = amountForFood * 12.45;

ето тук кое как се закръгля е важно. но без условието толкова. 

0
25/07/2018 12:35:55
boykopk avatar boykopk 147 Точки

С добавянето на този ред си става 100/100

moneyForFood = Math.Round(moneyForFood * 100) / 100;

Колегата е прав, че в случая е Math.Round.

0
Hristomira avatar Hristomira 1 Точки

Здравейте, 

Много Ви благодаря за съветите! Помогнахте ми и си взех 100те точки :)

0
markovood avatar markovood 11 Точки

Колега @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

0
25/07/2018 17:01:44
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки
 double priceForFood = (totalFoodWeightGrams / 1000) * 12.45;

защото ето тук не взимаш 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

0
25/07/2018 17:33:40
markovood avatar markovood 11 Точки

Извинявай колега @TeodorStefanovPld ,

но точно нулевите тестове ми минават всички и примера който даваш че при 17,7288 с F2 не връща 17,72 а 17,73.

Т.е. до колкото съм запознат начинът на действие на Fxx, където хх е 0-99 при примера с F2 кодът зад F2 създава нов стринг като проверява третата цифра в числото което се форматира (т.е.първата която е извън скоупа на зададеният precision specifier - в случая 2) ако е 5 и повече закръгля във стринга втората цифра на горе, а ако е под 5 не я променя...

Разчитайки на тази логика съм построил и решението си но явно според мен който е сътворил задачата е направил тестовете да разчитат по някакъв начин на Math.Round() и за това получавам гръм на три от тях...

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

Благодаря на всички който ми отговориха и се опитаха да ми помогнат.

Успех на предстоящия изпит!

1
26/07/2018 00:43:35
kolioi avatar kolioi 641 Точки

@markovood

И аз това се чудя, каква е разликата между Math.Round(priceForFood, 2) и {priceForFood:F2} като и двете закръгляват до втория знак след десетичната точка и използват един и същи метод за закръгляване.

0
26/07/2018 00:56:07
markovood avatar markovood 11 Точки

Разликата е всъщност много дребна и не се усеща на пръв поглед а именно 

при Math.Round(priceForFood, 2) реално закръгляш дадената double променлива в скобите до втория знак в случая, а

при  {priceForFood:F2} кодът зад F2 създава нов стринг в който се записват указания брой знаци след точката като последният от тях се закръгля но само в стринговата репрезентация, оригиналната double променлива остава не променена което ЛИЧНО СПОРЕД МЕНЕ не би трябвало да влияе в контекста на тази конкретна задача тъй като никъде не ползвам променливата след като съм я отпечатал форматирано...

Надявам се това обяснение да е разбираемо...

0
26/07/2018 01:11:58
kolioi avatar kolioi 641 Точки

Е, не е точно така. Math.Round връща закръглената стойност и в случая ти просто я присвояваш на същата променлива, затова се променя стойността на priceForFood. А в другия случай се вика priceForFood.ToString(). Както и да е.

0
26/07/2018 01:23:39
markovood avatar markovood 11 Точки

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

Math.Round(); е метод който връща стойност от тип който е същия като този който си подал (double, decimal и т.н.), докато форматирането  е операция върху стринг, т.е.работи със стрингове, връща стринг...

с други думи не можеш да използваш форматиране за да извършиш операцията закръгляне на число

За judge е важно какво ще отпечаташ (демек стринга), а не как си стигнал до него!!!

виж тук за справка: https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings#FFormatString

0
26/07/2018 01:49:19
kolioi avatar kolioi 641 Точки

И в двата случая се извършва форматиране (и закръгляване) за да се получи изходния стринг.

В примера който си дал, ако използваш Math.Round ще получиш абсолютно същия резултат. Пробвай това

double x = 123.4567;
Console.WriteLine(Math.Round(x, 2));
Console.WriteLine("{0:F2}", x);
Console.WriteLine(x);

 

0
markovood avatar markovood 11 Точки

Човек ти си бил много упорит бе... в хубавия смисъл разбира се...

Това което се опитвах да обясня е че Math.Round() е математическа операция която работи върху числови стойности , а Fxx е вид форматиране и се извършва върху текст...

Пробвай някъде да закръглиш стойност с Fxx и да използваш после тази закръглена стойност по надолу в кода си - няма да можеш не и ако не я кастнеш към числова стойност

0
kolioi avatar kolioi 641 Точки
Ами и в двата случая се извършва закръгляване до определен брой цифри и се работи с реално число, а не със стринг. Оригиналната стойност не се променя. В крайна сметка на екрана излиза стринг :) Къде е разликата тогава? Единствената разлика за която се сещам е че форматирането може да допълва с нули. Пусни горния пример с x=5.2 и ще видиш за какво говоря.
0
26/07/2018 14:49:27
markovood avatar markovood 11 Точки

Колега ти пробва ли да закръглиш число с F2 и да използваш това закръгленото число по надолу в кода си... Пробвай после прочети линка който дадох по горе и ще разбереш евентуално

0
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки

Колега ти пробва ли да закръглиш число с F2 и да използваш това закръгленото число по надолу в кода си... Пробвай после прочети линка който дадох по горе и ще разбереш евентуално

като си го parse-неш пак това число ще си работи нормално,ти по-скоро не разбираш какво ти обесняваме, че f2 е форматиране на tostring на числото а math.round форматира реалното число и после можеш да го ползваш пак в кода си без проблем. и :fх  се ползва само при принтиране на резултат или подаването му някъде и тн. какво сте се заели да го обсъждате толкова :Д явно  имате доста свободно време.

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