Красиво, но зря
7 мая вечером в Вологде. Пострадавшую 23-летнюю байкершу отправили в больницу.



7 мая вечером в Вологде. Пострадавшую 23-летнюю байкершу отправили в больницу.




А у нас черёмуха цветёт. И сразу стихи вспоминаются:

Черёмуха
Черёмуха душистая
С весною расцвела
И ветки золотистые,
Что кудри, завила.
Кругом роса медвяная
Сползает по коре,
Под нею зелень пряная
Сияет в серебре.
А рядом, у проталинки,
В траве, между корней,
Бежит, струится маленький
Серебряный ручей.
Черемуха душистая,
Развесившись, стоит,
А зелень золотистая
На солнышке горит.
Ручей волной гремучею
Все ветки обдает
И вкрадчиво под кручею
Ей песенки поет.
@ С. А. Есенин





Мода на бумбоксы со встроенным телевизором большинство из которых имели даже не жидкокристаллическую матрицу, а классический кинескоп небольшой диагонали, началась в конце 1970-х годов и достигла своего пика после запуска в начале 1980-х музыкального телевидения.
Philips 10CX 1130-Combi
Пожалуй, это самый большой кассетный бумбокс с телевизором, впервые выпущенный в 1981 году. Центральную часть фронтальной панели занимает цветной (!) телевизор с 10-дюймовым экраном.

Panasonic TR-1200X
Геттобластер 1982 года выпуска включал внушительный черно-белый телевизор размером 29 см по диагонали.

Sony FX-41
Данная магнитола выпускалась с 1979 года. Встроенный телевизор был чёрно-белый, c ЭЛТ-трубкой размером 3,7 дюйма по диагонали.

Sharp CT-6001
Мощный и весьма дорогой геттобластер 1980 года с опять же цветным (!) телевизором, достаточно редким для тех лет. Вторым названием модели для японского рынка было The Searcher.

Вот объясните мне тупому. До появления мелкой коробки Умку вполне устраивала покрупнее. Пледик ей не мешает - он ей до лампочки. Вот какого хрена она пытается влезть (и ведь влазит) в мелкую?
А если ей дать коробку ещё на 30% меньше чем эта - так же впихнёт себя туда?

Микробиолог из Чикаго провёл эксперимент: клал еду на пол на 5, 10, 30 и 60 секунд, а потом проверял, сколько микробов на ней осталось. Бактерии попадают на пищу моментально и размножаются активно, независимо от времени.

Квакши – это почти исключительно древесные лягушки, поэтому способность закрепляться на любых поверхностях для них – не приятный бонус, а жизненная необходимость.
На кончиках пальцев каждой квакши находится небольшой диск с желёзками, выделяющими клейкий секрет при надавливании, а сами диски работают как присоски. Благодаря сочетанию этих факторов квакша может дрыхнуть даже на стекле!
Если кто-то помнит, то разархивирование мы уже показывали - тут
В действительности известен один подобный случай. В 1914 году американская почтовая служба переправила 5-летнюю девочку из штата Айдахо в город за 150 километров. Таким образом родители переправили дочку к дедушке и бабушке. И хотя это единичный такой случай, все-таки в 1920 году генеральный почтмейстер США Альберт Берльсон запретил отправлять детей по почте.

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

Римский скорпион (лат. scorpio), использовавшийся легионами со II века до н. э., был легкой баллистой, ставшей символом инженерного мастерства римлян в осадных технологиях.

Эти небольшие метательные машины применялись для точечных ударов и поддержки пехоты в полевых сражениях.⠀Скорпион представлял собой деревянную конструкцию с двумя рычагами, натягиваемыми скрученными жгутами из сухожилий или конского волоса. Он стрелял короткими стрелами (дротиками) длиной около 70 сантиметров с железными наконечниками, пробивая доспехи на расстоянии до 100 метров. Один скорпион обслуживался двумя солдатами, а его скорострельность достигала 3–4 выстрелов в минуту.
Это оружие было идеально для подавления вражеских лучников или защиты укреплений: скорпионы могли вести прицельный огонь, прикрывая легионеров при наступлении или отступлении. Согласно Полибию, во время Второй Пунической войны (218–201 годы до н. э.) именно скорпионы помогли римлянам отбить атаки карфагенских войск при осаде Сиракуз.

