Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Современной налоговой системы РФ

Содержание:

Введение

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

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

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

Первыми языками программирования, облегчающими общение человека с ЭВМ, стали языки программирования типа Ассемблер и затем появились языки программирования более высокого уровня.

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

Цель исследования - проанализировать возможности наиболее популярных современных языков программирования для разработки компьютерных программ.

Для достижения поставленной цели в ходе исследования были сформулированы и решены следующие задачи:

1) Проанализировать историю развития современных языков программирования;

2) Классифицировать современные языки программирования.

3) Описать достоинства и недостатки современных языков программирования.

4) Проанализировать возможности и особенности разработки компьютерных программ на популярных современных языках программирования;

5) Дать оценку результатам проведенного исследования.

Актуальность темы исследования состоит в том, что на сегодняшний день мировому сообществу разработчиков программного обеспечения доступно большое количество различных по возможностям языков программирования и дискуссии о том, какой язык программирования является «самым лучшим» ведутся на многих профессиональных форумах.

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

Курсовая работа состоит из двух разделов.

В первом разделе описываются история, классификация, достоинства и недостатки современных языков программирования.

Во втором разделе проанализированы функциональные возможности наиболее популярных современных языков программирования. .

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

Приложения содержат исходные тексты разработанных программ.

Глава 1. Общие сведения о языках программирования

1.1. История

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

Одним из первых языков программирования высокого уровня является Фортран, от англ. Formula Translation. Он был создан компанией IBM в середине 50-х годов прошлого века.[9]

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

Для решения экономических задач был разработан язык программирования Кобол. Расширение сферы применения ЭВМ привело к разработке языков программирования, специализированных для различных сфер применения:

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

В 1968 г. проводился конкурс лучшего языка программирования для обучения студентов. Победителем стал язык Алгол-68, но он не получил широкой популярности.

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

Самуэль Пайперт разработал язык «лого» для обучения школьников младших классов. Этот язык программирования имеет богатые возможности и достаточно прост.

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

Необходимость создания сложных программ, управляющих работой ЭВМ, в начале 70-х годов привела к созданию специального языка программирования СИ. Этот язык стал одним из самых универсальных языков программирования. В отличии от языка Паскаль, СИ имеет возможность непосредственно работать к некоторыми машинными командами и определенными участкам памяти ЭВМ.

Язык Си широко применяется при разработке операционных систем, трансляторов, баз данных и прочих прикладных и системных программ. Си является языком программирования общего назначения, он хорошо известен эффективностью, переносимостью, экономичностью.

В ряде случаев программы, написанные на Си, сопоставимы по скорости с программами на языках Ассемблера. При этом они более наглядны и легче сопровождаются. Си сочетает мощность и эффективность при относительно малом размере программного кода.[4]

Сегодня многие программисты, работавшие на СИ, переходят на более современный язык программирования С++, совмещающий эффективность старого СИ с современными объектно-ориентированными возможностями.

Язык программирования Пролог был разработан благодаря росту популярности функционального программирования. Этот язык программирования используется в задачах анализа и понимания на основе формальной логики и методов автоматического доказательства теорем естественных языков.

В 80-х годах прошлого века был создан язык Ада. Этот язык, в дополнение к традиционным возможностям, содержит средства программирования задач реального времени и моделирования параллельных вычислений.

Большой вклад в развитие новых языков программирования внесло появление технологий WWW (World Wide Web). Появление популярного языка программирования РНР связано исключительно с WWW, хотя позже для этого языка программирования был создан интерпретатор командной строки.

1.2. Классификация

В современных языках программирования выделяют три основные группы:[14]

  • процедурные;
  • объектно-ориентированные;
  • логические и функциональные.

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

К наиболее популярным процедурным языкам программирования, которые используются для записи алгоритмов обработки процедур и данных любого круга задач являются:[6]

1) Фортран — «преобразование формул», (англ. Fortran - Formulae Translation). Фортран один из наиболее старых языков программирования высокого уровня. Его существование, применение и популярность объясняется простотой и эффективностью его структуры;

2) Язык Бейсик, от англ. Basic, иногда расшифровывают как «Beginner’s All-purpose Symbolic Instruction Code». Бейсик является многоцелевым символическим обучающим языком для начинающих. Он используется с 1964 г. как обучающий программированию язык;

