From 2042881fa6a90bb97b7c34337ce08268bb35b31f Mon Sep 17 00:00:00 2001 From: vovchik Date: Mon, 21 Aug 2023 18:38:00 +0300 Subject: [PATCH] Start from materials of past years --- .gitignore | 18 ++ 01/hello_world.tex | 135 ++++++++++++ 01/src/empty.txt | 0 01/src/gen.py | 36 ++++ 01/src/least_squares.cpp | 112 ++++++++++ 01/src/line_approx.txt | 50 +++++ 01/src/line_exact.txt | 50 +++++ 01/src/plot.py | 57 +++++ Makefile | 53 +++++ afterword.tex | 12 ++ appendix.tex | 247 ++++++++++++++++++++++ common/biblatex.tex | 19 ++ common/contents.tex | 8 + common/packages.tex | 70 +++++++ common/references.tex | 15 ++ common/setup.tex | 24 +++ common/styles.tex | 211 +++++++++++++++++++ common/title.tex | 34 +++ images/falt_logo.jpg | Bin 0 -> 44555 bytes images/line_approx.pdf | Bin 0 -> 9993 bytes intro.tex | 107 ++++++++++ latexmkrc | 379 +++++++++++++++++++++++++++++++++ references.bib | 437 +++++++++++++++++++++++++++++++++++++++ seminars.tex | 78 +++++++ setup.tex | 16 ++ styles.tex | 160 ++++++++++++++ 26 files changed, 2328 insertions(+) create mode 100644 .gitignore create mode 100644 01/hello_world.tex create mode 100644 01/src/empty.txt create mode 100644 01/src/gen.py create mode 100644 01/src/least_squares.cpp create mode 100644 01/src/line_approx.txt create mode 100644 01/src/line_exact.txt create mode 100644 01/src/plot.py create mode 100644 Makefile create mode 100644 afterword.tex create mode 100644 appendix.tex create mode 100644 common/biblatex.tex create mode 100644 common/contents.tex create mode 100644 common/packages.tex create mode 100644 common/references.tex create mode 100644 common/setup.tex create mode 100644 common/styles.tex create mode 100644 common/title.tex create mode 100644 images/falt_logo.jpg create mode 100644 images/line_approx.pdf create mode 100644 intro.tex create mode 100644 latexmkrc create mode 100644 references.bib create mode 100644 seminars.tex create mode 100644 setup.tex create mode 100644 styles.tex diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c4c6f08 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +*.aux +/*.fdb_latexmk +/*.log +/*.fls +/*.out +/*.run.xml +/*.toc +/*.bbl +/*.bcf +/*.blg +/*.synctex.gz +/*.pytxcode +_minted-*/ +pythontex-files-*/ + + +*.pdf +!images/*.pdf diff --git a/01/hello_world.tex b/01/hello_world.tex new file mode 100644 index 0000000..05adf3b --- /dev/null +++ b/01/hello_world.tex @@ -0,0 +1,135 @@ +% !TEX encoding = UTF8 +% !TEX spellcheck = ru_RU +% !TEX root = ../../seminars.tex + +%%===================== +\chapter{Hello, World!}\label{chap:helloworld} +%%===================== + +%%================================================== +\section{Архитектура Фон-Неймана, уровни абстракции} +%%================================================== +Схематическое устройство компьютера. Алгоритмы и языки программирования. Абстракция от реального <<железа>>. + + + +%%================= +\section{Программы} +%%================= +\lang{С++}\footcite{Stroustrup:2019:ru} является компилируемым языком. Для работы программы её исходный текст должен быть обработан с помощью компилятора, который создаёт объектные файлы, объединяемые компоновщиком в выполнимую программу. Обычно программы на языке \lang{С++} состоят из многих файлов с исходными текстами (именуемыми просто \textit{исходными файлами}). + +\begin{center}\begin{tikzpicture}[node font=\small, >=Stealth, line width=1pt] + \graph [grow right sep, left anchor=east, right anchor=west, nodes=draw] { + "файл1.cpp" -> c1/{компиляция} [ellipse] -> "файл1.o" ->[right anchor=north west] "компоновка" [ellipse, yshift=-2.5ex] -> "выполнимый файл"[yshift=-2.5ex]; + "файл2.cpp" -> c2/{компиляция} [ellipse] -> "файл2.o" ->[right anchor=south west] "компоновка"; + }; +\end{tikzpicture}\end{center} + +Выполнимая программа создаётся для определённой комбинации аппаратного обеспечения и операционной системы; её нельзя просто перенести, скажем, из компьютера \name{Мac} в компьютер с \name{Windows}. Говоря о переносимости программ \lang{С++}, мы обычно имеем в виду переносимость исходного кода, т.\,е. исходный код может быть успешно скомпилирован и выполняться в разных +системах. + +Стандарт \name{ISO} \lang{С++} определяет два типа сущностей. +\begin{itemize} +\item \textit{Фундаментальные возможности языка}, такие как встроенные типы (например, \code{char} и \code{int}) или циклы (например, инструкции \code{for} и \code{while}). + +\item \textit{Компоненты стандартных библиотек}, такие как контейнеры (например, \code{vector}, и \code{map}) или операции ввода--вывода (например, \code{<<} и \code{getline()}). +\end{itemize} + +Компоненты стандартной библиотеки представляют собой совершенно обычный код \code{С++}, предоставляемый каждой реализацией языка. То есть стандартная библиотека \code{С++} может быть реализована в самом \code{С++} (и реализуется "--- с очень небольшим использованием машинного кода для таких вещей, как переключение контекста потока). Это означает, что \code{С++} достаточно выразителен и эффективен для самых сложных задач системного программирования. + +\code{С++} является статически типизированным языком, т.е. тип каждой сущности (например, объекта, значения, имени или выражения) должен быть известен компилятору в точке использования. Тип объекта определяет набор применимых к нему операций. + + + +%%================================== +\section{Метод наименьших квадратов} +%%================================== + +%%=============================== +\subparagraph{Постановка задачи.} +%%=============================== +Рассмотрим регрессию (зависимость) следующего вида: +\begingroup +\newcommand{\SumN}{\ensuremath{\sum\limits_{i=1}^{N}}} +\[ + y_i = a + b x_i + \varepsilon_i,\quad i = \overline{1, N}. +\] +Среди всевозможных значений \(\{ a, b \}\) будем искать такие, которые приводят к минимальной сумме квадратов отклонений (ошибок): +\[ + S_{\varepsilon} = \SumN \varepsilon_i^2 = \SumN (y_i - a - b x_i)^2\quad\rightarrow\quad \min\limits_{a, b}. +\] +Запишем условие существования экстремума: +\[ +\begin{array}{l} + \dfrac{\partial}{\partial a} S_{\varepsilon} = -2 \SumN (y_i - a - b x_i) = 0, \\[2ex] + \dfrac{\partial}{\partial b} S_{\varepsilon} = -2 \SumN (y_i - a - b x_i) x_i = 0, \\ +\end{array} +\] +откуда получим систему линейных уравнений: +\[ +\left\{ \begin{array}{l} + \SumN y_i - N a - b\SumN x_i = 0, \\[2ex] + \SumN x_i y_i - a\SumN x_i - b\SumN x_i^2 = 0. \\ + \end{array} \right. +\] +Вводя обозначение для среднего арифметического множества значений некоторой величины \(f\): +\[ + \bar f = \dfrac{1}{N}\SumN f_i, +\] +перепишем систему в виде: +\[ +\left\{ \begin{array}{l} + \bar y - a - b\bar x = 0, \\ + \overline{x y} - a\bar x - b\overline{x^2} = 0, \\ + \end{array} \right. +\] +и получим искомое решение: +\[ +\boxed{\begin{array}{l} + a = \bar y - b\bar x, \\ + b = \dfrac{\overline{x y} - \bar x\bar y}{\overline{x^2} - \bar x^2}. \\ + \end{array}} +\] +\endgroup + + + +%%==================================== +\subparagraph{Программная реализация.} +%%==================================== +Решение этой задачи может быть выражено на языке \lang{C++} следующим образом:\label{code:lsm} + +\cppfile{01/src/least_squares.cpp} + + + +%%================ +\WhatToReadSection +%%================ +\textcite{Stroustrup:2016:ru}: \textbf{главы~0, 1 и~2} + + + +%%=============== +\ExercisesSection +%%=============== +\begin{exercise} +\item Настройте среду разработки программ на языке \lang{C++} (см. страницу \pageref{sect:workEnv}). + + +\item Создайте свой первый проект с традиционной программой \textenglish{Hello, World!}. + +\smallskip +\emph{Совет}: воспользуйтесь графическими инструкциями из архива +\begin{flushleft} + \yadisk{cpp-seminars/how-to-s/how-to\_create-project.zip}. +\end{flushleft} + +Заголовочный файл \code{std\_lib\_facilities.h} из книги Страуструпа размещён в директории \yadisk{cpp-seminars/libraries}. + + +\item \textbf{NB!} Внимательно изучите и возьмите на вооружение <<горячие клавиши>> среды разработки. Начните осваивать печать вслепую. + +\smallskip +\emph{Совет}: воспользуйтесь информацией из раздела на странице~\pageref{sect:typing}. +\end{exercise} diff --git a/01/src/empty.txt b/01/src/empty.txt new file mode 100644 index 0000000..e69de29 diff --git a/01/src/gen.py b/01/src/gen.py new file mode 100644 index 0000000..45f5e85 --- /dev/null +++ b/01/src/gen.py @@ -0,0 +1,36 @@ +#!/usr/bin/python3 + +import argparse, random + +parser = argparse.ArgumentParser (description = "Generate test data for the least " + "squares method: yi = a + b*xi + epsi") +parser.add_argument ("a", type=float, + help="Constant coefficient in regression model") +parser.add_argument ("b", type=float, + help="Linear coefficient in regression model") +parser.add_argument ("-o", "--output", type=str, default="data.out", + help="Output filename [default: %(default)s]") +parser.add_argument ("-e","--epsilon", type=float, default=0.1, + help="Standard deviation of experiment error [default: %(default)s]") +parser.add_argument ("-n", type=int, default=50, + help="Number of experiment points [default: %(default)s]") +parser.add_argument ("--x-range", nargs=2, type=float, default=[1.05, 2.95], + help="X-axis data range [default: %(default)s]") + +args = parser.parse_args() + + +y = lambda x : args.a + args.b*x + random.gauss (0., args.epsilon) + +def my_range (x_range, n) : + h = (x_range[1] - x_range[0]) / n + x = x_range[0] + for i in range (n) : + yield x + x += h + + +data = ["{0:.6} {1:.6}".format (x, y(x)) for x in my_range (args.x_range, args.n)] + +with open (args.output, "w") as f : + f.write ("\n".join (data)) diff --git a/01/src/least_squares.cpp b/01/src/least_squares.cpp new file mode 100644 index 0000000..f3f99f1 --- /dev/null +++ b/01/src/least_squares.cpp @@ -0,0 +1,112 @@ +// Read data of an experiment from file given as command +// line argument and having the following format: +// x1 y1 +// ... +// xN yN +// Compute linear regression [y = a + b*x] coefficients +// using the least squares method. + +#include +#include +#include +#include +#include +#include +#include +#include + + +struct Point +{ + double x, y; + + Point () = default; + Point (double xx, double yy) : x{ xx }, y{ yy } {/* empty body */} +}; + +std::istream& operator >> (std::istream& is, Point& rhs) +{ + return is >> rhs.x >> rhs.y; +} + +std::ostream& operator << (std::ostream& os, const Point& rhs) +{ + return os << rhs.x <<" "<< rhs.y; +} + + +auto read (const std::string& filename) +{ + std::ifstream ifs{ filename }; + if (!ifs) + throw std::runtime_error{"can't open file '"+ filename +"'"}; + + return std::vector{ std::istream_iterator{ ifs } + , std::istream_iterator{} }; +} + + +struct Coeff +{ + double value; // coefficient estimate + double delta; // confidence band + + Coeff (double v, double d) : value{ v }, delta{ d } {/* empty body */} +}; + + +auto least_squares (const std::vector& points) +{ + // compute average values + size_t N = points.size(); + double x_ave = 0., x2_ave = 0.; + double y_ave = 0., xy_ave = 0.; + + for (const auto& p : points) + { + x_ave += p.x; x2_ave += p.x*p.x; + y_ave += p.y; xy_ave += p.x*p.y; + } + x_ave /= N; x2_ave /= N; + y_ave /= N; xy_ave /= N; + + + // compute linear coefficient estimate + double b = (xy_ave - x_ave*y_ave) / (x2_ave - x_ave*x_ave); + + if (!std::isfinite(b)) + throw std::overflow_error{"division by zero"}; + + + // compute constant coefficient estimate + double a = y_ave - b*x_ave; + + + return std::make_tuple (Coeff{ a, 0. }, Coeff{ b, 0. }); +} + + +int main (int argc, char *argv[]) +{ + if (argc != 2) + { + std::cerr <<"usage: "<< argv[0] <<" file_with_data"<< std::endl; + return 2; + } + + try + { + std::string datafile{ argv[1] }; + + auto [a, b] = least_squares (read (datafile)); // C++17 + + std::cout << datafile <<" " + << a.value <<" "<< a.delta <<" " + << b.value <<" "<< b.delta << std::endl; + } + catch (std::exception& e) + { + std::cerr <<"error: "<< e.what() << std::endl; + return 1; + } +} diff --git a/01/src/line_approx.txt b/01/src/line_approx.txt new file mode 100644 index 0000000..95dc150 --- /dev/null +++ b/01/src/line_approx.txt @@ -0,0 +1,50 @@ +1.05 1.16584 +1.088 1.11605 +1.126 1.2191 +1.164 1.4373 +1.202 1.21263 +1.24 1.35302 +1.278 1.44812 +1.316 1.36983 +1.354 1.33221 +1.392 1.47139 +1.43 1.649 +1.468 1.56803 +1.506 1.45574 +1.544 1.74951 +1.582 1.77343 +1.62 1.73866 +1.658 1.76827 +1.696 1.4907 +1.734 1.68424 +1.772 1.91371 +1.81 1.72872 +1.848 1.87495 +1.886 2.04228 +1.924 1.94713 +1.962 1.98993 +2.0 2.05464 +2.038 2.09528 +2.076 2.01542 +2.114 2.28125 +2.152 2.27558 +2.19 2.09072 +2.228 1.93575 +2.266 2.16868 +2.304 2.16922 +2.342 2.14464 +2.38 2.30142 +2.418 2.29239 +2.456 2.59694 +2.494 2.4786 +2.532 2.55541 +2.57 2.61125 +2.608 2.60551 +2.646 2.44908 +2.684 2.75193 +2.722 2.54662 +2.76 2.67688 +2.798 2.68425 +2.836 2.81591 +2.874 2.78243 +2.912 2.71886 \ No newline at end of file diff --git a/01/src/line_exact.txt b/01/src/line_exact.txt new file mode 100644 index 0000000..748215b --- /dev/null +++ b/01/src/line_exact.txt @@ -0,0 +1,50 @@ +1.05 1.174 +1.088 1.20744 +1.126 1.24088 +1.164 1.27432 +1.202 1.30776 +1.24 1.3412 +1.278 1.37464 +1.316 1.40808 +1.354 1.44152 +1.392 1.47496 +1.43 1.5084 +1.468 1.54184 +1.506 1.57528 +1.544 1.60872 +1.582 1.64216 +1.62 1.6756 +1.658 1.70904 +1.696 1.74248 +1.734 1.77592 +1.772 1.80936 +1.81 1.8428 +1.848 1.87624 +1.886 1.90968 +1.924 1.94312 +1.962 1.97656 +2.0 2.01 +2.038 2.04344 +2.076 2.07688 +2.114 2.11032 +2.152 2.14376 +2.19 2.1772 +2.228 2.21064 +2.266 2.24408 +2.304 2.27752 +2.342 2.31096 +2.38 2.3444 +2.418 2.37784 +2.456 2.41128 +2.494 2.44472 +2.532 2.47816 +2.57 2.5116 +2.608 2.54504 +2.646 2.57848 +2.684 2.61192 +2.722 2.64536 +2.76 2.6788 +2.798 2.71224 +2.836 2.74568 +2.874 2.77912 +2.912 2.81256 \ No newline at end of file diff --git a/01/src/plot.py b/01/src/plot.py new file mode 100644 index 0000000..4ef7234 --- /dev/null +++ b/01/src/plot.py @@ -0,0 +1,57 @@ +#!/usr/bin/python3 + +import argparse, pathlib + +## set the command line interface +parser = argparse.ArgumentParser (description=""" + Make a plot of the linear regression y=a+b*x + built from the data of an experiment""") + +parser.add_argument ("file", type=pathlib.Path, + help="file with experiment data") + +parser.add_argument ("a", type=float, + help="estimate of the constant coefficient") +parser.add_argument ("da", type=float, + help="confidence band for `a`") + +parser.add_argument ("b", type=float, + help="estimate of the linear coefficient") +parser.add_argument ("db", type=float, + help="confidence band for `b`") + + +args = parser.parse_args() + + +## read an experiment data; +## supposed file format is: +## x1 y1 +## ... +## xN yN +xx, yy = None, None +with args.file.open() as f : + data = [[float(item) for item in line.split (maxsplit=2)] + for line in f.readlines() if not line.isspace()] + xx, yy = zip (*data) + + +## set the regression shape +y = lambda x : args.a + args.b*x + +## compute points of the regression curve +xe = [xx[0], xx[-1]] +ye = [y(x) for x in xe] + + +import matplotlib.pyplot as plt + +## make figure +plt.plot (xe, ye, "k") +plt.plot (xx, yy, "k+", markersize=8) + +plt.grid (True, which="both") +plt.title ("y = ({} ± {}) + ({} ± {})*x" + .format (args.a, args.da, args.b, args.db)) + +plt.savefig (args.file.with_suffix(".pdf").as_posix(), bbox_inches="tight") diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d2cf44a --- /dev/null +++ b/Makefile @@ -0,0 +1,53 @@ +## config file +MKRC ?= latexmkrc + +## source *.tex file +SOURCE ?= seminars + +## LaTeX compiler output *.pdf file +TARGET ?= $(SOURCE) + +## LaTeX version +BACKEND ?= -lualatex + +## -synctex=1 -- synchronization file between source and PDF for IDE +## -shell-escape -- required for minted and pythontex packages +LATEXFLAGS ?= -synctex=1 -shell-escape -halt-on-error -file-line-error + +BIBERFLAGS ?= # --fixinits + +TIMERON ?= # show CPU usage + +LATEXMKFLAGS ?= -silent + +## Makefile options +MAKEFLAGS := -s +.DEFAULT_GOAL := all +.NOTPARALLEL: + + +export LATEXFLAGS +export BIBERFLAGS +export TIMERON + + +all: + latexmk -norc -r $(MKRC) $(LATEXMKFLAGS) $(BACKEND) -latexoption="$(LATEXFLAGS)" -jobname=$(TARGET) $(SOURCE) + + +clean: + latexmk -norc -r $(MKRC) -f $(LATEXMKFLAGS) $(BACKEND) -jobname=$(TARGET) -c $(SOURCE) + rm -f ./*.aux ./**/*.aux + +distclean: clean + latexmk -norc -r $(MKRC) -f $(LATEXMKFLAGS) $(BACKEND) -jobname=$(TARGET) -C $(SOURCE) + rm -rf ./_minted-$(TARGET) + + +force: all +force: LATEXMKFLAGS := $(LATEXMKFLAGS) -g +force: + + +.PHONY: all clean distclean force + diff --git a/afterword.tex b/afterword.tex new file mode 100644 index 0000000..25994f9 --- /dev/null +++ b/afterword.tex @@ -0,0 +1,12 @@ +% !TEX encoding = UTF8 +% !TEX spellcheck = ru_RU +% !TEX root = ../seminars.tex + +%%================== +\chapter{Что дальше} +%%================== +Станете ли вы профессиональным программистом или экспертом по языку \lang{С++}, прочитав эту книгу?\footcite[Текст взят из подраздела 0.1.3]{Stroustrup:2016:ru} Конечно, нет! Настоящее программирование "--- это тонкое, глубокое и очень сложное искусство, требующее знаний и технических навыков. Рассчитывать на то, что за четыре месяца вы станете экспертом по программированию, можно с таким же успехом, как и на то, что за полгода или даже год вы полностью изучите биологию, математику или иностранный язык (например, китайский, английский или датский) или научитесь играть на виолончели. Если подходить к изучению книги серьёзно, то можно ожидать, что вы сможете писать простые полезные программы, читать более сложные программы и получите хорошие теоретическую и практическую основы для дальнейшей работы. + +Прослушав этот курс, лучше всего поработать над реальным проектом. Ещё лучше параллельно с работой над реальным проектом приступить к чтению какой~-нибудь книги профессионального уровня (например, \textcite{Stroustrup:2013:en}), более специализированной книги, связанной с вашим проектом, например, документации по библиотеке \name{Qt} для разработки графического пользовательского интерфейса (GUI) или справочника по библиотеке \name{ACE} для параллельного программирования, или учебника, посвященного конкретному аспекту языка \lang{С++}, например \textcite{Koenig:2002:ru, Sutter:2008:ru, Gamma:2004:ru}. + +В конечном итоге вам придётся приступить к изучению некоторого другого языка программирования. Невозможно стать профессионалом в области программного обеспечения (даже если программирование не является вашей основной специальностью), зная только один язык программирования. diff --git a/appendix.tex b/appendix.tex new file mode 100644 index 0000000..63c8d0d --- /dev/null +++ b/appendix.tex @@ -0,0 +1,247 @@ +% !TEX encoding = UTF8 +% !TEX spellcheck = ru_RU +% !TEX root = seminars.tex + +%%================== +\chapter{Приложение} +%%================== +%%=========================================== +\section{Установка и настройка рабочей среды}\label{sect:workEnv} +%%=========================================== +{ % hot keys +\newcommand*{\hotkey}[1]{\fbox{\texttt{\small #1}}} +\newcommand*{\hotplus}{{\small\,+\,}} +\newcommand*{\hotkeys}[2]{\hotkey{#1}\hotplus\hotkey{#2}} +\newcommand*{\hotkeyss}[3]{\hotkey{#1}\hotplus\hotkey{#2}\hotplus\hotkey{#3}} + + + +%%============================ +\paragraph{ОС \name{Windows}.} +%%============================ +Мы настоятельно рекомендуем в качестве \name{IDE} установить \name{Qt\,Creator}. Совместно с ним используйте \name{MinGW-w64} (компилятор, компоновщик, отладчик и прочее). + +Удобная \name{UNIX}-подобная командная среда \name{Git\,Bash} идёт в комплекте с системой контроля версий \href{\giturl}{\git}, которая, в свою очередь, входит в состав \name{Smartgit}-а "--- графической облочки над \git-ом. Командная среда, помимо прочего, облегчит тестирование программ в автоматическом и полуавтоматическом режимах. А система контроля версий окажется неотъемлемым элементом разработки сложных программ. + +Для установки и настройки компонентов: +\begin{itemfeature} +\item Загрузите \href{\qtcreatorurl}{\name{Qt\,Creator}}\footnote{\nolinkurl{\qtcreatorurl}}, \href{\mingwurl}{\name{MinGW-w64}}\footnote{\nolinkurl{\mingwurl}} и \href{\smartgiturl}{\name{Smartgit}}\footnote{\nolinkurl{\smartgiturl}}. + +\item Распакуйте архив \name{MinGW-w64} в каталог \code{c:\backslash{}Program Files} или любой другой каталог, куда вы обычно устанавливаете программы. + +И далее, следуя графическим инструкциям из архива +\begin{flushleft} + \yadisk{cpp-seminars/how-to-s/how-to\_set-up-qt-creator.zip}, +\end{flushleft} +выполните последующие пункты. + +\item Добавьте путь к компилятору в список стандартных системных путей. Если вы не знаете, как это выполнить + +\item Установите \name{Qt\,Creator}, следуя инструкциям установщика. + +\item Запустите \name{Qt\,Creator}. Откройте окно настройки параметров из меню \code{Инструменты} \code{->} \code{Параметры}. Во вкладке \code{Комплекты} выберите, скорее всего, единственный комплект \code{Desktop}. В качестве компиляторов для \lang{C} и \lang{C++} выберите из списка \code{MinGW} \GCC{} \code{C} и \code{C++}, соответственно. В качестве отладчика укажите \GDB. + +\item Установите \name{Smartgit}, оставляя рекомендуемые (по умолчанию) параметры в тех местах, где вы сомневаетесь, что выбрать. +\end{itemfeature} + +Если что-то пошло не так, повторите процедуру \textbf{спокойно}, выполняя \textbf{в точности} все указанные выше действия. Используйте только латиницу для каталогов установки и проектов, иногда русские буквы в путях приводят к ошибкам в \name{Qt\,Creator}-е. + +И теперь не получилось? Хм-м... Тогда обратитесь за помощью к студентам старших курсов или преподавателю. + + + +%%========================= +\paragraph{ОС \name{UNIX}.} +%%========================= +Пользователи \name{UNIX} и подобных ей операционных систем могут установить при помощи системы управления пакетами (например, \code{apt} в \name{Ubuntu}) дистрибутив \name{Qt\,Creator} совместно со средствами сборки \name{GNU} \GCC{} или \code{Clang}, а также систему контроля версий \git{} и \name{Smartgit}. + + + +%%============================= +\section{Редактирование текста}\label{sect:typing} +%%============================= +Набор исходного текста "--- неотъемлемая часть разработки программ. Используйте <<горячие>> клавиши для более быстрого редактирования. Краткий список наиболее популярных комбинаций, поддерживаемых даже простыми редакторами: + +\begin{longtable}[l]{@{}rp{0.7\textwidth}@{}} +\endhead +\endfoot + +\hotkeys{Ctrl}{A} & Выделить всё.\\[0.5em] + +\hotkeys{Ctrl}{C} & Скопировать выделение. \\ +\hotkeys{Ctrl}{V} & Вставить. \\[0.5em] + +\hotkeys{Ctrl}{Z} & Отменить последнее действие. \\[0.5em] + +\hotkey{Home} & Переместить курсор в начало\slash{}конец текущей строки. \\ +\hotkey{End} & \\[0.5em] + +\hotkeys{Shift}{Home} & Выделить символы с текущей позиции и до начала\slash{}конца строки. \\ +\hotkeys{Shift}{End} & \\[0.5em] + +\hotkeys{Ctrl}{Home} & Переместить курсор в начало\slash{}конец файла. \\ +\hotkeys{Ctrl}{End} & \\[0.5em] + +\hotkeys{Ctrl}{\leftarrow} & Переместить курсор по словам. \\ +\hotkeys{Ctrl}{\rightarrow} & \\ +\end{longtable} + +\noindent Дополнительные полезные комбинации в \name{Qt\,Creator}: +\begin{longtable}[l]{@{}rp{0.7\textwidth}@{}} +\endhead +\endfoot + +\hotkeys{Ctrl}{I} & Выровнять отступ (\textenglish{\textbf{i}ndent}) текущей строки или выделения. \\[0.5em] + +\hotkeys{Ctrl}{\slash} & Комментировать\slash{}раскомментировать текущую строку или выделение. \\[0.5em] + +\hotkeyss{Ctrl}{Shift}{R} & Переименовать имя под курсором. \\[0.5em] + +\hotkeyss{Ctrl}{Shift}{\uparrow} & Сместить текущую строку вверх\slash{}вниз. \\ +\hotkeyss{Ctrl}{Shift}{\downarrow} & \\[0.5em] + +\hotkeyss{Alt}{Shift}{\uparrow} & Редактировать столбец. \\ +\hotkeyss{Alt}{Shift}{\downarrow} & \\ +\end{longtable} + +Полезно научиться набирать текст вслепую, то есть не глядя на клавиатуру. В сочетании с использованием горячих клавиш это позволяет достичь существенного ускорения при работе с исходным кодом. Таким образом, остаётся больше времени для размышлений над структурой и логикой самой программы. В качестве примера он-лайн клавиатурного тренажёра приведём \href{\typingtutorurl}{эту}\footnote{\nolinkurl{\typingtutorurl}} ссылку. + +} % hot keys + + + +%%==================== +\section{Unix утилиты}\label{sect:utils} +%%==================== +Совместно с командной средой (\name{bash} "--- \textenglish{\textbf{b}ourne \textbf{a}gain \textbf{sh}ell}) поставляется широкий набор полезных программ, или утилит (\textenglish{utilities}). + +\console/$ cd dir/%$ + +\textenglish{\textbf{c}hange \textbf{d}irectory} "--- перейти в каталог \code{dir}. Если каталог опущен, то перейти в домашний каталог. (Определяется значением переменной среды \code{HOME}.) Файловая система \textenglish{Unix} представляет собой единое дерево, и любой абсолютный путь начинается с корня (\code{/}). Точка (\code{.}) означает текущий каталог, две точки (\code{..}) "--- родительский каталог. + +\console/$ cd ../%$ + +Перейти в родительский каталог. + +\console|$ cd /|%$ + +Перейти в корневой каталог. + +\console/$ pwd/%$ + +\textenglish{\textbf{p}rint \textbf{w}orking \textbf{d}irectory} "--- вывести на экран абсолютный путь к текущему каталогу. + +\console/$ ls dir/%$ + +\textenglish{\textbf{l}i\textbf{s}t} "--- вывести на экран содержимое каталога \code{dir}. Если каталог опущен, то по умолчанию используется текущий каталог. + +\console/$ man cmd/%$ + +\textenglish{\textbf{man}ual} "--- вывести на экран подробную справку о команде \code{cmd}. + +\console/$ cmd --help/%$ + +Вывести на экран короткую справку о команде \code{cmd}. Полезно, если утилита \code{man} недоступна. + +\console/$ mkdir dir/%$ + +\textenglish{\textbf{m}a\textbf{k}e \textbf{dir}ectory} "--- создать каталог \code{dir}. + +\console/$ rmdir dir/%$ + +\textenglish{\textbf{r}e\textbf{m}ove \textbf{dir}ectory} "--- удалить пустой каталог \code{dir}. + +\console/$ rm file/%$ + +\textenglish{\textbf{r}e\textbf{m}ove} "--- удалить файл. Используя опцию \code{-r} можно рекурсивно удалить непустой каталог. + +\console/$ mv src dst/%$ + +\textenglish{\textbf{m}o\textbf{v}e} "--- перемещает/переименовывает файл \code{src} в \code{dst}. Имя \code{dst} может быть каталогом, тогда \code{mv} перемещает \code{src} туда. + +\console/$ cat file.../%$ + +\textenglish{\textbf{cat}enate} "--- связывает файлы и выводит объединённое содержимое на экран. + +\console/$ less file/%$ + +Более мощный аналог утилиты \code{more} "--- постраничного фильтра для просмотра файлов. Часто применяется для буферизации вывода на экран, используя конвейер: + +\console/$ odjdump -d prog | less/%$ + + +\console/$ vim file/%$ + +\textenglish{\textbf{v}isual editor \textbf{im}proved} "--- открыть файл для редактирования. Пройти вводный курс по использованию этого мощного редактора можно запустив команду: + +\console/$ vimtutor/%$ + + + +%%================================== +\section{Интерпретатор \name{shell}}\label{sect:shell} +%%================================== +Когда система (в терминале) выдаёт приглашение \code{\$} и вы вводите команды для выполнения, вы имеете дело не с ядром самой системы, а с неким посредником, называемым интерпретатором команд, или \name{shell}\footnote{Более подробно об интерпретаторе \name{shell} и других возможностях системы \textenglish{Unix} излагается, например, в книге \fullcite{Kernighan:1992:ru}}. Это обычная программа, но она может делать удивительные вещи. Применение программы--посредника обеспечивает три главных преимущества: + +\begin{itemfeature}[itemsep=\baselineskip] + \item Сокращённые имена файлов: можно задать целое множество файлов в качестве аргументов команде, указав шаблон для имён: \name{shell} будет искать файлы, имена которых соответствуют заданному шаблону. + + \console/$ ls *.cpp *.c/%$ + + Вывести на печать имена всех файлов в текущем каталоге, которые оканчиваются на~\code{.cpp} или \code{.c}. Символ \code{*} в шаблоне соответствует любой последовательности символов. Поддерживаются и другие специальные символы для задания шаблона. + + + \item Переключение ввода--вывода: вывод любой программы можно направить в файл, а не на терминал, ввод можно получать из файла, а не с терминала. Ввод и вывод можно даже передать другим программам. + + \console/$ ls *.cpp > cppfiles.txt/%$ + + Имена всех файлов, оканчивающихся на~\code{.cpp}, направить в файл \code{cppfiles.txt}. Файл будет создан, если не существует, или перезаписан, если существует. + + \console/$ wc -l < main.cpp/%$ + + Подсчитать количество строк (опция \code{-l}) в файле \code{main.cpp}. + + \console/$ cat main.cpp | wc -l/%$ + + То же. Символ~\code{|} обозначает конвейер. Вывод команды слева передаётся на ввод команде справа. Можно организовывать в конвейере цепочку любой длины. + + \console/$ wc -l main.cpp/%$ + + То же, используя лишь возможности самой утилиты \code{wc} (\textenglish{\textbf{w}ord \textbf{c}ount}). + + + \item Создание собственной среды: можно определить свои собственные команды и правила сокращений. +\end{itemfeature} + + + +%%========================================== +\section{Рисование графиков в \lang{Python}}\label{sect:pyplot} +%%========================================== +Каждый язык имеет свои достоинства и недостатки и, как правило, нацелен на эффективное решение определённого класса задач. Совместное использование разных языков часто помогает сократить усилия при разработке программ и повысить гибкость либо удобство создаваемых инструментов. Попробуем продемонстрировать это на примере визуализации результатов обработки данных лабораторной работы по физике, которые можно получить методом наименьших квадратов, рассмотренным в разделе~\ref{chap:helloworld} (также см. упр.~\ref{ex:plot} на странице~\pageref{ex:plot}). + +\begin{figure}[ht] + {\centering + \includegraphics[width=0.6\textwidth]{images/line_approx.pdf} + + } + \caption{Визуализация при помощи \name{Matplotlib}} + \label{fig:pyplot} +\end{figure} + +В языке \lang{C++} нет встроенных графических средств. Для этого необходимо использовать сторонние библиотеки. Работа с подобными инструментами не всегда настолько проста, как хотелось бы. А настройка внешнего вида координатных осей, изображаемых кривых и точек может потребовать перекомпиляции всей программы. + +Одним из действительно удобных для этого случая решений является написание сценария (\textenglish{script}) на интерпретируемом языке. \href{\pythonurl}{\lang{Python}} относится к этому ряду языков и имеет мощную поддержку разнообразных средств практически прямо <<из коробки>>. Ниже приведён вариант решения нашей задачи с использованием пакета \href{\matplotliburl}{\name{Matplotlib}}. + +\begin{center} + \yadisk{cpp-seminars/examples/01/plot.py} +\end{center} + +\inputminted[linenos, fontsize=\small]{py}{01/src/plot.py} + +Совместить использование разработанных нами отдельных инструментов можно при помощи командной среды. Для этого достаточно всего одной строки (см. страницу~\pageref{sect:shell}): +\begin{consolecode} +$ ./lsm line_approx.txt | xargs python3 plot.py +\end{consolecode} + +\noindent Результат в виде графического файла \code{line\_approx.pdf}, изображён на рисунке~\ref{fig:pyplot}. diff --git a/common/biblatex.tex b/common/biblatex.tex new file mode 100644 index 0000000..dfbecc4 --- /dev/null +++ b/common/biblatex.tex @@ -0,0 +1,19 @@ +% !TEX encoding = UTF8 +% !TEX spellcheck = en_EN + +\usepackage{csquotes} +\usepackage[backend=biber,% + bibencoding=utf8,% + citestyle=gost-inline-min,%gost-numeric,% + bibstyle=gost-numeric,% + sorting=none,% + defernumbers=true,% + sortcites=true,% + doi=false,% + isbn=false,% + autolang=langname]{biblatex} + + +\DeclareFieldFormat{url}{ + \mkbibacro{URL}\addcolon\space\href{#1}{\nolinkurl{\thefield{urlraw}}} +} diff --git a/common/contents.tex b/common/contents.tex new file mode 100644 index 0000000..984ed6c --- /dev/null +++ b/common/contents.tex @@ -0,0 +1,8 @@ +% !TEX encoding = UTF8 +% !TEX spellcheck = en_US + +\clearpage + +\ifdefmacro{\microtypesetup}{\microtypesetup{protrusion=false}}{} +\tableofcontents* +\ifdefmacro{\microtypesetup}{\microtypesetup{protrusion=true}}{} \ No newline at end of file diff --git a/common/packages.tex b/common/packages.tex new file mode 100644 index 0000000..ae10b5a --- /dev/null +++ b/common/packages.tex @@ -0,0 +1,70 @@ +% !TEX encoding = UTF8 +% !TEX spellcheck = en_US + + +%%% Page layout %%% +\usepackage{pdflscape} +\usepackage{geometry} + +%%% Mathematics %%% +\usepackage{amsthm,amsfonts,amsmath,amscd} +\usepackage{mathtools} % Add environment 'multlined' +\usepackage{dsfont} +\usepackage{unicode-math} + +%%% Encodings and fonts %%% +\usepackage{polyglossia}[2014/05/21] % Automatically load 'fontspec' + +%%% Paragraph layout %%% +\usepackage{indentfirst} +\usepackage{epigraph} +\usepackage[style=french]{csquotes} + +%%% Colors %%% +\usepackage[svgnames,table,hyperref]{xcolor} %,cmyk + +%%% Tables %%% +\usepackage{longtable,ltcaption} +\usepackage{multirow,makecell} % Advanced formatting +\usepackage{tabu,tabulary} % Automatic columns width +\usepackage{array} +\usepackage{hhline} +\usepackage{multicol} + +%%% General layout %%% +\usepackage{soulutf8} % Underlying with hyphenation +\usepackage{icomma} +\usepackage{calc} +\usepackage[normalem]{ulem} + +%%% Hyper references %%% +\usepackage{hyperref} + +%%% Figures %%% +\usepackage[export]{adjustbox} +\usepackage{graphicx} +\usepackage{tikz} +\usetikzlibrary{arrows,decorations.pathmorphing,backgrounds,positioning,fit,calc} +\usetikzlibrary{arrows.meta} +\usetikzlibrary{shapes,shapes.misc} +\usetikzlibrary{graphs, graphdrawing} +\usegdlibrary{trees, layered} +\usepackage{wrapfig} + +%%% Lists %%% +\usepackage[inline]{enumitem} + +%%% Embedded languages %%% +\usepackage[usefamily={py,sympy},rerun=always]{pythontex} + +%%% Listings %%% +\usepackage{verbatim} +\usepackage{minted} +\usepackage{listings} +\lccode`\~=0\relax % Fix \MakeLowercase etc. with (xe|lua)latex + +%%% Smart references %%% +%\usepackage{cleveref} + +%%% Style features %%% +\usepackage{lua-ul} diff --git a/common/references.tex b/common/references.tex new file mode 100644 index 0000000..0365f43 --- /dev/null +++ b/common/references.tex @@ -0,0 +1,15 @@ +% !TEX encoding = UTF8 +% !TEX spellcheck = en_US + +\clearpage + +%\hypersetup{ urlcolor=black } + +%\providecommand*{\BibDash}{} +\urlstyle{rm} +\ifdefmacro{\microtypesetup}{\microtypesetup{protrusion=false}}{} +\printbibliography[heading=bibintoc] +\ifdefmacro{\microtypesetup}{\microtypesetup{protrusion=true}}{} +\urlstyle{tt} + +%\hypersetup{ urlcolor={urlcolor} } diff --git a/common/setup.tex b/common/setup.tex new file mode 100644 index 0000000..384c6e3 --- /dev/null +++ b/common/setup.tex @@ -0,0 +1,24 @@ +% !TEX encoding = UTF8 +% !TEX spellcheck = en_US + + +%%% Hyper references colors %%% + +\definecolor{linkcolor}{rgb}{0.9,0,0} +\definecolor{citecolor}{rgb}{0,0.6,0} +\definecolor{urlcolor}{rgb}{0,0,1} + + + +%%% Define names %%% + +\newcommand*\paperOrganization{\todo{Organization}} +\newcommand*\paperOrganizationShort{\todo{OShort}} +\newcommand*\paperDepartment{\todo{Department}} +\newcommand*\paperDepartmentShort{\todo{DShort}} +\newcommand*\paperTitle{\todo{Title}} +\newcommand*\paperSubject{\todo{Subject}} +\newcommand*\paperAuthor{\todo{\textcopyright{}perto}} +\newcommand*\paperKeywords{\todo{Keywords}} +\newcommand*\paperDate{\todo{Date}} +\newcommand*\paperYear{\todo{Year}} diff --git a/common/styles.tex b/common/styles.tex new file mode 100644 index 0000000..3961121 --- /dev/null +++ b/common/styles.tex @@ -0,0 +1,211 @@ +% !TEX encoding = UTF8 +% !TEX spellcheck = en_US + + +%%% Template %%% + +\DeclareRobustCommand{\todo}{\textcolor{red}} + +\AtBeginDocument{% + \setlength{\parindent}{2.5em} +} + + + +%%% Encondings and fonts %%% + +\setmainlanguage[babelshorthands=true]{russian} +\setotherlanguage{english} + +\setmonofont{Source Code Pro} +\newfontfamily\cyrillicfonttt{Source Code Pro} + +\defaultfontfeatures{Ligatures=TeX} % NB! monofont settings should be before this + +\setmainfont{STIX Two Text} +\newfontfamily\cyrillicfont{STIX Two Text} + +\setsansfont{Source Sans 3} +\newfontfamily\cyrillicfontsf{Source Sans 3} + +\setmathfont{STIX Two Math} +\newfontfamily\cyrillicfontmf{STIX Two Math} + + + +%%% Captions %%% + +\setlength{\abovecaptionskip}{0pt} +\setlength{\belowcaptionskip}{0pt} + +\captionwidth{\linewidth} +\normalcaptionwidth + + + +%%% Figures %%% + +\setfloatadjustment{figure}{% + \setlength{\abovecaptionskip}{0pt} + \setlength{\belowcaptionskip}{0pt} + \precaption{} + \captionnamefont{\normalfont\normalsize} + \captiondelim{~--- } + \captionstyle[\centering]{\centering} + \captiontitlefont{\normalfont\normalsize} + \postcaption{} +} + + + +%%% Subfigures captions %%% + +\newsubfloat{figure} +\renewcommand{\thesubfigure}{\asbuk{subfigure}} +\subcaptionsize{\normalsize} +\subcaptionlabelfont{\normalfont} +\subcaptionfont{\!\!) \normalfont} % round bracket after a letter +\subcaptionstyle{\centering} + + + +%%% Tables %%% + +\setfloatlocations{table}{!h} + + +%%% Hyper references settings %%% + +\hypersetup{ + unicode, + linktocpage=true, +% linktoc=all, % both the section and page part are links +% pdfpagelabels=false, + plainpages=false, + colorlinks, + linkcolor={linkcolor}, + citecolor={citecolor}, + urlcolor={urlcolor}, +% hidelinks, + pdftitle={\paperTitle}, + pdfauthor={\paperAuthor}, + pdfsubject={\paperSubject}, + pdfkeywords={\paperKeywords}, + pdflang={ru}, +} + + + +%%% Lists %%% + +\renewcommand{\labelitemi}{\normalfont\bfseries{--}} + +%\renewcommand{\theenumi}{\alph{enumi}} +%\renewcommand{\labelenumi}{\theenumi)} + +\makeatletter +\AddEnumerateCounter{\Asbuk}{\russian@Alph}{Щ} +\AddEnumerateCounter{\asbuk}{\russian@alph}{щ} +\makeatother + +%\renewcommand{\theenumi}{\asbuk{enumi}} +%\renewcommand{\labelenumi}{\theenumi)} + +\renewcommand{\theenumii}{\asbuk{enumii}} +\renewcommand{\labelenumii}{\theenumii)} + +\renewcommand{\theenumiii}{\arabic{enumiii}} +\renewcommand{\labelenumiii}{\theenumiii)} + +\setlist{% + nosep,% + labelindent=\parindent, leftmargin=*,% + topsep=\medskipamount, itemsep=\smallskipamount% +} + +\newlist{enumIssue}{enumerate}{1} +\setlist[enumIssue]{label=\Asbuk*., ref=\Asbuk*} + +\newlist{enumissue}{enumerate}{1} +\newlist{enumissue*}{enumerate*}{1} +\setlist[enumissue,enumissue*]{label=\textit{\asbuk*}), ref=\textit{\asbuk*}} + +\newlist{itemfeature}{itemize}{1} +\setlist[itemfeature]{label=--, topsep=\medskipamount} + +\newlist{exercise}{enumerate}{1} +\setlist[exercise,1]{label={\arabic*.}, ref={\arabic*}, labelindent=0pt, widest={99}, itemsep=\bigskipamount, topsep=\bigskipamount} + + + +%%% Listings %%% + +\usemintedstyle{manni} + +\renewcommand{\theFancyVerbLine}{% + \textcolor{gray}{\tiny\arabic{FancyVerbLine}}% +} + +\newmintinline{c}{fontsize=\small} +\newmintinline{cpp}{fontsize=\small} +\newmintinline{gas}{fontsize=\small} +\newmintinline{text}{fontsize=\small} + +\newmint[cc]{c}{fontsize=\small, escapeinside=||} +\newmint{cpp}{fontsize=\small} +\newmint{js}{fontsize=\small} +\newmint{gas}{fontsize=\small} +\newmint[txt]{text}{fontsize=\small} +\newmint{console}{fontsize=\small} +\newmint[precomment]{text}{fontsize=\footnotesize, formatcom=\color{cyan}} + +\newminted{c}{linenos, fontsize=\small, numbersep=0.2em, escapeinside=||} +\newminted{cpp}{linenos, fontsize=\small, numbersep=0.2em} +\newminted{gas}{linenos, fontsize=\small, numbersep=0.2em, tabsize=2} +\newminted{text}{fontsize=\small, tabsize=2} +\newminted{console}{fontsize=\small, tabsize=2} + +\newmintedfile{c}{linenos, fontsize=\small, numbersep=0.2em} +\newmintedfile{cpp}{linenos, fontsize=\small, numbersep=0.2em} +\newmintedfile{js}{linenos, fontsize=\small, numbersep=0.2em} +\newmintedfile{gas}{linenos, fontsize=\small, numbersep=0.2em, tabsize=2} +\newmintedfile{objdump}{linenos, fontsize=\small, numbersep=0.2em, tabsize=2, escapeinside=||} +\newmintedfile{text}{fontsize=\small, tabsize=2} +\newmintedfile{console}{fontsize=\small, tabsize=2} + + +\newminted[precode]{text}{fontsize=\footnotesize, formatcom=\color{cyan}} + + + +%%% General layout %%% + +\DeclareRobustCommand*{\name}{\texttt} +\DeclareRobustCommand*{\code}[1]{\name{\small #1}} +\DeclareRobustCommand*{\codebf}[1]{\code{\bfseries #1}} +\DeclareRobustCommand*{\lang}[1]{\name{#1}} + +\newcommand*{\comm}[1]{{\color{cyan}\ttfamily\footnotesize\itshape #1}} + +\newcommand*{\styleans}[1]{\color{cyan}\underline{\color{gray}\ttfamily{}#1}} +\newcommand*{\showans}[1]{\phantom{#1}} +\newcommand*{\ansx}[1]{} +\newcommand*{\ansdots}[1]{\textcolor{cyan}{\ttfamily ...}} + +\newcommand*{\ansfwnostar}[2]{\styleans{\makebox[#1][l]{\showans{#2}}}} +\newcommand*{\ansfwstar}[2]{\styleans{\makebox[#1][l]{\color{black}#2}}} +\newcommand*{\ansvwnostar}[1]{\styleans{\showans{#1}}} +\newcommand*{\ansvwstar}[1]{\styleans{\color{black}#1}} + +\makeatletter +\newcommand*{\ansfw}{\@ifstar\ansfwstar\ansfwnostar} +\newcommand*{\ansvw}{\@ifstar\ansvwstar\ansvwnostar} +\makeatother + +\newcommand*{\ArrowTo}[1]{% + \tikz[baseline=#1]{ + \draw[white, -{Stealth[black, length=18pt, open]}] (0,0) -- (0.01,0) + }% +} + +\newcommand*{\mystyle}[1]{\textit{\ttfamily\footnotesize{}#1}} diff --git a/common/title.tex b/common/title.tex new file mode 100644 index 0000000..37d3763 --- /dev/null +++ b/common/title.tex @@ -0,0 +1,34 @@ +% !TEX encoding = UTF8 +% !TEX spellcheck = ru_RU + +\thispagestyle{empty}% +\begin{center}% + \paperOrganization +\end{center}% +% +\vspace{0pt plus 6fill}% +% +\begin{center} + \includegraphics[width=15em]{images/falt_logo.jpg} +\end{center} +% +\vspace{0pt plus 4fill}% +% +\begin{center}% +\paperDepartment +\end{center}% +% +\vspace{0pt plus 1fill}% +% +\begin{center}% +\textbf{\Huge\paperTitle} + +\vspace{0pt plus 2fill}% +\textit{\large \paperSubject} + +\vspace{0pt plus 4fill}% +\textcolor{violet}{\itshape\today} + +\vspace{0pt plus 4fill}% +{Жуковский, \paperDate} +\end{center} diff --git a/images/falt_logo.jpg b/images/falt_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4ac0995f2d5fab98c51f884aea62c1a38ca70d16 GIT binary patch literal 44555 zcmbTdcRZW#`!*g_wJ244MvbDV4oZzg2a2kq#3*U2_Gs-DNlVejDvHt)wRdba)7rCY z@4a_oMwTaizdxVv_x1Yy^?RPk<(0^d`@HY#I?m%f&f_{AJDmeu)X~(|1kljX0G?C7 z0H+jy%6&tPyHE8Em4)qI$vVEVu@m;baqYUWq?d<-tDUg6j+U^_6Adk4Z>8%}GQw_N zFPt4b{e;zo?_6g*odnzm(9zQVeNrE1s89NH^z>)W&@(bHoIS_P$jr>d$i#Gk<vaxe;a&j`Wa`SL;@Lb~H1ad%v}`nVY&54W03ZNBLr)F$Z?yk;(9lxP@hro+^NdW?11c{9Xldx^XwT67 zJ!|UGfz;0dXV~a3UA}SmEW5!A1`#)oo9|-2pA)@T`is-BA1ik2rF+nMMlNn1UOw?F z5|UC^!G%e(Nkj+h^d*m^(z}&J9`I54^J;|A74NJ;P)Y+VIMvs zW8*%@CnSDJN>0zn%*xKm&C4$D19n{U}*7{Vj8UvSb=9 zQZkKB-ZoeRz+qrUzqVN1@E!L}n)|I}bn@*F>OJ7Kj zOEL%c2lqi1ysdXYj2l^=v-TUO0J^QKp$mI6{Y-tTZ_+jflne-?tB4O6N5n^=%h$lw znDQ4dg1JzP8qpcgOGul)4-s5W{v`C3tb&j z!fi&r7r9+lRnQf9+$Mszo^^i26N7u4cqV-0hI`>D;J8DK65r$mtm1A?xxTSInVteJWum5{6I*=4zv%18X8;>8gL|Mq!(i8G#!H(o=DUeO zpiRB2!r-1!@m%;cVG5~{7_#-;wO6gX11!vaGTI$4+fXs;er_&g<Hqlo<}&6tAM57B#SJH(?g9C;#!voYE}@I{q70=KFV4BmFY-SiSAI*OeF z+y|~B;{6U2n=u?4%v`h0wV5@%XUsZ-@e9>16gt@58tL*T^924njdz3*G<{tE%yp|O z@?*p{NVH`m|0(<<IDIhhj4bz*yLFqUJuuoE+8?Y8_fl0Gp(}Ys1z-~M^5kMp z^dvf5L5@hiNAkkIO;I(=L(EQW#vQ5SzmPq@K0O8aAA#5G5#tOCFNNg4+MNQtkH8!D zgx`9kp;N$~L7?tOpQWNxK%77m{122Zg9pm(C`viYdQea`TY+i$YLzNk6Gy2{S3D@v zB*%gza{G=r9t2o5p8{Hqnb70G3zoU!^$OC96u(}6#FdPRSLK`frvPza>4KyAMA<3e zXXH7s6XN3=YvrDsG!wcHeJBPD}8_N?oZTY9hgl+IJyaO`^R(VBl1CECFFXq zR}*qDX$PsDKbAM)>Uk8eQ3pgdB+T||^$c*xMc+GeKph-|4$ltN^<#E#>sQ(+zOFU@ zsL-xC$;Q%}$^W+J;NqiW*3A6b5ouEN9~aDgsb=EPF&q4L&#_%a1Ikb5H0ls>! zkL|jiN(;eqFeWA3^Ih1mb_cq9Lb|7*Ny!Ysl3`VaSPJ-oU@OH^)FitH)+v}6!svw- zMMgd;Lk%^?>mpf7=<0wnkwrDM(Mz0#o|tIy3jRAEZcsa2Ub~_>qss;7X}b!KDa4 zpQE)|{NCGk+?9HrDN$rpMRwL^&I!sW1jkQj^hiTWYoHe%w)Td!?zE)OOqniZ%=w@y zZ|2YIc~V119@#uW9`-R(h7l|zgXNr~ItPzxQt6QOjf;Vb?wA;KYRjuJ((Urh?Pc^* zU@Gg!y$G-PtLvaXEqp3Q!)VYeT+nvfuB0yL=@KhQPuu9pg6$vOaY$<4n|_TQ1L@`Of9M{-l0p2L<3eVJK*51aW5 zgzwZDMv%&ePiXr!1lIr=@&@0YFz{!=?pF)ltixs(m9?AQT{S+MapVb~&FQ8y4Tn`fKKVMgtELzziP)4_*zBt9W47P(#xUvdpv4+76uA1XN zp6w{+anY?uNE`|h{UPOt+#i|)omkP=Vl5%43=(T1Wz7Gb8rd>g1OqY)|i<2{?1WNe7Jc^&GM_0aB*B!@Ep

90dMHj*2TYP?6y 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] + \graph [layered layout, components go right top aligned, layer sep=1em] + { + AppliedTasks/{Прикладные задачи} [blue, draw=blue, dashed, rounded corners] // [layered layout] {"Аэродинамика", "Динамика полёта", "Прочность", "Проектирование"}; + + AppliedSoftware/{Прикладное программное обеспечение} [blue, draw=blue, dashed, rounded corners] // [layered layout, edge=white] { + OpenFoam, SU2, Gmsh, FreeCAD, ParaView + }; + + OS/{Операционные системы} [blue, draw=blue, dashed, rounded corners, edge=black] // [tree layout] { + Unix -> { + Linux -> Android, FreeBSD -> {MacOS, iOS}, Solaris; + }, + Windows + }; + + ComputerArchitecture/{Архитектура компьютера} [blue, draw=blue, dashed, rounded corners] // [layered layout, edge=<-] { + "Архитектура и язык ассемблера" + -> "Микроархитектура" + -> "<<железо>>" + }; + + ComputerLanguages/{Языки программирования} [blue, draw=blue, dashed, rounded corners] // [layered layout, components go right top aligned, edge={<-, white}] { + {Python, Java, PHP, HTML, Perl} + -> {C++, Rust, ObjectiveC[as={Objective C}], Fortran} + -> {C, Forth, Pascal} + }; + + Algorithms/{Алгоритмы и структуры данных} [blue, draw=blue, dashed, rounded corners] // [layered layout, edge=white] { + {"Двоичный поиск", "Деревья"} + -> {"Сортировка", "Хэш-таблицы"} + -> {"Волновой алгоритм", "Графы"} + }; + + AppliedTasks ->[white] AppliedSoftware ->[white] {OS, ComputerLanguages} ->[white] {ComputerArchitecture, Algorithms}; + }; + \end{tikzpicture}\end{flushleft} + + \item Контрольно-проверочные мероприятия. +\end{itemfeature} + + + +%%=========================== +\section{Основная литература} +%%=========================== +\cite{Stroustrup:2016:ru} + +\nocite{Kernighan:2004:ru, Meyers:2006:ru, Meyers:2000:ru, Meyers:2002:ru, Meyers:2016:ru, Josuttis:2014:ru, Stroustrup:2006:ru, Stroustrup:2013:en} + + + + +%%=========================== +\section{Материалы и задания} +%%=========================== +Значительная часть обучающих упражнений и заданий содержится в книге Бьярне Страуструпа. Дополнительные материалы размещены на \href{\yadiskurl}{яндекс-диске\footnote{\nolinkurl{\yadiskurl}}}: +\begin{itemfeature} + \item \codebf{books} "--- основная и дополнительная литература; + \item \codebf{cpp-lectures} "--- лекционные материалы; + \item \codebf{cpp-seminars} "--- семинарские материалы; + \begin{itemize} + \item \codebf{/examples} "--- исходный код примеров, которые разбираются на занятиях; + \item \codebf{/exercises} "--- упражнения с исправлением исходного кода; + \item \codebf{/how-to-s} "--- графические инструкции по настройке ПО; + \item \codebf{/libraries} "--- библиотеки, которые используются на занятиях; + \item \codebf{/program.pdf} "--- программа курса, темы зачёта; + \item \codebf{/progress.pdf} "--- планы, успеваемость и проверочные мероприятия; + \item \codebf{/seminars.pdf} "--- вспомогательная методичка по материалам занятий. + \end{itemize} +\end{itemfeature} + + + +%%=============================== +\section{Программное обеспечение} +%%=============================== +Интегрированная среда разработки: +\begin{itemfeature} + \item текстовый редактор, + \item компилятор языка \lang{C++} (с поддержкой стандарта \lang{C++14} или выше), + \item редактор связей, + \item средства сборки, + \item средства отладки. +\end{itemfeature} + +Инструкции по установке и настройке рабочей среды размещены в приложении на странице~\pageref{sect:workEnv}. diff --git a/latexmkrc b/latexmkrc new file mode 100644 index 0000000..b0fb578 --- /dev/null +++ b/latexmkrc @@ -0,0 +1,379 @@ +#!/usr/bin/env perl + +$LATEXFLAGS = $ENV{LATEXFLAGS}; +$LATEXFLAGS //= ''; +$BIBERFLAGS = $ENV{BIBERFLAGS}; +$BIBERFLAGS //= ''; +$TIMERON = $ENV{TIMERON}; +$TIMERON //= '0'; +$REGEXDIRS = $ENV{REGEXDIRS}; +$REGEXDIRS //= '. cpp asm'; + + +$biber = 'biber ' . $BIBERFLAGS . ' %O %S'; + +# set to 1 to count CPU time +$show_time = $TIMERON; + +# record access files +$recorder = 1; + +# delete bibtex generated files +$bibtex_use = 2; + +# extensions to clean with -c flag +$clean_ext = '%R.bbl %R.aux %R.lof %R.log %R.lot %R.fls %R.out %R.toc %R.run.xml %R.xdv %R.snm %R.nav %R.fmt'; + +# extensions to clean with -C flag +$clean_full_ext = '%R.bbl %R.aux %R.lof %R.log %R.lot %R.fls %R.out %R.toc %R.run.xml %R.xdv %R.snm %R.nav'; + + +$clean_ext .= " pythontex-files-%R/* pythontex-files-%R"; +push @generated_exts, 'pytxcode'; + +sub mypython { + return "py -3" if ( $^O =~ /MSWin32/ ); + return "python3"; +} + +$pythontex = 'pythontex --interpreter python:"'.mypython().'" %O %S'; +$extra_rule_spec{'pythontex'} = [ 'internal', '', 'mypythontex', "%Y%R.pytxcode", "%Ypythontex-files-%R/%R.pytxmcr", "%R", 1 ]; + +sub mypythontex { + my $result_dir = $aux_dir1."pythontex-files-$$Pbase"; + my $ret = Run_subst( $pythontex, 2 ); + rdb_add_generated( glob "$result_dir/*" ); + my $fh = new FileHandle $$Pdest, "r"; + if ($fh) { + while (<$fh>) { + if ( /^%PythonTeX dependency:\s+'([^']+)';/ ) { + print "Found pythontex dependency '$1'\n"; + rdb_ensure_file( $rule, $aux_dir1.$1 ); + } + } + undef $fh; + } + else { + warn "mypythontex: I could not read '$$Pdest'\n", + " to check dependencies\n"; + } + return $ret; +} + + +# this option is for debugging +# 0 to silently delete files, 1 to show what would be deleted +$remove_dryrun = 0; + +## Core latex/pdflatex auxiliary files: +@clean_regexp = ('*.aux', + '*.lof', + '*.log', + '*.lot', + '*.fls', + '*.out', + '*.toc', + '*.fmt'); +## Intermediate documents: +# these rules might exclude image files for figures etc. +# *.ps +# *.eps +# *.pdf +push(@clean_regexp, + '*.dvi', + '*-converted-to.*', + '*xdv' + ); + +## Bibliography auxiliary files (bibtex/biblatex/biber): +push(@clean_regexp, + '*.bbl', + '*.bcf', + '*.blg', + '*-blx.aux', + '*-blx.bib', + '*.brf', + '*.run.xml' + ); + +## Build tool auxiliary files: +push(@clean_regexp, + '*.fdb_latexmk', + '*.synctex', + '*.synctex.gz', + '*.synctex.gz\(busy\)', + '*.pdfsync', + ); + + +## Auxiliary and intermediate files from other packages: + +# algorithms +push(@clean_regexp, + '*.alg', + '*.loa', + ); + +# achemso +push(@clean_regexp, + 'acs-*.bib', + ); + +# amsthm +push(@clean_regexp, + '*.thm', + ); + +# beamer +push(@clean_regexp, + '*.nav', + '*.snm', + '*.vrb', + ); + +#(e)ledmac/(e)ledpar +push(@clean_regexp, + '*.end', + '*.[1-9]', + '*.[1-9][0-9]', + '*.[1-9][0-9][0-9]', + '*.[1-9]R', + '*.[1-9][0-9]R', + '*.[1-9][0-9][0-9]R', + '*.eledsec[1-9]', + '*.eledsec[1-9]R', + '*.eledsec[1-9][0-9]', + '*.eledsec[1-9][0-9]R', + '*.eledsec[1-9][0-9][0-9]', + '*.eledsec[1-9][0-9][0-9]R', + ); + +# glossaries +push(@clean_regexp, + '*.acn', + '*.acr', + '*.glg', + '*.glo', + '*.gls', + ); + +# gnuplottex +push(@clean_regexp, + '*-gnuplottex-*', + ); + +# hyperref +push(@clean_regexp, + '*.brf', + ); + +# knitr +push(@clean_regexp, + '*-concordance.tex', + '*-tikzDictionary', + ); +# '*.tikz', + +# listings +push(@clean_regexp, + '*.lol', + ); + +# makeidx +push(@clean_regexp, + '*.idx', + '*.ilg', + '*.ind', + '*.ist', + ); + +# minitoc +push(@clean_regexp, + '*.maf', + '*.mtc', + '*.mtc[0-9]', + '*.mtc[1-9][0-9]', + ); + +# minted +push(@clean_regexp, + '_minted*/*', + '_minted*/', + '*.pyg', + ); + +# morewrites +push(@clean_regexp, + '*.mw', + ); + +# mylatexformat +push(@clean_regexp, + '*.fmt', + ); + +# nomencl +push(@clean_regexp, + '*.nlo', + ); + +# sagetex +push(@clean_regexp, + '*.sagetex.sage', + '*.sagetex.py', + '*.sagetex.scmd', + ); + +# sympy +push(@clean_regexp, + '*.sout', + '*.sympy', + ); +# sympy-plots-for-*.tex/ + +# pdfcomment +push(@clean_regexp, + '*.upa', + '*.upb', + ); + +# pythontex +push(@clean_regexp, + 'pythontex-files-*/*', + 'pythontex-files-*/', + '*.pytxcode', + ); + +# Texpad +push(@clean_regexp, + '.texpadtmp', + ); + +# TikZ & PGF +push(@clean_regexp, + '*.dpth', + '*.md5', + '*.auxlock', + ); + +# todonotes +push(@clean_regexp, + '*.tdo', + ); + +# xindy +push(@clean_regexp, + '*.xdy', + ); + +# WinEdt +push(@clean_regexp, + '*.bak', + '*.sav', + ); + +# GnuEmacs +push(@clean_regexp, + '*~', + ); + +# endfloat +push(@clean_regexp, + '*.ttt', + '*.fff', + '*.aux', + '*.bbl', + '*.blg', + '*.dvi', + '*.fdb_latexmk', + '*.fls', + '*.glg', + '*.glo', + '*.gls', + '*.idx', + '*.ilg', + '*.ind', + '*.ist', + '*.lof', + '*.log', + '*.lot', + '*.nav', + '*.nlo', + '*.out', + '*.pdfsync', + '*.ps', + '*.snm', + '*.synctex.gz', + '*.toc', + '*.vrb', + '*.maf', + '*.mtc', + '*.mtc0', + '*.bak', + '*.bcf', + '*.run.xml', + ); + +# latexindent backup +push(@clean_regexp, + '*.bak[0-9]', + ); + +# compressed pdf file +push(@clean_regexp, + '*_compressed.pdf', + ); + +# biber tool +push(@clean_regexp, + 'bibcheck.log', + '*_bibertool.bib', + ); + +######################################################## +# functions + +sub regexp_cleanup { + my @clean_regexp_dirs = split /(?<=\s)/, $REGEXDIRS; + foreach my $dir (@clean_regexp_dirs) { + $dir =~ s/^\s*(.*?)\s*$/$1/; + foreach my $pattern (@clean_regexp) + { + my @files = glob "$dir/$pattern"; + foreach my $file (@files) { + if ($remove_dryrun == 0) { + unlink_or_move( glob( "$file" ) ); + } else { + print "Would be removed: $file\n"; + } + } + } + } +} + + +{ no warnings 'redefine'; + +sub cleanup1 { + # Usage: cleanup1( directory, exts_without_period, ... ) + # + # The directory and the root file name are fixed names, so I must escape + # any glob metacharacters in them: + my $dir = fix_pattern( shift ); + my $root_fixed = fix_pattern( $root_filename ); + foreach (@_) { + my $name = /%R/ ? $_ : "%R.$_"; + $name =~ s/%R/${root_fixed}/; + $name = $dir.$name; + if ($remove_dryrun == 0) { + unlink_or_move( glob( "$name" ) ); + } else { + print "Would be removed: $name\n"; + } + } + if ($cleanup_mode == 1) { + regexp_cleanup(); + } +} #END cleanup1 + +} # no warnings 'redefine'; diff --git a/references.bib b/references.bib new file mode 100644 index 0000000..b77e475 --- /dev/null +++ b/references.bib @@ -0,0 +1,437 @@ +% !TEX encoding = UTF8 +% !TEX spellcheck = ru_RU +% !TEX spellcheck = en_US + +@book{Bryant:2005:ru, + author = {Брайант, Рэндал Э. and О'Халларон, Дэвид Р.}, + title = {{Компьютерные системы: архитектура и программирование}}, + language = {russian}, + origlanguage = {english}, + translator = {Ежов{а}, Дмитри{я} and Шестаков{a}, Станислав{а}}, + location = {СПб.}, + publisher = {БХВ-Петербург}, + year = {2005}, + pagetotal = {1104}, + isbn = {5-94157-433-9}, + langid = {russian} +} + + +@book{Bryant:2011:en, + author = {Bryant, Randal E. and O'Hallaron, David R.}, + title = {{Computer systems: a programmer's perspective}}, + language = {english}, + edition = {2}, + publisher = {Prentice Hall}, + year = {2011}, + pagetotal = {1043}, + isbn = {978-0-13-610804-7}, + langid = {english} +} + + +@book{Bryant:2016:en, + author = {Bryant, Randal E. and O'Hallaron, David R.}, + title = {{Computer systems: a programmer's perspective}}, + language = {english}, + edition = {3}, + publisher = {Pearson}, + year = {2016}, + pagetotal = {1122}, + isbn = {978-1-292-10176-7}, + langid = {english} +} + + +@manual{Chacon:2021:ru, + author = {Chacon, Scott and Straub, Ben}, + title = {Pro Git}, + version = {2.1.89-1}, + language = {russian}, + origlanguage = {english}, + publisher = {Apress}, + year = {2021}, + pagetotal = {548} +} + + +@book{Cormen:2013:ru, + author = {Кормен, Томас Х. and Лейзерсон, Чарльз and Ривест, Рональд and Штайн, Клиффорд}, + title = {{Алгоритмы: построение и анализ}}, + language = {russian}, + origlanguage = {english}, + translator = {Красиков{а}, И.В.}, + edition = {3-e изд.}, + location = {М.}, + publisher = {ООО <<И.Д. Вильямс>>}, + year = {2013}, + pagetotal = {1328}, + isbn = {978-5-8459-1794-2}, + langid = {russian} +} + + +@book{Gamma:2004:ru, + author = {Гамма, Э. and Хелм Р. and Джонсон Р. and Влиссидес, Дж.}, + title = {{Приёмы объектно-ориентированного проектирования. Паттерны проектирования.}}, + language = {russian}, + origlanguage = {english}, + location = {Спб.}, + publisher = {Питер}, + year = {2004}, + pagetotal = {366}, + langid = {russian} +} + + +@book{Josuttis:2014:ru, + author = {Джосаттис, Николай М.}, + title = {Стандартная библиотека C++: справочное руководство}, + edition = {2}, + language = {russian}, + origlanguage = {english}, + location = {М.}, + publisher = {ООО <<И.Д. Вильямс>>}, + year = {2014}, + pagetotal = {1136}, + isbn = {978-5-8459-1837-6}, + langid = {russian} +} + + +@book{Kernighan:1992:ru, + author = {Керниган, Брайан У. and Пайк, Роб}, + title = {{UNIX~--- универсальная среда программирования}}, + language = {russian}, + origlanguage = {english}, + translator = {Берёзко, А.М. and Иващенко, В.А.}, + location = {М.}, + publisher = {Финансы и статистика}, + year = {1992}, + pagetotal = {304}, + isbn = {5-279-00253-4}, + langid = {russian} +} + + +@book{Kernighan:2004:ru, + author = {Керниган, Брайан У. and Пайк, Роб}, + title = {{Практика программирования}}, + series = {Программирование для профессионалов}, + language = {russian}, + origlanguage = {english}, + translator = {Бродов{ого}, В.Л.}, + location = {М.}, + publisher = {Издательский дом <<Вильямс>>}, + year = {2004}, + pagetotal = {288}, + isbn = {5-8459-0679-2}, + langid = {russian} +} + + +@book{Koenig:2002:ru, + author = {Кёниг, Эндрю and Му, Барбара Э.}, + title = {{Эффективное программирование на C++}}, + language = {russian}, + origlanguage = {english}, + translator = {Ручко, Н.М.}, + location = {М.}, + publisher = {Издательский дом <<Вильямс>>}, + series = {Серия C++ In-Depth}, + year = {2002}, + pagetotal = {384}, + isbn = {5-8459-0350-5}, + langid = {russian} +} + + +@book{Meyers:2000:ru, + author = {Мейерс, Скотт}, + title = {Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов}, + series = {Для программистов}, + language = {russian}, + origlanguage = {english}, + location = {М.}, + publisher = {ДМК Пресс}, + year = {2000}, + pagetotal = {304}, + isbn = {5-94074-033-2}, + langid = {russian} +} + + +@book{Meyers:2002:ru, + author = {Мейерс, Скотт}, + title = {Эффективное использование STL}, + series = {Библиотека программиста}, + language = {russian}, + origlanguage = {english}, + location = {СПб.}, + publisher = {Питер}, + year = {2002}, + pagetotal = {224}, + isbn = {5-94723-382-7}, + langid = {russian} +} + + +@book{Meyers:2006:ru, + author = {Мэйерс, Скотт}, + title = {Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ}, + series = {Профессиональная серия от Addison--Wesley}, + edition = {3}, + language = {russian}, + origlanguage = {english}, + location = {М.}, + publisher = {ДМК Пресс}, + year = {2006}, + pagetotal = {300}, + isbn = {5-94074-304-8}, + langid = {russian} +} + + +@book{Meyers:2015:en, + author = {Meyers, Scott}, + title = {Effective Modern C++. 42 specific ways to improve your use of C++11 and C++14}, + language = {english}, + publisher = {O'Reilly}, + year = {2014}, + pagetotal = {316}, + isbn = {978-1-491-90399-5}, + langid = {english} +} + + +@book{Meyers:2016:ru, + author = {Мейерс, Скотт}, + title = {Эффективный и современный С++: 42 рекомендации по исполыованию C++11 и С++14}, + language = {russian}, + origlanguage = {english}, + publisher = {ООО <<И.Д. Вильямс>>}, + year = {2016}, + pagetotal = {304}, + isbn = {978-5-8459-2000-3}, + langid = {russian} +} + + +@book{Sutter:2008:ru, + author = {Саттер, Герб}, + title = {{Решение сложных задач на C++}}, + language = {russian}, + origlanguage = {english}, + translator = {Красиков{а}, И.В.}, + location = {М.}, + publisher = {Издательский дом <<Вильямс>>}, + series = {Серия C++ In-Depth}, + year = {2008}, + pagetotal = {400}, + isbn = {978-5-8459-0352-5}, + langid = {russian} +} + + +@book{Pacheco:2011:en, + author = {Pacheco, Peter S.}, + title = {{An introduction to parallel programming}}, + language = {english}, + publisher = {Morgan Kaufmann Publishers}, + year = {2011}, + pagetotal = {370}, + isbn = {978-0-12-374260-5}, + langid = {english} +} + + +@book{Rossum:2001:ru, + author = {Россум, Г. and Дрейк, Ф. Л. Дж. and Откидач, Д. С.}, + title = {{Язык программирования Python}}, + language = {russian}, + origlanguage = {english}, + location = {СПб.}, + publisher = {Невский Диалект}, + year = {2001}, + pagetotal = {454}, + langid = {russian} +} + + +@book{Stroustrup:2006:ru, + author = {Страуструп, Бьярне}, + title = {Дизайн и эволюция C++}, + language = {russian}, + origlanguage = {english}, + translator = {Красиков{a}, И.В.}, + edition = {2-e изд.}, + location = {М.}, + publisher = {ДМК Пресс}, + year = {2006}, + pagetotal = {448}, + isbn = {5-469-01217-4}, + langid = {russian} +} + + +@book{Stroustrup:2016:ru, + author = {Страуструп, Бьярне}, + title = {{Программирование: принципы и практика c использованием C++}}, + language = {russian}, + origlanguage = {english}, + translator = {Красиков{a}, И.В.}, + edition = {2-e изд.}, + location = {М.}, + publisher = {ООО <<И.Д. Вильямс>>}, + year = {2016}, + pagetotal = {1328}, + isbn = {978-5-8459-1949-6}, + langid = {russian} +} + + +@book{Stroustrup:2014:en, + author = {Stroustrup, Bjarne}, + title = {{Programming: principles and practice using C++}}, + language = {english}, + edition = {2}, + publisher = {Addison-Wesley}, + year = {2014}, + pagetotal = {1312}, + isbn = {978-0-321-99278-9}, + langid = {english} +} + + +@book{Stroustrup:2013:en, + author = {Stroustrup, Bjarne}, + title = {{The C++ programming language}}, + language = {english}, + edition = {4}, + publisher = {Addison-Wesley}, + year = {2013}, + pagetotal = {1366}, + isbn = {978-0-321-56384-2}, + langid = {english} +} + + +@book{Stroustrup:2019:ru, + author = {Страуструп, Бьярне}, + title = {{Язык программирования С++. Краткий курс}}, + language = {russian}, + origlanguage = {english}, + edition = {2-e изд.}, + location = {СПб.}, + publisher = {ООО <<Диалектика>>}, + year = {2019}, + pagetotal = {320}, + isbn = {978-5-907144-12-5}, + langid = {russian} +} + + +@book{Tanenbaum:2007:ru, + author = {Таненбаум, Эндрю}, + title = {{Архитектура компьютера}}, + language = {russian}, + origlanguage = {english}, + edition = {5}, + location = {СПб.}, + publisher = {Питер}, + year = {2007}, + pagetotal = {844}, + isbn = {5-469-01274-3}, + langid = {russian} +} + + +@book{Tanenbaum:2013:ru, + author = {Таненбаум, Эндрю and Остин, Тодд}, + title = {{Архитектура компьютера}}, + language = {russian}, + origlanguage = {english}, + edition = {6}, + location = {СПб.}, + publisher = {Питер}, + year = {2013}, + pagetotal = {816}, + isbn = {978-5-496-00337-7}, + langid = {russian} +} + + + + +@book{Vorozhcov:2008:ru, + author = {Винокуров, Н. А. and Ворожцов, Артём В.}, + title = {{Практика и теория программирования}}, + series = {Информатика}, + volumes = {2}, + language = {russian}, + location = {М.}, + publisher = {Физматкнига}, + year = {2008}, + langid = {russian} +} + + +@book{Zubkov:2000:ru, + author = {Зубков, Сергей Владимирович}, + title = {{Assembler для DOS, Windows и UNIX}}, + series = {Для программистов}, + language = {russian}, + location = {М.}, + publisher = {ДМК Пресс}, + year = {2000}, + pagetotal = {608}, + isbn = {5-94074-003-0}, + langid = {russian} +} + + +@online{WikiBookAsm:ru, + title = {{Ассемблер в Linux для программистов C}}, + language = {russian}, + url = {https://ru.wikibooks.org/wiki/Ассемблер_в_Linux_для_программистов_C}, + langid = {russian} +} + + + +@online{Eratosthen:wiki, + title = {Алгоритм <<решето Эратосфена>>}, + language = {russian}, + url = {https://ru.wikipedia.org/wiki/Решето_Эратосфена}, + langid = {russian} +} + + + +@online{Eigen:lib, + title = {{Eigen is a C++ template library for linear algebra: matrices, vectors, numerical solvers, and related algorithms}}, + language = {english}, + url = {http://eigen.tuxfamily.org}, + langid = {english} +} + +@online{JSON, + title = {{JSON (JavaScript Object Notation) is a lightweight data-interchange format}}, + language = {english}, + url = {http://www.json.org}, + langid = {english} +} + +@online{JSON:lib, + title = {{JSON for Modern C++}}, + language = {english}, + url = {https://nlohmann.github.io/json}, + langid = {english} +} + +@online{SymPy, + title = {{SymPy is a Python library for symbolic mathematics}}, + language = {english}, + url = {http://www.sympy.org}, + langid = {english} +} diff --git a/seminars.tex b/seminars.tex new file mode 100644 index 0000000..acff16d --- /dev/null +++ b/seminars.tex @@ -0,0 +1,78 @@ +% !TEX encoding = UTF8 +% !TEX spellcheck = ru_RU + +\documentclass[a4paper,12pt,oneside,openany,final]{memoir} + +\input{common/packages} +\input{common/biblatex} + +\input{common/setup} +\input{setup} + +\renewcommand*\paperSubject{\href{\latexurl}{\TeX}нические материалы семинаров} + +\input{common/styles} +\input{styles} + + +\addbibresource{references.bib} + + + + +\begin{document} + +%%========================== +\begin{pycode} +from sympy import * +\end{pycode} +%%========================== + + +\input{common/title} + +\frontmatter +%%========== +\input{common/contents} + +\include{intro} + + +\mainmatter +%%========= +\include{01/hello_world} +%\include{02/ide} +%\include{03/objects_types_and_values} +%\include{04/computation} +%\include{05/errors} +%\include{06/calculator_part_1} +%\include{07/calculator_part_2} +%\include{08/functions} +%\include{09/classes} +%\include{10/io_streams} +%\include{11/customizing_io} +%\include{12/display_model} +%\include{13/graphics_classes} +%\include{14/graphics_class_design} +%\include{15/graphing_functions_and_data} +%\include{16/graphical_user_interfaces} +%\include{17/vector_and_free_store} +%\include{18/vectors_and_arrays} +%\include{19/vector_templates_and_exceptions} +%\include{20/containers_and_iterators} +%\include{21/algorithms_and_maps} +%\include{26/testing} + + +\backmatter +%%========= +\include{afterword} + +\input{common/references} + + +\appendix +%======== +\include{appendix} + +\end{document} diff --git a/setup.tex b/setup.tex new file mode 100644 index 0000000..da2d6cd --- /dev/null +++ b/setup.tex @@ -0,0 +1,16 @@ +% !TEX encoding = UTF8 +% !TEX spellcheck = en_US + + +%%% Redefine names %%% + +\renewcommand*\paperOrganization{Московский физико-технический институт \\ + (государственный университет)} +\renewcommand*\paperOrganizationShort{МФТИ} +\renewcommand*\paperDepartment{Факультет аэромеханики и летательной техники} +\renewcommand*\paperDepartmentShort{ФАЛТ} +\renewcommand*\paperTitle{Программирование на языке \lang{C++}} +\renewcommand*\paperAuthor{\textcopyright Преподаватели} +\renewcommand*\paperKeywords{МФТИ, ФАЛТ, информатика, программирование, язык С++} +\renewcommand*\paperDate{\textit{2022--2023 уч.\,гг.}} +\renewcommand*\paperYear{2022--2023\,гг.} diff --git a/styles.tex b/styles.tex new file mode 100644 index 0000000..2858e58 --- /dev/null +++ b/styles.tex @@ -0,0 +1,160 @@ +% !TEX encoding = UTF8 +% !TEX spellcheck = en_US + +%%% Figures %%% + +\graphicspath{{images/}{../}{../../}} % Пути к изображениям + + + +%%% Page layout %%% + +\geometry{a4paper,top=2cm,bottom=2cm,left=2.5cm,right=1cm} %,showframe,nofoot,nomarginpar +\setlength{\topskip}{0pt} +%\setlength{\footskip}{12.3pt} % to prevent warning + + + +%%% Line spacing %%% + +%\DoubleSpacing* +%\OnehalfSpacing* +%\setSpacing{1.42} % like MS Word, may be include with previous line + + + +%%% Align and hyphenation %%% + +\tolerance 1414 +\hbadness 1414 +\emergencystretch 1.5em % in case of problems the first parameter for tuning +\hfuzz 0.3pt +\vfuzz \hfuzz +%\raggedbottom +%\sloppy +\clubpenalty=10000 +\widowpenalty=10000 + +\begin{russian} + \hyphenation{не-пе-ре-се-каю-щих-ся} +\end{russian} + + +\setlength{\epigraphwidth}{0.3\textwidth} +\renewcommand{\epigraphsize}{\normalsize} +\epigraphrule = 0pt + +\newfontfamily\epigraphfont[Scale=MatchLowercase]{TeX Gyre Chorus} + + + +%%% Outline %%% + +\renewcommand{\cftchapterdotsep}{\cftdotsep} + +%\setrmarg{2.55em plus1fil} +\renewcommand{\cftchapterpagefont}{\normalfont} +\renewcommand{\cftchapterleader}{\cftdotfill{\cftchapterdotsep}} +%\renewcommand{\cftchapterfont}{} + +\renewcommand\cftchapteraftersnum{.\space} +\renewcommand\cftsectionaftersnum{.\space} +\renewcommand\cftsubsectionaftersnum{.\space} +\renewcommand\cftsubsubsectionaftersnum{.\space} +\AtBeginDocument{% % without this polyglossia make it + \setsecnumformat{\csname the#1\endcsname.\space} +} + +\renewcommand*{\cftappendixname}{\appendixname\space} + + + +%%% Headlines %%% + +\newcommand*{\headlinefont}{\normalfont\itshape\footnotesize\rmfamily} + +\newcommand*{\footer}[1]{% + \begin{tikzpicture}[baseline=\baselineskip,font=\headlinefont] + \node[text=gray] {#1}; + \end{tikzpicture}% +} + +\newcommand*{\footerleft}{\hspace{-1.5cm}\footer{\paperDepartmentShort{}, \paperOrganizationShort --- \paperTitle}} + +\newcommand*{\footerright}{\footer{\paperAuthor, \paperYear}} + +\makeoddhead{ruled}{\headlinefont \leftmark}{}{\headlinefont \rightmark} +\makeoddfoot{ruled}{\footerleft}{\thepage}{\footerright} +\makeoddfoot{plain}{\footerleft}{\thepage}{\footerright} +\pagestyle{ruled} + + + +%%% Headings %%% + +\chapterstyle{hangnum} + +\settocdepth{subsection} + + +\newcommand*\AbstractSection[1]{% + \section*{#1} + \addcontentsline{toc}{section}{\numberline\ #1} +} + +\newcommand*\WhatToReadSection{\AbstractSection{Что читать}} +\newcommand*\ExercisesSection{\AbstractSection{Упражнения}} +\newcommand*\TaskSection{\AbstractSection{Задание}} + + + +%%% Counters %%% + +\counterwithout{equation}{chapter} +\counterwithout{figure}{chapter} +\counterwithout{table}{chapter} + + + +%%% Proper appendix numbering %%% + +\makeatletter +\def\russian@Alph#1{\ifcase#1\or + А\or Б\or В\or Г\or Д\or Е\or Ж\or + И\or К\or Л\or М\or Н\or + П\or Р\or С\or Т\or У\or Ф\or Х\or + Ц\or Ш\or Щ\or Э\or Ю\or Я\else\xpg@ill@value{#1}{russian@Alph}\fi} +\def\russian@alph#1{\ifcase#1\or + а\or б\or в\or г\or д\or е\or ж\or + и\or к\or л\or м\or н\or + п\or р\or с\or т\or у\or ф\or х\or + ц\or ш\or щ\or э\or ю\or я\else\xpg@ill@value{#1}{russian@alph}\fi} +\makeatother + + + +%%% Misc %%% + +\newcommand*{\latexurl}{https://www.latex-project.org} +\newcommand*{\yadiskurl}{https://yadi.sk/d/XiUj9ZsNf3xHJ} +\newcommand*{\mingwurl}{https://github.com/niXman/mingw-builds-binaries/releases/download/12.2.0-rt_v10-rev0/x86_64-12.2.0-release-posix-seh-rt_v10-rev0.7z} +\newcommand*{\qtcreatorurl}{https://download.qt.io/official_releases/qtcreator/8.0/8.0.1/qt-creator-opensource-windows-x86_64-8.0.1.exe} +\newcommand*{\giturl}{https://git-scm.com/download/win} +\newcommand*{\smartgiturl}{https://www.syntevo.com/smartgit/download} +\newcommand*{\typingtutorurl}{https://sense-lang.org/typing/tutor/keyboarding.php} +\newcommand*{\pythonurl}{https://www.python.org} +\newcommand*{\matplotliburl}{https://matplotlib.org} + +\newcommand*{\yadisk}[1]{\name{\href{\yadiskurl}{яндекс-диск}/#1}} +\newcommand*{\GraphViz}{\href{http://www.graphviz.org}{\name{GraphViz}}} + +\newcommand*{\GCC}{\textsf{\scshape gcc}} +\newcommand*{\GDB}{\textsf{\scshape gdb}} +\newcommand*{\git}{\texttt{\small Git}} + +\newcommand*{\hard}{\makebox[0pt]{\hspace{-1.5\labelsep}\ensuremath{\mathsurround=0pt ^{\star}}}} +\newcommand*{\HardChapter}[1]{\chapter{\(^★\)#1}} +\newcommand*{\HardSection}[1]{\section{\(^★\)#1}} +\newcommand*{\HardSubsection}[1]{\subsection{\(^*\)#1}} + +\newcommand*{\textbookref}[1]{\textit{#1}}