ИСПОЛЬЗОВАНИЕ НАШИХ ЗНАНИЙ О ФУНКЦИЯХ

ИСПОЛЬЗОВАНИЕ НАШИХ ЗНАНИЙ О ФУНКЦИЯХ

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

     Что вы скажете насчет функции возведения в степень, которая дает возможность возводить 2 в 5-ю степень или 3 в 3-ю и т. д.? Во-первых, необходимо решить, что будет служить входом программы. Это понятно: Cи требуется знать число, возводимое в степень, и показатель степени. Достичь этого можно путем введения двух аргументов:

powеr(base, exp)

int base, exp;

(Мы ограничились здесь целыми числами, а также тем предположением, что результат будет сравнительно невелик.)

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

rеturn(answcr);

Теперь для получения требуемого результата выберем алгоритм:

     установим переменную answer равной 1,

     умножим answer на base столько раз, сколько указывает exp.

Возможно, не совсем ясно, как осуществить второй шаг, поэтому разобьем его дальше на более мелкие шаги:

     умножим answer на base и уменьшим на 1, остановимся, когда exp станет равной 0.

     Если значение exp равно, скажем 3, тогда использование такого алгоритма приведет к трем умножениям; поэтому данный способ кажется вполне разумным.

Очень хорошо. Выразим теперь этот алгоритм в виде программы на языке Си.

/* возводит основание в степень */

power(base, exp)

int base, exp;

{

int answer;

for (answer = 1; exp > 0; exp--)

        answer = answer* base;

return(answer);

}

Теперь проверим ее работу с помощью драйвера.

/* проверка возведения в степень */

main( )

{

int x;

х= power(2,3);

printf(" %d ", x);

x = power(-3,3);

prinif(" %d ", x);

x = power(4, -2);

printf(" %d ", x);

x = power(5, 10);

printf(" %d ", x);

}

Объединим указанные две функции, проведем компиляцию и выполним данную программу. Результаты оказываются следующими:

8

-27

1

761

Итак, 2 в 3-й степени - это 8, а - 3 в 3-й равно -27. Пока все правильно. Но 4 в степени -2 равно 1/16, а не 1. А 5 в 10-й степени, если память нам не изменяет,- это 9 765 625. В чем дело? Во-первых, программа не предназначалась для обработки отрицательных степеней, поэтому она и не смогла справиться с этой задачей. Во-вторых, в нашей системе величины типа int не могут превосходить 65 535.

     Можно расширить программу путем включения в нее обработки отрицательных степеней и использования чисел с плавающей точкой для представления переменных base и answer. В любом случае показатель степени должен выражаться целым числом, потому что это число выполняемых умножений; нельзя произвести 2,31 умножения.

/* возводит основание в степень*/

double powеr(base, еxp)

double, base;

int exp;

{

 double answer;

if(exp > 0)

{

for(answer = 1.0; exp >        0; exp --) answer * = base;

return(answer);

}

 else if(base != 0)

{

 for(answer = 1.0; exp        < 0; exp++ ) answer /= base;

return(answer);

}

 else /* base = 0 иеxp <= 0 */

{

 printf(" Нельзя возводить 0 в %d стeпень! ", exp);

return(0);

 }

}

     Необходимо отметить здесь несколько моментов.

Первый: самым главным является то, что мы должны описать тип функции! Переменная answer имеет тип double, следовательно, сама функция power() тоже должна быть типа double, так как ей присваивается величина, возвращаемая оператором return. Почему, спросите вы, мы не описывали тип функции раньше? Дело в том, что по умолчанию в языке Си функция имеет тип int (для большинства функций это так), если не указано что-то иное.

Второй: мы хотели показать, что не забыли те новые операции присваивания, которые ввели в гл. 8.

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

     Мы можем воспользоваться тем же драйвером при условии, что тип функции power( ) там тоже описан.

/* проверка возведения в степень*/

main( )

{

double x;

double power( ); /* это пример oписания  функции */

x = power(2.0, 3);

printf(" %.0f ", x);x = power(-3.0, 3);

printf(" %.0f " , x);x = power(4.0, -2);

printf(" %.4f ", x);x = power(5.0, 10);

print f ("%.0f ", x);

}

На этот раз результаты работы программы выглядят вполне удовлетворительно.

8

-27

0.0625

9765625

Данный пример побуждает нас ввести следующий короткий раздел.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

3.3.2. База знаний системы

Из книги Прикладное программное обеспечение: системы автоматической обработки текстов автора Мальковский Михаил Георгиевич

