Марш-бросок по основам языка

Давайте разберём самую базовую базу С++, необходимую для написания минимально полезных программ на C++.

Мы не будем вдаваться в конкретные подробности каждой темы и вообще в целом будем обо всём говорить поверхностно. Но основная цель данного урока - это просто как можно быстрее преодолеть вот этот порог, до которого "непонятно как" писать код на C++.

Переменные

Как мы упоминали ранее, С++ - это сильно типизированный язык. Это значит, что для каждой функции, для каждой переменной, и т.д. мы должны явно чётко указывать тип. Переменные на С++ объявляются следующим образом:

/*тип переменной*/ /*название переменной*/;

Пример: объявление переменной типа int с именем a:

int a = 1;

страуструп б. - программирование. принципы и практика с использованием c++

В языке С++ предусмотрен довольно широкий выбор типов (см. раздел А.8). Однако можно создавать прекрасные программы, обходясь лишь пятью из них.

int number_of_steps = 39; // int - для целых чисел
double flyinq_time = 3.5; // double - для чисел с плавающей точкой
char decimal_point = '.'; // char - для СИМВ ОЛОВ
string name = "Annemarie"; // string - для строк
bool tap_on = true ; // bool - для логических переменных

Но учтите, что string записывается как std::string - это часть стандартной библиотеки, или же стандартного пространства имён. Про пространства имён поговорим в следующих занятиях.

Скорее всего, с названием переменной у вас не будет проблем, но вот основные правила именования:

  • Имена переменных могут состоять только из букв, цифр и нижних подчёркиваний
  • Имена переменных не могут начинаться с цифры
  • В качестве имён переменных нельзя использовать ключевые слова C++ (return, int, double, ...) Обратите внимание! Если не инициализировать переменную при создании (то есть если ей не присвоить какое-то значение), то в ней будут лежать мусорные данные, состав которых предсказать невозможно! Поэтому, при создании переменной, обязательно нужно в неё что-то "класть" (ну, кроме случаев, когда из контекста понятно, что не будет доступа к инициализированной памяти):\
int a = 1; // правильно
int b; // тоже правильно; сразу же считываем значение b с консоли
std::cin >> b;
int c; // ОШИБКА!
std::cout << c;

Основные операторы

Арифметика

  • + - сложение
  • - - вычитание
  • * - умноженгие
  • / - деление
  • % - взятие остатка от деления

Пример :

int a = 5;
int b = a + 2; // b = 7
b = b - 3; // b = 4
b = b * 10; // b = 40
b = b / 2; // b = 20
b = b % 7; // b = 1 -> 21 - 20 = 1. Стандартный трюк проверки числа на делимость.

Бинарные операторы

  • ^ - XOR (исключающее или)
  • | - OR (бинарное или)
  • & - AND (бинарное и)
  • ~ - бинарное отрицание
  • << - бинарный сдвиг влево
  • >> - бинарный сдвиг вправо

Пример:

int a = 5; // 101
a = a & 4; // 100
a = a | 3; // 111
a = a << 3; // 111000
a = a >> 2; // 1110
int b = ~a; // b = 11111111111111111111111111110001 (-15)

Почему ~a получается таким большим, мы узнаем позже

Логические операторы

  • || - логическое или
  • && - логическое и
  • ! - логическое отрицание

Операторы сравнения

  • < - меньше
  • > - больше
  • <= - меньше/равно
  • >= - больше/равно
  • == - сравнение
  • != - не равняется

Логические операторы и операторы сравнения подробнее будут рассмотрены далее.

На первых порах вам не понадобяться все эти операторы. Просто бегло посмотрите, что тут есть, и выберите нужное.

Условные выражения

if (/*какое-то условие*/)
{
	// что-то делаем
}
else if (/*какое-то ещё условие*/)
{
	// то-то это делаем
}
else
{
	// в крайнем случае делаем вот это
}

Внутри круглых скобочек if и else if нужно использовать какие-то логические выражения, которые составляются при помощи логических операторов и операторов сравнения, например:

if (1 < 2) // ...
if (first_value == second_value) // ...
if (1 > 0 && 5 < 6) // ...
if (a != b) // ...

Циклы

while

while (/*какое-то условие*/)
{
	// что-то делаем
}

Цикл while - пока условие будет выполняться, выполняем какой-то набор команд.

