Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015

Тут можно читать онлайн Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - бесплатно полную версию книги (целиком) без сокращений. Жанр: Прочая старинная литература, издательство Вильямс, год 0101. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.

Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание

Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - описание и краткое содержание, автор Стивен Прата, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)

Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать книгу онлайн бесплатно, автор Стивен Прата
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

234 Глава 6

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

Введите 10 результатов игры в гольф:

99 95 109 105 100

96 98 93 99 97 98

Введены следующие результаты:

99 95 109 105 100 96 98 93 99 97

Сумма результатов = 991, среднее значение = 99.10

Полученный гандикап равен 27.

Программа работает, поэтому приступим к исследованию деталей. Прежде всего, обратите внимание, что хотя в примере было набрано 11 чисел, прочитались только 10 из них, т.к. цикл чтения считывает только 10 значений. Поскольку функция scanf() пропускает пробельные символы, можно вводить в одной строке все 10 чисел, вводить каждое число в отдельной строке либо, как в рассматриваемом случае, для разделения значений воспользоваться смесью символов новой строки и пробела. (Из-за буферизации ввода числа передаются в программу только после нажатия клавиши .)

Работать с массивами и циклами гораздо удобнее, чем применять 10 операторов scanf() и 10 операторов printf() для чтения и вывода 10 результатов. Цикл for предлагает простой и прямолинейный способ использования индексов массива. Следует отметить, что элемент массива int обрабатывается подобно переменной типа int. Для чтения переменной fue типа int nрименялся бы вызов scanf ("%d", &fue). В листинге 6.19 считывается элемент score [index] типа int, поэтому используется вызов scanf("%d", &score[index]) .

В данном примере проиллюстрировано несколько аспектов, касающихся стиля программирования. Во-первых, применение директивы #define для создания символической константы (SIZE), указывающей размер массива, является хорошей идеей. Эта константа используется в определении массива и при установке пределов в циклах. Если позже понадобится расширить программу для обработки 20 результатов, достаточно просто переопределить константу SIZE, сделав ее равной 20. Вам не придется изменять каждую часть программы, в которой участвует размер массива. Во-вторых, конструкция

for (index = 0; index < SIZE; index++)

удобна для обработки массива с размером SIZE. Очень важно указывать правильные пределы массива. Первый элемент имеет индекс 0, и цикл начинается с установки index в 0. Поскольку нумерация начинается с 0, индексом последнего элемента является SIZE - 1. То есть десятый элемент массива — это score [9]. Условие проверки index < SIZE обеспечивает это, делая последним применяемым значением index величину SIZE - 1.

В-третьих, в программах рекомендуется выводить на экран значения, которые были только что прочитаны (для эхо-контроля). Это помогает удостовериться в том, что программа обрабатывает именно те данные, которые ожидаются.

Наконец, в-четвертых, обратите внимание на использование в листинге 6.19 трех отдельных циклов for. Вас может интересовать, действительно ли это необходимо. Можно ли объединить некоторые из операций в один цикл? Да, вы могли бы поступить так. Программа стала бы компактнее. Однако это противоречило бы принципу модульности. Идея, лежащая в основе этого термина, заключается в том, что программа должна быть разбита на отдельные модули, и каждый модуль должен решать одну задачу. Это облегчает чтение профаммы. Но что вероятно даже важнее — модульность

Управляющие операторы С: циклы 235

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

Пример цикла, использующего возвращаемое значение функции

В последнем примере этой главы применяется функция, которая вычисляет результат возведения числа в целую степень. (Для решения более сложных числовых задач в библиотеке math.h предлагается более мощная функция pow(), которая позволяет указывать степени с плавающей запятой.) Тремя главными задачами, которые решаются в этом упражнении, являются: разработка алгоритма вычисления ответа, представление этого алгоритма в виде функции, возвращающей ответ, и предоставление удобного способа тестирования этой функции.

Сначала давайте обратимся к алгоритму. Мы сохраним функцию простой, ограничив ее положительными целочисленными степенями. Тогда для возведения числа n в степень р переменную n нужно просто умножить на саму себя р раз. Это совершенно естественная задача для цикла. Вы можете установить переменную pow в 1, после чего многократно умножать ее на п:

for(i =1; i <= р; i ++) pow *= n;

Вспомните, что операция *= приводит к умножению левой части выражения на правую часть. После первой итерации цикла pow имеет значение 1, умноженное на n, т.е. n. После второй итерации переменная pow равна ее предыдущему значению (n), умноженному на n, или n в квадрате, и т.д. В этом контексте цикл for является вполне естественным, потому что цикл выполняется заранее известное (после того, как становится известным р) количество раз.

Теперь, когда построен алгоритм, мы можем решить, какие типы данных использовать. Показатель степени р, будучи целочисленным, должен иметь тип int. Чтобы обеспечить достаточный диапазон значений для переменной пи ее степеней, выберем для переменных n и pow тип double.

Давайте далее обдумаем, как оформить функцию. Нам необходимо предоставить функции два значения, а она должна возвратить одно значение. Чтобы передать функции необходимую информацию, можно определить два аргумента, один типа double и один типа int, указывающие число и степень. Как обеспечить возвращение функцией значения в вызывающую программу? Для написания функции с возвращаемым значением выполните следующие действия.

1. При определении функции установите тип значения, которое она возвращает.

2. С помощью ключевого слова return укажите возвращаемое значение.

Например, можно поступить следующим образом:

double power(double n, int p) // возвращает тип double

{

double pow = 1; int i;

for (i = 1; i <= p; i + +) pow *= n;

return pow; // возвратить значение переменной pow

}

236 Глава 6

Чтобы объявить возвращаемый тип функции, предварите этим типом имя функции, как это делается при объявлении переменной. Ключевое слово return заставляет функцию возвратить в вызывающую функцию значение, указанное после return. Здесь функция возвращает значение переменной, но она может также возвращать значения выражений. Например, следующий оператор вполне допустим:

return 2 * х + b;

Функция вычислит значение выражения и возвратит его. В вызывающей функции возвращаемое значение может быть присвоено другой переменной, использовано как значение выражения, передано в качестве аргумента другой функции (как в printf("%f", power(6.28, 3))) или просто проигнорировано.

Теперь давайте применим функцию в программе. При тестировании функции было бы удобно располагать возможностью передачи этой функции нескольких значений, чтобы увидеть, как она реагирует. Это предполагает настройку цикла ввода. Естественным вариантом является цикл while. Функцию scanf() можно использовать для ввода двух значений одновременно. Если функция scanf() успешно прочитает два значения, она возвратит 2, поэтому циклом можно управлять, сравнивая возвращаемое значение scanf() со значением 2. Еще один момент: чтобы воспользоваться функцией power() в программе, ее понадобится объявить, как вы объявляете применяемые в программе переменные. Окончательная программа приведена в листинге 6.20.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Стивен Прата читать все книги автора по порядку

Стивен Прата - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Язык программирования C. Лекции и упражнения (6-е изд.) 2015 отзывы


Отзывы читателей о книге Язык программирования C. Лекции и упражнения (6-е изд.) 2015, автор: Стивен Прата. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x