C++ Chanel
619 subscribers
44 photos
6 videos
53 links
Download Telegram
Для разработки приложений под новый Apple Vision Pro нужно иметь специальный коннектор,для подключения очков к маку,аймаку

Цена 300$…
Идея для консольного приложения

Создать класс который будет рисовать фигуры в консоли разными символами,с заливкой или без

Позже выложу код
3🤮1
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
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:…
тут я мог и использовать стейтмент,как и в олимпиадных задачах,там где используются только стандартная библиотека.Но про реальные проекты написано в ссылке сверху
Решение:
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 и так далее (от итерации)
Немножечко про set,как найти последний элемент в сете ( самый большой ):

в С++ 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.end()
❤‍🔥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
Решение и объяснение будет в след посте
Решение задачи:
#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>:

std::map<char,int> m;
if ( m['a'] == 0 ){
std::cout<<"zero";
}


Таким образом у нас будет автоматически сохранено значение 0 в ключ 'a'.

Также как и set,использует красно-черное бинарное дерево для хранение элементов,Это обеспечивает быстрый и эффективный поиск элементов по ключу.На удаление и вставку за логарифмическое время , занимает (O(log n)),Логарифмическое время означает, что время выполнения алгоритма растет не пропорционально размеру входных данных, а логарифмически зависит от размера входных данных.
Указатели на функцию???

Да,в С++ такое возможно в качестве переменной или аргумента.
Недавно перечитывал 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, но не увеличивает счетчик.