Блог пользователя dkirienko

Автор dkirienko, 14 лет назад, По-русски
На форуме одного весьма далекого от спортивного программирования сайта увидел замечание: "Известно, что 90% участников всероссийской олимпиады по информатике пишут на Pascal, а среди её победителей их доля равна 95%".

Чтобы аргументировано опровергнуть, посчитал статистику использования языков программирования на РОИ-2011. Думаю, что результат может кого-то заинтересовать.

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

Всего участников было 225. 218 участников использовали только один язык программирования. 7 участников использовало Паскаль и C++ одновременно (их я посчитал по тому языку, который они использовали для решения большего числа задач).

Вот результат:

C++: 120 (53%)
Паскаль: 104 (46%)
Visual Basic: 1 (меньше 0.5%)

Теперь данные только по победителям олимпиады (16 человек):
C++: 13 (81%)
Паскаль: 3 (19%)

Теперь данные только по призерам олимпиады, которые не стали победителями (85 человек):
C++: 52 (61%)
Паскаль: 33 (39%)

Напомню, что в будущем году обещают большие изменения относительно языков программирования на РОИ.

  • Проголосовать: нравится
  • +36
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

Я же правильно понимаю, pascal/delphi хотят запретить?


Имхо, начинать изучать программирование с C++ или Java - весьма сурово.

Лично я изучал языки в таком порядке: basic, pascal, c++, java. И самым тяжелым для меня был "скачок" на c++: имхо минимальная планка знаний, необходимая для написания даже простых задач, существенно выше. Примеры - ввод-вывод; string/char[]; массивы/контейнеры. Соответственно, значительно вырастает и планка требований к учителям.

