Loading...
mariyan.nonchev avatar mariyan.nonchev 10 Точки

Complex Conditional Statements - 13. Volleyball - Разминаване в отговорите

Здравейте,

Някой да има идея къде греша? Благодаря предварително.

И защо вместо 3/4 трябва да се ползва 3.0/4?

 

Задача 13. Volleyball 

Влади е студент, живее в София и си ходи от време на време до родния град. Той е много запален по волейбола, но е зает през работните дни и играе волейбол само през уикендите и в празничните дни. Влади играе в София всяка събота, когато не е на работа и не си пътува до родния град, както и в 2/3 от празничните дни. Той пътува до родния си град h пъти в годината, където играе волейбол със старите си приятели в неделя. Влади не е на работа 3/4 от уикендите, в които е в София. Отделно, през високосните години Влади играе с 15% повече волейбол от нормалното. Приемаме, че годината има точно 48 уикенда, подходящи за волейбол.

Напишете програма, която изчислява колко пъти Влади е играл волейбол през годината. Закръглете резултата надолу до най-близкото цяло число (например 2.15 à 2; 9.95 à 9).

Входните данни се четат от конзолата:

  • Първият ред съдържа думата “leap” (високосна година) или “normal” (невисокосна).
  • Вторият ред съдържа цялото число p – брой празници в годината (които не са събота и неделя).
  • Третият ред съдържа цялото число h – брой уикенди, в които Влади си пътува до родния град.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Volleyball13
{
    class Volleyball13
    {
        static void Main(string[] args)
        {
            var year = Console.ReadLine().ToLower();
            var p = int.Parse(Console.ReadLine());
            var hweekends = int.Parse(Console.ReadLine());
            var sweekends = 48 - hweekends;
            var playdays = (sweekends * 3.0 / 4) + (2.0 / 3 * p) + hweekends;
            if (year == "normal")
            {
                Console.WriteLine("{0:f0}", playdays);
            }
            else if(year == "leap")
            {
                Console.WriteLine("{0:f0}", playdays * 0.15 + playdays);
            }
        }
    }
}
 

Плюс това условието доста ме затруднява:

Влади играе в София всяка събота (а не кой да е weekend), когато не е на работа и не си пътува до родния град =>

Дните, в които той играе в София не са sweekends * 3.0 / 4, а  sweekends * 3.0 / 4 / 2 ( за да изключим неделя) ?

Тагове:
0
Programming Basics 05/07/2016 16:14:11
IvMironov avatar IvMironov 35 Точки

Здравей,

Проблема ти е че в момента ти закръгля до най-близкото цяло число, а по условие трябва да закръгляш винаги надолу, т.е. да изолираш напълно цифрите след запетаята. За целта аз съм ползвал Math.Floor поставяш го така Console.WriteLine ("{0}", Math.Floor(playdays))

Деленето на числата трябва да ти е 3.0/4 т.к. в другия случай щеполучиш делене на цели числа и съответно разлика в крайния резултат в последствие.

0
dilqna9 avatar dilqna9 44 Точки

Ето ти правилния код на задачата.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Volleyball13
{
    class Volleyball13
    {
        static void Main(string[] args)
        {
            var year = Console.ReadLine().ToLower();
            var p = int.Parse(Console.ReadLine());
            var hweekends = int.Parse(Console.ReadLine());
            var sweekends = 48 - hweekends;
            double playdays = (sweekends * 3.0 / 4) + (p*2.0 / 3) + hweekends;
          
            if (year == "normal")
            {
                Console.WriteLine("{0}", (int)playdays);
            }
            else 
            {
                Console.WriteLine("{0}", (int)(playdays * 0.15 + playdays));
            }
        }
    }
}

0
ZornitsaSerbezova avatar ZornitsaSerbezova 455 Точки

Аз закръглям с Math.Truncate

1
notarobot avatar notarobot 7 Точки

ето го и моят,дава 100 точки

           var type = Console.ReadLine().ToLower();
            var p = double.Parse(Console.ReadLine());
            var h = double.Parse(Console.ReadLine());
            var volley = (h + ((48 - h) * (3.0 / 4)) +( p * (2.0/3)));

            if (type == "normal")
            {
                Console.WriteLine(Math.Truncate(volley));
            }
            if (type == "leap")
            {
                Console.WriteLine(Math.Truncate((volley* 0.15) +volley));
            }

0
pebodi avatar pebodi 29 Точки

Тук искам да предложа една промяна към условието на задачата. Да не се въвежда ръчно високосна/нормална година, а да се изчислява програмно :) Правилото е - високосна е годината, за която последните две цифри е число, което се дели точно на 4 - без остатък. Изключение прави 2000 година, за която трябва да се провери отделно.

Също така вместо Math.Truncate, може да се използва изваждане на 0.5, ако закръгляваме към цяло число или 0.005, ако закръгляваме до 2 цифри след десетичната запетая. Двоичният код доста намалява. Това може да се приложи в микроконтролери, където се гони по-малко двоичен код и по-голямо бързодействие. Вероятно и Джъдж може да потвърди този факт :)

0
09/11/2016 15:24:02
g_todorov avatar g_todorov 106 Точки

Здравей,

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

Ако ползваш десетична дроб в ексел направи конкретното деление и след това

копирай от ексел абсолютно целия резултат от конкретното деление, колкото и да е дълъг той и ще си

на 100% сигурен в успеваемостта на кода. По този начин може да възникне само един проблем - десетична дроб в период, но рядко се среща. В конкретния пример 2/3 е ето това число  0.666666667 и със него кода ми работи на 100%.

Дано съм бил полезен.

Ето и моят код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ValeyBall
{
    class Program
    {
        static void Main(string[] args)
        {
            var leapN = Console.ReadLine();
            var praznici = double.Parse(Console.ReadLine());
            var home = int.Parse(Console.ReadLine());

            var sofWeek = 48 - home;
            var SaturdayPlaySof = (sofWeek * 0.75);

            var prazniciPlaySof = (praznici * 0.666666667);

            var totalPlaysSofHome = SaturdayPlaySof + home + prazniciPlaySof;

            if (leapN == "leap")
            {
                var leapYear = (totalPlaysSofHome * 15) / 100;
                var leapYearPlays = totalPlaysSofHome + leapYear;
                Console.WriteLine (Math.Floor (leapYearPlays));
            }
            else
            {
                Console.WriteLine(Math.Floor(totalPlaysSofHome));
            }

        }
    }
}

 

0
MomchilSlavov avatar MomchilSlavov 1 Точки

Мдаа, объркващо е условието...

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