e-olymp 1077. Java против C++

Ссылка на выполнение кода

Условие задачи

Сторонники языков Java и C++ часто спорят о том, какой язык лучше для решения олимпиадных задач. Одни говорят, что в Java есть масса полезных библиотек для работы со строками, хорошо реализованы механизмы чтения и вывода данных, а так же радует встроенные возможности для реализации длинной арифметики. С другой стороны, С++ является классическим языком, скорость выполнения программ благодаря существующим компиляторам (например, Intel Compiler 10.0) гораздо выше, чем у Java.

Но сейчас нас интересует лишь небольшие отличия, а именно соглашения, которыми пользуются программисты при описании имен переменных в Java и C++. Известно, что для понимания значений переменных часто используют английские слова или даже целые предложения, описывающие суть переменных, содержащих те или иные значения. Приведем ниже правила описания переменных, которыми руководствуются программисты, реализующие программы на Java и C++.

В языке Java принято первое слово, входящее в название переменной записывать с маленькой латинской буквы, следующее слово идет с большой буквы (только первая буква слова большая), слова не имеют разделителей и состоят только из латинских букв. Например, правильные записи переменных в Java могут выглядеть следующим образом: javaIdentifier, longAndMnemonicIdentifier, name, nEERC.

В языке C++ для описания переменных используются только маленькие латинские символы и символ «_», который отделяет непустые слова друг от друга. Примеры: java_identifier, long_and_mnemonic_identifier, name, n_e_e_r_c.

Вам требуется написать программу, которая преобразует переменную, записанную на одном языке в формат другого языка.

Входные данные

Во входном потоке задано наименование переменной длиной не более 100 символов.

Выходные данные

В выходной поток требуется вывести аналог имени переменной в другом языке. Т.е. если переменная представлена в формате Java, то следует перевести в формат C++ и наоборот. В том случае, когда имя переменной не соответствует ни одному из вышеописанных языков, следует вывести «Error!».

Задача взята с сайта e-olymp.

Тесты:

Ввод Вывод
java_word javaWord
cppWorD cpp_wor_d
simpleword simpleword
two__underscores Error
underscore_in_the_end_ Error
UppercaseInTheBeginning Error
mixed_Style Error

Код:

Ход решения:

Со входного потока считывается название переменной, которая помещается в переменную $varName$. Затем вызывается вспомогательная функция $parseLanguage$, которая возвращает одно из значений enum: относится ли переменная к языку С++, Java, универсальная ли она или же, если ничего из вышеперечисленного не подошло, возвращает ошибку. Далее, проанализировав значение, которое нам вернула функция, решается, что делать с переменной: либо конвертировать её в переменную C++, либо в переменную Java, либо оставить её, как есть (универсальная переменная). В ином случае это ошибка, что тоже выводится. Функции $toCPP$ и $toJava$ также являются вспомогательными, которые «переводят» переменную из одного языка в другой.

4.3. Методы

Ссылка на оригинальную статью.

Метод — это функция или процедура, принадлежащая какому-то классу или объекту, которая определяет поведение программы, содержащимися в  ней выражениями. Методы можно встретить в любом примере программы, даже в простом Hello World!  используется метод main.

Вот некоторые характеристики методов:

  1. Имя метода (в примере: main)
  2. Список аргументов (в примере: () )
  3. Возвращаемый тип(в примере: void )
  4. Может иметь модификации для доступа(в примере:  static и public)
  5. Может иметь выражение внутри (в примере:  {trace(«Hello World»).

Рассмотрим данный пример.

 

В данном примере есть метод toString() и конструктор, кроме main.  

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

Тип возвращаемого значения записывается после его объявления через двойные скобки. В нашем случае метод возвращает значение типа String.

У нас все методы классов Franction публичные, что значит, мы можем обращаться к ним из класса Test.

Методы и поля могут переопределены для наследников базового класса. Использование переопределения в классе подразумевает, что у него есть родительский класс. Добавим в наш пример еще один класс  — наследник  Decimal и переопределим метод базового класса toString().

Переменная d явно определена как  Fraction  и во время компиляции «узнается» как  переменная этого класса, но во время выполнения все равно находится правильный метод toString()  в классе Decimal .

Наследник может обратиться к методам родителя, которые он переопределяет с помощью вызова super.methodName(). Это используется, например, в конструкторе наследника.

Ссылка на пример на TryHaxe!