3) язык СИ (пишется как «С»), создан в 1970-х годах прошлого века. Он используется в качестве языка системного программирования для разработки операционных систем семейства UNIX. В 1980-х годах прошлого века на базе языка С был создан язык С++, в котором объединились возможности языка С и средства объектно-ориентированного программирования;

4) язык Паскаль англ. Pascal, был назван в честь французского ученого Блеза Паскаля. Он широко применяется с конца 60-х и начала70-х годов прошлого века. Сначала Паскаль использовался для обучения программированию, но в позднее приобрел популярность при разработке программных средств в промышленных проектах. Есть мнение ряда исследователей[9], что в промышленные проекты Паскаль привнесли студенты, окончившие обучение и не желавшие изучать другие языки программирования. Но как бы то ни было, а язык Паскаль до сегодняшнего дня остается популярным и его модификации используются в коммерческих промышленных средах разработки (например, RAD Studio, Embarcadero Delphi).

Объектно-ориентированные языки программирования сегодня развиваются особенно активно. Большинство таких языков являются развитыми версиями проблемных и процедурных языков, но разработка с помощью языков этой группы более проста и наглядна.

К наиболее популярным объектно-ориентированным языкам программирования относят:[11]

  1. Java;
  2. С++ на базе С;
  3. C#;
  4. Visual Basic на базе Basic;
  5. Delphi на базе Pascal;
  6. Visual Fortran на базе Fortran.

Объектно-ориентированное программирование представляет собой направление в программирования, которой определяет главными элементами программы - объекты.

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

Объединение в одном объекте процедур обработки и связанных с ними данных называется инкапсуляцией. Инкапсуляция является одним из наиболее важных принципов объектно-ориентированного программирования.

В объектно-ориентированных языках программирования переменные и функции группируются в классы и шаблоны. Благодаря этому в программах достигается более высокий уровень структуризации.

Порожденные от классов объекты могут вызывать друг у друга процедуры и функции, которые называют методы. Так они изменяют состояние переменных или свойств объектов.

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

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

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

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

Декларативные языки широко применяются в CAD-пакетах, в системах автоматизированного проектирования (САПР), в системах искусственного интеллекта и моделирования.

Проблемно-ориентированные языки используются при решении целого класса задач, возникающих при постоянном расширении области применения вычислительной техники:[12]

  • язык Лисп, англ. Lisp — List Information Symbol Processing, создан Джоном Маккарти в 1962 году. Сначала он использовался как средство для работы со строками символов. Сегодня Лисп используется в экспертных системах, аналитических вычислениях, и т. п.;
  • язык Пролог, англ. Prolog — Programming in Logic, предназначен для логического программирования в системах искусственного интеллекта.

1.3. Достоинства и недостатки

Современные языки программирования значительно отличаются от и языков низкого уровня и машинно-ориентированных языков.

Машинные программы в конечном итоге записываются при помощи только двух символов 0 и 1.

В каждой ЭВМ содержатся ограниченные наборы машинных операций, зависящие от структуры процессора. Обычно, такие наборы состоят из относительно небольших количеств простых операций, например: записать число в ячейку; прочитать число из ячейки; увеличить значение содержимого в ячейке на 1 и т.п.

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

Главным преимуществом в современных языках программирования принято считать более понятный человеку программный код и возможность переноса программ с одного процессора на другой. Несмотря на то, что в некоторых источниках [2] такая возможность оспаривается, все же, при выполнении ряда условий перенос некоторых программ возможен.

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

В современных языках программирования выделяют следующие достоинства:[5]

  • алфавит таких языков значительно шире машинных, это делает текст программ более выразительными и значительно повышает наглядность текстов;
  • доступные для использования наборы операций, не зависят от наборов машинных инструкций, а выбираются из соображений удобства алгоритма, обеспечивающего решение определенного класса задач;
  • в конструкциях команд и операторов отражает содержательный вид обработки данных, которые представляются в удобном для восприятия виде;
  • используются переменные и над ними выполняются действия;
  • поддерживается широкий набор типов данных.

В современных языках программирования требуется использование программ-переводчиков, называемых трансляторами, благодаря чему, эти языки являются машинно-независимыми. Трансляторы формируют представление программ в машинные коды, которые выполняются ЭВМ.

При значительных достоинствах современные языки программирования имеют и ряд недостатков.

