Задать вопрос
Ответы пользователя по тегу C++
  • В чём ошибка кода с рандомным выбором вопроса?

    @abcd0x00
    Проблема в следующем: каждый раз либо не считывает тесты, либо вопросы идут в обычном порядке. В чём проблема?

    Генератор случайного числа никак не используется. Нужно либо при чтении его использовать для чтения случайного вопроса, либо после чтения всех вопросов для перемешивания прочитанных. Первый вариант лучше, так как при втором варианте вопросы будут одни и те же всегда, хоть и в случайном порядке. Но при втором варианте ты должен будешь контролировать дублирование вопросов.
    Ответ написан
    Комментировать
  • Когда вызывается malloc() или new, то на самом деле вызывается какая-то win api функция?

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

    @abcd0x00
    Когда пишешь на C:
    char *s, *p, *q, ch, *func(void), arr[10];

    Когда пишешь на C++:
    char* s;
    char* p;
    char* q;
    char ch;
    char* func();
    char arr[10];


    То есть ты просто должен по-разному думать: в C принято объявлять их в одну строку или в несколько строк (язык так и спроектирован, чтобы можно было делать, как удобно); в C++ не принято объявлять их в одну строку (делай, как получится).
    Ответ написан
  • Как хранить результат вызова системной команды?

    @abcd0x00
    Самое оптимальное будет - добавить в команду, передаваемую в system(), перенаправление вывода в файл, а потом этот файл прочитать через fopen(). После всего удалить файл через remove().
    Ответ написан
    Комментировать
  • Как узнать пересечение линий?

    @abcd0x00
    Вот тебе псевдокод для определения, пересекаются ли отрезки.
    Код
    программа пересечение двух отрезков <вх:ax,ay,bx,by,cx,cy,dx,dy:R>:Q
     дано    : | концы первого отрезка (ax, ay) и (bx, by)
               | концы второго отрезка (cx, cy) и (dx, dy)
     получить: | ответ = отрезки пересекаются да/нет
     ____________
      | A(ax, bx) B(bx, by) C(cx, cy) D(dx, dy)
      v1x := bx - ax | вектор AB
      v1y := by - ay
      v2x := cx - ax | вектор AC
      v2y := cy - ay
      v3x := dx - ax | вектор AD
      v3y := dy - ay
      v4x := dx - cx | вектор CD
      v4y := dy - cy
      v5x := bx - cx | вектор CB
      v5y := by - cy
      v6x := ax - cx | вектор CA
      v6y := ay - cy
      coord1 := v1x * v2y - v1y * v2x | [AB, AC]
      coord2 := v1x * v3y - v1y * v3x | [AB, AD]
      coord3 := v4x * v5y - v4y * v5x | [CD, CB]
      coord4 := v4x * v6y - v4y * v6x | [CD, CA]
      ответ := (coord1 * coord2 <= 0 и coord3 * coord4 <= 0)
    конец программы

    Ответ написан
    1 комментарий
  • [С++ ]Поставил begin — поставь и end. Как распознать вложения и правильно поставить в коде end?

    @abcd0x00
    Напишите программу, проверяющую правильность вложения операторных скобок begin ... end — каждому begin должен соответствовать end.

    Думаю, тут нужен конечный автомат со стеком. Конечный автомат сможет отличить значимые строки с begin от комментариев с begin. А стек поможет отличить правильную конструкцию begin begin end end от неправильной end begin end begin.
    Ответ написан
    Комментировать
  • Как линкуются .cpp файлы к файлам .h?

    @abcd0x00
    Как он понимает, что реализация в file.cpp?

    Очень просто: ты подаёшь этот файл компилятору, а всё, что в нём есть, попадает в общее глобальное пространство. После обработки препроцессором всё это выглядит так, будто оно не в нескольких файлах, а в одном.

    В итоге, file.h file.cpp main.c становятся как бы одним файлом.
    Ответ написан
    5 комментариев
  • Код C, который не будет работать в C++?

    @abcd0x00
    int f()
    {
        return 1;
    }
    
    int main(void)
    {
        f(1, 2);
        return 0;
    }
    Ответ написан
    Комментировать
  • Алгоритм или как создаются линейные штрих-коды?

    @abcd0x00
    Как создаются линии?

    https://ru.wikipedia.org/wiki/European_Article_Number
    https://ru.wikipedia.org/wiki/Universal_Product_Code

    При проектировании структуры кода, в условиях ещё не слишком развитой электроники, было важным сделать его как можно более простым для считывания сканером и упростить аппаратную часть самого сканера. Одной из сложностей была проблема вероятного считывания кода в обратном направлении, то есть считывания кода на товаре, который кассир поднёс к сканеру «вверх ногами». Поэтому очень важно было, чтобы чередование полос было одинаковым в обоих направлениях — сначала тёмный штрих, потом белый, потом опять тёмный и так далее.


    Много нюансов там, связанных с аппаратурой и человеческим фактором. Поэтому логика кодирования такая, немного странноватая.
    Ответ написан
    Комментировать
  • Чего то я не понял с функциями из библиотеки string.h?

    @abcd0x00
    Все функции из пакета возвращают число int.

    Во-первых, string.h - это не пакет, а набор объявлений для группы функций из стандартной библиотеки функций языка C. То есть библиотека включает в себя вообще все функции, а файлы с объявлениями позволяют подключать (объявлять) их только нужными группами.

    Во-вторых, не все функции для работы со строками возвращают int. Это ты сам придумал, где-то что-то перепутав. Строковые функции бывают разными - и возвращающими int, и возвращающими char *, и возвращающими size_t. Функция strstr() возвращает char * - указатель на начало найденной подстроки, либо NULL, если подстрока не найдена.

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

    @abcd0x00
    Вызов gets_s() проскакивает потому, что при вводе по cin ты нажимаешь Enter в конце. Когда нажимаешь Enter, в поток посылается символ перевода строки и остаётся там. А потом gets_s() видит его и считает введённой строкой. Поэтому ты должен после cin выполнить cin.get()

    Пример
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int n;
        char c;
    
        cin >> n;
        cin.get(c);
    
        cout << n << " " << int(c) << endl;
        return 0;
    }


    Вывод
    [guest@localhost cpp]$ .iso++ t.cpp -o t
    [guest@localhost cpp]$ ./t
    123
    123 10
    [guest@localhost cpp]$


    Вот это число 10 - это код символа \n (символа перевода строки).
    Ответ написан
    Комментировать
  • Как работает размещающий оператор new?

    @abcd0x00
    но КУДА происходит его запись?

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

    @abcd0x00
    Поставь себе нормальную среду с нормальным компилятором. VS просто пытается пользователя к себе привязать, навязывая свои "безопасные" функции, которые есть только в ней.
    Ответ написан
    Комментировать
  • Цена перехода с С# на C++?

    @abcd0x00
    Хотелось бы услышать ваше мнение, сложно ли будет перейти с C# на С++, так сказать цену вопроса.

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

    @abcd0x00
    В самом начале создаем 1 элемент стека "top" (он же пока что и является верхним) при помощи конструктора с полями key = NULL, deeperElement = NULL;

    Зачем он там нужен, если в нём ничего нет? Бывает, учат так в вузах, добавляя лишние ненужные элементы.
    Сделай стек и инициализируй его вершину нулевым указателем и по этому значению проверяй. Ни один указатель на объект не может быть равен нулевому указателю, поэтому это надёжное средство.
    Ответ написан
    Комментировать
  • Указатель на указатель?

    @abcd0x00
    Вот в этой строке argv - это указатель на указатель на строку.
    int main(int argc, char *argv[])
    Аргументы программы представлены в виде массива указателей на строки, в котором последний указатель равен нулю (нулевому указателю).

    Бывает, что эту строку записывают и так
    int main(int argc, char **argv)
    Ошибки нет. Просто пишут скобки, чтобы напомнить, что там массив указателей, а не просто один указатель какой-то.

    И дальше что? Правильно, ты можешь делать argv++, переходя по массиву указателей вправо.

    А как сделать функцию, которая сама бы переставила argv?
    void func(char ***p) { (*p)++; }
    ...
        func(&argv);

    Пример
    #include <iostream>
    
    using namespace std;
    
    void func(char ***p)
    {
        (*p)++;
    }
    
    int main(int argc, char *argv[])
    {
        cout << argv << " " << *argv << endl;
        func(&argv);
        cout << argv << " " << ((*argv) ? *argv : "no") << endl;
        return 0;
    }

    Вывод
    [guest@localhost cpp]$ .iso++ t.cpp -o t
    [guest@localhost cpp]$ ./t
    0xbffc3114 ./t
    0xbffc3118 no
    [guest@localhost cpp]$ ./t a
    0xbf999594 ./t
    0xbf999598 a
    [guest@localhost cpp]$

    Ответ написан
    Комментировать
  • Как вернуть массив?

    @abcd0x00
    Пример передачи указателя в функцию и его возврата из функции
    Код
    #include <stdio.h>
    
    int *func(int a, int b, int *p)
    {
        p[0] = a;
        p[1] = b;
        return p;
    }
    
    int main(void)
    {
        int arr[4], *p;
    
        p = func(1, 2, arr);
        printf("%d %d\n", p[0], p[1]);
    
        p = func(3, 4, arr + 2);
        printf("%d %d\n", p[0], p[1]);
    
        p = arr;
        printf("%d %d %d %d\n", p[0], p[1], p[2], p[3]);
        return 0;
    }


    Вывод
    [guest@localhost c]$ .ansi t.c -o t
    [guest@localhost c]$ ./t
    1 2
    3 4
    1 2 3 4
    [guest@localhost c]$


    Как раз в твоей ситуации у тебя недопонимание указателей.
    Ответ написан
    Комментировать
  • Чем отличается спецификатор от модификатора C/C++?

    @abcd0x00
    Есть квалификатор, спецификатор и модификатор.
    Квалификатор и модификатор - это одно и то же.

    Спецификатор - то, что задаёт тип:
    int
    short
    long
    struct x
    union y

    Модификатор - то, что меняет заданный тип:
    const
    volatile
    Ответ написан
    Комментировать
  • Struct - что это?

    @abcd0x00
    Структуры используются для создания составных типов данных. Раньше (в C) они ограничивались только данными, но потом (в C++) для этих составных данных добавили и создание операций над ними.

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

    То же самое касается и инициализации: если раньше можно было инициализировать одним способом, то теперь можно сделать разные способы инициализации путём создания разных конструкторов.
    Ответ написан
    Комментировать
  • Почему char занимает 1 байт, а строка с одним символом - 2 байта?

    @abcd0x00
    Нуль-символ обозначает конец строки. То есть строку можно читать, посимвольно смещаясь вправо, пока не встретится конец. Таким образом её длину хранить не нужно.
    А теперь представь строку на миллиард символов. Для такой строки затраты на хранение её длины остаются теми же - один байт в котором записан нуль-символ.
    А вот если бы длина строки хранилась в переменной, то нужно было бы следить за размером этой переменной, потому что на слишком длинных строках числовое значение длины не помещалось бы в переменную.
    Ты думаешь, почему Дельфи такой медленный язык (программа The Bat! работает медленно), потому что там этого нет, из-за чего происходит множество лишних вычислений.
    Ответ написан