четвер, 19 липня 2012 р.

Арифметические выражения

Арифметичні операції

Java підтримує наступні арифметичні операції:
Оператор Операція
+ Додавання
Віднімання
* Множення
/ Ділення
% Залишок від цілочисельного ділення

Пріоритет операцій множення і ділення вище, ніж додавання і віднімання. Операції з однаковими пріоритетами виконуються зліва направо. Ви можете змінювати порядок виконання операцій з допомогою дужок:
a + b / c ≡ a + ( b / c )
a * b – c ≡ ( a * b ) – c
a / b / c ≡ ( a / b ) / c
Рекомендується завжди задавати порядок виконання операцій з допомогою дужок - в цьому випадку Вам не доведеться думати про те, пріоритет якої операції вище.

Стоит уделить особое внимание целочисленному делению.
Результат деления в Java зависит от типов операндов. Если оба операнда - целые числа, то результат будет тоже целым. Поэтому непреднамеренное использование целочисленного деления может привести к существенной потере точности. Чтобы произвести обычное деление, получив в качестве результата вещественное значение, в Java нужно явно указать, что хотя бы один из операндов является вещественным числом.
Например:
3 / 2 ≡ 1
2 / 3 ≡ 0
потому что это целочисленное деление. Однако
3 / 2. ≡ 1.5
2.0 / 3 ≡ 0.66666666…
потому что 2. и 2.0 являются вещественными числами. Если k и n являются переменными типа int, то k/n будет производить целочисленное деление и выдавать в качестве результата целое число (значение типа int). Чтобы получить вещественный результат при делении двух целочисленных переменных (или выражений), Вы должны заставить Java рассматривать хотя бы с одну переменную как вещественную. Это делается с помощью приведения типов: для этого Вам нужно перед именем переменной написать в скобках имя типа, к которому Вы хотите преобразовать значение, например, (double)k/n даст вещественный результат деления (значение типа double).
Целочисленное деление часто используется вместе с операцией взятия остатка от деления для получения номера строки и столбца элемента по его порядковому номеру. Предположим, что есть коллекция из 600 элементов, задающая, скажем, места в театре, и мы хотим условно расположить эти места в 20 рядов, каждый из которых содержит по 30 мест. В этом случае получить номер ряда и номер места в этом ряду можно будет с помощью следующих выражений:
Номер места: index % 30 (остаток от деления индекса на 30: 0 - 29)
Номер ряда: index / 30 (целочисленное деление индекса на 30: 0 - 19)
где порядковый номер (индекс) index принимает значения от 0 до 599. Например, место с индексом 247 будет соответствовать месту 7 в ряду 8.
У операции возведения в степень в Java нет собственного оператора (если Вы напишете a^b, то это будет означать операцию побитового ИЛИ). Чтобы выполнить возведение в степень, нужно вызвать функцию pow():

pow( a, b ) ≡ ab


Java підтримує кілька спрощених операторів для часто використовуваних операцій з числовими змінними, тому до арифметичних операторів мови Java, які визначені для всіх числових типів, відносяться: + (додавання і унарний плюс) + = (додавання з присвоюванням), - (віднімання і унарний мінус), -= (віднімання з присвоюванням), * (множення), *= (множення з присвоюванням), / (ділення), /= (розподіл із присвоюванням), % (залишок від ділення або ділення по модулю), %= (залишок від ділення з присвоюванням), ++ (інкремент) -- (декремент).

Будь-який оператор з присвоюванням з погляду одержуваного результату еквівалентний виконання відповідної операції з подальшим присвоюванням, але працює зазвичай швидше: a @= b еквівалентно а = a @ b (тут символ " @ " означає будь-яку з арифметичних бінарних операцій).

i++  ≡  i = i+1 (збільшення значення i на 1)
i––  ≡  i = i–1 (зменшення значення i на 1)
a += 100.0  ≡  a = a + 100.0 (збільшення значення a на 100.0)
b –= 14  ≡  b = b – 14 (зменшення значення b на 14)

Обратите внимание, что хотя такие операторы могут использоваться в выраженях, их вычисление изменяет значение операндов.

