https://pythontutor.com/
- ссылка на сайт для просмотра программы
Visual Studio Code
Ctrl + Alt
- ‘Продление’ курсора више/ниже
Alt + T - удаление лишних пробелов
Ctrl + Shift + I - форматирование программы
Ctrl + ~ - терминал
БИБЛИОТЕКИ
#include
Для получения контейнера типа array
#include
Библиотека iomanip для слов-манипуляторов: left/right, fixed, setfill(), setw(), setprecision()
cout << setprecision(3) << 13.14159 << endl; // 13.1
cout << fixed << setprecision(3) << 13.14159 << endl; // 13.142
/* left - манипулятор, который влияет на все последующие выводы,
пока не будет изменён. Манипуляторы left и right из библиотеки
iomanip работают только вместе с setw()
*/
setw()
- определяет ширину поля
setfill('')
- определяет символ заполнения
#include
- Для работы strlen() - функцию, которая возращает правильную длину C-style массива
#include
#include <cassert> // Для assert
- заставляет программу аварийно завершаться при неправильной логике
#include - для рандома
random_device rd; // Генератор, источник энтропии(хаоса)
mt19937 gen(rd()); // Для получения случайных чисел высокого качества
uniform_int_distribution<> dist(3, 6); // Равномерное распределение в диапазоне чисел
#include <cstring>
- для строк - Для получения длины методом strlen()
#include <limits.h>
- содержит минимальные и максимальные значения для фундументальных типов c++ (int, float…)
stack - библиотека стека
cmath - Библиотека математических операций
algorithm - Библиотека алгоритмов
```sort(userNums, end);``` - Сортировка массива
```all_of```
```greater<>()```
```int maximum = max({wordSize1, wordSize2, wordSize3});``` // Для {} - нужна библиотека algorithm
iomanip
```cout << setprecision(4);``` - Определяет кол-во нулей после точки
```cout << ... << showpoint << ...;``` - Показать нули после запятой(работает вместе с setprecision())
```cout << ... << showpos << ...;``` - Показать знак(+/-)
БИБЛИОТЕКА unistd.h
#include <cmath>
- Библиотека математических операций
unistd.h
- библиотека
srand(time(0));
- програмный таймер
sleep(1)
- задержка в 1 секунду
system("clear");
- очистка экрана терминала
g++ -Wall main.cpp -o main.bin
- способ компилирования программы без clang
ЛОГИЧЕСКИЕ ОПЕРАЦИИ
!= \ (not_eg)
- логическое неравенство
! \ (not)
- логическое не(инверсия)
==
- логическое равенство
|| \ (or)
- логическое ИЛИ
&& \ (and)
- логическое И
^ \ (xor)
- исключающее ИЛИ
ТЕРМИНАЛЬНЫЕ КОМАНДЫ
g++ <назв файла> -o <назв файла.bin>
- тот же компилятор что и clang, но его нет на Windows
grep -iRl "SIZE"
- нахождение файла с искомым словом в кавычках
echo | g++ -dM -E -x c++ - | grep __cplusplus
- проверка версии используемой версии C++
ascii - d
- таблица символов
bc -l
- калькулятор командной строки
Ctrl + Z
- выход из программы
xxd -b main.bin
- показать содержимое бинарного файла
echo '...' | xxd -b
- показать текст в бинарном виде
objdump -d main.bin
- дизассемблер бинарного файла
file main.bin
- информация о файле
stat main.bin
- статистика файла
ldd main.bin
- информация об использованных библиотек в донном файле
time ./main.bin
- возвращает время работы программы
strace ./main.bin
- отладочная информация
ulimit -s
- размер стека компьютера
cppcheck -q --enable=all counterColor.cpp
- поиск ошибок
clang-format file.cpp > format.cpp
- команда форматирующая текст и пересоздавающая её в другой файл
ascii -b
- таблица ascii в бинарном виде
КОМПИЛЯЦИЯ И ЗАПУСК ПРГРАММЫ
clang++ -Wall -std=c++17 modernMethodGetSizeArr.cpp -o main.bin
- компиляция программы на c++17
clang++ -Wall charDelay.cpp -o charDelay.bin
- компиляция программы
./main.bin
- запуск программы
КОМАНДЫ GIT
git status
- текущее состояние репозитория
git add *
- добавить изменения в репозиторий
git commit -m 'Added/Update file'
- зафиксировать изменения
git push
- отправить изменения на сайт git
git pull
- синхронизация репозиториев
gtypist ru.typ
- клавиатурный тренажёр кириллицы
gtypist
- клавиатурный тренажёр латиницы
Unit-test
- обрабатывает отдельные функции
ключевое слово - assert - утверждать
assert(); - при false аварийно останавливает программу
ФУНКЦИИ
void printArray(const int arr[], const size_t SIZE) {}
- обязательно const
string toUpperString(string& str) {
for (auto& c : str) {
c = static_cast<char>(toupper(static_cast<unsigned char>(c)));
}
return str;
}
Перегрузка функций - это определение нескольких одноимённых функций с разными параметрами
Каждая из перегруженных функций должна иметь уникальные параметры
Перегрузка функции может упростить создание программы
Перегрузка функции имеет небольшой риск определения совпадений преобразований
Параметр функции (формальный параметр) - это переменная,
создаваемая при объявлении функции:
void val(int x); // x - это параметр
int res(int a); // a - это параметр
Аргумент функции (фактический параметр) - это значение, которое
передаёт в функцию вызывающий объект:
val(7); // 7 - это аргумент
res(9); // 9 - это аргумент
Параметры по умолчанию либо все, либо справа
void func(int x, int y) { // x и y - параметры
cout << x << ' ' << y << '\n';
/*
переменные x и y создаются и уничтожаются внутри этой функции (они локальные переменные)
*/
}
Синтаксис функции - ТИП + ИМЯ + КОД
Типом ф-ции может быть ещё и имя структуры, и имя перечисления
КОНТЕЙНЕРЫ
Контейнер array
std::array words { "banana". "apple", "cherry" }; // c++17 - только для чисел
1. Похож на фиксированный (статический, классический) массив
2. При передачи в функцию в качестве параметра он не распадается на указатель (не теряет информацию о своём размере)
3. С помощью метода .at() поддерживается проверка границ
4. Контейнер array<> безопасней классических массивов (позволяет избежать проблем с выбором несуществующих элементов)
5. При объявленни и инициализации контейнера array<> всегда нужно указывать его длину вручную
ranges::sort(myArray);
- Сортировка по возрастанию в C++20
СТЕК
stack<int> newStack; // Имя стека
myStack.size();
- Размер стека
newStack.push(5);
- Помещаем данные в стек
newStack.pop();
- Удаляет верхний элемент из стека
myStack.top()
- Возвращает ссылку на верхний элемент стека
if (myStack.empty()) { - если стек пустой
}
#РЕКУРСИЯ
/*
1. Все рекурсии должны иметь условие своего завершения
2. Рекурсия позволяет осуществлять повторяющиеся инструкции без циклов
*/
Рекурсия - это что-то вроде сна внутри сна или зеркала в зеркале
Функции в программировании - это программы внутри программы
Функции содержат инструкции, которые выполняются во время их вызова
Функции располагаются в области оперативной памяти компьютераб называемой Стек (Stack)
В момент вызова функции ей можно передать аргумент (значение)
Функции могут возвращать значения, которые есть вывод функции
Оперативная память компьютера состоит из стека (автоматическая память), в котором покадрово
выполняются функции. Каждый вызов функции - это кадр (фрейм).
Таким образом образуется стек вызовов. Стек вызовов помнит каждый кадр.
Все кадры-вызовы обрабатываются автоматически.
Стек вызовов работает по принципу "последним вошёл - первым вышел".
Т.е. последняя вызванная функция помещается в самый верх стека.
По завершении работы функций стек автоматически очищается.
Рекурсивная функция в программирование - это функция, которая вызывает саму себя.
Все рекурсии должны содержать условие своего завершения!
Бесконечная рекурсия обязательно и быстро переполнит Стек.
Получить доступный размер Стека можно командой "ulimit -s".
В программирование почти нет ни одной задачи для рекурсии,
которую нельзя было бы выполнить обычным циклом.
Рекурсию можно использовать, например для прохождения лабиринта или
поиска файлов во вложенных каталогах.
ШАБЛОНЫ
template <typename Container>
-template - шаблон
-Обобщённая (шаблонная) функция
-Шаблоны позволяют работать с разными типами данных
-Шаблоны в C++ - это часть обобщённого программирования (ОП)
МЕТОД
.at()
- метод проверяет границы контейнера, безопасно достаёт какой либо элемент, вместо []
cin.get();
- если нужно нажать Enter
revers();
string phrase {"Hello, World"}; // Можно по-новому через uniform-инициализации
cout << phrase << endl;
reverse(phrase.begin(), phrase.end());
cout << phrase << endl;
.fill()
- метод заполнения контейнера какими-то значениями
ПОНЯТИЯ
Итератор - элемент для перехода по массиву с какой-то целью
int min = INT_MAX;
- Максимальное значение для типа int
в const auto - автоматически выделяется память (поэтому в структуру запихнуть не получится)
foo и boo - негласное соглашение называть программы так, если не знаешь как их назвать
Сравнивать два вещественных числа - сложная задача для компьютера
// Литерал - это элемент программы, который представляет значение
Парадигмы программирования:
1) Процедурное - без функций, перечислений, структур и классов
2) Структурное - с перечислениями, структурами и функциями, но без классов
3) ООП - Объектно-ориентированное программирование - структурное + классы и шаблоны
Каждая функция должна выполнять только 1 задачу и делать это хорошо
НЕ рекомендуется ставить таймер в функцию
МАССИВЫ
void printArray(const string arr[], const size_t SIZE) {
for (size_t i = 0; i < SIZE; ++i) { cout << arr[i] << ' '; }
cout << '\n';
}
// Статически массив при передачи в функцию теряет информацию о своей длине, поэтому в ф-цию задаётся 2 переменные
Во многих случаях при передачи в функцию фиксированный массив распадается на указатель,
который есть 0-й элемент массива.
Фиксированный массив всегда знает свою длину.
Для хранения массива в функции или структуре используется указатель.
swap(str.at(start), str.at(end)); // Метод обработки с проверкой // Меняет местами 2 значения
//swap(str[start], str[end]); // Другой способ // без проверки // не желательный вариант
int array[5] = {0};
for (const auto &i : array) { cout << i << ' '; } cout << '\n'; // Только для массивов // Можно запомнить, ведь меняются только названия переменных
// Выводит содержимое массива //Не нужно для char-массивов, можно сразу - cout << arr << endl;
for (int i = 0; i != LENGTH; ++i) { sum += arr[i]; }
- Вычисляем сумму всех значений массива
swap();
- функция, которая меняет местами 2 значения
Массивы в программированние - коллекции однотипных элементов
1, 0, 100, 25, 3 - пример коллекции натуральных чисел
Каждый элемент в массиве является переменной без имени
Во всех массивах все элементы начинаются с нулевого места(индекса)
Индекс массива всегда числовой и он предназначен для доступа к нужному элементу массива.
Массивы бывают фиксированные, динамические, "резиновые".
Фиксированные массивы в C++ всегда "знают" свой размер.
int arr[];
// [] - признак фиксированного массива // Объявили фиксированный массив размером 3
int arrSize = sizeof(arr);
- размер массива в байтах
arrSize = sizeof(arr) / sizeof(arr[0]); - кол-во элементов в массиве // плохо работает со символами // Классический способ
или
arrSize = sizeof(arr) / sizeof(*arr); // *arr - указатель на первый элемент в массиве // Через указатель
или
arrSize = *(&arr + 1) - arr; // &arr - ссылка ...
или
size_t LENGTH = std::size(arr) // через c++17
char map[10][10];
// Получить длину ряда многомерного массива
const int LENGTH = sizeof(map[0]) / sizeof(map[0][0]);
cout << "Тип объекта " << typeid(arr).name() << endl;
- возвращает тип объекта
cout << *arr << endl;
// Тоже самое arr[0] // arr[0] - 1-й элемент массива
Изменить длину фиксированного массива нельзя!
Задать длину массива можно константой или вручную
int i_arr[getSize] {0};
- Очень плохо! Т.к. заранее не известно какое будет число
char ch_arr[] {"Hello, World!"}; // Современный синтаксис объявления массивов!
char ch_arr[] = "Hello, World!";
const char *SUB_STRING = "Hello";
const auto SUB_STRING {"Hello"};
//Всё, что со словом auto - современный способ
int array[2][3] {{7, -5, 9},{6, 4, 8}};
- Двумерный массив
РАНДОМ
int getRandomNum(int min, int max) {
std::random_device rd; // std - гарантирует что эти имена не будут кофликтовать с именами, созданными программистом.
std::mt19937 gen(rd());
std::uniform_int_distribution<> distrib(min, max); // Равномерное распределение целых чисел в диапазоне
return distrib(gen);
}
namespace Rand {
mt19937 gen(random_device{}());
}
// Способ организовать рандом
random_shuffle(str.begin(), str.end()); // Немного устаревший вариант
shuffle(str.begin(), str.end(), gen1); // Современный вариант
ВЕКТОРЫ
vec.erase(vec.begin());
- Удалил 1-й (0-й по индексу) элемент вектора
vec.erase(vec.begin() + 1, vec.end() - 3);
- Удаление нескольких эл-ов
vec.insert(vec.begin(), 17);
- Добавление нового элемента в начало вектора, может снизить производительность программы
vec.push_back(30);
- Добавление нового элемента в конец вектора
vec.reserve(100);
- Зарезервировали доп. память для вектора
МЕТОДЫ
.entropy() - возвращает оценку качества энтропии
Метод find класса string возвращает позицию 1-го вхождения в строке
string::npos - сокращённо от no position, специальная константа
для обозначения несуществующего индекса в массиве
cin.get(word, 100); // Метод для классических символьных массивов char
.compare(...) - сравнивает строку перед методом со строкой в скобках
.erase() - очищает СТРОКУ
.empty() - проверяет пустая ли СТРОКА
.find(...) - ищет индекс искомого символа/слова в СТРОКЕ
.length = .size - ищут размер строки
ЦВЕТА
\x1b[48;2;255;255;0m 255 - r, 255 - g, 0 - b; 48 - код фона по ANSI, 38 - для текста; 2 - политра 24 bit (TrueColor)
АРХИВ
/*
inline указывает компилятору, чтобы он обрабатывал переменную, как встроенную функцию
для улучшения производительности, необязательно.
Но в основном inline нужен для соблюдения ODR (правила одного определения)
и чаще всего нужен для многофайловых программ
*/
/* std::cerr - стандартный поток вывода ошибок.
В отличии от cout - cerr не буферизируется, т.е. выводится сразу в консоль
Используется для ошибок и других важных сообщений
*/
using namespace std; - нужен для учебных целей
тогда:
std::cout <<...
и т.д.
// constexpr - улучшенный const, вычисляется на этапе компиляции, может привести к незначительному увелечению размера бинарного файла
ldd ....bin
- в командной строке, показывает библиотеки
//cout << setfill((char)(ascii_char)) << setw(2) << 5 << endl;
cout << setfill(static_cast<char>(ascii_char)); - static_cast<> - безопасней
#include <iostream>
#include <iomanip>
#include <unistd.h>
using namespace std; // Пространство имён
namespace Colors { // Пространство имён
const string RED = "\x1b[37;41m";
const string GREEN = "\x1b[37;42m";
const string YELLOW = "\x1b[37;43m";
const string BLUE = "\x1b[37;44m";
const string MAGENTA = "\x1b[37;45m";
const string CYAN = "\x1b[37;46m";
const string WHITE = "\x1b[37;47m";
const string RESET = "\x1b[0m";
}
int main() {
cout << Colors::RED << " " << Colors::RESET << endl;
cout << Colors::GREEN << " " << Colors::RESET << endl;
cout << Colors::YELLOW << " " << Colors::RESET << endl;
cout << Colors::BLUE << " " << Colors::RESET << endl;
cout << Colors::MAGENTA << " " << Colors::RESET << endl;
cout << Colors::CYAN << " " << Colors::RESET << endl;
cout << Colors::WHITE << " " << Colors::RESET << endl;
return 0;
}
cout << setfill('-') << setw(50) << "" << setfill(' ') << endl; - 1-й способ организации горизонтальной линии
cout << string(50, '-') << endl; - 2-й способ организации горизонтальной линии
npos
- нет позиции
string phrase {"I enjoy sport"};
- Лучше так(прямая инициализация - дешевле для процессора)
c = cin.get();
- В отличие от cin читает все символы, даже пробел
\r
- этот символ перемещает курсор в начало текущей строки не переходя на новую строку.
flush
- чтобы сразу увидеть изменения
for (auto &i : str) { i = tolower(i); } // Ранжированный for, перебирает строку по индексам
int randNum(int, int) {
static random_device rd; // static - гарантирует, что ф-ция будет объявлена 1 раз
static mt19937 gen(rd());
uniform_int_distribution<> dist(0, 8);
return dist(gen);
}
cin >> c; - cin >> Добавляет символ новой строки
c = cin.get(); - предпочтительней для char, считывает даже пробелы и служебные символы(Escape, Ctrl)
static_cast<> - нужен для преобразования из 1 типа в другой
pop_back(); - Удаляет последний элемент строки
back() - возвращает последний элемент строки
return -1; - >= 0 - успешное завершение работы(нужно для тестов)
bool hasLowerChar(const string& str) { // Рекомендуется всегда делать ссылку, она предотвращает копирование в другие ячейки память, можно ставить вплотную к переменной, без разницы
inline string str(string s) { // inline - определяет функцию как встроенную, встроенная функция работает быстрее
return s;
}
cin.ignore(32767, 'n');
- можно написать вместо ws
size_t - спец. тип данных, лучше использовать в циклах или при работе с массивами, размер которого совпадает с размером указателя
size_t - для обработки массивов, схож с long, всегда 8байт в x64 системе
size_t - перебирает каждый элемент массива, специально создан для массивов, безнаковый, максимально возможный тип данных
cout << *words << endl;
- указатель на массив указывает на его 1 индекс
con.at(4) = 'F';
- С проверкой границ. Современный и безопасный метод. con - сумма строк(любое название может быть)
static std::mt19937 gen(rd()); // 32-битный генератор
cout << "Случайное число " << fixed << setprecision(2) << d_secret << '\n';
- setprecision - округляет число, dixed - фиксированное
static
- гарантирует, что генератор инициализируется только 1 ра при первом вызове функции
Метод find
- find метод, работает только с str, возвращает 1-ю позицию подстроки или символа в строке
string::npos
- спец. константа для обазначения несуществующего индекса массива
string revCycle(string &str) { // & - для повыш. производительности(вместо копирования - ссылка)
static (например - int)
- статичная переменная
(char)abs
- превращает переменную в тип данных который указан в скобках
exit(0)
- принудительное завершение программы
+=
- сложение с присваиванием
%
- деление по модулю(выводит остаток)
man.name
- оператор доступа к полю структуры
cin.ignore(37735, '\n'); // Очищает входной (cin >>) буфер
puts("Нажмите любую клавишу для завершения программы");
cin.get(); // Ожидает нажатия Enter и после приёма завершает программу
unsigned - по умолчанию int, но unsigned short - short, ... long - long
1. Статическая память компьютера — функции, константы (и перечисления), статичекие и глобальные переменные, текст. Статически память выделяется один раз (при запуске программы) и сохраняется на протяжении работы всей программы;
2. Автоматическая память компьютера — **стэк**. Локальные переменные, фиксированные массивы. Автоматическое выделение памяти выполняется для параметров функций и локальных переменных. Память выделяется при входе в блок, в котором находятся эти переменные, и удаляется при выходе из него.
Стек вызовов работает по принципу "последный вошел - первым вышел". Т.е. последняя вызванная функция помещается в самый верх стека. По завершении работы функций стек очищается.
Получить доступный размер стека в Linux можно командой
3. Динамическая память компьютера — куча. В отличие от статического или автоматического выделения памяти, программа самостоятельно отвечает за запрос и обратный возврат динамически выделенной памяти.
Динамически выделенная память не имеет области видимости и остаётся до тех пор, пока не произойдёт её освобождение или пока программа не завершит своё выполнение. Нужно быть осторожным и не разыменовывать висячие или 0-е указатели!
Указатели, используемые для хранения динамически выделенных адресов памяти следуют правилам области видимости обычных переменнх.
При удалении динамически выделенной переменной память возвращается обратно в кучу и затем может
быть переназначена последующими запросами. Удаление указателя не удаляет переменную, а просто
приводит к возврату памяти по этому адресу обратно в ОС.
Память, которую используют программы, состоит из нескольких частей, сегментов:
- Сегмент кода (текстовый сегемнт), где находится скомпилированная программа. Обычно доступен только для чтения
- Сегмент bss (или неинициализированный сегмент данных), где хранятся глобальные и статические переменные, инициализированные нулём
- Сегмент данных (сегмент инициализированных данных), где хранятся инициализированные глобальные и статические переменные
- Куча, откуда выделяются динамические переменные
- Стек вызовов, где хранятся параметры функций, локальные переменные и другая информация, связанная с функциями
ОПЕРАТОРЫ
cin >> abs;
- оператор который принимает с клавиатуры числа и символы
getline(cin >> ...)
- как cin но для строк
ТЕКСТОВЫЙ РЕДАКТОР MICRO БИБЛИОТЕКА IOSTREAM
cout.flush()
- очистка выходного буфера
cout << boolalpha;
- слова true и false вместо 1 и 0
((x == y) ? true : false)
- Тернарный оператор
IF,ELSE,WHILE И ДРУГОЕ
else
- тогда
if
- если
flag
- переменная содержащая true или false и использует
while
- цикл
break
- прыжок из цикла
RAND
int secretNum = 1 + (rand() % 10);
- рандом который работает только если начальное число 0 или 1
const double FRACTION = 1.0 / ((double)(RAND_MAX) + 1.0);
int min = 3, max = 100;
- рандом с более сложной конструкцией int randNum = (int)(rand() * FRACTION * (max - min + 1) + min);
текст
Заголовог 1-го уровня
Заголовок 2-го уровня
Заголовок 3-го уровня
Это выделенный текст (жирным шрифтом)
Это курсив(наклонный текст)
Это жирный наклонный текст
Горизонтальная черта
Зачёркнутый текст
Подчёркнутый текст
Какой-то важный текст
Важный текст
Продолжение важного текста
Продолжение продолжения важного текста
Списки
Маркерный список
- Это 1-й элемент списка
- Это 2-й элемент списка
- Это 3-й элемент списка
- Это 1-й элемент списка
- Это 2-й элемент списка
- Это 3-й элемент списка
- 1-й подэлемент 3-го элемента списка
- 2-й подэлемент 3-го элемента списка
- 3-й подэлемент 3-го элемента списка
- Это 4-й элемент списка
- Это 5-й элемент списка
Цифровой список
- Первый элемент списка
- Второй элемент списка
- Третий элемент списка
Автоматический цифровой список
- Первый элемент списка
- Второй элемент списка
- Третий элемент списка
- Новый элемент списка
- Четвёртый элемент списка
- Пятый элемент списка
Список дел
- Первое дело
- Второе дело
- Третье дело
Список дел в виде ссылок
Ссылки
https://gitflic.ru/project/rurewa/cpp\
Надпись как ссылка со всплывающей подсказой
Картинка
Таблица
Название | Описание |
---|---|
Данные | Содержать информацию |
Движок | на котором можно сделать игру |
Расширение | это дополнение к движку |
Код
#include <iostream>
using namespace std;
int main(){
int x = -56;
int y = 56;
// Using noshowpos()
cout << "showpos flag: " << showpos << x << endl;
cout << "showpos flag: " << showpos << y << endl;
return 0;
}
Код с подсветкой
#includ <iostream>
using namespace std;
int main(){
int x = -56;
int y = 56;
// Using noshowpos()
cout << "showpos flag: " << showpos << x << endl;
cout << "showpos flag: " << showpos << y << endl;
return 0;
}
=======
Заголовок первого уровня
Заголовок второго уровня
Заголовок третьего уровня
Это просто абзац. В этом репозитории будут мои учебные программы. А в этом README будут заметки по программированию.
Это курсив (наклонный текст)
Это выделенный текст (жирный текст)
- Это 1-ый элемент списка
- Это 2-ой элемент списка
Это 3-ий элемент списка
eaebb19f3904b6adf380954be7f9a94400c3322f