И вообще, зачем запрещать Паскаль? Есть же вполне современная Delphi, и язык развивается вместе с ней.

  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Нет, неправильно понимаете.

    Речь идет не о запрещении чего-либо, а, наоборот, о разрешении, например, Java, Python и C#.

    Вы знаете, сколько стоит современная Delphi, которая к тому же не кроссплатформенная?
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Так разрешать - не запрещать, в чём тогда проблема? :)


      Delphi - разве у неё нет бесплатной версии или бесплатного клона? Мне кажется, у нас в школе именно бесплатная, хотя я не 100% уверен.

      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        А кто говорит про проблему? Я разве употреблял слово "проблема"?

        Бесплатной версии Delphi для школ не было никогда. Бесплатные версии Delphi для частных лиц раньше были, теперь их тоже нет.

        Бесплатный клон - Lazarus. Нравится не всем.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Если школы когда-нибудь перейдут на Linux, то основная масса "паскалистов" будет писать именно на Lazarus.
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    У меня порядок языков был такой: PHP, Java, Pascal, C++. С учетом того что у РНР сишный синтаксис плюс нет строгой типизации, я считаю этот порядок (всмысле начинать с РНР и только потом на С++) вполне приемлемым.  А начинать с синенького экрана Турбо Паскаля - вот это по-моему для современных школьников, которые даже не видели консоли, сурово.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Мне кажется, что наоборот лучше переходить от более строгой типизации к менее строгой, чтоб компилятор указывал на ошибки. Но это как кому нравится, конечно.
      • 14 лет назад, # ^ |
          Проголосовать: нравится +5 Проголосовать: не нравится
        http://xkcd.com/353/

        Если честно, сей комикс очень хорошо передает ощущения от Питона. "Everything is so simple! Programming is fun again! It's a whole new world up here!". 

        Я чувствую, что мне куда проще стало писать программы, выражать свои алгоритмы и мысли. Действительно, есть ощущение что записывать алгоритмы стало куда проще! Удовольствия от программирования получаешь куда больше, если удается записать алгоритм в три раза короче, чем раньше. И динамическая типизация только способствует этот простоте, в то время как статическая типизация сковывает.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Python и php - все таки разные вещи. Насколько я знаю, в питоне есть какой-то скрипт, выдающий warningи на все подряд, которые могут заменить статическую типизацию.

          Что-то не могу придумать ни одной задачи уровня "для новичков", в которой статическая типизация сковывает.
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Ну не то, чтобы прям уж "сковывает", но просто неудобна. Понадобилась новая переменная - нужно ее объявлять. Хорошо в C++  объявление можно сделать на месте - а в Паскале тяжело, нужно вверх подниматься... На питоне хорошо - объявлять ничего не надо, бери да пользуйся.

            Хочется писать алгоритм не отвлекаясь на такие вещи.

            У меня один раз школьники активно пользовались именно динамической типизацией, писали задачу по мотивам ЕГЭ С4. Там нужно было вывести имя победителя олимпиады, а если их несколько - то их количество. Вот они в одной переменной и хранили имя победителя олимпиады, если он один и их количество, если их несколько. Я даже не принимал такие решения, говорил, что "у каждой переменной должно быть осмысленное назначение, и оно меняться не должно". Типа вот такая неформальная статическая типизация.
            • 14 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Отличный пример вреда динамической типизации, я бы не привел лучше. Хотя польза от нее, конечно, тоже есть, если есть кто-то, кто следит за стилем ученика.
              • 14 лет назад, # ^ |
                  Проголосовать: нравится +8 Проголосовать: не нравится
                У меня есть следующий набор тезисов:

                1. Когда я учу школьников программированию, то хорошо бы, чтобы программирование было бы простым и легким.

                2. Программировать на питоне легче, чем на C++ (и на паскале). И не только из-за динамической типизации. И это хорошо.

                3. Сама по себе динамическая типизация чем вредна? Да и в целом я не вижу особых проблем с динамической типизацией при обучении. Зато вижу огромное количество плюсов - например, как в C++  или Паскале передать массив функции в качестве параметра? Или как вернуть функцией два значения?

                4. Стиль программирования не зависит от языка. Посмотрев за последнюю неделю чужие решения на Codforces я просто в шоке от того, насколько ужасно выглядит код большинства людей. Конечно, на вкус и цвет товарищей нет, но в летней школе очень редко встречаются школьники, которые обучены писать красивый, правильный код, какой бы язык программирования они не использовали.
                • 14 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  3. В паскале можно передавать массив, как параметр.
                  procedure make(var a:array of integer);

                  И вернуть два значения можно, но мутно:

                  procedure make(param:integer; var resultA:string; var resultB:integer);
                  • 14 лет назад, # ^ |
                      Проголосовать: нравится 0 Проголосовать: не нравится
                    Ага, а размер массива в функцию нужно тоже отдельным параметром передавать? А если двумерный массив?
                    • 14 лет назад, # ^ |
                      Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится

                      1. Длину массива можно отдельным параметром не передавать.

                      arrayLength:=length(a);

                      2. procedure make(var a:array of array of longint);

                      опять же проблем нет.
                      • 14 лет назад, # ^ |
                          Проголосовать: нравится 0 Проголосовать: не нравится
                        Кстати, почему-то я редко вижу, чтобы школьники пользовались такими массивами в Паскале. Почему-то как правило пользуются массивами фиксированного размера. В чем причина? Прирожденная нелюбовь паскаль-программистов нумеровать элементы массива с нуля?
                        • 14 лет назад, # ^ |
                            Проголосовать: нравится 0 Проголосовать: не нравится
                          Просто учат так. 

                          В Delphi через

                          array of longint

                          проходит и массив фиксированного размера
                • 14 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  Про передачу массива - не понимаю, что здесь сверхъестественного. Про два значения :
                  return(make_pair(??,??));
                  • 14 лет назад, # ^ |
                      Проголосовать: нравится 0 Проголосовать: не нравится
                    Чуть более интересно, как передавать неопределенное значение из функции. Например, есть функция поиска подстроки в строке. Если она ничего не нашла, кажется глупым выводить -1 или длину строки, питонский None кажется здесь более уместным. А если функция возвращает строку, то совсем непонятно, что делать, если надо передать неудачу.
                    • 14 лет назад, # ^ |
                        Проголосовать: нравится 0 Проголосовать: не нравится
                      В принципе, если важно удобство, то можно возвращать pair <string, bool > где флажок будет обозначать, удалось найти или нет
                      • 14 лет назад, # ^ |
                          Проголосовать: нравится +1 Проголосовать: не нравится
                        ---------------------------------
                        Где же тут удобство? Вместо return 0, надо писать return make_pair("",0)
                    • 14 лет назад, # ^ |
                        Проголосовать: нравится 0 Проголосовать: не нравится

                      ============================

                      Если тип левый, я резервирую какое-нибудь значение переменной под неопределенность. Например, когда я пересечение прямых пишу и возвращаю point (пару x, y), то (inf, inf) значит, что прямые параллельны, (inf, -inf) - совпадают. Согласен, не идеал, но если на это сделать дефайны, то проверяется без труда.

                  • 14 лет назад, # ^ |
                    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

                    Про передачу массива - как ты предлагаешь передавать массив? Как указатель и его размер - двумя различными переменными? А двумерный массив как передавать? Как f(int ** A, int n, int m)? Это все можно сделать, но это удобно? 

                    Теперь про два значения. Вот я хочу, чтобы функция вернула два значения. На Питоне я пишу:
                    a, b = f(x)
                    Как это сделать на C++ через make_pair? Будет ли это столь же просто и удобно?



