Целочисленный (целый) тип данных (тип int)

Краткая аннотация лекции.

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

Цель лекции: изучить классификацию типов и их внутренне представление в языке С++, научиться работать со стандартными и пользовательскими типами.

Текст лекции.

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

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

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

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

· внутреннее представление данных в памяти компьютера;

· объем памяти, выделяемый под данные;

· множество (диапазон) значений, которые могут принимать величины этого типа;

· операции и функции, которые можно применять к данным этого типа.

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

Классификация типов данных в С++

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

Объектно-ориентированные языки программирования позволяют определять типы класса.

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

Тип данных определяет размер памяти, выделяемой под переменную данного типа при ее создании. Язык программирования C++ поддерживает следующие типы данных (рис. 1).

· Базовые типы. Базовые типы предопределены стандартом языка, указываются зарезервированными ключевыми словами и характеризуются одним значением. Их не надо определять и их нельзя разложить на более простые составляющие без потери сущности данных. Базовые типы объектов создают основу для построения более сложных типов.

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

· Типы класса. Экземпляры этих типов называются объектами.

Целочисленный (целый) тип данных (тип int) - student2.ru

Рис. 1. Типы данных в языке С++

Существует четыре спецификатора типа данных, уточняющих внутреннее представление и диапазон базовых типов:

short (короткий) long (длинный) длина
signed (знаковый) unsigned (беззнаковый) знак (модификатор)

Рассмотрим более подробно базовые типы данных.

Логический (булевый) тип данных (тип bool)

В языке С++ используется двоичная логика (истина, ложь). Лжи соответствует нулевое значение, истине – единица. Величины данного типа могут также принимать значения true и false.

Внутренняя форма представления значения false соответствует 0, любое другое значение интерпретируется как true. В некоторых компиляторах языка С++ нет данного типа, в этом случае используют тип int, который при истинных значениях выдает 1, а при ложных – 0. Под данные логического типа отводится 1 байт.

Тип void

Множество значений этого типа пусто. Тип void имеет три назначения:

1. указание о невозвращении функцией значения;

2. указание о неполучении параметров функцией;

3. создание нетипизированных указателей.

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

Основные типы данных
Диапазон значений -2 147 483 648 до 2 147 483 647 0 до 4 294 967 295 -32 768 до 32 767 0 до 65 535 -2 147 483 648 до 2 147 483 647 0 до 4 294 967 295 -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 0 до 18 446 744 073 709 551 615 -128 до 127 0 до 255 0 до 65 535 3.4Е-38 до 3.4Е+38 (7 значащих цифр) 1.7Е-308 до 1.7Е+308 (15 значащих цифр) 1.7Е-308 до 1.7Е+308 (15 значащих цифр) true (1) или false (0) -2 147 483 648 до 2 147 483 647
Размер памяти, байт (бит) 4 (32) 4 (32) 2 (16) 2 (16) 4 (32) 4 (32) 8 (64) 8 (64) 1 (8) 1 (8) 2 (16) 4 (32) 8 (64) 8 (64) 1 (8) 4 (32)
Название целый беззнаковый целый короткий целый беззнаковый короткий целый длинный целый беззнаковый длинный целый длинный-предлинный целый беззнаковый длинный-предлинный целый байт (целый длиной не менее 8 бит) беззнаковый байт расширенный символьный вещественный одинарной точности вещественный двойной точности вещественный максимальной точности логический перечисляемый
Обозначение Другие имена signed signed int unsigned short int signed short int unsigned short int long int signed long int unsigned long int long long int signed long long int unsigned long long int signed char
Имя типа int unsigned int short unsigned short long unsigned long long long unsigned long long char unsigned char wchar_t float double long double bool enum
Тип Целочисленный (целый) тип данных (тип int) - student2.ru Целочисленный (целый) тип данных (тип int) - student2.ru Целочисленный (целый) тип данных (тип int) - student2.ru    