Главным недостатком скорпиона была его уязвимость к влаге, которая ослабляла натяжение жгутов, снижая точность и дальность стрельбы. Кроме того, против крупных осадных машин или массированных атак пехоты он был малоэффективен, что вынуждало римлян комбинировать его с другими видами оружия.
Обучение работе со скорпионом требовало высокой точности и слаженности. Историк Вегеций отмечал, что римские артиллеристы тренировались на специальных полигонах, стреляя по мишеням с расстояния 50–70 метров, чтобы добиться максимальной меткости в бою.
Когда словом недели выпало Процедура, то многие вздрогнули, ибо перед внутренним взором встало, что-то подобное.

Однако находчивые и креативные вомбатяне, что особенно хочется отметить и новые участники ивента, доказали, что процедура это не только запах больницы и сухие строчки кода, но и…
Запах больницы, прежде всего :) об этом поведала Thefoxinmyheart с захватывающей историей как на ровном месте создать проблемы и героически их преодолеть в посте об экзаменах, парковках и стоматологах https://vombat.su/post/60470-kak-sozdat-sebe-problemi-na-pustom-meste

И во вторых тоже, поскольку K.Bajun знает толк в пикантных анекдотах

И даже немного в третьих поскольку DoctorrHamster провела процедуру замены выцветшего Новичка на опытного Токсика

Процедуру выбора папы римского принес Yasher_Ko, не своё, но интересное

Суровой методикой процедуры взлома шифров поделился lovefst, методика проверенная 90-ми, к повторению не рекомендована, что только добавляет шарма к посту

Мойка крокодила процедура странная, но в неволе крайне необходимая, об этом напомнил Книга_животных

Forest.river прогнула этот цифровой мир под себя, хотя и приложила много усилий, чтобы вызвать врача на дом

и тем же временем осчастливила своих хомяков беговыми процедурами

На этой неделе UrmasTormas напомнил, что песня это то, что сильно помогало в процедуре изгнания фашисткой нечисти с территории Советского Союза и Европы! История песни дорога на Берлин отличное тому подтверждение

Две легенды двух музыкальных жанров, интересный и необычный каллаб для нечестной процедуры изъятия денег у населения, а может и честной…

Будьте внимательны с внезапным запахом прелого сена JasonWoorhies раскрыл тему хлороформа и его окислов – ОБЖ для всех любознательных

Не обойтись без металл-просвета в рамках ивента с процедурой распятия

Процедура взвешивания, не прибавить, не убавить за авторством Var_an

Вомбат just in time IvanKr08 за пару минут до конца недели не позволил проигнорировать программирование.С мемами и картинками, всё как мы любим

Слово следующей недели такое, что грешно не отметиться постом!

