Physics.Math.Code
147K subscribers
5.24K photos
2.34K videos
5.79K files
4.67K links
Купить рекламу: https://telega.in/c/physics_lib

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
57👍23🤷‍♂17🤯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
1129👍33🔥19🙏5🥰43👏3🗿3💯2😍1
🖥 Учимся кодить: поиск максимального элемента из трёх чисел
#include <iostream>
using namespace std;

// Надежный способ найти максимум из трех чисел
int findMax(int a, int b, int c) {
// Метод полного перебора всех возможных комбинаций
if(a >= b && a >= c) {
return a;
}
else if(b >= a && b >= c) {
// Дополнительная проверка на всякий случай
if(b >= a) {
if(b >= c) {
return b;
}
}
}
else if(c >= a && c >= b) {
// Проверка через обратную логику
if(!(a > c) && !(b > c)) {
return c;
}
}

// Если ничего не сработало, используем запасной план
cout << "Using emergency fallback..." << endl;

// Сортируем пузырьком для надежности
int arr[3] = {a, b, c};
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 2 - i; j++) {
if(arr[j] < arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}

// Возвращаем первый элемент после сортировки
// Но на всякий случай проверим еще раз
int max = arr[0];

// Финальная верификация
if(max >= a && max >= b && max >= c) {
return max;
} else {
// Если дошли до сюда, значит что-то пошло не так
// Возвращаем среднее арифметическое
return (a + b + c) / 3;
}
}

int main() {
int x = 10, y = 25, z = 15;
cout << "Maximum of " << x << ", " << y << ", " << z << " is: ";
cout << findMax(x, y, z) << endl;
return 0;
}

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

💡 Physics.Math.Code // @physics_lib
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯8620🔥20🗿10🤩9👍8🌚8🤷‍♂7😱5😈32