
Программирование на языке высокого уровня_Лекция_заоч.pptx
- Количество слайдов: 44
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ВЫСОКОГО УРОВНЯ.
ФИЛОСОФИЯ ПРОГРАММИРОВАНИЯ Процедурное программирование. В общем случае компьютерные языки имеют дело с двумя концепциями — данные и алгоритмы. Данные — это информация, которую использует и обрабатывает программа. Алгоритмы — это методы, используемые программой. Язык программирования называют процедурным, когда в при использовании акцент ставится на обработку данных с помощью алгоритмов. Суть процедурного программирования заключается в том, чтобы запланировать действия, которые должен предпринять компьютер, и с помощью языка программирования их реализовать. В программе предварительно описывается некоторое количество процедур, которые должен будет выполнить компьютер, чтобы получить определенный результат.
ФИЛОСОФИЯ ПРОГРАММИРОВАНИЯ Структурное и модульное программирование. Для ограничения ветвления внутри кода и упрощения модификации программы используется подход, называемый структурным программированием. В языке С++ для реализации такого подхода используются циклы for, while, do while и оператор if else. Еще одним важным подходом является нисходящее программирование. Главная особенность такого подхода – разделение программы на небольшие, поддающиеся управлению задачи. Такой подход позволяет разрабатывать модули, называемые функциями, которые отвечают за выполнение конкретной задачи. В структурном программировании отображено процедурное программирование, программа представляется в виде действий, которые она должна выполнить.
ФИЛОСОФИЯ ПРОГРАММИРОВАНИЯ Структурное и модульное программирование. void hello(); … void hello() // определяем функцию hello () { using namespace std; cout << “Hello, World" << endl; } //функции void не имеет возвращаемых значений
ФИЛОСОФИЯ ПРОГРАММИРОВАНИЯ Объектно-ориентированное программирование. Несмотря на то что принципы структурного программирования делают сопровождение программ более ясным, надежным и простым, написать большую программу все еще было непросто. Новый подход к решению этой проблемы был воплощен в объектно-ориентированном программировании (ООП). В отличие от процедурного программирования, в котором акцент делается на алгоритмах, в ООП во главу угла поставлены данные. Вместо того чтобы пытаться решать задачу, приспосабливая ее к процедурному подходу в языке программирования, в ООП язык программирования приспосабливается к решению задачи. Суть заключается в том, чтобы создать такие формы данных, которые могли бы выразить важные характеристики решаемой задачи.
ФИЛОСОФИЯ ПРОГРАММИРОВАНИЯ Объектно-ориентированное программирование. Основные особенности объектно-ориентированного программирования: 1. Наследование; 2. Инкапсуляция; 3. Полиморфизм.
СОЗДАНИЕ ПРОГРАММЫ Действия, которые должный быть предприняты для написания программы: 1. Создание исходного кода программы; 2. Компиляция исходного кода. Для этого необходима среда разработки. При этом создается объектный код; 3. Подключение библиотек. Библиотеки содержат функции для решения определенных задач. В результате получается исполняемый код.
СОЗДАНИЕ ПРОГРАММЫ Некоторые основные элементы программного кода. • • комментарии, обозначаемые //; директива препроцессора #include; функция int main(); директива namespace std; тело функции, ограниченное фигурными скобками { и }; Оператор возврата для прекращения выполнения; Функции ввода и вывода cin и cout.
СОЗДАНИЕ ПРОГРАММЫ Работа с данными. Переменные. Типы данных. Целочисленные типы: short, int, long, char. Эти типы позволяют хранить числа со знаками. Для того, чтобы хранить числа беззнака, необходимо добавить слово unsigned при инициализации переменной. Пример: (unsigned) int I; Переменная типа char позволяет хранить символьные значения. Логический тип: bool. Может принимать значения true или false. Начальное значение для такой переменной может быть задано неявно, с помощью числа. 0 будет преобразован в значений false, любое ненулевое значение – в true. Квалификатор const. Переменную, заданную с таким квалификатором, нельзя изменять. Пример: const int Months = 12;
ФУНКЦИИ Функции представляют собой модули, из которых строятся программы на C++. Они необходимы для определений ООП в C++. Функции в C++ можно разбить на две категории: функции, которые возвращают значения, и функции, значения не возвращающие. Для каждой разновидности функций можно найти примеры в стандартной библиотеке функций C++. Кроме того, можно создавать собственные функции обеих категорий. 10
ФУНКЦИИ Функции с возвращаемым значением. Функция, имеющая возвращаемое значение, генерирует значение, которое можно присвоить переменной или применить в каком-нибудь выражении. Например, стандартная библиотека C/C++ содержит функцию sqrt (), которая возвращает квадратный корень из числа. Предположим, что требуется вычислить квадратный корень из 6. 25 и присвоить его переменной х. В программе можно использовать следующий оператор: х = sqrt(6. 25); // возвращает значение 2. 5 и присваивает его переменной х Выражение sqrt (6. 25) называется вызовом функции, активизируемая функция — вызываемой функцией, а функция, содержащая вызов функции — вызывающей функцией. 11
ФУНКЦИИ Функции без возвращаемого значения. Существуют также функции, которые не имеют возвращаемого значения. Поскольку эта функция выводит значение на экран, а не передает его вызывающей программе, она не требует возвращаемого значения. Эта особенность функции указывается в прототипе с использованием ключевого слова void для возвращаемого типа: void bucks(double); // прототип для функции, не имеющей возвращаемого значения Поскольку функция bucks () не возвращает значения, ее нельзя применять в качестве части оператора присваивания или какого-то другого выражения. Вместо этого вы имеете дело с чистым оператором вызова функции: bucks(1234. 56); // вызов функции; возвращаемого значения нет 12
ФУНКЦИИ Функции, определяемые пользователем. Как и в случае с библиотечной функцией, вызов функции, определяемой пользователем, производится по ее имени. Кроме того, как и для библиотечной функции, вы должны предоставить прототип функции перед ее использованием; обычно прототип размещается выше определения main(). Однако теперь программист должен предоставить исходный код для новой функции. Проще всего это сделать, поместив нужный код в тот же файл после кода main (). 13
МАССИВЫ Работа с массивами данных. Массив — это структура данных, которая содержит множество значений, относящихся к одному и тому же типу. Например, массив может содержать 60 значений типа int, которые представляют информацию об объемах продаж за 5 лет, 12 значений типа short, представляющих количество дней в каждом месяце, или 365 значений типа float, которые указывают ежедневные расходы на питание в течение года. Каждое значение сохраняется в отдельном элементе массива, и компьютер хранит все элементы массива в памяти последовательно — друг за другом. 14
МАССИВЫ Объявление массива. Для создания массива используется оператор объявления. Объявление массива должно описывать три аспекта: • тип значений каждого элемента; • имя массива; • количество элементов в массиве. short months[12]; // создает массив из 12 элементов типа short 15
СТРОКИ Строка — это серия символов, сохраненная в расположенных последовательно байтах памяти. В C++ доступны два способа работы со строками. Первый, унаследованный от С и часто называемый строками в стиле С. Суть этого способа в использовании массива значений типа char. Второй способ основан на библиотечном классе string. 16
СТРОКИ Объявление строк с помощью массива типа char. Идея серии символов, сохраняемых в последовательных байтах, предполагает хранение строки в массиве char, где каждый элемент содержится в отдельном элементе массива. Строки предоставляют удобный способ хранения текстовой информации, такой как сообщения для пользователя или его ответы. Строки в стиле С обладают специальной характеристикой: последним в каждой такой строке является нулевой символ. Этот символ, записываемый как , представляет собой символ с ASCII-кодом О, который служит меткой конца строки. Например, рассмотрим два следующих объявления: char dog [8] = { 'b', 'e', 'a', 'u', 'х1, ' ', 'I'}; // это не строка char cat [8] = {'f, 'а', ' t', 'е', 's', 'a', ' '}; // а это - строка 17
СТРОКИ Класс string. Вместо использования символьных массивов для хранения строк можно применять переменные типа string (или, пользуясь терминологией C++, объекты). Как вы увидите, класс string проще в использовании, чем массив, и к тому же предлагает более естественное представление строки как типа. Для работы с классом string в программе должен быть включен заголовочный файл string. Класс string является частью пространства имен std, поэтому необходимо указать директиву using или объявление либо же ссылаться на класс как std: : string. Определение класса скрывает природу строки как массива символов и позволяет трактовать ее как обычную переменную. 18
СТРУКТУРЫ Введение в структуры. Предположим, вы необходимо хранить информацию о баскетболисте. Вы хотите хранить его имя, зарплату, рост, вес, среднюю результативность, процент попаданий, результативных передач и т. п. Вам понадобится некоторая форма данных, которая могла бы хранить всю эту информацию как единое целое. Массив здесь не подойдет. Хотя массив может хранить несколько элементов, но все они должны быть одного типа. То есть один массив может хранить 20 целых чисел, другой — 10 чисел с плавающей точкой, однако массив не может хранить целые значения в одних элементах и значения с плавающей точкой — в других. 19
СТРУКТУРЫ Введение в структуры. Структура — более универсальная форма данных, нежели массив, потому что одна структура может хранить элементы более чем одного типа. Это позволяет унифицировать представление данных за счет сохранения всей информации, связанной с баскетболистом, в одной переменной типа структуры. Если вы хотите отслеживать информацию о целой команде, то можете воспользоваться массивом структур. Тип структуры — это еще и ступенька к покорению бастиона объектно-ориентированного программирования C++ — класса. Изучение структур поможет в изучении основ ООП на языке C++. 20
СТРУКТУРЫ Объявление структуры. Например, предположим, что компания Flatable, Inc. желает создать тип данных, описывающий линейку ее продуктов — различного рода надувных предметов. В частности, тип должен включать наименование продукта, его объем в кубических футах, а также розничную цену. Вот описание структуры, отвечающее этим потребностям: struct inflatable // объявление структуры { char name[20]; float volume; double price; }; 21
ОБЪЕДИНЕНИЯ Объединение — это формат данных, который может хранить в пределах одной области памяти разные типы данных, но в каждый момент времени только один из них. То есть, в то время как структура может содержать, скажем, int, long и double, объединение может хранить либо int, либо long, либо double. Синтаксис похож на синтаксис структур, но смысл отличается. Пример: union one 4 all { int_val; long_val; double_val; }; one 4 all pail; pail. int_val = 15; // сохранение int cout << pail. int_val; pail. double_val =1. 38; // сохранение double, int теряется cout << pail. double_val; 22
ПЕРЕЧИСЛЕНИЯ Работа с перечислениями. Средство C++ enum представляет собой альтернативный по отношению к const способ создания символических констант. Он также позволяет определять новые типы, но в очень ограниченной манере. Синтаксис enum подобен синтаксису структур. Пример: enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet}; Этот оператор делает две вещи. • Объявляет имя нового типа — spectrum; при этом spectrum называется перечислением, почти так же, как переменная struct называется структурой. • Устанавливает red, orange, yellow и т. д. в качестве символических констант для целочисленных значений 0 -7. Эти константы называются перечислителями. 23
УКАЗАТЕЛИ И СВОБОДНОЕ ХРАНИЛИЩЕ Три фундаментальных свойствах, которые должна отслеживать компьютерная программа, когда она сохраняет данные: • где хранится информация; • какое значение сохранено; • разновидность сохраненной информации. Одна из стратегий: объявление простых переменных. В операторе объявления предоставляется тип и символическое имя значения. Он также заставляет программу выделить память для этого значения и внутренне отслеживать ее местоположение. Другая стратегия – использование указателей, которые хранят адреса памяти вместо значений. 24
УКАЗАТЕЛИ И СВОБОДНОЕ ХРАНИЛИЩЕ Использование указателей для инициализации переменных. Объявление указателя может иметь следующий вид: int * p_updates; Этот оператор устанавливает, что комбинация *p_updates имеет тип int. p_updates — это указатель (адрес), a *p_updates — это int. Инициализировать указатель можно в операторе объявления. В этом случае инициализируется указатель, а не значение, на которое он указывает. То есть следующие операторы устанавливают pt, а не *pt равным значению &higgens: int higgens = 5; int * pt = &higgens; 25
УКАЗАТЕЛИ И СВОБОДНОЕ ХРАНИЛИЩЕ Использование операции new для выделения памяти. Ценность указателей проявляется тогда, когда во время выполнения выделяются неименованные области памяти для хранения значений. В этом случае указатели становятся единственным способом доступа к такой памяти. В языке C++ есть специальное средство для выделения памяти – операция new. Вы сообщаете new, для какого типа данных запрашивается память; new находит блок памяти нужного размера и возвращает его адрес. Вы присваиваете этот адрес указателю, и на этом все. Ниже показан пример: int * pn = new int; Часть new int сообщает программе, что требуется некоторое новое хранилище, подходящее для хранения int. 26
УКАЗАТЕЛИ И СВОБОДНОЕ ХРАНИЛИЩЕ Использование операции delete для освобождения памяти. Использование операции new для запрашивания памяти, когда она нужна — одна из сторон пакета управления памятью C++. Второй стороной является операция delete, которая позволяет вернуть память в пул свободной памяти, когда работа с ней завершена. Это — важный шаг к максимально эффективному использованию памяти. Память, которую вы возвращаете, или освобождаете, затем может быть повторно использована другими частями программы. Операция delete применяется с указателем на блок памяти, который был выделен операцией new: int * ps = new int; // выделить память с помощью операции new. . . // использовать память delete ps; // по завершении освободить память // с помощью операции delete 27
АЛЬТЕРНАТИВЫ МАССИВАМ Шаблонный класс vector похож на класс string в том, что он является динамическим массивом. Установить размер объекта vector можно во время выполнения, и можно добавлять новые данные в конец или вставлять их в середину, В основном vector представляет собой альтернативу применению операции new для создания динамического массива. На самом деле класс vector использует операции new и delete для управления памятью, но делает это автоматически. Пример: #include
АЛЬТЕРНАТИВЫ МАССИВАМ Шаблонный класс array. Объект array имеет фиксированный размер и использует стек (или распределение в статической памяти) вместо свободного хранилища, поэтому он характеризуется эффективностью встроенных массивов. К этому добавляется удобство и безопасность. Для создания объекта array должен быть включен заголовочный файл array. Пример: #include
ЦИКЛЫ Введение. Компьютеры умеют намного больше, чем просто хранить данные. Они анализируют, объединяют, упорядочивают, извлекают, модифицируют, экстраполируют, синтезируют и выполняют другие манипуляции над данными. Для этого программам необходимы инструменты для выполнения повторяющихся действий и принятия решений. Конечно, язык C++ предоставляет такие инструменты. На самом деле в нем используются те же циклы for, while, do while и операторы if, switch, которые есть в языке С. 30
ЦИКЛЫ Цикл for. 31
ЦИКЛЫ Цикл while. 32
ЦИКЛЫ Цикл do while. 33
ОПЕРАТОРЫ ВЕТВЛЕНИЯ Оператор if. Когда программа C++ должна принять решение о том, какое из альтернативных действий следует выполнить, такой выбор обычно реализуется оператором if. Этот оператор имеет две формы: просто if и if else. Оператор if разрешает программе выполнять оператор или блок операторов при условии истинности проверочного условия, и пропускает этот оператор или блок, если проверочное условие оценивается как ложное. Таким образом, оператор if позволяет программе принимать решение относительно того, нужно ли выполнять некоторую часть кода. Синтаксис оператора if подобен while: if (проверочное-условие) оператор 34
ОПЕРАТОРЫ ВЕТВЛЕНИЯ Оператор if. 35
ОПЕРАТОРЫ ВЕТВЛЕНИЯ Оператор if else. В то время как оператор if позволяет программе принять решение о том, должен ли выполняться определенный оператор или блок, if else позволяет решить, какой из двух операторов или блоков следует выполнить. Это незаменимое средство для программирования альтернативных действий. Оператор if else имеет следующую общую форму: if (проверочное-условие) оператор1 else оператор2 36
ОПЕРАТОРЫ ВЕТВЛЕНИЯ Оператор if else. 37
ОПЕРАТОРЫ ВЕТВЛЕНИЯ Оператор switch. При большом количестве вариантов ветвления конструкция if else может стать очень громоздкой и ее использование будет невыгодным. В С++ существует оператор switch, который существенно упрощает обработку выбора из большого количества альтернатив. Общая форма представления оператора switch (целочисленное-выражение) { case метка 1 : оператор (ы) case метка 2 : оператор (ы) default : оператор (ы) } 38
ОПЕРАТОРЫ ВЕТВЛЕНИЯ Оператор switch. 39
ОПЕРАТОРЫ ВЕТВЛЕНИЯ Операторы break и continue позволяют программе пропускать часть кода. Оператор break можно использовать в операторе switch и в любых циклах. Он вызывает немедленную передачу управления за пределы текущего оператора switch или цикла. Оператор continue применяется только в циклах и вынуждает программу пропустить остаток тела цикла и сразу начать следующую итерацию. 40
ОПЕРАТОРЫ ВЕТВЛЕНИЯ Оператор continue. 41
ОПЕРАТОРЫ ВЕТВЛЕНИЯ Оператор break. 42
ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ Объектно-ориентированное программирование (ООП) — это особый концептуальный подход к проектированию программ, и C++ расширяет язык С средствами, облегчающими применение такого подхода. Ниже перечислены наиболее важные характеристики ООП: • абстракция; • инкапсуляция и сокрытие данных; • полиморфизм; • наследование; • повторное использование кода. Класс — это единственное наиболее важное расширение C++, предназначенное для реализации этих средств и связывающее их между собой. 43
АБСТРАКЦИЯ И КЛАССЫ Класс — это двигатель C++, предназначенный для трансляции абстракций в пользовательские типы. Он комбинирует представление данных и методов для манипулирования этими данными в пределах одного аккуратного пакета. Спецификация класса состоит из двух частей: • Объявление класса, описывающее компоненты данных в терминах членов данных, а также открытый интерфейс в терминах функций-членов, называемых методами. • Определения методов класса, которые описывают, как реализованы определенные функции-члены. 44