Напоминаем правила ивента:
1.
Раз в неделю, по понедельникам случайно генерится слово. Это слово
будет основой для ваших постов. Неважно что вы сделаете, слепите,
нарисуете, напишите стих с этим словом, расскажете анекдот, свою историю
с этим словом, даже с помощью генератора мемов можно, абсолютно
неважно.
2. Ивент с данным словом длится до следующего понедельника, когда будет озвучено новое, случайно сгенерированное слово.
3. Необязательно чтобы выпавшее слово было лейтмотивом. Ну например выпадет слово кит - может быть картинка загадка о морских существах, на которой изображен один кит, а найти надо дельфина. Или созданный комикс/мем, в котором вообще речь о другом, но на пряжке у героя изображен кит. Или может у вас завалялась история из жизни, где кит просто был второстепенным объектом, или названием бара где все происходило. Т.е. слово обязательно должно присутствовать в работе, но может не являться ее заглавной темой. А может и являться.
4. Все посты публикуйте под тегом "Ивент Вомбата" и "Свобода".
@vombat просьба закрепить новое слово, пожаалуйста
Предупреждаю сразу, пишется сие ради лулза (рофла, кека, чебурека) и желания выговориться, тем самым снизить уровень стресса. Или не снизить. Или не стресса.
На правах ©арказма.
Общага (ааа, ммм, наркоти... общагааа...), как много в этом простом слове...Общага - это твой дом на время вахты, это место где есть возможность выдохнуть после долгого дня, где работа тебя не достанет (но это не точно). Но это если тебе повезет, и общага будет норм и соседи тоже. А бывает и наоборот. Начнем.
ЩИКАРДОС+ Это редкий случай, когда тупо снимается квартира, на 2-3 комнаты и тебе заселяют туда. Часто так делают, когда с/у (строительный участок) только открывается, народа ещё мало и общагу ещё не нашли или не построили.
Щикардос. Щикардос, это когда с/у стоит в относительных ебенях, но рядом есть санаторий или ещё какой пионерлагерь и ваша контора, вместо строительства модулей, тупо арендует вот этот вот всё. Зачастую, тут сразу всё в шоколаде, нормальные комнаты, по 2-3 кровати в один ярус, с туалетной/душевой комнатой прям в номере, чистота и порядок, никаких тараканов или (упасиХоспади) клопов. Но такое бывает редко.
Щикардос на пол-шишечки. Когда также арендуют какое-то недоофисное здание времён перестройки (КОНТОРА ЁПТ), и переделывают его под общагу в темпе вальса. Это значит, что в каждую комнату постараются набить побольше двухъярусных кроватей, туалет-душевая будут в подвале или в хер-пойми-где, кухня будет выглядеть как два сраных чайника, унылая плитка и микроволновка, распиханных по подоконникам. Тоже неплохо, ибо зачастую такое практикуется, когда с/у находится в черте какого-нибудь города. А значит, рядом магазины и прочая ебутня.
Модульные здания. Берется куча сэндвич-панелей, труб, профилей и прочего, и хуяк-хуяк-хуяк, быстренько строится общага. Как правило, все уже спроектировано, нарезано, подготовлено, остаётся только собрать. Есть фуфлыжные модуля, а есть и прям норм такие, теплые, аккуратные, удобные. Обычно все удобства в них есть, хоть и общего пользования.
Отдельные вагончики. Те же самые модуля, только сральник на улице, умывальник типа "рукомойник-ведро". Есть с отоплением от электрообогревателя, а есть и с печкой-буржуйкой, то ещё "удовольствие".
Бичарник/Клоповник.Тупо ушатанное здание, куда народ запихивают как сельдь в бочку. В комнатах по 18м² стоит по шесть двухъярусных кроватей, дышать нечем, зато не холодно, ибо наперженно/надышано. Крысы, тараканы, клопы, муравьи, алкаши, полный спектр паразитов и вредителей. Уборка отсутствует как таковая, ноги прилипают к полу, мухи прилипают к потолку, накурено везде, сплошная антисанитария, шанс выхватить спидорак и кишечную палочку 99,999999999%. В отдельных случаях попадаются такие бичарники , что люди умудряются ещё и спать по очереди, на одной кровати, типа ночная смена ушла, спит дневная и наоборот. Спасение тут только одно: "Ганс, неси огнемет!"
По видео понять сложно (особенно если ты не летяговед), но скорее всего перед нами красуется парочка обыкновенных гигантских летяг – самых распространённых представителей своего рода. Грызуны известны не только своими габаритами – весят они до 3 килограмм – но и приличными способностями к полёту. В идеальных условиях летяги могут пролететь до 450 метров за раз!
Моя сестра, бывшая Алина, но будучи гражданкой маленького, но гордого государства Израиль пользуется тележками. Да и в Европе в целом тележка - не возрастной ценз. А в России все же гордые! Мы не ищем лёгких путей. )) Я живу в крупном городе-миллионике, где нет смысла иметь свой автомобиль. Ну разве что какой-нибудь пробочно-дорожный мазохист мне возразит. Сегодня закупил много чего вкусного и оно весит ё-моё. Я с телегой, которую сшил сам. (На фото) Ну, я не телегу сшил, понятно. А эту хрень, которая надета на фигню с колёсами. Фигню с колесами я приобрел в Ашане. Без хрени, просто фигню. Потом сшил под фигню хрень. Ясно выразился, надеюсь?)) Ну я много чего шью. Обожаю брутальность в шитье! И чтобы стежок аж 6-7 мм.
Ну к теме. А то отвлёк себя и вас. Какого пениса в России все горазды? На подвиги, разумеется. Сегодня по дороге с большого Магнита встретил и старых и молодых. С огромными пакетами. Пёрли через слезу всю тяжесть. А я такой, насвистывая нецензурочку, боевым маршем да с телегою! )


