Ответы пользователя по тегу Программирование
  • Таймер и линейность?

    tsarevfs
    @tsarevfs
    C++ developer
    Тут могут быть разные варианты. Но чаще всего встречается "событийно ориентированное программирование".
    В упрощенном виде это выглядит так:
    while (true) //event loop
    {
    	if (queue.empty())
    		continue;
    
    	auto event = queue.front();
    	queue.pop_front();
    
    	process(event);
    }
    onButton()
    {
    	...
    }
    onTimer()
    {
    	...
    }
    process(Event event)
    {
    	if (isTimetEvent(event))
    		onTimer();
    
    	if (isButtonEvent(event))
    		onButton();
    }


    Основную часть времени программа крутится в вечном цикле. Но когда происходя события(events), они добавляются в очередь(queue) и вызываются их обработчики. Срабатывание таймера тоже становится событием.
    Фишка в том, что обработчики таких событий не могут работать долго, иначе остальные будут заблокированы. Например плохая идея ждать в обработчике пользовательского ввода или делать большие вычисления. Для решения этих проблем используют потоки и другие техники.
    В коде я не описал добавление событий в очередь. Это может происходить разными способами. Но в простейшем случае мы можем на каждой итерации опрашивать таймеры кнопки и другие источники о произошедших событиях.
    Ответ написан
    Комментировать
  • Как покрыть полигон прямыми?

    tsarevfs
    @tsarevfs
    C++ developer
    Предлагаю вращать не прямые, а фигуру. Для этого достаточно домножить координаты каждой вершины на матрицу поворота. Ну, а прямые можно взять горизонтальные (y=c1, y=c2, ...). Так будет значительно проще искать пересечения сторон с этими прямыми.
    Ответ написан
    3 комментария
  • Когда пишу функцию. Как понять - когда создавать для нее класс, а когда написать ее в классе типа Helper (т.е. классе для вспомогательных ф-ий)?

    tsarevfs
    @tsarevfs
    C++ developer
    Класс или файл helper как правило плохая идея. Он притягивает к себе мусор и велосипеды.
    Ничего плохого в отдельных функциях нет. Но если привыкнуть к ООП, то большинство функций естественным образом становятся методами классов.
    Ответ написан
    Комментировать
  • Как написать код для определения суммарного объема вложенных друг в друга шаров?

    tsarevfs
    @tsarevfs
    C++ developer
    Объем стенок имеется в виду? Тогда, если вкладываем без зазоров, получаем большой шар со стенкой 12 * 5 мм и двркой как у маленького -- 10см.
    Получаем внешний диаметр 22см (10 дырка + 2 * 6 стенки).
    Объем = объем целиком - объем дырки.
    Ну и не забываем что литр = 1дм^3. Единицы измерений надо аккуратно привести.
    Ответ написан
    Комментировать
  • Изучение математики через программирование, глупое решение?

    tsarevfs
    @tsarevfs
    C++ developer
    Я думаю это отличная идея. Правда это может оказаться не так просто, как кажется.
    Запрограммировать решение уравнений типа квадратных, операции над матрицами вполне можно.
    Ответ написан
    Комментировать
  • Как научиться быстро считать логические выражения?

    tsarevfs
    @tsarevfs
    C++ developer
    Разбивайте сложное на простые части. A || B & (C || D) придумаем более практический пример (эквивалентный вашему).
    if (!file.exist || (file.type != DIRECTORY)  & (file.creationDate < lastGoodDate || file.size > maxSize))
    {
       printErrorMessage();
    }

    Такое сложно написать и прочитать. Более длинный, зато более понятный вариант:
    bool isBadFile(file)
    {
       if (!file.exist)
          return true; 
    
       if (file.type == DIRECTORY)
          return fasle; //skip directories
    
       bool isTooOld = file.creationDate < lastGoodDate;
       bool isTooBig = file.size > maxSize;
    
       return isTooBig || isTooOld
    }
    
    if (isBadFile(file))
    {
       printErrorMessage();
    }
    Ответ написан
    1 комментарий
  • Где найти интересные задачи для изучения C++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    acmp.ru
    Ответ написан
    Комментировать
  • Что нужно прочитать чтобы начать писать программы на С++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Можно с Qt поиграться. Если игры интересны -- SFML очень хороший вариант для старта.
    Ответ написан
    Комментировать
  • Как избавиться от ошибки invalid type argument of unary (have ) в си?

    tsarevfs
    @tsarevfs
    C++ developer
    Почитайте, (Не пугайтесь C++ в названии статьи, там разница только в том как выполняется печать на экран). Сейчас вы делаете странное. Параметры вы объявили как int, а не *int.

    PS Рекомендую сразу отказаться от капса в названиях функций, так принято называть константы. Транслит тоже не желателен, воспользуйтесь переводчиком и учите английский. После "," ставится пробел. До и перед +-= и.т.д. тоже принято ставить пробелы.
    Ответ написан
    1 комментарий
  • Кто хочет поломать немного мозг?

    tsarevfs
    @tsarevfs
    C++ developer
    Первым делом выделяем связанные фигуры.
    Изначально каждый отдельный квадрат и каждую фигуру помечаем "свободным".
    В цикле, пока есть свободные квадраты:
    пробегаемся по всем квадратам, если под квадратом пол или "замороженный" квадрат, морозим его;
    пробегаемся по свободным фигурам, если в фигуре появились замороженные квадраты, морозим фигуру и остальные квадраты в фигуре;
    пробегаемся по свободным фигурам, каждый квадрат из нее опускаем на 1 клетку вниз;
    идем в начало цикла.

    Если поле очень большое, можно попытаться посчитать более эффективно. Но это нужно заморочиться. Идея в том, что можно, пробежавшись по столбцам, оценить насколько могут фигуры двигаться относительно друг друга. И потом посмотреть на сколько их можно все опустить. Но дальше хз что делать =)
    Ответ написан
    Комментировать
  • Как пользоваться рекурсией в Python?

    tsarevfs
    @tsarevfs
    C++ developer
    def check_possibility(figures, signs = [], is_100 = False):
        for sign in ('', '+', '-', '*', '//'):
            new_signs = signs[:]
            new_signs.append(sign)
            if len(signs) == 5:
                numeric_expression = ''
                numeric_expression += figures[0]
                for i in range(5):
                    numeric_expression += signs[i]
                    numeric_expression += figures[i + 1]
                result = eval(numeric_expression)
                if result == 100:
                    return numeric_expression
                else:
                    return False
            elif is_100 == False:
                is_100 = check_possibility(figures, new_signs, is_100)
        return is_100
    
    print check_possibility([str(n) for n in range(2, 8)])


    ps. ** опасная операция будет очень долго считать если попадутся большие аргументы. python считает в длинной арифметике для целых.
    Ответ написан
    4 комментария
  • Где ошибка в счетчике?

    tsarevfs
    @tsarevfs
    C++ developer
    Посмотрите конец статьи.
    var byTag =  document.getElementsByTagName('p');
    var counter = 0
    
    for (var c = 0; c < byTag.length; c++) {
       byTag[c].onclick = (function (num) {
          return function() {
             byTag[num].innerHTML = ++counter;
          }
       })(c)


    Суть в том, что переменная "c" глобальная и захватывается как ссылка. То есть когда вызывается onclic ее значение == byTag.length а не то, какое было в момент добавления колбека.
    Ответ написан
  • На чем сделать данное клиент-серверное приложение?

    tsarevfs
    @tsarevfs
    C++ developer
    Может устроит расшареная виндовая папка с настроеными правами? Если нужно именно приложение, то подойдет любой язык, который знаете. Причем приложение может точно так же пользоваться расшареной папкой (см. samba). Либо можно пилить веб сервер. Правда если в качестве файлов могут быть например word документы или еще что-то, что не открыть прямо в браузере, то стоит подумать есть ли в этом смысл.
    Ответ написан
    1 комментарий
  • Несколько вопросов по клиент-серверному соединению?

    tsarevfs
    @tsarevfs
    C++ developer
    1. Есть несколько вариантов, но все из них сводятся к тому, что текст, данные форм и прочее нужно представить в виде набора байт. Это называется сериализацией. Это можно делать по разному. Например использовать бинарный формат близкий к тому как эти данные хранятся в памяти. Это достаточно сложно особенно если программы написаны на разных языках. Вам подойдет более высокоуровневый подход на основе JSON (ndjson) или msgpack. Или даже более высокоуровневые решения типа json/msgpack rpc.
    2. Прием работает в обратном порядке. Мы принимаем данные в некотором формате и десериализуем их в те структуры данных, которые используются в программе.
    3. Уточните вопрос, но ответ скорее всего нет =)
    4. Он может участвовать а может и нет. Он работает поверх сокетов. Вероятно для ваших целей он избыточен. Однако смотреть можно в сторону rpc over http или rest api.
    5. Основная проблема в том, что операция -"ждать сообщения от клиента / сервера" блокирующая. И если ничего не предпринять, то клиент не сможет реагировать на клавиатуру / мышь, а сервер не сможет работать с несколькими клиентами. Поэтому сетевое общение можно вынести в отдельный поток или использовать какие-то асинхронные механизмы (в паскале с этим не очень похоже).
    6. Паскаль возможно не лучший язык для клиента. На той же Java это было бы проще.
    Ответ написан
    1 комментарий
  • Какую выбрать среду для написания кода на С++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Под windows студия это оптимальный вариант. Как только задачи станут немного сложнее, время на создание проекта будет незначительно по отношению к времени на написание кода. В качестве бонуса студия дает вам вменяемый отладчик, который очень полезен, если научиться им пользоваться.
    Ответ написан
    Комментировать
  • Находится ли точка в произвольно нарисованной фигуре?

    tsarevfs
    @tsarevfs
    C++ developer
    Если есть произвольная замкнутая ломаная и точка: проводим из точки луч в верх, считаем количество пересечений с отрезками составляющими ломаную. Если нечетное -- внутри, иначе -- снаружи. Отрезки стоит брать полуоткрытые, чтобы избежать проблем при прохождении через узлы ломаной.
    Ответ написан
    4 комментария
  • Создание игр после основ c++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Для начала напишите что-то очень простое и понятное. Змейку или арканоид например. В качестве учебного движка могу посоветовать SFML.
    Ответ написан
    1 комментарий
  • Как отрицательные вещественные числа представлены в компьютере?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    habrahabr.ru/post/112953
    Про положительные вы тоже что-то странное написали.
    Ответ написан
    Комментировать
  • Не могу понять, что такое VOID в С++?

    tsarevfs
    @tsarevfs
    C++ developer
    void указывают в качестве типа возвращаемого значения функции, если она ничего не возвращает. Например функция int get_speed() которая возвращает скорость юнита как целое число, определяется с типом int. А вот void set_speed(int speed) ничего не возвращает, а наоборот задает скорость. Поэтому используем void.
    Ответ написан
    Комментировать