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

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    Скажем так, изучается не язык, изучается технология, что-то вроде "Написание графических приложений на Qt/C++" или "Написание прошивок для микроконтроллеров на С". От самого языка придется знать синтаксис (впрочем, вы и так уже знаете синтаксис в общих чертах) и поведение языка - то есть его стандарт - во что компилятор превращает буковки, что на этом языке писать нельзя и так далее....

    На этапе первичного знакомства с языком вам может потребоваться ментор, который будет тыкать вас в ошибки, плохие практики и прочую пакость. Вместо ментора можно применять одну из книжек, вроде "Веревки достаточной длины" Голуба, но это сложнее.

    Лучший способ быстро научиться - решать практические задачи. Очень хорошо, если такие задачи вы в состоянии поставить себе самостоятельно.

    В качестве первых практических задач можно взять классику программирования - самостоятельно написать реализацию классических алгоритмов и структур данных.

    Далее - разные варианты - можно брать задачи из разных областей (сегодня численно решаем диффуры, завтра - организуем поиск в десяти гигабайтах за секунду, послезавтра - рисуем трехмерки на микроконтроллере) и решать, решать, решать. Это позволит в общих чертах ознакомится с разными направлениями писания программ и выбрать наиболее удобное.

    Я привел вариант "долгий и тернистый путь", есть более короткие, но менее интересные, разумеется.
    Ответ написан
    3 комментария
  • Нужно найти чему равен главный минор квадратной матрицы?

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    Главный минор - это квадратная подматрица, взятая из левого верхнего угла. Всего главных миноров для квадратной матрицы порядка N N-1 штук - матрицы 1x1 2x2 3x3 4x4 .... N-1xN-1
    Ответ написан
    Комментировать
  • Как найти определитель матрицы методом гаусса по столбцу?

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    Методом Гаусса можно привести матрицу к треугольному виду, после чего получится, что ее определитель равен произведению элементов главной диагонали.
    Ответ написан
    Комментировать
  • Как можно проверить код на безопасность?

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    Выкладывать код как-то не хочется, так точно безопасность пострадает.

    Если от выкладывания кода может пострадать его безопасность, он нарушает Принцип Керкгоффса, а значит, должен быть отправлен на помойку.
    В корректно написанных приложениях даже полностью открытый код не должен давать злоумышленнику никаких шансов.
    Ответ написан
  • Где мог не доглядеть?

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    1. Счет массивов в С начинается с 0
    2. Инициализация строк сразу после создания бессмысленна, они и так пустые
    3. К главной ошибке вас привел поганый паскальский стиль объявлять одну индексную переменную на все циклы - счетчик должен быть объявлен прямо в операторе for(int j=0....; у вас же j после цикла равна n и таким образом находится за границей массива, отсюда - падение программы.
    4. Еще одно место для падения F >> s; - если строка длиннее 14(!)* символов - будет переполнение
    5. С каких пор поэлементное суммирование стало называться хэшированием? Коллизий будет огромное количество. C++11 например имеет встроенные средства для хэширования. В любом случае, на вход хэширующей функции лучше передавать константную ссылку на std::string а не массив символов


    HNKHENM: если вы заинтересованы в улучшении этого кода:
    • замените массивы на контейнеры (массив символов - на строку, массив строк - на вектор из них);
    • включите С++11, если компилятор не поддерживает, отправьте его на пенсию.
    • перебор символов в строке реализуйте циклом for из стандарта C++11
    • повсеместно используйте auto
    • откажитесь от дурной привычки для итерации сущностей с неотрицательным индексом использовать int, используйте size_t

    ______________________________________________________
    *Не забывайте, что самый последний символ в строке - маркер ее окончания \0
    Ответ написан
  • Один "многофункциональный" метод или несколько?

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    Первый, потому как ясно написано, какой метод что делает, а не переданный параметр определяет, что методу стоит делать.
    При разборе этого кода придется очень внимательно изучить метод (или документацию к нему), и только потом работать.
    А геттер и сеттер - это очевидные всем программистам методы со знакомым поведением.

    Кроме того, интерпретатор вместо непосредственной работы будет вынужден решать на основе параметров, а что же ему сейчас делать?

    И использовать эту штуку будет неудобно - захотели мы что-то прочитать в непустую переменную, так надо эту переменую сначала обнулить, и только потом вызывать ваш чудо метод. А если мы забыли это сделать? Так метод сделает все наоборот, и испортит данные - получится трудноуловимая ошибка.

    Второе решение - бедокод. Никогда не делайте так.
    Пишите код, исходя из того, что все программисты, которые будут сопровождать вашу программу, — склонные к насилию психопаты, знающие, где вы живёте.
    Мартин Голдинг
    Ответ написан
  • Язык Ассемблер для новичка, что нужно для этого?

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    Лично я рекомендую три учебника:
    • Юров
    • Калашников
    • Кулаков
    Желательно экспериментировать не на виртуальной машине. Если все же на ней, лучше всего - bochs.
    Обзорная статья
    Ответ написан
  • Как двойной знак равенства влияет на строки в С++?

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    Тут все плохо:
    1. Длина массива не связана с его содержимым, нужно заменить
      char str[10]="Привет!";
      на
      char str[]="Привет!";
    2. Привязанность к магической константе 10 и лишний счетчик. Измерение длины строки можно сделать вот так:
      size_t len=0;
      for(;str[len];len++);

      после чего в len будет искомая длина строки.
    3. Если необходима защита от строк чрезмерной длины:
      #define MAX_LEN (9000)
      ...
      size_t len=0;
      for(;(str[len])&&(len<MAX_LEN);len++);

    Ответ написан
    Комментировать
  • Как использовать USBasp, как USB-SPI преобразователь?

    gbg
    @gbg Куратор тега Электроника
    Любые ответы на любые вопросы
    В протоколе usbasp есть нужные инструкции:
    #define USBASP_FUNC_TPI_RAWREAD 13
    #define USBASP_FUNC_TPI_RAWWRITE 14

    Драйверы к программатору лежат на гитхабе
    Пример общения с программатором можно посмотреть в исходниках avrdude, в архиве есть файл usbasp.c
    Ответ написан
    Комментировать
  • Почему я получаю 2 лишних нуля?

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    Два бага сразу:
    Лишняя итерация цикла:
    for(i=0;i<=8;i++){
    i или должна быть <8 или <=7
    Не использован модификатор длины:
    sprintf (ch1, "0x%X", temporary[i]);
    Исправление:
    sprintf (ch1, "0x%2X", temporary[i]);
    Ответ написан
    Комментировать
  • Как лучше хранить введенные данные?

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    Обычно такой "Мастер" реализуется как окно со вкладками, в котором кнопки Вперед и Назад эти вкладки переключают. То есть данные остаются в тех же контролах, просто вкладка переключается на следующую. А когда надо вернуться - пользователь просто попадает на ту же вкладку и все.
    И никакой сериализации не нужно.
    Ответ написан
  • Совместная работа ардуино и линукс?

    gbg
    @gbg Куратор тега Linux
    Любые ответы на любые вопросы
    Изучайте QT5 и QSerialPort в частности.
    Ответ написан
    Комментировать
  • Вывод информации в консоль, при ожидании ввода с клавиатуры. Возможно?

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

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    shutdown -s -t 30
    Выдает предупреждение и вырубает машину через полминуты. Неотменяем.

    Можно поставить в Назначенные задания.
    Ответ написан
  • Как организовать параллельные процессы в С++ ?

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    Идея состоит в том, чтобы ждать малое время (0.1с), потом проверять наличие символа в буфере клавиатуры, если он есть - стоп, если нет - повторяем цикл.

    #include <conio.h>
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    bool waitKey(const size_t secondsToWait)
    {
        int i=secondsToWait*10;
        for(;(i)&&(!_kbhit());i--)
        {
             Sleep(100);
             if(i%10==0)
             {
                 cout<<i/10<<endl;
             }
        }
        //очистка буфера клавиатуры
        while(_kbhit())
        {
            getch();
        }
        return(i);
    }
    
    int main()
    {
      cout<<"press any key..."<<endl;
      if(waitKey(5))
      {
          cout<<"Countdown was stopped by key" << endl;
      }
      else
      {
          cout<<"Countdown was not stopped"<<endl;
      }
      return 0;
    }
    Ответ написан
    1 комментарий