Ну я и по натуральной коже шью... Сумки, кошельки. Только не на продажу. Жена называет меня шьюха.))


Большинство процессоров Фон-Неймановской архитектуры в своей конструкции предлагают механизмы стека. Кто играл в покер должны вспомнить стеки фишек. То есть некие значения, сложенные друг на друга (обычно это переменные, в частности адреса в памяти). При этом основными операциями являются добавление фишки на вершину (инструкция PUSH) и ее снятие (инструкция POP). Еще можно косвенно читать и заменять (перезаписывать) фишки относительно вершины (на вершину указывает регистр SP, неявно обновляется через POP и PUSH) или основания (указывает регистр BP) вглубь.

Помимо хранения локальных переменных стек позволяет делать довольно интересную вещь: мы можем положить на стек все необходимые аргументы (x в математике, но их может быть несколько), адрес следующей инструкции (взяв из указателя инструкции IP, это будет адрес возврата), после чего совершить прыжок на какой-нибудь другой адрес (сохранение адреса и прыжок делаются инструкцией CALL).
А на этом адресе может быть функция. Сначала она кладет текущий BP на стек, после чего приравнивает основание к вершине (BP к SP), тем самым создав для себя "новый стек" сразу после предыдущего (это еще называется стековым кадром), в котором якобы лежит только значение старого основания стека (BP), чтобы можно было восстановить его перед возвратом.

После чего функция может прочитать переданные ей аргументы относительно основания своего стека вниз (технически это будет выход за границы текущего стека), выполнить с этим какие-либо действия (записать в файл, вывести в консоль, просто перемножить) и сохранить результат (обычно результат сохраняется не на стек, а в регистр AX).
После чего функция восстанавливает старое значение BP, сняв его со стека, и выполняет команду RET, которая снимает со стека адрес возврата и совершает переход на него, тем самым переключившись на инструкцию сразу после CALL.
И эта система так или иначе перекочевала в большинство высокоуровневых языков начиная с FORTRAN. К примеру в C CALL превратился в круглые скобки, RET в return, а адреса и метки в имена (при этом без скобок они все еще являются указателями, то есть адресами).
Пример кода (к сожалению, штатного форматирования не предусмотрено):
#include <stdio.h>
int pow2(int x) {
return x * x;
}
int main() {
int y = pow2(16); // Вызов функции. В y будет сохранено число 256
printf("%p", pow2); // Без скобок вместо вызова просто выведет адрес функции
return 0; // Возврат нуля из главной функции означает отсутствие ошибок.
}
Такой стиль программирования называется процедурным (выделение кода в блоки называется структурным). А вот называть процедурный язык функциональным совершенно неправильно, ибо функциональное программирование ≠ процедурное, они даже в разных категориях (императивное и декларативное).
Интерактивный компилятор и дизассемблер. (printf я убрал для упрощения, его наличие добавляет слишком много лишних инструкций).
Важно понимать, что стек в большинстве архитектур традиционно растет от больших адресов к меньшим (и в x86). То есть для того, чтобы отодвинуть его вершину вверх, от регистра SP нужно отнимать значения, а вот для ужимания и съедания ненужных значений к указателю на вершину значения прибавляют. И для доступа к значениям относительно основания или вершины это тоже важно учитывать. Это может звучать запутанно, но через время привыкаешь и всё становится очевидным.

