Skip to main content

1. Цифры

В главе вычислители уже было рассмотрено, как в оперативной памяти хранятся целые числа.

Теперь пришло время написать полезную программу. Да, она будет всего лишь складывать два числа, но на её примере мы рассмотрим основные аспекты алгоритмического программирования, и можно будет приступать к практике.

В ведении мы рассмотрели простейшую программу на Java:

package com.company;

public class Main {

public static void main(String[] args) {
// write your code here
}
}

Для выполнения любого из заданий все команды нужно писать между public static void main(String[] args) { и }. Эта конструкция называется главный метод.

Сейчас внутри главного метода всего одна команда:

    // write your code here

Это - команда комментария. Она ничего не делает. Если в начале команды стоит две косых черты //, то всё, что написано после них до конца строки при компиляции не учитывается. Комментарии очень полезны в больших программах, чтобы было проще разбираться в исходниках.

Чтобы создать переменную, необходимо сначала указать её тип, а потом название.

Важно: после каждой команды в Java ставится ;.

Например, строчка создаёт переменную с названием a типа int.

   int a;

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

В Java есть несколько целочисленных типов данных:

Тип данных Размер Минимальное значение Максимальное значение
byte 1 байт -128 127
short 2 байта -32768 32767
int 4 байта -2147483648 2147483647
long 8 байт –92233720368547758089223372036854775807

Чтобы присвоить значение переменной, нужно после её названия написать знак равно и значение, которое следует положить в эту переменную.

   int a;
a = 5;

В этом коде написано две команды: первая - это объявление переменной, вторая - присваивание ей значения.

Эти две команды можно заменить одной:

   int a = 5;

Новой командой мы сразу же и создаём переменную, и инициализируем её значением 55.

Переменных можно создавать, сколько угодно. Главное - чтобы у них были разные названия, и эти названия начинались на букву. С цифры переменную называть нельзя. Также в названии нельзя использовать знаки препинания и прочие специальные символы.

   int a = 5;
int b;
b = a;

Этот фрагмент кода объявляет переменную a, инициализирует её значением 55. После этого объявляется переменная b и следующей командой в переменную b сохраняется значение, которое сохранено в a, т.е. 55.

Этот фрагмент кода объявляет переменную a, инициализирует её значением 55. После этого объявляется переменная b и следующей командой в переменную b сохраняется значение, которое сохранено в a, т.е. 55.

Когда мы инициализируем переменную тем или иным значением вручную, происходит преобразование текста в тот или иной тип. Т.к. целочисленных типов несколько, возникает вопрос, как сказать компилятору, какой именно тип мы имеем в виду.

Для этого используются литералы. Литерал - это просто добавочная буква в конце числа. Чтобы обозначить, что наше число должно стать типом long, нужно добавить после него большую букву L. Если этого не сделать, то java выдаст ошибку, т.к. по умолчанию целые числа сохраняются в типе int, а 10000000000 в int не помещается.

Обратите внимание: при инициализации переменной b тоже выделяется как ошибка. Это тоже вызвано тем, что 10001000 не помещается в тип byte. При этом следующая команда short s = 10000 не помечается, как ошибка. Это происходит из-за того, что java автоматически переводит в нужный тип текст, если этот тип меньше или равен по размеру int.

xor

Помимо прямого присваивания над переменными можно производить операции. При этом нам абсолютно неважно, какие именно регистры выполнят эту операцию. В языках высокого уровня нам нужно только указать, что нужно сделать с переменной, а компилятор решит за нас, как обеспечить выполнение такого алгоритма в управляющих командах процессору.

   int a;
a = 7;
int b = 5;
int c = a + b;

Сначала мы объявили переменную a типа int, потом присвоили ей значение 77, потом создали переменную b и инициализировали её значением 55. После этого мы создали третью переменную c и инициализировали её значением, равным сумме значений, лежащих в переменных a и b.

Помимо сложения, над целыми числами можно производить следующие операции:

  • * - умножение
  • - - разность
  • / - частное от целочисленного деления (div)
  • % - остаток от деления
  • >> - оператор побитового сдвига вправо, эквивалентен делению первого аргумента на 22 в степени второго
  • << - оператор побитового сдвига влево, эквивалентен умножению первого аргумента на 22 в степени второго

Обратите внимание: % - знаковая функция, т.е. -11 % 2 = -1.

Для каждой арифметической операции существует укороченная форма. Например,

    a = a + b;

можно заменить укороченной командой:

    a += b;

Тоже самое верно и для остальных операций. Например:

    a = a / b;

эквивалентно

    a /= b;

Также существуют, так называемые команды инкремента и декремента.

Команды

    a = a + 1;
b = b - 1;

Можно записать короче:

    a++;
b--;

Первая команда называется инкремент, вторая - декремент.

В java инкременты разделяются на преинкремент и постикременты, а декременты 0 на предекремент и постдекремент.

Различие между преинкрементом и постинкременто заключается в том, написан он справа от переменной или слева.

