add notes for lecture 1
This commit is contained in:
583
lectures/README.md
Normal file
583
lectures/README.md
Normal file
@@ -0,0 +1,583 @@
|
||||
# Конспект лекции 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! 🚀**
|
||||
Reference in New Issue
Block a user