C++ Chanel
Идея для консольного приложения Создать класс который будет рисовать фигуры в консоли разными символами,с заливкой или без Позже выложу код
#include <iostream>
class Artist {
public:
void Start() {
Requesting();
}
private:
void Requesting() {
std::string figure;
bool run = 0; // run будет равна false
std::cout << "Write what figure you want to draw: \n 1: Romb \n 2: Square \n 3: Triangle \n Write number or figure name: ";
std::cin >> figure;
while (!run) {
if (figure == "1" || figure == "Romb") {
DrawRomb();
break;
}
else if (figure == "2" || figure == "Square") {
DrawSquare();
break;
}
else if (figure == "3" || figure == "Triangle") {
DrawTriangle();
break;
}
else {
std::cout << "Please enter again: ";
std::cin >> figure;
}
}
}
void DrawRomb() {
int radius{}; // radius == 0
std::cout << "Enter radius: ";
std::cin >> radius;
std::cout << "\n";
int xval = radius;
bool part1 = 1;
int sval = radius + 1;
for (int i = 0; i < (radius * 2) + 1; ++i) {
for (int j = 0; j < (radius * 2) + 2; ++j) {
if (j == xval || j == sval) {
if (j == xval) {
std::cout << "x";
}
if (j == sval) {
std::cout << "s";
}
}
else {
std::cout << " ";
}
}
if (i >= radius)part1 = false;
if (part1) {
--xval;
++sval;
}
else {
++xval;
--sval;
}
std::cout << std::endl;
}
}
void DrawTriangle() {
int height{};
char c;
std::cout << "Write height: ";
std::cin >> height;
std::cout << "\nWrite symbol to draw triangle: ";
std::cin >> c;
int index = height;
int index2 = height - 1;
std::cout << "\n";
for (int y = 0; y < height; ++y) {
for (int x = 0; x < height * 2; ++x) {
if (y == height - 1)
std::cout << c;
else if (x == index || x == index2)
std::cout << c;
else std::cout << ' ';
}
index++;
index2--;
std::cout << "\n";
}
}
void DrawSquare() {
int size{};
std::string temp;
std::cout << "Write size of side: ";
std::cin >> size;
std::cout << "\nFilled? (yes/no): ";
std::cin >> temp;
bool filled = temp == "yes";
if (!filled) {
for (int y = 0; y < size; ++y) {
for (int x = 0; x < size; ++x) {
if (y == 0 || y == size - 1)
std::cout << '#';
else if (x == 0 || x == size - 1)
std::cout << '#';
else
std::cout << ' ';
}
std::cout << "\n";
}
}
else {
for (int y = 0; y < size; ++y) {
for (int x = 0; x < size; ++x) {
std::cout << '#';
}
std::cout << "\n";
}
}
}
};
int main() {
Artist art;
art.Start();
return 0;
}
❤2🔥1
Почему не желательно писать using namespace std:
https://ru.stackoverflow.com/questions/415847/%D0%9F%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%BE-%D0%B8%D0%BC%D0%B5%D0%BD-using-namespace-std
https://ru.stackoverflow.com/questions/415847/%D0%9F%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%BE-%D0%B8%D0%BC%D0%B5%D0%BD-using-namespace-std
Stack Overflow на русском
Пространство имен (using namespace std;)
Очень часто в интернете вижу как многие программисты усердно пишут везде программы используя в коде std::. Зачем они это делают? Почему нельзя просто использовать using namespace std; перед програм...
💯2
C++ Chanel
#include <iostream> class Artist { public: void Start() { Requesting(); } private: void Requesting() { std::string figure; bool run = 0; // run будет равна false std::cout << "Write what figure you want to draw:…
тут я мог и использовать стейтмент,как и в олимпиадных задачах,там где используются только стандартная библиотека.Но про реальные проекты написано в ссылке сверху
Интересная задача на leetcode
https://leetcode.com/problems/largest-substring-between-two-equal-characters/
Решение скину позже
https://leetcode.com/problems/largest-substring-between-two-equal-characters/
Решение скину позже
LeetCode
Largest Substring Between Two Equal Characters - LeetCode
Can you solve this real interview question? Largest Substring Between Two Equal Characters - Given a string s, return the length of the longest substring between two equal characters, excluding the two characters. If there is no such substring return -1.…
❤1
Решение:
class Solution {
public:
int maxLengthBetweenEqualCharacters(string s) {
int result {-1};
for(int i = 0;i<s.size();++i){
for(int j = i+1;j<s.size();++j){
if(s[i] == s[j])
result = max(j-i-1,result);
}
}
return result;
}
};
❤1
История о том как появились foo и baz
Если кто-то не знает foo bar и baz это очень распространенные метки среди программистов,они очень часто используются в примерах разных документаций или на форумах.Примеры на фото выше.
1.Взято со stack overflow:
Foo и bar произошли от армейского акронима времён Второй мировой, FUBAR — “Fucked Up Beyond All Recognition” (англ. “Разбито в хлам”). Во время кампаний в Северной Африке и Сицилии (1942–1943) возникло целое семейство таких сокращений, которые можно найти в книге Рика Эткинсона Day of Battle: The War in Sicily and Italy, 1943-1944. Например, сокращение JANFU означает “Joint Army Navy Fucked Up” (англ. “Союз армии и флота облажался”), и применялось, в частности, для описания инцидента 11 июля 1943 года, когда британский флот сбил 23 транспортных самолёта США с десантом.
В реальном деве переменная не должна быть бессмысленной!!!!
Например в циклах i,j,k и так далее (от итерации)
Если кто-то не знает foo bar и baz это очень распространенные метки среди программистов,они очень часто используются в примерах разных документаций или на форумах.Примеры на фото выше.
1.Взято со stack overflow:
Foo и bar произошли от армейского акронима времён Второй мировой, FUBAR — “Fucked Up Beyond All Recognition” (англ. “Разбито в хлам”). Во время кампаний в Северной Африке и Сицилии (1942–1943) возникло целое семейство таких сокращений, которые можно найти в книге Рика Эткинсона Day of Battle: The War in Sicily and Italy, 1943-1944. Например, сокращение JANFU означает “Joint Army Navy Fucked Up” (англ. “Союз армии и флота облажался”), и применялось, в частности, для описания инцидента 11 июля 1943 года, когда британский флот сбил 23 транспортных самолёта США с десантом.
В реальном деве переменная не должна быть бессмысленной!!!!
Например в циклах i,j,k и так далее (от итерации)
Немножечко про set,как найти последний элемент в сете ( самый большой ):
в С++ set это структура данных которая хранит набор уникальных элементов.Это значит, что каждый элемент в сете может присутствовать только один раз.Элементы в сете не имеют определенного порядка. Это означает, что вы не можете получить доступ к элементам сета по индексу, как в массиве или списке.В стандартной библиотеке C++ контейнер std::set обычно реализуется как красно-черное дерево. Красно-черное дерево является одной из наиболее эффективных реализаций сбалансированных деревьев поиска, которые обеспечивают операции вставки, удаления и поиска за логарифмическое время в среднем. Фото красно-черного дерева выше!!!
Set довольно часто использую в задачах как и map который также реализуется через красно-черное дерево.
в С++ set это структура данных которая хранит набор уникальных элементов.Это значит, что каждый элемент в сете может присутствовать только один раз.Элементы в сете не имеют определенного порядка. Это означает, что вы не можете получить доступ к элементам сета по индексу, как в массиве или списке.В стандартной библиотеке C++ контейнер std::set обычно реализуется как красно-черное дерево. Красно-черное дерево является одной из наиболее эффективных реализаций сбалансированных деревьев поиска, которые обеспечивают операции вставки, удаления и поиска за логарифмическое время в среднем. Фото красно-черного дерева выше!!!
Set довольно часто использую в задачах как и map который также реализуется через красно-черное дерево.
К примеру: https://codeforces.com/problemset/problem/469/A простенькая задача идея которой взять два массива и соединить их в сет( из двух массивов {2,3,3} и {1,4,66,5} мы получим один сет {1,2,3,4,5,66})
Также нам нужно проверить какой самый большой элемент из двух массивов.Но как же это сделать???Можно завести переменную,но можно сделать еще легче через указатель для доступа к элементам контейнера.Для того чтобы получить последний элемент мы сначала получаем итератор на последний элемент множества a с помощью a.end(), а затем сдвигаем его на один элемент назад с помощью операции декремента --. И, наконец, с помощью операции разыменования * мы получаем значение элемента, на который указывает этот итератор, то есть мы получили последний элемент множества a.
Также нам нужно проверить какой самый большой элемент из двух массивов.Но как же это сделать???Можно завести переменную,но можно сделать еще легче через указатель для доступа к элементам контейнера.Для того чтобы получить последний элемент мы сначала получаем итератор на последний элемент множества a с помощью a.end(), а затем сдвигаем его на один элемент назад с помощью операции декремента --. И, наконец, с помощью операции разыменования * мы получаем значение элемента, на который указывает этот итератор, то есть мы получили последний элемент множества a.
*—a.end()
Codeforces
Problem - 469A - Codeforces
Codeforces. Programming competitions and contests, programming community
❤🔥1
Решение задачи:
#include <iostream>
#include <set>
using namespace std;
int main()
{
int n;
cin >> n;
int p;
int q;
set<int> res;
cin >> p;
for (int i = 0; i < p; ++i) {
int temp;
cin >> temp;
res.insert(temp);
}
cin >> q;
for (int i = 0; i < q; ++i) {
int temp;
cin >> temp;
res.insert(temp);
}
if (res.size() == n && *--res.end() == n) {
cout << "I become the guy.";
}
else {
cout << "Oh, my keyboard!";
}
return 0;
}
🍓3
Супер интересная задача на знания контейнеров map и кодировочных наборов ( Следующий пост про них )
https://codeforces.com/problemset/problem/1927/B
Решение и объяснение будет в след посте
https://codeforces.com/problemset/problem/1927/B
Решение и объяснение будет в след посте
Codeforces
Problem - 1927B - Codeforces
Codeforces. Programming competitions and contests, programming community
Решение задачи:
#include <iostream>
#include <set>
#include <map>
#include <vector>
using namespace std;
int main() {
int t{};
cin>>t;
vector<string> res;
for(int g = 0;g<t;++g){
int n;
cin>>n;
string result;
vector<int> v(n,0);
for(int i = 0;i<n;++i){
cin>>v[i];
}
map<char,int> m;
for(int i = 0;i<n;++i){
int w = 97;
for(int j = 0;j<26;++j){
if(m[w] == v[i]){
result+=(char)(w);
++m[w];
break;
}else{
w++;
}
}
}
res.push_back(result);
}
for(string s : res){
cout<<s<<endl;
}
return 0;
}
Как решить эту задачу?
Перед тем как решать ее нужно узнать как использовать map.
Если кто-то не знает - map ассоциативный контейнер основанный на ключах и значениях.Каждый элемент в map представляет собой пару ключ-значение, где ключ уникален внутри контейнера.Если вы обратитесь к любому ключу, он автоматически создан.Например, у нас есть map<char,int>:
Таким образом у нас будет автоматически сохранено значение 0 в ключ 'a'.
Также как и set,использует красно-черное бинарное дерево для хранение элементов,Это обеспечивает быстрый и эффективный поиск элементов по ключу.На удаление и вставку за логарифмическое время , занимает (O(log n)),Логарифмическое время означает, что время выполнения алгоритма растет не пропорционально размеру входных данных, а логарифмически зависит от размера входных данных.
Перед тем как решать ее нужно узнать как использовать map.
Если кто-то не знает - map ассоциативный контейнер основанный на ключах и значениях.Каждый элемент в map представляет собой пару ключ-значение, где ключ уникален внутри контейнера.Если вы обратитесь к любому ключу, он автоматически создан.Например, у нас есть map<char,int>:
std::map<char,int> m;
if ( m['a'] == 0 ){
std::cout<<"zero";
}
Таким образом у нас будет автоматически сохранено значение 0 в ключ 'a'.
Также как и set,использует красно-черное бинарное дерево для хранение элементов,Это обеспечивает быстрый и эффективный поиск элементов по ключу.На удаление и вставку за логарифмическое время , занимает (O(log n)),Логарифмическое время означает, что время выполнения алгоритма растет не пропорционально размеру входных данных, а логарифмически зависит от размера входных данных.
Указатели на функцию???
Да,в С++ такое возможно в качестве переменной или аргумента.
Недавно перечитывал cplusplus.com и увидел что в параметры можно принимать не только обычные типы,а и void что меня удивило.
Если мы напишем вот так то строка
Или можно сделать указатель на функцию в параметры:
Да,в С++ такое возможно в качестве переменной или аргумента.
Недавно перечитывал cplusplus.com и увидел что в параметры можно принимать не только обычные типы,а и void что меня удивило.
int square(int x) {
return x * x;
}
int main() {
int (*myPointer)(int) = square;
std::cout << "Квадрат: " << myPointer(5) << std::endl;
}
Если мы напишем вот так то строка
int(*myPointer)(int) = square;
будет r_value.Или можно сделать указатель на функцию в параметры:
void foo(int (*function)(int), int value) {
int result = function(value);
std::cout << "Result: " << result << std::endl;
}
int square(int x) {
return x * x;
}
int main() {
int (*myPointer)(int) = square;
foo(myPointer, 3);
}
👍3
Вот еще один пример из самого cplusplus.com :
void increase (void* data, int psize)
{
if ( psize == sizeof(char) )
{ char* pchar; pchar=(char*)data; ++(*pchar); }
else if (psize == sizeof(int) )
{ int* pint; pint=(int*)data; ++(*pint); }
}
int main ()
{
char a = 'x';
int b = 1602;
increase (&a,sizeof(a));
increase (&b,sizeof(b));
cout << a << ", " << b << '\n';
return 0;
}
Что такое умные указатели в С++?
Я думаю,что все знают что такое указатель(raw pointer) или необработанный указатель.Но для обычных указателей нужно особое внимание,так как они с легкостью сломают ваше приложение.Ихнее управление зависит только от вас,если вы динамически выделяете память( new some_type ),то вы должны удалить его в ручную ( delete some_type ) в массивах за это отвечает другой оператор( один из таких: delete[] ).И во время написания кода,вам нужно помнить какой оператор нужно использовать.А если вы случайно ошиблись - может привести к неопределенному поведению / Undefined behavior .
Чтобы избегать проблем с утечкой памяти,придумали умные указатели.Они сами делают деаллокацию,например когда вы выходите из функции (и многое другое).На самом деле,умные указатели это просто класс который проводит все манипуляции под капотом.Насчет деалокации - просто срабатывает деструктор класса который освобождает выделенную память.
Начиная с С++11 появилось три основных типа умных указателей:
std::unique_ptr — умный указатель, владеющий динамически выделенным ресурсом.
std::shared_ptr — это умный указатель, который управляет разделяемым динамически выделенным ресурсом. Он поддерживает совместное владение ресурсом несколькими std::shared_ptr, и внутренний счетчик отслеживает количество указателей, владеющих ресурсом.
std::weak_ptr — подобен std::shared_ptr, но не увеличивает счетчик.
Я думаю,что все знают что такое указатель(raw pointer) или необработанный указатель.Но для обычных указателей нужно особое внимание,так как они с легкостью сломают ваше приложение.Ихнее управление зависит только от вас,если вы динамически выделяете память( new some_type ),то вы должны удалить его в ручную ( delete some_type ) в массивах за это отвечает другой оператор( один из таких: delete[] ).И во время написания кода,вам нужно помнить какой оператор нужно использовать.А если вы случайно ошиблись - может привести к неопределенному поведению / Undefined behavior .
Чтобы избегать проблем с утечкой памяти,придумали умные указатели.Они сами делают деаллокацию,например когда вы выходите из функции (и многое другое).На самом деле,умные указатели это просто класс который проводит все манипуляции под капотом.Насчет деалокации - просто срабатывает деструктор класса который освобождает выделенную память.
Начиная с С++11 появилось три основных типа умных указателей:
std::unique_ptr — умный указатель, владеющий динамически выделенным ресурсом.
std::shared_ptr — это умный указатель, который управляет разделяемым динамически выделенным ресурсом. Он поддерживает совместное владение ресурсом несколькими std::shared_ptr, и внутренний счетчик отслеживает количество указателей, владеющих ресурсом.
std::weak_ptr — подобен std::shared_ptr, но не увеличивает счетчик.
Wikipedia
Undefined behavior
behavior of erroneous computer programs that the language standard permits to be unpredictable