Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТП_ЛабРаботы.doc
Скачиваний:
13
Добавлен:
28.09.2019
Размер:
716.8 Кб
Скачать

Описание примера

Внутри главной функции (main) объявлены два статических массива переменных типа float по 10 элементов в каждом. Статически размещаемые (в стеке) массивы переменных описываются с помощью квадратных скобок, в которых указывается необходимое количество элементов массива. Индекс первого элемента массива равен нулю, последнего - числу элементов минус один. В нашем случае первым элементом массива является х[0], последним - х[9].

Далее идет вызов вспомогательной функции in, которая вынуждает пользователя ввести целое число в диапазоне, заданном двумя входными параметрами (min, max). Таким образом, в цикле while мы требуем от пользователя ввести целое число (число точек зависимости у = f(x)), удовлетворяющее нашим ограничениям. Если пользователь ввел неподходящее число, то тело цикла будет повторено. Момент, когда пользователь введет допустимое значение, заранее неизвестен. Именно в таких случаях удобно использовать цикл while.

В файле conio.h содержатся прототипы библиотечных функций ввода с клавиатуры и вывода на экран в текстовом режиме монитора. Клавиатура и дисплей и совокупности обозначаются термином "консоль" (console), поэтому принято говорить о вводе с консоли. Функция getch служит для ввода одного символа с консоли. Таким образом осуществляется задержка в выполнении программы и ожидание реакции пользователя на программное сообщение. Это не очень надежный способ, но он достаточно распространен среди программистов ввиду своей простоты. Вызов fflush(stdin), очищает буфер ввода, что повышает надежность работы scanf при ошибочных попытках ввода. Конструкция

if (!getch()) getch();

дает пользователю время для восприятия сообщения и работает несколько надежнее, чем просто getch();. Функция getch выбирает один байт из входного потока stdin, оставляя в буфере ввода второй байт, если он был. Служебные символы, в отличие от обычных, дают двухбайтный код с нулевым первым байтом. Оператор if (!getch()) getch()), "съедает" содержимое буфера ввода, даже если пользователь нажмет клавишу служебною символа. Именно это обстоятельство используется при вычислении условия if(!getch()). Рассмотренный трюк действует только при компиляции программы для платформы DOS, так как Windows перехватывает и сама обрабатывает служебные символы.

Если известно заранее, сколько раз надо повторять цикл, то удобно применять цикл for:

for (i=0; i<n; i++)

Цикл for является очень мощным, гибким и часто используемым опера­тором языка С++. Прежде всего, обратите внимание на наличие трех групп в заголовке цикла for( ; ; ). Они разделены точкой с занятой. В первой группе заголовка могут быть пере­числены через запятую операторы, которые следует выполнить до входа в цикл, то есть один раз. Во второй части указывается условие продолжения цикла. В третьей группе перечисляются операторы, выполняемые в конце цикла (много раз). После заголовка следует тело цикла. Но выполняется оно до операторов третьей груп­пы. Здесь справедливо вышеупомянутое правило: если в теле более одного опе­ратора, то оно должно быть заключено в блок, ограниченный фигурными скоб­ками. Тело цикла может быть игнорировано (не выполнено ни разу), если условие нарушено при первом же входе в цикл. Условие продолжения проверяется до выполнения операторов тела цикла. Следует не пожалеть времени и хорошо за­помнить последовательность выполнения операторов при реализации цикла:

  1. Операторы первой части заголовка (выполняются один раз до входа в цикл).

  2. Вторая часть (проверка условия и выход из цикла в случае его нарушения).

  3. Операторы тела цикла.

  4. Операторы третьей части заголовка.

  5. Переход к пункту 2.

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

В нашем примере этот цикл используется для ввода пользователем координат точек, число которых он сам определил. Мы помогаем пользователю, выводя подсказки в виде х[1]= и т. д. Для удобства восприятия мы опускаем, что на самом деле элементы массива именуются х[0], х[1], .. ,х[n-1].

Функция scanf предназначена для форматируемого ввода из потока stdin, который по умолчанию закреплен за клавиатурой. Аргумент "%d" указывает, что ожидается целое число в десятичной форме. Второй аргумент &n означает, что в функцию scanf передается адрес переменной int n, как она (функция scanf) того и требует. Благодаря этому scanf в состоянии изменить содержимое по переданному адресу, то есть значение переменной n.

Переменная bad сразу же инициализирована значением true с тем, чтобы последующий цикл while не закончился, не успев начаться. Цикл while (bad) {...} продолжается до тех пор, пока выражение и круглых скобках (условие продолжения цикла) не равно нулю (false) или пока оно равно единице (true). Тело цикла ограничено фигурными скобками, которые были бы не нужны, если бы в теле цикла присутствовал только один оператор. Строка программы bad = n<0 || n>10; присваивает переменной bad значение true либо false в зависимости от истинности или ложности логического выражения справа. Символы || означают операцию логического ИЛИ. Операндами бинарной операции || в нашем случае являются результаты двух сравнений: n<0, n>10. Если хотя бы одно из неравенств справедливо, то bad будет присвоено значение true. Условный оператор if (bad) {...} либо выполняет операторы в фигурных скобках (если значение bad не ноль (или true), либо не выполняет их в случае нулевого (или false) значения bad. Фигурные скобки не нужны, если ветвь условного оператора содержит только один оператор, хотя бы и сложный.

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

В функциях printf и scanf спецификаторы %d, %f, %5.2f определяют формат, в котором выводится число или ожидается вводимое число. Например, оператор

printf(". .%d. .%f. .",i,а);

следует интерпретировать так. Любой текст, обозначенный точками, выводится так, как он есть. Вместо %d подставляется числовое значение первого параметра из списка, следующего за второй закрывающей двойной кавычкой, то есть значение переменной i. Далее опять выводится текст, стоящий в строке между %d и %f, затем вместо %f подставляется числовое значение следующей переменной из списка, то есть переменной а, и т. д. Спецификатор формата %f используется для переменных типов float и double, спецификатор %d - для целых чисел.

В операторе scanf ("%f", &x[i]); & в данном контексте означает операцию взятия адреса. Адрес 1-го элемента массива х[] передается в функцию scanf, которая записывает по этому адресу значение числа, введенное пользователем с консоли. В случае ошибочного ввода реакция программы зависит только от возможностей библиотечной процедуры scanf. Такое положение вещей не всегда устраивает разработчика ПО, поэтому он часто включает свои собственные проверки введенной информации на удовлетворение разумным ограничениям. Реакция на ошибочные действия пользователя тоже часто ложится на плечи программиста. В результате почти всегда объем кода, обеспечивающего надежный интерфейс "пользователь-программа", превышает объем кода, производящего полезные вычисления.

Существует еще один тип цикла:

do {тело цикла} while(условие повторения); //Повторяется пока условие != 0 (т.е. true)

Тело цикла do {...} while (); обязательно выполнится хотя бы один раз, так как решение о продолжении цикла принимается после каждого прохода (выпол­нения операторов тела цикла).

Во всех типах циклов фигурные скобки можно опустить, если тело цикла со­держит лишь один оператор.