Софтуерно Инженерство
Loading...
+ Нов въпрос
KaloyanNikolov avatar KaloyanNikolov 2 Точки

Въпрос относно задача 01. Charity Marathon от изпита на 23.10.2016

Здравейте! Пиша за втори път цялата тема, защото заби сайта поради някаква причина и 15 минути писане на вятъра... :D 
Ще го напиша по-сбито сега, но общо казано имах проблем с първата задача от изпита. На нея изкарах 70/100 точки и се чудех доста време на какво се дължи. Пробвах по различни начини и така до онзи ден, когато бяхме в лекция и ми прещрака пак да се разровя в кода. Един човек седеше до мен тогава и беше така добър да ми погледне кода, а аз му обясних какъв ми е проблема. Той ми каза къде ми е грешката, а именно в закръглянето до втория знак. На изпита проверих в нета как се закръглява, за да съм сигурен, че го правя правилно, при което реших да пробвам по два начина - единия с Math.Round, а другия - директно при отпечатването. Първия път пробвах с Math.Round и не знам какъв ми е бил резултата, обаче след като опитах на кода си от изпита по този начин ми даде 90 точки, които не ми е дало по време на изпита (сигурно тогава ми е била друга грешката, но както и да е - не в това е въпроса). След това реших директно при изхода да закръглям чрез това, което видях в нета - Console.WriteLine("Money raised: {0:N2}", moneyRaised). Взимайте в предвид само {0:N2}. 
Човека седящ до мен ми обясни, че не се прави с N2, ами с F2. От тук изниква фундаменталния ми въпрос, за който е цялата тема - каква е разликата между закръгляне с N2 и закръгляне с F2 и защо при изпита ми даде 70/100 точки при първото закръгляне, а с второто ми даде 100?
Поздрави.

0
Programming Fundamentals
puffed avatar puffed 289 Точки

 Изглежда, че N слага и разделител за хилядите, докато F не прави такова нещо. Например:

double num2 = 4836731.60217657;
decimal num3 = 2348247.8184261974584555216535342341m;

Console.WriteLine("{0:N2}", num2);
Console.WriteLine("{0:F2}", num3);

/*Изход:
4,836,731.60
2348247.82
*/

0
KaloyanNikolov avatar KaloyanNikolov 2 Точки

Ахааа! Благодаря, особено много ми помогна, тъй като в нета не успях да намеря информация за това.

0
YordanDringov avatar YordanDringov 26 Точки
using System;

class CharityMarathon
{
    static void Main(string[] args)
    {
        int days = int.Parse(Console.ReadLine());
        int runners = int.Parse(Console.ReadLine());
        int laps = int.Parse(Console.ReadLine());
        int lapLenght = int.Parse(Console.ReadLine());
        int trackCapacity = int.Parse(Console.ReadLine());
        double moneyPerKm = double.Parse(Console.ReadLine());

        int maxRunners = 0;
        if(trackCapacity * days >= runners )
        {
            maxRunners = runners;
            long totalKm = ((long)(maxRunners * laps * lapLenght))/1000;
            CalculateTotalMoney(moneyPerKm, totalKm);
        }
        else
        {
            maxRunners = trackCapacity * days;
            long totalKm = ((long)(maxRunners *laps* lapLenght))/1000;
            CalculateTotalMoney(moneyPerKm, totalKm);
        }       
    }

    private static void CalculateTotalMoney(double moneyPerKm, long totalKm)
    {
        double totalMoney = totalKm * moneyPerKm;
        Console.WriteLine("Money raised: {0:F2}", totalMoney);
    }
}

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

 

0
yordank avatar yordank 93 Точки
 long totalKm = ((long)(maxRunners * laps * lapLenght))/1000;

Според мен ,тези редове не правят точно това което трябва да правят при препълване.Във вътрешните скоби има умножение на 3 променливи от тип int,като резултата от умножението ще е пак от тип int( 32-bit ).И вече като има препълване резултата ще е някакво отрицателно(може и положително да е,но пак ще е грешно умножението) число от рода на -312156656 и това отрицателно число се преобразува в long.

Но ако промениш тези редове на

long totalKm = (   (long)maxRunners * laps * lapLenght  ) / 1000;

т.е преобразуваш maxRunners към long,то резултата от умножението вече  трябва да е верен и да е от тип long

 

1
26/12/2016 22:27:55