Loading...
Boriow avatar Boriow 0 Точки

Задача Odd/Even position, Simple Loops

Имам питане относно задача 17 от Цикли (https://softuni.bg/trainings/1297/programming-basics-january-2016).

Кодът ми работи перфектно при цели числа, но при дробни дава грешки при изчизляването на минимум и максимум. Линк към кода: 

 http://pastebin.com/kH0y3qHK

И в Judge има грешка при тази задача, защото при вход

(n=) 6 и числа 2,3,5,4,2 и 1 дава резултат oddsum 9, oddmin 2, oddmax 5, evensum 8, evenmin 1 и evenmax 4, както и при вход:

(n=) 2 и числа 1.5 и -2.5 дава резултат oddsum 1.5 oddmin 1.5 oddmax 1.5 evensum -2.5 evenmin -2.5 evenmax -2.5

 

 

Тагове:
0
Programming Basics
luki_strike avatar luki_strike 9 Точки

"И в Judge има грешка при тази задача, защото при вход

(n=) 6 и числа 2,3,5,4,2 и 1 дава резултат oddsum 9, oddmin 2, oddmax 5, evensum 8, evenmin 1 и evenmax 4, както и при вход:

(n=) 2 и числа 1.5 и -2.5 дава резултат oddsum 1.5 oddmin 1.5 oddmax 1.5 evensum -2.5 evenmin -2.5 evenmax -2.5"

Тези отговори са верни. Обясни ми този код:

 if (num % 2.0 == 0.0)

нали се търси позицията на числото дали е четна или нечетна, а не самото число което въвеждаме.

 

  1. for (int d = 1; d <= n; d++)

  2.             {

  3.                 double num = double.Parse(Console.ReadLine());

  4.                 if (d % 2 == 0) 

  5.                 {

  6.                     sumEven += num;

  7.                     if (evenMin > num) evenMin = num;

  8.                     else if (evenMax<num) evenMax = num;

  9.                 }

  10.                 else if (d % 2 == 1) или (d % 2 != 0)

  11.                 {

  12.                      sumOdd += num;

  13.                     if (oddMin > num) oddMin = num;

  14.                     else if (oddMax < num) oddMax = num;

  15.                  }

  16.                 if (n == 2) { evenMax = evenMin; oddMax = oddMin; }

  17.                 if (n == 3) { evenMax = evenMin; }

0
07/03/2016 13:01:51
Boriow avatar Boriow 0 Точки

разбрах защо ми дава грешка, тук е проблемът (ползвам кодът, който ти си ми пастнал). Грешката е една и съща без значение дали се търси по числа или по позиции. Просто на ред 7 като заменим num с evenMin, после evenMax го сравнява с новото Нум, което вече е равно на евенМин  : 

  1. for (int d = 1; d <= n; d++)

  2.             {

  3.                 double num = double.Parse(Console.ReadLine());

  4.                 if (d % 2 == 0) 

  5.                 {

  6.                     sumEven += num;

  7.                     if (evenMin > num) evenMin = num;

  8.                     else if (evenMax<num) evenMax = num;

  9.                 }

  10.                 else if (d % 2 == 1) или (d % 2 != 0)

  11.                 {

  12.                      sumOdd += num;

  13.                     if (oddMin > num) oddMin = num;

  14.                     else if (oddMax < num) oddMax = num;

  15.                  }

  16.                 if (n == 2) { evenMax = evenMin; oddMax = oddMin; }

  17.                 if (n == 3) { evenMax = evenMin; }

 

0
Boriow avatar Boriow 0 Точки

така работи безотказно:

for (double d = 1.0; d <= n; d++)
            {
                double num = double.Parse(Console.ReadLine());
                if (d % 2.0 == 0.0) sumEven += num;
                else sumOdd += num;
                if (d%2.0==0.0)
                {
                    if (evenMin > num) evenMin = num;
                }
                else
                {
                    if (oddMin > num) oddMin = num;
                }
                if (d%2.0==0.0)
                {
                    if (evenMax < num) evenMax = num;
                }
                else
                {
                    if (oddMax < num) oddMax = num;
                }
            }

0
luki_strike avatar luki_strike 9 Точки

Ти тези редове ги имаш написани опаче по надолу със сищата иф-ова проверка, просто реших да я съкратя да не я прави а като влезе първия път да я направи. Разликата в кодовете беше 

if (d % 2 == 0) 

и съответно твоето решение:

if (num % 2.0 == 0.0)

 

А за дробните числа колега по надолу е писал че четни и нечетни са само целите числа, затова при целочисленото деление на дробни няма как да се получи нула.

0
aanguelov avatar aanguelov 219 Точки

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

Аз не съм го чел, но по всичко личи, че трябва да проверяваш позициите на числата, дали са четни или нечетни, а не стойностите им.

Може би по-лесно ще ти е да разбереш, ако предварително запишеш числата, които ти подават в масив, а не да парсваш всяко едно вътре в цикъла. Само не съм сигурен дали сте учили масиви, но сега е един добър момент да ги поразгледаш.

0
Boriow avatar Boriow 0 Точки

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

0
krokicha avatar krokicha 76 Точки

Четни и нечетни могат да бъдат само целите числа. И може и без масив. В цикъла с който вкарваш числата проверяваш индекса му дали е четен или нечетен ако започва с 1. Ако започва с 0 - правиш същата проверка за <индекс>+1.

1
Plamen27 avatar Plamen27 599 Точки

Грешката е, че cлед проверката за четност, която трябва да е само една, а не две, след нея  да се прави сумата мин и максимума за четните числа и за нечетност където аналогично да се прави сумата на нечетните числа, минимума и максимума.

 

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