14 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
Удалено.
14 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
Что-то не очень понятна статистика.
Получается, что 107 (225 - 118) участников использовали более одного языка программирования, при этом всего 7 человек использовали одновременно С++ и паскаль.
На каких же двух языках писали остальные 100 человек?
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Извиняюсь, не 118, а 218 использовало один язык программирования и 7 человек - два.

    Спасибо, исправил.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Думаю это опечатка.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    Может они использовали 0 языков? Тоже конечно мало правдоподобно..
    • 14 лет назад, # ^ |
        Проголосовать: нравится -11 Проголосовать: не нравится
      Почему? Не решили ни одной задачи...
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        могли и не решить, задачи на прошлых всеросах, даже 1-е не такие уж простые, тем более для участников, попавших на всерос по квоте региона
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Кстати, если сильно не придираться. то под "пишут" можно понимать знают, умеют писать. Тогда я верю, что 90-95% похоже на правду.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Хотел бы я посмотреть на скрипт, который собирает такую статистику по архиву посылок :).
    • 14 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится
      import os

      EXT = {'cpp':'cpp', 'dpr': 'pas', 'pas':'pas', 'PAS':'pas', '.vb':'bas', '.cc':'cpp', 'txt':'pas'}
      id = {}
      lang = {}
      users = set()
      ulang = {}

      for dir in sorted(os.listdir('.')):
          if dir[-3:] != ".py":
              user, prob, attempt, submit = dir.split('.')
              users.add(int(user))
              if not user + "." + prob in id or id[user + "." + prob] < int(submit):
                  id[user + "." + prob] = int(submit)
                  file = os.listdir(dir)[0]
                  lang[user + "." + prob] = EXT[file[-3:]]
      for user in users:
          userlang = set()
          for problem in '1', '2', '3', '4', '5', '6', '7', '8':
              if str(user) + '.' + problem in lang:
                  userlang.add(lang[str(user) + '.' + problem])
          if len(userlang) > 1:
              userlang = {}
              userlang['cpp'] = 0
              userlang['pas'] = 0
              for problem in '1', '2', '3', '4', '5', '6', '7', '8':
                  if str(user) + '.' + problem in lang:
                      userlang[lang[str(user) + '.' + problem]] += 1
              if userlang['cpp'] > userlang['pas']:
                  ulang[user] = 'cpp'
              else:
                  ulang[user] = 'pas'
          else:
              ulang[user] = min(userlang)
      countlang = {'pas': 0, 'cpp': 0,  'bas': 0}
      for user in users:
          countlang[ulang[user]] += 1
      print(countlang)

      winners = 627, 562, 347, 366, 422, 622, 629, 224, 269, 407, 352,
      442, 265, 572, 229, 675
      prizers = 362, 667, 251, 466, 441, 673, 427, 261, 301, 309, 373,
      263, 532, 504, 472, 524, 346, 431, 643, 543, 450, 401, 232, 461,
      307, 306, 367, 101, 567, 246, 341, 545, 103, 601, 304, 566, 302,
      243, 564, 365, 227, 106, 633, 446, 371, 344, 409, 449, 247, 271,
      270, 226, 264, 348, 433, 203, 525, 661, 363, 102, 310, 350, 250,
      467, 447, 322, 210, 222, 630, 650, 225, 648, 342, 623, 603, 469,
      445, 329, 403, 465, 228, 626, 642, 571, 464

      countlang = {'pas': 0, 'cpp': 0,  'bas': 0}
      for user in winners:
          countlang[ulang[user]] += 1
      print(countlang)

      countlang = {'pas': 0, 'cpp': 0,  'bas': 0}
      for user in prizers:
          countlang[ulang[user]] += 1
      print(countlang)

      Ну примерно вот так. Скрипт нужно запускать на архиве, скачанном c neerc, предварительно его обработав (попереименовав каталоги, удалив каталоги sources переместив файл из него в родительский каталог, изучив все возможные расширения, которые бывают у файлов - именно по ним определяется язык, удалив всякий мусор).

      В результате получается каталог примерно такого вида:

      105.7.8.03288/main.cpp
      105.7.9.03313/main.cpp
      106.1.1.00030/A.dpr
      106.1.2.00045/A.dpr
      106.2.1.00537/B.dpr

      и т.д.

      Вот на нем и запускается скрипт.

      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Я выразился слишком неоднозначно. Имелся в виду скрипт, который собирает статистику владения конкретным языком. (даже если на олимпиаде его вообще не было)
