Сообщество - Лига программистов C/C++
Добавить пост

Лига программистов C/C++

43 поста 4 207 подписчиков
2449

Каждый должен изучать Библию

Каждый должен изучать Библию Комиксы, Программирование, Библия, Школа, Здравый смысл, Религия, Юмор, C++

Не то чтобы я сильно художник, и уж тем более не по комиксами. Просто захотелось попробовать.

Показать полностью 1
12

Сортировка пузырьком или самая легкая сортировка

В данном блоге я рассмотрю самою простую сортировку, которая поможет вам понять как работают сортировки.

- Почему метод называется методом пузырьком?
- Потому что легкие элементы (наименьшие) как-бы всплывают (прижимаются к левому краю списка), а тяжелые (самые большие) как-бы оседают на дно (прижимаются к правому краю списка). Таким способ массив и сортируется, так как самые элементы будут сортироваться в порядке возрастания: от самых легких, до самых тяжелых.
Что нам понадобиться для написания сортировки пузырьком:
- Умение писать циклы
- умение свопать (переставлять местами) элементы
- Массив

Код на C++:

https://gist.github.com/l-arkadiy-l/6662668989adcf579e21aeee14d04da3


Код на Python:

https://gist.github.com/l-arkadiy-l/41dfa4a9ae96f6821512e13f64e65a25


У вас может возникнуть логичный вопрос: А почему второй for идет от i до N — i — 1?

А потому что мы за каждую итерацию вложенного фора прижимаем наибольший элемент в массиве [0, N — i — 1], сейчас поясню: В первой итерации мы рассматриваем весь массив, от 0 до N — 1. До N — 1, потому что массив нумеруется с 0 и до N — 1.


Так вот:
- Первая итерация: прижимаем к правому краю max(arr[0, N — 1])
- Вторая итерация: прижимаем к правому краю max(arr[0, N — 2])
- Третья итерация: прижимаем к правому краю max(arr[0, N — 3])
- Четвертая итерация: прижимаем к правому краю max(arr[0, N — 4])
- и так далее...

В завершении блога хочу сказать, что этот алгоритм работает за квадрат O(n * n) — это медленно, так что в следующих блогах я рассмотрю более быстрые алгоритмы для сортировки.



Я на codeforces: https://codeforces.com/profile/Fin_ger

Показать полностью
13

Задача про ожерелье на C++

Друзья, задал себе небольшую задачку из журнала Квант, вроде бы простая. Но появились трудности в написании кода.

Задача про ожерелье на C++ Задача, C++, Логика, Программирование
Показать полностью 1
252

Программирование на C в эпоху ООП. Оно такое

Программирование на C в эпоху ООП. Оно такое Программирование, Профессиональный юмор, Си
Показать полностью 1
17

Стек, функция, передача по значению

Друзья, пишу небольшие карточки для школьников по Ардуино. Сейчас проходим функции, а именно передачу по значению. В теории как и на практике всё понятно, но описать понятным для них языком проблематично. Упрощаю уже до "нельзя". Есть ли какие замечания по представленному? Любая критика или помощь, только - За!

Стек, функция, передача по значению Arduino, Программирование, Школьники
52

Типобезопасные контейнеры в GNU C11 без кодогенерации

Всем привет!
Я решаю проблему про которую никто не знает, на языке, на котором никто не пишет. Это пост про язык Си.

Я сам не пишу на Си уже очень давно. Профессионально последние 7 лет только на C++ и C#. Но Си очень привлекает своей простотой. Но отталкивает отсутствием множества удобных штук.

Есть интересное открытие, которым я хотел бы поделиться, но не знаю с кем, так как мало кто пишет на Си и вообще задумывается о нем. Поэтому напишу тут, вдруг кому-то будет интересно. Это не готовое решение, а лишь идея, которая пришла в голову вчера утром и обросла деталями в течении дня.


Не хочу чтобы идея пылилась, хочу скорее от нее освободиться и вернуться к работе. Поэтому в посте мало деталей, пожалуйста, посмотрите пример, там вроде все довольно понятно.


Вот сразу ссылка на пример в Wandbox - https://wandbox.org/permlink/pOwkHRfWyipp8P89

1. Проблема
Если вы хотите универсальные контейнера на Си, можно пойти двумя путями:
1. Макросы, которые работают почти как шаблоны в C++, генерировать функции для доступа к контейнерам для тех типов, которые вы хотите использовать. Вот пример: https://github.com/stefanct/sglib
Это быстро, но требует объявить все используемые типы в одном месте, что усложняет разделение проекта на модули. Поправьте, если я не прав.
2. Типы данных, хранящие всю инфорацию внутри как это сделано в Glib  https://developer.gnome.org/glib/2.66/ в данном случае, невозможно организовать типобезопасность, повсеместно используюется void* . Меняешь тип контейнера и не знаешь, что после этого отвалится. Моя цель - решить именно этот класс проблем.


2. Как выглядит решение
Так вот, слыхали что существует C11? Это почти как C++11, только C11.


Так вот, там появилось такое ключевое слово _Generic, которое позволяет выбрать функцию, в зависимости от типа и позволяет сделать какую ни какую перегрузку функций (которой нет в Си из коробки)

Оказалось, что используя _Generic  + typeof() из GNU + указатели на функции можно сделать типобезопасные контейнеры прямо в Си! Эти контейнеры не используют кодогенерацию, однако так же удобны в использовании (хотя будут чуть медленней работать, но в большинстве случаев удобство важнее)


