Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

sasobig12 avatar sasobig12 -4 Точки

Не мога да го разбера - моля помогнете ми.

Здравейте,

написах задача от PB на java която работи но не съвсем. Имам проблем с секцита която оказва дали отговора на задачата е четно или нечетно число. Проблема е в действието УМНОЖЕНИЕ. Някой умножения са верни но повечето не са. 

Например 5 * 5  % 2 го дава "even" въпреки, че остатъка е 1-ца и е зададено да изписва "odd". Този проблем го има само в това действие. В събиране и изваждане няма проблем. Дали знаете какво става?

ето и задачата:

import java.util.Scanner;

public class Task10 {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        double n1 = Double.parseDouble(scanner.nextLine());
        double n2 = Double.parseDouble(scanner.nextLine());
        String operator = scanner.nextLine();
        String oddOrEven = "";
        double result = 0;


        if(operator.equals("+")){
            result = n1 + n2;
        }else if(operator.equals("-")) {
            result = n1 - n2;
        }else if(operator.equals("*")){
            result = n1 * n2;
        }else if (operator.equals("/") && n2 != 0) {
            result = n1 / n2;
        }else if (operator.equals("%") && n2 !=0) {
            result = n1 % n2;
        }

        if ((n1 + n2) % 2 == 0) {
            oddOrEven = "even";
        } else if ((n1 + n2) % 2 == 1) {
            oddOrEven = "odd";
        } else if ((n1 * n2) % 2 == 0) {
            oddOrEven = "even";
        } else if ((n1 * n2) % 2 == 1) {
            oddOrEven = "odd";
        } else if ((n1 - n2) % 2 == 0) {
            oddOrEven = "even";
        }else if (( n1- n2) % 2 == 1){
            oddOrEven = "odd";
        }

        if (operator.equals("+")) {
            System.out.printf("%.0f + %.0f = %.0f - %s", n1, n2, result, oddOrEven);
        }else if (operator.equals("-")){
            System.out.printf("%.0f - %.0f = %.0f - %s", n1, n2, result, oddOrEven);
        }else if (operator.equals("*")) {
            System.out.printf("%.0f * %.0f = %.0f - %s", n1, n2, result, oddOrEven);
        }else if (operator.equals("/") && n2 == 0) {
            System.out.printf("Cannot divide %.0f by zero", n1);
        }else if (operator.equals("%") && n2 == 0){
            System.out.printf("Cannot divide %.0f by zero", n1);
        }else if (operator.equals("/")) {
            System.out.printf("%.0f / %.0f = %.2f", n1, n2, result);
        }else if (operator.equals("%")) {
            System.out.printf("%.0f %% %.0f = %.0f", n1, n2, result);
        }

    }
}

 

Благодаря предварително за помощта и информацията.

Поздрави,

Александър

-1
Programming Basics
Dimkov41 avatar Dimkov41 9 Точки

Здравей. Конктретно проблемът със умножението идва от първият if. Там ти проверяваш (n1 + n2), в случaй на подадени две 5-ци, проверката (5 + 5) % 2 == 0 е true, програмата влиза в блока на if-а и set-ва стойността even на oddOrEven. Опитай се да го дебъгнеш и ще ти стане ясно. 
За да избегнеш тази грешка можеш просто да провериш резултата от result % 2, тъй като по-горе в кода ти вече си определил знака и си извършил действието, като резулата си го запазил в променливата result..

 

if (result % 2 == 0) {
            oddOrEven = "even";
} else if (result % 2 == 1) {
            oddOrEven = "odd";
}

 

2
10/11/2018 00:37:37
sasobig12 avatar sasobig12 -4 Точки

здравей, благодаря за отговора. Не разбрах обаче каква е връзката между проверка n1+n2 и проверка n1*n2.. Не трябва ли при подаване на " * " в конзолата от потребителя, програмата да влиза в първия if да връща true на n1*n2, след което да отива във втората проверкаа и да връща true на n1*n2 % 2 == 1; при подадени от потребителя n1=5 и n2=5:

 

Ще дебъгна но тук проблема ми е с логиката като цяло. Бъркам някъде генерално. Защо проблема е само в умножението а не и в другите действия?

-1
Dimkov41 avatar Dimkov41 9 Точки

Нека разгледаме примера с n1 = 5 и n2 = 5. Първата проверка правилно проверява знака и задава стойността на result.  След това програмата отива във втората проверка и влиза във първият if, който върне true. Т.е. в този случай, програмата ще влезе в 

(n1 + n2) % 2 == 0, защото условието (5 + 5) % 2 == 0 е вярно, но в контекста на задача е грешно. Щом е влязла в даден if, всички else след него не се проверяват, все едно не съществуват. 

Разгледай по-обстойно как работят условните конструкции, мисля че ще ти бъде от полза smiley

        if ((n1 + n2) % 2 == 0) {
            oddOrEven = "even";  //програмата влиза тук и прескача всички следващи else
        } else if ((n1 + n2) % 2 == 1) {//не се изпълнява
            oddOrEven = "odd";
        } else if ((n1 * n2) % 2 == 0) {//не се изпълнява
            oddOrEven = "even";
        } else if ((n1 * n2) % 2 == 1) {//не се изпълнява
            oddOrEven = "odd";
        } else if ((n1 - n2) % 2 == 0) {//не се изпълнява
            oddOrEven = "even";
        }else if (( n1- n2) % 2 == 1){//не се изпълнява
            oddOrEven = "odd";
        }

 

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