14 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

*даблпост*
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Интересна еще статистика - кто под какими компиляторами пишет.
Поскольку до сих пор еще с трудом поддерживаются такие архаичные вещи, как BP, BC, BC++.
По этому архиву это, вроде как, не понять, но когда считали - получалось, что последние несколько лет упорно около 5 человек посылают под такие старые компиляторы.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Эту статистику я не могу собрать по опубликованному архиву. Это только к тем, у кого есть полные логи тестирующей системы.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Ну вот мы как раз считали и получалась такая же ситуация, как с basic - около 1-2%.
      А то так хочется уже отменить эти компиляторы - с ними всегда что-то не так работает, еще и не все задачи можно на них сдать:)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А где можно глянуть на график использования языков по годам, чтоб глянуть тенденцию
14 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Массивы фиксированного размера и какое-то фиксированное ограничение на размер массива - это, как правило, убожество олимпиадного подхода в программировании. В жизни такого не бывает, ну если речь не идет, например, о массиве из трех элементов, как координаты точки в R3, или массиве из четырех элементов, как цвет пикселя в RGBA-модели, например.

В этом смысле, конечно, годится вектор из STL (и я как правило предпочитаю пользоваться именно векторами, а не C-массивами), но это лишь демонстрирует тот факт, что C++ - это неестественная попытка осовременить и  внести ООП в язык Си, который для этого совершенно непредназначен. Зачем, ведь есть куда более современные и удобные языки?

Про pair не очень понял. Предлагается писать так что ли?
pair <int, int> p = f(x);
a = p.first;
b = p.second;

