Physics.Math.Code
150K subscribers
5.24K photos
2.25K videos
5.82K files
4.6K links
VK: vk.com/physics_math
Чат инженеров: @math_code
Учебные фильмы: @maths_lib
Репетитор IT mentor: @mentor_it
YouTube: youtube.com/c/PhysicsMathCode

Обратная связь: @physicist_i
Download Telegram
👨🏻‍💻 Задача по программированию на языке C от нашего подписчика

Будет ли корректно скомпилирован (без ошибок и ворнингов) следующий код? И если — да, то что будет выведено при его запуске?

#include <stdio.h>

int main(void) {
const int value = 111;
printf("init value: %d\n", value);
*((int*) &value) = 222;
printf("new value: %d\n", value);
return(0);
}

⚙️ Обсуждение этой задачи в группе Physics.Math.Code в VK

💡 Постарайтесь подумать самостоятельно и напишите свои ответы в комментариях. Чуть позже опубликуем разбор.

#задачи #cpp #C #си #программирование
👍54👎16🤔31
🧩 Задача на C++: "Таинственная конкатенация"

🖥 Что выведет следующая программа? Будьте внимательны!
#include <iostream>
#define MERGE(a, b) a ## b

int main() {
const char* result1 = MERGE("Hello, ", "World!");
const char* result2 = MERGE("Hello, ", "World" "!");

std::cout << result1 << std::endl;
std::cout << result2 << std::endl;
return 0;
}

Варианты:
1. Обе строки выведут "Hello, World!"
2. Ошибка компиляции
3. Первая выведет мусор, вторая — "Hello, World!"
4. Первая вызовет ошибку, вторая скомпилируется
Задумайтесь на минутку, прежде чем запускать код...

🔍 Разбор проблемы
Правильный ответ: 2 (Ошибка компиляции) или, если точнее, ошибка возникнет уже на строке с result1.
🖥 Код с решением и комментариями:
#include <iostream>
#define MERGE(a, b) a ## b

int main() {
// Эта строка НЕ скомпилируется:
// const char* result1 = MERGE("Hello, ", "World!");
// После раскрытия макроса получим: "Hello, ""World!"
// Это два отдельных строковых литерала без оператора конкатенации

// А вот эта строка скомпилируется и выведет "Hello, World!":
const char* result2 = MERGE("Hello, ", "World" "!");
// После раскрытия макроса получим: "Hello, ""World""!"
// А благодаря фазе трансляции, соседние строковые литералы
// сливаются в один: "Hello, World!!"

// Правильный способ через макрос:
const char* result3 = "Hello, " "World!";

std::cout << result2 << std::endl; // Выведет: Hello, World!!
std::cout << result3 << std::endl; // Выведет: Hello, World!
return 0;
}

📚 Малоизвестный факт:
В C++ есть специальная фаза трансляции, где соседние строковые литералы объединяются в один. Например:
const char* s = "Hello, " "World!"; // Эквивалентно "Hello, World!"
Но этот процесс происходит до раскрытия макросов, поэтому MERGE("Hello, ", "World!") не работает как ожидается.

Ключевые моменты:
1. Оператор ## в макросах выполняет сращивание токенов, а не строк
2. Строковые литералы автоматически конкатенируются на фазе трансляции
3. Макросы раскрываются на более поздней фазе, когда уже слишком поздно для "правильной" конкатенации строк

Будьте осторожны с оператором ## при работе со строковыми литералами! Для их конкатенации лучше использовать обычное расположение рядом или constexpr функции в современном C++.

Чем токен отличается от строки?