Наиболее серьезным из них является значительный объем машинного кода, по сравнению с реализациями тех же алгоритмов на языках Ассемблера. Но на современном этапе развития вычислительной техники проблема большого объема программного кода снижается за счет увеличения доступной памяти ЭВМ и роста быстродействия процессоров.

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

Таким образом, благодаря эволюции языков программирования, разработчики программ для ЭВМ сегодня имеют удобные, высоко эффективные средства разработки, которые дают возможность программисту сосредоточиться на решении непосредственно прикладных задач, не тратя время на решение проблем с оборудованием, оптимизацию программного кода для использования ограниченного объема памяти и т.д.

Глава 2. Особенности программирования на современных языках

2.2. С++

C++ — компилируемый статически типизированный язык программирования общего назначения.

В C++ поддерживаются такие парадигмы программирования как:

  • процедурное программирование;
  • объектно-ориентированное программирование;
  • обобщённое программирование.

С++ обеспечивает: [7]

  • модульность;
  • раздельную компиляцию;
  • обработку исключений;
  • абстракцию данных;
  • объявление типов (классов) объектов;
  • виртуальные функции.

Стандартная библиотека включает, в том числе, общеупотребительные контейнеры и алгоритмы. C++ сочетает свойства как высокоуровневых, так и низкоуровневых языков [8]. В сравнении с его предшественником — языком C, — наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования.

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

Область применения С++ включает:

  • создание операционных систем;
  • разнообразных прикладных программ;
  • драйверов устройств;
  • приложений для встраиваемых систем;
  • высокопроизводительных серверов;
  • развлекательных приложений.

Существует множество реализаций языка C++, как бесплатных, так и коммерческих и для различных платформ. На платформе x86 это GCC, Visual C++, Intel C++ Compiler, Embarcadero (Borland) C++ Builder и другие. C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C#.

Синтаксис C++ унаследовал от языка C. Одним из принципов разработки было сохранение совместимости с C. Тем не менее, C++ не является в строгом смысле надмножеством C; множество программ, которые могут одинаково успешно транслироваться как компиляторами C, так и компиляторами C++, довольно велико, но не включает все возможные программы на C.

Следствием того, что С++ был создан на базе языка С, явилась поддержка в С++ не объектно-ориентированного подхода в написании программного кода и объектно-ориентированного.

Далее описаны объектно-ориентированные особенности языка С++.

В стандарте C++ под классом (class) подразумевается пользовательский тип, объявленный с использованием одного из ключевых слов class, struct или union, под структурой (structure) подразумевается класс, определённый через ключевое слово struct, и под объединением (union) подразумевается класс, определённый через ключевое слово union.

В C++ при наследовании одного класса от другого наследуется реализация класса, плюс класс-наследник может добавлять свои поля и функции или переопределять функции базового класса. Множественное наследование разрешено.

Конструктор наследника вызывает конструкторы базовых классов, а затем конструкторы нестатических членов-данных, являющихся экземплярами классов. Деструктор работает в обратном порядке.

Наследование бывает публичным, защищённым и закрытым (то есть закрытого типа).

Наследник — это больше чем базовый класс, поэтому, если наследование открытое, то он может использоваться везде, где используется базовый класс, но не наоборот.

Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта[4].

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

Пример полиморфизма в С++ представлен ниже.

Первым определяется базовый класса Point, с виртуальным методом Draw(). Вместо тела метода записан спецификатор "= 0". Метод Draw() класса Point не может быть непосредственно вызван, он должен быть переопределен в классах - потомках.

class Point{

public:

virtual void Draw() = 0;

}

Производными от класса Point, определяются классы Line и Circle.

class Line: Point{

public:

void Draw() {};

}

class Circle: Point{

public:

void Draw() {};

}

В классах Line и Circle. метод Draw() переопределен.

Дружественные функции и классы, не являющиеся членами класса, в котором они объявлены , тем не менее имеют доступ к защищённым и закрытым членам класса. Они должны быть объявлены в теле класса как friend[4]. Ниже представлен пример использования дружественного класса.

class Matrix {

friend class Vector::getNum( Matrix & ) ;

private:

int i;

};

class Vector

{

//обращение к закрытому члену данных класса Matrix

int GetNum( Matrix & m ){ return m.i;}

};

Инкапсуляция в С++ реализуется через указание уровня доступа к членам класса: они бывают публичными (открытыми, public), защищёнными (protected) и собственными (закрытыми, приватными, private).

Таблица 1 - Модификаторы доступа в С++

