<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Основы программирования — зимний семестр 2026/27 :: Краткий курс по основам программирования</title>
    <link>https://apmath-spbu.github.io/winter2026/index.html</link>
    <description>Первый семестр курса «Основы программирования» (СПбГУ). Здесь публикуются конспекты занятий: их можно читать до занятия как подготовку или после — как справочник при выполнении домашнего задания.&#xA;Как устроен курс Занятия чередуются между двумя линиями:&#xA;Линия языка — C и C++ (нечётные занятия, лекции с практикой): сборка, типы, функции, классы и ООП, строки, умные указатели, STL, move-семантика, шаблоны. Местами Python — для контраста и прототипов. Линия алгоритмов (чётные занятия, семинары): сложность и O-символика, рекуррентные соотношения, структуры данных, двоичный поиск, сортировки, амортизационный анализ. Контроль: домашние задания после семинаров · два рубежных контроля · зачёт с оценкой.</description>
    <generator>Hugo</generator>
    <language>ru-ru</language>
    <lastBuildDate>Wed, 05 Aug 2026 12:00:00 +0300</lastBuildDate>
    <atom:link href="https://apmath-spbu.github.io/winter2026/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Занятие 1. Сборка C&#43;&#43;: от кода до .exe</title>
      <link>https://apmath-spbu.github.io/winter2026/01-sborka-cpp/index.html</link>
      <pubDate>Wed, 05 Aug 2026 12:00:00 +0300</pubDate>
      <guid>https://apmath-spbu.github.io/winter2026/01-sborka-cpp/index.html</guid>
      <description>Курс начинается не с синтаксиса, а с ответа на вопрос, который обычно откладывают «на потом» — и зря: что происходит между текстом программы и её запуском? Это знание превращает загадочные ошибки сборки в понятные сообщения с конкретным виновником и делает осмысленным всё, что мы будем писать дальше.&#xA;Компиляция и интерпретация Процессор исполняет только машинные команды. Все языки программирования отличаются, по большому счёту, тем, в какой момент и кто переводит текст программы в эти команды.</description>
    </item>
    <item>
      <title>Занятие 2. Анализ сложности алгоритмов</title>
      <link>https://apmath-spbu.github.io/winter2026/02-slozhnost/index.html</link>
      <pubDate>Wed, 05 Aug 2026 12:00:00 +0300</pubDate>
      <guid>https://apmath-spbu.github.io/winter2026/02-slozhnost/index.html</guid>
      <description>Обе программы из этого конспекта решают одну и ту же задачу, обе корректны — и отличаются по времени работы на шесть порядков уже при небольших входах. Разница не в железе и не в языке, а в алгоритме. Сегодняшняя цель — научиться предсказывать такие разрывы до запуска, а в идеале — до написания кода.&#xA;Все замеры в тексте — реальные: Apple M-серия, clang++ -O2.&#xA;Задача дня: числа Фибоначчи $$F_0 = 0, \quad F_1 = 1, \quad F_n = F_{n-1} + F_{n-2}$$Последовательность 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … — задача Леонардо Пизанского о кроликах (1202 год), а сегодня — стандартный полигон для разговора о рекурсии и сложности. Числа Фибоначчи всплывают в анализе алгоритма Евклида (его худший случай — соседние $F_n$), в фибоначчиевых кучах, в филлотаксисе — спиралях подсолнуха; отношение соседних членов стремится к золотому сечению $\varphi \approx 1.618$.</description>
    </item>
    <item>
      <title>Занятие 3. Типы данных: во что упаковываем данные?</title>
      <link>https://apmath-spbu.github.io/winter2026/03-tipy-dannyh/index.html</link>
      <pubDate>Wed, 05 Aug 2026 12:00:00 +0300</pubDate>
      <guid>https://apmath-spbu.github.io/winter2026/03-tipy-dannyh/index.html</guid>
      <description>Двойное занятие с одним сквозным сюжетом: тип — это контракт с компилятором о том, сколько байт занять, как их интерпретировать и какие операции разрешить. Часть I — примитивные типы и их битовое устройство; часть II — составные: массивы, указатели, ссылки. Все размеры и результаты в примерах — реальные замеры (arm64 macOS, LP64; на других платформах отмечено особо).&#xA;Часть I. Примитивные типы Типы — очки, через которые читают байты Память не хранит «числа» — только биты. Одни и те же четыре байта 0x3F800000 — это int 1 065 353 216, float 1.0f или четыре отдельных байта — смотря каким типом на них посмотреть.</description>
    </item>
    <item>
      <title>Занятие 4. Элементарная арифметика</title>
      <link>https://apmath-spbu.github.io/winter2026/04-arifmetika/index.html</link>
      <pubDate>Wed, 05 Aug 2026 12:00:00 +0300</pubDate>
      <guid>https://apmath-spbu.github.io/winter2026/04-arifmetika/index.html</guid>
      <description>Потолок «железной» арифметики — uint64_t: $2^{64} - 1 \approx 1.8 \cdot 10^{19}$, всего 20 цифр. При этом $F_{500}$ — 105 цифр, $1000!$ — 2568 цифр, ключ RSA — 617 цифр. Python делает вид, что проблемы нет: его int безразмерный. Сегодня узнаем, что у него внутри, и соберём то же самое руками — а заодно освоим Git, через который будем сдавать домашние задания.&#xA;Представление: число — это вектор цифр 1 2 3 // 1 048 576 при основании 10: std::vector&lt;int&gt; d = {6, 7, 5, 8, 4, 0, 1}; // d[0] — единицы, d[1] — десятки, …, d[i] — цифра при 10^i Порядок little-endian (младшие разряды в начале) удобен: сложение и умножение идут от младших разрядов — то есть от начала вектора. Держим инварианты: $0 \le d[i] &lt; 10$ и никаких ведущих нулей (кроме самого числа 0).</description>
    </item>
    <item>
      <title>Занятие 5. Управление программой: функции и потоки выполнения</title>
      <link>https://apmath-spbu.github.io/winter2026/05-funkcii/index.html</link>
      <pubDate>Wed, 05 Aug 2026 12:00:00 +0300</pubDate>
      <guid>https://apmath-spbu.github.io/winter2026/05-funkcii/index.html</guid>
      <description>Программа — это не список действий, а граф решений и повторений. Сегодня разбираем инструменты управления этим графом: функции (и их скрытую механику — стек вызовов), ветвления и циклы — вместе с полным каталогом способов застрять в цикле навечно. Все числа в конспекте — реальные замеры (Apple M-серия, clang).&#xA;Функции Единица смысла, а не экономии строк Функция нужна не для того, чтобы «не повторять код» (это приятный бонус), а чтобы:</description>
    </item>
    <item>
      <title>Занятие 6. Рекуррентные соотношения</title>
      <link>https://apmath-spbu.github.io/winter2026/06-rekurrenty/index.html</link>
      <pubDate>Wed, 05 Aug 2026 12:00:00 +0300</pubDate>
      <guid>https://apmath-spbu.github.io/winter2026/06-rekurrenty/index.html</guid>
      <description>К шестому занятию у нас накопилось четыре рекуррентности, решённые «на глаз»: число вызовов наивного Фибоначчи, два разбиения из длинной арифметики и быстрое возведение в степень. Сегодня получаем строгий инструментарий: два ручных метода, основную теорему с доказательством — и характеристические уравнения, которые закроют обещание, данное ещё на занятии 2.&#xA;откуда соотношение мы «угадали» наивный fib (зан. 2) $C(n) = C(n-1) + C(n-2) + 1$ $\Theta(\varphi^n)$ — по замерам разбиение пополам (зан. 4) $T(n) = 4T(n/2) + \Theta(n)$ $\Theta(n^2)$ — по дереву Карацуба (зан. 4) $T(n) = 3T(n/2) + \Theta(n)$ $\Theta(n^{1.585})$ — по дереву быстрое возведение (зан. 2) $T(n) = T(n/2) + \Theta(1)$ $\Theta(\log n)$ — интуиция Рекуррентное соотношение — определение функции через её значения на меньших аргументах плюс база (начальные значения). Решить — найти замкнутую форму или хотя бы асимптотику $\Theta$; для анализа алгоритмов асимптотики почти всегда достаточно.</description>
    </item>
  </channel>
</rss>