ProgrammingFA via @like
УРОК №4 -
Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. В этом уроке мы научимся программировать циклы на C++, после чего посчитаем сумму всех чисел от 1 до 1000.
ЦИКЛ for
Если мы знаем точное количество действий (итераций) цикла, то можем использовать цикл for. Синтаксис его выглядит примерно так:
Существует частный случай этой записи, который мы сегодня и разберем:
Получается, цикл for работает по следующему алгоритму:
1) Сначала присваивается первоначальное значение счетчику, после чего ставится точка с запятой.
2) Затем задается конечное значение счетчика цикла. После того, как значение счетчика достигнет указанного предела, цикл завершится. Снова ставим точку с запятой.
3) Задаем шаг цикла. Шаг цикла — это значение, на которое будет увеличиваться или уменьшаться счетчик цикла при каждом проходе.
Напишем программу, которая будет считать сумму всех чисел от 1 до 1000.
Заметьте, что конечное значение счетчика я задал нестрогим неравенством (
В теле цикла, при каждом проходе программа увеличивает значение переменной sum на i. Еще один очень важный момент — в начале программы я присвоил переменной sum значение нуля. Если бы я этого не сделал, программа выдала бы ошибку.
На следующем уроке рассмотрим другие виды циклов, а пока домашнее задание, которое, как ни иронично, почти никто не выполняет:
Составить программу, которая будет выводить сумму всех четных чисел от 1 до 100. Подсказка: можно выполнить это, используя только цикл for или же можно использовать конструкцию if в цикле for. По вашему желанию! Присылайте результат в наш чат и обращайтесь по вопросам!
Циклы в C++ (FOR)
Внимание! Одна из самых важных тем! Просим делать домашку! Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. В этом уроке мы научимся программировать циклы на C++, после чего посчитаем сумму всех чисел от 1 до 1000.
ЦИКЛ for
Если мы знаем точное количество действий (итераций) цикла, то можем использовать цикл for. Синтаксис его выглядит примерно так:
for (действие до начала цикла;
условие продолжения цикла;
действия в конце каждой итерации цикла) {
инструкция цикла;
инструкция цикла 2;
инструкция цикла N;
}
Итерацией цикла называется один проход этого цикла.Существует частный случай этой записи, который мы сегодня и разберем:
for (счетчик = значение; счетчик < значение; шаг цикла) {
тело цикла;
}
Счетчик цикла — это переменная, в которой хранится количество проходов данного цикла.Получается, цикл for работает по следующему алгоритму:
1) Сначала присваивается первоначальное значение счетчику, после чего ставится точка с запятой.
2) Затем задается конечное значение счетчика цикла. После того, как значение счетчика достигнет указанного предела, цикл завершится. Снова ставим точку с запятой.
3) Задаем шаг цикла. Шаг цикла — это значение, на которое будет увеличиваться или уменьшаться счетчик цикла при каждом проходе.
Напишем программу, которая будет считать сумму всех чисел от 1 до 1000.
1 #include <iostream>
2 using namespace std;
3
4 int main()
5 {
6 setlocale(LC_ALL, "Russian");
7 int sum = 0; // сумма чисел
8 int i; // счетчик цикла
9 for (i = 1; i <= 1000; i++) // задаем начальное значение 1, конечное 1000 и задаем шаг цикла +1.
10 { // помните, что их можно опустить, если операция одна
11 sum = sum + i;
12 }
13 cout << "Сумма чисел от 1 до 1000 = " << sum << endl;
14 return 0;
15 }
Если мы скомпилируем этот код и запустим программу, то она покажет нам ответ: 500500. Это и есть сумма всех целых чисел от 1 до 1000. Если считать это вручную, понадобится очень много времени и сил. Цикл выполнил всю рутинную работу за нас.Заметьте, что конечное значение счетчика я задал нестрогим неравенством (
<=
— меньше либо равно), поскольку, если бы я поставил знак меньше, то цикл произвел бы 999 итераций, т.е. на одну меньше, чем требуется. Это довольно важный момент, т.к. здесь новички часто допускают ошибки, особенно при работе с массивами (о них будет рассказано в следующем уроке). Значение шага цикла я задал равное единице. i++
— это тоже самое, что и i = i + 1
.В теле цикла, при каждом проходе программа увеличивает значение переменной sum на i. Еще один очень важный момент — в начале программы я присвоил переменной sum значение нуля. Если бы я этого не сделал, программа выдала бы ошибку.
На следующем уроке рассмотрим другие виды циклов, а пока домашнее задание, которое, как ни иронично, почти никто не выполняет:
Составить программу, которая будет выводить сумму всех четных чисел от 1 до 100. Подсказка: можно выполнить это, используя только цикл for или же можно использовать конструкцию if в цикле for. По вашему желанию! Присылайте результат в наш чат и обращайтесь по вопросам!
ProgrammingFA via @like
Важная новость!
На следующей неделе запускаем нашего бота, который будет, как мы предполагаем, очень полезным для изучения языков программирования.
Задачи, компилятор, обсуждения и ваш собственный рейтинг! 🔥
Для поддержки канала и проекта:
998935097243, 998974230835 - Qiwi
На следующей неделе запускаем нашего бота, который будет, как мы предполагаем, очень полезным для изучения языков программирования.
Задачи, компилятор, обсуждения и ваш собственный рейтинг! 🔥
Для поддержки канала и проекта:
998935097243, 998974230835 - Qiwi
УРОК №5 -
Ниже приведен исходный код программы, считающей сумму всех целых чисел от 1 до 1000.
Теперь давайте рассмотрим по порядку исходный код нашей программы. Сначала мы инициализируем счетчик цикла и переменную, хранящую сумму чисел.
В данном случае мы обязательно должны присвоить счетчику цикла какое-либо значение, т.к. в предыдущей программе мы это значение присваивали внутри цикла for, здесь же, если мы не инициализируем счетчик цикла, то в него попадет «мусор» и компилятор в лучшем случае выдаст нам ошибку, а в худшем, если программа соберется — сегфолт практически неизбежен.
Затем мы описываем условие цикла — «пока переменная i меньше 1000 — выполняй цикл». При каждой итерации цикла значение переменной-счетчика i увеличивается на единицу внутри цикла.
Когда выполнится 1000 итераций цикла, счетчик станет равным 999 и следующая итерация уже не выполнится, поскольку 1000 не меньше 1000. Выражение sum += i является укороченной записью sum = sum + i.
После окончания выполнения цикла, выводим сообщение с ответом.
Циклы в C++ (while, do while)
Когда мы не знаем, сколько итераций должен произвести цикл, нам понадобится цикл while или do...while. Синтаксис цикла while в C++ выглядит следующим образом.while (Условие) {
Тело цикла;
}
Данный цикл будет выполняться, пока условие, указанное в круглых скобках является истиной. Решим ту же задачу с помощью цикла while. Хотя здесь мы точно знаем, сколько итераций должен выполнить цикл, очень часто бывают ситуации, когда это значение неизвестно.Ниже приведен исходный код программы, считающей сумму всех целых чисел от 1 до 1000.
1 #include <iostream>
2 using namespace std;
3
4 int main()
5 {
6 setlocale(LC_ALL, "Russian");
7 int i = 0; // инициализируем счетчик цикла.
8 int sum = 0; // инициализируем счетчик суммы.
9 while (i < 1000)
10 {
11 i++;
12 sum += i;
13 }
14 cout << "Сумма чисел от 1 до 1000 = " << sum << endl;
15 return 0;
16 }
После компиляции программа выдаст результат, аналогичный результату работы предыдущей программы. Но поясним несколько важных моментов. Я задал строгое неравенство в условии цикла и инициализировал счетчик i нулем, так как в цикле while происходит на одну итерацию больше, потому он будет выполняться, до тех пор, пока значение счетчика перестает удовлетворять условию, но данная итерация все равно выполнится. Если бы мы поставили нестрогое неравенство, то цикл бы закончился, когда переменная i стала бы равна 1001 и выполнилось бы на одну итерацию больше.Теперь давайте рассмотрим по порядку исходный код нашей программы. Сначала мы инициализируем счетчик цикла и переменную, хранящую сумму чисел.
В данном случае мы обязательно должны присвоить счетчику цикла какое-либо значение, т.к. в предыдущей программе мы это значение присваивали внутри цикла for, здесь же, если мы не инициализируем счетчик цикла, то в него попадет «мусор» и компилятор в лучшем случае выдаст нам ошибку, а в худшем, если программа соберется — сегфолт практически неизбежен.
Затем мы описываем условие цикла — «пока переменная i меньше 1000 — выполняй цикл». При каждой итерации цикла значение переменной-счетчика i увеличивается на единицу внутри цикла.
Когда выполнится 1000 итераций цикла, счетчик станет равным 999 и следующая итерация уже не выполнится, поскольку 1000 не меньше 1000. Выражение sum += i является укороченной записью sum = sum + i.
После окончания выполнения цикла, выводим сообщение с ответом.
ProgrammingFA via @like
Цикл do while
Цикл do while очень похож на цикл while. Единственное их различие в том, что при выполнении цикла do while один проход цикла будет выполнен независимо от условия. Решение задачи на поиск суммы чисел от 1 до 1000, с применением цикла do while.1 #include <iostream>
2 using namespace std;
3
4 int main ()
5 {
6 setlocale(0, "");
7 int i = 0; // инициализируем счетчик цикла.
8 int sum = 0; // инициализируем счетчик суммы.
9 do {// выполняем цикл.
10 i++;
11 sum += i;
12 } while (i < 1000); // пока выполняется условие.
13 cout << "Сумма чисел от 1 до 1000 = " << sum << endl;
14 return 0;
15 }
Принципиального отличия нет, но если присвоить переменной i значение, большее, чем 1000, то цикл все равно выполнит хотя бы один проход.Попрактикуйтесь, поэкспериментируйте над собственными примерами задач.
Циклы — очень важная вещь, поэтому им стоит уделить побольше внимания.
Домашнее задание
1) Уровень: легкий
Вводится число. Преобразовать его в другое число, цифры которого будут следовать в обратном порядке по сравнению с введенным числом.
2) Уровень: средний (логика + тонкости языка)
Написать программу которая может вывести целые числа от
МОЖНО воспользоваться только:
- одной переменной;
- одним оператором цикла
НЕЛЬЗЯ пользоваться:
- логическими операторами;
- условными операторами if, switch;
- тернарным оператором
3) Уровень: выше среднего
Дано число n. Переведите его в двоичную систему счисления.
Пишем в наш чат при возникновении вопросов
1) Уровень: легкий
Вводится число. Преобразовать его в другое число, цифры которого будут следовать в обратном порядке по сравнению с введенным числом.
2) Уровень: средний (логика + тонкости языка)
Написать программу которая может вывести целые числа от
0
до 255
включительно при этом МОЖНО воспользоваться только:
- одной переменной;
- одним оператором цикла
(do while)
; НЕЛЬЗЯ пользоваться:
- логическими операторами;
- условными операторами if, switch;
- тернарным оператором
(?:)
.3) Уровень: выше среднего
Дано число n. Переведите его в двоичную систему счисления.
Пишем в наш чат при возникновении вопросов
ProgrammingFA via @like
УРОК №6 -
Возьмем группу студентов из десяти человек. У каждого из них есть фамилия. Создавать отдельную переменную для каждого студента — не рационально. Создадим массив, в котором будут храниться фамилии всех студентов.
Пример инициализации массива
Чтобы описать элементы массива сразу при его создании, можно использовать фигурные скобки. В фигурных скобках значения элементов массива перечисляются через запятую. В конце закрывающей фигурной скобки ставится точка с запятой.
Попробуем вывести первый элемент массива — фамилию студента Иванова.
В большинстве языков программирования нумерация элементов массива также начинается с нуля.
Попробуем вывести список всех студентов. Но сначала подумаем, а что если бы вместо группы из десяти студентов, была бы кафедра их ста, факультет из тысячи, или даже весь университет? Ну не будем же мы писать десятки тысяч строк с cout?
Конечно же нет! Мы возьмем на вооружение циклы, о которых были написаны 2 предыдущих урока.
Заметьте что счетчик нашего цикла начинается с нуля, а заканчивается девяткой. Если вместо оператора строгого неравенства — i < 10 использовать оператор «меньше, либо равно» — i <= 10, то на последней итерации программа обратится к несуществующему элементу массива — students[10]. Это может привести к ошибкам сегментации и аварийному завершению программы. Будьте внимательны — подобные ошибки бывает сложно отловить.
Объявление массива без инициализации
Массивы
В этом уроке мы с поговорим о массивах. Вы уже знаете, что переменная — это ячейка в памяти компьютера, где может храниться одно единственное значение. Массив — это область памяти, где могут последовательно храниться несколько значений.Возьмем группу студентов из десяти человек. У каждого из них есть фамилия. Создавать отдельную переменную для каждого студента — не рационально. Создадим массив, в котором будут храниться фамилии всех студентов.
Пример инициализации массива
string students[10] = {
"Иванов", "Петров", "Сидоров", "Ахмедов", "Ерошкин", "Выхин", "Андеев", "Вин Дизель", "Картошкин", "Чубайс"
};
Массив создается почти так же, как и обычная переменная. Для хранения десяти фамилий нам нужен массив, состоящий из 10 элементов. Количество элементов массива задается при его объявлении и заключается в квадратные скобки.Чтобы описать элементы массива сразу при его создании, можно использовать фигурные скобки. В фигурных скобках значения элементов массива перечисляются через запятую. В конце закрывающей фигурной скобки ставится точка с запятой.
Попробуем вывести первый элемент массива — фамилию студента Иванова.
1 #include <iostream>
2 #include <string>
3
4 int main()
5 {
6 std::string students[10] ={
7 "Иванов", "Петров", "Сидоров",
8 "Ахмедов", "Ерошкин", "Выхин",
9 "Андеев", "Вин Дизель", 10 "Картошкин", "Чубайс"
11 };
12 std::cout << students[0] << std::endl;
13 return 0;
14 }
Смотрим, компилируем, запускаем. Убедились, что вывелся именно «Иванов». Заметьте, что нумерация элементов массива в C++ начинается с нуля. Следовательно, фамилия первого студента находится в students[0], а фамилия последнего — в students[9].В большинстве языков программирования нумерация элементов массива также начинается с нуля.
Попробуем вывести список всех студентов. Но сначала подумаем, а что если бы вместо группы из десяти студентов, была бы кафедра их ста, факультет из тысячи, или даже весь университет? Ну не будем же мы писать десятки тысяч строк с cout?
Конечно же нет! Мы возьмем на вооружение циклы, о которых были написаны 2 предыдущих урока.
1 #include <iostream>
2 #include <string>
3
4 int main()
5 {
6 std::string students[10] = {
7 "Иванов", "Петров", "Сидоров",
8 "Ахмедов", "Ерошкин", "Выхин",
9 "Андеев", "Вин Дизель", "Картошкин", "Чубайс"
10 };
11 for (int i = 0; i < 10; i++)
12 {
13 std::cout << students[i] << std::endl;
14 }
15 return 0;
16 }
Если бы нам пришлось выводить массив из нескольких тысяч фамилий, то мы бы просто увеличили конечное значение счетчика цикла — строку for (...; i < 10; ...) заменили на for (...; i < 10000; ...).Заметьте что счетчик нашего цикла начинается с нуля, а заканчивается девяткой. Если вместо оператора строгого неравенства — i < 10 использовать оператор «меньше, либо равно» — i <= 10, то на последней итерации программа обратится к несуществующему элементу массива — students[10]. Это может привести к ошибкам сегментации и аварийному завершению программы. Будьте внимательны — подобные ошибки бывает сложно отловить.
Объявление массива без инициализации
string students[10];
// или
string teachers[5];
При создании статического массива, для указания его размера может использоваться только константа. Размер выделяемой памяти определяется на этапе компиляции и не может изменяться в процессе выполнения.Домашнее задание
1) Уровень: легкий
Написать программу для зеркального переворота элементов в массиве
2) Уровень: средний
Найдите произведение элементов массива с нечетными номерами.
3) Уровень: выше среднего
Вывести на экран значения массива по спирали. Будем понимать под этим следующее. Если массив состоит из 100 элементов, то выводить по 10 элементов в каждой строке, при этом каждая вторая строка должна выводиться "задом наперед": сначала последние элементы строки, а затем первые.
1) Уровень: легкий
Написать программу для зеркального переворота элементов в массиве
([1, 2, 3, 4] -> [4, 3, 2, 1])
.2) Уровень: средний
Найдите произведение элементов массива с нечетными номерами.
3) Уровень: выше среднего
Вывести на экран значения массива по спирали. Будем понимать под этим следующее. Если массив состоит из 100 элементов, то выводить по 10 элементов в каждой строке, при этом каждая вторая строка должна выводиться "задом наперед": сначала последние элементы строки, а затем первые.
УРОК №7 -
Сегодня мы поговорим о функциях в C++. Очень часто в программировании необходимо выполнять одни и те же действия. Например, мы хотим выводить пользователю сообщения об ошибке в разных местах программы, если он ввел неверное значение. Без функций это выглядело бы так:
- Любая функция имеет тип, также, как и любая переменная.
- Функция может возвращать значение, тип которого в большинстве случаев аналогично типу самой функции.
- Если функция не возвращает никакого значения, то она должна иметь тип void (такие функции иногда называют процедурами)
- При объявлении функции, после ее типа должно находиться имя функции и две круглые скобки — открывающая и закрывающая, внутри которых могут находиться один или несколько аргументов функции, которых также может не быть вообще.
- После списка аргументов функции ставится открывающая фигурная скобка, после которой находится само тело функции.
- В конце тела функции обязательно ставится закрывающая фигурная скобка.
Также существует такое понятие, как параметры функции по умолчанию. Такие параметры можно не указывать при вызове функции, т.к. они примут значение по умолчанию, указанно после знака присваивания после данного параметра и списке всех параметров функции.
В предыдущих примерах мы использовали функции типа void, которые не возвращают никакого значения. Как многие уже догадались, оператор
Рассмотрим пример функции, возвращающей значение на примере проверки пароля.
Самой первой выполняется функция
Функции
Поздравляем вас с новым 2019 годом🎉 и, надеемся, в этом году вы продолжите усердно (или не очень, ну мы надеемся на обратное) работать над навыком программирования на C++🔥Сегодня мы поговорим о функциях в C++. Очень часто в программировании необходимо выполнять одни и те же действия. Например, мы хотим выводить пользователю сообщения об ошибке в разных местах программы, если он ввел неверное значение. Без функций это выглядело бы так:
1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5
6 int main()
7 {
8 string valid_pass = "qwerty123";
9 string user_pass;
10 cout << "Введите пароль: ";
11 getline(cin, user_pass);
12 if (user_pass == valid_pass) {
13 cout << "Доступ разрешен." << endl;
14 } else {
15 cout << "Неверный пароль!" << endl;
16 }
17 return 0;
18 }
А вот аналогичный пример с функцией:1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5
6 void check_pass (string password)
7 {
8 string valid_pass = "qwerty123";
9 if (password == valid_pass) {
10 cout << "Доступ разрешен." << endl;
11 } else {
12 cout << "Неверный пароль!" << endl;
13 }
14 }
15
16 int main()
17 {
18 string user_pass;
19 cout << "Введите пароль: ";
20 getline (cin, user_pass);
21 check_pass (user_pass);
22 return 0;
23 }
По сути, после компиляции не будет никакой разницы для процессора, как для первого кода, так и для второго. Но ведь такую проверку пароля мы можем делать в нашей программе довольно много раз. И тогда получается копипаста и код становится нечитаемым. Функции — один из самых важных компонентов языка C++.- Любая функция имеет тип, также, как и любая переменная.
- Функция может возвращать значение, тип которого в большинстве случаев аналогично типу самой функции.
- Если функция не возвращает никакого значения, то она должна иметь тип void (такие функции иногда называют процедурами)
- При объявлении функции, после ее типа должно находиться имя функции и две круглые скобки — открывающая и закрывающая, внутри которых могут находиться один или несколько аргументов функции, которых также может не быть вообще.
- После списка аргументов функции ставится открывающая фигурная скобка, после которой находится само тело функции.
- В конце тела функции обязательно ставится закрывающая фигурная скобка.
Также существует такое понятие, как параметры функции по умолчанию. Такие параметры можно не указывать при вызове функции, т.к. они примут значение по умолчанию, указанно после знака присваивания после данного параметра и списке всех параметров функции.
В предыдущих примерах мы использовали функции типа void, которые не возвращают никакого значения. Как многие уже догадались, оператор
return
используется для возвращения вычисляемого функцией значения.Рассмотрим пример функции, возвращающей значение на примере проверки пароля.
1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5
6 string check_pass (string password)
7 {
8 string valid_pass = "qwerty123";
9 string error_message;
10 if (password == valid_pass) {
11 error_message = "Доступ разрешен.";
12 } else {
13 error_message = "Неверный пароль!";
14 }
15 return error_message;
16 }
17
18 int main()
19 {
20 string user_pass;
21 cout << "Введите пароль: ";
22 getline (cin, user_pass);
23 string error_msg = check_pass (user_pass);
24 cout << error_msg << endl;
25 return 0;
26 }
В данном случае функция check_pass
имеет тип string, следовательно она будет возвращать только значение типа string, иными словами говоря строку. Давайте рассмотрим алгоритм работы этой программы.Самой первой выполняется функция
main()
, которая должна присутствовать в каждой программе. Теперь мы объявляем переменную user_pass
типа string, затем выводим пользователю сообщение «Введите пароль», который после ввода попадает в строку user_pass. А вот дальше начинает работать наша собственная функция check_pass()
.ProgrammingFA via @like
В качестве аргумента этой функции передается строка, введенная пользователем.
Аргумент функции — это, если сказать простым языком переменные или константы вызывающей функции, которые будет использовать вызываемая функция.
При объявлении функций создается формальный параметр, имя которого может отличаться от параметра, передаваемого при вызове этой функции. Но типы формальных параметров и передаваемых функии аргументов в большинстве случаев должны быть аналогичны.
После того, как произошел вызов функции
Теперь эта строка в полном распоряжении функции (хочу обратить Ваше внимание на то, что переменные и константы, объявленные в разных функциях независимы друг от друга, они даже могут иметь одинаковые имена. В следующих уроках мы расскажем о том, что такое область видимости, локальные и глобальные переменные).
Теперь мы проверяем, правильный ли пароль ввел пользователь или нет. Если пользователь ввел правильный пароль, присваиваем переменной error_message соответствующее значение. если нет, то сообщение об ошибке.
После этой проверки мы возвращаем переменную error_message. На этом работа нашей функции закончена. А теперь, в функции
Также, можно организовать повторный ввод пароля с помощью рекурсии (о ней мы еще поговорим). Если объяснять вкратце, рекурсия — это когда функция вызывает сама себя. Смотрите еще один пример:
Не расстраивайтесь, если не сразу поймете все аспекты функций в C++, т. к. это довольно сложная тема и мы еще будем разбирать примеры с функциями в следующих уроках.
Аргумент функции — это, если сказать простым языком переменные или константы вызывающей функции, которые будет использовать вызываемая функция.
При объявлении функций создается формальный параметр, имя которого может отличаться от параметра, передаваемого при вызове этой функции. Но типы формальных параметров и передаваемых функии аргументов в большинстве случаев должны быть аналогичны.
После того, как произошел вызов функции
check_pass()
, начинает работать данная функция. Если функцию нигде не вызвать, то этот код будет проигнорирован программой. Итак, мы передали в качестве аргумента строку, которую ввел пользователь.Теперь эта строка в полном распоряжении функции (хочу обратить Ваше внимание на то, что переменные и константы, объявленные в разных функциях независимы друг от друга, они даже могут иметь одинаковые имена. В следующих уроках мы расскажем о том, что такое область видимости, локальные и глобальные переменные).
Теперь мы проверяем, правильный ли пароль ввел пользователь или нет. Если пользователь ввел правильный пароль, присваиваем переменной error_message соответствующее значение. если нет, то сообщение об ошибке.
После этой проверки мы возвращаем переменную error_message. На этом работа нашей функции закончена. А теперь, в функции
main()
, то значение, которое возвратила наша функция мы присваиваем переменной error_msg
и выводим это значение (строку) на экран терминала.Также, можно организовать повторный ввод пароля с помощью рекурсии (о ней мы еще поговорим). Если объяснять вкратце, рекурсия — это когда функция вызывает сама себя. Смотрите еще один пример:
1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5
6 bool password_is_valid (string password)
7 {
8 string valid_pass = "qwerty123";
9 if (valid_pass == password)
10 return true;
11 else
12 return false;
13 }
14
15 void get_pass ()
16 {
17 string user_pass;
18 cout << "Введите пароль: ";
19 getline(cin, user_pass);
20 if (!password_is_valid(user_pass)) {
21 cout << "Неверный пароль!";
22 get_pass (); // Здесь делаем рекурсию
23 } else {
24 cout << "Доступ разрешен.";
25 }
26 }
27
28 int main()
29 {
30 get_pass ();
31 return 0;
32 }
Функции очень сильно облегчают работу программисту и намного повышают читаемость и понятность кода, в том числе и для самого разработчика (не удивляйтесь этому, т. к. если вы откроете код, написанный вами полгода назад,не сразу поймете соль, поверьте на слово).Не расстраивайтесь, если не сразу поймете все аспекты функций в C++, т. к. это довольно сложная тема и мы еще будем разбирать примеры с функциями в следующих уроках.
Домашняя работа
1) Написать функцию которая отсортиртирует массив по возрастанию.
2) Написать функцию нахождения факториала от числа n (можно и итеративно, и рекурсивно);
3) Написать функцию бинарного поиска в линейном массиве (рекурсивно);
Дополнение к 3 задаче:
Написать программу, которая сравнивает скорость поиска элемента в массиве используя:
- бинарный поиск;
- обычный линейный поиск;
Присылайте домашнее задание в наш чат @ProgrammingFAchat
1) Написать функцию которая отсортиртирует массив по возрастанию.
2) Написать функцию нахождения факториала от числа n (можно и итеративно, и рекурсивно);
3) Написать функцию бинарного поиска в линейном массиве (рекурсивно);
Дополнение к 3 задаче:
Написать программу, которая сравнивает скорость поиска элемента в массиве используя:
- бинарный поиск;
- обычный линейный поиск;
Присылайте домашнее задание в наш чат @ProgrammingFAchat
Будет ли вам полезен бот, который будет проверять разные задачи по программированию (включая и домашку) и показывать ваш рейтинг по количеству решенных задач?
▪️ 94% (208) Да, супер🔥
🔸🔸🔸🔸🔸🔸🔸🔸
▫️ 5% (13) Нет, этот бот - трата времени
👥 221 - всего голосов
▪️ 94% (208) Да, супер🔥
🔸🔸🔸🔸🔸🔸🔸🔸
▫️ 5% (13) Нет, этот бот - трата времени
👥 221 - всего голосов
Просим прощения за огромную паузу между уроками, теперь уроки будут намного чаще, до 2-3 раз в неделю 🔥
УРОК №8 -
Если переменных в памяти потребуется слишком большое количество, которое не сможет вместить в себя сама аппаратная часть, произойдет перегрузка системы или её зависание.
Если мы объявляем переменные статично, так как мы делали в предыдущих уроках, они остаются в памяти до того момента, как программа завершит свою работу, а после чего уничтожаются.
Такой подход может быть приемлем в простых примерах и несложных программах, которые не требуют большого количества ресурсов. Если же наш проект является огромным программным комплексом с высоким функционалом, объявлять таким образом переменные, естественно, было бы довольно не умно.
Можете себе представить, если бы небезызвестная Battlefield 3 использовала такой метод работы с данными? В таком случае, самым заядлым геймерам пришлось бы перезагружать свои высоконагруженные системы кнопкой reset после нескольких секунд работы игры.
Дело в том, что играя в тот же Battlefield, геймер в каждый новый момент времени видит различные объекты на экране монитора, например сейчас я стреляю во врага, а через долю секунды он уже падает убитым, создавая вокруг себя множество спецэффектов, таких как пыль, тени, и т.п.
Естественно, все это занимает какое-то место в оперативной памяти компьютера. Если не уничтожать неиспользуемые объекты, очень скоро они заполнят весь объем ресурсов ПК.
По этим причинам, в большинстве языков, в том числе и
Мы можем обращаться, например к массиву данных через указатель, который будет содержать адрес начала диапазона ячеек памяти, хранящих этот массив.
После того, как этот массив станет не нужен для выполнения остальной части программы, мы просто освободим память по адресу этого указателя, и она вновь станет доступно для других переменных.
Ниже приведен конкретный пример обращения к переменным через указатель и напрямую.
Пример использования статических переменных
Выделение памяти осуществляется с помощью оператора new и имеет вид: тип_данных *имя_указателя = new тип_данных;, например
Логично предположить, что для разных типов данных выделяется разное количество памяти. Следует быть особенно осторожным при работе с памятью, потому что именно ошибки программы, вызванные утечкой памяти, являются одними из самых трудно находимых. На отладку программы в поисках одной ничтожной ошибки, может уйти час, день, неделя, в зависимости от упорности разработчика и объема кода.
Инициализация значения, находящегося по адресу указателя выполняется схожим образом, только в конце ставятся круглые скобки с нужным значением: тип данных *имя_указателя = new тип_данных(значение). В нашем примере это
Для того, чтобы получить адрес в памяти, на который ссылается указатель, используется имя переменной-указателя с префиксом
УРОК №8 -
Указатели
При выполнении любой программы, все необходимые для ее работы данные должныбыть загружены в оперативную память компьютера. Для обращения к переменным, находящимся в памяти, используются специальные адреса, которые записываются в шестнадцатеричном виде, например 0x100
или 0x200
.Если переменных в памяти потребуется слишком большое количество, которое не сможет вместить в себя сама аппаратная часть, произойдет перегрузка системы или её зависание.
Если мы объявляем переменные статично, так как мы делали в предыдущих уроках, они остаются в памяти до того момента, как программа завершит свою работу, а после чего уничтожаются.
Такой подход может быть приемлем в простых примерах и несложных программах, которые не требуют большого количества ресурсов. Если же наш проект является огромным программным комплексом с высоким функционалом, объявлять таким образом переменные, естественно, было бы довольно не умно.
Можете себе представить, если бы небезызвестная Battlefield 3 использовала такой метод работы с данными? В таком случае, самым заядлым геймерам пришлось бы перезагружать свои высоконагруженные системы кнопкой reset после нескольких секунд работы игры.
Дело в том, что играя в тот же Battlefield, геймер в каждый новый момент времени видит различные объекты на экране монитора, например сейчас я стреляю во врага, а через долю секунды он уже падает убитым, создавая вокруг себя множество спецэффектов, таких как пыль, тени, и т.п.
Естественно, все это занимает какое-то место в оперативной памяти компьютера. Если не уничтожать неиспользуемые объекты, очень скоро они заполнят весь объем ресурсов ПК.
По этим причинам, в большинстве языков, в том числе и
C/C++
, имеется понятие указателя. Указатель — это переменная, хранящая в себе адрес ячейки оперативной памяти, например 0x100
.Мы можем обращаться, например к массиву данных через указатель, который будет содержать адрес начала диапазона ячеек памяти, хранящих этот массив.
После того, как этот массив станет не нужен для выполнения остальной части программы, мы просто освободим память по адресу этого указателя, и она вновь станет доступно для других переменных.
Ниже приведен конкретный пример обращения к переменным через указатель и напрямую.
Пример использования статических переменных
int a; // Объявление статической переменнойПример использования динамических переменных
int b = 5; // Инициализация статической переменной b
a = 10;
b = a + b;
cout << "b is " << b << endl;
int *a = new int; // Объявление указателя для переменной типа int
int *b = new int(5); // Инициализация указателя
*a = 10;
*b = *a + *b;
cout << "b is " << *b << endl;
delete b;
delete a;
Рассмотрим общий синтаксис указателей в C++.Выделение памяти осуществляется с помощью оператора new и имеет вид: тип_данных *имя_указателя = new тип_данных;, например
int *a = new int;
. После удачного выполнения такой операции, в оперативной памяти компьютера происходит выделение диапазона ячеек, необходимого для хранения переменной типа int.Логично предположить, что для разных типов данных выделяется разное количество памяти. Следует быть особенно осторожным при работе с памятью, потому что именно ошибки программы, вызванные утечкой памяти, являются одними из самых трудно находимых. На отладку программы в поисках одной ничтожной ошибки, может уйти час, день, неделя, в зависимости от упорности разработчика и объема кода.
Инициализация значения, находящегося по адресу указателя выполняется схожим образом, только в конце ставятся круглые скобки с нужным значением: тип данных *имя_указателя = new тип_данных(значение). В нашем примере это
int *b = new int(5)
.Для того, чтобы получить адрес в памяти, на который ссылается указатель, используется имя переменной-указателя с префиксом
&
. перед ним (не путать со знаком ссылки в C++).ProgrammingFA via @like
Например, чтобы вывести на экран адрес ячейки памяти, на который ссылается указатель b во втором примере, мы пишем
Для того, чтобы получить значение, которое находится по адресу, на который ссылается указатель, используется префикс
Во втором примере мы выводим на экран значение, которое находится в ячейке памяти (у меня это
Чтобы изменить значение, находящееся по адресу, на который ссылается указатель, нужно также использовать звездочку, например, как во втором примере —
- Когда мы оперируем данными, то используем знак
Для того, чтобы освободить память, выделенную оператором
При использовании оператора delete для указателя, знак
cout << "Address of b is " << &b << endl;
. В моей системе, я получил значение 0x1aba030
. У вас оно может быть другим, потому что адреса в оперативной памяти распределяются таким образом, чтобы максимально уменьшить фрагментацию. Поскольку, в любой системе список запущенных процессов, а также объем и разрядность памяти могут отличаться, система сама распределяет данные для обеспечения минимальной фрагментации.Для того, чтобы получить значение, которое находится по адресу, на который ссылается указатель, используется префикс
*
. Данная операция называется разыменованием указателя.Во втором примере мы выводим на экран значение, которое находится в ячейке памяти (у меня это
0x1aba030
): cout << "b is " << *b << endl;
. В этом случае необходимо использовать знак *
.Чтобы изменить значение, находящееся по адресу, на который ссылается указатель, нужно также использовать звездочку, например, как во втором примере —
*b = *a + *b;
.- Когда мы оперируем данными, то используем знак
*
- Когда мы оперируем адресами, то используем знак &
В этих вещах очень часто возникают недопонимания, и кстати, не только у новичков. Многие из тех, кто начинал программировать с того же php, также часто испытывают подобную путаницу при работе с памятью.Для того, чтобы освободить память, выделенную оператором
new
, используется оператор delete
.При использовании оператора delete для указателя, знак
*
не используется.Домашняя работа
1) Реализовать функцию которая выводит строку в обрятном порядке, пример "hello" -> "olleh". Oбъявление функции которую нужно реализовать:
3) Объявить и заполнить двумерный динамический массив случайными числами от 10 до 50. Показать его на экран. Для заполнения и показа на экран написать отдельные функции. (подсказка: функции должны принимать три параметра – указатель на динамический массив, количество строк, количество столбцов). Количество строк и столбцов выбирает пользователь.
Присылайте домашнее задание в наш чат @ProgrammingFAchat
1) Реализовать функцию которая выводит строку в обрятном порядке, пример "hello" -> "olleh". Oбъявление функции которую нужно реализовать:
void str_rev(char* str);
2) Объявите указатель на массив типа double и предложите пользователю выбрать его размер. Далее напишите четыре функции: первая должна выделить память для массива, вторая – заполнить ячейки данными, третья – показать данные на экран, четвертая – освободить занимаемую память. Программа должна предлагать пользователю продолжать работу (создавать новые динамические массивы ) или выйти из программы.3) Объявить и заполнить двумерный динамический массив случайными числами от 10 до 50. Показать его на экран. Для заполнения и показа на экран написать отдельные функции. (подсказка: функции должны принимать три параметра – указатель на динамический массив, количество строк, количество столбцов). Количество строк и столбцов выбирает пользователь.
Присылайте домашнее задание в наш чат @ProgrammingFAchat
Грядет перезагрузка!
Мы, долго думая, решили перезапустить канал с новым контентом. Исходя из того, что очень много людей писали с просьбой сделать контент про Python, именно он и станет главной темой этого канала. Также мы планируем добавить новые интересные рубрики, которые будут покрывать самые различные темы в сфере программирования и не только.
Мы, долго думая, решили перезапустить канал с новым контентом. Исходя из того, что очень много людей писали с просьбой сделать контент про Python, именно он и станет главной темой этого канала. Также мы планируем добавить новые интересные рубрики, которые будут покрывать самые различные темы в сфере программирования и не только.
Оставайтесь с нами!
Какой из данных методик уроков вы предпочитаете?
Anonymous Poll
79%
Детальные последовательные уроки с азов языка Python
20%
Освещение главных тем и наиболее интересных моментов в изучении языка
2%
Предлагаю свой вариант
Python!
Язык Python является, пожалуй, самым простым в изучении и самым приятным в использовании из языков программирования, получивших широкое распространение. Программный код на языке Python легко читать и писать, и, будучи лаконичным, он не выглядит загадочным.
Python - очень выразительный язык, позволяющий уместить приложение в меньшее количество строк, чем на это потребовалось бы в других языках, таких как C++ или Java.
Python является кросс-платформенным языком: обычно одна и та же программа на языке Python может запускаться и в Windows, и в UNIX-подобных системах, таких как Linux, BSD и Mac OS, для чего достаточно просто скопировать файл или файлы, составляющие программу, на нужный компьютер; при этом даже не потребуется выполнять «сборку», или компилирование программы. Конечно, можно написать на языке Python программу, которая будет использовать некоторые характерные особенности конкретной операционной системы, но такая необходимость возникает крайне редко, т. к. практически вся стандартная библиотека языка Python и большинство библиотек сторонних производителей обеспечивают полную кросс-платформенность.
Одним из основных преимуществ языка Python является наличие полной стандартной библиотеки, позволяющей обеспечить загрузку файла из Интернета, распаковку архива или создание веб-сервера посредством написания нескольких строк программного кода. В дополнение к ней существуют тысячи дополнительных библиотек сторонних производителей, среди которых одни обеспечивают более сложные и более мощные возможности, чем стандартная - например, библиотека для организации сетевых взаимодействий
Python может использоваться для программирования в процедурном, в объектно-ориентированном и, в меньшей степени, в функциональном стиле программирования, хотя в глубине души Python - объектно-ориентированный язык программирования.
Применение Python
Существует множество областей применения Python, но в некоторых он особенно хорош. Таким образом, можно выделить 4 самых популярных направления применения Python:
- веб-разработка;
- data science: анализ данных и визуализация;
- машинное обучение;
- автоматизация процессов.
Кому интересно, подробнее о применении Python читайте здесь:
https://proglib.io/p/python-applications/
Обсуждаем пройденное в чате:
@ProgrammingFAchat
Язык Python является, пожалуй, самым простым в изучении и самым приятным в использовании из языков программирования, получивших широкое распространение. Программный код на языке Python легко читать и писать, и, будучи лаконичным, он не выглядит загадочным.
Python - очень выразительный язык, позволяющий уместить приложение в меньшее количество строк, чем на это потребовалось бы в других языках, таких как C++ или Java.
Python является кросс-платформенным языком: обычно одна и та же программа на языке Python может запускаться и в Windows, и в UNIX-подобных системах, таких как Linux, BSD и Mac OS, для чего достаточно просто скопировать файл или файлы, составляющие программу, на нужный компьютер; при этом даже не потребуется выполнять «сборку», или компилирование программы. Конечно, можно написать на языке Python программу, которая будет использовать некоторые характерные особенности конкретной операционной системы, но такая необходимость возникает крайне редко, т. к. практически вся стандартная библиотека языка Python и большинство библиотек сторонних производителей обеспечивают полную кросс-платформенность.
Одним из основных преимуществ языка Python является наличие полной стандартной библиотеки, позволяющей обеспечить загрузку файла из Интернета, распаковку архива или создание веб-сервера посредством написания нескольких строк программного кода. В дополнение к ней существуют тысячи дополнительных библиотек сторонних производителей, среди которых одни обеспечивают более сложные и более мощные возможности, чем стандартная - например, библиотека для организации сетевых взаимодействий
Twisted
и библиотека для решения вычислительных задач NumPy
; а другие предоставляют функциональность, которая слишком узконаправленно специализирована, чтобы ее можно было включить в стандартную библиотеку - например, пакет моделирования SimPy
.Python может использоваться для программирования в процедурном, в объектно-ориентированном и, в меньшей степени, в функциональном стиле программирования, хотя в глубине души Python - объектно-ориентированный язык программирования.
Применение Python
Существует множество областей применения Python, но в некоторых он особенно хорош. Таким образом, можно выделить 4 самых популярных направления применения Python:
- веб-разработка;
- data science: анализ данных и визуализация;
- машинное обучение;
- автоматизация процессов.
Кому интересно, подробнее о применении Python читайте здесь:
https://proglib.io/p/python-applications/
Обсуждаем пройденное в чате:
@ProgrammingFAchat
Библиотека программиста
3 самых важных сферы применения Python: возможности языка
Существует множество областей применения Python, но в некоторых он особенно хорош. Разбираемся, что же можно делать на этом ЯП.
А сегодня мы установим интерпретатор Python и попробуем написать нашу первую программу.
Windows:
Скачивать Python для Windows будем с официального сайта:
https://www.python.org/downloads/windows/
Под заголовком страницы следуют 2 ссылки - последний стабильный релиз для python2 и python3. Этот курс включает в себя изучение python3, именно третьей версии, не второй. Следовательно, мы и выбираем её.
После перехода по ссылке скачайте:
- Windows x86-64 executable installer (если у вас 64-разрядная система);
- Windows x86 executable installer (если система 32-разрядная).
После скачивания файла, запустите его и следуйте инструкциям установщика.
IDLE Python3 доступно теперь из пуска windows!
* IDLE (Integrated Development and Learning Environment) — это интегрированная среда разработки и обучения на языке Python.
Linux:
Для пользователей linux вся установка сводится к установке пакета python3.
Для ubuntu/debian:
Как и для linux, установка одной командой:
Пользователи Windows открывают Python3 IDLE из меню Пуск, а пользователи linux и macOS вводят в терминале
😱🎉🎊
Поздравляю! Только что Вы написали свою первую программу на Python3!
Поделитесь первой программой в чате:
@ProgrammingFAchat
Windows:
Скачивать Python для Windows будем с официального сайта:
https://www.python.org/downloads/windows/
Под заголовком страницы следуют 2 ссылки - последний стабильный релиз для python2 и python3. Этот курс включает в себя изучение python3, именно третьей версии, не второй. Следовательно, мы и выбираем её.
После перехода по ссылке скачайте:
- Windows x86-64 executable installer (если у вас 64-разрядная система);
- Windows x86 executable installer (если система 32-разрядная).
После скачивания файла, запустите его и следуйте инструкциям установщика.
IDLE Python3 доступно теперь из пуска windows!
* IDLE (Integrated Development and Learning Environment) — это интегрированная среда разработки и обучения на языке Python.
Linux:
Для пользователей linux вся установка сводится к установке пакета python3.
Для ubuntu/debian:
apt install python3Для arch:
pacman -S python3Для centOS:
yum install epel-release python36MacOS:
Как и для linux, установка одной командой:
brew install python3Написание первой программы
Пользователи Windows открывают Python3 IDLE из меню Пуск, а пользователи linux и macOS вводят в терминале
python3И после приглашения к вводу:
>>>Введите следующий текст и нажмите Enter:
print("Hello, world!")Hello, world!
😱🎉🎊
Поздравляю! Только что Вы написали свою первую программу на Python3!
Поделитесь первой программой в чате:
@ProgrammingFAchat
Python.org
Python Releases for Windows
The official home of the Python Programming Language