Доступ

private

protected

public

Сам класс

да

да

да

Друзья

да

да

да

Наследники

нет

да

да

Извне

нет

нет

да

Ниже представлен пример указания уровней доступа к членам класса в С++.

class Picture{

public:

void Draw() {};

protected:

void ReDraw() {};

private Remove() {};

}

В классах всегда есть специальные функции — конструкторы и деструкторы, которые могут быть объявлены явно или неявно.

Конструктор вызывается для инициализации объекта (соответствующего типа) при его создании, а деструктор — для уничтожения объекта.

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

Конструкторы обозначаются как одноимённые классу функции , деструкторы — как имя класса, предварённое тильдой.

Для конструкторов и деструкторов нельзя указывать тип возвращаемого значения.

Деструктор нельзя объявлять как принимающий аргументы.

Класс может иметь произвольное количество конструкторов, с различными наборами параметров, в том числе шаблонных, и только один деструктор. Деструктор не может быть нешаблонным.

Пример конструктора и деструктора в С++ представлен ниже.

class Point{

Point::Point() {};

Point::~Point() {};

}

Функции – члены классов могут быть операторами:

Пример представлен ниже.

class Array {

...

inline int& operator[] (int n) { return val[n]; }

}

Использование класса Array:

Array a(10);

...

int c = a[2];

Для демонстрации использования классов и объектов в языке С++ создана тестовая программа.

Для сборки программы использовалась среда разработки Code::Block в состав которой входит компилятор MinGW, портированная на Windows версия GCC. Окно компилятора представлено на рисунке 1.

Рисунок 1 – Среда разработки Code::Block

Было создано консольное приложение, содержащее код, представленный в приложении А.

После сборки приложение было выполнено, результат представлен на рисунке 2.

Рисунок 2. Результат выполнения тестового приложения

2.2. Java

Java — объектно - ориентированный язык программирования, разработанный компанией Sun Microsystems. На сегодняшний день разработку Java ведет корпорация Oracle.

Приложения Java транслируются в байт-код, поэтому они могут работать под управлением виртуальной Java – машины вне зависимости от компьютерной архитектуры.

Дата официального выпуска первого релиза Java — 23.05.1995 [1].

Виртуальная машина Java (JVM) является программой, которая обрабатывает байтовый код и передает инструкции оборудованию аналогично интерпретаторам.

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

Важная особенностью технологии Java является гибкая система безопасности.

Выполнение программ контролируется виртуальной машиной полностью.

Все операции, которые нарушают определенные для программ права (например, попытки подключения к другим компьютерам или несанкционированный доступ к данным или) немедленно прерываются.

В языке Java определены 8 скалярных типов данных: byte, boolean, short, char, int, float, long, double и девятый вспомогательный примитивный тип — void[15].

Все остальные типы данных являются объектными.

В языке Java существуют только динамически создаваемые объекты. Причем в Java объекты и переменные объектного типа являются совершенно разными сущностями.

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

double[][] foo = new double[5][10];

Bar b = new Bar(15);

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

При доступе полям данных или методам объектов при помощи объектных переменных не требуются никакие специальные операции разыменовывания, доступ происходит так, как если объектная переменная является самим объектом.

Если требуется получить указатели на примитивные типы, то используются классы-обёртки примитивных типов: Boolean, Character, Byte, Short, Integer, Float, Long, Double.

Для наследования классов в Java используют ключевое слово extends - расширять. Для интерфейсов используют ключевое слово implements – реализовывать. Классы могут наследовать другие классы или реализовывать интерфейсы. Интерфейсы так же могут наследовать или расширять другие интерфейсы.

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

Пример наследования класса:

public class MyThread extends Thread{

...

}

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

class OnePoint {

public void draw() {

System.out.println(".");

}

}

class TwoPoint extends OnePoint {

public void draw() {

System.out.println("..");

}

}

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

Ниже приведен пример доступа к членам класса только из классов данного пакета.

package points;

class OnePoint {

void draw() {

System.out.print(".");

}

}

class TwoPoint {

public void draw() {

OnePoint p = new OnePoint();

for(int i = 0; i < 2; i ++){

p.draw();

}

}

}

В Java основой инкапсуляции является класс.

При определении доступа к членам классов, для них определяются модификаторы доступа:protected, public, private.

Таблица 2. Модификаторы доступа в Java

Модификатор доступа

Область доступа

public

