Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

«ПРОГРАММИРОВАНИЕ НА ЯЗ

.pdf
Скачиваний:
41
Добавлен:
16.04.2015
Размер:
524.28 Кб
Скачать

Федеральное агентство по образованию

________________________________________________

Государственное образовательное учреждение высшего профессионального образования

Санкт-Петербургский государственный технологический институт (технический университет)

____________________________________

Кафедра систем автоматизированного проектирования и управления

Чистякова Т.Б., Антипин Р.В., Новожилова И.В.

ПРОГРАММИРОВАНИЕ НА ЯЗЫКАХ ВЫСОКОГО УРОВНЯ.

БАЗОВЫЙ КУРС

Учебное пособие для студентов заочной формы обучения

Санкт-Петербург 2008

УДК 681.3.062

Чистякова, Т.Б. Программирование на языках высокого уровня. Базовый курс [Текст]: учебное пособие для студентов заочной формы обучения/ Т.Б. Чистякова, Р.В. Антипин, И.В. Новожилова. – СПб.: СПбГТИ(ТУ), 2008. – 104 с.

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

Учебное пособие предназначено для студентов заочной формы обучения по направлению подготовки 230100 «Информатика и вычислительная техника» и соответствует разделам рабоче й программы курсов «Программирование на языках высокого уровня», «Технологии программирования», «Объектно-ориентированное программирование», «Лингвистическое и программное обеспечение САПР», «Алгоритмические языки и программирование».

Ил. 4, табл. 5, библиогр. назв. 9

Рецензенты:

Соколов Г.А., зав. кафедрой автоматизации процессов химической промышленности Санкт-Петербургского государственного технического института (технического университета), д -р техн. наук, проф.

Утверждено на заседании учебно -методической комиссии факультета информатики и управления

Рекомендовано к изданию РИСо СПбГТИ(ТУ)

© СПбГТИ(ТУ), 2008г.

 

ОГЛАВЛЕНИЕ

 

ВВЕДЕНИЕ ..............................................................................................................

5

КОНЦЕПЦИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО

 

ПРОГРАММИРОВАНИЯ .......................................................................................

7

ПРОСТАЯ ПРОГРАММА НА С++ ......................................................................

10

1 ЛЕКСИЧЕСКИЕ ОСНОВЫ ЯЗЫКА С++ .........................................................

11

1.1

Алфавит языка .................................................................................................

11

1.2

Типы данных ...................................................................................................

12

1.3

Инициализация данных ..................................................................................

17

2 ВЫРАЖЕНИЯ ....................................................................................................

19

2.1

Арифметические операции ..............................................................................

22

2.2

Операции сравнения ........................................................................................

22

2.3

Логические операции .......................................................................................

23

2.4

Битовые операции ............................................................................................

23

2.5

Операции присваивания ..................................................................................

24

2.6

Тернарная условная операция .........................................................................

25

2.7

Операция последовательного вычисления .....................................................

25

2.8

Операция получения размера ..........................................................................

25

2.9

Операция разрешения области видимости .....................................................

26

2.10 Операции для работы с динамической памятью ..........................................

26

2.11 Приведение типов ..........................................................................................

27

3 ОПЕРАТОРЫ ......................................................................................................

29

3.1

Оператор выражение ........................................................................................

29

3.2

Оператор безусловного перехода ....................................................................

29

3.3

Условный оператор ..........................................................................................

30

3.4

Пустой и составной операторы .......................................................................

31

3.5

Оператор-переключатель.................................................................................

32

3.6

Операторы цикла..............................................................................................

34

3.7

Оператор продолжения ....................................................................................

36

3.8

Оператор завершения .......................................................................................

36

3.9

Оператор возврата из функции ........................................................................

37

4 ФУНКЦИИ ..........................................................................................................

38

4.1

Определение и вызов функции ........................................................................

38

4.2

Параметры функции.........................................................................................

40

4.3

Массивы в качестве параметров функции ......................................................

42

4.4

Аргументы функции по умолчанию ...............................................................

45

4.5

Функция с переменным количеством параметров .........................................

46

4.6

Указатель на функцию как параметр ..............................................................

47

4.7 Рекурсивные функции......................................................................................

47

3

4.8

Встраиваемые функции ...................................................................................

48

4.9

Перегрузка функций ........................................................................................

49

4.10 Шаблоны функций .........................................................................................

50

5 ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ .........................................

52

6 КОМПИЛЯЦИЯ, КОМПОНОВКА И ОБЛАСТИ СУЩЕСТВОВАНИЯ

 

ИМЕН .....................................................................................................................

54

7 КЛАССЫ .............................................................................................................

58

7.1

Определение класса .........................................................................................

58

7.2

Поля данных .....................................................................................................

59

7.3

Методы класса ..................................................................................................

60

7.4

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

