• Существует ли "карта программиста"? Что и за чем учить?

    Epsiloncool
    @Epsiloncool
    Программер, веб-девелопер, гейм-девелопер
    Я программист с 15-летним стажем активной работы. Программирование - это инструмент для разработки ПО. Такой же как умение ходить для свободного перемещения из точки А в точку Б. Когда ребёнок рождается, нет никакой карты, в которой бы было указано - в какой последовательности он должен изучать ходьбу, чтобы стать в итоге полноценным человеком. Так и в разработке ПО - нет никакой последовательности. Вам нужно изучать всё сразу, понемногу. Причём не теоретически, а практически. Ребёнок не читает книг по развитию умения ходить, не слушает лекции от родителей. Он сразу пробует. Падает, и снова пробует. Пока не научится. С разработкой ПО в точности так же.

    Нет никакого смысла читать книги по изучению конкретного языка. Ставьте задачу - "переместиться из точки А в точку Б" (сделать какое-то конкретное приложение) и гуглите по каждому непонятному моменту, пока программа не будет написана. Научитесь правильно строить поисковые запросы.

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

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

    @poslannikD
    Java/C/C++ Programmer
    Это вопрос по синтаксису с++ )
    QLabel *label = new QLabel("Привет");
    label-> show();

    давайте разберем построчно
    1) QLabel("Привет"); - создали экзепмляр класса QLabel
    2) new QLabel("Привет") - оператор new выделяет память в куче, размещает там объект
    QLabel("Привет")
    и возвращает указатель на адрес в куче. По этому адресу расположен наш объект
    3) = new QLabel("Привет"); - оператор = выполняет присваивание(или инициализацию в зависимости от контекста). Присваивание(инициализация) чего ? Присваивание(инициализация) правого операнда. Присваивание(инициализация) чему? Присваивание(инициализация) левому операнду.
    4) QLabel *label - объявили указатель, который может указывать на объекты класса QLabel.
    5) QLabel *label = new QLabel("Привет"); -читаем с Права на лево создали объект, разместили его в куче, адрес объекта передали указателю типа QLabel который расположен слева от знака =
    Я так понимаю что [*label] это указатель на адрес объектов которых в дальнейшем будет много наверное

    Это указатель на адресс ОБЪЕКТА, этот указатель в один момент времени указывает только на ОДИН объект. так как отсутствует ключевое слово const то, да он может указывать на разные объекты. Но в конкретный момент времени он указывает только на один объект или вникуда

    label-> show();
    - обращаемся к объекту через УКАЗАТЕЛЬ на этот объект

    SomeClass a; //тут создается объект на основе класса
    SomeClass *p = &a; //это указатель на адрес объекта чтобы через него // вызывать методы класса

    1) SomeClass a; - объект создается на СТЕКЕ, не рекомендуется создавать тяжеловесные объекты на стеке, а легковесные можно.
    2)SomeClass *p = &a; - указатель указывает на объект на стеке все норм :)

    Различие между
    SomeClass a;
    и
    new QLabel("Привет");
    в том что объект а существует на стеке, а QLabel("Привет"); в куче
    Ответ написан
    Комментировать
  • Как найти координаты одной системы координат в другой по заданной прямой?

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

    @youkerni
    Unity3D developer
    Создаешь коллекцию гарантирующую уникальность и добавляешь в нее все значения из списка. Получаем коллекцию уникальных элементов. Если тебе на выходе нужен список - очищаешь старый или создаешь новый, после чего в него добавляешь все уникальные элементы из созданной тобой коллекции.

    По времени работы выйдет O(n * (n - a)), где N - количество элементов в списке, а - количество дубликатов. Ну если уж очень грубо, то O(n^2).
    Ответ написан
    Комментировать
  • Как удалить одинаковые элементы из списка?

    @res2001
    Developer, ex-admin
    В общем случае сортируете, проходите по списку и удаляете рядом стоящие одинаковые элементы.

    Но может надо решать проблему более кардинальным образом - вместо list использовать более подходящий контейнер - set? В set элементы уже отсортированы и уникальны.
    Ответ написан
    4 комментария
  • Удаление элементов из вектора (STL). В чем ошибка?

    myjcom
    @myjcom Куратор тега C++
    как правильно удалять произвольные элементы из вектора

    для встроенных
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int main() {
    	
    	vector<int> v{1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 9, 0};
    	v.erase(remove(v.begin(), v.end(), 0), v.end());
    
       // или
       // auto it = stable_partition(v.begin(), v.end(), [](int n){ return n != 0;}); // or partition
       // v.erase(it, v.end());
    
    	for(int i : v)
    	{
    		cout << i << " ";
    	}
    }


    или никак и надо использовать другой контейнер?

    Не то что никак, вставка и удаление элементов в векторе везде кроме конца - просто неэффективна.

    Если не нужен быстрый произвольный доступ можно использовать std::list или даже std::forward_list

    или даже std::unordered_multiset
    Ответ написан
    Комментировать
  • Удаление элементов из вектора (STL). В чем ошибка?

    Adamos
    @Adamos
    Сменить for на while и в случае удаления
    iter = mas.erase(iter);
    иначе
    iter++;
    Ответ написан
    Комментировать
  • В чем ошибка (работа с памятью, деструкторы)?

    @laphroaig
    При передаче объекта по значению происходит его копирование, но динамически выделенная память не копируется, а только значение указателя _coords. В результате у вас два объекта которые ссылаются на один и тот же массив. По завершению работы Dist копия объекта уничтожается с вызовом деструктора и освобождением памяти. А по завершению работы программы вызываются деструкторы объектов A и B в которых происходит попытка освободить память для _coords второй раз, а это неопределенное поведения (undefined behaviour) другими словами может произойти вообще что угодно.

    Вам нужно самому реализовать конструктор копирования или запретить его. Когда вы просто удаляете деструктор происходит утечка памяти, когда передаете по ссылке объекты не копируются поэтому всё норм. Если объект динамически выделяет память, например с помощью new или delete, то реализация конструктора копирования обязательна. Можно также его запретить перенеся конструктор копирования в приватную секцию или для c++11 объявить Point(const Point&) = delete; В этом случае передача такого объекта по значению приведет к ошибке компиляции. Это важная тема изучите ее.

    Все что выделено с помощью new [] удаляется только с помощью delete[]
    Ответ написан
    1 комментарий
  • В чем ошибка (работа с памятью, деструкторы)?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    У вас же C++, т.е. можете использовать вектор для хранения элементов без необходимости явного выделения памяти:
    #include <vector>
    
    // double* _coords;
    std::vector<double> _coords;
    
    // _coords = new double[N];
    _coords.resize(N);

    Ну и деструктор можете не писать.
    Ответ написан
    Комментировать
  • В чем ошибка (работа с памятью, деструкторы)?

    @res2001
    Developer, ex-admin
    delete[] _coords;
    В таком виде в Dist создаются копии объектов с помощью конструктора копирования по умолчанию, т.е. просто побайтовое копирование. После завершения Dist память под coords в копиях освобождается. Когда завершается main() та же самая память будет освобождена еще раз, что приведет к ошибке.
    Поэтому в Dist передавайте ссылки!
    Ответ написан
    Комментировать
  • Как лучше всего изучать английский?

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

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

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

    Еще одно (мое личное, субъективное) мнение. Чтобы уметь читать, нужно начать читать, чтобы уметь писать, нужно начать писать. Для развития навыков понимания устной речи, нужно слушать устную речь. Чтобы научиться разговаривать нужно начать говорить. При этом навык чтения может способствовать навыку понимания на слух, а письмо может помогать говорению. Но именно помогать, а не полностью заменять.
    Ответ написан
    1 комментарий
  • Что значит моделирование обьектов реального мира в ООП?

    @luna3956
    Представьте, что Вам нужно написать программу, в которой ведется учет частных домов на какой-нибудь улице. Ключевой единицей будет дом - объект из реального мира. Чтобы описать его с помощью программного кода для этого отлично подходит ООП. В нем есть такое понятие как класс, он является по сути моделью/структурой объекта из реального мира. В нашем примере с домом это будет примерно такой класс:
    class House {
    
      string address;
      int numOfRooms;
      ...
    
      House(string address, int numOfRooms)
      {
        this.address = address;
        this.numOfRooms = numOfRooms;
      }
    
    }


    Теперь же в самой программе чтобы оперировать таким объектом из реального мира как дом вам достаточно написать примерно следующее:

    House h = new House("Улица Вязов дом 13", 5);

    То есть в переменной h у нас теперь хранится объект/ссылка на объект, являющийся представлением объекта из реального мира - пятикомнатного дома, который находится по адресу "Улица Вязов дом 13".

    Или например собаку(тоже объект из реального мира) можно описать таким классом:

    class Dog {
    
      string name;
      string breed;
    
      Dog(string name, string breed)
      {
        this.name = name;
        this.breed = breed;
      }
    
    }


    И теперь чтобы в программе "создать собаку" с каким-то именем и породой достаточно написать:

    Dog d = new Dog("Бобик", "Бульдог")

    Это очень упрощенные примеры, но думаю вполне подойдут для того, чтобы вы поняли каким образом объекты реального мира моделируются благодаря ООП.

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

    @berad
    Имхо, если хочется на профессиональном уровне, то сперва очень много теории и разбор теоретических задач на практике. А дальше теории все меньше, а практики все больше . Если в цифрах, то сперва 80/20, а потом 20/80 -- в обоих случаях слева теория, справа практика.

    Если хочется практический пример, то берем классику — некогда трехтомник, а на данный момент четырехтомник Кнута. Там изложены основы по структурам данных, алгоритмам поиска и сортировки, дана теоретическая база оценки сложности алгоритмов (наше любимое O(n)). Берешь и прям с первой книги читаешь, а все программы на псевдокоде, коих там куча, пишешь ручками и смотришь в дебаге, как они работают.

    Когда работа будет проделана, берешь, к примеру, C# и видишь там прям из коробки List, HashTable, Sort и прочая и прочая, и уже понимаешь, как оно работает, почему и чего от всего этого ждать. Тут начинается практика — зная природу инструмента уже можешь его правильно применять.

    ЗЫ: C# указан для примера. На самом деле основные сложные типы данных, алгоритмы поиска и сортировки уже написаны и есть в свободном доступе, пожалуй, для всех популярных языков. Трудно найти что-нибудь экзотическое, типа "пирамидальная сортировка на прологе", но и то, если пошариться, наверняка найдется =)
    Ответ написан
    Комментировать
  • Как вернуть ссылку на объект?

    0xD34F
    @0xD34F
    Делайте return *this в конце нужных методов. Например:

    class XXX {
      double val;
    
    public:
      XXX(double v) {
        val = v;
      }
    
      XXX& add(double v) {
        val += v;
        return *this;
      }
    
      XXX& sub(double v) {
        val -= v;
        return *this;
      }
    
      friend std::ostream& operator <<(std::ostream &os, const XXX &x) {
        return os << x.val;
      }
    };
    
    ...
    
    std::cout << XXX(5).sub(1).add(2).sub(3).add(4) << endl; // 7
    Ответ написан
    1 комментарий
  • Какое соотношение практики к теории должно быть при изучении программирования?

    @procode
    Разработчик
    50/50 ))

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

    @qnak
    Студент, начинающий программист
    Из моего опыта: должна быть теоретическая база, а потом на её основе выполняем практические задачи, если знаний не хватает - переходим к теории (по сути сводится к гуглению на stack overflow и изучению использующихся функций).
    Ответ написан
    Комментировать
  • Собираюсь учить С++, но какими знаниями надо обладать?

    @d0lph1n
    Почему-то в последнее время люди одержимы языками программирования, возносят их в абсолют, делают из них манну небесную, эдакую сакральную мудрость, особенно если речь заходит о C или C++. Для того, чтобы научиться программировать, не нужно знать ничего. Поэтому дерзайте - если Вы смогли осилить физику, осилить такую ерунду, как язык программирования, Вам труда не составит. :)

    UPD. Я, кстати, рекомендую Вам прочесть следующие книги и в следующей последовательности:
    1. "Доусон Майкл - C++ через программирование игр". Там, конечно же, не рассказывается, как в одно лицо создать "Кваку", но зато полно красивых и содержательных абстракций, которые не только упростят понимание, но и помогут по-настоящему полюбить язык.
    2. А после Доусона возьмите "Солтер - C++ для профессионалов". Именно после Доусона. Очень хорошая книга в хорошем переводе.

    После этих двух прочтите (погуглите) о современных стандартах: C++11, C++14, C++17. И все - Вы "сипипишник".
    Ответ написан
    Комментировать
  • Какое соотношение практики к теории должно быть при изучении программирования?

    @Ksushqa
    Unity developer
    Просто посвятите эти восемь часов программированию. А жизнь сама подскажет, что вам нужнее в том или ином случае.
    Ответ написан
    Комментировать
  • Что делает эта функция(вычислительная геометрия, Си)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Это просто один из методов выделения памяти.
    Если мало n байт, выделим 2n. Если и этого мало, то 4n, 8n, ... 2kn.
    А 4 - это стартовое значение, оно используется если p->alloc ещё нулевое.
    Ответ написан
    5 комментариев