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

    @abcd0x00
    Замени это:
    int N;
    scanf("%d",&N);
    N++;
    N *= N;
    printf("%u",N);


    На это:
    int n;
    
    scanf("%d", &n);
    n = (n + 1) * (n + 1);
    printf("%d", n);
    Ответ написан
    Комментировать
  • В чём разница операторы присваивания оператор равенства?

    @abcd0x00
    Я не понимаю чем и как отличаются операторы присваения от оператора равенства

    Это совсем разные операции. Операция присваивания записывает какое-то значение в переменную. Операция сравнения сравнивает значения, чтобы можно было знать, равны они или нет.

    Операция присваивания в if'е (в условии) не используется никогда, но она может там случайно появиться из-за опечатки в операции сравнения. И при появлении об этом никак не будет сообщено, потому что синтаксически такая запись не считается неправильной. Поэтому такая опечатка может приводить к незаметной ошибке в программе, так как программа будет просто потихой неправильно работать.
    Ответ написан
    Комментировать
  • Как проверить на C++ создался ли файл?

    @abcd0x00
    Когда файл закрыл, нужно его снова открыть и закрыть (на чтение). Вот при открытии и станет ясно, появился ли он.
    Ответ написан
    Комментировать
  • Qt. Как создать с инициализацией объект класса с членами-объектами на стеке?

    @abcd0x00
    Они там сами потом освобождаются (для этого ты их и привязываешь к родителям). Поэтому если ты привяжешь к чему-нибудь элемент, для которого не выделялась динамическая память, то эта освобождалка всё равно будет его освобождать, что и даст выпадение программы. Так что делай, как все делают - выделяй память и привязывай.
    Ответ написан
  • Есть ли разница между char* и char[число] при передаче аргументов функции?

    @abcd0x00
    Разницы нет. Вообще, принято скобки писать просто пустыми, без числа. Но в идеале, чисто стилистически для повышения читаемости, когда передаётся указатель, пишется указатель, а когда передаётся массив, пишется массив.

    Вот пример:
    Обычно пишут так
    int main(int argc, char *argv[])
    Но это можно записать и так
    int main(int argc, char **argv)
    Так как разницы нет.
    Но пишут первым способом, чтобы подчеркнуть для читателя исходника, что там массив указателей, а не просто указатель на указатель какой-то непонятный (можно его двигать, или нельзя его двигать - неясно). А в первом варианте читателю сразу понятно, что там можно применять argv++, так как движение по массиву происходит.
    Ответ написан
    Комментировать
  • Продолжать обучение?

    @abcd0x00
    Пройдя этот курс в голове по-любому останется хоть какая-то база по С++, но будут ли базовые знания Си? Или всё же Си надо изучать отдельно?

    У них разые стили при написании программ. C++ стремится к одному, оттуда и стиль свой. C стремится к другому, оттуда и стиль свой. То есть ты не только будешь напарываться на различия в синтаксисе (которые есть), но и писать на C неправильным стилем, делая всякие избыточные и ненужные вещи. Программы на C получаются намного короче аналогичных (эквивалентных) программ на C++.

    Для примера тебе:
    В C++, если есть приведение типа, оно делается явно, причём с выбором правильной операции приведения типа (кастования).
    В C то же самое пишется просто без каких-либо операций, потому что существует неявное приведение типа (по стандарту), про которое ты знаешь, а потому и писать ничего не надо.
    То есть уже минус одна заморочка, которая в C++ жрёт текст исходника, а в C она вообще не используется, оставляя исходник чистым и кратким.
    Ответ написан
    Комментировать
  • Правильно ли сделаны пояснения к коду?

    @abcd0x00
    Вот ты не понимаешь, что такое знаковый тип, поэтому пишешь неправильно.

    10000001b - вот это значение может храниться в переменной как знакового (signed char или просто char (иногда где-то может быть беззнаковым), так и беззнакового (unsigned char) типа. Значение хранится одно и то же, а означает разные величины, в зависимости от типа переменной, в которой хранится.

    Но чем отличаются знаковый тип от беззнакового: переменная знакового типа может переполниться и при переполнении может давать неопределённые результаты; а переменная беззнакового типа не может переполниться, там определённо всё лишнее отсекается (поэтому битовые операции проводят на беззнаковых переменных).

    Так что число отрицательное не потому, что у него там бит знака равен единице, а потому что тот бит вообще считается битом знака, так как число хранится в переменной знакового типа.
    Ответ написан
    Комментировать
  • Как из строки вывести слова в массив?

    @abcd0x00
    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    int main()
    {
        char line[] = "  abc  def, ghi  ";
        char *arr[3];
        char *p;
    
        p = line;
        for (int i = 0; i < 3; i++) {
            p = strtok(p, " ,");
            if (p) {
                arr[i] = p;
                p = NULL;
            } else {
                break;
            }
        }
    
        for (int i = 0; i < 3; i++) {
            cout << arr[i] << endl;
        }
    
        return 0;
    }


    Вывод
    [guest@localhost cpp]$ .iso++ t.cpp -o t
    [guest@localhost cpp]$ ./t
    abc
    def
    ghi
    [guest@localhost cpp]$
    Ответ написан
    Комментировать
  • Как заставить работать scanf?

    @abcd0x00
    Это Visual Studio блокирует сишные функции, предлагая свои функции вместо сишных.
    Надо добавить в самом начале (до всех строк)
    #define _CRT_SECURE_NO_WARNINGS
    Ответ написан
    Комментировать
  • Точность рекуррентной формулы?

    @abcd0x00
    Там только соотношение выведено правильно. Дальше нужно выбрать правильные начальные значения и правильную проверку для остановки.
    Ответ написан
    Комментировать
  • Профессионально ли реализовал алгоритм?

    @abcd0x00
    Программа (код) должна быть правильной, понятной и легко изменяемой.

    Правильность там страдает, потому что берёт не все ссылки, которые надо брать, и берёт то, что вообще не ссылка, как ссылку. (Если туда вставить комментарий html со ссылкой внутри, она спокойно определит эту ссылку как валидную. И такое часто бывает в реальных страницах - код комментируют периодически и всё это продолжает передаваться.)

    Понятность страдает в дурацких, ничего о себе не говорящих именах переменных и запутанном регулярном выражении. Если ты берёшь ссылку, то в регулярном выражении только у неё скобки группы и должны быть, а не у всего подряд. (Из-за того что это регулярное выражение запутано, в него легко может закрасться ошибка, и ты её просто не заметишь, так как это регулярное выражение муторно читается каждый раз и ты просто не будешь этого делать.)

    Лёгкая изменяемость здесь особо не нарушена, но только потому, что код небольшой. Был бы он больше, это тоже дало бы о себе знать.

    В общем, добавление везде std:: не делает код профессиональным, так как это просто ламерский код с добавленными везде std:: .
    Ответ написан
    Комментировать
  • Как с помощью fstream считать n-ный символ из файла?

    @abcd0x00
    как с потока ifstream из файла считать, например, 30-й символ?

    Надо прочитать 29 символов любым способом (get() или getline() или ещё что-нибудь).
    Ответ написан
    Комментировать
  • Какое обьявление массива в c++?

    @abcd0x00
    где-то "int a[10]", где-то "vector a(10)". В чем разница, если она есть?

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

    Вот int a[10] - это реализация вектора в языке C++, а vector a(10) - это реализация динамического вектора в языке C++.

    Также наряду с динамическим вектором в языке программирования могут быть реализованы и другие динамические структуры: стек, очередь, дек, множество, связный список и другие.
    Ответ написан
    Комментировать
  • Не могу разобраться в книге Герберт Шилдт C++. Ошибка в книге или в VS?

    @abcd0x00
    Не нужно писать system("pause") или cin.get(). Нужно просто сделать ярлык на cmd.exe в папке с программой и стереть в его свойствах путь к рабочему каталогу. Так консоль будет запускаться прямо в этой папке, в ней уже можно будет вполнять программу.
    Ответ написан
    Комментировать
  • Как быстро изменить оформление кода всего проекта?

    @abcd0x00
    Может есть какие то средства? Или программы?

    Есть sed, но его нужно знать.
    Ответ написан
    Комментировать
  • В каких случаях использовать .h и .hpp?

    @abcd0x00
    Можно так поделить: .h - если эти файлы можно использовать в проекте на C; .hpp - если эти файлы можно использовать только в проекте на C++.
    Ответ написан
    Комментировать
  • Как разнести класс по файлам?

    @abcd0x00
    Насколько дурным тоном будет реализовать весь такой класс в одном файле (в .h например)?

    Их специально сделали отдельными, потому что они не компилируются, а только вставляются напрямую через include. Некоторые расчитаны на единственную вставку (тогда делаются ворота из ifndef), а некоторые - на множественную вставку (тогда и ворота из ifndef не нужны). И вот когда они вставлены, тогда они и компилируются уже в контексте того места, куда они вставлены.
    Назначение файлов .h - сделать видимыми имена (объявить имена).
    Ответ написан
    Комментировать
  • Как правильно организовать структуру в классе?

    @abcd0x00
    Нужно создать программу, которая будет служить эмулятором кассового аппарата.

    Ты должен сначала описать наружнюю составляющую этого аппарата.

    Типа
    начать работу
    нажать кнопку один
    нажать кнопку два
    повернуть ручку такую-то
    повернуть ручку другую-то
    показать на экране текущее состояние
    кончить работу

    Это внешнее описание аппарата.

    Вот это твой класс должен реализовывать - представлять из себя такую коробку с методами. А вот внутри уже у тебя хранятся какие-то данные, введённые в аппарат или полученные им внутри при вызове методов снаружи.

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

    @abcd0x00
    В первом случае arr - это указатель. Указатель - это переменная, хранящая какой-то адрес каких-то данных определённого размера. Указатель можно менять, присваивая ему новые значения. Его можно сдвигать вправо (arr++) и влево (arr--) или вообще переставлять на какие-то другие данные в другом месте (arr = новый адрес). Так указатель можно поставить на начало массива, а можно на середину массива, а можно на конец массива и потом через него читать или менять массив в том месте.

    Во втором случае arr - это массив. Каким ты его создал, таким он и остаётся до конца.
    Ответ написан
    Комментировать