03. Операции между числа
70/100 и не мога да си намеря грешката. Примерите в условието работят.... Ако някой ми посочи конкретните грешки ще съм благодарен.
Ето го и кода:
http://pastebin.com/6dX4Rjcq
70/100 и не мога да си намеря грешката. Примерите в условието работят.... Ако някой ми посочи конкретните грешки ще съм благодарен.
Ето го и кода:
http://pastebin.com/6dX4Rjcq
Коя задача е ? От коя лекция? Да видим условието на задачата, че не мога да я намеря , по условието което си задал.
Напишете програма, която чете две цели числа (N1 и N2) и оператор с който да се извърши дадена математическа операция с тях. Възможните операции са: Събиране(+), Изваждане(-), Умножение(*), Деление(/) и Модулно деление(%). При събиране, изваждане и умножение на конзолата трябва да се отпечатат резултата и дали той е четен или нечетен. При обикновеното деление – резултата. При модулното деление – остатъка. Трябва да се има предвид, че делителят може да е равен на 0(нула), а на нула не се дели. В този случай трябва да се отпечата специално съобщениe.
От конзолата се прочитат 3 реда:
Да се отпечата на конзолата един ред:
Здравей,
Не съм сигурен, но мисля че % не работеше правилно с отрицателни числа.
Пробвай да ги обръщаш първо в абсолютната им стойност с Math.abs()
и тогава. Също не е хубаво да използваш double за сметки, въпреки че не мисля
, че проблемът идва от там в момента. Разгледах я само отгоре отгоре, така че е много
вероятно да е друг проблемът, но дано да съм помогнал.
, а пък ти правиш правиш 2 проверки и за 2те числа.
Може и от това да е.
Не е конкретизирано.
"Трябва да се има предвид, че делителят може да е равен на 0(нула), а на нула не се дели. В този случай трябва да се отпечата специално съобщениe."
А и ако проблема беше в изхода, то показва разликата между очаквания изход и този който ти вадиш.
Най-вероятно съм збъркал някой знак или тип данни, но не си го намирам.
Не е истина.... Проблема е при проверката за н1 и н2 == 0 .... и то не самата проверка а това, че трябва да принтирам винаги първо числото след това 0....
if (n1 == 0 || n2 == 0)
{
if (n1 == 0)
{
Console.WriteLine("Cannot divide {0} by zero", n2);
}
else <ВЯРНО>
{
Console.WriteLine("Cannot divide {0} by zero", n1);
}
}
......................................................................................
if (n1 == 0 || n2 == 0)
{
if (n1 == 0)
Console.WriteLine("Cannot divide zero by {0}", n2);
}
else <ГРЕШНО>
{
Console.WriteLine("Cannot divide {0} by zero", n1);
}
}
Всъщност едната проверка е излишна. Единствено ти трябва да проверяваш второто число дали е 0 и само тогава да изкарваш, че не може да се дели на 0. Освен това тествай какво става, когато резултатът е отрицателно число, защото мисля, че odd и even не работят много правилно тогава.
И аз имам проблем с Judge...също като при теб ми дава 70 / 100, но проверката за 0 ми е правилно подредена. Някакви идеи къде може да е проблема?
Пробвах с решение подобно на авторското - пак не става....
И на мен "Съдията" ми дава абсолютно същото 70/100.
Поразгледах авторския код и видях (доколкото му разбирам), че при делението n2 се преобразува в double, явно за да е вярно делението. И понеже при пускане във Вижуъл студио кода му работи по абсолютно същия начин като моя, реших да видя съдията какво ще даде на неговия код... ами какво да кажа -- 70/100.
Така че, явно грешката е неоткриваема! Считай за тази задача 70/100 == 100/100
Здравей,
Разсъждения от сорта на "грешката е неоткриваема" са много неправилни в този случай.
Има минимален шанс нещо в задачата/тестовете да е неточно. Като отвориш резултатите, ще забележиш че много хора имат 100/100 точки. Тоест - конкретният случай не е такъв.
Ако погледнеш кода си, ще видиш че имаш пропуски и неточности, поради Copy/Paste или невнимателно прочитане на условието.
В условието пише: При събиране, изваждане и умножение на конзолата трябва да се отпечатат резултата и дали той е четен или нечетен. При обикновеното деление – резултата. При модулното деление – остатъка.
В твоето решение, отпечатваш "even/odd" навсякъде - това се отчита от Judge като грешка.
В условието пише: Ако операцията е деление: „{N1} / {N2} = {резултат}“ – резултата е фораматиран до вторият знак след дес.запетая.
При теб това е пропуснато, което Judge също ще го отчете като грешка.
Може да има и други пропуски, но не съм гледал обстойно, тъй като решението ти е доста дълго. Надявам се тези двете неща да помогнат.
В случай, че искаш работещо решение, от което да гледаш: http://pastebin.com/BtA71dXL
Успех със задачата!
Здравей,
Благодаря ти за съвсем правилната критика! (не го казвам, за да те засегна ... наистина ми помогна).
Благодаря ти наистина, защото след като ми писа си прегледах отново кода и да открих тъпите 2..3 грешки и вече имам 100/100 с този код :)
Твоя код ми харесва, но някой неща не са ми ясни как и защо са ползвани... понеже не съм ги чел (явно), а и не са обяснявани на лекциите които съм изгледал.
Отново ти благодаря за съветите!
Радвам се, че си се справил. Ако има нещо неясно, винаги можеш да питащ и ще обяснявам. В конкретната задача, предполагам, че става въпрос за някое от следните неща:
1. char operation = char.Parse(Console.ReadLine()); - това е начин, да прочетеш отделен символ от тип char. Използвам го, тъй като не ни трябва цял string, а само един символ.
2. Console.WriteLine($"{a} + {b} = {a + b} - " + ((a + b) % 2 == 0 ? "even" : "odd")); - "$" в началото ни позволява вместо да използваме placeholder-и от типа "{0}", а след това да декларираме какво да отиде на мястото на "0", директно да изписваме променливите/уравненията в скобите, като например "{a + b}". По-известно е като string interpolation. Могат да се видят доста примери в интернет.
(a + b) % 2 == 0 ? "even" : "odd" е така нареченият Ternary Operator. Реално, представлява по-кратък начин да се провери дадено условие и да се върне даден резултат: <условие> ? <резултат ако е изпълнено> : <резултат ако не е изпълнено>. В конкретната задача, проверявам дали резултатът от избраната операция е четен или нечетен. Абсолютно същият ефект може да се постигне и с if-else, но се иска маалко повече писане (а мен ме мързи).
3. Console.WriteLine($"{a} / {b} = {(double)a / b:F2}"); - F2 означава, че искаме да се показват два знака след десетичната запетая.
Извинявай, в случай че повтарям неща, които вече знаеш. Просто смятам, че е добре да разясня задачата максимално, тъй като все пак това е идеята на форума - да се учим. Ако има нещо друго, ще се радвам да ти бъда полезен.
Според мен грешката е тук:
else if (op == '/' || op == '%')
{
if (n1 == 0 || n2 == 0)
{
if (n1 == 0)
{
Console.WriteLine("Cannot divide zero by {0}", n2);
}
else
{
Console.WriteLine("Cannot divide {0} by zero", n1);
}
}
В условието пише само числото да не може да се разделя на 0, а ти проверяваш дали нулата може да се дели на числото (във втория if).
Според мен трябва да остане само else-а, а if-a не трябва да фигурира.
Успех с ученето! :)
Здравейте, аз също имам въпрос относно тази задача! Защо като изпозлвам за крайния резултат BigDecimal
( https://pastebin.com/e2gM0UNu ) в judge ми дава 100/100, а когато изпозлвам този вариант (https://pastebin.com/32wkhttps://pastebin.com/32wkpjbspjbs) ми дава 90/100 ?
Здравей,
кодът ти е изтекъл и не се вижда, но ако искаш сравни си нещата с моя : https://pastebin.com/9kxaa7fL
Поздрави, Зарко.