62

7.5

Указатель this....................................................................................................

64

7.6

Конструкторы и деструкторы ..........................................................................

64

7.7

Дружественные функции и классы .................................................................

66

7.8

Перегрузка операторов ....................................................................................

67

8 НАСЛЕДОВАНИЕ ..............................................................................................

72

8.1

Однократное наследование..............................................................................

72

8.2

Управление доступом к базовому классу .......................................................

73

8.3

Конструкторы, деструкторы и наследование .................................................

76

8.4

Множественное наследование .........................................................................

77

8.5

Виртуальные базовые классы ..........................................................................

79

8.6

Виртуальные функции .....................................................................................

82

8.7

Чистые виртуальные функции и абстрактный класс .....................................

85

8.8

Применение полиморфизма.............................................................................

86

9 ШАБЛОНЫ КЛАССОВ ......................................................................................

87

10 СИСТЕМА ВВОДА/ВЫВОДА С++.................................................................

89

10.1 Форматируемый ввод/вывод .........................................................................

90

10.2 Манипуляторы ввода/вывода ........................................................................

94

10.3 Основы файлового ввода/вывода ..................................................................

95

ЗАКЛЮЧЕНИЕ ....................................................................................................

100

СПИСОК ЛИТЕРАТУРЫ ....................................................................................

101

4

ВВЕДЕНИЕ

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

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

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

Программирование сочетает в себе элементы искусства, фундаментальных наук (прежде всего математики) и инженерии. В более широком смысле программирование – процесс создания программ, то есть разработка программного обеспечения. Программирование включает в себя: 1)анализ; 2)проектирование – разработка алгоритма; 3)кодирование и компиляцию – написание исходного текста программы и преобразование его в исполнимый код с помощью компилятора ; 4)тестирование и отладку – выявление и устранение ошибок; 5)сопровождение.

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

Основные парадигмы программирования:

императивное программирование – описывает процесс вычисления в виде инструкций, изменяющих состояние программы. Императивная

5

