Неплохо было бы обобщить все дискуссии по поводу языков программирования и их использования на олимпиадах.
Я писал на многих языках программирования и в разных средах, на каких-то больше, на каких-то меньше, примерно в таком порядке:
QBasic, VBasic, VFoxPro, Pascal, среда Delphi, AS(скриптовой язык в Flash), (читал про C++ и яву) PHP+JS+css+xml+html+MySQL, C++, капельку на Java, курсовые на C#, немного на python, немного C++ с QT.
Pascal - очень простой язык для алгоритмизации и олимпиад. Для школьных олимпиад вполне подходит, потому что на них нужна производительность и скорость написания, а не наоборот.
C++ - после паскаля я советую использовать его на олимпиадах. Я люблю C++ больше всего за его "свободу", так сказать. Правда, из-за нее же и возникают всякие дискуссии о возможных ошибках, которые не отлавливаются компилятором и т.п. На нем можно написать одни и те же вещи по-разному. Это замечание годится почти к любому _си_-подобному языку. А почти все перечисленные языки _си_-подобные. Его или, хотя бы, о нем знают почти все. В стл есть много достаточно неплохих библиотек, но никто не запрещает написать все самому, как в паскале, например. Скорость программирования растет на C++, потому что многое можно записать намного короче, это, конечно, зависит от выбранного стиля, но такая возможность лежит прямо на поверхности.
Java - прочитав дискуссии о яве, которые уже есть на CodeForces, мне даже и не хочется писать на ней на соревнованиях, что бы там ни произошло, какая бы задача ни попалась. Пролистав пару книг по яве в свое время, я для себя понял, что ява классный язык, но он пригодится только для разработки и сопровождения больших проектов. Могу привести пару цитат о яве, они не противоречат моему мнению.
VB - на нем я писал очень давно и продолжать не горю желанием, потому что не помню синтаксис и не вижу преимуществ.
Python, PHP, ... - куча скриптовых и других языков с си-подобным синтаксисом. Не вижу смысла применять их на олимпиаде. Все они полезны/созданы для использования в разных ситуациях, т.е. более применимы в разных частях проектов для решения тех или иных задач.
Я писал на многих языках программирования и в разных средах, на каких-то больше, на каких-то меньше, примерно в таком порядке:
QBasic, VBasic, VFoxPro, Pascal, среда Delphi, AS(скриптовой язык в Flash), (читал про C++ и яву) PHP+JS+css+xml+html+MySQL, C++, капельку на Java, курсовые на C#, немного на python, немного C++ с QT.
Pascal - очень простой язык для алгоритмизации и олимпиад. Для школьных олимпиад вполне подходит, потому что на них нужна производительность и скорость написания, а не наоборот.
C++ - после паскаля я советую использовать его на олимпиадах. Я люблю C++ больше всего за его "свободу", так сказать. Правда, из-за нее же и возникают всякие дискуссии о возможных ошибках, которые не отлавливаются компилятором и т.п. На нем можно написать одни и те же вещи по-разному. Это замечание годится почти к любому _си_-подобному языку. А почти все перечисленные языки _си_-подобные. Его или, хотя бы, о нем знают почти все. В стл есть много достаточно неплохих библиотек, но никто не запрещает написать все самому, как в паскале, например. Скорость программирования растет на C++, потому что многое можно записать намного короче, это, конечно, зависит от выбранного стиля, но такая возможность лежит прямо на поверхности.
Java - прочитав дискуссии о яве, которые уже есть на CodeForces, мне даже и не хочется писать на ней на соревнованиях, что бы там ни произошло, какая бы задача ни попалась. Пролистав пару книг по яве в свое время, я для себя понял, что ява классный язык, но он пригодится только для разработки и сопровождения больших проектов. Могу привести пару цитат о яве, они не противоречат моему мнению.
“Fine, Java MIGHT be a good example of what a programming language should be like. But Java applications are good examples of what applications SHOULDN’T be like.”
(pixadel)
“Java is, in many ways, C++–.”
(Michael Feldman)
C# - на нем я писал только курсовые и практические для студентов, рекомендовать для олимпиад не буду.Больше цитат можно найти здесь: 101 Great Computer Programming Quotes.
VB - на нем я писал очень давно и продолжать не горю желанием, потому что не помню синтаксис и не вижу преимуществ.
Python, PHP, ... - куча скриптовых и других языков с си-подобным синтаксисом. Не вижу смысла применять их на олимпиаде. Все они полезны/созданы для использования в разных ситуациях, т.е. более применимы в разных частях проектов для решения тех или иных задач.
Sometimes, it's just a personal preference. Sometimes, it doesn't matter as the programming language is just a tools to express what we've done.
Почему пост, где восхваляется С++ и упоминается как "не ужасный" язык Pascal может называться "обобщением дискусии"?
На паскале пишут исключительно те, кто в силу нехватки времени или лени до сих пор не обкатал C++ как следует. Отсутствие SET на олимпиадах сегодня является критичным для огромного количества задач. И не надо только опять начинать "да я напишу хеш быстрее чем ты сет объявишь" :о)
С++ хорош для задач типа 250 на топкодере, когда надо за 2 минуты все вбить. Доводим паттерн до фанатизма типа моего (#define fi(n) for(int i = 0; i < (n); ++i) и пр.), и на очень простой задаче имеем 2х преимущество по времени перед тем кто пишет на Java.
А теперь открываем сложную задачу, в которой надо 300 строк кода, и начинаем уплетать от тех, кто фигачит на Java, потому что они все нужные структуры данных пишут легко и непренужденно там где им надо. Надо завести новый массив чтобы хранить какие-то интексы на 1КК элементов? Я заведу его в той строке, в которой я хочу. А, я пишу на С++? Тогда я буду мотать все наверх, объявлять там, потом мотать вниз искать где же это я был. Или использовать вектор, но это до тех пор, пока не понадобится двумерный массив. Может ярые фанаты С++ мне и приведут 100 примеров того, как это можно сделать на С++, это не отменит того факта, что на Java это лаконично, а на С++ стремно :о) На контестах я всегда писал на C++ потому что опыта четыре года, а с явой от силы год, но это не отменяет того факта, что вообще в целом решать задачи на Java значиииительно приятнее чем на С++.
Это не упоминая всем известной истины, что когда задача на длинное деление или определение простоты числа или на сложную геометрию, те, кто пишут на С++ либо предательски меняют язык либо теряют кучу времени по сравнению с теми, кто пишет на Java. А еще штрафят.
Мое простое, и очень субъективное мнение: готовишься к ACM, и основной язык С++? Java должны быть вторым языком. Пишешь на Java? Не вижу причин обязательно знать C++.
Для других соревнований я уже писал в соседней теме. Если C# поддерживается, и .NET хотя бы версии 3.5, остальные языки вообще не конкуренты по удобству фигачения.
В Java есть java awt geom
http://java.sun.com/javase/6/docs/api/java/awt/geom/package-summary.html
Я, например, не знаю на память как пересечь две дуги, в любом случае даже если бы я знал, кодячить все это мне бы очень не хотелось, и шанс наштрафить на геометрии всегда очень высок из-за eps, поставленного не там, из-за тупо перепутанного x и y при копипасте.
Короче это как сравнивать наличие set и фигаченье его лапками :о)
Пример задачи - D с NEERC 2007. Отличная задача, в которой 10 строк дийкстры, 50 строк построения графа и 200 строк геометрии, на Java превращается видимо в 60 строк из 260 :о) Хотя я никогда не сдавал ее с java.awt.geom, может там какие-то issues.
Саша, врёшь. В Java нет многомерных массивов.
int arr[N][N]; это ни разу не аналог int[][] arr;
Вот у команде СибГУТИ не раз было так, что на Java решение не проходило, а на С проходило. На интернет-туре всесиба они за полчаса до конца сказали, что нам надоело переписывать с джавы на си, и ушли, оставив одну задачу недобитой. Длинную арифметику уже нигде не дают.
>С++ хорош для задач типа 250 на топкодере
Это если набирать одним пальцем, то экономия велика.
Задачи 250 как правило, читаются дольше, чем набивается решение.
На Java можно написать даже "ёлочку" из двухмерного массива.
int a[][] = new int[5][];
int a[0] = new int[1];
int a[1] = new int[2];
int a[2] = new int[3];
int a[3] = new int[4];
int a[4] = new int[5];
То есть если X обозначить ячейку массива a[][] , то получится:
X
XX
XXX
XXXX
XXXXX
#include <vector>
using namespace std;
#define loop(i,a,b) for(int i=a;i<b;++i)
int main ()
{
vector < vector < char > > a;
a.resize(5);
loop(i,0,5)
a[i].assign( i+1, 'X' );
loop(i,0,5)
{
loop( j, 0, a[i].size() )
putchar( a[i][j] );
putchar( '\n' );
}
}
char потому что это выводит как раз ту самую ёлочку при исполнении =)
а вот список рёбер сильно разреженного графа с достаточно больши количеством вершин в виде массива векторов будет занимать много меньше памяти, чем матрица смежности этого же графа.
Это не двухмерный массив, а массив [ссылок/указателей] на массивы. Т.е. при доступе к одному элементу уровней косвенности не 1, а 2. Разница в быстродействии часто может быть очень существенной и приводить к TL. Потребление памяти также выше: невинно выглядящий new int[N][2] требует, как минимум, втрое больше памяти, чем new int[2*N]; Если ваше решение имеет пятикратный запас по скорости и памяти, то нет проблем, а вот если запас менее чем двухкратный -- то начинаются тонкости :))
В Си двухмерных массивов формально тоже нет, но там у int arr[N][N]; указанных недостатков нет. В Сишарпе синтаксис объявления двухмерного массива следующий int[ , ] arr;
А вот что это:
int[][] a;
a[5]=a[4]=a[3]=a[2]=a[1]=a[0]=new int[5];
"Это не двухмерный массив, ... то начинаются тонкости :))"
С этим абсолютно согласен. =)
Только вот создание медленнее
Простите, если не прав =)
2. Ну во-первых видимо все-таки объявлять [,] удобнее нежели [][] (в шарпе нельзя просто написать new int[n][m] например). Да и как я сказал лишь доступ к элементу быстрее, создание все-таки медленнее.
Может я опять туплю) тогда мне стыдно
Про многомерные массивы - my bad :о) Но, на правах рекламы - зато в C# есть как массив ссылок на массивы, так и многомерные массивы :о)
Ну-ну, расскажите это например Гене Короткевичу)
Моя цель - из километровых споров и дискуссий вынести наружу хоть какой-то смысл. Разобраться для себя и написать что-то конкретное за и против каждого языка, можно с примерами и пояснениями.
Сейчас тоже иногда попадаются, но, видимо, на неприличных) Хотя нет, на нирке, по-моему, недавно была одна.
Длинную арифметику было бы недурно добавить в стл. А качество библиотек, по-моему, в С++ лучше ПОЧТИ всегда.
Я поэтому и не называю паскаль ужасным языком, а очень хорошим для алгоритмизации, потому что дальше уже идет больше битва библиотек(стл потив ява, против шарпа... это не битва языков).
В C++ я тестил либы и такие же реализованные алгоритмы - работают быстро, а иногда нереально быстро на числах, но если надо оперировать объектами, то вперед выходит самописный вариант. Например sort.
Про либы явы знаю немного, никто из тех, кто на ней пишет, сюда заглядывать не хочет/не хотел, поэтому ничего объективно гарантировать не могу, подтверждения моим словам пока нет.
Может, напишу что-нибудь, замерю время, может кто-то мог бы привести сравнительную табличку чего-нибудь. Что да как работает, интересующие вопросы: быстродействие при разных нагрузках. Например сортировка 300 000 массива, можно два раза) стандартная и самописанная, можно только стандартную. И что-то дискуссии по поводу ввода-вывода есть, про то, что и там косяки.
Я сейчас просматриваю содержание сети. Есть некоторые ответы, но их надо проверить еще разок самому.
Вот, например:
http://www.codenet.ru/webmast/java/javavscpp.php - в каждой шутке есть доля правды... комментарии?
http://habrahabr.ru/blogs/programming/66562/ - еще тесты, не оч радуют, но и не оч трагично
http://mocksoul.livejournal.com/5789.html - тесты
а это немного противоречит предыдущему линку - http://dchekmarev.ru/blog/article/1249718025
А теперь хотелось бы спросить людей, которые сами пишут на яве: "Что вы можете сказать по этому поводу?"
2) Code templates и #define - совершенно разные вещи, как препроцессор и текстовый редактор.
3) Вот, уже интереснее. Camel-Case. Уже интереснее.
4) Дэбаг - зло. В любом языке. Конечно, приятно, когда на ошибку тыкают пальцем.
5) C# не ява. Это еще одна песня) На нем даже пишут и неплохо... Еще не копался, но перспективы через год, надеюсь не дольше, хорошие.
Процесс дебагинга - зло.
А дебаг - часто жизненно необходимая вещь для поиска (нетривиальных) ошибок.
суровый у тебя друг.
Без дебага трудновато научиться писать программы без дебага :) Для всего нужен опыт.
Java was *NOT* inherited from C++. It was only marketed as remake of C++ because there were many C++ coders around. C is the divergence point between Java and C++.
and, from here: http://norvig.com/java-lisp.html
The variance for Java was lower than for C or C++. (Cynics could say that Java forces you to write uniformly slow programs.)
So blame the language, not coders. We know many clever people use Java. It would be a lot of good Java apps if it was possible to write them.
About C# : At times, I look at some stats at Topcoder and it looks like picking C# in Topcoder algorithm seems to be superior over C++ and Java. (which, on other hand, might be not statistically significant because sample size is too small and biased because *you-know-who* uses C#).
Maybe Topcoder doesn't gives away stats per languages to avoid holy wars :D
VB.NET is just C# with syntax inherited from VB to ease porting of VB apps. So there is no reason to even think about VB.NET.
allowing to read from uninitialized variables? why would a language allow that?
Sometimes compiler is unable to determine if reading from uninit var will occur.
int foo(int arg) {
int[] x;
if(arg<0) return -1;
if(arg==0) x = new int[1];
if(arg>0) x = new int[2];
x[0]++; // Bogus error here
C was intended for people who are smarter than their compilers. Vice-versa for Java.
if-elseif-else is nothing but just a hint for compiler.
In mathematical notation - intended for humans - it is rarely used.