Без ограничений

private

Только для данного класса

protected

Для данного класса и его потомков

Без модификатора

Для всех классов данного пакета

В Java классы могут иметь неограниченное количество конструкторов, с разным количеством и типами аргументов. Деструкторы в языке Java не предусмотрены. Удаляет объекты из памяти Java – машина.

Ниже приведен пример применения в Java нескольких конструкторов класса.

class OnePoint {

private int count;

public OnePoint() {

count = 1;

}

public OnePoint(int n) {

count = n;

}

}

В Java не поддерживается перегрузка операторов.

Исходный код приложения для тестирования работы с классами в Java набран в редакторе Notepad++ и приведен в приложении Б.

Скомпилировано тестовое приложение Java компилятором javaс. Результат представлен на рисунке 3.

Рисунок 3 - Результат компиляции Java – приложения

Результат работы тестового Java – приложения изображен на рисунке 4.

Рисунок 4 - Результат выполнения Java – приложения

2.3. C#

Объектно-ориентированный язык программирования C# (произносится «си шарп») в 1998—2001 годах создала группа инженеров под руководством Андерса Хейлсберга, в компании Microsoft как язык разработки приложений для платформы Microsoft .NET Framework.

C# был в дальнейшем стандартизирован по ISO/IEC 23270 и ECMA-334 [3].

