Files
prog-intro-2025/lectures/README.md
me 5ef52d793b
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
add notes for lecture 1
2026-02-02 10:40:50 +05:00

584 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Конспект лекции 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! 🚀**