Ужас. А если мне понадобится тройка чисел, а не пара?
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    С++0x кортеж?
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Я не очень в курсе того, что собой представляет C++0x. И есть ли сейчас хотя бы примерные его реализации? И что можно почитать по поводу C++0x, кроме проекта стандарта? И кто его поддерживает?

      Наконец, если это еще одна попытка реанимировать язык Си, по максимуму сохраняя совместимость с ним, то это опять ужас что получится. Лучше оставить Си в покое и делать новые языки, на основе современных концепций, а не принципов сорокалетней давности.

      Сам по себе Си, конечно, будет жить еще долго, у него - своя ниша. Но зачем пытаться его осовременить, не проще ли заново переписать?
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Чем вам так C++ не угодил? Почему язык нельзя расширять? А про C++0x можете поставить любой современный компилятор и он поддерживает уже очень многое (g++ 4.6, VC++ 2010). Загляните в конце концов в более-менее свежий C++ проект, вы там не обнаружите принципов сорокалетней давности, там давно уже нет malloc, указателей, char * строк и т.п.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Леша, я не против С++ (на котором регулярно пишу - я вообще любитель трех языков: С++, python и perl), ну просто на нем писать неудобно. Все то же самое я могу сделать на питоне куда проще. И детей учить неудобно, как объяснить, что такое vector <int>? Почему если я передаю в функцию vector <int>, то лучше писать vector <int>& ?  Ну и так далее...

          У С++ своя ниша, у Питона - своя ниша. Рассказывать школьникам о том, что такое программирование на примере С++ или Паскаля просто очень неудобно.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        int main(){
            tuple<int,double,vector<vi> > x(5,3.2,vector<vi>());
            cout<<(get<0>(x));
            //solve();
            return 0;
        }

        Вот это компилится на CF
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Сколько много символов...  Так писать - удобно?
          • 14 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

            int main(){
                auto x=make_tuple(5,3.2,'x');
                cout<<(get<0>(x));
                return 0;
            }

            Так уже вполне удобно, учитывая еще автодополнение в адекватной IDE (Надеюсь, Вы не в блокноте рекомендуете писать)
            • 14 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Как объяснить школьнику, что все это означает и зачем это нужно?
              • 14 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                Не знаю, я как-то понял:)
                Из школьников, знакомых с программированием только олимпиадники, так что не отвечу на этот вопрос.
                • 14 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  Хорошо, вот наводящие вопросы.

                  Что такое auto x?
                  Что такое  get<0>(x)?

                  Это уже не говоря о том, что как устроено cout << x, и как это связано с операцией битового сдвига "<<" в языке Си я рассказываю к концу второго года обучения программированию на С++.
                  • 14 лет назад, # ^ |
                      Проголосовать: нравится +3 Проголосовать: не нравится
                    Ух-ты, а это как-то связанно с операцией битового сдвига?
                  • 14 лет назад, # ^ |
                      Проголосовать: нравится 0 Проголосовать: не нравится
                    ===============================================================
                    Ну вы же сами прекрасно понимаете, что это?

                    auto при объявлении переменной, указывает, что тип должен быть вычислен автоматически на основании значения справа

                    get<0> - взять 0й (в 0-индексации элемент кортежа.)


                    Я не пытаюсь утверждать, что С++ якобы мегакрут, но мне кажется, вы всё-таки считаете написание на нём более сложным, чем это есть на самом деле.
                    • 14 лет назад, # ^ |
                      Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

                      Я считаю программирование на С++ неудобным.

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

                      И, если честно, я не знаю. что такое auto в С++0x. То есть догадываюсь, но никогда не использовал. Получается, что это уже элементы динамической типизации - "я не хочу думать какой тип у этой переменной, пусть компилятор это сам поймет".

                      Так чем тогда плоха динамическая типизация, если программисту уже лень думать, какой будет тип у этого объекта? И зачем внедрять элементы динамической типизации в язык, который этого ни в малейшей степени не предполагает? Неужели хорошо получится?
                      • 14 лет назад, # ^ |
                          Проголосовать: нравится 0 Проголосовать: не нравится
                        -----------------------------------
                        Извините, но какая-то очень странная фраза "Получается, что это уже элементы динамической типизации - "я не хочу думать какой тип у этой переменной, пусть компилятор это сам поймет"".
                        Вы действительно считаете, что тип переменной будет определять компилятор?
                        • 14 лет назад, # ^ |
                            Проголосовать: нравится 0 Проголосовать: не нравится
                          Насколько я понял из комментария  RiaD-WaW и из статьи в википедии, то ключевое слов "auto" означает, что компилятор должен сам определить тип переменной исходя из значения, которым она инициализируется. 
                          • 14 лет назад, # ^ |
                              Проголосовать: нравится 0 Проголосовать: не нравится
                            --------------------------------------
                            А можно тогда для меня ликбез, может я тогда обсуждаю то, что не понимаю.
                            Я под "динамической типизацией" понимал, что переменные можно не описывать, и, если написать
                            a = 1
                            или
                            a = «abc»
                            то тип переменной будет определен автоматически, исходя из типа присваиваемого значения (или примененного к переменной оператора).
                            Но, тогда тип не может быть определен компилятором в случае
                            if (x < y)
                              a = 1;
                            else
                              a = «abc»;
                            Можно только динамически в процессе выполнения программы определять тип. Отсюда, более чем естественные тормоза в процессе выполнения программы.
                            Я вообще правильно понимаю о чем речь?   
                            • 14 лет назад, # ^ |
                                Проголосовать: нравится 0 Проголосовать: не нравится
                              =============================================
                              Все правильно, и под динамической типизацией как раз и подразумевается то , что интерпретатор определяет тип переменной на момент выполнения программы. В отличии от статической типизации, где программист должен тип указать явно.

                              Когда в C++0x пишется
                              auto x = 1;, то это все-таки статическая типизация (т.к. тип переменной x нельзя потом изменить), но и какие-то идеи динамической типизации тут есть (программист не обязан сам указывать тип переменной, ибо это может быть очень сложно, компилятор сам за него додумается).
                              • 14 лет назад, # ^ |
                                Rev. 5   Проголосовать: нравится 0 Проголосовать: не нравится
                                --------------------------------------
                                Ну вот, и тогда Вы очень вовремя заменили слово "компилятор" на "интерпретатор".
                                Естественно, компилятор этого не может, но может интерпретатор. Но разницу в производительности готовой программы в этих случаях, думаю, обсуждать не надо.

                                • 14 лет назад, # ^ |
                                  Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

                                  Не заметил, в какой момент мы перешли на обсуждение производительности программ. Я как бы не оспариваю тот факт, что компилируемые языки быстрее интерпретируемых. И почему производительность программ обязательна должна стоять на первом месте?
                            • 14 лет назад, # ^ |
                                Проголосовать: нравится 0 Проголосовать: не нравится
                              Вообще C++ запрещает употребление auto без инициализации, так что нет там динамической типизации.
                    • 14 лет назад, # ^ |
                        Проголосовать: нравится 0 Проголосовать: не нравится

                      ух ты

                      "Ну вы же сами прекрасно понимаете"

                      затрудние С++ делающее эго неудобным для обучения что разные вещи имеют одно и тоже синтаксичски имя и различаются контекстом 

                      насколько попню си auto говорит о хранении переменой по возможности в регистрах 

                      • 14 лет назад, # ^ |
                          Проголосовать: нравится 0 Проголосовать: не нравится
                        Ключевое слово auto в C++0x означает совершенно не то же самое, что в С.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    У Вас как-то все однозначно. А питон какой язык? Структурный, обьектно-ориентированный, функциональный? Давайте тогда выберем питону функцию и избавим его от лишних атрибутов. Вот и C++ как структурный так и объектный, все зависит от того как программировать. Между прочим, во многих исходниках linux можно встретить объектно-ориентированный подход на чистом C? И среди тысяч разработчиков linux не нашлось никого, кто сказал: "Эй, ребята. Вы вообще в курсе, что C - структурный. Давайте-ка его на помойку и перепишем ядро на python.".

    Про pair есть такой трюк: pair<int,pair<int,int> >.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Леша, я понимаю, как сделать тройку чисел из пар. Но это все - трюки. И сам язык С++ - это сплошной трюк над языком С, поэтому он и неудобен.

      И я не предлагаю выкинуть Си на помойку. Более того, мы тут как-то в поезде по дороге в ЛКШ-Зима с массой знакомых тебе людей пытались составить список языков программирования, которые должен знать выпускник вуза по IT-специальности. Ну то есть обсуждался вопрос, что человек не может считаться специалистом в IT если он не знает данных языков. И мы придумали только один такой язык - Си. Все остальное - может меняться. Например, почему C++, а не Java и не C#? Почему python, а не php? Зачем ассемблер, если системное программирование объясняется на Си? 

      В общем, я люблю и уважаю Си. У него - своя понятная ниша, на помойку его отправлять рано. Но я на чистом Си писать не хочу - мне это неудобно. Да и на C++ не очень уже удобно, я могу и получше средства найти...
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Ну в таком случае остается надеяться, что C++ полностью отделится от C и выкинет все низкоуровневые элементы и C библиотеки и начнет развиваться в сторону python.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Мне кажется, что сейчас каждый просто выступает за свой язык, говоря, что остальные неудобны. 
        Понятно, почему - если я привык к Delphi, знаю кучу трюков, основные алгоритмы и шаблоны пишу вслепую, то я и не буду говорить, что C++ нереально крут. И наоборот.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Саша, а что вы пишите на Дельфи? Тривиальные олимпиадные задачки в сто строчек кода? А map вы тоже вслепую пишите? И сколько времени у вас это занимает?

          Я даже среди олимпиадников, которые ничего в жизни, кроме Дельфи не видели, знаю людей, которым после знакомства с Питоном просто становится противно писать на Дельфи. Обратные примеры мне неизвестны.
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            А можно фамилии в студию? Пусть они сами напишут, что теперь им "противно писать на Дельфи" .
            • 14 лет назад, # ^ |
              Rev. 2   Проголосовать: нравится +11 Проголосовать: не нравится

              Не скажу что противно, но могу сказать, что писать на С++(лично мне) значительно приятнее. Хотя по-моему глупо доказывать вам, что С++ чем-то лучше Делфи, когда Гена каждый раз доказывает обратное.
              • 14 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                Ну причем здесь это. Гена сейчас 3-й на TC, где нет паскаля. Он просто может "играть с обеих рук". Привычнее и удобнее с паскаля, но нет и никаких проблем с С++. И, естественно, если он видит решение, где существенно удобнее STL, то пишет на C++.
                Речь идет о Питон vs Дельфи, и мне трудно поверить, что может быть "противно писать на Дельфи". Так же как не верю, что может быть противно писать на С++ Builder. Если сравнивать с Питоном, то ведь суть утверждения одна.
                • 14 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  Ну вы просто возьмите решение одной и той же задачи на Дельфи и на Питоне и сравните код.

                  Вот выше я привел решение задачи: есть архив сабмитов участников олимпиады. Архив состоит из каталогов вида <номер участника>.<номер задачи>.<номер подхода по этой задаче>.<номер сабмита>.

                  В каждом каталоге лежит ровно один файл. Язык программирования определяется по расширению имени файла. Список возможных расширений посмотрите в моем примере.

                  Необходимо:
                  1. Составить список всех участников олимпиады.
                  2. Для каждого участника по каждой задаче выбрать последнее сданное решение и определить язык программирования по расширению имени файла.
                  3. Если участник сдавал решения разных задач на разных языках, то определить, на каком языке программирования он сдал больше задач.
                  4. Посчитать для каждого языка программирования, сколько участников на нем сдавали решения.

                  Свое решение на питоне я написал выше. 
                  Можете написать свое решение на Дельфи?
            • 14 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Фамилии писать, естественно, не буду. Есть ли эти люди на codeforces - не знаю. Так что можете считать это утверждение моим частным наблюдением. Ни на чем не настаиваю.
            • 14 лет назад, # ^ |
                Проголосовать: нравится +8 Проголосовать: не нравится
              Мне противно писать на Delphi/C++/Java программы для сбора статистики/корректировки субтитров/парсинга файлов/короткие задачи.
              То, что делается на питоне/php в три строки (считали, распарсили/посчитали, вывели ответ), на этих языках требуется обернуть в public static void main(String[] args) throws Exception, либо писать кучу рутины руками и нигде не набажить. Впрочем, иногда этим занимаюсь для поддержания прямизны рук.

              А вот громоздкие скоростные задачи мне пока привычнее писать на C++. Просто потому что там всё более строго, чем на питоне и у меня возникает меньше вопросов в компилятору.
              • 14 лет назад, # ^ |
                  Проголосовать: нравится +3 Проголосовать: не нравится
                Да и просто против того что питон раз так в 20(и это еще маленькая оценка) медленнее, непопрешь, если нужна скорость.
              • 14 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                Ну в общем, Егор, твое мнение в точности соответствует моему. Ну я только предпочитаю perl, а не php.

                • 14 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  После реализации двухмерных массивов на Perl он мне не слишком нравится :)
                  К тому же на PHP я пишу почти постоянно, в отличие от Perl.

                  • 14 лет назад, # ^ |
                    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

                    Зачем нужны двумерные массивы, если есть словари? :)

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

                    • 14 лет назад, # ^ |
                        Проголосовать: нравится 0 Проголосовать: не нравится
                      Надо было таблицу с переменным числом строк и столбцов вывести.
              • 14 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                Насчет сбора статистика и прочей быстрой обработки файлов - согласен. Насчет коротких задач - ну вот я всего этого не пишу - у меня для этого есть плагин. Я даже этого не вижу - соответственно не захламляется мое внимание. Так что все вопрос инструментария
          • 14 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится +6 Проголосовать: не нравится

            Я еще когда диплом писал начал было на С++, но после пары экранов кода понял что дальше продолжать не хочу и не буду. Пришлось делать на питоне)))
            А уж с какой радостью я с паскаля на плюсы сбегал так вообще не передать.
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            А можно для тупых - в чем преимущества статической типизации по сравнению с тем же auto? А то я вижу пару недостатков - низкая скорость и (тут только моя догадка, ни одной IDE для питона я не видел) непонятки с автокомплитом. А в качестве бонуса только возможность присвоить одной переменной разные типы значений - что не совсем понятно зачем нужно
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            На Дельфи я пишу очень быстро свой шаблон (директивы, переменные, подключаемые библиотеки, процедуры) и основные алгоритмы, которые чаще всего использую. Возможно, на питоне кода меньше, но меня все устраивает.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Ну и собственно:
    если б вектор назывался не вектором, который как бы левый и сверху допиленный, а массив и был бы он сразу, что-то бы изменилось?
