Ответы пользователя по тегу C++
  • Как передать в аргумент функцию, и выполнить её, передаваю в неё параметры?

    @vanyamba-electronics
    Это можно сделать с помощью указателя на функцию.
    typedef void (*MyFuncPtr)(int);
    
    void myfunc(int p) {
        cout << p << endl;
    }
    
    void func_caller(MyFuncPtr pfunc, int p) {
        assert(pfunc != nullptr);
        pfunc(p);
    }
    
    int main() {
       func_caller(myfunc, 666);
       return 0;
    }
    Ответ написан
    Комментировать
  • Как получить случайные числа в C++?

    @vanyamba-electronics
    На другом компьютере набор чисел будет другим.
    Ответ написан
    Комментировать
  • Как написать итератор для цифр числа?

    @vanyamba-electronics
    Примерно так.
    #include <iostream>
    
    using namespace std;
    
    template <typename _T>
    class digitstream
    {
    protected:
        _T m_value;
    public:
        digitstream(const _T& val) :
            m_value(val)
        {
        }
        class const_iterator 
        {
        protected:
            _T m_value;
            unsigned int m_base;
            unsigned int m_pos;
        public:
            const_iterator(const _T& val, unsigned int base) :
                m_value(val),
                m_base(base)
            {
                m_pos = 0;
                if (m_base != 0) {
                    if (m_value < m_base)
                        return;
                    _T rest = m_value;
                    do {
                        rest = rest / m_base;
                        m_pos++;
                    }
                    while (rest >= m_base);
                }
            }
            const_iterator(const const_iterator& src) :
                m_value(src.m_value),
                m_base(src.m_base),
                m_pos(src.m_pos)
            {
            }
            char operator * () const {
                if (m_base != 0) {
                    _T rest = m_value;
                    for (int n = 0; n < m_pos; ++n)
                        rest = rest / m_base;
                    _T result = rest % m_base;
                    if (result > 9)
                        return 'A' + result - 10;
                    return '0' + result;
                }
                return '0';
            }
            const_iterator& operator ++() {
                --m_pos;
                return *this;
            }
            const_iterator& operator --() {
                ++m_pos;
                return *this;
            }
            bool operator ==(const const_iterator& cmp) const {
                if (cmp.m_value == 0 && cmp.m_base == 0 && m_pos == -1)
                    return true;
                return false;
            }
            bool operator !=(const const_iterator& cmp) const {
                return ! operator ==(cmp);
            }
        };
        const_iterator begin(unsigned int base) const {
            return const_iterator(m_value, base);
        }
        const_iterator end() const {
            return const_iterator(0, 0);
        }
        class reverse_iterator
        {
        protected:
            _T m_value;
            unsigned int m_base;
            unsigned int m_pos;
        public:
            reverse_iterator(const _T& val, unsigned int base) :
                m_value(val),
                m_base(base),
                m_pos(0)
            {
            }
            reverse_iterator(const reverse_iterator& src) :
                m_value(src.m_value),
                m_base(src.m_base),
                m_pos(src.m_pos)
            {
            }
            char operator * () const {
                if (m_base != 0) {
                    _T rest = m_value;
                    for (int n = 0; n < m_pos; ++n)
                        rest = rest / m_base;
                    _T result = rest % m_base;
                    if (result > 9)
                        return 'A' + result - 10;
                    return '0' + result;
                }
                return '0';
            }
            reverse_iterator& operator ++() {
                ++m_pos;
                return *this;
            }
            reverse_iterator& operator --() {
                --m_pos;
                return *this;
            }
            bool operator ==(const reverse_iterator& cmp) const {
                if (cmp.m_value == 0 && cmp.m_base == 0 && m_base != 0) {
                     _T rest = m_value;
                    for (int n = 0; n < m_pos; ++n)
                        rest = rest / m_base;
                    if (rest == 0)
                        return true;
                }
                return false;
            }
            bool operator !=(const reverse_iterator& cmp) const {
                return ! operator ==(cmp);
            }
        };
        reverse_iterator rbegin(unsigned int base) const {
            return reverse_iterator(m_value, base);
        }
        reverse_iterator rend() const {
            return reverse_iterator(0, 0);
        }
    };
    
    int main()
    {
        digitstream<int> ds(0xFADE372F);
        for (digitstream<int>::const_iterator it = ds.begin(16); it != ds.end(); ++it)
            cout << *it;
        cout << endl;
        for (digitstream<int>::reverse_iterator rit = ds.rbegin(16); rit != ds.rend(); ++rit)
            cout << *rit;
        cout << endl;
    
        return 0;
    }

    Ссылка на Online GDB.
    Ответ написан
    Комментировать
  • Arduino Analog Keypad 3x4, почему не правильно работает?

    @vanyamba-electronics
    byte key()
    {  
        int val = analogRead(A0);
        if (val < 480) return 99;
        if (val < 500) return 11;
        if (val < 525) return 0;
        if (val < 555) return 10;
        if (val < 585) return 9;
        if (val < 620) return 8;
        if (val < 660) return 7;
        if (val < 705) return 6;
        if (val < 760) return 5;
        if (val < 820) return 4;
        if (val < 890) return 3;
        if (val < 976) return 2;
        return 1;
    }
    Ответ написан
    Комментировать
  • Почему не подсчитывается количество книг с тремя о в название?

    @vanyamba-electronics
    Потому что русские буквы - это Unicode. То есть два символа типа char.
    #include <iostream>
    #include <string>
    #include <algorithm>
    
    using namespace std;
    
    // Структура для представления книги
    struct Book {
        string author;
        string title;
        string publisher;
        int year;
        double cost;
    };
    
    int count_o(const string& title)
    {
        int oCount = 0;
        enum { NotO, PossiblyO } state = NotO;
        for (char ch : title) {
            switch (state) {
                case NotO:
                    if (ch == 0xFFFFFFD0)
                        state = PossiblyO;
                    break;
                case PossiblyO:
                    if (ch == 0xFFFFFFBE || ch == 0xFFFFFF9E) {
                        state = NotO;
                        oCount++;
                    }
                    break;
            }
        }
        return oCount;
    }
    
    int main() {
        setlocale(LC_ALL, "ru");
    
        const int size = 1; // Задайте нужный размер массива книг
        Book library[size];
    
        // Ввод информации по книгам
        for (int i = 0; i < size; ++i) {
            cout << "Введите автора книги " << i + 1 << ": ";
            getline(cin, library[i].author);
    
            cout << "Введите название книги " << i + 1 << ": ";
            getline(cin, library[i].title);
    
            cout << "Введите издательство книги " << i + 1 << ": ";
            getline(cin, library[i].publisher);
    
            cout << "Введите год издания книги " << i + 1 << ": ";
            cin >> library[i].year;
    
            cout << "Введите стоимость книги " << i + 1 << ": ";
            cin >> library[i].cost;
    
            cin.ignore(); // Очищаем буфер после ввода чисел
        }
    
        // Подсчитываем количество книг с тремя буквами 'о' в названии
        int countWithO = 0;
        for (int i = 0; i < size; ++i) {
            if (count_o(library[i].title) == 3) {
                countWithO++;
            }
        }
    
        // Создаем массив для книг с тремя буквами 'о' в названии
        Book* booksWithO = new Book[countWithO];
        int booksWithOCount = 0;
    
        // Переписываем информацию только о книгах с тремя буквами 'о' в названии
        for (int i = 0; i < size; ++i) {
            if (count_o(library[i].title) == 3) {
                booksWithO[booksWithOCount++] = library[i];
            }
        }
    
        // Сортируем массив книг с тремя буквами 'о' в названии по названию издательства
        for (int i = 0; i < booksWithOCount - 1; ++i) {
            for (int j = 0; j < booksWithOCount - i - 1; ++j) {
                if (booksWithO[j].publisher > booksWithO[j + 1].publisher) {
                    swap(booksWithO[j], booksWithO[j + 1]);
                }
            }
        }
    
        // Выводим информацию о книгах с тремя буквами 'о' в названии, отсортированную по названию издательства
        cout << "Информация о книгах с тремя буквами 'о' в названии, отсортированная по названию издательства:" << endl;
        for (int i = 0; i < booksWithOCount; ++i) {
            cout << "Автор: " << booksWithO[i].author << endl;
            cout << "Название: " << booksWithO[i].title << endl;
            cout << "Издательство: " << booksWithO[i].publisher << endl;
            cout << "Год издания: " << booksWithO[i].year << endl;
            cout << "Стоимость: " << booksWithO[i].cost << endl << endl;
        }
    
        delete[] booksWithO;
        return 0;
    }
    Ответ написан
    Комментировать
  • Как можно улучшить код?

    @vanyamba-electronics
    Я бы сделал так:
    #include <iostream>
    #include <string>
    #include <locale>
    
    using namespace std;
    
    string to_bin(int n)
    {
        enum { Plus, Minus } sign = Plus;
        if (n < 0) {
            sign = Minus;
            n = -n;
        }
        string result;
        unsigned int mask = 0x80000000;
        enum { Prefix, Value } state = Prefix;
        while (mask != 0 && state == Prefix) {
            if (n & mask) {
                result += '1';
                state = Value;
            }
            mask >>= 1;
        }
        while (mask != 0) {
            result += (n & mask) ? '1' : '0';
            mask >>= 1;
        }
        if (result.length() == 0)
            result = '0';
        if (sign == Minus)
            result = '-' + result;
        return result;
    }
    
    int main()
    {
        int n;
        setlocale(LC_ALL, "");
        cout << "Введите число:";
        cin >> n;
        cout << to_bin(n) << endl;
        return 0;
    }
    Ответ написан
  • Как хранится c++ struct в памяти и как определить размер вручную?

    @vanyamba-electronics
    typedef struct {
    int a;
    char b;
    } Struct;
    
    Struct s1;
    cout << hex << &(s1.a) << endl;
    cout << &(s1.b) << dec << endl;
    Ответ написан
    Комментировать
  • Как в С++ проверить double на целочисленность?

    @vanyamba-electronics
    При обработке вещественных чисел следует определиться, которая точность вас устраивает в данном случае.
    В идеале 1.0 - это явно целочисленная дробь, но на практике возникает вопрос: а 0.99999999 - это достаточное приближение, чтобы принимать это число за 1.0?
    Поэтому функция должна иметь параметр точности:
    bool is_integer(double val, double precision = 0.000005)
    {
        return abs(val - round(val)) < precision;
    }
    Ответ написан
    2 комментария
  • Знает ли кто-то системную DLL, которая не фиксирует себя в памяти при загрузке?

    @vanyamba-electronics
    DLL выгружается из RAM автоматически, когда нет ни одного процесса, который её использует.
    user32.dll - это системная библиотека WIndows, которая загружается при загрузке Windows, и выгружается только после shutdown Windows.
    Ответ написан
  • Почему не выводятся данные в консоль?

    @vanyamba-electronics
    cout << "Литров: " << liters << endl;
    Ответ написан
    1 комментарий
  • Не удается открыть семафор, в чем ошибка?

    @vanyamba-electronics
    setlocale(LC_ALL, "");
    Ответ написан
    Комментировать
  • Как исправить вывод кириллицы в консоль?

    @vanyamba-electronics
    setlocale(LC_ALL, "");
    Ответ написан
    Комментировать
  • Как исправить проблему с шаблонами?

    @vanyamba-electronics
    Я кое-что подправил в формулах, поскольку numeric_limits::max() не очень ожидаемый результат выдаёт.
    Изменил resize(), чтобы при ресайзе изображения сохранялись исходные данные.
    Вектор одноразмерный - потому что по идее будет работать быстрее, чем куча векторов.
    Формулу расчёта fill factor я заменил на среднее значение. Потому что не нагуглил ничего похожего.
    Мне не очень нравится, что в части функций вектора возвращаются не по указателю, но достигать единообразия я не стал.
    Операции с битмапами я сделал по принципу Merge - берутся большие значения длины и высоты.
    https://onlinegdb.com/0ULxLQERAp
    Ответ написан
    Комментировать
  • Как переделать код под ООП?

    @vanyamba-electronics
    По Вашей просьбе оформил в ООП.
    С такими алгоритмами недолго и программистом стать.
    https://onlinegdb.com/q6b6nwNdX
    Ответ написан
    Комментировать
  • Издержки полиморфизма или неправильный дизайн?

    @vanyamba-electronics
    union
    {
        char charVal;
        float floatVal;
    } Value;
    
    class Token
    {
        Value m_value;
    public:
        inline Value const* getValue() const {
            return &m_value;
        }
        inline void setValue(Value const* pVal) {
           ::memcpy(&m_value, pVal, sizeof(Value));
        }
    };
    
    class CharToken : public Token
    {
    public:
         CharToken() {}
         inline char getChar() const {
            return m_value.charVal;
         }
    };
    
    class FloatToken : public Token
    {
    public:
         FloatToken() {}
         inline float getFloatValue() const {
            return m_value.floatValue;
         }
    };
    Ответ написан
    Комментировать
  • Работа с изображениям, как создать своё на C++?

    @vanyamba-electronics
    Погуглите "processing 4".
    Ответ написан
    Комментировать
  • Почему русские буквы не выводятся в C++?

    @vanyamba-electronics
    Возможно потому, что должно быть
    std::setlocale(LC_ALL, "");
    Ответ написан
    Комментировать
  • Какая книга подойдет для изучения C++ с нуля?

    @vanyamba-electronics
    Бьорн Страуструп.
    Ответ написан
    Комментировать
  • Может ли прерывание прервать выполнение конструктора / деструктора в С++?

    @vanyamba-electronics
    В обработчике прерывания стоит разместить установку флага, что прерывание произошло. А саму логику события поместить в общий поток обработки.
    Ответ написан
    Комментировать
  • Не работает деструктор. В чем ошибка?

    @vanyamba-electronics
    Если в деструкторе выполняется очистка памяти, то его следует объявлять виртуальным:
    virtual ~Polynomial() { ... }
    Ответ написан
    Комментировать