From 5ef52d793b850837c130cdb42d25d1ff7ec072f8 Mon Sep 17 00:00:00 2001 From: me Date: Mon, 2 Feb 2026 10:40:50 +0500 Subject: [PATCH] add notes for lecture 1 --- lectures/README.md | 583 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 583 insertions(+) create mode 100644 lectures/README.md diff --git a/lectures/README.md b/lectures/README.md new file mode 100644 index 0000000..2bf3bc3 --- /dev/null +++ b/lectures/README.md @@ -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! 🚀**