Приклад з арифметичними операціями:

    public class Math1 { 
    public Math1() { 
    } 
    public static void main(String[] args) { 
    int a=5;
    int b=2;
    int c=25;
    int k;
    double r;
    k=a+b;
    r=Math.pow(3.,2.);
    System.out.println("a=" + a); 
    System.out.println("b=" + b); 
    System.out.println("c=" + c); 
    System.out.println("Syma a+b=" +  (a+b)); 
    System.out.println("Сума:  а+b="+k);
    System.out.println("Не вірна сума a+b=" +  a+b); 
    System.out.println("Добуток:  a*b="+a*b);
    System.out.println("Результат д?лення ц?лочисельних:  а/b="+a/b); //дробова частина вiдкидається
    System.out.println("Залишок по модулю:  a%b="+a%b);
    System.out.println("Cтепiнь:  a^b="+Math.pow(a,b));
    System.out.println("Корiнь: sqrt(с) ="+Math.sqrt(c));
    } 
    } 

Задача 1(про прямокутний трикутник). Нехай задано катети прямокутного трикутника a=3, b=4. Знайти периметр і площу трикутника.

class triangle {
public triangle() {
}
public static void main(String[] args) {
   double a=3, b=4, c,p,s;                      //Задаємо довжини сторін
   c= Math.sqrt(a*a+b*b);                    //Обчислюємо гіпотенузу
   p=a+b+c;                                           //обчислюємо периметр
   s=a*b/2;                                             //обчислюэмо площу
System.out.println("p=" + p);               //виводимо значення периметра
System.out.println("s=" + s);                //та площі на екран
System.out.println("виконав Юхим.В");
}
}


1.1. Вывести на экран с точностью два знака число Пи.

Ответ: Решил что надо вычислить число Пи.

  1. public class Math2 {  
  2. public Math2() {  
  3. }  
  4. public static void main(String[] args) {  
  5. long n=1;  
  6. double sum,pi;  
  7. sum=1;  
  8. for (n=1; n<100000;n++)  
  9. {  
  10.   sum=sum*(4*(n*n))/((4*(n*n))-1);  
  11. }  
  12. pi=sum*2;  
  13. System.out.println("Число Пи=" + String.format("%.2f", pi));  
  14. }  
  15. }  

1.2. Вывести на экран с точностью два знака число е (основание натурального логарифма).

  1. public class Math2 {  
  2. public Math2() {  
  3. }  
  4. public static void main(String[] args) {  
  5. long n;  
  6. double sum,e,fuc;  
  7. sum=1;  
  8. fuc=1;  
  9. for (n=1; n<20;n++)>  
  10.         sum=sum+1/fuc;  
  11. }  
  12. e=sum;  
  13. System.out.println("Чиcло e=" + String.format("%.2f", e));  
  14. }  

1.3. Составить программу вывода на экран числа. вводимого с клавиатуры. Выводимому числу должно предшествовать сообщение “Вы ввели число”.

  1. import java.io.*;  
  2. public class Les2 {  
  3.     public static void main(String[] args) throws IOException   
  4.         {  
  5.         char c;  
  6.         BufferedReader kb=new BufferedReader(new InputStreamReader(System.in));  
  7.             c=(char)kb.read();   
  8.           System.out.println("Вы ввели число "+c);  
  9.       }  
  10. }  

1.5. Вывести на одной строке числа 1, 13 и 49 с одним пробелом между ними.

  1. public class Num {  
  2.     public Num() {  
  3.     }  
  4.     public static void main(String[] args) {  
  5.         System.out.println(1+" "+13+" "+49);  
  6.     }  
  7. }      

1.7. Составить программу вывода на экран в одну строку трех любых чисел с двумя пробелами между ними.

  1. import java.io.*;  
  2. public class Num {  
  3.     public static void main(String[] args) throws IOException   
  4.         {  
  5.         char n1,n2,n3;  
  6.         BufferedReader kb=new BufferedReader(new InputStreamReader(System.in));  
  7.             n1=(char)kb.read();   
  8.             n2=(char)kb.read();   
  9.             n3=(char)kb.read();   
  10.         System.out.println(n1+"   "+n2+"   "+n3);  
  11.         }  
  12. }  

1.9. Вывести на экран числа 50 и 10 одно под другим.

  1. public class Num {  
  2.     public Num() {  
  3.     }  
  4.     public static void main(String[] args) {  
  5.         System.out.println(50);  
  6.         System.out.println(10);  
  7.   
  8.     }  
  9. }      

1.25. Дана сторона квадрата. Найти его периметр.

  1. import java.io.*;  
  2. public class Kvadrat {  
  3.     public static void main(String[] args) throws IOException   
  4.         {  
  5.         String n1;  
  6.         BufferedReader kb=new BufferedReader(new InputStreamReader(System.in));  
  7.             n1=kb.readLine();   
  8.             int kv=Integer.parseInt(n1); // преоброзование типа String в int  
  9.             System.out.println("Периметр квадрата="+kv*4);  
  10.         }  
  11. }  

