> For the complete documentation index, see [llms.txt](https://letas-organization.gitbook.io/letaats-lessons-online/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://letas-organization.gitbook.io/letaats-lessons-online/kolledzh-top/razdel-1/glava-7.-vvod-i-vyvod-dannykh.md).

# Глава 7. Ввод и вывод данных

### 7.1. Зачем программе ввод и вывод

Программа должна взаимодействовать с пользователем.

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

В консольной Java-программе есть два основных направления:

```
ввод → программа получает данные
вывод → программа показывает результат
```

Пример:

```
Пользователь вводит возраст.
Программа выводит, совершеннолетний он или нет.
```

***

### 7.2. Вывод через System.out.println

```java
System.out.println("Hello");
```

Выводит текст и переносит строку.

```java
System.out.println("Первая строка");
System.out.println("Вторая строка");
```

Результат:

```
Первая строка
Вторая строка
```

***

### 7.3. System.out.print

```java
System.out.print("Введите имя: ");
```

Выводит текст без переноса строки.

Пример:

```java
System.out.print("Введите имя: ");
String name = scanner.nextLine();
```

Так удобнее для ввода.

***

### 7.4. Склеивание вывода

```java
String name = "Anna";
int age = 18;

System.out.println("Имя: " + name + ", возраст: " + age);
```

Результат:

```
Имя: Anna, возраст: 18
```

***

### 7.5. Scanner

`Scanner` используется для чтения данных с клавиатуры.

Подключение:

```java
import java.util.Scanner;
```

Создание:

```java
Scanner scanner = new Scanner(System.in);
```

Полный пример:

```java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Введите имя: ");
        String name = scanner.nextLine();

        System.out.println("Привет, " + name);
    }
}
```

***

### 7.6. Чтение строки

```java
String name = scanner.nextLine();
```

`nextLine()` считывает всю строку до нажатия Enter.

***

### 7.7. Чтение int

```java
int age = scanner.nextInt();
```

`nextInt()` считывает целое число.

***

### 7.8. Чтение double

```java
double price = scanner.nextDouble();
```

`nextDouble()` считывает дробное число.

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

```
99.99
```

***

### 7.9. Проблема nextInt и nextLine

Это одна из самых частых проблем.

Код:

```java
System.out.print("Введите возраст: ");
int age = scanner.nextInt();

System.out.print("Введите имя: ");
String name = scanner.nextLine();
```

Может сработать неправильно: `name` считается пустой строкой.

Почему?

После ввода числа пользователь нажимает Enter. `nextInt()` считывает число, но символ переноса строки остаётся во входном потоке. `nextLine()` считывает этот оставшийся Enter.

Решение:

```java
int age = scanner.nextInt();
scanner.nextLine();

String name = scanner.nextLine();
```

Дополнительный `scanner.nextLine()` очищает ввод.

***

### 7.10. Пример анкеты

```java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Введите имя: ");
        String name = scanner.nextLine();

        System.out.print("Введите возраст: ");
        int age = scanner.nextInt();
        scanner.nextLine();

        System.out.print("Введите группу: ");
        String group = scanner.nextLine();

        System.out.println("Анкета:");
        System.out.println("Имя: " + name);
        System.out.println("Возраст: " + age);
        System.out.println("Группа: " + group);
    }
}
```

***

### 7.11. Ввод чисел и вычисления

```java
System.out.print("Введите первое число: ");
int a = scanner.nextInt();

System.out.print("Введите второе число: ");
int b = scanner.nextInt();

int sum = a + b;

System.out.println("Сумма: " + sum);
```

***

### 7.12. Ввод double

```java
System.out.print("Введите цену: ");
double price = scanner.nextDouble();

System.out.print("Введите количество: ");
int count = scanner.nextInt();

double total = price * count;

System.out.println("Итого: " + total);
```

***

### 7.13. Ввод в Android

В Android `Scanner` не используется для пользовательского интерфейса.

Вместо этого применяют `EditText`.

Консоль:

```java
String name = scanner.nextLine();
```

Android:

```java
String name = nameInput.getText().toString();
```

Консольный вывод:

```java
System.out.println("Привет, " + name);
```

Android:

```java
resultText.setText("Привет, " + name);
```

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

***

### 7.14. Почему важно проверять ввод

Пользователь может ввести что угодно.

Программа просит число:

```
Введите возраст:
```

Пользователь вводит:

```
кот
```

Если программа попытается преобразовать это в число, будет ошибка.

В консольных программах позже можно использовать `try catch`. В Android это особенно важно, потому что приложение может аварийно закрыться.

***

### 7.15. Типичные ошибки новичков

#### Ошибка 1. Забыть импорт Scanner

```java
Scanner scanner = new Scanner(System.in);
```

Без:

```java
import java.util.Scanner;
```

будет ошибка.

***

#### Ошибка 2. Забыть создать объект Scanner

```java
String name = scanner.nextLine(); // scanner не создан
```

Правильно:

```java
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
```

***

#### Ошибка 3. Проблема nextInt и nextLine

После `nextInt()` забыли очистить строку.

***

#### Ошибка 4. Ждать число, когда пользователь вводит текст

```java
int age = scanner.nextInt();
```

Если введён текст, программа упадёт.

***

### 7.16. Как могут спросить на экзамене

#### Вопрос

Для чего нужен Scanner?

#### Хороший ответ

> Scanner используется для чтения данных из входного потока, например с клавиатуры. С его помощью можно считать строку, целое число или дробное число.

***

#### Вопрос

Чем отличается `nextInt()` от `nextLine()`?

#### Хороший ответ

> `nextInt()` считывает целое число, а `nextLine()` считывает всю строку до конца строки. После `nextInt()` часто нужно вызвать дополнительный `nextLine()`, чтобы убрать оставшийся перенос строки.

***

#### Вопрос

Как в Android получить ввод пользователя?

#### Хороший ответ

> В Android для ввода используется элемент `EditText`. Текст можно получить через `getText().toString()`.

***

### 7.17. Практические задания

#### Задание 1

Напишите программу, которая спрашивает имя и выводит приветствие.

***

#### Задание 2

Пользователь вводит два числа. Программа выводит:

* сумму;
* разность;
* произведение;
* результат деления.

***

#### Задание 3

Пользователь вводит цену товара и количество. Программа выводит итоговую стоимость.

***

#### Задание 4

Пользователь вводит имя, возраст и город. Программа выводит красивую анкету.

***

#### Задание 5

Напишите программу, где сначала вводится возраст через `nextInt()`, потом имя через `nextLine()`. Исправьте проблему пропущенного ввода.

***

### 7.18. Вопросы для самопроверки

1. Для чего нужен вывод данных?
2. Чем `print` отличается от `println`?
3. Для чего нужен Scanner?
4. Как считать строку?
5. Как считать int?
6. Как считать double?
7. Почему после nextInt может пропуститься nextLine?
8. Как вывести переменную вместе с текстом?
9. Чем консольный ввод отличается от Android-ввода?
10. Почему нужно проверять ввод пользователя?
