Задать вопрос
Ответы пользователя по тегу Программирование
  • Как правильно перевести термины Statement и Declaration?

    @Alexander1705
    Statement -> инструкция;
    Declaration -> объявление.

    Другие варианты перевода statement будут конфликтовать с одним из терминов declaration (объявление), definition (определение), operator (оператор) или expression (выражение).
    Ответ написан
  • Почему в текстовых редакторах используется моноширинный шрифт?

    @Alexander1705
    Это удобнее, код не читается слово за словом, как обычный текст. Вместо этого взгляд фокусируется на разных синтаксических структурах. С моноширинным шрифтом они находятся быстрее. Ещё с моноширинными шрифтом гораздо удобнее вертикальное выравнивание. Сравните это:

    def fib(n):
        a, b = 0, 1
        while a < n:
            print(a, end=' ')
            a, b = b, a+b
        print()
    fib(1000)


    И это:
    def fib(n):
    a, b = 0, 1
    while a < n:
    print(a, end=' ')
    a, b = b, a+b
    print()
    fib(1000)


    P.S. Разметка съела отступы во втором случае, но и так должно быть понятно, что имелось ввиду.
    Ответ написан
    Комментировать
  • Какой байт использовать?

    @Alexander1705
    В нём символы в любых возможных кодировках.

    Если у вас байты - это только текст, то можно использовать спецсимволы ASCII, например NULL (0). Большинство кодировок совместимы с ASCII.
    Ответ написан
    Комментировать
  • Как узнать, что в проекте(файлах и папках) были изменения?

    @Alexander1705
    Проверяйте в цикле дату изменения файлов: os.Stat, os.FileInfo.

    Upd. Кажется, это - то что вы ищите.
    Ответ написан
    1 комментарий
  • Как распихать значения в файле в разные файлы?

    @Alexander1705
    Как-то так:
    files = [open('freq{}.txt'.format(i), 'w') for i in range(N)]
    
    f2 = open('file2.txt')
    i = 0
    for l in f2.radlines():
        files[i].write(l)
        i = (i+1) % N
    
    f2.close()
    for f in files:
        f.close()
    Ответ написан
    1 комментарий
  • Какова правильная логика обновления клиента игры?

    @Alexander1705
    Честно говоря, я с этим не сталкивался, но я бы попробовал сделать так:
    Допустим, мы выпускаем новую версию - 2.46. При этом на сервер мы заливаем полную версию для чистой установки или для обновления с очень старых версий, и делаем n-ное количество патчей 2.45to2.46, 2.44to2.46, 2.43to2.46... Так, если пользователь отстаёт на несколько версий, он просто загрузит минимально необходимую разницу между его версией и актуальной, если же у пользователя очень старая версия, он скачивает заново весь клиент.
    Таким образом минимизируется количество загрузок для пользователя, а следовательно уменьшится нагрузка и на сервер.
    Ответ написан
    2 комментария
  • Почему в битовых сдвигах остаётся минус?

    @Alexander1705
    если я правильно понял знак хранится в первом бите

    Неправильно, отрицательные числа представлены с помощью дополнительного кода.

    P. S. Это не для того, чтоб расширить диапазон возможных значений.
    Дополнительный код позволяет заменить операцию вычитания на операцию сложения и сделать операции сложения и вычитания одинаковыми для знаковых и беззнаковых чисел, чем упрощает архитектуру ЭВМ.
    Ответ написан
    1 комментарий
  • Eclipse C++ (The selection cannot be launched) как исправить?

    @Alexander1705
    stackoverflow.com/questions/20380792/eclipse-error...

    P. S. Первая же выдача в гугле по запросу "The selection cannot be launched". Неужели так сложно?
    Ответ написан
    1 комментарий
  • Можно ли считать константный указатель аналогом ссылки в С++?

    @Alexander1705
    Специально провёл эксперимент:

    1. Пишем две аналогичных программы: одна с использованием указателей, другая - ссылок.
    ptr.cpp
    #include <iostream>
    
    
    using namespace std;
    
    
    void foo(int* x) {*x = 7;}
    
    
    int main(int argc, char** argv)
    {
        int x = 0;
        foo(&x);
        cout << x << endl;
        return 0;
    }

    ref.cpp
    #include <iostream>
    
    
    using namespace std;
    
    
    void foo(int& x) {x = 7;}
    
    
    int main(int argc, char** argv)
    {
        int x = 0;
        foo(x);
        cout << x << endl;
        return 0;
    }

    2. Компилируем в ассемблерный код.
    g++ -S ptr.cpp
    g++ -S ref.cpp


    3. Проверяем, есть ли разница.
    diff ptr.s ref.s

    У меня linux, gcc 5.3.0. Файлы отличаются только именами функций (Z3fooRi у ссылок, Z3fooPi у указателей). То есть, в данном случае действительно нет разницы между ссылками и указателями.

    P. S. Этот эксперимент показывает лишь то, что нет разницы между передачей по ссылке и по указателю. В случае, который указали в других ответах, разница есть.
    Ответ написан
    Комментировать
  • Как изменять значения переменных другого класса в C++?

    @Alexander1705
    Первое:
    Если пишите на C++ и используете заголовочные файлы С, их принято называть ctime, а не time.h

    Второе:
    Для псевдослучайных чисел в C++ используйте заголовочный файл random:
    #include <random>
    ...
    std::random_device rd;
    std::cout << rd() % 10;


    Третье:
    Если вам нужен массив, используйте массив. То что вы написали - очень странный костыль.
    Если нужно заполнить массив случайными числами, напишите функцию:
    void fill_with_random(int* arr, size_t n)
    {
        random_device rand;
        for (size_t i = 0; i < n; ++i)
        {
            arr[i] = rand() % 21 - 10; 
        }
    }


    Четвёртое:
    cout << y[0][0]; //все прекрасно выводится
    /*но если попробовать сделать y[0][0]+=1; то выводится ошибка "выражение должно быть допустимым для изменения левосторонним значением"*/

    Естественно, так происходит потому, что в вашем классе (который и не нужен совсем) вы возвращаете число, там где ожидается ссылка:
    int operator [](int i)
    {
        return x[i];
    }

    Заменить на:
    int& operator [](int i)
    {
        return x[i];
    }


    Пятое:
    int  operator [](int i)
    {
        return y[i][0]; /*совершенно непонятно, какую роль здесь играет [0], и почему не работает с просто return y[i]... при изменении [0] на любое другое число, результат не меняется...*/
    }

    Непонятно потому, что его там и не должно быть. operator[] должен давать доступ к строке (т.е. массиву). А уже второй operator[] будет относится к массиву и возвратит ссылку на элемент.
    massiv& operator [](int i)
    {
        return y[i];
    }


    Шестое:
    Если нужна матрица, используйте двумерный массив и не изобретайте велосипед. Если класс всё же необходим, например, если нужно добавить методы для работы с матрицей, можно написать такой класс, используя двумерный массив:
    class Matrix
    {
    public:
        Matrix() {}
        int* operator[] (size_t i)
        {
            return &arr[i][0]; // Указатель на первый элемент i-ой строки.
        }
    private:
        int arr[5][5];
    }


    Седьмое:
    Классы принято называть с большой буквы. И пожалуйста, не называйте их транслитом.
    Массив - Array
    Матрица - Matrix
    Ответ написан
    Комментировать
  • Как оперировать с числами, которые выше максимально возможных?

    @Alexander1705
    Длинная арифметика.
    Если кратко: храните число в виде массива, где каждый элемент - это разряд числа и обрабатываете все операции вручную.
    Ответ написан
    Комментировать
  • Почему не работает код (С++)?

    @Alexander1705
    Можно так:
    for(int x = 0; x < 100; x = x + 2)
    {
        if(x % 4) cout << x;
    }


    Или так:
    for(int x = 0; x < 100; x = x + 2)
    {
        if(x % 4 == 0) continue;
        cout << x;
    }


    Суть в том, что в условии ноль приводится к false, а любое другое число - к true.

    Ну и вообще, есть более оптимальный способ:
    for(int x = 2; x <= 100; x += 4)
    {
        cout << x;
    }
    Ответ написан
    2 комментария
  • Как найти максимальное значение без ?/switch/if?

    @Alexander1705
    Можно написать функцию max без использования условных операторов:

    def max_(a, b):
        return (a + b + abs(a-b)) / 2;
    
    m = 0
    arr = [1, 2, 3, 4, 5, 6, 98, 65, 190]
    for val in arr:
        m = max_(m, val)
    
    print(m)
    Ответ написан
    2 комментария
  • Как в Vusial studio разделить проект на элементы а потом сделать их одним целым?

    @Alexander1705
    Вы имеете ввиду разбить проект на несколько файлов?
    Вам понадобится создать по два файла для каждого модуля: заголовочный (с объявлениями) и собственно файл с реализацией (определением). Файлы с объявлениями имеют расширение .h .H .hpp и так далее.

    main.cpp: определение функции main.
    // Следующая строка при компиляции будет заменена на содержимое файла helloworld.h
    #include "helloworld.h"
    
    int main(int argc, char** argv)
    {
        helloworld(); // Вызываем функцию определённую в другом файле.
        return 0;
    }

    helloworld.h: объявление функции helloworld
    // Следующая конструкция называется include guard.
    // Благодаря ней вы не сможете вставить содержимое этого файла дважды,
    // что поможет вам избежать ошибок переопределения.
    #ifndef HELLOWORLD_H 
    #define HELLOWORLD_H
    
    // Объявление функции.
    // Если функция объявлена но не определена в данном файле,
    // компилятор будет искать её реализацию в других файлах.
    void helloworld();
    
    #endif

    helloworld.cpp
    // Снова вставляем содержимое файла helloworld.h
    #include "helloworld.h"
    
    #include <iostream>
    
    // Определяем функцию.
    void helloworld()
    {
        std::cout << "Hello, world!";
    }
    Ответ написан
    Комментировать
  • С++ В чём ошибка?

    @Alexander1705
    Не используйте оператор for each, он не является частью стандарта языка C++ и поддерживается только в VisualStudio.
    Используйте range-based цикл, который появился с версией C++11:
    for (string strFILE : v_strSEARCH)
    {
        cout << "Файл " << v_strFILE << endl;
    }

    А ошибка в том, что вы возвращаете пустой вектор:
    return vector<string>();

    Upd.
    Судя по истории ваших вопросов на тостере, добавлю:
    Если вы называете функцию GetFiles, компилятор на это никак не реагирует, он не будет сам возвращать вам список файлов. Имя функции задаётся только для того, чтоб программисту было понятно, что она делает. Внутри функции вам самим нужно написать алгоритм, который найдёт этот список, а после возвратит его, или же вызывать другую, заранее определённую, функцию.
    Используйте, например WinApi
    Ответ написан
    7 комментариев
  • Как быстрее считать данные из стандартного потока?

    @Alexander1705
    habrahabr.ru/post/246257
    Здесь в основном для С++, но 6-ой вариант должен работать для С.
    Ответ написан
    Комментировать
  • Как постороить дерево как на картинке?

    @Alexander1705
    Каждая вершина, это структура, которая содержит данные, указатель на родителя и список указателей на дочерние элементы.

    struct item {
        int value;
        item* parent;
        vector<item*> children;
    
        item(int v, item* p = nullptr) : value(v), parent(p) {}
        
        void addChild(int value) {
            children.push_back(new item(value, this));
        }
    
        ~item() {
            for(auto child : children)
                delete *child;
        }
    }


    Естественно, value может быть любого другого типа.
    Ответ написан
    1 комментарий
  • Как выбрать какую функцию вызвать на этапе выполнения программы?

    @Alexander1705
    Так как имя функции по сути является указателем, то этот указатель можно передать, как аргумент другой функции.

    Указатель на функцию можно использовать следующим образом:
    // Некоторая функция
    float func(float x1, float x2);
    
    // Указатель на функцию: возвращаемый_тип (* имя_указателя)(типы_аргументов)
    float (*func_pointer)(float, float);
    
    // Указателю можно присвоить только функции имеющие такую же 
    // сигнатуру (возвращаемый тип и типы аргументов)
    func_pointer = func;
    
    // Указатель на функцию может быть аргументом
    double findMinimum(x1, x2, float (*func_arg)(float, float)) {
        // Вызвать функцию через указатель можно также как и обычную функцию
        // потому, что имя функции тоже является указателем
        float x = func_arg(x1, x2);
    }
    
    // Чтоб передать указатель на функцию, нужно просто написать имя функции без скобок
    cout << findMinimum(1, 2, func) << '\n';
    Ответ написан
    Комментировать