Вот короткий пример создания вектора:

ABVECTOR(int) numbers = CREATE_ABVECTOR(int);
for (int i = 0; i < 20; i++)
*PUSH( numbers) = i; // обратите внимание, тип известен!

В данном примере ABVECTOR(int) это аналог std::vector<int>

Если поменять тип контейнера, или тип переменной хоть в одном месте, вы получите ошибку компиляции. А это ровно то, чего я хочу!

Другой пример, передача контейнера в качестве аргумента в функцию:

void printValues(ABVECTOR(float) numbers)
{
for (float* iter = BEGIN(numbers); iter != END(numbers); iter = NEXT(numbers, iter))
printf("Val: %f\n", *iter);
for (int i = 0; i < LENGTH(numbers); i++)
printf("Val: %f\n", *GET(numbers, i));
}

Если передать в функцию неправильный тип контейнера, например List, вместо Vector - будет ошибка. Если тип элемента контейнера будет отличаться - то же ошибка.

3. Как этого добиться?

1. Использовать указатель на функцию чтобы хранить сразу два типа, тип контейнера + тип элемента. Например int (*) (ABVector*)

2. Использовать typeof, чтобы достать тип элемента контейнера typeof( X(0) ) - получение типа результата вызова функции

3. Использовать _Generic, чтобы проверить тип контейнера

_Generic(( X ), typeof(X(0)) (*) (ABVector*) : __my_container_func__ )(X)

На этом пожалуй все ) Спасибо за внимание!

Не забудьте потыкать пример в Wandbox - https://wandbox.org/permlink/pOwkHRfWyipp8P89

Показать полностью
618

С++ стрим от Тимофея Хирьянова

Преподаватель МФТИ запустил трансляцию лекцию Алгоритмы и структуры данных с++

15

Как устроиться на работу Trainee/Junior?

Не так давно к нам с женой в гости приехала подруга жены, с молодым человеком. Этот молодой человек (который оказался действительно прилично моложе меня) работает программистом в достаточно большой компании. Он оказался крайне интересным человеком и с помощью пары бутылок вина я решил перейти на темную сторону. Тобишь, сменить специализацию. Как итог - теперь я учу c++ примерно по 4 часа в сутки с пару месяцев. Как ни странно, оказалось, что мне это очень сильно нравится и уже начало что-то получаться. Но вот дилемма: на данный момент у меня есть основная профессия, которая занимает примерно пол дня, 3-4 дня в неделю. Иногда меньше, но бывает и сутками без вынимачки. Все зависит только от меня. Проблема в том, что эта профессия кормит как меня, так и мою семью. И как уйти из нее в программирование, примерно на те же деньги - я не знаю. На данный момент я могу претендовать только на trainee, может, на недо-джуна. Я трезво оцениваю свои навыки и понимаю, что сразу принести пользу компании - я вряд ли смогу. Значит, компания будет со мной работать в минус, ведь это - рабочее место, время и силы кадровика, нервы и человеко-часы наставника. На выходе - имеем вилку: работодатель забирает меня на полный рабочий день и платит мне заработную плату, с которой я кормлю семью, либо работодатель забирает меня не на full time, на какой-то более "мягкий" график, я продолжаю кормить семью с старой работы, работая (получая практику) бесплатно. Конечно, оба варианта меня полностью устраивают.

Но реальность немного другая. Я пару дней искал подобные варианты, но даже с бесплатной работой - такие как я - просто не нужны. Никто не хочет заморачиваться, никто не будет верить в то, что потом я останусь работать в той же компании, которая сможет "пригреть" и обучить "под свои нужды".

Дорогие Пикабушники, расскажите, как Вы устроились в первый раз? Сталкивался ли кто-то с такой сменой профессии? Как Вы выходили из подобной ситуации?

Показать полностью
1978

Стилистические Войны программистов

Когда-то давным давно я склепал и залил в инет несколько юмористических картинок касательно стилистики написания кода на C++, которые мгновенно разлетелись и вызвали тогда много срача жарких дискуссий на эту тему... И вот перерывая свои старые и пыльные архивы я сейчас снова на них случайно наткнулся. Поэтому решил поделиться с вами полной подборкой. :)

Не сочтите за баян, надеюсь, что кого-нибудь вдохновит и он выложит в комментариях свои достойные варианты на эту тему :))

// [0]

Стилистические Войны программистов Программирование, C++, Юмор, Длиннопост

// [1]

Стилистические Войны программистов Программирование, C++, Юмор, Длиннопост

// [2]

Стилистические Войны программистов Программирование, C++, Юмор, Длиннопост

// [3]

Стилистические Войны программистов Программирование, C++, Юмор, Длиннопост

А вот вариант от некоего пользователя под ником Ges( если ты есть на Пикабу, то респект тебе - долго смеялся с твоей картинки :)) )

Стилистические Войны программистов Программирование, C++, Юмор, Длиннопост

P.S. Баянометр ругался на одну отдельно выложенную картинку :)

Показать полностью 5
905

С++ [Тетрис]

Немного лёгкой наркомании...

Мои подписки
Подписывайтесь на интересные вам теги, сообщества,
пользователей — и читайте свои любимые темы в этой ленте.
Чтобы добавить подписку, нужно авторизоваться.
Отличная работа, все прочитано!