Это всё довольно упрощенно. Как минимум, в защищенном режиме используется больше 5 разных соглашений о вызове, которые отличаются деталями реализации. Это было описание для cdecl, обычно используемого в C. Еще часто используются соглашения pascal, fastcall, thiscall, winapi и другие. Fastcall, к примеру, избегает хранения аргументов на стеке, если их возможно передать через регистры, что улучшает производительность. А winapi отличается от cdecl тем, что функция сама очищает стек от аргументов для себя при возврате. А еще я упустил, к примеру, сохранение регистров, которые функция может перезаписать и испортить, а потому обязана предварительно сохранить и перед возвратом восстановить, передачу переменного количества аргументов (как в printf) и возврат значений шире 32 бит (которые не влезут в EAX).
Плюс сейчас мало кто компилирует ПО под защищенный 32-битный режим, а в длинном режиме (AMD64) используется пара других соглашений, основанных на fastcall и имеющих несколько отличий друг от друга.
Процедурное программирование предлагает делить код на подпрограммы, которые принято называть функциями и процедурами (функция обычно является наиболее понятным, частым и обобщенным названием, поэтому я его использую).
Процедура от функции отличается только тем, что функция возвращает какое-то значение (как в математике), а вот процедура этого не делает. Не во всех языках явно есть процедуры (в Pascal есть, но не в C). В таком случае их заменяют функции, возвращающие ничего (void, Unit, undefined, None).
Хотя и тут есть свои особенности. К примеру функция, возвращающая void в C и Java является прямым аналогом процедур, как-либо использовать возвращенное значение из такой функции невозможно, ибо его нет физически. А вот Unit в Kotlin это синглтон (а-ля единственная и уникальная константа уникального типа), ссылку на который можно присвоить в переменную, но в этом особого смысла нет. Undefined в JS и None в Python тоже уникальные константы специальных типов.
Вроде бы процедура никогда не может ничего вернуть...
Только она этого никогда не делает напрямую. При она этом может записать результат в глобальную переменную, а еще часто принимает в себя указатели или ссылки, по которым может записать результат. Это еще удобно тем, что можно "вернуть" несколько значений. Пример:
void procedure(int x1, int *x2, int *x3) { // Функция ничего не возвращает, то есть это процедура
*x2 = x1 * x1; // Разыменовываем указатель и записываем по его адресу результат.
*x3 = x1 * x1 * x1; // Разыменовываем другой указатель и записываем по его адресу результат.
}
int y1, y2;
procedure(16, &y1, &y2); // В y1 оказался результат, аналогичный прошлому примеру. А в y2 куб числа.
PS: оператор звездочка при указании типа превращает его в тип-указатель, а при применении на переменную-указатель разыменовывает ее до изначальной переменной. Амперсанд превращает переменную в указатель на нее (иногда еще называется оператором получения адреса).
То есть мы вернули сразу 2 разных значения из процедуры, которая якобы ничего не возвращает. Чудеса. Подобные чудеса есть в том числе в Pascal с явным делением на процедуры и функции (плюс там это сделано немного удобнее). Хотя механизм тут отличается от того, который используется в возврате значения из функции и совпадает с механизмом передачи обычных аргументов, поэтому никакой магии.
Главное отличие функций в программировании от функций в математике в том, что они могут делать что-то на стороне и не обязаны возвращать одинаковый результат при одинаковых аргументах.
К примеру функция получения случайного числа по определению не может существовать в математике, если она не принимает в себя предыдущее случайное число или зерно для его видоизменения. Или функция записи в файл, возвращающая 0 в случае успеха и другое число при провале. Ко всему прочему, такая функция имеет побочный нематематический эффект, то есть запись в файл, что тоже недопустимо традиционной математикой без высоких абстракций.
Поэтому придумали чистые функции. По сути это ограничитель, которые делают функцию полным отражением таковой в математике. Им запрещено возвращать разные значения при одинаковых аргументах (точнее запрещено всё, что может такое позволить сделать), запрещено обращаться к нечистым функциям, запрещено обращаться к тому, что не является аргументом или локальной переменной, запрещены вообще любые действия, которые могут сделать что-то на стороне (даже функция sin() в C не всегда является чистой, ибо может зависеть от состояния FPU).
Чистые функции через ключевое слово pure явно есть в D и FORTRAN (проверка на чистоту во время компиляции), а также являются основой функционального программирования.
Чистая процедура тоже имеет право на жизнь, используя механизм со ссылками (на счет указателей не уверен из-за возможности арифметики над ними).
Это очень сложная категория, которую постоянно путают с процедурным программированием. А еще это де-факто противоположный стиль: декларативный. Традиционное императивное программирование детально описывает процесс получения результата, а декларативное сам результат, без деталей реализации (хотя разделение обычно довольно нечеткое). При этом второй типичен для языков разметки типа HTML и CSS. То есть, условно, как одна и та же операция могла бы выглядеть в императивном и декларативном стиле:
document.tags.A.color = "blue" /* Императивный (JSSS). Сделать ссылки синими */
a { color: blue } /* Декларативный (CSS). Ссылки должны быть синими */
Почувствуйте разницу.
И функциональное программирование я никогда не изучал и слишком мало о нем знаю. Так что готовьтесь к ошибкам и не воспринимайте всё за чистую монету.
Основано полностью на математике, все функции обязаны быть чистыми. Операция присваивания запрещена (разрешены константы), переменных в привычном виде нет. Прикольно? Очень!
Во многих процедурных языках функции и процедуры являются объектами второго класса (не путать с классами из ООП), что не позволяет их свободно присваивать в переменные, передавать как аргументы в другие функции или возвращать из них (только через указатели). Функциональные языки расценивают функцию как объект первого класса, то есть их можно, а часто нужно передавать в другие функции напрямую.
Это дает некоторые преимущества, особенно в плане безопасности и при работе с многопоточностью (по причине неизменяемости данных и отсутствия глобального состояния), но вся концепция имеет один фатальный недостаток: вы мало чего полезного можете сделать, ибо что ввод, что вывод являются математически нечистыми, а потому запрещены. Вот такое вот гениальное изобретение безумных математиков.

