add notes for lecture 1
Some checks failed
Fast Reverse Tests / test (push) Successful in 37s
Reverse Tests / test (push) Successful in 9s
Sum Tests / test (push) Successful in 10s
Word Stat Tests / test (push) Failing after 7s

This commit is contained in:
2026-02-02 10:40:50 +05:00
parent 5945b021f2
commit 5ef52d793b

583
lectures/README.md Normal file
View 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! 🚀**