|
| 1 | +% !TEX encoding = UTF8 |
| 2 | +% !TEX spellcheck = ru_RU |
| 3 | +% !TEX root = ../../seminars.tex |
| 4 | + |
| 5 | +%%===================== |
| 6 | +\chapter{Hello, World!}\label{chap:helloworld} |
| 7 | +%%===================== |
| 8 | + |
| 9 | +%%================================================== |
| 10 | +\section{Архитектура Фон-Неймана, уровни абстракции} |
| 11 | +%%================================================== |
| 12 | +Схематическое устройство компьютера. Алгоритмы и языки программирования. Абстракция от реального <<железа>>. |
| 13 | + |
| 14 | + |
| 15 | + |
| 16 | +%%================= |
| 17 | +\section{Программы} |
| 18 | +%%================= |
| 19 | +\lang{С++}\footcite{Stroustrup:2019:ru} является компилируемым языком. Для работы программы её исходный текст должен быть обработан с помощью компилятора, который создаёт объектные файлы, объединяемые компоновщиком в выполнимую программу. Обычно программы на языке \lang{С++} состоят из многих файлов с исходными текстами (именуемыми просто \textit{исходными файлами}). |
| 20 | + |
| 21 | +\begin{center}\begin{tikzpicture}[node font=\small, >=Stealth, line width=1pt] |
| 22 | + \graph [grow right sep, left anchor=east, right anchor=west, nodes=draw] { |
| 23 | + "файл1.cpp" -> c1/{компиляция} [ellipse] -> "файл1.o" ->[right anchor=north west] "компоновка" [ellipse, yshift=-2.5ex] -> "выполнимый файл"[yshift=-2.5ex]; |
| 24 | + "файл2.cpp" -> c2/{компиляция} [ellipse] -> "файл2.o" ->[right anchor=south west] "компоновка"; |
| 25 | + }; |
| 26 | +\end{tikzpicture}\end{center} |
| 27 | + |
| 28 | +Выполнимая программа создаётся для определённой комбинации аппаратного обеспечения и операционной системы; её нельзя просто перенести, скажем, из компьютера \name{Мac} в компьютер с \name{Windows}. Говоря о переносимости программ \lang{С++}, мы обычно имеем в виду переносимость исходного кода, т.\,е. исходный код может быть успешно скомпилирован и выполняться в разных |
| 29 | +системах. |
| 30 | + |
| 31 | +Стандарт \name{ISO} \lang{С++} определяет два типа сущностей. |
| 32 | +\begin{itemize} |
| 33 | +\item \textit{Фундаментальные возможности языка}, такие как встроенные типы (например, \code{char} и \code{int}) или циклы (например, инструкции \code{for} и \code{while}). |
| 34 | + |
| 35 | +\item \textit{Компоненты стандартных библиотек}, такие как контейнеры (например, \code{vector}, и \code{map}) или операции ввода--вывода (например, \code{<<} и \code{getline()}). |
| 36 | +\end{itemize} |
| 37 | + |
| 38 | +Компоненты стандартной библиотеки представляют собой совершенно обычный код \code{С++}, предоставляемый каждой реализацией языка. То есть стандартная библиотека \code{С++} может быть реализована в самом \code{С++} (и реализуется "--- с очень небольшим использованием машинного кода для таких вещей, как переключение контекста потока). Это означает, что \code{С++} достаточно выразителен и эффективен для самых сложных задач системного программирования. |
| 39 | + |
| 40 | +\code{С++} является статически типизированным языком, т.е. тип каждой сущности (например, объекта, значения, имени или выражения) должен быть известен компилятору в точке использования. Тип объекта определяет набор применимых к нему операций. |
| 41 | + |
| 42 | + |
| 43 | + |
| 44 | +%%================================== |
| 45 | +\section{Метод наименьших квадратов} |
| 46 | +%%================================== |
| 47 | + |
| 48 | +%%=============================== |
| 49 | +\subparagraph{Постановка задачи.} |
| 50 | +%%=============================== |
| 51 | +Рассмотрим регрессию (зависимость) следующего вида: |
| 52 | +\begingroup |
| 53 | +\newcommand{\SumN}{\ensuremath{\sum\limits_{i=1}^{N}}} |
| 54 | +\[ |
| 55 | + y_i = a + b x_i + \varepsilon_i,\quad i = \overline{1, N}. |
| 56 | +\] |
| 57 | +Среди всевозможных значений \(\{ a, b \}\) будем искать такие, которые приводят к минимальной сумме квадратов отклонений (ошибок): |
| 58 | +\[ |
| 59 | + S_{\varepsilon} = \SumN \varepsilon_i^2 = \SumN (y_i - a - b x_i)^2\quad\rightarrow\quad \min\limits_{a, b}. |
| 60 | +\] |
| 61 | +Запишем условие существования экстремума: |
| 62 | +\[ |
| 63 | +\begin{array}{l} |
| 64 | + \dfrac{\partial}{\partial a} S_{\varepsilon} = -2 \SumN (y_i - a - b x_i) = 0, \\[2ex] |
| 65 | + \dfrac{\partial}{\partial b} S_{\varepsilon} = -2 \SumN (y_i - a - b x_i) x_i = 0, \\ |
| 66 | +\end{array} |
| 67 | +\] |
| 68 | +откуда получим систему линейных уравнений: |
| 69 | +\[ |
| 70 | +\left\{ \begin{array}{l} |
| 71 | + \SumN y_i - N a - b\SumN x_i = 0, \\[2ex] |
| 72 | + \SumN x_i y_i - a\SumN x_i - b\SumN x_i^2 = 0. \\ |
| 73 | + \end{array} \right. |
| 74 | +\] |
| 75 | +Вводя обозначение для среднего арифметического множества значений некоторой величины \(f\): |
| 76 | +\[ |
| 77 | + \bar f = \dfrac{1}{N}\SumN f_i, |
| 78 | +\] |
| 79 | +перепишем систему в виде: |
| 80 | +\[ |
| 81 | +\left\{ \begin{array}{l} |
| 82 | + \bar y - a - b\bar x = 0, \\ |
| 83 | + \overline{x y} - a\bar x - b\overline{x^2} = 0, \\ |
| 84 | + \end{array} \right. |
| 85 | +\] |
| 86 | +и получим искомое решение: |
| 87 | +\[ |
| 88 | +\boxed{\begin{array}{l} |
| 89 | + a = \bar y - b\bar x, \\ |
| 90 | + b = \dfrac{\overline{x y} - \bar x\bar y}{\overline{x^2} - \bar x^2}. \\ |
| 91 | + \end{array}} |
| 92 | +\] |
| 93 | +\endgroup |
| 94 | + |
| 95 | + |
| 96 | + |
| 97 | +%%==================================== |
| 98 | +\subparagraph{Программная реализация.} |
| 99 | +%%==================================== |
| 100 | +Решение этой задачи может быть выражено на языке \lang{C++} следующим образом:\label{code:lsm} |
| 101 | + |
| 102 | +\cppfile{01/src/least_squares.cpp} |
| 103 | + |
| 104 | + |
| 105 | + |
| 106 | +%%================ |
| 107 | +\WhatToReadSection |
| 108 | +%%================ |
| 109 | +\textcite{Stroustrup:2016:ru}: \textbf{главы~0, 1 и~2} |
| 110 | + |
| 111 | + |
| 112 | + |
| 113 | +%%=============== |
| 114 | +\ExercisesSection |
| 115 | +%%=============== |
| 116 | +\begin{exercise} |
| 117 | +\item Настройте среду разработки программ на языке \lang{C++} (см. страницу \pageref{sect:workEnv}). |
| 118 | + |
| 119 | + |
| 120 | +\item Создайте свой первый проект с традиционной программой \textenglish{Hello, World!}. |
| 121 | + |
| 122 | +\smallskip |
| 123 | +\emph{Совет}: воспользуйтесь графическими инструкциями из архива |
| 124 | +\begin{flushleft} |
| 125 | + \yadisk{cpp-seminars/how-to-s/how-to\_create-project.zip}. |
| 126 | +\end{flushleft} |
| 127 | + |
| 128 | +Заголовочный файл \code{std\_lib\_facilities.h} из книги Страуструпа размещён в директории \yadisk{cpp-seminars/libraries}. |
| 129 | + |
| 130 | + |
| 131 | +\item \textbf{NB!} Внимательно изучите и возьмите на вооружение <<горячие клавиши>> среды разработки. Начните осваивать печать вслепую. |
| 132 | + |
| 133 | +\smallskip |
| 134 | +\emph{Совет}: воспользуйтесь информацией из раздела на странице~\pageref{sect:typing}. |
| 135 | +\end{exercise} |
0 commit comments