public class Main {
public static void main(String[] args) {
int a = 10;
int b = ++a; // преинкремент
int c = a++; // постинкремент
int d = a--; // постдекремент
int e = --a; // предекремент
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(e);
}
}

Получим:

10
11
11
12
10

Команда преинкремента сначала выполняет увеличение, а потом возвращает его, а постинкремент - сначала возвращает, потом увеличивает.

Тоже самое верно и для декремента.

Основной смысл программирования заключается в автоматизации рутинной работы.

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

Для этого используется специальная конструкция сканера. Пока что вам нужно просто выучить команду, которая подготовит его для нас:

   Scanner sc = new Scanner(System.in);

После этого каждая команда вида

   a = sc.nextInt();

Будет считывать с консоли очередное целое число и помещать его в переменную a.

Важно понимать, что положить значение очередного числа можно в любую переменную, просто в примере это сделано для переменной a.

Если нам нужно считать другой целочисленный тип данных, то используются команды с соответствующим названием:

   byte b = sc.nextByte();
short s = sc.nextShort();
long l = sc.nextLong();

Перепишем теперь нашу программу так, чтобы она считывала два числа с клавиатуры в переменные a и b, а после сохраняла в переменную c их сумму.

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int c;
c = a + b;
}
}

Обратите внимание: в первой строке исходников появилась строчка import java.util.Scanner;

Она тоже обязательна при использовании сканера. Пока что её тоже придётся выучить.

Теперь мы можем ввести с клавиатуры два числа:

xor

Правда пока что мы не можем увидеть результат. Для этого нам необходимо добавить вывод значения переменной c на консоль.

Это делается при помощи команды System.out.print():

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int c;
c = a + b;
System.out.print(c);
}
}

xor

Подробнее о команде System.out.print() написано во введении.

Перепишем теперь программу так, чтобы она выводила результаты всех пяти арифметических действий над числами:

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int c = a + b;
int d = a - b;
int e = a * b;
int f = a / b;
int g = a % b;
System.out.println(c);
System.out.println(d);
System.out.println(e);
System.out.println(f);
System.out.println(g);
}
}

Введём числа 5050 и 2020, получим ответ:

70
30
1000
2
10

Если нам нужно записать более сложное выражение, например: a+10bc(d+20)a+10b-c(d+20), то для записи его на языке java, нужно учитывать порядок действий.

Порядок арифметических действий определяется их приоритетом. Самый высокий приоритет имеют скобки, как в математике. Следующими в порядке понижения приоритета идут постинкременты и постдекременты, потом преинкременты и предекременты, потом операции *, /, %. Самый низкий приоритет у + и -.

Очерёдность важна не только в арифметических действиях. В цепочке присваиваний тоже важен порядок:

   int a = 10;
int b;
int c = b = a;

В команде int c = b = a; сначала в переменную b кладётся значение из a, а потом значение из b (уже равное a) кладётся в переменную c.

Обычная запись чисел, к которой мы привыкли, в действительности является записью числа в десятеричной системе.

Чтобы получить последнюю цифру, нам необходимо просто взять остаток от деления числа на 10:

   int a = scanner.nextInt();
int a0 = a % 10;

Если мы хотим получить вторую цифру, то нужно просто сначала разделить число на 10, эта операция равносильна отбрасыванию последней цифры. Теперь нужная нам цифра стоит на последнем месте. Мы можем просто взять остаток от деления нового числа на 10 и получить ответ:

   int a = scanner.nextInt();
int b = a / 10;
int a1 = b % 10;

Чтобы вывести переменные через пробел, нужно просто использовать команду print() вместо println(): первой командой выводится значение переменной, второй - пробел, третьей - второй переменной, потом - снова пробел и т.д.

   System.out.print(a);
System.out.print(" ");
System.out.print(b);
System.out.print(" ");
System.out.print(c);

Если нам нужно обнулить разряд десятков, нам нужно вычесть из переменной цифру его десятков, умноженную на 10:

   // исходное число
int a = scanner.nextInt();
// кол-во десятков
int b = a / 10 % 10;
// результат
int c = a - b * 10;

Задание

  1. Ввести с клавиатуры натуральное двузначное число. Вывести на экран через пробел: младший разряд, старший разряд и сумму разрядов введенного числа.
  2. Дано трёхзначное число, обнулить его разряд единиц
  3. Дано трёхзначное число, обнулить его разряд десятков
  4. Дано трехзначное число. Найти число, полученное при перестановке первой и второй цифр заданного числа.
  5. Дано трехзначное число. Найти число, образуемое при перестановке первой и второй, третьей и четвертой цифр заданного числа. Например, из числа 54345434 получить 45434543, из числа 70487048 - 784784;
  6. Дано четырехзначное число. Найти число, образуемое при перестановке двух первых и двух последних цифр за-данного числа. Например, из числа 45664566 получить 66456645, из числа 73047304 - 473473.
  7. Дано четырёхзначное число, проверить, что оно является палиндромом, т.е. не изменяется при перестановке цифр в обратном порядке. Если является вывести 0, в противном случае вывести разность между исходным числом и его разворотом.

Ссылка на контест