584 lines
20 KiB
Markdown
584 lines
20 KiB
Markdown
# Конспект лекции 1: Введение в программирование (Java)
|
||
**Преподаватель:** Георгий Корнеев
|
||
|
||
---
|
||
|
||
## 1. Организационные вопросы
|
||
|
||
### 1.1. Контактная информация
|
||
- **Преподаватель:** Георгий Корнеев
|
||
- **Связь:**
|
||
- Основные вопросы → чат курса
|
||
- Сложные/долгие вопросы → email преподавателя
|
||
|
||
### 1.2. Структура курса
|
||
**Последовательность предметов:**
|
||
- 1 курс: Введение в программирование (Java)
|
||
- 2 курс 1 семестр: Парадигмы программирования
|
||
- 2 курс 2 семестр: Технологии Java
|
||
|
||
---
|
||
|
||
## 2. Организация учебного процесса
|
||
|
||
### 2.1. Структура занятий
|
||
|
||
#### Лекции
|
||
- Теоретический материал
|
||
- Live coding
|
||
- Демонстрации примеров
|
||
|
||
#### Домашние задания
|
||
- Выдаются после каждой лекции
|
||
- Срок выполнения: около недели (чуть меньше, т.к. практики перед лекциями)
|
||
- Все последующие ДЗ (кроме первого) требуют самостоятельно написанного кода на Java
|
||
|
||
#### Практические занятия
|
||
- Сдача **модификации** домашнего задания (не самого ДЗ!)
|
||
- Модификация тесно связана с домашним заданием
|
||
- **Пример:** ДЗ - скомпилировать Hello World, практика - скомпилировать другую программу
|
||
|
||
---
|
||
|
||
## 3. Система оценивания
|
||
|
||
### 3.1. Версии домашних заданий
|
||
- **Простая версия** → НЕ нужно делать
|
||
- **Сложная версия** → ОБЯЗАТЕЛЬНО делать
|
||
|
||
### 3.2. Попытки сдачи
|
||
- **Количество попыток:** 3 (три вторника подряд)
|
||
- Если за 3 попытки не сдано → ДЗ не засчитывается
|
||
|
||
### 3.3. Система задержек (delay)
|
||
**Фиксируется момент ПЕРВОЙ демонстрации рабочей программы преподавателю:**
|
||
- Сдача в первую неделю → delay = 0
|
||
- Сдача во вторую неделю → delay = 1
|
||
- Сдача в третью неделю → delay = 2
|
||
|
||
⚠️ **Важно:** Задержка определяется моментом первой демонстрации работающей программы, а не финальной сдачи!
|
||
|
||
### 3.4. Система минусов
|
||
**Начисление минусов:**
|
||
- Преподаватель проверяет код
|
||
- За найденные проблемы назначаются минусы
|
||
- Минусы **накапливаются** при каждой попытке
|
||
|
||
**Пример расчёта:**
|
||
- 1 попытка: 3 минуса
|
||
- 2 попытка: 2 минуса
|
||
- 3 попытка: 0 минусов (успешно)
|
||
- **Итого:** 5 минусов, delay = 0 (т.к. начали с первой недели)
|
||
|
||
### 3.5. Бонусные баллы
|
||
|
||
#### Бонусы за скорость сдачи
|
||
- **Условие:** Первый студент, сдавший ДЗ преподавателю в первую неделю
|
||
- **Количество:** До 5 человек (по числу преподавателей)
|
||
|
||
#### Бонусы за найденные ошибки
|
||
- За обнаруженные ошибки и опечатки в материалах курса
|
||
- Сообщать в специальный раздел чата
|
||
|
||
---
|
||
|
||
## 4. Зачёт
|
||
|
||
### 4.1. Условия
|
||
- Проводится при неудовлетворительных баллах
|
||
- Если баллов достаточно → зачёт не обязателен
|
||
|
||
### 4.2. Варианты сдачи
|
||
- **Досрочная сдача:** конец декабря
|
||
- **Стандартная сдача:** во время сессии
|
||
|
||
---
|
||
|
||
## 5. Особенности первого домашнего задания
|
||
|
||
### 5.1. Уникальные условия
|
||
- Несложное (т.к. не было лекций)
|
||
- **Срок сдачи:** только первая практика
|
||
- Больше не принимается
|
||
|
||
---
|
||
|
||
## 6. Почему Java?
|
||
|
||
### 6.1. Популярность
|
||
- **Индекс TIOBE:** Java в топе популярных языков
|
||
- В плотной группе с C, C++, Python
|
||
- Python вырвался вперёд в последние 2-3 года
|
||
|
||
### 6.2. Преимущества Java
|
||
|
||
#### Простота и безопасность
|
||
- Достаточно простой язык
|
||
- Сложно создать код, который:
|
||
- Убьёт компьютер
|
||
- Приведёт к непредсказуемому поведению
|
||
- Не воспроизводится на других машинах
|
||
|
||
#### Содержательность
|
||
- Простой, но весьма содержательный язык
|
||
- Широкий спектр возможностей
|
||
|
||
#### Области применения
|
||
1. **Серверные приложения**
|
||
2. **Desktop-приложения**
|
||
3. **Android-разработка**
|
||
4. **JVM-языки** (Kotlin, Scala и др.)
|
||
|
||
---
|
||
|
||
## 7. Основы Java
|
||
|
||
### 7.1. Концепция Java
|
||
|
||
#### Виртуальная машина (JVM)
|
||
- Java компилируется не в машинный код, а в **байт-код**
|
||
- Байт-код исполняется на **виртуальной машине Java (JVM)**
|
||
- **Преимущество:** кроссплатформенность (Write Once, Run Anywhere)
|
||
|
||
#### Процесс выполнения программы
|
||
1. Написание кода на Java (.java файлы)
|
||
2. Компиляция в байт-код (.class файлы)
|
||
3. Выполнение на JVM
|
||
|
||
### 7.2. Установка и настройка
|
||
|
||
#### Java Development Kit (JDK)
|
||
- **Что включает:**
|
||
- Компилятор Java
|
||
- JVM
|
||
- Стандартная библиотека
|
||
- Инструменты разработки
|
||
|
||
#### Проверка установки
|
||
```bash
|
||
java -version # Проверка установленной версии JVM
|
||
javac -version # Проверка версии компилятора
|
||
```
|
||
|
||
### 7.3. Первая программа: Hello World
|
||
|
||
#### Структура программы
|
||
```java
|
||
public class HelloWorld {
|
||
public static void main(String[] args) {
|
||
System.out.println("Hello, World!");
|
||
}
|
||
}
|
||
```
|
||
|
||
#### Ключевые элементы
|
||
- `public class HelloWorld` - объявление публичного класса
|
||
- Имя класса должно совпадать с именем файла
|
||
- `public static void main(String[] args)` - точка входа в программу
|
||
- `System.out.println()` - вывод в консоль
|
||
|
||
#### Компиляция и запуск
|
||
```bash
|
||
javac HelloWorld.java # Компиляция → создаёт HelloWorld.class
|
||
java HelloWorld # Запуск (БЕЗ расширения .class!)
|
||
```
|
||
|
||
---
|
||
|
||
## 8. Основы синтаксиса Java
|
||
|
||
### 8.1. Типы данных
|
||
|
||
#### Примитивные типы
|
||
|
||
**Целочисленные:**
|
||
- `byte` - 8 бит (-128 до 127)
|
||
- `short` - 16 бит (-32768 до 32767)
|
||
- `int` - 32 бита (-2³¹ до 2³¹-1)
|
||
- `long` - 64 бита (-2⁶³ до 2⁶³-1)
|
||
|
||
**Вещественные:**
|
||
- `float` - 32 бита (одинарная точность)
|
||
- `double` - 64 бита (двойная точность)
|
||
|
||
**Другие:**
|
||
- `boolean` - true/false
|
||
- `char` - 16 бит (символ Unicode)
|
||
|
||
#### Ссылочные типы
|
||
- Строки: `String`
|
||
- Массивы
|
||
- Объекты классов
|
||
|
||
### 8.2. Переменные
|
||
|
||
#### Объявление и инициализация
|
||
```java
|
||
int x; // Объявление
|
||
x = 10; // Инициализация
|
||
int y = 20; // Объявление с инициализацией
|
||
```
|
||
|
||
#### Константы
|
||
```java
|
||
final int MAX_VALUE = 100; // Константа (нельзя изменить)
|
||
```
|
||
|
||
### 8.3. Операторы
|
||
|
||
#### Арифметические операторы
|
||
- `+` - сложение
|
||
- `-` - вычитание
|
||
- `*` - умножение
|
||
- `/` - деление
|
||
- `%` - остаток от деления
|
||
|
||
#### Операторы сравнения
|
||
- `==` - равно
|
||
- `!=` - не равно
|
||
- `>`, `<` - больше, меньше
|
||
- `>=`, `<=` - больше или равно, меньше или равно
|
||
|
||
#### Логические операторы
|
||
- `&&` - логическое И (AND)
|
||
- `||` - логическое ИЛИ (OR)
|
||
- `!` - логическое НЕ (NOT)
|
||
|
||
#### Операторы присваивания
|
||
- `=` - присваивание
|
||
- `+=`, `-=`, `*=`, `/=` - составное присваивание
|
||
|
||
### 8.4. Управляющие конструкции
|
||
|
||
#### Условный оператор if
|
||
```java
|
||
if (условие) {
|
||
// код
|
||
} else if (другое_условие) {
|
||
// код
|
||
} else {
|
||
// код
|
||
}
|
||
```
|
||
|
||
#### Оператор switch
|
||
```java
|
||
switch (переменная) {
|
||
case значение1:
|
||
// код
|
||
break;
|
||
case значение2:
|
||
// код
|
||
break;
|
||
default:
|
||
// код по умолчанию
|
||
}
|
||
```
|
||
|
||
#### Цикл while
|
||
```java
|
||
while (условие) {
|
||
// код
|
||
}
|
||
```
|
||
|
||
#### Цикл do-while
|
||
```java
|
||
do {
|
||
// код
|
||
} while (условие);
|
||
```
|
||
|
||
#### Цикл for
|
||
```java
|
||
for (инициализация; условие; инкремент) {
|
||
// код
|
||
}
|
||
|
||
// Пример:
|
||
for (int i = 0; i < 10; i++) {
|
||
System.out.println(i);
|
||
}
|
||
```
|
||
|
||
#### Цикл for-each
|
||
```java
|
||
for (тип элемент : коллекция) {
|
||
// код
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 9. Ввод и вывод
|
||
|
||
### 9.1. Вывод в консоль
|
||
```java
|
||
System.out.println("текст"); // Вывод с переводом строки
|
||
System.out.print("текст"); // Вывод без перевода строки
|
||
```
|
||
|
||
### 9.2. Ввод из консоли
|
||
```java
|
||
import java.util.Scanner;
|
||
|
||
Scanner scanner = new Scanner(System.in);
|
||
int number = scanner.nextInt(); // Чтение целого числа
|
||
String line = scanner.nextLine(); // Чтение строки
|
||
double d = scanner.nextDouble(); // Чтение вещественного числа
|
||
```
|
||
|
||
### 9.3. Работа с аргументами командной строки
|
||
```java
|
||
public static void main(String[] args) {
|
||
// args[0] - первый аргумент
|
||
// args[1] - второй аргумент
|
||
// args.length - количество аргументов
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 10. Массивы
|
||
|
||
### 10.1. Одномерные массивы
|
||
|
||
#### Объявление и создание
|
||
```java
|
||
int[] array; // Объявление
|
||
array = new int[10]; // Создание массива на 10 элементов
|
||
int[] array2 = new int[5]; // Объявление с созданием
|
||
|
||
// Инициализация значениями
|
||
int[] array3 = {1, 2, 3, 4, 5};
|
||
```
|
||
|
||
#### Обращение к элементам
|
||
```java
|
||
array[0] = 10; // Присваивание
|
||
int x = array[0]; // Чтение
|
||
```
|
||
|
||
#### Длина массива
|
||
```java
|
||
int length = array.length; // Поле length (НЕ метод!)
|
||
```
|
||
|
||
### 10.2. Многомерные массивы
|
||
```java
|
||
int[][] matrix = new int[3][4]; // 3 строки, 4 столбца
|
||
int[][] matrix2 = {{1,2}, {3,4}, {5,6}};
|
||
```
|
||
|
||
---
|
||
|
||
## 11. Строки (String)
|
||
|
||
### 11.1. Создание строк
|
||
```java
|
||
String s1 = "Hello";
|
||
String s2 = new String("World");
|
||
```
|
||
|
||
### 11.2. Основные методы
|
||
```java
|
||
int len = s.length(); // Длина строки
|
||
char ch = s.charAt(0); // Символ по индексу
|
||
String sub = s.substring(0, 5); // Подстрока
|
||
String upper = s.toUpperCase(); // В верхний регистр
|
||
String lower = s.toLowerCase(); // В нижний регистр
|
||
```
|
||
|
||
### 11.3. Конкатенация
|
||
```java
|
||
String result = s1 + s2;
|
||
String result2 = s1.concat(s2);
|
||
```
|
||
|
||
### 11.4. Особенности строк
|
||
- Строки в Java **неизменяемые** (immutable)
|
||
- Все операции создают новые строки
|
||
- Сравнение строк: использовать `equals()`, НЕ `==`
|
||
|
||
```java
|
||
if (s1.equals(s2)) { // ПРАВИЛЬНО
|
||
// строки равны
|
||
}
|
||
|
||
if (s1 == s2) { // НЕПРАВИЛЬНО (сравнивает ссылки)
|
||
// это не то, что вы думаете
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 12. Работа с тестами
|
||
|
||
### 12.1. Репозиторий с тестами
|
||
- Тесты выкладываются в отдельный репозиторий
|
||
- Доступны исходный код и скомпилированная версия (.jar файлы)
|
||
|
||
### 12.2. Запуск тестов
|
||
|
||
#### Шаги для запуска
|
||
1. Скачать .jar файл с тестами
|
||
2. Скомпилировать свою программу
|
||
3. Проверить наличие .class файла
|
||
4. Запустить тесты командой
|
||
|
||
#### Пример команды запуска
|
||
```bash
|
||
java -cp <путь_к_тестируемому_классу>:<путь_к_тест.jar> <название_теста>
|
||
```
|
||
|
||
**Рекомендация:** Создать скрипт для автоматизации запуска тестов
|
||
|
||
### 12.3. Требования к решениям
|
||
- Для второго ДЗ: промежуточные результаты должны помещаться в `int`
|
||
- Использовать можно всё из стандартной поставки Java
|
||
- Неправильное использование → минусы при сдаче
|
||
|
||
---
|
||
|
||
## 13. Дополнительное задание: Run.me
|
||
|
||
### 13.1. Описание
|
||
- **Необязательное** задание для тех, кому "нечего делать"
|
||
- Содержит как простые, так и откровенно сложные задачи
|
||
- Предназначено для дополнительной практики
|
||
|
||
### 13.2. Рекомендации
|
||
- ✅ Посмотреть полчасика
|
||
- ✅ Получить доступные плюсики
|
||
- ✅ Перейти к основному ДЗ
|
||
- ⚠️ НЕ закапываться в Run.me - это плохая стратегия!
|
||
|
||
### 13.3. Оценивание
|
||
- Максимум баллов не больше, чем за обычное ДЗ
|
||
- Выполнить обычное ДЗ **гораздо полезнее**
|
||
- Сложность оценивается по количеству решивших
|
||
- Оценка: коэффициент × количество решённых задач
|
||
|
||
### 13.4. Технические детали
|
||
- Можно использовать **всё что угодно**
|
||
- Проверяется только правильность URL результата
|
||
- Код НЕ проверяется (в отличие от обычных ДЗ)
|
||
- Каждая строка = отдельное число (не склеиваются)
|
||
- Не надо показывать код преподавателю
|
||
|
||
---
|
||
|
||
## 14. Система баллов и оценок
|
||
|
||
### 14.1. Начисление очков
|
||
- Очки начисляются за сдачу домашних заданий
|
||
- Видны в специальной таблице (НЕ в БАРСе)
|
||
- Несдача ДЗ = 0 очков
|
||
|
||
### 14.2. Важные замечания
|
||
- ⚠️ Нельзя сравнивать очки за разные ДЗ
|
||
- ⚠️ Нельзя сравнивать очки между группами
|
||
- ✅ Гарантируется **локальная справедливость** внутри группы
|
||
|
||
### 14.3. Локальная справедливость
|
||
**Правило:**
|
||
```
|
||
Если студент A и студент B:
|
||
- Решили одинаковые ДЗ
|
||
- У A не больше задержки, чем у B
|
||
- У A не больше минусов, чем у B
|
||
→ То у A точно не меньше баллов, чем у B
|
||
```
|
||
|
||
### 14.4. Конвертация в БАРС
|
||
- Конвертация происходит **в конце курса**
|
||
- Очки нормируются относительно группы
|
||
- Чем больше очков относительно коллег → выше оценка
|
||
|
||
### 14.5. Критерии оценок
|
||
- **Для 5 (отлично):** > 90 баллов в БАРСе
|
||
- За каждое ДЗ гарантируется минимальный процент баллов
|
||
- Сдать ДЗ **всегда** строго лучше, чем не сдать
|
||
- Разница между "сдано" и "не сдано" **существенная**
|
||
|
||
### 14.6. Причины разброса баллов
|
||
- Результаты Run.me (различия в решённых задачах)
|
||
- Задержки при сдаче
|
||
- Количество минусов
|
||
- Относительный перформанс в группе
|
||
|
||
### 14.7. Интерпретация статуса
|
||
- 🟢 **Зелёный** → всё хорошо
|
||
- 🔴 **Красный** → проблемы, нужно подтянуться
|
||
|
||
---
|
||
|
||
## 15. Практические рекомендации
|
||
|
||
### 15.1. Стратегия успешной сдачи
|
||
1. ✅ Начинать делать ДЗ сразу после выдачи
|
||
2. ✅ Стремиться сдать в первую неделю (delay = 0)
|
||
3. ✅ Тщательно проверять код перед демонстрацией
|
||
4. ✅ Использовать тесты для самопроверки
|
||
5. ✅ Создать скрипты для автоматизации
|
||
|
||
### 15.2. Работа с кодом
|
||
- Можно использовать линтеры для Java
|
||
- Следить за качеством кода
|
||
- Исправлять замечания преподавателя
|
||
- Помнить о накоплении минусов
|
||
|
||
### 15.3. Что НЕ стоит делать
|
||
- ❌ Откладывать ДЗ на последнюю неделю
|
||
- ❌ Закапываться в Run.me вместо основного ДЗ
|
||
- ❌ Игнорировать замечания преподавателя
|
||
- ❌ Сравнивать свои баллы с другими группами
|
||
|
||
---
|
||
|
||
## 16. Обратная связь
|
||
|
||
### 16.1. Если недоволен результатом
|
||
- Использовать кнопку 👎 (thumbs down) под ответами
|
||
- Написать в чат курса
|
||
- Отправить email преподавателю
|
||
|
||
### 16.2. Если что-то непонятно
|
||
- Задавать вопросы в чате
|
||
- Подходить к преподавателю после лекции
|
||
- Писать на email для сложных вопросов
|
||
|
||
---
|
||
|
||
## Резюме первой лекции
|
||
|
||
### Ключевые выводы
|
||
1. **Организация:** Лекции → ДЗ → Практика (сдача модификаций)
|
||
2. **Оценивание:** Очки → конвертация в БАРС → итоговая оценка
|
||
3. **Java:** Популярный, простой, безопасный, кроссплатформенный язык
|
||
4. **Стратегия:** Сдавать быстро, качественно, регулярно
|
||
|
||
### Что делать дальше
|
||
1. Настроить среду разработки (JDK установлен)
|
||
2. Начать второе домашнее задание
|
||
3. Скачать и настроить тесты
|
||
4. Стремиться сдать в первую неделю
|
||
|
||
### Важные даты
|
||
- Сдача ДЗ: каждый вторник (3 попытки)
|
||
- Досрочный зачёт: конец декабря
|
||
- Стандартный зачёт: сессия
|
||
|
||
---
|
||
|
||
## Полезные ссылки
|
||
- Чат курса (основные вопросы)
|
||
- Email преподавателя (сложные вопросы)
|
||
- Репозиторий с тестами
|
||
- Материалы курса
|
||
- Раздел "Ошибки и опечатки" в чате
|
||
|
||
---
|
||
|
||
**Успехов в изучении Java! 🚀**
|