Каждый чисто функциональный язык выкручивается из этого по-своему, к примеру через монады. Это позволяет им существовать вне шуток и даже использоваться на практике.
Это не все особенности функциональных языков, но одни из самых важных. Самый известный такой язык: Haskell. Функциональные F#, Lisp, ML и многие другие не являются 100% чистыми.
Последнее время часто используются смешанные языки, к примеру вместе с процедурным или объектно-ориентированным программированием, что избавляет от ограничений математики, но дает гибкость в том, что функциями можно оперировать как с любыми другими типами данных, а еще дает много очень удобного сахара вроде замыканий и лямбд. Это C#, Python, JS, частично Java и C++ (в них нужны костыли в виде интерфейсов из одного метода или оберток над указателями).
Функции как объект первого класса. К примеру в C# это реализовано через систему делегатов, которые представляют из себя тип-обертку для функций:
Action<string> printer = Console.WriteLine; // Action<string> - тип-делегат. Неявно создаем его объект и присваиваем туда функцию
printer("Hello, World!"); // Вызываем функцию через делегат
Локальные функции: как обычные, только вложенные в другую функцию (объявленные внутри нее)
void Func1() { // Глобальная функция
void Func2() { // Локальная функция
Console.WriteLine("В локальной функции");
}
Func2();
}
Лямбды: возможность объявить безымянную функцию посреди кода (часто удобнее локальных)
var pow2AsLambda = x => x * x; // => - оператор лямбда-выражения
pow2AsLambda(5); // Вернет 25
Замыкания (можно использовать вместе с лямбдами и локальными функциями):
int someValue = 42;
var pow2AsLambda = x => x * x + someValue; // someValue будет захвачено замыканием, хотя напрямую не передано
pow2AsLambda(5); // Вернет 67
Особенность замыканий в том, что они могут захватить локальную переменную родительской функции внутрь себя, продлевая ей время жизни за пределы блока с кодом. После чего такую лямбду можно передать в другую функцию, которая просто так не имеет доступа к someValue (в обычных условиях someValue вообще уже будет уничтожен), а вот переданная лямбда сможет ее прочитать или записать всегда и откуда угодно. И самое интересное то, что значение этой переменной будет сохранятся между вызовами к замыканию. То есть она становится глобальной, но видимой только из функции-замыкания.
Посмотрим на индекс TIOBE по популярности языков. Фиолетовым я пометил чистые функциональные языки. Языки, имеющие возможности, присущие функциональным языкам (смешанные) - синим, процедурным - красным, а объектно-ориентированным (ООП) - зеленым. Языки, в которых нельзя объявить функцию, принадлежащую самой себе или модулю, процедурными считать не совсем корректно (Java).

