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

20 KiB
Raw Blame History

Конспект лекции 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
    • Стандартная библиотека
    • Инструменты разработки

Проверка установки

java -version    # Проверка установленной версии JVM
javac -version   # Проверка версии компилятора

7.3. Первая программа: Hello World

Структура программы

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() - вывод в консоль

Компиляция и запуск

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. Переменные

Объявление и инициализация

int x;           // Объявление
x = 10;          // Инициализация
int y = 20;      // Объявление с инициализацией

Константы

final int MAX_VALUE = 100;  // Константа (нельзя изменить)

8.3. Операторы

Арифметические операторы

  • + - сложение
  • - - вычитание
  • * - умножение
  • / - деление
  • % - остаток от деления

Операторы сравнения

  • == - равно
  • != - не равно
  • >, < - больше, меньше
  • >=, <= - больше или равно, меньше или равно

Логические операторы

  • && - логическое И (AND)
  • || - логическое ИЛИ (OR)
  • ! - логическое НЕ (NOT)

Операторы присваивания

  • = - присваивание
  • +=, -=, *=, /= - составное присваивание

8.4. Управляющие конструкции

Условный оператор if

if (условие) {
    // код
} else if (другое_условие) {
    // код
} else {
    // код
}

Оператор switch

switch (переменная) {
    case значение1:
        // код
        break;
    case значение2:
        // код
        break;
    default:
        // код по умолчанию
}

Цикл while

while (условие) {
    // код
}

Цикл do-while

do {
    // код
} while (условие);

Цикл for

for (инициализация; условие; инкремент) {
    // код
}

// Пример:
for (int i = 0; i < 10; i++) {
    System.out.println(i);
}

Цикл for-each

for (тип элемент : коллекция) {
    // код
}

9. Ввод и вывод

9.1. Вывод в консоль

System.out.println("текст");  // Вывод с переводом строки
System.out.print("текст");    // Вывод без перевода строки

9.2. Ввод из консоли

import java.util.Scanner;

Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();      // Чтение целого числа
String line = scanner.nextLine();    // Чтение строки
double d = scanner.nextDouble();     // Чтение вещественного числа

9.3. Работа с аргументами командной строки

public static void main(String[] args) {
    // args[0] - первый аргумент
    // args[1] - второй аргумент
    // args.length - количество аргументов
}

10. Массивы

10.1. Одномерные массивы

Объявление и создание

int[] array;                    // Объявление
array = new int[10];            // Создание массива на 10 элементов
int[] array2 = new int[5];      // Объявление с созданием

// Инициализация значениями
int[] array3 = {1, 2, 3, 4, 5};

Обращение к элементам

array[0] = 10;      // Присваивание
int x = array[0];   // Чтение

Длина массива

int length = array.length;  // Поле length (НЕ метод!)

10.2. Многомерные массивы

int[][] matrix = new int[3][4];         // 3 строки, 4 столбца
int[][] matrix2 = {{1,2}, {3,4}, {5,6}};

11. Строки (String)

11.1. Создание строк

String s1 = "Hello";
String s2 = new String("World");

11.2. Основные методы

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. Конкатенация

String result = s1 + s2;
String result2 = s1.concat(s2);

11.4. Особенности строк

  • Строки в Java неизменяемые (immutable)
  • Все операции создают новые строки
  • Сравнение строк: использовать equals(), НЕ ==
if (s1.equals(s2)) {  // ПРАВИЛЬНО
    // строки равны
}

if (s1 == s2) {  // НЕПРАВИЛЬНО (сравнивает ссылки)
    // это не то, что вы думаете
}

12. Работа с тестами

12.1. Репозиторий с тестами

  • Тесты выкладываются в отдельный репозиторий
  • Доступны исходный код и скомпилированная версия (.jar файлы)

12.2. Запуск тестов

Шаги для запуска

  1. Скачать .jar файл с тестами
  2. Скомпилировать свою программу
  3. Проверить наличие .class файла
  4. Запустить тесты командой

Пример команды запуска

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! 🚀