Софтуерно Инженерство
Loading...
+ Нов въпрос
sasobig12 avatar sasobig12 -6 Точки

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

Здравейте,

написах задача от 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);
        }

    }
}

 

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

Поздрави,

Александър

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 -6 Точки

здравей, благодаря за отговора. Не разбрах обаче каква е връзката между проверка 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