Преобразования типов

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

Преобразование типов – это приведение значения переменной одного типа в значение другого типа.

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

Формат операции явного преобразования типов:

имя_типа (операнд)

Например, int(x), float(2/5), long(x+y/0.5).

Пример 1.

//Взятие цифры разряда сотых в дробном числе

#include "stdafx.h"

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[]){

float s,t;

long int a,b;

printf("Введите вещественное число\n");

scanf("%f", &s);

t=s*100;

a=int(t);

//переменная t приводится к типу int в переменную a

b=a%10;

printf("\nЦифра разряда сотых числа %f равна %d.", s, b);

system("pause");

return 0;

}

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

Пример 2.Временной интервал

Заданы моменты начала и конца некоторого промежутка времени в часах, минутах и секундах (в пределах одних суток). Найти продолжительность этого промежутка в тех же единицах.

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

Обозначим переменные для хранения начала интервала hour1, min1 и sec1, для хранения конца интервала – hour2, min2 и sec2, а результирующие величины – hour, min и sec.

Для решения этой задачи необходимо преобразовать оба момента времени в секунды, вычесть первый из второго, а затем преобразовать результат обратно в часы, минуты и секунды. Следовательно, потребуется промежуточная переменная sum_sec, в которой будет храниться величина интервала в секундах. Она может иметь весьма большие значения, ведь в сутках 86400 секунд, что выходит за пределы типа int. Следовательно, для этой переменной выберем длинный целый тип (long int, сокращенно long).

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

//Временной интервал. Форматированный ввод-вывод данных

