Программирование на языках высокого уровня Вичугов Владимир Николаевич доцент каф. АиКС АВТФ ТПУ Томск 2010 Языки программирования Язык программирования – набор правил (лексических, синтаксических и семантических) для составления компьютерной программы. Машинный язык Язык ассемблера Мнемонические команды вместо машинных команд Языки программирования высокого уровня ЯВУ имитируют естественные языки, используя некоторые слова разговорного языка и общепринятые математические символы FORTRAN (1954 г.) – первый ЯВУ Структурное программирование Управляющие структуры, подпрограммы (функции, процедуры), рекурсия, локальные переменные, отсутствие GOTO Алгол(1958), Паскаль(1970), Си(1972). Объектно-ориентированное программирование (ООП) Классы, объекты, инкапсуляция, полиморфизм, наследование Object Pascal, C++, Java, C#, … . ООП позволяет оптимально организовывать программы, разбивая проблему на составные части, и работая с каждой по отдельности. Класс представляет собой тип данных, объединяющий поля (свойства) и методы (функции). Класс Экземпляр (объект) Экземпляр (объект) «Человек» класса «Человек» класса «Человек» Поле «Имя» Поле «Имя» = Вася Поле «Имя» = Петя Метод «Получить имя» Метод «Получить имя» Метод «Получить имя» Метод «Отправить сообщение» Метод «Отправить сообщение» Метод «Отправить сообщение» Объектно-ориентированное программирование (ООП) Инкапсуляция – свойство объекта скрывать некоторые свои свойства и методы. Внешний пользователь может взаимодействовать с объектом только через предоставленный интерфейс. Пример: в классе «Человек» поле «Имя» скрыто от внешнего пользователя. Интерфейс для внешнего пользователя при взаимодействии с объектами класса «Человек» состоит из методов «Получить имя» и «Отправить сообщение». Класс «Человек» Поле «Имя» Метод «Получить имя» Метод «Отправить сообщение» Объектно-ориентированное программирование (ООП) Наследование позволяет описать новый класс на основе существующего, при этом свойства и функциональность родительского класса наследуются новым классом (потомок, наследник, производный класс). Класс «Преподаватель» Производный класс Класс «Человек» Родительский класс Класс «Студент» Производный класс Поле «Имя» Поле «Имя» Поле «Зарплата» Метод «Получить имя» Метод «Отправить сообщение» Поле «Имя» Поле «Группа» Метод «Получить имя» Метод «Получить номер группы» Метод «Поставить оценку» Метод «Отправить сообщение» Метод «Получить имя» Метод «Увеличить зарплату» Метод «Отправить сообщение» Объектно-ориентированное программирование (ООП) Класс «Группа» Класс «Кафедра» Класс «Университет» Поле «Студенты» - массив объектов класса «Студенты» Поле «Преподаватели» массив объектов класса «Преподаватель» Поле «Кафедры» - массив объектов класса «Кафедра» Метод «Получить список группы» Метод «Получить список преподавателей» Поле «Группы» - массив объектов класса «Группа» Отправить сообщение старосте группы Отправить сообщение зав.кафедрой Метод «Получить список кафедр» Объявить о проведении конференции Языки программирования Компилируемые ЯП Интерпретируемые ЯП интерпретатор компилятор Intel машинный код интерпретатор Intel + скорость выполнения – скорость выполнения – переносимость машинного кода + переносимость программы PowerPC Смешанные ЯП (Java, C#) компилятор байт-код байт-код: машинно-независимый код низкого уровня Виртуальная машина – JIT-компилятор (just in time – «на лету») виртуальная машина Intel PowerPC + сборка «мусора» + переносимость программы виртуальная машина PowerPC Особенности программирования в многозадачной ОС Однозадачная ОС (Dos) Многозадачная ОС (Windows, Linux) сообщения системы последовательное выполнение команд Цикл обработки сообщений системы Процедура обработки нажатия на клавишу Процедура обработки нажатия на кнопку Процедура обработки событий системного таймера Процедура обработки перемещения курсора мыши Особенности программирования в многозадачной ОС Программирование в ОС семейства Windows Программирование в ОС семейства Unix Приложение FindFirstFile GetFileAttributes GetComputerName GetWindowsDirectory CreateWindow Сообщение WM_MOVE Сообщение WM_CLOSE Сообщение WM_MBUTTONDBLCLK Приложение open pipe kill Сигнал SIGTERM Сигнал SIGHUP Сигнал SIGINT Сигнал SIGCHLD Windows API Unix API - POSIX (Application Programming Interface – интерфейс программирования приложений) (Portable Operating System Interface for uniX) Особенности программирования в многозадачной ОС Выполнение Windows-приложения в ОС семейства Unix Приложение FindFirstFile GetFileAttributes GetComputerName GetWindowsDirectory CreateWindow Сообщение WM_MOVE Сообщение WM_CLOSE Сообщение WM_MBUTTONDBLCLK Wine – альтернативная свободная кроссплатформенная реализация Windows API open pipe kill Сигнал SIGTERM Сигнал SIGHUP Сигнал SIGINT Сигнал SIGCHLD Оконная система стандарта X Windows System (например, XOrg или XFree86) Unix API - POSIX WINE = Wine Is Not Emulator Особенности программирования в многозадачной ОС Выполнение Windows-приложения в ОС семейства Unix Запуск приложения в ОС Windows XP Запуск приложения в ОС ASP Linux Свободное ПО и закрытое ПО. GNU GPL. GNU General Public License (Универсальная общедоступная лицензия GNU или Открытое лицензионное соглашение GNU) — популярная лицензия на свободное программное обеспечение, созданная в рамках проекта GNU в 1988 г. GNU - (GNU’s Not Unix — «GNU — это не Unix») — проект по созданию свободной UNIX-подобной операционной системы, начатый Ричардом Столлмэном в 1983 году. ОС GNU/Linux = системные утилиты проекта GNU + ядро Linux. Свободное ПО и закрытое ПО. GNU GPL. Права (свободы) для пользователя компьютерной программы: - доступ к исходному коду; - свобода изучения того, как программа работает, и её модификации; - свобода распространения копий; - свобода улучшения программы, и выпуска улучшений в публичный доступ. Пользователи производных программ получат вышеперечисленные права («copyleft» - принцип «наследования» прав) Язык C++, среда разработки Borland Turbo C++ Turbo C++ - программный продукт фирмы Borland, предназначенный для быстрой разработки приложений (RAD – rapid application development) на языке С++. Turbo С++ - это интегрированная среда разработки приложений (IDE – Integrated Development Environment). Возможно создание как консольных приложений Win32, так и GUIприложений (GUI – Graphical User Interface – графический интерфейс пользователя). Версия Explorer является бесплатной. Язык C++, среда разработки Borland Turbo C++ Создание консольного приложения: File – New – Other – Console Application Язык C++, среда разработки Borland Turbo C++ Создание консольного приложения Пример консольного приложения: Количество компьютеров: N 1 - Добавить компьютер 2 - Минимальная длина имени компьютера 3 - Выход Язык C++, среда разработки Borland Turbo C++ Поиск необходимой функции в библиотеке (например, conio.h) Список функций Язык C++, среда разработки Borland Turbo C++ Поиск информации об используемых функциях Нажать правой кнопкой мыши по названию функции и выбрать Find Declaration («Найти объявление») Другие функции библиотеки Описание функций Ctrl + Space = список вариантов кода Язык C++, среда разработки Borland Turbo C++ Создание нового оконного приложения: File – New – VCL Form Application Панель управления Дизайнер форм Менеджер проекта Дерево объектов Палитра компонентов Инспектор объектов Компонент – класс, который описывает Проект – набор файлов, необходимых некоторый элемент управления Форма – объект, который представляет для(видимый компиляции приложения или невидимый в окне одно окно приложения. приложения). При перетаскивании на форму становится объектом (экземпляром класса) Язык C++, среда разработки Borland Turbo C++ Создание нового оконного приложения: менеджер проекта Файл ресурсов Первая форма для приложения (картинка запускаемого файла, В процесседля компиляции объектный картинки меню и т.п.) Все объектные файл формы Unit1.obj. файл объединяются в исполняемый файл Project1.exe Язык C++, среда разработки Borland Turbo C++ Заголовочный файл формы Создание нового оконного приложения: менеджер проекта Исходный файл формы Язык C++, среда разработки Borland Turbo C++ Классы и объекты Язык C++, среда разработки Borland Turbo C++ Добавление компонентов Язык C++, среда разработки Borland Turbo C++ Динамическое создание элементов управления Язык C++, среда разработки Borland Turbo C++ Свойства и события Язык C++, среда разработки Borland Turbo C++ Изменение свойств объектов Язык C++, среда разработки Borland Turbo C++ Создание обработчиков событий Язык C++, среда разработки Borland Turbo C++ Создание обработчиков событий Язык C++, среда разработки Borland Turbo C++ Добавление обработчика события Язык C++. Библиотеки классов Библиотека OWL (Object Window Library) фирмы Borland Библиотека MFC (Microsoft Foundation Class Library) фирмы Microsoft Библиотека VCL (Visual Component Library) фирмы Borland концепция PME – свойства, методы, события Библиотека dotNET фирмы Microsoft Код для работы с WinAPI для вывода картинки в окно Аналогичный код для работы с OWL Использование VCL VCL. Свойства компонентов. Свойства относятся к специальной категории членов класса: • К свойствам можно обращаться как к полям класса, но часто (не всегда) при чтении свойства или при записи значения в свойство выполняются специальные методы (пример: изменение свойства Left объекта класса TForm). • Свойства могут иметь тип read-only, write-only, runtime-only. • Обычно (не всегда) имеют значение по умолчанию. • Свойства могут быть следующих типов: - простые типы данных; - перечисления; - наборы; - объекты. Иерархия классов VCL TObject TPersistent TComponent Невизуальные компоненты Визуальные компоненты TControl TTimer, etc TGraphicControl TWinControl TSpeedButton, etc TPanel, etc Язык C++, среда разработки Borland Turbo C++ Свойства, события, компоненты Название свойства Тип Описание свойства Раздел Miscellaneous – разное Name (Имя) AnsiString Имя объекта в программе. Язык C++, среда разработки Borland Turbo C++ Свойства, события, компоненты Название свойства Тип Описание свойства Раздел Visual – видимый Color (Цвет) TColor Цвет фона элемента управления. enum TColor {clMin=-0x7fffffff-1, clMax=0x7fffffff}; Язык C++, среда разработки Borland Turbo C++ Свойства, события, компоненты Название свойства Тип Описание свойства Раздел Visual – видимый Font (Шрифт) TFont * Свойства шрифта. Form1->Label1->Font->Size = 50; Язык C++, среда разработки Borland Turbo C++ Свойства, события, компоненты Название свойства Тип Описание свойства AnsiString Видимый на экране заголовок компонента. Для формы - строка заголовка формы. Раздел Action Caption (Заголовок) Язык C++, среда разработки Borland Turbo C++ Свойства, события, компоненты Enabled (Доступный) bool true – элемент доступен; false – элемент недоступен (не реагирует ни на какие действия со стороны пользователя, но программно можно изменить свойства недоступного объекта и вызвать обработчики событий). Язык C++, среда разработки Borland Turbo C++ Свойства, события, компоненты Visible (Видимый) bool true – элемент отображается; false – элемент не отображается. Язык C++, среда разработки Borland Turbo C++ Свойства, события, компоненты Hint (Подсказка) AnsiString Текст подсказки, который появляется, если пользователь задержит курсор мыши на данном элементе. Подсказа будет выводиться только в том случае, если свойство ShowHint (раздел Help and Hints) установлено в true, либо если данный раздел наследует это свойство от родительского элемента (свойство ParentShowHint = true) и в родительском элементе разрешен показ подсказки. Язык C++, среда разработки Borland Turbo C++ Свойства, события, компоненты Align (Выравнивание) TAlign Способ выравнивания элемента относительно родительского элемента. Язык C++, среда разработки Borland Turbo C++ Основные события Название события Описание события OnClick Событие возникает при нажатии на левую кнопку мыши по данному элементу. OnChange Событие возникает, когда в элементе управления происходят какие-либо события (например, ввод нового символа в поле ввода текста). OnDblClick Событие возникает при двойном нажатии на левую кнопку мыши по данному элементу. OnEnter Событие происходит в том случае, когда элемент управления получает фокус (активизируется). OnExit Событие происходит, когда элемент управления теряет фокус (в пределах окна). OnKeyDown Событие возникает при нажатии на любую клавишу на клавиатуре (в том учитываются служебные клавиши Ctrl, Alt, Shift). Параметр Key типа WORD содержит код нажатой клавиши. OnKeyUp Событие возникает при отжатии любой клавиши на клавиатуре (в том учитываются служебные клавиши Ctrl, Alt, Shift). Параметр Key типа WORD содержит код отжатой клавиши. Язык C++, среда разработки Borland Turbo C++ Основные события Название события Описание события OnKeyPress Событие возникает при нажатии на алфавитно-цифровую клавишу, на Tab, Backspace, Esc или Enter на клавиатуре. Параметр Key типа char содержит нажатую клавишу. OnMouseDown Событие возникает при нажатии на любую кнопку мыши. Параметр Button содержит информацию о том, какая кнопка была нажата: левая, правая или средняя. Параметр Shift содержит информации о том, какие служебные клавиши на клавиатуре были нажатии (Alt, Shift, Ctrl). Параметры X и Y содержат координату точки, в которой был курсор во время нажатия кнопки, относительно левой верхней границы текущего элемента управления. OnMouseUp То же самое, только при отпускании клавиши мыши OnMouseMove Событие возникает при движении курсора мыши по поверхности данного элемента управления. OnResize Для формы: событие, которое возникает при изменении размеров окна. OnPaint Событие возникает, когда необходимо перерисовать компонент. Язык C++, среда разработки Borland Turbo C++ Приведение типов Язык C++, среда разработки Borland Turbo C++ Приведение типов Язык C++, среда разработки Borland Turbo C++ Приведение типов Язык C++, среда разработки Borland Turbo C++ Сравнение вещественных величин Язык C++, среда разработки Borland Turbo C++ Сравнение вещественных величин Панель управления → Язык и региональные стандарты → Региональные параметры → Настройка Язык C++, среда разработки Borland Turbo C++ Сравнение вещественных величин float – 4 байта – 7 значащих цифр double – 8 байт – 15 значащих цифр long double – 10 байт – 19 значащих цифр Язык C++, среда разработки Borland Turbo C++ Сравнение вещественных величин Язык C++, среда разработки Borland Turbo C++ Операция присваивания и выражение присваивания Операция присваивания: a = b a - адресное выражение (l-value), b – любое выражение Адресные выражения: x, *py, Lines.Count, Form1->Caption Неадресные выражения: x+y, a+1, 132, "MainForm" В C++ операция присваивания образует выражение присваивания, значением которого является левый операнд после присваивания. Значение выражения присваивания является адресным. a = b = 10; соответствует b = 10; a = b; (a = b+1) = 20; соответствует a = b+1; a = 20; (res = 0) = a/b; Язык C++, среда разработки Borland Turbo C++ Операция присваивания и выражение присваивания int a=0, b=0, c=0, d=0; d = c = b = a = 10; Результат: все переменные равны 10 int a=0, b=0, c=0, d=0; d = (c = b = a) = 10; Результат: a = 0, b = 0, c = 10, d = 10 int a=0, b=0, c=0, d=0; d = c = (b = a) + (a = 10) + 1; Результат 1: a = 10, b = 0, c = 11, d = 11 Результат 2: a = 10, b = 10, c = 21, d = 21 Язык C++, среда разработки Borland Turbo C++ Приоритеты и ассоциативность операций Приоритет: a+b*c→a+(b*c) Ассоциативность: a+b+c→(a+b)+c a=b=c→ a=(b=c) (слева направо) (справа налево) Язык C++, среда разработки Borland Turbo C++ Приоритеты и ассоциативность операций Задача: выводить новые значения на экран, пока не будет получено значение -1 ---------------------------------------int val; while ((val = GetNextValue()) != -1) cout << val <<endl; ---------------------------------------while (val = GetNextValue() != -1) эквивалентно while (val = (GetNextValue() != -1)) т.к. приоритет != выше, чем у операции присваивания Язык C++, среда разработки Borland Turbo C++ Операция следования (запятая) Выражения, разделённые запятой, вычисляются слева направо. Результатом операции является последнее выражение. Результат может быть адресным выражением. a = 10, b = 20; соответствует а = 10; b = 20; a = (10, b = 20); соответствует b = 20; a = b; (10, a++, b = 20) = 30; соответствует a++; b = 20; b = 30; for (i=4, j=10; i<j; i++, j--) a[i]=a[j]; Язык C++, среда разработки Borland Turbo C++ Тернарная операция выбора (или условная операция) Тернарная операция – это операция с тремя операндами. Тернарная операция выбора: операнд1?операнд2:операнд3 Если операнд1 не равен нулю (условие истинно), то операция принимает значение второго операнда, иначе операция принимает значение третьего операнда. max = a>b?a:b; //нахождение максимального значения b?(res=a/b,count++):(ShowMessage("На ноль делить нельзя!"),1); (a>b?a:b)=100; //максимальное значение заменить на 100 Язык C++, среда разработки Borland Turbo C++ Пустой оператор «;» используется в том случае, когда по правилам языка должен быть оператор, но в программе не должно быть никаких вычислений. Язык C++, среда разработки Borland Turbo C++ Условный оператор Блок else относится к самому последнему оператору if, с которым ещё не сопоставлен ни один блок else. Язык C++, среда разработки Borland Turbo C++ Оператор выбора При передаче управления по какой-либо метке дальнейшие операторы выполняются подряд до конца оператора выбора или до оператора выхода break. Язык C++, среда разработки Borland Turbo C++ Массивы Имя массива – указатель на первый элемент: mas == &mas[0] Приоритет у операции разадресации (разыменовывания) выше, чем у сложения. mas[2] эквивалентно *(mas+2), что соответствует третьему элементу в массиве mas: mas+2 == &mas[2] Язык C++, среда разработки Borland Turbo C++ Массивы mas[3] = 2.0 mas[3]+1 = 3 3[mas] = *(3+mas) – 4-ый элемент массива mas Язык C++, среда разработки Borland Turbo C++ Массив как аргумент функции Язык C++, среда разработки Borland Turbo C++ Массив как аргумент функции Язык Object Pascal, среда разработки Borland Turbo Delphi Массив как аргумент функции Язык Object Pascal, среда разработки Borland Turbo Delphi Массив как аргумент функции Язык C++, среда разработки Borland Turbo C++ Массив как аргумент функции Язык C++, среда разработки Borland Turbo C++ Массив как аргумент функции Язык C++, среда разработки Borland Turbo C++ Функции. Аргументы по умолчанию. Язык C++, среда разработки Borland Turbo C++ Переопределение функций