программа очень похожа на приказы, выражаемые повелительным наклонением в естественных языках, то есть это последовательность команд, которые должен выполнить компьютер. К разновидностям императивного программирования относятся процедурное (основанная на концепции вызова процедуры, содержащей последовательность шагов для выполнения , языки: Basic, Fortran и др.), структурное (представление программы в виде иерархической структуры блоков, языки: С, Pascal, Algol и др.), объектноориентированное (основными концепциями являются понятия объектов и классов, языки: Java, C#, C++, Python, Ruby и др.), автоматное программирование (программа или её фрагмент осмысливается как модель какого-либо формального автомата, может быть реализовано на разных языках императивного программирования) и аспектно-ориентированное (основано на идее разделения функциональности, особенно сквозной функциональности, для улучшения разбиения программы на модули , языки: AspectJ, AspectC++, Aspect.NET и др.) программирование;

декларативное программирование – способ программирования, описывающий не "как решить задачу", а "что нужно получить". В декларативном программировании мы скорее сообщаем компьютеру, что собой представляет проблема, описываем спецификацию программы . Наиболее важными разновидностями декларативного программирования, являются функциональное (рассматривает процесс вычисления как получение значения математически описанной функции , представляет собой последовательность инструкций и не имеют глобального состояния , языки: Haskell, Erlang, Python, Lisp, Ruby и др.) и логическое (основано на выводе новых фактов из данных фактов согласно заданным логическим правилам , языки: Prolog, Haskell, Erlang и др.) программирование.

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

Одним из наиболее распространенных объектно-ориентированных языков высокого уровня является С++, созданный Бьерном Ст рауструпом. Язык С++ стал популярным благодаря тому, что он полностью унаследовал и расширил возможности языка С, который до сих пор часто используется в задачах системного программирования. Популярность С++ привела к тому, что “чистый” объектно-ориентированный язык Java был разработан на его основе, с избавлением от процедурного наследия С. На основе языков Java и С++ был разработан другой популярный сейчас “чистый” объектно-ориентированный

6

язык программи-рования C#. Язык высокого уровня С++ является одним из самых “мощных” языков программирования, включает преимущества как объектно-ориентированного программирования, так и более низкоуровнего процедурного программирования. За столь широкие возможности приходится платить более высокой сложность языка в отличие от “чистых” объектноориентированных языков программирования. Понимание основ языка высокого уровня С++ дает возможность простого перехода на другие основанные на нем языки.

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

КОНЦЕПЦИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ

ООП основная методика программирования 90 -х годов. По мере развития вычислительной техники возникали разные методики программирования. На каждом этапе создавался новый подход, который помогал программистам справляться с растущим усложнением программ. Первые программы создавались посредством ключевых переключателей на передней панели компьютера. Очевидно, что такой способ подходит только для очень небольших программ. Затем был изобретен язык ассемблера, который позволял писать более длинные программы. Следующий шаг был сделан в 1950 году, когда был создан первый язык высокого уровня Fortran.

Используя язык высокого уровня, программисты могли писать программы до нескольких тысяч строк длиной. Для того времени указанный подход к программированию был наиболее перспективным. Однако язык программирования, легко понимаемый в коротких программах, когда дело касалось больших программ, становился нечитабельным (и неуправляемым). Избавление от таких неструктурированных программ пришло после изобретения в 1960 году языков структурного программирования . К ним относятся языки Algol, С и Pascal. Структурное программирование подразумевает точно обозначенные управляющие структуры, программные блоки, отсутствие (или, по крайней мере , минимальное использование) инструкций GOTO, автономные подпрограммы, в которых поддерживается рекурсия и локальные переменные. Сутью структурного программирования является возможность разбиения программы на составляющие ее элементы. Используя структурное программирование, средний программист может создавать и поддерживать программы свыше 50 000 строк длиной.

7

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

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

Инкапсуляция (encapsulation) – это механизм, который объединяет данные и код, манипулирующий с этими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования. В ООП код и данные могут быть объединены вместе; в этом случае говорят, что создается так называемый "черный ящик". Когда коды и данные объединяются таким способом, создается объект (object). Другими словами, объект – это то, что поддерживает инкапсуляцию.

Внутри объекта коды и данные могут быть закрытыми (private) для этого объекта или открытыми (public). Закрытые коды или данные доступны т олько для других частей этого объекта. Таким образом, закрытые коды и данные недоступны для тех частей программы, которые существуют вне объекта. Если коды и данные являются открытыми, то, несмотря на то, что они заданы внутри объекта, они доступны и для других частей программы. Характерной является ситуация, когда открытая часть объекта используется для того, чтобы обеспечить контролируемый интерфейс закрытых элементов объекта.

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

Полиморфизм (polymorphism) – это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к ООП, является использование одного имени для задания общих для класса действий.

8

Выполнение каждого конкретного действия будет определяться типом данных. Например, для языка С, в котором полиморфизм поддерживается недостаточно, нахождение абсолютной величины числа требует трех различных функций: abs(), labs() и fabs(). Эти функции подсчитывают и возвращают абсолют ную величину целых, длинных целых и чисел с плавающей точкой соответственно. В объектно-ориентированных языках программирования каждая из этих функций может быть названа abs() и выполнять свою функцию в зависимости от используемого типа данных. Тип данных, который используется при вызове функции, определяет, какая конкретная версия функции действительно выполняется. Это называется перегрузкой функций (function overloading).

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

Полиморфизм может применяться также и к операторам. Фактически во всех языках программирования ограниченно применяется полиморфизм, например, в арифметических операторах. Так, в С, символ + используется для складывания целых, длинных целых, символьных переменных и чисел с плавающей точкой. В этом случае компилятор автоматически определяет, какой тип арифметики требуется. В ООП вы можете применить эту концепцию и к другим, заданным вами, типам данных. Такой тип полиморфизма называется перегрузкой операторов (operator overloading).

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

Наследование (inheritance) – это процесс, посредством которого один объект может приобретать свойства другого. Точнее, объект может наследовать основные свойства другого объекта и добавлять к ним черты, характерные только для него. Наследование является важным, поскольку оно позволяет поддерживать концепцию иерархии классов (hierarchical classification).

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

9

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

ПРОСТАЯ ПРОГРАММА НА С++

Самая маленькая программа на С++ выглядит так: main () { }.

В этой программе определяется функция, называемая main, которая не имеет параметров и ничего не делает. Фигурные скобки { и } используются в С++ для группирования операторов. В данн ом случае они обозначают начало и конец тела (пустого) функции main. В каждой программе на С++ должна быть своя функция main(), и программа начинается с выполнения этой функции.

Обычно программа выдает какие -то результаты. Вот программа, которая выдает приветствие Hello, World!:

#include <iostream.h> int main ()

{

//Самая простая программа на C++ cout << "Hello, World!\n";

/*Выход из функции main и завершение программы*/

}

Строка #include <iostream.h> сообщает транслятору, что надо включить в программу описания, необходимые для работы стандартных потоков ввода - вывода, которые находятся в iostream.h. Без этих описаний выражение

сout << "Hello, World!\n";

не имело бы смысла. Операция << ("выдать") записывает свой второй параметр в первый параметр. В данном случае строка "Hello, World!\n" записывается в стандартный выходной поток cout. Строка – это последовательность символов, заключенная в двойные кавычки. Два символа: обратной дробной черты \ и непосредственно следующий за ним – обозначают некоторый специальный символ. В данном случае \n является символом конца строки (или перевода строки), поэтому он выдается после символов Hello,world! Двойной слеш (//)

10