3.3.2. База знаний системы Контроль текста, осуществляемый системой ЛИНАР, основывается на использовании знаний о том, что такое правильный, хороший текст. Совокупность этих знаний называется контролирующими знаниями, или К-знаниями. При формировании К-знаний учитывались


ОПЫТЫ Генетика наших дней: «Пленочные» объективы еще послужат…

Из книги Журнал «Компьютерра» № 35 от 26 сентября 2006 года автора Журнал «Компьютерра»

ОПЫТЫ Генетика наших дней: «Пленочные» объективы еще послужат… Автор: Кирилл ГалушковНовейшая история знает немало примеров удачного скрещивания «ужа и ежа»: смартфоны, часы с проигрывателем, тапочки с подогревом от USB, холодильник с выходом в Интернет, телефон с


Это в наших руках

Из книги Все под контролем: Кто и как следит за тобой автора Гарфинкель Симеон

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


База знаний

Из книги Документация NetAMS автора Автор неизвестен

База знаний Веб–интерфейс Admintool ВНИМАНИЕ!Admintool не избавляет вас о необходимости начального создания и настройки конфигурационного файла NeTAMS. С его помощью можно лишь управлять параметрами уже существующих юнитов в плане настройки IP–адресов, квот, параметров логинов и


Как избежать дублирования в константных и неконстантных функциях-членах

Из книги Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ автора Мейерс Скотт

Как избежать дублирования в константных и неконстантных функциях-членах Использование mutable – замечательное решение проблемы, когда побитовая константность вас не вполне устраивает, но оно не устраняет всех трудностей, связанных с const. Например, представьте, что operator[] в


Специальный подарок для наших читателей – бесплатный видеокурс «Mini-MBA: Продажи»

Из книги Удвоение продаж в интернет-магазине автора Парабеллум Андрей Алексеевич

Специальный подарок для наших читателей – бесплатный видеокурс «Mini-MBA: Продажи» Если вы давно мечтали пройти курс MBA, но вас отпугивала безумная цена этого курса – заплатить от 10 до 50 тысяч долларов может не каждый, – то сейчас у вас есть уникальный шанс.Мы, Андрей


Специальное предложение для наших читателей!

Из книги Социальные сети [Источники новых клиентов для бизнеса] автора Парабеллум Андрей Алексеевич

Специальное предложение для наших читателей! Если вы давно думаете – с какой стороны правильнее подойти к социальным сетям, как использовать их для дополнительного дохода, то сейчас у вас есть шанс!Мы, Николай Мрочковский, Андрей Парабеллум и Владимир Калаев, проведем


Специальный подарок для наших читателей № 1 – бесплатный видеокурс Mini-MBA: продажи

Из книги Цифровой журнал «Компьютерра» № 166 автора Журнал «Компьютерра»

Специальный подарок для наших читателей № 1 – бесплатный видеокурс Mini-MBA: продажи Если вы давно мечтали пройти курс MBA, но вас отпугивала безумная цена этого курса – заплатить 10 000-20 00050 000 долларов может отнюдь не каждый, – то сейчас у вас есть шанс.Мы – Андрей Парабеллум и


Как Apple составит карты наших домов, и почему мы с радостью на это согласимся Андрей Письменный

Из книги Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform автора Кёртен Роб

Как Apple составит карты наших домов, и почему мы с радостью на это согласимся Андрей Письменный Опубликовано 29 марта 2013Новости о том, что какая-то из крупных компаний потратила энную сумму денег, чтобы присоединить к себе очередной стартап, настолько привычны, что им редко


Замечания о функциях установления соединения

Из книги Цифровой журнал «Компьютерра» № 183 автора Журнал «Компьютерра»

Замечания о функциях установления соединения Перед тем как углубиться в отдельные сообщения, однако, есть смысл подчеркнуть, что для всех функции установления соединения структура сообщений идентична (взято из <sys/iomsg.h>, с небольшими изменениями):struct _io_connect { // Для


ИТ как разжижитель мозгов и убийца наших детей Сергей Голубицкий

Из книги Антимозг [Цифровые технологии и мозг] автора Шпитцер Манфред

ИТ как разжижитель мозгов и убийца наших детей Сергей Голубицкий Опубликовано 26 июля 2013 Сегодня утром за завтраком мой сын по привычке забивал мне баки феноменальным информационным мусором: сойка убивает воробьев и синиц, поёт чужими голосами и


Речь идет о наших детях

Из книги Домены. Все, что нужно знать о ключевом элементе Интернета автора Венедюхин Александр

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


Предисловие Домены древности и наших дней

Из книги Взрыв обучения: Девять правил эффективного виртуального класса автора Мердок Мэттью

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


Понятие о функциях

Из книги автора

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