14 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

Ну это как бы не совпадение, а перегрузка операторов. И если я сначала говорю школьникам (когда мы начинаем изучать программирование), что запись cout << a, означает "вывести значение a", а потом через год когда я рассказываю про битовые операции, то я говорю, что "5 << 2" означает битовый сдвиг, то у пытливого школьника должен возникнуть вопрос - почему операция одна и та же, а означает абсолютно разные вещи. И когда речь доходит до перегрузки операторов, то вот здесь-то и нужно объяснять, как перегружать оператор <<, чтобы, например, конструкция вида cout << a << b работала, то есть какого типа должны быть операнды у оператора <<, и что он должен возвращать.

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Любопытно. Можно ли анализ этой статистики свести к фразе "Москва перешла на C++"? :) Например, статистику использования языков на РОИ с 1997 интересно было бы посмотреть без учёта Москвы, Питера и Саратова (как лидеров). Кажется мне, что Паскаль там непобедим, хотя ЛКШ и делает своё дело. Более того, когда я учился в СУНЦ УрГУ, то все писали на C++ или даже на C#, а сейчас все пишут на Паскале - молодые преподаватели ушли.
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Нет, нельзя.

    Во-первых, половина Москвы - это СУНЦ МГУ, а там на С++ переходить не собираются (хотя Е.В. куда более либерально стала относится к С++, то есть допускает его использование и тех, кто знает C++ на Паскале писать не заставляет).

    Во-вторых, Москва это все-таки не РОИ и Москвы тут не хватит.

    В-третьих, Москва переходит не на С++, а на Питон :)

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

    Наконец, в-пятых, я бы сказал, что существенную роль тут сыграла не Москва, а новое положение о всероссийской олимпиаде, в котором нет квот от регионов, а отбираются лучше со всей страны. В этом случае на РОИ попадает больше школьников, действительно мотивированных и интересующихся программированием, среди них доля знающих С++ скорее выше, чем в случае, когда отбор на РОИ был только по квотам регионов.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +10 Проголосовать: не нравится
      Ну здорово, если так. Желаю Москве успеха в переходе на Питон, ибо при всех удобствах C++, он очень страшен и тяжек в качестве языка для обучения программированию, а Питон клёвый и при этом современный.