Как же всё-таки прекрасно, когда твой курс проходит настолько много великолепных людей. Весь курс пройдут и на все ошибки укажут, безумные решения придумают и в конце концов отзыв оставят.
❤6🆒1
Вы когда-нибудь слышали о
С помощью спецификатора
Мы должны указывать слово
Можно сказать, что
При объявлении
Мы можем выносить некоторые "магические числа" в отдельные переменные, улучшая читаемость кода.
Людям, которые плохо знакомы с математикой, может быть неясно, что такое
Лучше переписать этот код через
Теперь сразу становится понятно, что этот код вычисляет длину окружности через радиус.
Вынося "магические числа" в
Спецификатор
• Защитить переменные от случайного изменения
• Увеличить понятность кода засчёт вынесения магических чисел
• Прояснять назначение некоторых переменных, например, численных идентификаторов
Также
#интересные_факты
const в C++?С помощью спецификатора
const мы можем пометить, что объявляемая переменная не будет изменяться. Так любая операция изменения переменной приведёт к ошибке.Сокращение const происходит от constant - постоянный
Мы должны указывать слово
const в типе данных переменной:const int number = 15;
const float pi = 3.14;
Можно сказать, что
number имеет тип const int, а pi – const double. Слово const влияет на поведение значения переменной, а не самой переменной, поэтому оно является частью типа данных.const int length = 13;
length = 15; // ошибка
// нельзя изменять const переменные
cin >> length; // тоже ошибка
// cin присваивает length новое значение
// а это не вызовет ошибки
int new_length = length + 2;
// здесь мы не меняем значение length
При объявлении
const переменных их обязательно сразу инициализировать:const int number; // Ошибка
// нужно сразу инициализировать const переменную
Мы можем выносить некоторые "магические числа" в отдельные переменные, улучшая читаемость кода.
float radius;
cin >> radius;
float length = 6.28 * radius
cout << length;
Людям, которые плохо знакомы с математикой, может быть неясно, что такое
6.28. Ведь это просто магическое число, которое, казалось бы, не имеет никакого смысла.Лучше переписать этот код через
const переменные:const float pi = 3.14;
float radius;
cin >> radius;
float length = 2 * pi * radius
cout << length;
Теперь сразу становится понятно, что этот код вычисляет длину окружности через радиус.
Вынося "магические числа" в
const переменные, мы можем значительно увеличить понятность кода.Спецификатор
const позволяет:• Защитить переменные от случайного изменения
• Увеличить понятность кода засчёт вынесения магических чисел
• Прояснять назначение некоторых переменных, например, численных идентификаторов
Также
const переменные могут быть оптимизированы компилятором. В C++ при автоматической оптимизации кода часть операций производится на этапе компиляции, поэтому const переменные иногда могут быть удалены из скомпилированной программы.#интересные_факты
🤓2❤1👍1🔥1
Я, конечно, всё понимаю, но 35 уведомлений за сутки – это уже перебор.
Одно дело разгребать недельный запас в 100 комментариев и решений, а другое – получать по 35 штук каждый день. Курсы по программированию просто убивают💀
Одно дело разгребать недельный запас в 100 комментариев и решений, а другое – получать по 35 штук каждый день. Курсы по программированию просто убивают
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7❤1🤯1🍓1
Основы программирования на С++
Я тут заметил, что в мобильной версии приложения Stepik очень неудобно читать условия задания с тёмной темой. Обычно в заданиях я выделяю Входные/Выходные данные и Задание полужирным шрифтом, чтобы их было легче найти среди большого и детального текста задания…
Любые радикальные, странные и возможно фриковые изменения в любом продукте требуют тестирования.
Я чутка изменил насыщенность и яркость цветов и принёс новое цветовое выделение в урок «Массивы в циклах».
Попробуйте заново для себя пройти несколько заданий из этого урока с новым цветовым выделением.
Если вдруг вам не понравится новое цветовое выделение или наоборот вы будете в восторге, напишите нам об этом! Можно в комментариях к этому посту, можно на платформе Stepik, главное – выскажите любые ваши мысли по этому поводу.
Если вам очень понравится, весь курс по основам и весь следующий курс будут иметь такое выделение в текстах заданий.
Я решил использовать цвета в тексте, поскольку заметил, что на мобильных устройствах текста заданий выглядят какими-то ну очень монотонными: в них вообще не заметен полужирный текст. Поэтому попробуйте пройти задания в том числе из приложения на мобильном устройстве.
Я чутка изменил насыщенность и яркость цветов и принёс новое цветовое выделение в урок «Массивы в циклах».
Попробуйте заново для себя пройти несколько заданий из этого урока с новым цветовым выделением.
Нам нужен ваш фидбек!
Если вдруг вам не понравится новое цветовое выделение или наоборот вы будете в восторге, напишите нам об этом! Можно в комментариях к этому посту, можно на платформе Stepik, главное – выскажите любые ваши мысли по этому поводу.
Если вам очень понравится, весь курс по основам и весь следующий курс будут иметь такое выделение в текстах заданий.
Я решил использовать цвета в тексте, поскольку заметил, что на мобильных устройствах текста заданий выглядят какими-то ну очень монотонными: в них вообще не заметен полужирный текст. Поэтому попробуйте пройти задания в том числе из приложения на мобильном устройстве.
🔥2🤔2👍1
Вы же помните, какие есть математические функции в C++?
Мы рамках нашего курса мы изучили одну замечательную функцию, которая превращает все поданные целые числа в положительные. Этой функцией была
При вызове
Однако существуют в C++ ограничения, которые лежат немного выше этой функции…
Этот пример кода как раз столкнётся с этими ограничениями:
Мы рамках нашего курса мы изучили одну замечательную функцию, которая превращает все поданные целые числа в положительные. Этой функцией была
abs.Функция abs возвращает модуль числа или его абсолютное значение
При вызове
abs(5) она вернёт 5, а при вызове abs(-13) она вернёт 13. Абсолютно любое переданное ей отрицательное число теряет знак и становится положительным.Однако существуют в C++ ограничения, которые лежат немного выше этой функции…
Этот пример кода как раз столкнётся с этими ограничениями:
int number = -2147483648;
cout << abs(number);
Как вы думаете, что выведет приведённый выше код?
Anonymous Quiz
55%
Число 2147483648
14%
Ошибку
12%
Число -2147483648
18%
Число 0
🤔9😱2
Разве целые числа – это только
В C++ есть знакомый нам тип данных
Для этого мы можем применить модификаторы
• Тип
• Тип
• Тип
У типа
Если нужно работать с очень большими целыми числами, можно использовать тип
Если нужно экономить память, то отличным выбором будет
Например:
Если бы мы использовали тип данных
Если целое число не помещается в переменную, происходит переполнение. При переполнении происходят некоторые манипуляции в двоичной системе счисления, из-за чего результирующее число теряет свой изначальный смысл.
Простой пример:
Мы записали в переменные
#интересные_факты
int?В C++ есть знакомый нам тип данных
int. Он позволяет хранить целые числа. Числа типа int занимают 4 байта, из-за чего int вмещает числа в диапазоне от -2,147,483,648 до 2,147,483,647.А что если мне нужны большие числа? Или нужно сэкономить потребляемую память?
Для этого мы можем применить модификаторы
short и long к типу int:• Тип
short int (или просто short) занимает 2 байта, хранит числа в диапазоне от -32,767 до 32,768• Тип
long int (или long) тоже занимает 4 байта (чаще всего)• Тип
long long int (или long long) занимает 8 байтУ типа
long long диапазон от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807. Он позволяет хранить невероятно большие числа.Эти диапазоны получены по формулам -2^n и 2^n-1, где n - количество бит в типе данных (для int это 32).
Если нужно работать с очень большими целыми числами, можно использовать тип
long long, но он занимает в 2 раза больше памяти, чем int.Если нужно экономить память, то отличным выбором будет
short int, хотя у него более узкий диапазон чисел.Например:
long long big_number = 42436356;
big_number = big_number * 26183 + 1984;
cout << big_number;
// Вывод: 1111111111132
Если бы мы использовали тип данных
int, вывелось бы число -1,285,418,553. Это не то, что должно получиться при вычислениях, хотя похоже, что результат и не может влезть в тип int.Если целое число не помещается в переменную, происходит переполнение. При переполнении происходят некоторые манипуляции в двоичной системе счисления, из-за чего результирующее число теряет свой изначальный смысл.
Простой пример:
// Наибольшее число для типа short
short number = 32768;
number += 1;
cout << number << endl;
// Вывод: -32767
// Слишком большое число
int population = 8000000000;
cout << population;
// Вывод: -589934592
Мы записали в переменные
number и population слишком большие числа и произошло переполнение. В итоге получилось не то, что мы хотели.#интересные_факты
👍7
Основы программирования на С++
Вы же помните, какие есть математические функции в C++? Мы рамках нашего курса мы изучили одну замечательную функцию, которая превращает все поданные целые числа в положительные. Этой функцией была abs. Функция abs возвращает модуль числа или его абсолютное…
Если вернуться к этому примеру кода, то теперь понятно, почему число при вызове
На самом деле функция
Поэтому в переменную записывается число -2,147,483,648 – результат переполнения. Так уж совпало, что результатом переполнения для числа 2,147,483,648 становится число -2,147,483,648.
abs не изменяется.На самом деле функция
abs возвращает число 2,147,483,648. Просто оно выходит за пределы диапазона чисел в типе int (на 1 больше, чем наибольшее возможное число).Поэтому в переменную записывается число -2,147,483,648 – результат переполнения. Так уж совпало, что результатом переполнения для числа 2,147,483,648 становится число -2,147,483,648.
Вот так и пользуйся этими функциями...
А потом «Откуда ошибки? Почему у меня undefined behavior?»
👍5
Основы программирования на С++
Вы когда-нибудь пользовались указателями? Язык C++ и программы, написанные на нём, являются очень быстрыми. C++ является очень низкоуровневым языком, что позволяет программистам работать с памятью на самом фундаментальном уровне и тем самым значительно оптимизировать…
А вы знали что такое амперсанд (&)?
Мы часто пользуемся разными символами, но почти никогда не задумываемся о том, откуда они взялись, а иногда и о том, что они значат.
Один из таких символов – значок
🖥 В C++ мы используем его для получения адреса переменной.
🖥 Тот же символ мы используем для логического «И» (
🎸 Ещё он часто используется в английском в предложениях и некоторых названиях (R&B, Rock&Roll, M&M's).
Традиционно в латыни отдельные буквы (вне состава слов) обозначались выражением «per se» (сам по себе):
• «A per se A» – сама по себе буква A
• Или «per se B» – сама по себе буква B
Чтобы обозначать знак
Ещё, кстати, есть отдельные приколы в том, как эта буква получила свой современный вид:
• Сначала это были две буквы «et»
• Потом они превратились в лигатуру 🙰 (просто соединились)
• Затем они исказились до 🙲, а потом уже до привычного нам &
🧐 То есть эта непонятная закорючка – это две буквы: e и t.
Вот так и появился на свет один из тех непонятных значков, которые мы часто используем и нередко путаем со значком процента.
#интересные_факты
Мы часто пользуемся разными символами, но почти никогда не задумываемся о том, откуда они взялись, а иногда и о том, что они значат.
Один из таких символов – значок
&:🖥 Тот же символ мы используем для логического «И» (
&&) и побитового «И» (&).🎸 Ещё он часто используется в английском в предложениях и некоторых названиях (R&B, Rock&Roll, M&M's).
Значок & называется амперсандом.
В латыни он обозначал союз "и" (and).
Традиционно в латыни отдельные буквы (вне состава слов) обозначались выражением «per se» (сам по себе):
• «A per se A» – сама по себе буква A
• Или «per se B» – сама по себе буква B
Чтобы обозначать знак
& в латыни говорили «and per se and» (сам по себе and). Со временем эта фраза исковеркалась до слитного и невнятного ampersand.Выходит, «Rock&Roll» – это «отдельно рок и сам по себе ролл»! Интересно, что на это скажет Элвис? 😁
Ещё, кстати, есть отдельные приколы в том, как эта буква получила свой современный вид:
• Сначала это были две буквы «et»
• Потом они превратились в лигатуру 🙰 (просто соединились)
• Затем они исказились до 🙲, а потом уже до привычного нам &
🧐 То есть эта непонятная закорючка – это две буквы: e и t.
Вот так и появился на свет один из тех непонятных значков, которые мы часто используем и нередко путаем со значком процента.
#интересные_факты
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🤓3❤2✍1🍓1
🛸 Сколько длится ночь на МКС?
Сейчас я стараюсь делать задачи в курсах интереснее: добавлять сюжет, особые вступления или формулировать так, чтобы их решения, позволяли делать недоступные ранее выводы об изученных темах.
В уроке 3.2 курса для продвинутых, посвящённом числам с плавающей точкой (типы
Казалось бы, одна из обычных 📚 скучных задач школьного уровня, но может её стоит как-то особенно подать? Может стоит как-то подвести к длине окружности?
Сейчас эта задача начинается с мысли о том, что космонавты на МКС каждые полтора часа испытывают затмение: попадают в тень Земли. Затем от лица астронавта ставятся вопросы:
Это не основные вопросы задачи, они только подводят к ней. Однако теперь уже у меня появляется вопрос: сколько же всё-таки длится ночь на МКС?
🎉 И вдруг вуаля: формула готова (она на одной из картинок выше). Теперь можно подставить все постоянные и переменные, посчитать значение t и получить 2160 секунд или 36 минут (почти половина всего времени на орбите).
🤔 Но зачем это всё? Задача ведь про длину окружности, кому нужна эта астрономия? Это ведь всего лишь тема для вступления, обычной подводки, зачем было размышлять об этом?
Наша жизнь состоит из миллиона маленьких прозрений. Каждое такое прозрение не берётся из ниоткуда: кто-то (например, вы) должен его создать или доставить.
⚡️ Именно эксперименты (порой глупые или исходящие из необычных идей) развили науку до текущего уровня, и они же позволяют нам узнавать что-то новое, исследовать то же программирование, но за гранью учебников или курсов.
И нет, я не переквалифицирую свой курс в курс по астрофизике или геометрии. Просто в нём будет чуть больше интересного как из программирования, так и (совсем немного) из других наук.
Сейчас я стараюсь делать задачи в курсах интереснее: добавлять сюжет, особые вступления или формулировать так, чтобы их решения, позволяли делать недоступные ранее выводы об изученных темах.
В уроке 3.2 курса для продвинутых, посвящённом числам с плавающей точкой (типы
float и double) я решил добавить задачу 🟢о длине окружности (здесь нужно число π, а оно как раз дробное).Казалось бы, одна из обычных 📚 скучных задач школьного уровня, но может её стоит как-то особенно подать? Может стоит как-то подвести к длине окружности?
Сейчас эта задача начинается с мысли о том, что космонавты на МКС каждые полтора часа испытывают затмение: попадают в тень Земли. Затем от лица астронавта ставятся вопросы:
Когда же Солнце покажется вновь?
Сколько времени мне нужно ещё ждать?
Это не основные вопросы задачи, они только подводят к ней. Однако теперь уже у меня появляется вопрос: сколько же всё-таки длится ночь на МКС?
Ну, чтобы это узнать, нужно решить задачку по геометрии: четыре окружности, много перпендикуляров, касательных, отрезков, соединяющих центры окружностей.
Ищем равные углы, пропорциональные стороны, разные физические отношения, составляем уравнение...
🎉 И вдруг вуаля: формула готова (она на одной из картинок выше). Теперь можно подставить все постоянные и переменные, посчитать значение t и получить 2160 секунд или 36 минут (почти половина всего времени на орбите).
🤔 Но зачем это всё? Задача ведь про длину окружности, кому нужна эта астрономия? Это ведь всего лишь тема для вступления, обычной подводки, зачем было размышлять об этом?
Наша жизнь состоит из миллиона маленьких прозрений. Каждое такое прозрение не берётся из ниоткуда: кто-то (например, вы) должен его создать или доставить.
Если у вас возникает глупая идея или особая мысль, которая исследует реальность или какую-то систему, не бойтесь пробовать.
⚡️ Именно эксперименты (порой глупые или исходящие из необычных идей) развили науку до текущего уровня, и они же позволяют нам узнавать что-то новое, исследовать то же программирование, но за гранью учебников или курсов.
И нет, я не переквалифицирую свой курс в курс по астрофизике или геометрии. Просто в нём будет чуть больше интересного как из программирования, так и (совсем немного) из других наук.
🔥9🤔1
А вы знали, что сам Илон Маск через нейросеть Grok рекомендует наш курс?
😁9🔥5
Большинство из вас занимается на Stepik: проходит курсы и следит за тем, чтобы делать это регулярно. А я вот — нет.
Казалось бы, я создаю курс, а значит, должен иметь солидный банк заданий. Чтобы его собрать, нужно проходить другие курсы, искать там задачи. Но нет, на занятия на Stepik у меня просто не хватает времени.
К чему же это? На Stepik есть отличная механика "тепловых карт" (heatmap): она показывает количество решённых заданий по дням и визуализирует стрики. Человеческий мозг ну ооочень не любит прерывать стрики, что делает механику heatmap'ов отличной мотивацией для занятий.
Теперь и я присоединяюсь к этой гонке за стриками! Следить за мной отныне можно по этой ссылке: *тык*.
Вообще, такие инструменты — отличный способ отслеживать свои привычки и прогресс. Визуальное отслеживание вашей продуктивности всегда упрощает работу над какими-либо проектами.
Этот конкретный можно легко интегрировать в Notion, Obsidian или даже на ваш персональный сайт. В результате можно вовсе создать единый хаб со всеми вашими задачами, привычками, знаниями и прочим.
Казалось бы, я создаю курс, а значит, должен иметь солидный банк заданий. Чтобы его собрать, нужно проходить другие курсы, искать там задачи. Но нет, на занятия на Stepik у меня просто не хватает времени.
К чему же это? На Stepik есть отличная механика "тепловых карт" (heatmap): она показывает количество решённых заданий по дням и визуализирует стрики. Человеческий мозг ну ооочень не любит прерывать стрики, что делает механику heatmap'ов отличной мотивацией для занятий.
Теперь и я присоединяюсь к этой гонке за стриками! Следить за мной отныне можно по этой ссылке: *тык*.
Вообще, такие инструменты — отличный способ отслеживать свои привычки и прогресс. Визуальное отслеживание вашей продуктивности всегда упрощает работу над какими-либо проектами.
Этот конкретный можно легко интегрировать в Notion, Obsidian или даже на ваш персональный сайт. В результате можно вовсе создать единый хаб со всеми вашими задачами, привычками, знаниями и прочим.
🔥9🥰1🎄1
Работа по курсу для продвинутых идёт полным ходом
3-й модуль я уже завершил, а 4-й модуль завершён уже примерно на 75%. Всего я планировал в нём 7 уроков, из них 5 почти сделаны, 6-й запланирован на ближайшие недели, а 7-й урок я отложил на момент после создания модуля про ООП.
Это всё значит, что курс готов уже на 25%!
Возможно выпущу я его изначально неполным (без модулей с особо продвинутыми темами), так что его публикация скорее всего произойдёт где-то в конце (или середине) лета.
Между тем, он получается очень объёмным. Из-за этого я сейчас веду урок со шпаргалками по всем темам, а также мне придётся добавить экзамены между основными модулями.
Кстати, раз уж я стремлюсь сделать курс качественным, в ближайшие недели я соберу группу тестировщиков, наверно где-то из 10 человек.
Когда начнётся набор, вы увидите пост в этом канале. Вам может повезти получить преждевременный доступ к курсу.
3-й модуль я уже завершил, а 4-й модуль завершён уже примерно на 75%. Всего я планировал в нём 7 уроков, из них 5 почти сделаны, 6-й запланирован на ближайшие недели, а 7-й урок я отложил на момент после создания модуля про ООП.
Это всё значит, что курс готов уже на 25%!
Возможно выпущу я его изначально неполным (без модулей с особо продвинутыми темами), так что его публикация скорее всего произойдёт где-то в конце (или середине) лета.
Между тем, он получается очень объёмным. Из-за этого я сейчас веду урок со шпаргалками по всем темам, а также мне придётся добавить экзамены между основными модулями.
Вы готовы к этому путешествию? Когда оно начнётся, путь будет не из простых.
Кстати, раз уж я стремлюсь сделать курс качественным, в ближайшие недели я соберу группу тестировщиков, наверно где-то из 10 человек.
Когда начнётся набор, вы увидите пост в этом канале. Вам может повезти получить преждевременный доступ к курсу.
❤14🔥11🥰1
Кто этот ваш оператор
Ещё в самом начале нашего путешествия по миру C++ мы узнали, что существуют операторы
• Оператор
• Оператор
Эти два слова, инкремент и декремент, получились от английских increment (увеличение) и decrement (уменьшение).
Оба этих оператора мы периодически используем в цикле
Возможно вы даже видели разные записи этого оператора:
Эти две разных записи называются префиксной (
Давай разберём и запомним по-простому:
• Префиксный инкремент ⬅️ (пре – перед) сначала увеличивает значение переменной, а потом его возвращает
• Постфиксный инкремент ➡️ (пост – после) сначала возвращает значение, и лишь затем увеличивает его
Это, конечно, чрезмерное упрощение, однако ведут они себя именно таким (или хотя бы похожим) образом.
Посмотрим на префиксный инкремент:
📤 Вывод:
Всё действие происходит между первой и третьей строчкой.
Оператор
📤 Вывод:
Мы изменили в коде только оператор: поменяли с префиксного на постфиксный. В выводе изменилось только второе число.
Получается, что постфиксный оператор тоже увеличивает переменную на
🔄 Всё работает точно так же и для декремента (
На последок особо хардкорным ленивцам дадим запись
#интересные_факты
++ в C++?Ещё в самом начале нашего путешествия по миру C++ мы узнали, что существуют операторы
++ и --.• Оператор
++ – оператор инкремента, делает +1 к переменной• Оператор
-- – оператор декремента, делает -1 к переменнойЭти два слова, инкремент и декремент, получились от английских increment (увеличение) и decrement (уменьшение).
Оба этих оператора мы периодически используем в цикле
for, ведь в нём наш счётчик должен совершать ровно один шаг (+1).А что если «C++» так называется, потому что он на 1 шаг впереди от языка C?🤔
Возможно вы даже видели разные записи этого оператора:
for (int i = 0; i < 5; ++i) { }
for (int i = 0; i < 5; i++) { }Эти две разных записи называются префиксной (
++i) и постфиксной (i++; иногда суффиксной). В чём же разница между ними?Давай разберём и запомним по-простому:
• Префиксный инкремент ⬅️ (пре – перед) сначала увеличивает значение переменной, а потом его возвращает
• Постфиксный инкремент ➡️ (пост – после) сначала возвращает значение, и лишь затем увеличивает его
Это, конечно, чрезмерное упрощение, однако ведут они себя именно таким (или хотя бы похожим) образом.
Посмотрим на префиксный инкремент:
int number = 13;
cout << "До изменения: " << number << endl;
cout << "Значение при изменении: "
<< ++number << endl;
cout << "После изменения: " << number << endl;
📤 Вывод:
До изменения: 13
Значение при изменении: 14
После изменения: 14
Всё действие происходит между первой и третьей строчкой.
Оператор
++number сначала увеличивает значение, а потом передаёт его в cout, чтобы оно вывелось – поэтому выводится 14.int number = 13;
cout << "До изменения: " << number << endl;
// Здесь уже постфиксный оператор
cout << "Значение при изменении: "
<< number++ << endl;
cout << "После изменения: " << number << endl;
📤 Вывод:
До изменения: 13
Значение при изменении: 13
После изменения: 14
Мы изменили в коде только оператор: поменяли с префиксного на постфиксный. В выводе изменилось только второе число.
Получается, что постфиксный оператор тоже увеличивает переменную на
1, но передаёт в cout не новое значение (14), а старое (13).🔄 Всё работает точно так же и для декремента (
--) – для префиксного (--i) и для постфиксного (i--).На последок особо хардкорным ленивцам дадим запись
++i--. Кажется, что она всего лишь ничего не делает, но нет, всё намного хуже: она вызывает ошибку.#интересные_факты
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1🥰1🍌1