• Как подтянуть знания linux? Что оптимально?

    @abcd0x00
    Если нужны команды, пройди ABSG (на русском).
    А вообще, читай man'ы и --help'ы у программ.
    Ответ написан
    Комментировать
  • Как в C++ увеличить число символов, занимаемых числом?

    @abcd0x00
    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    
    int main()
    {
        cout << 300 << endl;
        cout << setw(3) << 3 << endl;
        cout << setfill('0') << setw(3) << 3 << endl;
        return 0;
    }


    Вывод
    [guest@localhost cpp]$ .iso++ t.cpp -o t
    [guest@localhost cpp]$ ./t
    300
      3
    003
    [guest@localhost cpp]$
    Ответ написан
    2 комментария
  • Чем отличается динамическая переменная от переменной в блоке?

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

    Динамическая память, которая используется через malloc()/calloc()/realloc() и free(), нужна в двух случаях:
    1) Когда ты не знаешь, сколько памяти тебе понадобится в какой-то момент. Например, не знаешь, какого точно размера массив будет, толи 100 элементов, толи 1000.
    2) Когда нужно что-то сохранить в одной функции, а использовать в другой функции. Первая функция, завершаясь, никак не трогает то, что размещено в динамической памяти.

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

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

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

    Как разделить на части? По длине в байтах или по маркеру (признаку).
    Ответ написан
    Комментировать
  • Должен ли программист знать ассемблер?

    @abcd0x00
    Если тебе нужно что-то переделать в какой-то программе, то ты никак это не переделаешь, не зная ассемблера. Например, сидишь ты в винде, тут раз она начала куда-то подключаться и что-то качать. Ты ищешь, а где это отключается, и обнаруживаешь, что нигде, что так задумано. Вот тогда ты лезешь в то место, где она включает эту закачку, и переключаешь там байты на то место, где она думает, что уже всё закачала.
    Ответ написан
    Комментировать
  • Как использовать "гибкость" двумерного массива, перед одномерным?

    @abcd0x00
    Тут тебе набросал пример разделения большого массива на подмассивы.
    Код
    #include <iostream>
    
    using namespace std;
    
    class Student {
        char *name;
        char *surname;
        int age;
        char phone[12];
        double average;
    public:
        Student() {};
        ~Student() {};
        // methods
        void set_age(int n) {
            age = n;
        }
        void print_age() {
            cout << age << endl;
        }
    };
    
    class AcademyGroup {
        enum { LINES = 10, ONE_LINE = 50 };
        Student ***pSt;
        int count;
    public:
        AcademyGroup();
        ~AcademyGroup();
        // methods
        void add(Student *p);
        void print();
    };
    
    AcademyGroup::AcademyGroup()
    {
        pSt = new Student **[LINES];
        for (int i = 0; i < LINES; i++)
            pSt[i] = new Student *[ONE_LINE];
        count = 0;
    }
    
    AcademyGroup::~AcademyGroup()
    {
        for (int i = 0; i < LINES; i++)
            delete [] pSt[i];
        delete [] pSt;
        count = 0;
    }
    
    void AcademyGroup::add(Student *p)
    {
        pSt[count / ONE_LINE][count % ONE_LINE] = p;
        count++;
    }
    
    void AcademyGroup::print()
    {
        for (int i = 0; i < count; i++) {
            pSt[i / ONE_LINE][i % ONE_LINE]->print_age();
        }
    }
    
    int main()
    {
        AcademyGroup group;
    
        for (int i = 0; i < 200; i++) {
            Student *p = new Student;
            p->set_age(i + 1);
            group.add(p);
        }
        group.print();
        return 0;
    }


    Вывод
    [guest@localhost cpp]$ .iso++ t.cpp -o t
    [guest@localhost cpp]$ ./t
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    [guest@localhost cpp]$


    По поводу ёмкости: вот эту часть, отвечающую за двумерность, можно перевыделять. То есть изначально, например, было 10 строк по 50 элементов, а потом на 501 элементе ты просто берёшь эти 10 строк перевыделяешь с сохранением того, что там было, и продолжаешь в том же духе. Перевыделение у тебя должно быть в функции добавления элемента.
    Ответ написан
    Комментировать
  • Большой проект на С. Как строить работу чтобы не завалило кодом?

    @abcd0x00
    По самому проекту тебе ответил уже Владимир Дубровин, а вот по малой части надо стремиться к декомпозиции (разложению) на исполнители.

    В одном .h файле описываешь интерфейс объекта, например, стека
    void stack_start();
    int stack_push(int value);
    int stack_pop();
    int stack_isempty();
    int stack_topr();
    int stack_topw(int value);
    void stack_del();
    void stack_end();

    Дальше в .c файле пишешь реализации этих методов (сами функции и статические (закрытые в файле) переменные, которые им нужны для внутренней работы). И потом, чтобы подключить стек, ты просто подключаешь его .h файл и используешь эти методы.
    (Это пример; на самом деле, делается набор методов, который можно применять к разным стекам, где соответствующий стек (структура) просто передаётся в метод первым аргументом.)

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

    Тогда всё будет чисто, это всё можно будет тестировать ясными unit-тестами, можно будет легко выделять такую часть и заменять на другую и, самое главное, можно будет сами эти методы также декомпозировать дальше, так как не всегда они просто устроены, как в примере со стеком.
    Ответ написан
    Комментировать
  • Наиболее красивый и правильный способ передачи параметров сквозь другой класс?

    @abcd0x00
    Допустим самой камере для работы нужен общий класс для всех камер OutputBuffer

    То, что он общий, ничего не значит. Работать с ним надо так, будто он индивидуальный для каждой камеры.
    Передаёшь его каждой камере при её инициализации. А уже готовая камера (которая знает, куда выводить) добавляется в список камер.
    Ответ написан
  • Глупый вопрос по Python?

    @abcd0x00
    >>> text = "eujiyghkiuyhjiu"
    >>> 
    >>> dic = {}
    >>> 
    >>> for c in text:
    ...     dic[c] = dic.get(c, 0) + 1
    ... 
    >>> dic
    {'e': 1, 'g': 1, 'u': 3, 'k': 1, 'h': 2, 'y': 2, 'j': 2, 'i': 3}
    >>>
    Ответ написан
    Комментировать
  • Динамическая структура данных. Что это?

    @abcd0x00
    Динамическая структура данных - это структура данных, количество элементов которой может меняться в процессе. Никакого отношения к динамической памяти и new это понятие не имеет.

    Стек, очередь, дек, последовательность, множество, нагруженное множество, Л1-список, Л2-список, динамический вектор, дерево, хеш-таблица и другие - это всё динамические структуры данных.

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

    @abcd0x00
    Ты бы скобки заменил на почёркивание 40104161(1) -> 40104161_1.
    А потом переписал первую строку файла, скопировав в неё его имя.

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

    А над ними третий скрипт, который запускает для файла сначала первый скрипт, а потом второй.

    И вот когда у тебя есть этот третий скрипт, ты его запускаешь в цикле для списка файлов.
    Ответ написан
    Комментировать
  • Как повысить свои навыки программирования на С/С++?

    @abcd0x00
    Зачастую в моём коде встречается очень много логических ошибок, которые очень тяжело находить и исправлять. Как повысить мне свои навыки программирования ?

    Если у тебя много логических ошибок, то у тебя проблема с алгоритмами. Нужно уметь разрабатывать алгоритмы ещё до того, как они записываются на каком-либо языке.

    Тебе нужно научиться:
    1) Словесно описывать алгоритм от начала до конца.
    2) По словесному описанию алгоритма рисовать блок-схему.
    3) По нарисованной блок-схеме писать псевдокод.
    4) По псевдокоду писать уже конкретный код на конкретном языке.

    Вот это всё и вырабатывает правильное мышление, когда ты ещё только думаешь над программой.

    Немного про псевдокод

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

    @abcd0x00
    Опытные программисты, подскажите как или где вы записываете полезные кусочки кода или функции или еще что нибудь?
    Это же должно быть еще и удобно! И желательно наверно что бы из любой точки можно было заглянуть!

    У меня Emacs за всё отвечает. Там можно их не только хранить, но и выполнять прямо в тексте.
    Скрин

    Накидал тебе примерные коды, повыполнял их. А вообще, там можно хранить много чего: всякую метаинформацию, живые таблицы типа экселевских. Тут по минимуму: теги справа для поиска кодов определённой группы (языка); ссылки куда что, для подробностей.
    Откроешь картинку в отдельной вкладке, она будет в нормальном размере.
    eb56fe7be87447c89db8389abd940e93.png
    Эти куски можно редактировать, тогда они подсвечиваются синтаксически в соответствии со своим языком, который там указан.
    Ответ написан
    Комментировать
  • Клиент хочет автоматизировать загрузку каталога на сайт через CSV, как это сделать если есть сложные описания?

    @abcd0x00
    Надо просто использовать готовые средства для преобразования данных в csv, потому что они знают, как правильно экранировать (соотвествуют rfc4180).
    На питоне пример
    >>> import csv
    >>> import sys
    >>> 
    >>> lst = [['a a1', 'b,b1', '<c>"text"</c>1', 'd d1'],
    ...        ['a a2', 'b,b2', '<c>"text"</c>2', 'd d2'],
    ...        ['a a3', 'b,b3', '<c>"text"</c>3', 'd d3']]
    >>> 
    >>> writer = csv.writer(sys.stdout)
    >>> 
    >>> writer.writerows(lst)
    a a1,"b,b1","<c>""text""</c>1",d d1
    a a2,"b,b2","<c>""text""</c>2",d d2
    a a3,"b,b3","<c>""text""</c>3",d d3
    >>>

    Ответ написан
  • Как работает данный код?

    @abcd0x00
    Почему в данном фрагменте требуется создать доп. метод Count ?

    Когда ты его вызываешь, создаётся замыкание, в котором в переменной sum накапливается значение при каждом вызове. И таких замыканий можно сделать несколько независимых друг от друга.
    CountIt c1 = Counter();
    CountIt c2 = Counter();
    CountIt c3 = Counter();

    Для того они и используются. Между вызовами что-то сохраняется в переменную и для каждого замыкания эта переменная своя собственная.
    Ответ написан
    Комментировать
  • Автодополнение команды из истории в bash?

    @abcd0x00
    Открой man bash и там почитай секцию про READLINE (найдешь через /^READLINE в less).
    Там работает множество Emacs'овых сочетаний. И инкрементальный поиск по истории через Ctrl + r - одно из них.
    Там можно управлять словами (вырезать, вставлять, менять местами, прыгать по словам), управлять символами, управлять строкой, там есть даже макросы.
    Пример

    Запись макроса, который вставляет символы abc, и дальнейший вызов его пять раз:
    C-x (
    abc
    C-x )
    M-5
    C-x e

    C - Ctrl
    M - Alt

    Выведет abcabcabcabcabc.
    Ответ написан
  • Python без Django etc, что остается в итоге?

    @abcd0x00
    Ответ написан
    Комментировать
  • Как исправить цикл "while", чтобы выводилось одно значение игнорируя перенос строки?

    @abcd0x00
    Когда ты вводишь символ, тебе нужно нажать <return> (Enter). Так вот этот приводит к тому, что за введённым символом сразу посылается символ перевода строки \n. На следующем шаге цикла он считывается и обрабатывается как обычный символ, поэтому получается проскок.

    Как это решается: нужно сделать функцию input_char().
    Нужно считать строку до конца, а потом из считанной строки выбрать первый символ. Для считывания строки можно использовать fgets(), а для считывания символа из полученного символьного массива можно использовать sscanf(). Это способ fgets() + sscanf().
    Ответ написан
  • Как научиться программировать на Delphi?

    @abcd0x00
    К примеру, хотел написать парсер текста и приплыл.

    Для этого нужно изучить конечные автоматы и формальные грамматики.
    wiki. конечный автомат
    wiki. формальная грамматика
    Пособия от МГУ: пособие по грамматикам

    Это, конечно, ещё не всё, так как надо ещё много чего изучать, чтобы просто разрабатывать программы (система контроля версий, юнит-тестирование, автоматическая сборка проекта, UML).

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

    @abcd0x00
    Сделать можно, но делать так не надо
    >>> def foo():
    ...     print('in foo')
    ...     def foo_in_foo():
    ...         print('in foo_in_foo')
    ...     foo.foo_in_foo = foo_in_foo
    ... 
    >>> foo()
    in foo
    >>> foo.foo_in_foo()
    in foo_in_foo
    >>>
    Ответ написан
    Комментировать