Я просто скачал видео( т.к. не имею доступа к безлимитному интернету в 21 веке) и решил отлайкать все с первого урока. Не устану говорить спасибо! Добавьте пожалуйста номер счёта. есть люди, которые желают отблагодарить вас материально
Define - макрос, конечно, очень удобная и полезная штука, но из практики могу только сказать - злоупотреблять не стоит. Особенно с переписыванием синтаксиса языка. Проходит немного времени, ты забываешь те мысли, которые ты туда вкладывал, и код становится откровенно корявым и нечитабельным, только из-за того что это уже не стандартный язык программирования. Самое оптимальное применение, к примеру в Ардуино, назначение названий портов, цвета лампочек, различные константы и т.д и т.п, и прочие технические штуки, но желательно минимум вмешательства в стандарт синтаксиса языка.
Спасибо! Отблагодарил вас небольшим бонусом). Прикрепите лучше ссылку в описание к видео - "Для тех кто желает отблагодарить материально www.donationalerts.ru/r/simplecode "
Сергей, а правильно я понимаю. что если include подключает файл, то если написать #include , или еще дополнительно дописать путь к файлу, то он будет брать данные оттуда?
Да уж, было интересно. Об этом обычно рассказывают как основы в начале, но это больше похоже на фишку которую можно использоваться уже после того как ты знаешь хоть что-то. Не удивительно что многи люди просто забывают об этом
Я так понял, что с помощью define можно такое на куивертить с синтаксисом, что получится в стуктуре всё тот же cpp, но выглядеть он будет как что-то совсем извращенное. Написав такой вот define хэдэр можнл юзать свои кастом плюсы. Прикольно)
Да) Только так никто обычно не делает. У препроцессора совсем другая задача: адаптация кода программы для сборки различными компиляторами, а так же упрощение использование сложно-замороченного кода конечными юзерами. Например, в тестовых фреймворках наподобие gtest, что бы создать юнит-тест, вы пишете что-то вроде: UNIT_TEST(Sample) { код теста } На самом деле макрос UNIT_TEST разворачивается во что-то очень сложно-замороченное. Но вам, пользователю, об этом думать не нужно. Вы можете просто писать: UNIT_TEST и не заморачиваться.
С begin и end - вообще проблем не будет, если не использовать: "using namespace std;" даже создатель крестов об этом говорил, что не очень хорошо использовать это.
Спасибо за разъяснения, всё примерно так и думал. Но вот недавно я решил исследовать библиотеки stm32 и у меня мозг просто закипел от этих дефайнов. Там дефайн на дефайне и дефайном погоняет. Один заменяет другой, другой заменяет третий, третий заменяет какую то функцию которая находится в другом хэдере и в котором то же макросы макросы макросы!!! бл скаа как это читать? как это работает вообще?
Выделите фрагмент кода, который хотите закоментировать и нажмите Ctrl + K, C (удерживая Ctrl нажать K, затем C). Для снятия комментариев нужно выделить закомментированный кусок и нажать Ctrl + K, U. так же есть такое ценное ОЧЕНЬ даже ценное умение для программиста как УМЕНИЕ ГУГЛИТЬ если не умеешь гуглить учись если не хочешь учится то изучать программирование нет смысла
@@lacklacktriplehack4174 Гуглить я умею. Нашёл уже давно информацию. Написал комментарий для других, кто тоже интересуется этим вопросом. Наткнутся на мой коммент и увидят твой ответ
Не библиотеку, а заголовок. Конечно подгружаются. Компилятор не телепат. Как по вашему он сможет понять, что именно там есть, и что именно оттуда будет использовано, если не подгрузит содержимое заголовка?
а если у меня константа inline, которая тоже при компиляции подставляется в коде, то в чём тогда отличие? Кроме того, что компилятор может игнорировать inline
@@sleepyNovember_project По одной из версий, в именах стандартных заголовков отсутствует расширение, что бы подчеркнуть различие между пользовательскими заголовками и стандартными. Пользовательские заголовки - это всегда файлы. А вот стандартные заголовки, строго говоря, файлами быть не обязаны.
Если мы не будем использовать "using namespace std" , а прописывать "std::begin", то мы ведь не столкнёмся с этой проблемой? Вообще многие не рекомендую использовать "using namespace std"
@@МихаилПолшков-х8м Проф. программисты действительно предпочитают явно указывать пространство имен по ряду причин: 1 - улучшает читабельность кода. 2- защита от коллизий имен.
Получается когда уже дело доходит до компиляции то вместо макроса компилятор видит уже сразу значение? а когда переменная то компилятор видит адрес переменно потом идёт по адресу и только после всего этого берёт значение?
1:06 Вы говорите о подключении файла, но при этом указываете на стандартный заголовок. Здесь вы допускаете грубую ошибку. Согласно правилам языка с++, стандартные заголовки предоставляются реализацией, и формально, вообще не являются файлами.
Я просто скачал видео( т.к. не имею доступа к безлимитному интернету в 21 веке) и решил отлайкать все с первого урока. Не устану говорить спасибо! Добавьте пожалуйста номер счёта. есть люди, которые желают отблагодарить вас материально
Пожалуйста! Благодарю за поддержку! Ссылка для тех кто желает отблагодарить материально www.donationalerts.ru/r/simplecode
Поддерживаю, у Сергея есть курс на Udemy. Я уже купил. Еще бы руку пожать! :)
@@alexxxusxxi Я случайно зашел на этот канал. Почему то мне не показывает Ютуб в рекомендуемые....
@@alexxxusxxi Можешь, пожалуйста, дать ссылку на udemy Сергея?
include знал,а вот define щас понял как работает,удобно,Спасибо Сергей!!!
После этого урока, перевел все директивы на эмодзи символы :D
Очередной лайк!!! Не перестаю восхищаться умением автора донести информацию в сжатом и в то же время доступном формате!!!!
Как же хорошо можно преподавать язык Си! Настолько привыкаешь к вашему голосу и спокойной подаче информации - что включаешь даже фоном для успокоения)
удивительно то, как define облегчает жизнь при работе с большими проектами, спасибо за *ОТЛИЧНОЕ* объяснение
Define - макрос, конечно, очень удобная и полезная штука, но из практики могу только сказать - злоупотреблять не стоит. Особенно с переписыванием синтаксиса языка. Проходит немного времени, ты забываешь те мысли, которые ты туда вкладывал, и код становится откровенно корявым и нечитабельным, только из-за того что это уже не стандартный язык программирования.
Самое оптимальное применение, к примеру в Ардуино, назначение названий портов, цвета лампочек, различные константы и т.д и т.п, и прочие технические штуки, но желательно минимум вмешательства в стандарт синтаксиса языка.
Вы пишете: *желательно минимум вмешательства в стандарт синтаксиса языка* Вмешательство в стандарт синтаксиса языка - это UB
Большое спасибо вам за урок и прекрасное пояснение, Сергей!
#препроцессор #define #SimpleCode #урокипрограммирования
Спасибо большое за урок! На паре не смог понять это, но у вас всё ясно!
Спасибо за краткость и ясность!
Блин, все супер! Чего так мало просмотров? Уроки заслуживают больше!
Благодарю, за поддержку! Исправить ситуацию очень просто, если все кому нравятся мои уроки сделают по репосту или жмакнут лайк=)
Потому что многие считают программирование(вообще науку) не искусством, искусством математики физики итд тип , а занудство. .
@@loner7222 +
Не у всех хватает терпения и настойчивости(
Кто-то понимает, что программирование - это не его, а кому-то только предстоит узнать)
@@mar_kha ,часто лень и отсутствие дисциплины, перечеркивает обучение на корню. Даже если у человека есть хорошие задатки к обучаемости.
Спасибо большое. Вы все правильно описали. Гайвер в своих прогах все в девайнах захреначил.... Я даже в ступор сначала ушел.......
Спасибо большое за качественные уроки. Актуально и по сей день!
Посмотрел видео и понравилось как преподносит информацию . лайкну и буду смотреть дальше.
Хотел понять что такое define, теперь стало ясно, спасибо!
*Написал 1C на C++*
#include
#define процедура int main
#define установить_язык setlocale
#define ру "ru"
#define ЛОКАЛИЗОВАТЬ_ВСЕ LC_ALL
#define использовать_пространство_имен using namespace
#define вернуть return
#define вывести cout
#define новстроч endl
использовать_пространство_имен std;
процедура()
{
установить_язык(ЛОКАЛИЗОВАТЬ_ВСЕ,ру);
вывести
Ты в конце фигурную скобку забыл)
Интересно, но тупо и бесполезно. Проще изначальными методами и понятней.
@@artsam7617 ну не понятней). Зато у меня программа долго загружается и англ программистам не понятно будет).
а Вы не из 1С программистов?
Жжешь) интересно а часто встречаемые части кода можно так сокращать, было бы удобно, возможно)
Храни вас Бог!!!! я уже свихивалась потихоньку. Вы так всё прекрасно объясняете
Ваш видое уроки всегда мне будет полезно, именно нам студентам ! Вам большое спасибо! Продолжаете дальше и развиваете👍✊
Очередное спасибо за урок.
Спасибо, Сергей, за столь хорошую информацию
Гайд о том , как создать Йопта скрипт
ахахах, тоже об этом подумал!
Точнее Йопта++
Лол, а что это
хахаха, сделал
Спасибо)
Спасибо
Спасибо!)
Пожалуйста!
Спасибо за знания !
Благо дарю за урок)
Спасибо! Отблагодарил вас небольшим бонусом).
Прикрепите лучше ссылку в описание к видео - "Для тех кто желает отблагодарить материально www.donationalerts.ru/r/simplecode "
Сергей, а правильно я понимаю. что если include подключает файл, то если написать #include , или еще дополнительно дописать путь к файлу, то он будет брать данные оттуда?
Круто! Интересная тема
Да уж, было интересно. Об этом обычно рассказывают как основы в начале, но это больше похоже на фишку которую можно использоваться уже после того как ты знаешь хоть что-то. Не удивительно что многи люди просто забывают об этом
Большое спасибо!❤🍪
спасибо!
благодарствую.
Спасибо !
спасибо большое!
Чтобы не было проблем, как с begin, лучше всегда писать простанство имён std, так будет std::begin() и begin как скобочка))
Спасибо !!
Что же ты раньше молчал о такой прекрасной штуке.Теперь я не буду писать этот cout
Спасибо.
А в ООП макрос тоже так же функционирует или есть свои нюансы?
👍👍👍
Я так понял, что с помощью define можно такое на куивертить с синтаксисом, что получится в стуктуре всё тот же cpp, но выглядеть он будет как что-то совсем извращенное. Написав такой вот define хэдэр можнл юзать свои кастом плюсы.
Прикольно)
Да) Только так никто обычно не делает. У препроцессора совсем другая задача: адаптация кода программы для сборки различными компиляторами, а так же упрощение использование сложно-замороченного кода конечными юзерами. Например, в тестовых фреймворках наподобие gtest, что бы создать юнит-тест, вы пишете что-то вроде: UNIT_TEST(Sample) { код теста } На самом деле макрос UNIT_TEST разворачивается во что-то очень сложно-замороченное. Но вам, пользователю, об этом думать не нужно. Вы можете просто писать: UNIT_TEST и не заморачиваться.
спасибо
С begin и end - вообще проблем не будет, если не использовать: "using namespace std;" даже создатель крестов об этом говорил, что не очень хорошо использовать это.
В main скобки забыл заменить на begin и end!
Спасибо за разъяснения, всё примерно так и думал. Но вот недавно я решил исследовать библиотеки stm32 и у меня мозг просто закипел от этих дефайнов. Там дефайн на дефайне и дефайном погоняет. Один заменяет другой, другой заменяет третий, третий заменяет какую то функцию которая находится в другом хэдере и в котором то же макросы макросы макросы!!! бл скаа как это читать? как это работает вообще?
даа, ебаные завёрнутые клубки, которые нужно разворачивать, ляпота хавхавха
Begin end паскалик любимый точней приевшийся
7:06 - это что за комбинация клавиш позволяет так делать??
Выделите фрагмент кода, который хотите закоментировать и нажмите Ctrl + K, C (удерживая Ctrl нажать K, затем C). Для снятия комментариев нужно выделить закомментированный кусок и нажать Ctrl + K, U.
так же есть такое ценное ОЧЕНЬ даже ценное умение для программиста как УМЕНИЕ ГУГЛИТЬ
если не умеешь гуглить учись если не хочешь учится то изучать программирование нет смысла
@@lacklacktriplehack4174 Гуглить я умею. Нашёл уже давно информацию. Написал комментарий для других, кто тоже интересуется этим вопросом. Наткнутся на мой коммент и увидят твой ответ
@@SAD-oe9lw ну просто ниже уже дали ответ
spasibo
Если я подключаю библиотеку к программе и использую из нее только одну функцию, остальные подгружаются или нет? Как это влияет на производительность?
Не библиотеку, а заголовок. Конечно подгружаются. Компилятор не телепат. Как по вашему он сможет понять, что именно там есть, и что именно оттуда будет использовано, если не подгрузит содержимое заголовка?
Вы спрашиваете: *Как это влияет на производительность?* Никак.
а если у меня константа inline, которая тоже при компиляции подставляется в коде, то в чём тогда отличие? Кроме того, что компилятор может игнорировать inline
Добро пожаловать в 2021 здесь господствует Pascal++
Спасибо, есть вопрос, как вы так быстро комментируете код ? Подскажите пожалуйста.
Ctrl+K, Ctrl+C, чтобы раскомментировать - Ctrl K, Ctrl+U
1:40 Вы подключили заголовок. Подключение заголовка так и называется: "подключением заголовка", и не имеет никакого отношения к подключению библиотек.
А почему тут не надо указывать ".h"?
@@sleepyNovember_project По одной из версий, в именах стандартных заголовков отсутствует расширение, что бы подчеркнуть различие между пользовательскими заголовками и стандартными. Пользовательские заголовки - это всегда файлы. А вот стандартные заголовки, строго говоря, файлами быть не обязаны.
@@princessmary5556 благодарю за такое пояснение!
Канал невероятно крутой, кто-нибудь может поделиться подобным же каналом по Пайтону или Джава. Можно и платные курсы. Можно и на немецком языке.
Такой канал болше нету
Если мы не будем использовать "using namespace std" , а прописывать "std::begin", то мы ведь не столкнёмся с этой проблемой? Вообще многие не рекомендую использовать "using namespace std"
почему
@@МихаилПолшков-х8м Проф. программисты действительно предпочитают явно указывать пространство имен по ряду причин: 1 - улучшает читабельность кода. 2- защита от коллизий имен.
👍👍👍🤘🤘🤘🤘🤘
Ну точно паскаль(begin и end);
Почему не пишется знак = ...? PI = 3.14
теперь я могу создать прототип питона на c++
Константа, которая является макроопределением
Получается когда уже дело доходит до компиляции то вместо макроса компилятор видит уже сразу значение? а когда переменная то компилятор видит адрес переменно потом идёт по адресу и только после всего этого берёт значение?
Получается так ...
Компилятор не может видеть адрес, так как он выделяется уже скомпилированной переменной.
Захотелось написать крестики нолики и даже получилось. Сначала сделал уродскую через goto и тд. Потом довел до такого варианта:
#include
#include
#include
using namespace std;
int main();
void win()
{
string a;
cout a;
main();
}
void lose()
{
string a;
cout a;
main();
}
void draw(char arr[][3])
{
system("cls");
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
cout > pos2;
pos1 -= 1;
pos2 -= 1;
while ((pos1 < 0 || pos2 < 0 || pos1 > 3 || pos2 > 3) || (arr[pos1][pos2] == 'x') || (arr[pos1][pos2] == '0'|| (arr[pos1][pos2] == ' ')))
{
cout > pos1 >> pos2;
pos1 -= 1;
pos2 -= 1;
} arr[pos1][pos2] = 'x';
}
void pc(char arr[][3])
{
int pos1 = 1, pos2 = 1;
while (arr[pos1][pos2] != '*')
{
pos1 = rand() % 3 + 1;
pos2 = rand() % 3 + 1;
pos1 -= 1;
pos2 -= 1;
} arr[pos1][pos2] = '0';
}
void check(char arr[][3])
{
if (arr[0][0] == 'x' && arr[1][0] == 'x' && arr[2][0] == 'x') //
{
// *
win(); // *
} // *
//
if (arr[0][0] == 'x' && arr[0][1] == 'x' && arr[0][2] == 'x') //
{
// * * *
win(); //
} //
//
if (arr[0][2] == 'x' && arr[1][2] == 'x' && arr[2][2] == 'x') //
{
// *
win(); // *
} // *
//
if (arr[2][0] == 'x' && arr[2][1] == 'x' && arr[2][2] == 'x') //
{
//
win(); //
} // * * *
if (arr[0][1] == 'x' && arr[1][1] == 'x' && arr[2][1] == 'x') //
{
// *
win(); // *
} // *
//
if (arr[1][0] == 'x' && arr[1][1] == 'x' && arr[1][2] == 'x') //
{
//
win(); // * * *
} //
//
if (arr[0][0] == 'x' && arr[1][1] == 'x' && arr[2][2] == 'x') //
{
// *
win(); // *
} // *
//
if (arr[2][0] == 'x' && arr[1][1] == 'x' && arr[0][2] == 'x') //
{
// *
win(); // *
} // *
if (arr[0][0] == '0' && arr[1][0] == '0' && arr[2][0] == '0') //
{
// *
lose(); // *
} // *
//
if (arr[0][0] == '0' && arr[0][1] == '0' && arr[0][2] == '0') //
{
// * * *
lose(); //
} //
//
if (arr[0][2] == '0' && arr[1][2] == '0' && arr[2][2] == '0') //
{
// *
lose(); // *
} // *
//
if (arr[2][0] == '0' && arr[2][1] == '0' && arr[2][2] == '0') //
{
//
lose(); //
} // * * *
if (arr[0][1] == '0' && arr[1][1] == '0' && arr[2][1] == '0') //
{
// *
lose(); // *
} // *
//
if (arr[1][0] == '0' && arr[1][1] == '0' && arr[1][2] == '0') //
{
//
lose(); // * * *
} //
//
if (arr[0][0] == '0' && arr[1][1] == '0' && arr[2][2] == '0') //
{
// *
lose(); // *
} // *
//
if (arr[2][0] == '0' && arr[1][1] == '0' && arr[0][2] == '0') //
{
// *
lose(); // *
} // *
}
int main()
{
cout
#include
#include
#include
using namespace std;
void win()
{
cout 3 || pos2 > 3) ||(arr[pos1][pos2]=='x') || (arr[pos1][pos2] == '0'))
{
cout > pos1 >> pos2;
pos1 -= 1;
pos2 -= 1;
} arr[pos1][pos2 ] = 'x';
}
void change2(char arr[][3])
{
int pos1, pos2;
cout > pos1 >> pos2;
pos1 -= 1;
pos2 -= 1;
while ((pos1 < 0 || pos2 < 0 || pos1 > 3 || pos2 > 3) || (arr[pos1][pos2] == 'x') || (arr[pos1][pos2] == '0'))
{
cout > pos1 >> pos2;
pos1 -= 1;
pos2 -= 1;
} arr[pos1][pos2] = '0';
}
void pc(char arr[][3])
{
int pos1=1, pos2=1;
while (arr[pos1][pos2]!='*')
{
pos1 = rand() % 3 + 1;
pos2 = rand() % 3 + 1;
pos1 -= 1;
pos2 -= 1;
} arr[pos1][pos2] = '0';
}
void check(char arr[][3],bool &z)
{
if (arr[0][0] == 'x' && arr[1][0] == 'x' && arr[2][0] == 'x') //
{
z = false; // *
win(); // *
} // *
//
if (arr[0][0] == 'x' && arr[0][1] == 'x' && arr[0][2] == 'x') //
{
z = false; // * * *
win(); //
} //
//
if (arr[0][2] == 'x' && arr[1][2] == 'x' && arr[2][2] == 'x') //
{
z = false; // *
win(); // *
} // *
//
if (arr[2][0] == 'x' && arr[2][1] == 'x' && arr[2][2] == 'x') //
{
z = false; //
win(); //
} // * * *
if (arr[0][1] == 'x' && arr[1][1] == 'x' && arr[2][1] == 'x') //
{
z = false; // *
win(); // *
} // *
//
if (arr[1][0] == 'x' && arr[1][1] == 'x' && arr[1][2] == 'x') //
{
z = false; //
win(); // * * *
} //
//
if (arr[0][0] == 'x' && arr[1][1] == 'x' && arr[2][2] == 'x') //
{
z = false; // *
win(); // *
} // *
//
if (arr[2][0] == 'x' && arr[1][1] == 'x' && arr[0][2] == 'x') //
{
z = false; // *
win(); // *
} // *
if (arr[0][0] == '0' && arr[1][0] == '0' && arr[2][0] == '0') //
{
z = false; // *
lose(); // *
} // *
//
if (arr[0][0] == '0' && arr[0][1] == '0' && arr[0][2] == '0') //
{
z = false; // * * *
lose(); //
} //
//
if (arr[0][2] == '0' && arr[1][2] == '0' && arr[2][2] == '0') //
{
z = false; // *
lose(); // *
} // *
//
if (arr[2][0] == '0' && arr[2][1] == '0' && arr[2][2] == '0') //
{
z = false; //
lose(); //
} // * * *
if (arr[0][1] == '0' && arr[1][1] == '0' && arr[2][1] == '0') //
{
z = false; // *
lose(); // *
} // *
//
if (arr[1][0] == '0' && arr[1][1] == '0' && arr[1][2] == '0') //
{
z = false; //
lose(); // * * *
} //
//
if (arr[0][0] == '0' && arr[1][1] == '0' && arr[2][2] == '0') //
{
z = false; // *
lose(); // *
} // *
//
if (arr[2][0] == '0' && arr[1][1] == '0' && arr[0][2] == '0') //
{
z = false; // *
lose(); // *
} // *
}
int main()
{
bool z = true;
string answer;
int players;
setlocale(0, "");
srand(time(NULL));
start:
char arr[3][3]{ {'*','*','*'},{'*','*','*'},{'*','*','*'} };
cout > players;
draw(arr);
change1(arr);
check(arr,z);
draw(arr);
if (z == false)
{
goto fin;
}
if (players == 1)
{
pc(arr);
} else change2(arr);
draw(arr);
check(arr, z);
if (z == false)
{
goto fin;
}
change1(arr);
draw(arr);
check(arr, z);
if (z == false)
{
goto fin;
}
if (players == 1)
{
pc(arr);
}
else change2(arr);
draw(arr);
check(arr, z);
if (z == false)
{
goto fin;
}
change1(arr);
draw(arr);
check(arr, z);
if (z == false)
{
goto fin;
}
if (players == 1)
{
pc(arr);
}
else change2(arr);
draw(arr);
check(arr, z);
if (z == false)
{
goto fin;
}
change1(arr);
draw(arr);
check(arr, z);
if (z == false)
{
goto fin;
}
if (players == 1)
{
pc(arr);
}
else change2(arr);
draw(arr);
check(arr, z);
if (z == false)
{
goto fin;
}
change1(arr);
draw(arr);
check(arr, z);
if (z == false)
{
goto fin;
}
cout
Я тестанул, прикольно ;)
@@Ivan-Shyriaiev глупо такой программой хвастаться, но я старался)
@@meyosh8734 круто! единственно еще бы объяснялку по координатам для игрока вначале)
а если std::begin()? всеравно заменят?
здаров чувк, да, препроцессор пробежится по всему коду и где встретит слово begin заменит абсолютно все на то, что было задано ему в #define
1:06 Вы говорите о подключении файла, но при этом указываете на стандартный заголовок. Здесь вы допускаете грубую ошибку. Согласно правилам языка с++, стандартные заголовки предоставляются реализацией, и формально, вообще не являются файлами.
🧠
шифровать свой код можно))
up
Словами не передать как я благодарен автору канала. Благодаря вам у меня есть шанс закончить шарагу.
...
cout
ВАУ!!! ПРОГРАММИРОВАТЬ МОЖНО ПО РУССКИ
#include"pch.h"
#include
#include
#include
#define pi 3.14
#define начало {
#define конец }
#define вывод cout
Кумир в помощь
+
Ну шо пацаны, погнали свои недоЯПы писать?)
Спасибо
Спасибо!
спасибо
Спасибо
Спасибо