Професионална програма
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