# Конспект лекции 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! 🚀**