#include "stdafx.h"

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[]){

int hour1, min1, sec1, hour2, min2, sec2, hour, min, sec;

long int sum_sec;

printf("Введите время начала интервала (час мин сек)\n");

scanf("%d%d%d", &hour1,&min1,&sec1);

printf("Введите время окончания интервала (час мин сек)\n");

scanf("%d%d%d", &hour2,&min2,&sec2);

sum_sec = (hour2-hour1)*3600+(min2-min1)*60+sec2-sec1;

hour = sum_sec/3600;

min = (sum_sec-hour*3600)/60;

sec = sum_sec-hour*3600-min*60;

printf("Продолжительность промежутка от %d:%d:%d до

%d:%d:%d\n",hour1,min1,sec1,hour2,min2,sec2);

printf(" равна %d:%d:%d\n",hour,min,sec);

system("pause");

return 0;

}

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

1. Преобразование целых типов со знаком.

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

· Целое со знаком преобразуется к более длинному целому со знаком. Путем размножения знака. То есть все добавленные биты двоичного числа будут заняты тем же числом, которое находилось в знаковом бите: если число было положительным, то это будет, соответственно 0, если отрицательным, то 1.

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

· Преобразование целого со знаком к плавающему типу происходит без потери информации, за исключением случая преобразования типа long int или unsigned long int к типу float, когда точность часто может быть потеряна.

2. Преобразование целых типов без знака.

· Целое без знака преобразуется к более короткому целому без знака или со знаком путем усечения.

· Целое без знака преобразуется к более длинному целому без знака или со знаком путем добавления нулей слева.

· Целое без знака преобразуется к целому со знаком того же размера. Если взять для примера, unsigned short и short – числа в диапазоне от 32768 до 65535 превратятся в отрицательные.

· Целое без знака преобразуется к плавающему типу. Сначала оно преобразуется к значению типа signed long, которое затем преобразуется в плавающий тип.

3. Преобразования плавающих типов.

· Величины типа float преобразуются к типу double без изменения значения.

· Величины double преобразуются к float c некоторой потерей точности, то есть, количества знаков после запятой. Если значение слишком велико для float, то происходит потеря значимости, о чем сообщается во время выполнения.

· При преобразовании величины с плавающей точкой к целым типам она сначала преобразуется к типу long (дробная часть плавающей величины при этом отбрасывается), а затем величина типа long преобразуется к требуемому целому типу. Если значение слишком велико для long, то результат преобразования не определен. Обычно это означает, что на усмотрение компилятора может получиться любой «мусор». В реальной практике с такими преобразованиями обычно сталкиваться не приходится.

Ключевые термины

Базовые типы – это типы данных, которые предопределены стандартом языка, указываются зарезервированными ключевыми словами, характеризуются одним значением и внутренним представлением.

Вещественный тип– это базовый тип данных, который применяется для хранения дробных чисел в формате с плавающей точкой.

Логический (булевый) тип– это базовый тип данных, который применяется для хранения значений двузначной логики.

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

Перечисляемый тип – это производный тип данных, он определяется как набор идентификаторов, являющихся именованными целыми константами, которым приписаны уникальные обозначения

Преобразование типов – это приведение значения переменной одного типа в значение другого типа.

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

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

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

Типы класса – это типы данных, экземплярами которых являются объекты.

Целочисленный тип– это базовый тип данных, который применяется для хранения целых чисел.

Явное приведение типа – это преобразование значения переменной к новому типу, при котором указывается тип переменной, к которому необходимо привести исходную переменную.

Краткие итоги

1.Для организации хранения данных и корректного выполнения операций над ними в языках программирования определены типы данных.

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

3.В языке С++ типы классифицируются на базовые, производные и классы.

4.Для базовых типов определены их подмножества и расширения, что обеспечивает повышение точности расчетов или экономный расход памяти.

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

Набор для практики

Вопросы

1. Почему в языке С++ определена строгая типизация данных, используемых в программе?

2. Как определяются границы диапазона базового типа в зависимости от выделяемой под этот тип памяти?

3. С какой целью в С++ определен тип void?

4. Какой объем памяти выделяется под переменную типа void? Какие значения может принимать переменная типа void?

5. Почему наблюдается асимметрия значений границ диапазонов целочисленных типов?

6. Чему будет равно значение операции инкремента для максимального числа в целочисленном типе? А каков результат декремента для минимального значения в таком же типе?

7. Почему запись целых чисел нельзя начинать с незначащих нулей?

8. Каким образом представлено число ноль в вещественных типах?

9. Почему в С++ символьный тип считается подмножеством целочисленного типа?

10. Каким образом можно инициализировать переменную перечисляемого типа?

11. При преобразовании целого со знаком к целому без знака всегда ли будет получено исходное числовое значение? Ответ обоснуйте.

Упражнения

1.Наберите коды программ из Примеров 1-2. Выполните компиляцию и запуск программ.

2.Найдите сумму первых трех цифр дробной части вещественного числа. Например, для числа 23,16809 она равна 15.

3.Составьте программу вычисления стоимости поездки на автомобиле на дачу (туда и обратно). Исходными данными являются: расстояние до дачи (в километрах); количество бензина, которое потребляет автомобиль на 100 км пробега; цена одного литра бензина. Ниже представлен рекомендуемый вид диалога во время работы программы. Данные, вводимые пользователем, выделены жирным шрифтом.

Вычисление стоимости поездки на дачу.

Расстояние до дачи (км) – 67

Расход бензина (л на 100 км) – 8.5

Цена литра бензина (руб.) – 23.7

Поездка на дачу обойдется в 269 руб. 94 коп.

4.Составьте линейную программу, печатающую значение 1, если указанное высказывание является истинным, и 0– в противном случае. Величина d является корнем только одного из уравнений ах2 + bх + с = 0 и тх + п = 0относительно х.

5.Составьте программу, которая преобразует введенное с клавиатуры дробное число в денежный формат. Например, число 12,348 должно быть преобразовано к виду 12 руб. 35 коп. Ниже представлен рекомендуемый вид диалога во время работы программы. Данные, вводимые пользователем, выделены жирным шрифтом.

Преобразование числа в денежный формат.

Введите дробное число – 23,6

23.6 руб. – это 23 руб. 60 коп.

Литература

1. Керниган, Б. Язык программирования Си / Б. Керниган, Д. Ритчи. – М.: Вильямс, 2007. – 304 с.

2. Подбельский, В.В. Практикум по программированию на языке Си: учеб. пособие / В.В. Подбельский. – М.: Финансы и статистика, 2004. – 576 с.

3. Подбельский, В.В. Программирование на языке Си: учеб. пособие / В.В. Подбельский, С.С. Фомин. – М.: Финансы и статистика, 2004. – 600 с.

4. Подбельский, В.В. Язык Си++: учеб. пособие / В.В. Подбельский. – М.: Финансы и статистика, 2005. – 560 с.

5. Романов, Е.Л. Практикум по программированию на языке С++: учеб. пособие / Е.Л. Романов. – СПб: БХВ-Петербург, 2004. – 432 с.

6. С/С++. Структурное программирование: практикум / Т.А. Павловская, Ю.А. Щупак. – СПб: Питер, 2004. – 239 с.

Краткая аннотация лекции.

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

Цель лекции: изучить подставляемые (встраиваемые) функции и перегрузки функций, научиться разрабатывать программы с использованием перегрузки функций на языке C++.

Текст лекции.

Подставляемые функции

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

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

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

Подставляемые или встраиваемые (inline) функции – это функции, код которых вставляется компилятором непосредственно на место вызова, вместо передачи управления единственному экземпляру функции.

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

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

Например:

/*функция возвращает расстояние от точки с координатами(x1,y1) до точки с координатами (x2,y2)*/

inline float Line(float x1,float y1,float x2, float y2) {

return sqrt(pow(x1-x2,2)+pow(y1-y2,2));

}

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

Пример 1.

#include "stdafx.h"

#include <iostream>

using namespace std;

inline int Cube(int x);

int _tmain(int argc, _TCHAR* argv[]){

int x=2;

float y=3;

double z=4;

cout<<Cube(x)<<endl;

cout<<Cube(y)<<endl;

cout<<Cube(z)<<endl;

system("pause");

return 0;

}

inline int Cube(int x) {

return x*x*x;

}

Перечислим причины, по которым функция со спецификатором inline будет трактоваться как обычная не подставляемая функция:

· подставляемая функция является рекурсивной;

· функции, у которых вызов размещается до ее определения;

· функции, которые вызываются более одного раза в выражении;

· функции, содержащие циклы, переключатели и операторы переходов;

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

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

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

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

При определении функций в программах необходимо указывать тип возвращаемого функцией значения, а также количество параметров и тип каждого из них. Если на языке С++ была написана функция с именем add_values, которая работала с двумя целыми значениями, а в программе было необходимо использовать подобную функцию для передачи трех целых значений, то тогда следовало бы создать функцию с другим именем. Например, add_two_valuesи add_three_values. Аналогично, если необходимо использовать подобную функцию для работы со значениями типа float, то нужна еще одна функция с еще одним именем. Чтобы избежать дублирования функции, C++ позволяет определять несколько функций с одним и тем же именем. В процессе компиляции C++ принимает во внимание количество аргументов, используемых каждой функцией, и затем вызывает именно требуемую функцию. Предоставление компилятору выбора среди нескольких функций называется перегрузкой.

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

Перегрузка функций также называется полиморфизмом функций. «Поли» означает много, «морфе» – форма, то есть полиморфическая функция – это функция, отличающаяся многообразием форм.

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

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

Например, следующая программа перегружает функцию с именем add_values. Первое определение функции складывает два значения типа int. Второе определение функции складывает три значения типа int. В процессе компиляции C++ корректно определяет функцию, которую необходимо использовать:

#include "stdafx.h"

#include <iostream>

using namespace std;

int add_values(int a,int b);

int add_values (int a, int b, int c);

int _tmain(int argc, _TCHAR* argv[]){

cout << "200+801=" << add_values(200,801) << "\n";

cout << "100+201+700=" << add_values(100,201,700) << "\n";

system("pause");

return 0;

}

int add_values(int a,int b) {

return(a + b);

}

int add_values (int a, int b, int c) {

return(a + b + c);

}

Таким образом, программа определяет две функции с именами add_values. Первая функция складывает два значения, в то время как вторая складывает три значения одного типа int. Компилятор языка С++ определяет, какую функцию следует использовать, основываясь на предлагаемых программой параметрах.

Использование перегрузки функции

Одним из наиболее общих случаев использования перегрузки является применение функции для получения определенного результата, исходя из различных параметров. Например, предположим, что в программе есть функция с именем day_of_week, которая возвращает текущий день недели (0 для воскресенья, 1 для понедельника, ... , 6 для субботы). Программа могла бы перегрузить эту функцию таким образом, чтобы она верно возвращала день недели, если ей передан юлианский день в качестве параметра, или если ей переданы день, месяц и год.

int day_of_week(int julian_day) {

// операторы

}

int day_of_week(int month, int day, int year) {

// операторы

}

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

int имя_функции(int имя_аргумента);

int имя_функции(int имя_аргумента);

/*недопустимая перегрузка имени: аргументы имеют одинаковое количество и одинаковый тип*/

Преимущества перегрузки функции:

· перегрузка функций улучшает удобочитаемость программ;

· перегрузка функций C++ позволяет программам определять несколько функций с одним и тем же именем;

· перегруженные функции возвращают значения одинакового типа, но могут отличаться количеством и типом параметров;

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

Пример 2.

/*Перегруженные функции имеют одинаковые имена, но разные списки параметров и возвращаемые значения*/

#include "stdafx.h"

#include <iostream>

using namespace std;

int average(int first_number, int second_number, int third_number);

int average(int first_number, int second_number);

int _tmain(int argc, _TCHAR* argv[]){// главная функция

int number_A = 5, number_B = 3, number_C = 10;

cout << "Целочисленное среднее чисел " << number_A << " и ";

cout << number_B << " равно ";

cout << average(number_A, number_B) << ".\n\n";

cout << "Целочисленное среднее чисел " << number_A << ", ";

cout << number_B << " и " << number_C << " равно ";

cout << average(number_A, number_B, number_C) << ".\n";

system("PAUSE");

return 0;

}// конец главной функции

/*функция для вычисления целочисленного среднего значения 3-х целых чисел*/

int average(int first_number, int second_number, int third_number ) {

return((first_number + second_number + third_number)/3);

} // конец функции

/*функция для вычисления целочисленного среднего значения 2-х целых чисел*/

int average( int first_number, int second_number ) {

return((first_number + second_number)/2);

} // конец функции

Пример 3.

/*Перегруженные функции имеют одинаковые имена и типы возвращаемых значений, но разные типы параметров*/

#include "stdafx.h"

#include <iostream>

using namespace std;

#include<stdio.h>

float average(int first_number, int second_number,

int third_number );

float average(float first_number, float second_number,

float third_number);

int _tmain(int argc, _TCHAR* argv[]){

int A = 5, B = 3, C = 10;

float A1 = 5.1, B1 = 3.4, C1 = 10.5;

printf("Среднее значение 3-х целых чисел = %f\n",

average(A,B,C)/3.0);

printf("Среднее значение 3-х вещественных чисел = %f\n",

average(A1,B1,C1)/3.0);

system("pause");

return 0;

}

/*функция для вычисления среднего значения 3-х целых чисел*/

float average(int first_number, int second_number,

int third_number ) {

return ((first_number + second_number + third_number));

}

/*функция для вычисления среднего значения 3-х веществен-ных чисел*/

float average(float first_number, float second_number,

float third_number) {

return ((first_number + second_number + third_number));

}

Ключевые термины

Внутреннее связывание – это подстановка компилятором вместо вызова функции команд ее кода.

Перегрузка функций – это создание нескольких функций с одним именем, но с разными параметрами.

Подставляемые или встраиваемые (inline) функции – это функции, код которых вставляется компилятором непосредственно на место вызова, вместо передачи управления единственному экземпляру функции.

Полиморфизм функций – это перегрузка функций.

Краткие итоги

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

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

3.Ограничения на выполнение подстановки в основном зависят от реализации.

4.В С++ реализован полиморфизм функций, заключающийся в объявлении функций с одинаковыми именами, но разными параметрами.

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

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

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

Набор для практики

Вопросы

1. Чем отличается механизм вызова встраиваемой и обычной пользовательских функций?

2. На каком этапе выполнения программы происходит встраивание кода подставляемой функции?

3. Почему не рекомендуется встраивать функции с большим кодом?

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

5. С какой целью в программировании реализован полиморфизм функций?

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

7. Могут ли перегруженные функции возвращать результат одного типа? Ответ обоснуйте.

Упражнения

1.Наберите коды программ из Примеров 1–3. Выполните компиляцию и запуск программ.

2.Составьте программу для решения задачи. Определите значение

Целочисленный (целый) тип данных (тип int) - student2.ru ,

где max(x, у)есть максимальное из чисел x, у. Разработайте функции нахождения максимального из двух целых и вещественных чисел.

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

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

5.Составьте программу, которая в зависимости от входных данных переводит часы и минуты в минуты или минуты – в часы и минуты. Используйте перегруженные функции. Например, при вводе 134 мин будет выдано значение 2 час 14 мин, а при вводе 2 час 14 мин – значение 134 мин.

Литература

1. Керниган, Б. Язык программирования Си / Б. Керниган, Д. Ритчи. – М.: Вильямс, 2007. – 304 с.

2. Подбельский, В.В. Практикум по программированию на языке Си: учеб. пособие / В.В. Подбельский. – М.: Финансы и статистика, 2004. – 576 с.

3. Подбельский, В.В. Программирование на языке Си: учеб. пособие / В.В. Подбельский, С.С. Фомин. – М.: Финансы и статистика, 2004. – 600 с.

4. Подбельский, В.В. Язык Си++: учеб. пособие / В.В. Подбельский. – М.: Финансы и статистика, 2005. – 560 с.

5. Романов, Е.Л. Практикум по программированию на языке С++: учеб. пособие / Е.Л. Романов. – СПб: БХВ-Петербург, 2004. – 432 с.

6. С/С++. Структурное программирование: практикум / Т.А. Павловская, Ю.А. Щупак. – СПб: Питер, 2004. – 239 с.

Краткая аннотация лекции.

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

Цель лекции: изучить понятия рекурсии, рекурсивные функции в программировании, приемы построения рекурсивной триады при решении задач, научиться применять рекурсивные методы в решении задач на языке С++.

Текст лекции.

В окружающем нас мире часто можно встретить объекты, обладающие самоподобием. То есть часть большого объекта в чем-то сходна с самим объектом. Например, ветка дерева повторяет форму и характер ветвления, схожие с самим деревом. Приведенные ниже графические объекты также обладают самоподобием (рис. 1). Такие объекты называются рекурсивными.

Целочисленный (целый) тип данных (тип int) - student2.ru Целочисленный (целый) тип данных (тип int) - student2.ru Целочисленный (целый) тип данных (тип int) - student2.ru Целочисленный (целый) тип данных (тип int) - student2.ru

Целочисленный (целый) тип данных (тип int) - student2.ru Целочисленный (целый) тип данных (тип int) - student2.ru Целочисленный (целый) тип данных (тип int) - student2.ru

Рис 1. Рекурсивные графические объекты

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

Наши рекомендации