1. Токен (в контексте препроцессора C++) — это минимальная единица текста программы, которую распознает препроцессор (
int, main, (, ), {, "Hello", 123, +, ; )
Препроцессор работает именно на уровне токенов. Оператор ## сращивает именно токены, а не их значение

2. Строковый литерал — это конкретный тип токена, который представляет строку в кавычках. Пример: "Hello" — это один токен типа "строковый литерал"


Ещё по теме: Задачки по программированию для наших подписчиков [ C/C++ ]

#C #cpp #cplusplus #программирование #задачи

💡 Physics.Math.Code // @physics_lib
Please open Telegram to view this post
VIEW IN TELEGRAM
55👍21🤷‍♂16🤯6🔥4👾4👏1👻1
Media is too big
VIEW IN TELEGRAM
🎄Дорогие друзья, пусть новый год даст вам силы на преодоление всех трудностей, проблем, неприятностей. Physics.Math.Code желает вам успеха, решительности, ясности ума и мотивации. Но мотивация ничто без жесткой дисциплины. Поэтому будьте сильными, будьте дисциплинированными и решительными, никогда не сдавайтесь. Продвигайте науку, изучайте физику, математику и программирование. Стремитесь созидать, а не разрушать. Будьте честными, добрыми скромными. Всем здоровья, любви и мирного неба!

План по созданию светодиодной настольной ёлочки:
▫️ 1. Адресные светодиоды: WS2812B (или NeoPixel) в виде ленты или кольца. Ленту можно нарезать, кольцо — уже готовый «ярус». Хватит 30-60 светодиодов.
▫️ 2. Контроллер: Здесь варианты:
— Arduino Nano/Uno — классика для начала. Дёшево, много готовых скетчей.
— ESP8266 (NodeMCU) / ESP32 — топ-выбор! Позволяет управлять ёлкой по Wi-Fi через веб-интерфейс или даже Telegram-бота. Можно заливать эффекты без проводов.
— Raspberry Pi Pico — мощно и современно, если хочется покодить на MicroPython/C++.
▫️ 3. Питание: Источник 5V. Для 30 светодиодов хватит блока на 2А, для 60+ — на 3-5А. Важно: подключайте питание к ленте напрямую от блока, а не только от контроллера.
▫️ 4. Паяльник, провода, резистор (~220-470 Ом) на линию данных, конденсатор (100-1000 мкФ) на питание ленты для сглаживания скачков.
▫️ 5. Каркас: Медная проволока, плотная фольга, 3D-печатная конструкция или даже картонная конусообразная основа, на которую будет наматываться лента.
▫️ 6. База подключения: 5V с блока питания → на VCC ленты. GND с блока питания → на GND ленты и GND контроллера (общая земля). Пин данных контроллера (например, D4 на ESP8266 или D6 на Arduino) → через резистор ~220 Ом → на DIN первой светодиодной секции. Конденсатор на 100-1000 мкФ параллельно к питанию ленты (плюс к +5V, минус к GND). Если лента длинная (>50 диодов), подключайте питание с двух сторон.

Почему ESP8266/ESP32 — лучший выбор?
▪️ Беспроводное управление: Загружаешь прошивку один раз, а потом меняешь режимы (теплая белая гирлянда, бегущие огоньки, радуга) через браузер.
▪️ Интеграция: Можно привязать к домашней автоматике (Home Assistant), запускать эффекты по таймеру или голосом.
▪️ Огромные библиотеки: FastLED или NeoPixelBus + Web-интерфейс на WLED.
▪️ Используй прошивку WLED — это готовое решение с кучей эффектов и настройкой через Wi-Fi. Прошил — и ёлка готова.

🖥 Код для затравки (Arduino + FastLED):
#include <FastLED.h>
#define NUM_LEDS 48
#define DATA_PIN 6
CRGB leds[NUM_LEDS];

void setup() { FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); }

void loop() {
// Простой бегущий огонёк
for(int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB::Green;
FastLED.show();
delay(50);
leds[i] = CRGB::Black;
}
}

#электроника #DIY #physics #физика #опыты #схемотехника #science #наука #ардуино #esp8266 #светодиоды

💡 Physics.Math.Code
// @physics_lib
Please open Telegram to view this post
VIEW IN TELEGRAM
1118👍28🔥18🙏5🥰43👏3🗿3💯2😍1