Набор операций, записанный здесь в фигурных скобках, называется телом цикла.

Схематически while можно описать так:

  1. Проверь условие
  2. Если условие выполняется, выполни тело цикла. Если нет, выход из цикла
  3. Перейди к шагу 1.

do while

do
{
	// что-то делаем
}
while (/* какое-то условие */)

Если нам нужно, чтобы тело цикла выполнилось как минимум один раз, мы можем использовать do-while.

Схематически do while можно описать так:

  1. Выполни тело цикла
  2. Проверь условие
  3. Если условие выполняется, перейди к первому шагу

for

Здесь уже поинтереснее. С помощью for мы можем создавать более сложные и выразительные циклы. Но стоит понимать, что любой цикл for можно заменить на цикл while с небольшим изменением кода.

Цикл for записывается следующим образом:

for (/* выражение 1*/; /* выражение 2 */; /*выражение 3 */)
{

}
  • Выражение 1 - это операция, которую надо выполнить один раз перед запуском цикла
  • Выражение 2 - это условие, при выполнении которого цикл будет завершён
  • Выражение 3 - это операция, которая будет выполнена после каждого тела цикла

Пример:

for (int i = 0; i < 10; i = i + 1)
{
	std::cout << i << std::endl;
}

В этом коде мы выводим на экран все числа от 0 до 9 включительно.

  1. Перед выполнением цикла мы выполняем операцию int i = 0, то есть создаём переменную i и помещаем в неё 0
  2. Далее мы в цикле выводим на экран переменную i, и потом выполняем операцию i = i + 1, то есть увеличиваем i на 1
  3. После этого проверям условие i < 10, то есть, если i становится равным 10, мы выходим из цикла

задание

Переписать этот цикл, используя while

Функции

Для того, чтобы переиспользовать единожды записанный код, в С++ существуют функции (так же, как и в любом другом адекватном ЯП).

База

Синтаксис написания функций примерно следующий:

/*возвращаемый тип*/ /*название функции*/ (/*аргументы*/)
{
	// тело функции - что-то делаем
}

Аргументы записываются следующим образом:

(/*тип аргумента 1*/ /*имя аргумента 1*/, /*тип аргумента 2*/ /*.....*/)

Чтобы вернуть какое-то значение из функции, мы используем ключевое слово return:

return "nya-nya-nya :3";

Пример самой базовой функции:

int mystery_function(int a, int b)
{
	return a + b;
}

задание

Что делает эта функция?

Что происходит в этом коде?

  • Мы объявили функцию, которая называется mystery_function
  • Она возвращает значение типа int (целое число)
  • Функция принимает два аргумента типа int (a и b)
  • В теле функции мы возвращаем из функции значение, равное сумме переменных a и b

В коде вызвать функцию можно следующим образом:

std::cout << mystery_function(1, 2) << std::endl;
int large_number = mystery_function(101, 107);

Процедуры

Чтобы объявить процедуру (функцию, которая не возвращает никакого значения), используется ключевое слово void:

void procedure()
{
	std::cout << "I am procedure!\n";
}

Так же, как видите, можно объявлять функции, которые вообще не принимают аргументов

Значения аргументов по умолчанию

int whats_my_age(int born_year = 2000)
{
	std::cout << "You were born " << 2024 - born_year << " years ago\n";
}учтите, что string записывается как std::string - это часть стандартной библиотеки, или же стандартного пространства имён. Про пространства имён поговорим в следующих занятиях.

Скорее всего, с названием переменной у вас не будет проблем, но вот основные правила именования:


```cpp
std::cout << whats_my_age(1900) << std::endl; // выведется 124
std::cout << whats_my_age() << std::endl; // вывдедется 24

Ввод переменной из терминала

int a;
std::cin >> a;

Заключение

В принципе, на этом самые базовые инструменты для программирования на C++ закончились. Мы умеем создавать и инициализировать переменные, проводить над ними какие-то операции, умеем составлять условные выражения и циклы, а также можем выносить код в функции.

Также мы познакомились с основами работы с терминалом (ввод/вывод текста).

На этой основе уже можно, с небольшими оговорками, спокойно решить ЕГЭ по информатике, решать самые базовые олимпиадные задачки по программированию, и даже делать примитивные функциональные приложения.