Название «Си шарп» (от англ. sharp — диез) произошло от музыкальной нотации, где знаком диез, обозначается повышение на полутон соответствующего ноте звука. В этом прослеживается аналогия с названием языка C++, где символы «++» обозначают операцию инкремента переменной. Название так же можно рассматривать как игру с цепочкой символов C→C++→C++++(C#), так как символ «#» может быть составлен из 4х знаков «+».

В языке C# все типы являются классами и связаны отношениями наследования. Базовым родительским классом служит класс Object [10].

Ниже представлен пример объявления нового класса в C#, который наследует другой класс.

class OnePoint

{

...

}

class TwoPoint : OnePoint

{

...

}

Если в базовом классе и в классе наследника определены конструкторы, то при вызове конструктора базового класса используют ключевое слово base. Ниже приведен пример вызова конструктора базового класса из класса наследника.

class OnePoint

{

public OnePoint(string color){};

}

class TwoPoint : OnePoint

{

public TwoPoint(int count):base(string color) {};

}

Если производный класс является наследником базового класса, то он получает все методы, свойства, поля и события базового класса[13]. При создании производного класса может быть выбрана одна из следующих возможностей:

  1. переопределить виртуальные члены базового класса;
  2. наследовать наиболее подходящий метод базового класса без переопределения;
  3. заново определить не виртуальную реализацию необходимых членов, которая скроет реализацию базового класса.

Ниже привен пример переопределения метода в C#.

public class OnePont

{

public virtual void Draw() { }

}

public class TwoPoint : OnePoint

{

public override void Draw() { }

}

В C# модификатором доступа для типов и членов типов является ключевое слово «internal». Внутренние члены и типы, объявленные как internal, доступны только в файлах, входящих в одну и ту же сборку.

Ниже приведен пример использования ключевого слова «internal».

// Assembly1.cs

// Сборка выполнялась с параметром: /target:library

internal class ClassBase

{

public static int intM = 0;

}

class CheckAccess

{

static void Main()

{

ClassBase myBase = new ClassBase(); // ошибки нет

}

}

Если CheckAccess находится в другой сборке:

// Assembly1_a.cs

// Сборка выполнялась с параметром: /reference:Assembly1.dll

class CheckAccess

{

static void Main()

{

ClassBase myBase = new ClassBase (); // CS 0122 ошибка

}

}

Инкапсуляция в C# реализуется с использованием модификаторов доступа. Ниже представлен список модификаторов доступа в C#:

  • public – доступ возможен из любого места в одной сборке, либо из другой сборки, на которую присутствует ссылка;
  • protected – доступ возможен только внутри класса или при наследовании в классе-наследнике;
  • internal – доступ возможен только из сборки, в которой выполнено объявление;
  • private – доступ возможен только внутри класса;
  • protected internal - доступ возможен из одной сборки или из класса-наследника в другой сборке.

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

Если в коде не представлены конструкторы для объектов, то C# создает конструкторы по умолчанию, которые создают экземпляры объектов и задают переменным - членам класса значения по умолчанию.

Ниже приведен пример определения конструктора для класса.

public class OnePoint

{

public OnePoint()

{

...

}

}

Как было сказано выше, классы в C# могут иметь произвольное количество конструкторов.

В C# деструкторы применяются для уничтожения экземпляров классов. Для класса может быть определен только один деструктор. Деструкторы нельзя наследовать или перегружать. Деструкторы вызвать невозможно. Они выполняются автоматически. Деструкторы не принимают модификаторы и не имеют параметров.

Пример определения деструктора представлен ниже.

class OnePoint

{

~OnePoint() // деструктор

{

...

}

}

Для перегрузки оператора в C#, нужно написать функцию с указанием имени, а затем символа оператора, для которого выполняется перегрузка.

Ниже приведен пример перегрузки оператора + для класса боьших чисел:

public static HugeNumber operator+( HugeNumber a, HugeNumber b)

{

return new HugeNumber (a + b);

}

Для тестирования приведенных выше теоретических аспектов создано приложение на языке C# в среде Microsoft Visual Studio 2010 Express.

Окно Microsoft Visual Studio 2010 Express изображено на рисунке 5. Исходный код разработанной программы представлен в приложении В.

Рисунок 5 - Окно Microsoft Visual Studio 2010 Express

На рисунке 6 представлен результат выполнения разработанного приложения.

Рисунок 6 - Результат выполнения приложения на языке C#

Таким образом, проведенное исследование показало, что наиболее популярные современные языки программирования разработаны с приоритетом объектно-ориентированного подхода, а в языках Java и C# невозможен иной принцип разработки приложений.

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

Заключение

В ходе проведенного исследования были проанализированы история развития, классификация, достоинства и недостатки современных языков программирования. За сравнительно небольшой срок, в несколько десятилетий, языки программирования эволюционировали от машинно-зависимых, в которых программный код набирался машинными символами, до объектно-ориентированных. Исходный код программ, написанных на современных языках, может быть перенесен межу различными вычислительными платформами..

Во второй главе были исследованы принципы объектно-ориентированного программирования, реализованные в C++, Java, C#.

Были исследованы способы создания и уничтожения объектов, для каждого языка была исследована поддержка следующих объектно– ориентированных принципов:

  • типы данных;
  • наследование;
  • полиморфизм;
  • инкапсуляция;
  • дружественные функции и классы;
  • конструкторы и деструкторы;
  • перегрузка операторов.

Поддержка перегрузки методов не исследовалась, т.к. она поддерживается всеми рассмотренными языками программирования.

Результаты исследования могут быть кратко сформулированы следующим образом:

    1. Всеми рассмотренными языками поддерживается создание объектов на базе описанных классов, для этого используются конструкторы класса;
    2. Всеми рассмотренными языками поддерживается наследование классов;
    3. Всеми рассмотренными языками поддерживается полиморфизм;
    4. Дружественные классы и функции рассмотренные языки программирования поддерживают, но C# имеет синтаксис отличный от общепринятого, ключевое слово friend в нем отсутствует;
    5. Всеми рассмотренными языками поддерживается инкапсуляция;
    6. В языке Java не поддерживаются деструкторы. В языке C# деструктор не может быть явно вызван, его вызывает среда выполнения при уничтожении объекта;
    7. Перегрузку операторов не поддерживает Java.

По результатам проведенного исследования можно сделать вывод, что в основе наиболее популярных современных языков программирования лежат принципы объектно–ориентированного программирования.

При уничтожении объекта в C# вызывается описанный деструктор, несмотря на то, что явный вызов деструктора не предусмотрен.

В целом общие принципы объектно– ориентированного программирования являются универсальными наиболее популярные современные языки программирования их поддерживают..

Список литературы

      1. Блох Дж. - Java. Эффективное программирование—М.: Издательство"Лори", 2008.— 220 с.
      2. Ватсон Б. - С# 4.0 на примерах, Пер. с англ. – Спб.: Издательский дом «БХВ-Петербург», 2011. – 608 с.: ил
      3. Гросс К. - С# 2008. – Спб.: Издательский дом «БХВ-Петербург», 2009. – 576 с.: ил
      4. Литвиненко Н. А. - Технология программирования на C++. Win32 API-приложения – М.: Издательство «БХВ-Петербург», 2010. – 288 с.: ил.
      5. Нейгел К., Ивьен Б, Глин Дж., Уотсон К., Скиннер М. - C# 4.0 и платформа .NET 4 для профессионалов, Пер. с англ. – М.: Издательский дом «Вильямс», 2011. – 1440 с.: ил.
      6. Перроун П., Венката С., Чаганти Р. Создание корпоративных систем на основе Java 2 Enterprise Edition. Руководство разработчика, Пер. с англ. – М.: Издательский дом «Вильямс», 2001. – 1184 с.: ил.
      7. Солтер Н., Клепер С. Дж. - C++ для профессионалов, Пер. с англ. – М.: Издательский дом «Вильямс», 2006. – 912 с.: ил.
      8. Страуструп Б - Язык программирования С++, Пер. с англ. – М.: Издательство «Бином», 2011. – 1136 с.: ил.
      9. Физерс М. К. - Эффективная работа с унаследованным кодом, Пер. с англ. – М.: Издательский дом «Вильямс», 2009. – 393 с.: ил.
      10. Фленов М. - Библия C#. – Спб.: Издательский дом «БХВ-Петербург», 2011. – 560 с.: ил
      11. Хорстманн С., Корнелл Г. - Core Java 2, 7th Edition / Java 2. Библиотека профессионала, Пер. с англ. – М.: Издательский дом «Вильямс», 2007. – 896 с.: ил.
      12. Шилдт Г. - С++ Базовый курс, Пер. с англ. – М.: Издательский дом «Вильямс», 2010. – 624 с.: ил.
      13. Шилдт Г. - C# 4.0 полное руководство, Пер. с англ. – М.: Издательский дом «Вильямс», 2011. – 1056 с.: ил.
      14. Шилдт Г. - Полный справочник по Java. Java SE™ 6 Edition — 7-е изд. — М.: Вильямс, 2007. — 1040 с.
      15. Эккель Б. - Философия Java, Пер. с англ. – Спб.: Издательский дом «Питер», 2009. – 638 с.: ил.

ПРИЛОЖЕНИЕ А. Тестовый код на языке С++

#include <iostream>

using namespace std;

class MyCalc{

// описание касса

public:

MyCalc(){//конструктор класса

MyCalc(0, 0);

};

MyCalc(int x, int y){// еще один конструктор

cout << "constructor" << endl;

a = x; b = y;

};

~MyCalc(){//деструктор

cout << "destructor" << endl;

}

static int sum(int x, int y){ // статический метод

cout << "static sum" << endl;

return x + y;

};

int sum(){

return a + b;

};

private: // закрытые члены класса

int a;

int b;

};

int main(void) {

MyCalc *mc;// объявлен экземпляр класса, он же объект

int summa;

mc = new MyCalc(5, 10);// объект создан

summa = mc->sum();

delete c;// объект уничтожен

cout << summa << endl;

// вызов статического метода

summa = MyCalc::sum(10, 11);

cout << summa << endl;

return 0;

}

ПРИЛОЖЕНИЕ Б. Тестовый код на языке Java

class MyCalc{

// конструктор

public MyCalc(int x, int y){

System.out.println("constructor");

a = x; b = y;

};

// еще один конструктор

public MyCalc(){

System.out.println("constructor");

a = 0; b = 0;

};

// статический метод

public static int sum(int x, int y){

System.out.println("static sum");

return x + y;

};

public int sum(){

return a + b;

};

// закрытые члены класса

private int a;

private int b;

};

public class Test {

public static void main(String[] args) {

MyCalc mc;

int sum;

mc = newMy Calc(5, 10);

sum =mc.sum();

System.out.println(String.valueOf(sum));

System.out.println("finish, no destructor");

}

}

ПРИЛОЖЕНИЕ В. Тестовый код на языке C#

using System;

using System.Linq;

using System.Text;

using System.Collections.Generic;

namespace ConsoleApplication1

{

class MyCalc

{

// конструктор

public MyCalc(){

}

// еще конструктор

public MyCalc(int x, int y){

Console.WriteLine("constructor");

a = x; b = y;

}

// деструктор

~MyCalc(){

Console.WriteLine("destructor");

}

static int sum(int x, int y){

Console.WriteLine("static sum");

return x + y;

}

public int sum(){

return a + b;

}

private int a;

private int b;

}

class Program

{

static void Main(string[] args)

{

MyCalc mc;

int summa;

mc = new MyCalc(5, 10);

summa = mc.sum();

Console.WriteLine(summa);

}

}

}