Марш-бросок по основам языка
Давайте разберём самую базовую базу С++, необходимую для написания минимально полезных программ на 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.
do while
do
{
// что-то делаем
}
while (/* какое-то условие */)
Если нам нужно, чтобы тело цикла выполнилось как минимум один раз, мы можем использовать do-while
.
Схематически do while
можно описать так:
- Выполни тело цикла
- Проверь условие
- Если условие выполняется, перейди к первому шагу
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 включительно.
- Перед выполнением цикла мы выполняем операцию
int i = 0
, то есть создаём переменнуюi
и помещаем в неё 0 - Далее мы в цикле выводим на экран переменную
i
, и потом выполняем операциюi = i + 1
, то есть увеличиваемi
на 1 - После этого проверям условие
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++ закончились. Мы умеем создавать и инициализировать переменные, проводить над ними какие-то операции, умеем составлять условные выражения и циклы, а также можем выносить код в функции.
Также мы познакомились с основами работы с терминалом (ввод/вывод текста).
На этой основе уже можно, с небольшими оговорками, спокойно решить ЕГЭ по информатике, решать самые базовые олимпиадные задачки по программированию, и даже делать примитивные функциональные приложения.