Видите фиолетовые точки? И я не вижу. А вот синих 12. В то же время красных и зеленых по 16. При этом реально применяемый чисто процедурный язык всего 1: С. Остальные имеют какую-либо встроенную поддержку других парадигм.
И сейчас практически всё большое ПО пишут в ООП. Ибо позволяет хоть как-то сдерживать структурированность кода после перехода с десятков тысяч строк к сотням (и миллионам).
ООП является развитием идеи процедурного программирования. Проблема была в том, что помимо кода в программе существуют еще и данные, которые было бы неплохо связать с соответствующим им кодом. И через некоторое время после появления процедур появились структуры (они же записи в Pascal, не путать со структурным программированием).
Структуры были удобным способом объединить несколько переменных в единое целое. Пример:
typedef struct user_struct {
char *username;
int userid;
int reputation;
} user_t;
user_t someuser = { "IvanKr08", 17002, 253 }; // Инициализируем значениями
someuser.reputation += 10; // Обращаемся к полю
(Вместе с этим объявляем структуру новым типом через typedef, что не делается по умолчанию в C, в отличии от C++. Один из ярких примеров несовместимости C и C++):
После чего user_t превращается в новый тип, как int или char. Можно создать полноценную переменную типа user_t (или массив такого типа), а потом обратиться к какой-нибудь ее части (полю) через оператор точки (.). Можно сделать функцию, которая будет принимать или возвращать переменную типа user_t (к примеру someuser). Можно сделать указатель на user_t, тогда для обращение к полю используется оператор стрелки (->). Или можно встроить переменную типа одной структуры в другую, это тоже не запрещено. Внутри структурная переменная представляет из себя последовательно слепленные поля в одно целое.

Суть ООП в том, что помимо полей структуры могут содержать процедуры и функции. Такая структура называется классом, переменная класса - объект, а процедура класса - метод.
Метод принципиально ничем не отличается от любой процедуры или функции, кроме того, что неявно принимает в себя специальный аргумент this (в Python это делается явно, в некоторых языках вместо this может быть self). Он содержит в себе ссылку/указатель на объект класса, от которого был вызван. Пример:
class User {
public:
char *username;
int userid;
int reputation;
void print() {
printf("Пользователь \"%s\" (%i). Репутация: %i\n", this->username, this->userid, this->reputation);
// Постоянно писать this-> не обязательно. Если локальной переменной с таким именем нет, то будет произведен доступ к полю
}
};
User someuser = { "IvanKr08", 17002, 253 }; // Инициализируем значениями
someuser.print(); // Вызвали метод, print() неявно получил в себя указатель this, который указывает на someuser
someuser.reputation += 10; // Обращаемся к полю
someuser.print(); // Теперь вывод поменяется
Да, никто не мешает объявить обычную функцию, которая будет явно принимать в себя указатель на User и ничего не поменяется, и так повсеместно делают в C (тот же WinAPI на этом построен целиком и полностью), но ООП на самом деле крайне сложная, большая и холиварная тема, которая развивалась на протяжении 60 лет в разных направлениях и которую поднимать тут глупо. Только опишу еще несколько разновидностей методов:
Если вы осилили эти 3000 слов и даже смогли что-то понять, то найдите и распечатайте себе утешительную грамоту. А я устал и пойду искать смысл жизни...
UPD: исправлены косяки форматирования, очепятки, добавлено еще пару пунктов про разновидности методов и функциональное программирование.