Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Подставляемые inline функцииСодержание книги
Поиск на нашем сайте
Некоторые функции в языке Си++ можно определить с использованием специального служебного слова inline. Спецификатор inline позволяет определить функцию как встраиваемую или подставляемую, или "инлайн-функцию. Например, следующая функция определена как подставляемая, inline float module (float x = 0, float у = 0) { return sqrt (x*x + у*у); } Функция module () возвращает значение типа float. Обрабатывая каждый вызов встраиваемой функции, компилятор "пытается" подставить в текст программы код операторов ее тела. Спецификатор inline в общем случае не влияет на результаты вызова функции, она имеет обычный синтаксис определения и описания, подчиняется всем правилам контроля типов и области действия. Однако вместо команд передачи управления единственному экземпляру тела функции компилятор в каждое место вызова функции помещает соответствующим образом настроенные команды кода операторов тела функции. Тем самым при многократных вызовах подставляемой функции размеры программы могут увеличиться, однако исключаются затраты на передачи управления к вызываемой функции и возвраты из нее. Кроме экономии времени при выполнении программы, подстановка функции позволяет проводить оптимизацию ее кода. Наиболее эффективно использовать подставляемые функции в тех случаях, когда тело функции состоит всего из нескольких операторов. Идеальными претендентами на определение со спецификатором inline являются несложные короткие функции. Удобны для подстановки функции, основное назначение которых - вызов других функций либо выполнение преобразований типов.Так как компилятор встраивает код подставляемой функции вместо ее вызова, то определение функции со спецификатором inline должно находиться в том же модуле, что и обращение к ней, и размещается до первого вызова. Следующий случай, когда подстановка для функции со спецификатором inline проблематична, - вызов этой функции с помощью указателя на нее. Реализация такого вызова, как правило, будет выполняться с помощью стандартного механизма обращения к функции. Причины, по которым функция со спецификатором inline будет трактоваться как обыч- ная функция (не подставляемая): · встраиваемая функция слишком велика, чтобы выполнить ее подстановку; · встраиваемая функция рекурсивна; · обращение к встраиваемой функции в программе размещено лл ее определения; · встраиваемая функция вызывается более одного раза в выражении; · встраиваемая функция содержит цикл, переключатель или оператор перехода Если же для функции со спецификатором inline компилятор не может выполнить подстановку из-за контекста, в который помещено обращение к ней, то функция считается статической (static) и выдается предупреждающее сообщение. # include <iostream. h> inline int even(int x) { return! (x%2) }; int main() { int n; cin» n; if (even(n)) cout «n «" является четным \n "; else cout «n «" является нечетным \n"; return 0; }В этом примере программа читает введенное целое число и сообщает, является ли оно четным. Функция even () объявлена как встраиваемая. Это означает, что оператор if (even(n)) cout «n «"является четным\n"; эквивалентен следующему: if (!(n%2)) cout «n «"является четным\n";
На рисунке показаны 4 способа объявления функций в языке программирования С++. Рассмотрим структуры объявления функций в одном файле, с главной функцией. Функции можно объявлять в двух областях, до начала функции main(), после функции main(). До сих пор мы объявляли функции в одном файле, перед функцией main() — это самый простой из способов.
Если функции объявлять в области 1, перед главной функцией, то прототипы для этих функций не нужны. Хорошему стилю программирования соответствует способ объявления функций после main(). Рассмотрим структуру такого объявления функций.
Область объявления функций переместилась в самый конец программы, после main(). Что касается самого способа объявления функций, то он не поменялся. Но так как функции объявлены после main(), использовать их не получится, ведь порядок объявлений изменился и функция main() просто не будет видеть функции объявленные после. Так вот для того, чтобы эти функции можно было увидеть в main() существует понятие прототипа. Прототип функции — это заголовок функции, который объявляется перед функцией main(). И если объявить прототип функции, тогда функцию можно будет увидеть в main().
Структура объявления прототипа очень схожа со структурой объявления функции. Разработаем программу, которая определяет, является ли введённое пятизначное число палиндромом. Палиндром — это число или текст, который читается одинаково как слева, так и справа: 93939; 49094; 11311.
В строке 7 объявлен прототип функции нахождения палиндрома пятизначных чисел. Обратите внимание на то, что прототип полностью должен совпадать с заголовком функции, но некоторые отличия все же есть. Например, то, что в прототипе имена параметров перечислять не надо, достаточно объявить их типы данных. В конце объявления прототипа всегда нужно ставить точку с запятой. В остальном объявление прототипа совпадает с объявлением заголовка одной функции. Прототип необходимо объявлять для каждой функции отдельно. Переменная out_number служит для временного хранения введённого числа. В строке 16 в условии оператора выбора if выполняется запуск функции palindrom5(). Аргументом для неё является переменная in_number. функция вернёт значение типа bool, и если функция вернёт true, то условие будет истинно, в противном случае — ложно. Можно было бы сначала присвоить значение, возвращаемое функцией, некоторой переменной, а потом эту переменную подставить в условие оператора выбора if, но это бы увеличило код программы на одну строку. В строках 23 — 40 объявлена функция palindrom5(), с одним параметром, через который функции передаётся пятизначное число. Переменные balance1, balance2,balance4,balance5 объявлены в строке 25, и необходимы для хранения разрядов пятизначного числа: первого, второго, четвёртого, пятого (нумерация — справа на лево). В строках 26, 29, 32, 35 выполняется одна и та же операция — остаток от деления. Операция остаток от деления отсекает по одному разряду справа налево и сохраняет их в переменные balance1, balance2,balance4,balance5соответственно. Причём операция остаток от деления чередуется с операцией обычного деления. Операция деления выполняется в строках 27, 30, 33, и уменьшает введённое пятизначное число за шаг на один разряд. В строке 30 операция деления уменьшает введённое число сразу на два разряда, потому, что число пятизначное и средний разряд нас не интересует, он может быть любым. В строках 36 — 39 объявлен оператор выбора if, который сравнивает разряды пятизначного числа, и если они, соответствующим образом, равны, то функция вернёт значение true, иначе — false. До сих пор мы объявляли функции в одном файле, с основной программой, то есть там, где находится функция main(). В С++ существует возможность поместить объявления функций в отдельный файл, тогда необходимо будет подключать файл с функциями, как в случае с подключением стандартных заголовочных файлов. Есть два способа:
К хорошему стилю программирования относится второй способ. Таким образом, если объявлять функции в другом файле, то делать это согласно способу два. Переделаем программу нахождения палиндрома так, чтобы объявление функции palindrom5() находилось в отдельном файле *.cpp. Файл *.h нужен для того, чтобы скрыть реализацию функций, т. е. в файле *.h будут содержаться прототипы функций. С помощью обозревателя решений MVS создаём файл типа *.h и называем его palendrom.
Директивы в строках 2,3,5 необходимо всегда объявлять в файлах с прототипами функций, причём прототипы функций всегда объявляются в файлах типа *.h. После директив записанных в строках 2,3, но до директивы #endif объявляются прототипы функций. В строке 4 объявлен прототип функции palindrom5(). Объявление данной функции находится в файле palendrom.cpp, который предварительно тоже был создан с помощью обозревателя решений MVS.
В файле palendrom.cpp находится объявление функции palindrom5(). Так как файл palendrom.cppявляется исполняемым файлом (*.cpp — исполняемые файлы), то в нём обязательно нужно подключить контейнер "stdafx.h", как в строке 2. Чтобы связать файл, где объявлена функция palindrom5() и файл с её прототипом, подключим заголовочный файл (файл с прототипом), это сделано в строке 3. Обратите внимание на то, что при подключении созданного нами файла используются двойные кавычки, а не знаки больше, меньше. Осталось только запустить функцию palindrom5()в главном исполняемом файлеfunc_palendrom.cpp.
В строке 6 мы подключили файл с прототипом функции palindrom5(), после чего можно использовать эту функцию. Итак, мы разбили программу на три файла:
Файл проекта связываем с заголовочным файлом, а заголовочный файл связываем с исполняемым файлом, в таком случае файл проекта увидит функцию palindrom5() и сможет её запустить. Основные моменты в работе с функциями 1. Функция – это именованная последовательность операторов, выполняющая законченное действие. Функции нужны для упрощения структуры программы. 2. Интерфейс грамотно написанной функции определяется ее заголовком. 3. Для вызова функции надо указать ее имя и набор аргументов. 4. В определении, в объявлении и при вызове функции типы и порядок следования аргументов и параметров должны совпадать. 5. Передача параметров в функцию может выполняться по значению или по адресу. 6. Передача параметров в функцию может выполняться по значению или по константной ссылке, результаты ее работы – через возвращаемое значение, а при необходимости передать более одной величины – через параметры по ссылке или указателю. 7. При написании функции нужно предусмотреть все возможные ошибки и обеспечить пользователя функции средствами их диагностики. 8. Печать диагностических сообщений внутри функции нежелательна. 9. Функция может иметь несколько параметров со значениями по умолчанию. Они должны находиться в конце списка параметров. 10. Массивы всегда передаются в функцию по адресу. Количество элементов в массиве должно передаваться отдельным параметром. 11. Рекурсивная функция должна содержать хотя бы одну нерекурсивную ветвь. При использовании рекурсии следует учитывать возникающие при этом проблемы и накладные раходы. 12. В многофайловых проектах важно грамотно разбить задачу на подзадачи и распределить функции по файлам. 13. Для предотвращения ошибок компиляции, связанных с повторным включением заголовочных файлов, следует использовать так называемые стражи включения. Индивидуальные варианты заданий 1. Выполнить задания лабораторной работы №4 (Работа с массивами) в соответствии со своим вариантом, оформив каждый пункт задания в виде функции. Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается. 2. Выполнить задания лабораторной работы №5 (Работа со строками) в соответствии со своим вариантом, оформив в виде функций законченные последовательности действий. Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается. Функция должна быть описана в отдельном модуле и подключена к основной программе.
Контрольные вопросы 1. Как определить функцию? 2. Как обращаться к функции и как установить связи между функцией и программой, ее вызывающей? 3. В чем различие между формальными и фактическими аргументами функции? 4. Где необходимо описывать аргументы функции? 5. Где необходимо описывать другие локальные переменные? 6. Когда и как использовать оператор return()? 7. Когда и как использовать адреса и указатели для доступа к объектам? 8. Понятие рекурсии.
Содержание отчета 1. Титульный лист 2. Цели, задачи работы 3. Индивидуальное задание 4. Блок-схема алгоритма (для каждой задачи) 5. Листинг программы(для каждой задачи) 6. Результат выполнения программы – скриншот (для каждой задачи) 7. Ответы на контрольные вопросы
Практическая работа №7.Структуры в С++. Словари и списки Цель работы: изучение создания структур, словарей и списков в С++.
Задачи: 1. Изучить теоретический материал 2. Написать программу согласно индивидуальному варианту задания. 3. Ответить на контрольные вопросы. 4. Оформить отчет.
Теоретический материал
Структуры Структура — это, некое объединение различных переменных (даже с разными типами данных), которому можно присвоить имя. Например можно объединить данные об объекте Дом: город (в котором дом находится), улица, количество квартир, интернет(проведен или нет) и т.д. в одной структуре. В общем, можно собрать в одну совокупность данные обо всем, что угодно, точнее обо всем, что необходимо конкретному программисту. Всем сразу стало понятно:) Если вы только приступаете к знакомству со структурами в С++, сначала, вам необходимо ознакомиться с синтаксисом структур в языке С++. Рассмотрим простой пример, который поможет познакомиться со структурами и покажет, как с ними работать. В этой программе мы создадим структуру, создадим объект структуры, заполним значениями элементы структуры (данные об объекте) и выведем эти значения на экран.
|
||||||||||||||||||||
Последнее изменение этой страницы: 2021-04-20; просмотров: 95; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.224.44.233 (0.01 с.) |