Бесплатный пробный урок: Java Developer
Пройдите пару настоящих уроков этого курса — регистрация не требуется.
Урок 1: Переменные, типы данных и операторы
Java — это простой, объектно-ориентированный и высокоэффективный язык программирования. Одна из его основных целей — облегчить и ускорить процесс обучения. Чтобы успешно написать программу на Java, достаточно запомнить основные ключевые слова, и ваш код будет корректно выполнен.
В этой теме мы познакомимся с базовой структурой Java-программы, переменными, типами данных, вводом данных с консоли и основными математическими операторами.
Первая программа на Java
Давайте рассмотрим первый простой пример программы на Java:
public class Main {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a + b);
}
}
30При запуске данного кода мы создаём два числа: a и b. Переменная a равна 10, а переменная b равна 20. Затем мы выводим их сумму:
a + b = 10 + 20 = 30
Команда System.out.println(a + b); выводит результат в консоль.
Структура Java-программы
Если разобрать программу, которую мы написали выше, то мы видим, что она начинается с ключевых слов: public class Main.
Это означает, что мы создаём класс под названием Main. Причём название класса должно быть один в один одинаковым с названием файла исходного кода.
Если файл называется Main.java, то класс должен называться Main. Если файл называется Hello.java, то класс должен называться Hello.
Например, если вы решили назвать файл Hello.java, то код будет выглядеть так:
public class Hello {
public static void main(String[] args) {
...
}
}
Далее мы видим фигурные скобки { }. Они открывают и закрывают блок кода. В Java очень важно следить за тем, чтобы каждая открытая скобка была закрыта.
Внутри класса мы создаём главный метод программы: public static void main(String[] args). Именно с этого метода начинается выполнение Java-программы.
Базовая структура:
public class Main {
public static void main(String[] args) {
// Здесь пишется алгоритм программы
}
}
Тему методов мы рассмотрим немного позже. Пока самое главное запомнить: любая Java-программа запускается с метода main.
Вывод текста в консоль
Для вывода данных в консоль мы используем команду System.out.println().
public class Main {
public static void main(String[] args) {
System.out.println("Hello BITLAB");
}
}
Hello BITLABОбратите внимание, что в конце каждого выражения мы ставим точку с запятой: ;. Она означает, что выражение завершено.
Переменные и тип int
Переменная — это участок памяти, где хранится значение. В Java каждая переменная имеет свой тип данных.
Например, для хранения целых чисел используется тип int. Слово int означает integer, то есть целое число.
public class Main {
public static void main(String[] args) {
int age = 22;
System.out.println(age);
}
}
22В этом примере мы создали переменную age, сохранили в ней число 22 и вывели это значение в консоль.
Тип double
Для хранения дробных чисел в Java используется тип double.
public class Main {
public static void main(String[] args) {
double x = 3.4;
double y = 4.5;
double sum = x + y;
System.out.println("Result is: " + sum);
}
}
Result is: 7.9В этом примере мы создали уже не целые числа, а дробные. Для этого мы использовали тип данных double.
В Java нельзя создать дробную переменную через тип int:
int x = 3.4;
int y = 4.5;
Такой код вызовет ошибку, потому что int хранит только целые числа. Для дробных чисел нужно использовать double.
Также обратите внимание на строку: System.out.println("Result is: " + sum);. Здесь мы объединяем текст и число при помощи оператора +.
Тип String
Для хранения текста в Java используется тип String.
public class Main {
public static void main(String[] args) {
String name = "Ilyas";
String surname = "Zhuanyshev";
String city = "Almaty";
String sentence = "I am " + name + " " + surname + " from " + city;
System.out.println(sentence);
}
}
I am Ilyas Zhuanyshev from AlmatyВ этом примере мы создаём три переменные типа текста: name, surname и city.
Обратите внимание, что текст в Java должен начинаться и заканчиваться двойными кавычками: " ".
Правильно: String name = "Ilyas";
Некоторые начинающие разработчики часто допускают такую ошибку:
String name = Ilyas; // Так нельзя!
String surname = Zhuanyshev; // Так нельзя!
String city = Almaty; // Так нельзя!
Такой код неправильный, потому что Java будет думать, что Ilyas, Zhuanyshev и Almaty — это названия переменных, а не текст.
Основные типы данных в Java
Для работы с целыми числами:
byte— маленькое целое числоshort— короткое целое числоint— стандартное целое числоlong— большое целое число
Для работы с дробными числами:
float— дробное число меньшей точностиdouble— дробное число большей точности
Для работы с символами:
char— один символ
Для логических значений:
boolean— true или false
Для работы с текстом:
String— текстовые данные
Ввод данных с консоли
Теперь возникает вопрос: всегда ли нам надо объявлять значение переменных прямо в коде? А вдруг мы захотим вводить их произвольно?
Для этого в Java есть готовый класс Scanner. Он находится в библиотеке java.util и позволяет считывать данные с консоли.
Давайте изменим первый пример, где мы складывали два целых числа:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Insert first number:");
int a = in.nextInt();
System.out.println("Insert second number:");
int b = in.nextInt();
System.out.println(a + b);
}
}
5
712При запуске программы консоль будет требовать ввести два целых числа. Если мы введём 5 и 7, то получим 12.
Код import java.util.Scanner; означает, что мы импортируем готовый класс Scanner.
Код Scanner in = new Scanner(System.in); создаёт объект Scanner, который будет читать данные с консоли.
Метод in.nextInt() считывает целое число типа int.
Ввод дробных чисел
Также можно вводить дробные числа произвольно, прямо из консоли. Для этого используется метод nextDouble().
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Insert first number:");
double x = in.nextDouble();
System.out.println("Insert second number:");
double y = in.nextDouble();
double sum = x + y;
System.out.println("Result is: " + sum);
}
}
2.2
4.5Result is: 6.7Единственное отличие от ввода целых чисел: вместо in.nextInt() мы пишем in.nextDouble().
Ввод строк
Для считывания строк, то есть текста, мы используем метод in.next().
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Insert name:");
String name = in.next();
System.out.println("Insert surname:");
String surname = in.next();
System.out.println("Insert city:");
String city = in.next();
String sentence = "I am " + name + " " + surname + " from " + city;
System.out.println(sentence);
}
}
Aybek Serikov AktobeI am Aybek Serikov from AktobeМетод next() считывает одно слово до пробела. Поэтому имя, фамилию и город мы считываем тремя отдельными вызовами in.next().
Математические операторы
Математические операторы позволяют выполнять операции с числами. Они часто используются в задачах, расчётах и алгоритмах.
Сложение (+)
int a = 10;
int b = 20;
int sum = a + b; // 30
Вычитание (-)
int a = 20;
int b = 15;
int diff = a - b; // 5
Умножение (*)
int a = 10;
int b = 5;
int result = a * b; // 50
Деление (/)
int a = 50;
int b = 5;
int div = a / b; // 10
Остаток от деления (%)
int a = 21;
int b = 6;
int rem = a % b; // 3
Для начала этих операторов достаточно, чтобы решать базовые задачи на вычисления.
Оператор остатка %
У вас, наверное, возник вопрос по поводу оператора остатка. Данный оператор возвращает остаток от деления двух чисел.
Например, если мы делим 30 на 7, то 7 помещается в 30 четыре раза:
7 * 4 = 28
30 - 28 = 2
30 % 7 = 2
Например, 40 % 5 будет 0, потому что 40 делится на 5 без остатка.
Оператор % часто используют, чтобы проверить: делится ли число на другое число без остатка, является ли число чётным или нечётным, или нужно ли выполнить действие через каждые несколько шагов.
Для начала этого материала достаточно. Теперь рекомендуется попрактиковаться и решить несколько задач для закрепления переменных, типов данных, Scanner и математических операторов.
Средний доход компании
String companyName, int profit, double month) и выведет в консоль наименование компании и средний доход в месяц.P&G
145900
8Company P&G earns 18237.5 dollars in a monthAirAstana
142854
5.8Company AirAstana earns 24630.0 dollars in a month-
Ввод:
P&G, 145900, 8 -
Ввод:
AirAstana, 142854, 5.8 -
Ввод:
TechCorp, 100000, 4 -
Ввод:
Kcell, 96000, 12 -
Ввод:
Halyk, 45000, 9
Вывод данных пользователя
Alibek
Maratov
19
KazakhstanName: Alibek
Surname: Maratov
Age: 19
Country: KazakhstanAigerim
Bekova
21
KazakhstanName: Aigerim
Surname: Bekova
Age: 21
Country: Kazakhstan-
Ввод:
Alibek, Maratov, 19, Kazakhstan -
Ввод:
Aigerim, Bekova, 21, Kazakhstan -
Ввод:
John, Smith, 30, USA -
Ввод:
Marat, Zhaksybekov, 17, Kazakhstan -
Ввод:
Elena, Petrova, 25, Russia
Квадрат и куб числа
24
8636
216-
Ввод:
2 -
Ввод:
6 -
Ввод:
3 -
Ввод:
10 -
Ввод:
-2
Вычисление формулы
x. Найти значение y = 3x² − 6x − 7 при данном значении x.2-7538-
Ввод:
2 -
Ввод:
5 -
Ввод:
1 -
Ввод:
3 -
Ввод:
4
Формула с тремя переменными
x³ + 5xy − 6zy + z³ и выведет результат в консоль. Данные по переменным x, y, z вводятся через консоль.1 2 323 3 8440-
Ввод:
1 2 3 -
Ввод:
3 3 8 -
Ввод:
0 0 0 -
Ввод:
2 1 1 -
Ввод:
1 1 1
Урок 2: Условные операторы
В повседневной жизни мы очень часто применяем условия. Например, мы просыпаемся и начинаем завтракать. Если чайник вскипел, то мы отключаем его. Если ещё нет, то ждём, пока он не вскипит. Мы начинаем одеваться и идём на работу. Если мы опаздываем, то заказываем такси; иначе, не спеша, идём пешком минут 25. Если после работы мы голодны, то идём ужинать. Если дома нет еды, то мы заказываем. Так можно до бесконечности прописывать алгоритм условий нашей жизни.
Одним словом, мы всегда действуем и принимаем решения в зависимости от ситуации, то есть входных данных. Точно так же в программировании можно создавать условия действия в зависимости от переменных и их значений.
Условия if
Например, я ввожу число. Если это число больше 10, то я вывожу текст "YES":
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Insert number:");
int a = in.nextInt();
if (a > 10) {
System.out.println("YES");
}
System.out.println("Program ended");
}
}
20YES
Program ended5Program endedКак работает данный код?
Во-первых, мы создаём целое число int a, значение которого вводим через консоль. Затем мы создаём проверку условия при помощи обычного оператора сравнения >, то есть больше.
Ключевое слово if означает «если». Если a > 10, то программа входит в блок кода внутри фигурных скобок. Если условие неверное, программа пропускает этот блок и продолжает выполнение дальше.
Как вы заметили, проверка условия всегда выдаёт один из двух результатов: true — истина, или false — ложь.
Условия с несколькими проверками
Также можно делать несколько сравнений при помощи логических операторов. Например, мы вводим число, и если это число между 10 и 20, то условие будет верным. Если подумать логически, то число, которое между 10 и 20, должно быть меньше 20 и одновременно больше 10. Если одно из этих условий не будет верным, то и всё условие не выполнится.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Insert number:");
int a = in.nextInt();
if (a > 10 && a < 20) {
System.out.println("YES");
}
System.out.println("Program ended");
}
}
Как видно на примере, мы используем двойной символ амперсанда — &&. Этот символ означает логическое «И».
Если я введу число 15, то оно окажется между 10 и 20, так как 15 меньше 20 и при этом больше 10. В случае, если я введу 25, то условие «больше 10» выдаст true, но условие «меньше 20» выдаст false, так как 25 не меньше 20. Таким образом, если я введу 25, то я перепрыгну блок условия.
Ниже приведена таблица логических операторов с их объяснениями:
| Оператор | Описание | Пример |
|---|---|---|
&& |
Логический И | 10 > 5 && 20 <= 40 будет TRUE |
|| |
Логический ИЛИ | 5 == 3 || 30 < 20 будет FALSE |
! |
Логический НЕ | 5 != 5 будет FALSE |
Логический оператор И
Логический И (AND) работает по такому принципу: все условия должны быть верными, то есть истиной. Приведу простой пример из жизни. Например, я скажу так:
«И Ильяс, и Айбек, и Елдар, и Анель сдали экзамен на отлично.»
В этом предложении, если вдруг кто-то из перечисленных ребят не сдал экзамен на отлично, то моё предложение станет неверным. Чтобы моё предложение было подлинным, все должны сдать экзамен на отлично. Точно так же и в программировании.
Когда я использую логический оператор И (&&), все условия должны быть верными, то есть true.
Логический оператор ИЛИ
А теперь давайте рассмотрим логический оператор ИЛИ (OR). В языке Java логическое ИЛИ обозначается символом ||. Логическое ИЛИ работает по следующему принципу: хотя бы одно из условий должно быть верным.
Например, я могу сказать так:
«Или Ильяс, или Айбек, или Елдар, или Анель сдали экзамен на отлично.»
В этом примере, если никто не смог сдать экзамен на отлично, значит, я вру. То есть, чтобы предложение было подлинным, хотя бы один из ребят должен сдать экзамен на отлично.
В программировании я могу привести такой пример: мы вводим число, и если оно равно 10 или 20, то программа выдаст слово "YES".
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Insert number:");
int a = in.nextInt();
if (a == 10 || a == 20) {
System.out.println("YES");
}
System.out.println("Program ended");
}
}
В этом примере, если мы введём число 10 или 20, то выражение будет верным, и программа выдаст слово "YES". Теперь мы с вами знаем, как работают операторы И и ИЛИ.
Логический оператор НЕ
А теперь перейдём к следующему логическому оператору НЕ (NOT). Оператор НЕ в программировании обозначается простым символом восклицательного знака — !. Оператор НЕ переводит выражение true в false или наоборот:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Insert number:");
int a = in.nextInt();
if (a != 10) {
System.out.println("YES");
}
System.out.println("Program ended");
}
}
В этом примере, если мы вводим любое число, кроме 10, то программа выведет слово "YES". Тут мы просто проверяем, не является ли число 10.
Условия if-else
Сейчас мы можем рассмотреть действие, если условие будет неверным. Реализовать это можно при помощи ключевого слова — else.
Например, я создам программу, где проверяю ваш возраст для входа в клуб. Если ваш возраст равен 18 или выше, то программа выведет текст "You can enter", иначе "Sorry, you can't".
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Insert your age:");
int age = in.nextInt();
if (age >= 18) {
System.out.println("You can enter");
} else {
System.out.println("Sorry, you can't");
}
}
}
Если условие внутри if верное, выполняется первый блок. Если условие неверное, выполняется блок else.
При запуске данного кода, если мы введём 25, то программа выдаст текст "You can enter", иначе "Sorry, you can't". Именно благодаря блоку else мы имеем альтернативное поведение нашей программы.
Условия else if
Представьте себе такую ситуацию: мы вводим число от 1 до 7, то есть дни недели по нумерации. Если я введу 1, то программа выведет текст — "Monday". Если 2, то — "Tuesday", если 3, то — "Wednesday" и так далее, до 7 — "Sunday".
Но если мы введём число, которое не входит в диапазон дней недели, например 15, то программа выведет текст — "Error". Задача довольно непростая, однако её легко решить при помощи условия else if:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Insert day of the week:");
int day = in.nextInt();
if (day == 1) {
System.out.println("Monday");
} else if (day == 2) {
System.out.println("Tuesday");
} else if (day == 3) {
System.out.println("Wednesday");
} else if (day == 4) {
System.out.println("Thursday");
} else if (day == 5) {
System.out.println("Friday");
} else if (day == 6) {
System.out.println("Saturday");
} else if (day == 7) {
System.out.println("Sunday");
} else {
System.out.println("Error");
}
}
}
При запуске кода, если я введу числа от 1 до 7 включительно, то программа выведет дни недели в виде текста соответственно. Если я введу число вне диапазона от 1 до 7, то результатом будет "Error".
Условие else if работает по такому принципу: мы делаем обычную проверку через if, и если условие окажется неверным, то мы заново делаем проверку. Конечный else срабатывает тогда, когда ни один из вариантов не подходит под условие.
Это как в жизни: вы идёте в магазин электроники, хотите купить домой телевизор. Начинаете смотреть все варианты, пока не найдёте нужный. Если вы не находите подходящий вариант, то идёте в другой магазин или возвращаетесь домой.
Поздравляю, теперь вы знаете, как работают условия в программировании. С этого момента вы способны создавать программы, которые действуют несколькими вариантами, в зависимости от входных данных.
Больше ровно на 10
YES, иначе NO.20
10YES10
75NO-
Ввод:
20, 10 -
Ввод:
10, 75 -
Ввод:
15, 5 -
Ввод:
8, 8 -
Ввод:
50, 30
Сумма, если не равны
a и b. Если их значения не равны, то выводите в консоль их сумму, иначе просто 0.10
203010
100-
Ввод:
10, 20 -
Ввод:
10, 10 -
Ввод:
5, 15 -
Ввод:
7, 3 -
Ввод:
-10, 10
Какая это школа?
Beginners School, с 5-го по 9-ый включительно — Middle School, а с 10-го по 11-ый включительно — High School.2Beginners School10High School-
Ввод:
2 -
Ввод:
10 -
Ввод:
1 -
Ввод:
9 -
Ввод:
11
Все три числа равны?
YES, иначе NO.15
15
15YES12
37
20NO-
Ввод:
15, 15, 15 -
Ввод:
12, 37, 20 -
Ввод:
0, 0, 0 -
Ввод:
5, 5, 6 -
Ввод:
-3, -3, -3
Положительное и чётное
YES, если введённое целое число является положительным и чётным, иначе NO.12YES-5NO-
Ввод:
12 -
Ввод:
-5 -
Ввод:
7 -
Ввод:
0 -
Ввод:
100
Урок 3: Циклы: while и for
В программировании очень часто бывают ситуации, когда одно и то же действие нужно выполнить несколько раз. Например, вывести один и тот же текст много раз, обработать несколько чисел, пройтись по списку студентов, повторять действие до тех пор, пока условие остаётся верным.
Для таких задач в Java используются циклы. Цикл позволяет не писать один и тот же код снова и снова, а описать повторение один раз.
Зачем нужны циклы?
Представьте себе такую ситуацию. Вы хотите запустить процесс, который повторяется периодически до определённого момента. Например, вывести слово "Hello BITLAB" 10 раз.
Без циклов это будет выглядеть таким образом:
public class Main {
public static void main(String[] args) {
System.out.println("Hello BITLAB");
System.out.println("Hello BITLAB");
System.out.println("Hello BITLAB");
System.out.println("Hello BITLAB");
System.out.println("Hello BITLAB");
System.out.println("Hello BITLAB");
System.out.println("Hello BITLAB");
System.out.println("Hello BITLAB");
System.out.println("Hello BITLAB");
System.out.println("Hello BITLAB");
}
}
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLABТакой код работает, но он неудобный. А теперь представьте себе, что мы захотим вывести этот же текст 100 раз. Сложновато, согласны?
В таком случае вам нужно будет 100 раз написать: System.out.println("Hello BITLAB");. А если вдруг мы захотим изменить текст, то придётся менять его во многих местах.
Главная идея циклов: написать повторяющееся действие один раз и указать Java, сколько раз или до какого момента его нужно повторять.
С циклами всё меняется. Код становится короче, понятнее и удобнее для изменения.
Цикл while
Данную задачу, по выводу текста "Hello BITLAB" 10 раз, можно сократить таким образом:
public class Main {
public static void main(String[] args) {
int i = 0;
while (i < 10) {
System.out.println("Hello BITLAB");
i = i + 1;
}
}
}
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLABСмысл здесь заключается в том, что цикл while выполняет проверку, как обычное условие if.
Если условие верное, выполняется блок кода. Если условие неверное, блок кода пропускается. Главное отличие цикла while заключается в том, что после выполнения блока он возвращается обратно к проверке условия.
Цикл while читается так: пока условие верное — выполняй этот блок кода.
Таким образом, цикл while будет выполняться до тех пор, пока условие i < 10 остаётся верным.
Как работает while шаг за шагом?
Давайте разберём цикл подробнее. В нашем примере есть переменная i. Она нужна для того, чтобы считать количество повторений.
- Создаём переменную
int i = 0; - Проверяем условие
i < 10 - Если условие верное, выводим "Hello BITLAB"
- Увеличиваем i на 1
- Снова возвращаемся к проверке условия
На каждом шаге значение переменной i увеличивается:
i = 0 → i = 1 → i = 2 → i = 3 → ... → i = 10
Когда i станет равным 10, условие i < 10 станет ложным, потому что 10 уже не меньше 10. После этого цикл завершится.
Важное замечание про while
В цикле while очень важно не забывать изменять переменную, которая участвует в условии.
В нашем примере такой строкой является:
i = i + 1;
Если убрать эту строку, значение i всегда останется равным 0. Тогда условие i < 10 всегда будет верным, и программа будет бесконечно выводить "Hello BITLAB".
Бесконечный цикл — это ситуация, когда условие цикла всегда остаётся верным, и цикл никогда не заканчивается.
Поэтому при работе с while всегда проверяйте, что внутри цикла есть действие, которое рано или поздно сделает условие ложным.
Цикл for
Цикл for является одним из самых популярных и часто используемых в программировании. Конструкция for управляет циклом и выполняется до тех пор, пока управляющее логическое выражение не станет ложным.
В цикле for сначала выполняется инициализация, затем проверка условия, далее выполнение блока кода, и после этого происходит итерация, то есть шаг.
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("Hello BITLAB");
}
}
}
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLABЭтот код делает то же самое, что и пример с while: выводит "Hello BITLAB" 10 раз.
Но цикл for выглядит компактнее, потому что инициализация, условие и шаг записаны в одной строке.
Структура цикла for
Общая структура цикла for выглядит так:
for (инициализация; условие; итерация) {
// блок for
}
- Инициализация — создаём начальное значение, например
int i = 0 - Условие — проверяем, можно ли продолжать цикл, например
i < 10 - Итерация — выполняем шаг после каждого повторения, например
i++
В нашем примере:
int i = 0;— начинаем с 0i < 10;— выполняем, пока i меньше 10i++— после каждого шага увеличиваем i на 1
Блок кода будет выполняться, пока условие остаётся верным. Сначала происходит инициализация, затем проверка условия, выполнение блока и после этого шаг итерации.
i++ и i = i + 1
В примере с while мы увеличивали переменную так:
i = i + 1;
В цикле for мы написали короче:
i++;
Эти записи делают одно и то же: увеличивают значение переменной i на 1. Поэтому i++ часто используется в циклах.
Область действия переменной в for
Объявляя переменную управления циклом for внутри самого цикла, необходимо помнить, что область её действия ограничена только телом цикла.
Например:
for (int i = 0; i < 10; i++) {
System.out.println("Hello BITLAB");
}
В этом случае переменная i существует только внутри цикла. За пределами цикла эта переменная перестаёт существовать.
Если же переменную управления требуется использовать в других частях программы, её необходимо объявлять заранее, вне цикла for.
public class Main {
public static void main(String[] args) {
int i;
for (i = 0; i < 10; i++) {
System.out.println("Hello BITLAB");
}
System.out.println("Loop finished");
}
}
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Hello BITLAB
Loop finishedЕсли переменная нужна только для цикла — объявляйте её внутри for. Если она нужна после цикла — объявляйте её заранее.
Когда использовать while, а когда for?
Оба цикла могут решать похожие задачи, но обычно их используют в разных ситуациях.
while удобно использовать, когда заранее не всегда понятно, сколько раз нужно повторять действие.
for удобно использовать, когда количество повторений известно заранее, например вывести "Hello BITLAB" 10 раз.
В начале обучения чаще всего удобно использовать for, когда нужно повторить действие определённое количество раз. А while хорошо подходит для задач, где повторение зависит от условия.
Теперь рекомендуется попрактиковаться и решить несколько задач, чтобы закрепить циклы while и for. После этой темы вы сможете писать программы, которые повторяют действия много раз без лишнего копирования кода.
Считаем до n
n и выводит на экран все числа от 1 до n. Подсказка: для вывода чисел на одной строке можно использовать System.out.print() вместо System.out.println().51 2 3 4 5101 2 3 4 5 6 7 8 9 10-
Ввод:
5 -
Ввод:
10 -
Ввод:
1 -
Ввод:
7 -
Ввод:
0
Считаем от n до m
n и m и выводит на экран все числа от n до m. Подсказка: для вывода чисел на одной строке можно использовать System.out.print() вместо System.out.println().5 105 6 7 8 9 102 92 3 4 5 6 7 8 9-
Ввод:
5 10 -
Ввод:
2 9 -
Ввод:
1 3 -
Ввод:
7 7 -
Ввод:
4 1
Чётные числа до n
n и выводит на экран все ЧЁТНЫЕ числа от 0 до n (чётные числа делятся на 2 без остатка).60 2 4 6100 2 4 6 8 10-
Ввод:
6 -
Ввод:
10 -
Ввод:
0 -
Ввод:
1 -
Ввод:
7
Факториал через for
n и выводит на экран факториал данного числа с использованием цикла for.512001-
Ввод:
5 -
Ввод:
0 -
Ввод:
1 -
Ввод:
3 -
Ввод:
6
Нечётные числа от n до m
n и m и выводит на экран все НЕЧЁТНЫЕ числа от n до m.3 113 5 7 9 1110 2311 13 15 17 19 21 23-
Ввод:
3 11 -
Ввод:
10 23 -
Ввод:
1 5 -
Ввод:
6 6 -
Ввод:
0 1
Урок 4: Массивы
В программировании очень часто нужно хранить не одно значение, а сразу несколько значений одного типа. Например, в BITLAB ACADEMY у нас может быть группа студентов, и у каждого студента есть результат экзамена.
Если студентов мало, можно создать несколько отдельных переменных. Но если студентов много, такой подход быстро становится неудобным. Для таких задач в Java используются массивы.
Проблема без массива
Рассмотрим случай, когда вы хотите сохранить результаты экзаменов для 5 студентов в группе и распечатать их сумму и среднее значение. Обычно вы можете создать в своей программе 5 переменных типа double и работать с ними.
public class Main {
public static void main(String[] args) {
double sc1 = 100;
double sc2 = 90;
double sc3 = 95;
double sc4 = 80;
double sc5 = 75;
double total = sc1 + sc2 + sc3 + sc4 + sc5;
double average = total / 5;
System.out.println("Total score : " + total);
System.out.println("Average score : " + average);
}
}
Total score : 440.0
Average score : 88.0Как вы видите с примера, мы создали 5 переменных double для баллов каждого студента, и посчитали сумму со средним значением.
Но это очень неэффективно, так как такого рода алгоритмы статичны. Если вдруг мне скажут, что нужно добавить еще 5 студентов, то будет глупо постоянно для них создавать отдельные переменные.
А если в группе будет не 5 студентов, а 100 студентов? Тогда создавать переменные sc1, sc2, sc3 и так далее вручную будет очень неудобно.
Для решения такого рода проблем нам нужно хранить данные о баллах студентов в одной структуре. И тут к нам на ум приходят — массивы.
Что такое массив?
Массив — тип или структура данных в виде набора компонентов, то есть элементов массива, расположенных в памяти непосредственно друг за другом.
При этом доступ к отдельным элементам массива осуществляется с помощью индексации, то есть через ссылку на массив с указанием номера, или индекса, нужного элемента.
В языке Java массив удобен для работы с большим количеством однотипных данных. Например, если все значения являются оценками студентов, мы можем хранить их в одном массиве типа double.
Одним словом, если переменная — это одноместный мотоцикл, то массив — это автобус, куда можно поместить кучу переменных, то есть пассажиров.
Если будем возвращаться к нашему примеру, то давайте представим, что мы создали массив с баллами наших студентов:
double scores[] = {100, 90, 95, 80, 75};
Теперь все 5 результатов находятся не в отдельных переменных, а внутри одного массива с названием scores.
Как выглядит массив внутри?
У каждого элемента массива есть свой номер, который называется индекс. Самое важное правило: в Java индексы массива начинаются с 0.
- scores[0] = 100
- scores[1] = 90
- scores[2] = 95
- scores[3] = 80
- scores[4] = 75
Получается, если в массиве 5 элементов, то индексы будут не от 1 до 5, а от 0 до 4.
Первый элемент массива — scores[0]. Последний элемент массива из 5 элементов — scores[4].
Если вы попробуете обратиться к scores[5], программа выдаст ошибку, потому что элемента с таким индексом в массиве нет.
Иллюстрация массива
Давайте визуально представим, как выглядит массив scores[] в памяти программы:
| Индекс | Значение | Элемент |
|---|---|---|
| 0 | 100 | scores[0] |
| 1 | 90 | scores[1] |
| 2 | 95 | scores[2] |
| 3 | 80 | scores[3] |
| 4 | 75 | scores[4] |
Как видно на иллюстрации, массив scores состоит из 5 элементов. У каждого элемента есть свой индекс. Самое главное запомнить: индексация массива в Java всегда начинается с 0.
Это означает, что первый элемент массива — scores[0], а последний элемент в данном примере — scores[4].
Сумма и среднее значение через массив
Давайте теперь посмотрим на программу, где я вычисляю сумму и среднее значение массива:
public class Main {
public static void main(String[] args) {
double scores[] = {100, 90, 95, 80, 75};
double total = 0;
for (int i = 0; i < scores.length; i++) {
total += scores[i];
}
double average = total / scores.length;
System.out.println("Total score : " + total);
System.out.println("Average score : " + average);
}
}
Total score : 440.0
Average score : 88.0Давайте попробуем разобрать данный код. Во-первых, мы создаем массив с 5 элементами:
double scores[] = {100, 90, 95, 80, 75};
Чтобы получить доступ к первому элементу, мы должны написать scores[0], так как индекс всегда начинается с 0. Второй элемент — scores[1] и так далее.
Если вы хотите распечатать последний элемент массива, напишите System.out.println(scores[4]);.
Как работает цикл по массиву?
В примере выше мы используем цикл for, чтобы пройтись по всем элементам массива.
for (int i = 0; i < scores.length; i++) {
total += scores[i];
}
По этой логике создаем цикл, начиная с 0 по 5 не включительно. То есть, наш i будет принимать значения: 0, 1, 2, 3, 4 на каждой итерации.
- i = 0 → берем scores[0] → 100
- i = 1 → берем scores[1] → 90
- i = 2 → берем scores[2] → 95
- i = 3 → берем scores[3] → 80
- i = 4 → берем scores[4] → 75
Обратите внимание на то, чтобы выяснить длину массива, мы используем параметр массива — length.
scores.length означает количество элементов в массиве. В нашем примере scores.length равно 5.
Следовательно, мы суммируем каждый элемент в переменную total, которая изначально равна 0.
Запись:
total += scores[i];
означает то же самое, что:
total = total + scores[i];
Ну и в конце, разделив сумму на количество элементов, мы получим среднее значение.
Преимущества массивов
Использование массивов дает несколько преимуществ:
- Оптимизация кода, то есть меньше повторяющегося кода
- Произвольный доступ к элементам через индекс
- Легкость в просмотре данных
- Легко управлять большим количеством однотипных данных
- Легко сортировать данные и выполнять дополнительные вычисления
В нашем случае массив позволяет удобно хранить результаты студентов, проходить по ним циклом, считать сумму, среднее значение и при необходимости выполнять другие операции.
Объявление массива заранее
Массив, как и любую переменную, можно просто объявить заранее и заполнить позже:
double scores[] = new double[5];
В этом примере мы создаем массив scores, в котором можно хранить 5 значений типа double.
Вы присвоите элементы позже, обращаясь к каждому индексу:
double scores[] = new double[5];
scores[0] = 100;
scores[1] = 95;
scores[2] = 90;
scores[3] = 80;
scores[4] = 75;
Такой способ удобен, когда вы заранее знаете размер массива, но сами значения хотите заполнить позже.
Заполнение массива с консоли
Вы можете объявить размер массива и вставить элементы из консоли вручную. То есть ввести размер самому и создать массив с таким размером.
Давайте посмотрим на пример, приведенный ниже:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int size = in.nextInt();
double scores[] = new double[size];
for (int i = 0; i < scores.length; i++) {
scores[i] = in.nextDouble();
}
double total = 0;
for (int i = 0; i < scores.length; i++) {
total += scores[i];
}
double average = total / size;
System.out.println("Total score : " + total);
System.out.println("Average score : " + average);
}
}
5
100 90 95 80 75Total score : 440.0
Average score : 88.0Мы создаем число size и задаем его значение из консоли. Затем мы объявляем массив размером size.
При помощи цикла, мы задаем каждое значение в массив по порядку, тем самым заполнив его. Ну и в конце, также вычисляем сумму и среднее значение всех элементов.
Такой вариант уже намного гибче. Теперь программа может работать не только с 5 студентами, а с любым количеством студентов, которое мы введем в консоли.
Коротко о главном
- Массив хранит несколько значений одного типа.
- Индексы массива начинаются с 0.
- Длина массива доступна через array.length.
- Чтобы пройтись по всем элементам массива, удобно использовать цикл for.
- Массив помогает не создавать много отдельных переменных вручную.
После этой темы вы сможете хранить несколько однотипных значений в одной переменной и обрабатывать их через цикл.
Только положительные числа
n. Далее, мы вводим n чисел и сохраняем все введённые числа в массив. Выведите в конце только положительные элементы.10
6 19 26 -3 46 8 5 -65 90 256 19 26 46 8 5 90 2510
1 2 -3 4 5 -6 7 8 -9 101 2 4 5 7 8 10-
Ввод:
10, 6 19 26 -3 46 8 5 -65 90 25 -
Ввод:
10, 1 2 -3 4 5 -6 7 8 -9 10 -
Ввод:
5, -1 -2 -3 -4 -5 -
Ввод:
4, 0 5 -5 10 -
Ввод:
3, 100 -100 50
Чётные числа в массиве
n. Далее, мы вводим n чисел и сохраняем все введённые числа в массив. Вывести все содержащиеся в данном массиве чётные числа.8
3 8 2 4 6 9 12 158 2 4 6 129
6 0 -3 4 8 0 -6 9 56 0 4 8 0 -6-
Ввод:
8, 3 8 2 4 6 9 12 15 -
Ввод:
9, 6 0 -3 4 8 0 -6 9 5 -
Ввод:
5, 1 3 5 7 9 -
Ввод:
6, -2 -4 -6 1 3 5 -
Ввод:
1, 0
Квадраты элементов массива
n. Далее, мы вводим n чисел и сохраняем все введённые числа в массив. Выведите в конце квадраты всех введённых чисел.6
1 2 3 4 5 61 4 9 16 25 3610
1 2 3 4 5 6 7 8 9 101 4 9 16 25 36 49 64 81 100-
Ввод:
6, 1 2 3 4 5 6 -
Ввод:
10, 1 2 3 4 5 6 7 8 9 10 -
Ввод:
3, -1 -2 -3 -
Ввод:
1, 0 -
Ввод:
4, 10 -10 5 -5
Элементы с чётными индексами
n. Создайте массив из n целых чисел, введённых во второй строке, и с помощью цикла выведите все элементы с чётными индексами.8
-4 9 2 -5 8 7 -11 16-4 2 8 -1110
1 2 3 4 5 6 7 8 9 101 3 5 7 9-
Ввод:
8, -4 9 2 -5 8 7 -11 16 -
Ввод:
10, 1 2 3 4 5 6 7 8 9 10 -
Ввод:
1, 5 -
Ввод:
2, 7 8 -
Ввод:
5, 10 20 30 40 50
Элементы с нечётными индексами
n. Создайте массив из n целых чисел, введённых во второй строке, и с помощью цикла выведите все элементы с нечётными индексами.8
-4 9 2 -5 8 7 -11 169 -5 7 1610
1 2 3 4 5 6 7 8 9 102 4 6 8 10-
Ввод:
8, -4 9 2 -5 8 7 -11 16 -
Ввод:
10, 1 2 3 4 5 6 7 8 9 10 -
Ввод:
1, 5 -
Ввод:
2, 7 8 -
Ввод:
5, 10 20 30 40 50