1 Востаннє редагувалося Пам'ять не може бути READ (16.03.2013 18:11:09)

Тема: Чому у switch заміст * передається bin ?

Привіт. У джаві я новенький
і зустрів дуже дивну проблему.
Суть у тому, що як і більшість початківців
я починав з hello world , і зараз написав
кальлькулятор :|
Так, оскільки я з вводом даних з клави ще не
розібрався(якось усе заплутано, якісь бібліотеки треба
і на різних форумах різні бібліотеки інклудять)
тому я передаю числа та дію через аргументи при
запуску програми.

Приклад:

java MathC + 8 2

Результат:

Сума двох чисел: 2 та 8 = 10

Приклад 2:

java MathC * 2 8

Результат:

Невідома команда bin

А ось і сам код:

public class MathC {
    public static void main(String[] args) {
     
      switch(args[0])
      {
        case "+": 
         int sum = Integer.valueOf(args[1]) + Integer.valueOf(args[2]);
         System.out.println("Сума двох чисел: " + args[1] +" та "+ args[2] + " = " + sum);
        break;  
        
        case "-":
         int diff = Integer.valueOf(args[1]) - Integer.valueOf(args[2]);
         System.out.println("Різниця двох чисел: " + args[1] +" та "+ args[2] + " = " + diff);
        break;
        
        case "*":
         int pr = Integer.valueOf(args[1]) * Integer.valueOf(args[2]);
         System.out.println("Добуток двох чисел: " + args[1] +" та "+ args[2] + " = " + pr);         
        break; 
        
        case "/":
         if(Float.valueOf(args[2]) == 0.00)
          System.out.println("Ололо, на нуль ділити не можна.");
         else
         {
          float frac = Float.valueOf(args[1]) / Float.valueOf(args[2]); 
          System.out.println("Частка двох чисел: " + args[1] +" та "+ args[2] + " = " + frac);
         } 
        break;
         
        default:
         System.out.println("Невідома команда " + args[0]);
        break; 
      }
            
    }
}

У чому проблема, не можу ніяк збагнути.

2 Востаннє редагувалося Invader (16.03.2013 18:34:30)

Re: Чому у switch заміст * передається bin ?

А якщо передавати так — "*" 2 8? Можливо проблеми з передачею в програму символу * який інтерпретується як… ХЗ що, але, коли пишу в ком. рядку *, потім Enter, то постійно виводиться audacious_3.2.3-1_amd64.deb: command not found.
Цілком можливо, що BASH перехоплює символ * і опрацьовує його на свій манер і він в java програму не доходить.

3

Re: Чому у switch заміст * передається bin ?

Для перевірки првильності програмного коду можна змінити умову з

case "*":

на

case "m":

ну і відповідно писати:

java MathC m 2 8

Re: Чому у switch заміст * передається bin ?

Invader написав:

А якщо передавати так — "*" 2 8? Можливо проблеми з передачею в програму символу * який інтерпретується як… ХЗ що, але, коли пишу в ком. рядку *, потім Enter, то постійно виводиться audacious_3.2.3-1_amd64.deb: command not found.
Цілком можливо, що BASH перехоплює символ * і опрацьовує його на свій манер і він в java програму не доходить.

Дійсно, в мене якщо теж набрати в консолі просто *, то виводиться bin.
Значить і вправду bash перехоплює всі символи.

5

Re: Чому у switch заміст * передається bin ?

Код переписаний на java 1.6:

public class MathC {
    public static void main(String[] args) {
     
     if (args[0].equals("+")) {
         int sum = Integer.valueOf(args[1]) + Integer.valueOf(args[2]);
         System.out.println("Сума двох чисел: " + args[1] +" та "+ args[2] + " = " + sum);
     } else if (args[0].equals("-")) {
         int diff = Integer.valueOf(args[1]) - Integer.valueOf(args[2]);
         System.out.println("Різниця двох чисел: " + args[1] +" та "+ args[2] + " = " + diff);
     } else if (args[0].equals("*")) {
         int pr = Integer.valueOf(args[1]) * Integer.valueOf(args[2]);
         System.out.println("Добуток двох чисел: " + args[1] +" та "+ args[2] + " = " + pr);         
     } else if (args[0].equals("/")) {
         if(Float.valueOf(args[2]) == 0.00)
            System.out.println("Ололо, на нуль ділити не можна.");
          else {
          float frac = Float.valueOf(args[1]) / Float.valueOf(args[2]); 
          System.out.println("Частка двох чисел: " + args[1] +" та "+ args[2] + " = " + frac);
         } 
     } else { System.out.println("Невідома команда " + args[0]);
      
     }
     
    }
}

Якщо викликати так:

java MathC '*' 8 2

то працює нормально :)

6

Re: Чому у switch заміст * передається bin ?

Чому б не піти на маленьку хитрість? Писати -- або - перед початком параметрів для програми. Наприклад:

java MathC --* 8 2

Це зручніше ніж писати друкувати лапки навколо *.

7 Востаннє редагувалося User 298 (16.03.2013 23:24:54)

Re: Чому у switch заміст * передається bin ?

Hanter, у вас, либонь, та ж проблема, що колись була у keithfay. Зірочка - це спецсимвол.
Тут згадується.

Re: Чому у switch заміст * передається bin ?

Справді вся проблема у тому, що це спецсимвол, і баш перехоплює його.

9 Востаннє редагувалося volodimirg (18.03.2013 13:31:36)

Re: Чому у switch заміст * передається bin ?

Щодо вводу з клавіатури. Усі бібліотеки грунтуються переважно на звичайних потоках вводу-виводу, лише дещо спрощують організацію цього ж вводу виводу. В java в даний час нароблено кілька стандартних "класів-надбудов". Мені подобається організація вводу через стандартний клас Scanner із пакету java.util:

import java.util.Scanner;

.....

        Scanner in = new Scanner(System.in);
        String expr;
   
        System.out.print("Введіть вираз: ");
        expr = in.next();
        System.out.println(expr);//замість цього організовуємо розбір стрічки
     
    

Отримали вираз у змінній expr типу String, а далі робимо розбір виразу і перетворення елементів на числа та знаки.

Відеоурок англійською:http://www.youtube.com/watch?v=t7QKgXfQ0fs Java Tutorial - 6 - Input from the keyboard

http://www.youtube.com/watch?v=OZ-wVaaKENE   2-2 Getting-Input from the keyboard