1.29. Дан радиус окружности. Найти длину окружности и площадь круга.

  1. import java.io.*;  
  2. public class Krug {  
  3.     public static void main(String[] args) throws IOException   
  4.         {  
  5.         String n1;  
  6.         double Pi=3.14;  
  7.         BufferedReader kb=new BufferedReader(new InputStreamReader(System.in));  
  8.             n1=kb.readLine();   
  9.             int r=Integer.parseInt(n1); // преоброзование типа String в int  
  10.             System.out.println("Длина окружности="+2*Pi*r);  
  11.             System.out.println("Площядь круга="+Pi*r*r);  
  12.         }  
  13. }  

1.49. Составить программу обмена значениями двух переменных величин.

  1. public class obmen {  
  2.     public obmen() {  
  3.     }  
  4.       public static void main(String[] args) {  
  5.         int a=10,b=20;  
  6.         a=a+b;  
  7.         b=a-b;  
  8.         a=a-b;  
  9.         System.out.println("a="+a+" "+"b="+b);  
  10.        }  
  11. }  

1.51. Дано вещественное число получить используя только операцию умножение
а) а^4 за две операции;

  1. public class obmen2 {  
  2.     public obmen2() {  
  3.     }  
  4.       public static void main(String[] args) {  
  5. long a=2,b;  
  6.             b=a*a;  
  7.             a=b*b;          
  8. System.out.println("a="+a);  
  9.       }  
  10. }  

б) а^6 за три операции;

  1. public class obmen2 {  
  2.     public obmen2() {  
  3.     }  
  4.       public static void main(String[] args) {  
  5.         long a=2,b;  
  6.         b=a*a;  
  7.         a=b*b;  
  8.         a=a*b;  
  9.         System.out.println("a="+a);  
  10.        }  
  11. }  

в) а^7 за четыре операции;

  1. public class obmen2 {  
  2.     public obmen2() {  
  3.     }  
  4.       public static void main(String[] args) {  
  5.         long a=2,b,c;  
  6.         c=a;  
  7.         b=a*a;  
  8.         a=b*b;  
  9.         a=a*b;  
  10.         a=a*c;  
  11.         System.out.println("a="+a);  
  12.        }  
  13. }  

г) а^8 за три операции;

  1. public class obmen2 {  
  2.     public obmen2() {  
  3.     }  
  4.       public static void main(String[] args) {  
  5.         long a=2,b,c;  
  6.         c=a;  
  7.         b=a*a;  
  8.         a=b*b;  
  9.         a=a*a;  
  10.    
  11.      System.out.println("a="+a);  
  12.        }  
  13. }  
З величинами цілих типів можна виконувати додаткові дії. До побітовим (або поразрядным) операторам мови Java відносяться наступні: ~ (додаток), & (побітове І), &= (побітове І з присвоюванням), | (побітове Або), |= (побітове Або з присвоюванням), ^ (виключає Або), ^= (виключає Або з присвоюванням), << (зсув вліво), <<= (зсув вліво з присвоюванням), >> (зсув вправо), >>= (зсув вправо з присвоюванням), >>> (зсув вправо з розмноженням нуля) і >>>= (зсув вправо з присвоюванням з розмноженням нуля).


Результати операцій двійкового доповнення, Або, що виключає Або і І виходять шляхом виконання над кожним з бітів операндів (операндів) дій у відповідності з таблицею

Таблица : Бітові операції
a b ~a a|b a^b a&b
0 0 1 0 0 0
1 0 0 1 1 0
0 1 1 1 1 0
1 1 0 1 0 1

 Наприклад, 4^5 дорівнює 1 (бо двійкові представлення цих чисел є відповідно 100 і 101).

У операторів зсуву другий аргумент показує кількість розрядів, на яку треба здійснити зсув у двійковому поданні першого операнда вліво ( << ) або вправо (для>> та >>>).


    int i = 3, j = 100; // i = 3, j = 100
    int k = i << 4;     // k = 48
    int m = j >> 2;     // m = 25
 
Легко зрозуміти, що зсув вліво на розрядів еквівалентний множенню на , а зсув вправо -- поділом на те ж число. 
 

 

Немає коментарів:

Дописати коментар