initial commit

master
nihonium 2 years ago
commit 2369f801af
No known key found for this signature in database
GPG Key ID: 0251623741027CFC

53
.gitignore vendored

@ -0,0 +1,53 @@
# ---> C
# Prerequisites
*.d
# Object files
*.o
*.ko
*.obj
*.elf
# Linker output
*.ilk
*.map
*.exp
# Precompiled Headers
*.gch
*.pch
# Libraries
*.lib
*.a
*.la
*.lo
# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib
# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex
# Debug files
*.dSYM/
*.su
*.idb
*.pdb
# Kernel Module Compile Results
*.mod*
*.cmd
.tmp_versions/
modules.order
Module.symvers
Mkfile.old
dkms.conf

@ -0,0 +1,180 @@
\documentclass{article}
\usepackage[utf8x]{inputenc}
\usepackage{ucs}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{marvosym}
\usepackage{wasysym}
\usepackage{upgreek}
\usepackage[english,russian]{babel}
\usepackage{graphicx}
\usepackage{float}
\usepackage{textcomp}
\usepackage{hyperref}
\usepackage{geometry}
\geometry{left=2cm}
\geometry{right=1.5cm}
\geometry{top=1cm}
\geometry{bottom=2cm}
\usepackage{tikz}
\usepackage{ccaption}
\usepackage{multicol}
\usepackage{fancyvrb}
\usepackage{listings}
%\setlength{\columnsep}{1.5cm}
%\setlength{\columnseprule}{0.2pt}
\usepackage{colortbl,graphicx,tikz}
\definecolor{X}{rgb}{.5,.5,.5}
\title{ДЗ. Работа с изображениями в формате \texttt{.ppm}}
\date{}
\begin{document}
\pagenumbering{gobble}
\lstset{
language=C++, % choose the language of the code
basicstyle=\linespread{1.1}\ttfamily,
columns=fixed,
fontadjust=true,
basewidth=0.5em,
keywordstyle=\color{blue}\bfseries,
commentstyle=\color{gray},
stringstyle=\ttfamily\color{orange!50!black},
showstringspaces=false,
%numbers=false, % where to put the line-numbers
numbersep=5pt,
numberstyle=\tiny\color{black},
numberfirstline=true,
stepnumber=1, % the step between two line-numbers.
numbersep=10pt, % how far the line-numbers are from the code
backgroundcolor=\color{white}, % choose the background color. You must add \usepackage{color}
showstringspaces=false, % underline spaces within strings
captionpos=b, % sets the caption-position to bottom
breaklines=true, % sets automatic line breaking
breakatwhitespace=true, % sets if automatic breaks should only happen at whitespace
xleftmargin=.2in,
extendedchars=\true,
keepspaces = true,
}
\lstset{literate=%
*{0}{{{\color{red!20!violet}0}}}1
{1}{{{\color{red!20!violet}1}}}1
{2}{{{\color{red!20!violet}2}}}1
{3}{{{\color{red!20!violet}3}}}1
{4}{{{\color{red!20!violet}4}}}1
{5}{{{\color{red!20!violet}5}}}1
{6}{{{\color{red!20!violet}6}}}1
{7}{{{\color{red!20!violet}7}}}1
{8}{{{\color{red!20!violet}8}}}1
{9}{{{\color{red!20!violet}9}}}1
}
\title{Семинар \#1: Введение в язык C++ (для тех, кто знает C). Классные задачи.\vspace{-5ex}}\date{}\maketitle
\section*{Hello world++}
Пишем первую программу на \texttt{C++}
\begin{lstlisting}
#include <cstdio>
int main() {
printf("Hello World++\n");
}
\end{lstlisting}
Все библиотеки из языка \texttt{C} можно использовать и в языке \texttt{C++}. Только название библиотеки без \texttt{.h} на конце и с символом \texttt{c} в начале:
\begin{verbatim}
<stdio.h> -------> <cstdio>
\end{verbatim}
Для компиляции используйте компилятор \texttt{g++}. Вот так:
\begin{verbatim}
g++ helloworld.cpp
./a.out
\end{verbatim}
Или, если вы хотите установить у исполняемого файла своё имя за место \texttt{a.out}:
\begin{verbatim}
g++ -o hello helloworld.cpp
./hello
\end{verbatim}
\begin{itemize}
\item \textbf{Задача 1:} Скомпилируйте и запустите простейшую программу \texttt{00helloworld.cpp}.
\item \textbf{Задача 2:} Разберитесь в программе \texttt{01structnaming.cpp}. Скомпилируйте и запустите.
\end{itemize}
\section*{Тип bool}
В прошлом семестре, для хранения результатов логических операций, мы использовали целочисленные типы.\\
В языке \texttt{C++} есть встроенный тип \texttt{bool}, который может принимать 2 значения (\texttt{true} и \texttt{false}).
\begin{lstlisting}
#include <cstdio>
int main() {
bool a = true;
bool b = false;
bool c = a || b;
if (c)
printf("Yes\n");
else
printf("No\n");
}
\end{lstlisting}
\begin{itemize}
\item \textbf{Задача 3:} Что напечатает эта программа? Скомпилируйте её и запустите (\texttt{02bool.cpp})
\item \textbf{Задача 4:} Напишите функцию, которая будет принимать на вход целое число и возвращать \texttt{true}, если число оканчивается на \texttt{0} и \texttt{false} иначе. Вызовите эту функцию из \texttt{main}.
\end{itemize}
\newpage
\section*{Пространство имён}
\begin{lstlisting}
#include <cstdio>
// Определяем переменные, структуры, функции внутри пространства имён foo
namespace foo {
int a = 5;
int square(int x) {
return x * x;
}
}
// Чтобы получить доступ к ним вне пространства имён, нужно добавить к именам foo::
int main() {
printf("%d\n", foo::a);
}
\end{lstlisting}
\begin{itemize}
\item \textbf{Задача 5:} Возведите \texttt{foo::a} в квадрат с помощью функции \texttt{foo::square}.
\item \textbf{Задача 6:} Создайте своё пространство имён по имени \texttt{bar} и определите в нём переменную \texttt{a = 7}. Напечатайте значение этой переменной в \texttt{main}.
\item \textbf{Задача 7:} Сделайте задание в программе \texttt{03namespace.cpp}.
\end{itemize}
\section*{Ссылки}
Ссылка -- это переменная, которая является новым именем для существующего участка памяти.
\begin{lstlisting}
#include <cstdio>
int main() {
int a = 10;
// Создадим ссылку r на переменную a
int& r = a;
// Теперь, если изменить r, то поменяется и a
r += 5;
printf("%d\n", a);
}
\end{lstlisting}
Ссылки часто используются для тех же целей, что и указатели (только со ссылкам работать удобнее).
В отличии от указателей, ссылки:
\begin{enumerate}
\item Должны всегда инициализироваться при создании
\item Не могут никуда не ссылаться (т.е. не могут равняться \texttt{NULL})
\item Их нельзя переприсвоить. При использовании оператора \texttt{=} со ссылками изменяется та переменная, на которую ссылка ссылается, а не сама ссылка.
\end{enumerate}
\begin{itemize}
\item \textbf{Задача 8:} Сделайте задание в файлах \texttt{04ref.cpp}, \texttt{05ref.cpp} и \texttt{06ref.cpp}.
\end{itemize}
\section*{Перегрузка функций}
\begin{itemize}
\item \textbf{Задача 9:} Сделайте задание в файлах \texttt{07function\_overload.cpp}, \texttt{08nulptr.cpp} и \texttt{09default\_arguments.cpp}.
\end{itemize}
\section*{Перегрузка операторов}
\begin{itemize}
\item \textbf{Задача 10:} Сделайте задание в файлах \texttt{10operator\_overload.cpp}, \texttt{11iostream.cpp} и \texttt{12iostream\_overload.cpp}.
\end{itemize}
\end{document}

@ -0,0 +1,33 @@
#include <stdio.h>
/*
Здравствуйте, это первый файл семестра по языку C++ (для тех, кто знаком с языком C)
Язык C++ создан на основе языка C и одним из приоритетов C++ является обратная совместимость с C
Поэтому почти любая программа на языке C будет работать и на языке C++
Однако, нужно помнить, что это разные языки. В C++ было добавлено огромное количество новых возможностей,
что сделало C++ возможно самым объёмным и мощным языком программирования.
C++ содержит в себе во много раз больше всего, чем язык C и пройти его за один семестр не представляется возможным,
но мы пройдём ключевые части этого языка.
Для компиляции программ на C++ будем использовать компилятор g++.
Скомпилируйте эту программу вот так:
g++ 00hello.cpp
И запустите вот так (для Windows):
a.exe
И запустите вот так (для Linux):
./a.out
*/
int main()
{
printf("Hello World of C++\n");
}

@ -0,0 +1,48 @@
#include <stdio.h>
/*
Пространства имён - namespace
Определяем переменные/структуры/функции внутри пространства имён.
Давайте назовём его mipt
Чтобы получить доступ к этим переменным/структурам/функциям
вне пространства имён, нужно добавить к имени название пространства имён и оператор ::
В данном случае нужно добавить mipt::
*/
namespace mipt
{
int a = 5;
float b = 1.2;
int square(int x)
{
return x * x;
}
}
int main()
{
printf("%i\n", mipt::square(4));
}
/*
Задание:
1) Скомпилируйте программу и запустите, что она напечатает?
2) Что будет, если забыть написать mipt:: у названия функции square?
3) Передайте в функцию mipt::square переменную a из пространства имён mipt
4) Напишите функцию float average(float x, float y), которая будет принимать 2 числа
и возвращать их среднее арифметическое.
Поместите эту функцию в пространство имён mipt и вызовите эту функцию из main
5) Напечатайте среднее арифметическое от a и b, используя функцию average
*/

@ -0,0 +1,25 @@
#include <stdio.h>
namespace mipt
{
int a = 5;
float b = 1.2;
int square(int x)
{
return x * x;
}
float average(float x, float y)
{
return (x + y) / 2;
}
}
int main()
{
printf("%i\n", mipt::square(mipt::a));
printf("%f\n", mipt::average(mipt::a, mipt::b));
}

@ -0,0 +1,24 @@
#include <stdio.h>
/*
В языке C при объявлении структуры struct Book создаётся тип по имени struct Book.
В языке C++ при объявлении структуры struct Book создаётся тип к которому
можно обращаться как по имени struct Book так и по имени Book
*/
struct Book
{
char title[50];
int pages;
float price;
};
int main()
{
struct Book a = {"Tom Sawyer", 280, 500};
Book b = {"War and Peace", 1200, 900};
}

@ -0,0 +1,40 @@
#include <cstdio>
/*
Определяем переменные/структуры/функции внутри пространства имён mipt
Затем к ним можно будет доступиться используя префикс mipt::
*/
namespace mipt
{
struct Book
{
char title[50];
int pages;
float price;
};
void printBook(Book b)
{
printf("%s, pages: %d, price: %.2f\n", b.title, b.pages, b.price);
}
}
int main()
{
}
/*
Задание:
Структура Book и функция printBook определены в пространстве имён mipt
1) Создайте переменную типа структура Book и иницилизируйте
её значениями: "War and Peace", 1200, 900
2) Напечатайте созданную переменную с помощью функции printBook
*/

@ -0,0 +1,36 @@
#include <cstdio>
namespace mipt
{
struct Book
{
char title[50];
int pages;
float price;
};
void printBook(Book b)
{
printf("%s, pages: %d, price: %.2f\n", b.title, b.pages, b.price);
}
}
int main()
{
mipt::Book b = {"War and Peace", 1200, 900};
mipt::printBook(b);
}
/*
Задание:
Структура Book и функция printBook определены в пространстве имён mipt
1) Создайте переменную типа структура Book и иницилизируйте
её значениями: "War and Peace", 1200, 900
2) Напечатайте созданную переменную с помощью функции printBook
*/

@ -0,0 +1,60 @@
#include <stdio.h>
/*
Зачем вообще нужны пространства имён?
Представьте, что вы создаёте большую программу, исходный код который
содержит миллионы строк кода. Конечно, большая часть кода написана не вами,
так как вы используете библиотеки, написанные другими программистами.
Библиотекой можно назвать совокупность файлов исходного кода, нацеленных
на решение какой-либо задачи. Например, есть библиотека для работы с графикой
в которой содержатся функции/структуры/классы для работы с графикой.
Если вы подключаете несколько библиотек, то существует высокая вероятность,
что название чего-либо из одной библиотеки совпадёт с названием чего-то из другой библиотеки.
Это, конечно, приведёт к ошибке.
Чтобы этого избежать и используются пространства имён.
*/
namespace audio
{
int a = 10;
int calculate(int x)
{
return x + 1;
}
}
namespace graphics
{
int a = 20;
int calculate(int x)
{
return x * 2;
}
}
int main()
{
printf("%i\n", audio::a);
printf("%i\n", graphics::a);
printf("%i\n", graphics::calculate(audio::calculate(graphics::a)));
}
/*
Задание:
1) Что напечатает данная программа?
*/

@ -0,0 +1,78 @@
#include <stdio.h>
/*
Если вам очень не хочется постоянно писать названия пространства имён,
то вы можете использовать ключевое слово using
using namespace audio;
Это говорит о том, что начиная с этой строки audio:: перед именами писать больше не нужно
Это, конечно, полностью уничтожают всю пользу, которую приносят пространства имён.
То есть в больших проектах могут возникнуть ошибки, связанные с одинаковыми именами.
Так что так лучше не делать, а если и делать, то только в маленьких программах.
*/
namespace audio
{
int a = 10;
int calculate(int x)
{
return x + 1;
}
}
namespace graphics
{
int a = 20;
int calculate(int x)
{
return x * 2;
}
}
namespace network
{
int b = 20;
int solve(int x)
{
return x * 2;
}
}
using namespace audio;
int main()
{
printf("%i\n", calculate(a));
}
/*
Задание:
1) Что напечатает данная программа?
2) Если заменить using namespace audio на using namespace graphics, то что напечатает программа?
3) Что если одновременно использовать пространство имён audio и пространство имён graphics?
using namespace audio;
using namespace graphics;
Приведёт ли это к ошибке и, если да, то почему?
4) Что если одновременно использовать пространство имён audio и пространство имён network?
using namespace audio;
using namespace network;
Приведёт ли это к ошибке и, если да, то почему?
*/

@ -0,0 +1,65 @@
#include <iostream>
/*
Все переменные/функции/структуры/классы стандартной библиотеки языка C++ содержатся в пространстве имён std
Рассмотрим, например, глобальную переменную cout, определённую в библиотеке iostream в пространстве имён std.
К этой переменной можно применять оператор <<
cout << объект
В результате этой операции объект напечатается на экран (если он может напечататься)
Результат оператора << также является cout, поэтому можно применять << несколько раз:
Например это выражение: cout << "Hello " << "World" << "\n";
1) Сначала напечатается "Hello " и на место cout << "Hello " подставится cout
Получтся cout << "World" << "\n";
2) Потом напечатется "World" и на место cout << "World" подставится cout
Получтся cout << "\n";
3) В конце напечатается перенос строки
*/
int main()
{
std::cout << "Hello World\n";
std::cout << 5 << "\n";
int x = 10;
std::cout << 5 << "\n";
}
/*
Задачи:
1) Напечатайте на экран число 1.4, используя cout (количество печатаемых знаков после запятой неважно)
Обратите внимание, что при печати с cout не нужно указывать спецификатор типа как в printf.
cout сам понимает объект какого типа ему передаётся
2) Напечатайте фразу "I am x years old", только за место x нужно подставить значение
переменной x. В данной задаче получится "I am 10 years old". Используйте cout.
3) Напечатайте на экран числа от 1 до 20, разделённые пробелом. Используйте cout
4) Вместо \n для переноса строки можно использовать endl - специальный объект из
пространства имён std.
Если мы передаём его объекту cout через оператор << то печатается перенос строки
Замените все переносы строк с \n на endl
std::cout << 5 << "\n"; --> std::cout << 5 << std::endl;
На самом деле std::endl работает медленней, чем \n, так как он помимо печати делает flush
Поэтому, если важна скорость печати в буфер, то лучше использовать \n
5) Что будет если не написать std:: перед одним из cout?
6) Используйте using namespace std; и избавьтесь от надоедливых std:: перед cout и endl
*/

@ -0,0 +1,16 @@
#include <iostream>
using namespace std;
int main()
{
cout << 1.4 << endl;
int x = 10;
cout << "I am " << x << " years old" << endl;
for (int i = 1; i <= 20; ++i)
cout << i << " ";
cout << endl;
}

@ -0,0 +1,32 @@
#include <iostream>
/*
В пространстве имён std очень много разных имён. Если мы добавим их всех, используя
using namespace std;
то это может привести к проблеме.
Одно из имён из std может совпасть с названием нашего объекта и это может привести к ошибке.
Так что лучше такую возможность не использовать.
Но можно добавить только одно имя так:
using std::cout;
Начиная с этого момента можно писать просто cout.
Но для всех остальных объектов из std вы должны продолжать писать std::
*/
using std::cout;
int main()
{
cout << "Hello World" << std::endl;
cout << 5 << std::endl;
}
/*
Задачи:
1) Добавить endl в нашу область видимости, также как и cout
*/

@ -0,0 +1,41 @@
#include <iostream>
/*
Счтиывание из стандартного входа
Рассмотрим глобальную переменную cin, определённую в библиотеке iostream в пространстве имён std.
К этой переменной можно применять оператор >>
cin >> объект
В результате этой операции объект считается с экрана (если он может быть считан)
Результат оператора >> также является cin, поэтому можно применять >> несколько раз:
Например это выражение: cin >> a >> b;
1) Сначала считается переменная a и на место cin >> a подставится cin
Получтся cin >> b;
2) Потом считается переменная b
*/
int main()
{
int a, b;
std::cin >> a >> b;
std::cout << a + b;
}
/*
Задачи:
1) Что напечатает данная программа, если на вход передать числа 10 и 20?
2) Напишите программу, которая будет считывать два вещественных числа и печатать их среднее геометрическое
Функция корня sqrt есть в библиотеке <cmath>
*/

@ -0,0 +1,10 @@
#include <iostream>
#include <cmath>
int main()
{
float a, b;
std::cin >> a >> b;
std::cout << sqrt(a * b);
}

@ -0,0 +1,42 @@
#include <stdio.h>
#include <math.h>
/*
Язык C++ обратно совместим с языком C. То есть почти любая программа на C будет работать на C++
Эта программа будет работать.
Обратите внимания, для имён, пришедших из языка C использовать std:: не обязательно
Программа работает, несмотря на то, что мы используем библиотечные
функции printf и sqrt без указания пространства имён std.
*/
int main()
{
printf("%f", sqrt(3));
}
/* Задача:
1) Что напечатает данная программа?
2) Использование библиотечных функций без std опасно, так как может привести к ошибкам,
связанных с совпадением имён. Помните, что большая программа может иметь миллионы
строк кода и совпадение ваших имен и библиотечных имён очень вероятно.
Напишите следующую функцию перед функцией main
int sqrt(int x)
{
return x + 1;
}
Что теперь напечатает программа? Объясните результат.
*/

@ -0,0 +1,37 @@
#include <cstdio>
#include <cmath>
/*
Желательно всё равно и