94 Л. Ф 04. ИЗМЕНЕНИЕ ЛИНЕЙНОГО ПОРЯДКА ВЫПОЛНЕНИЯ ОПЕРАТОРОВ. УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ. ОРГАНИЗАЦИЯ ЦИКЛОВ 1. НЕОБХОДИМОСТЬ РАЗВЕТВЛЕНИЙ В ПРОГРАММЕ В программах, за исключением простейших, порядок выполнения операторов, как правило, изменяется. Эта особенность компьютерной программы предусмотрена в фундаментальных принципах устройства и работы компьютера как универсальной и эффективной машины для обработки информации, которые разработаны фон Нейманом. Принципы работы: С помощью внешнего устройства в память компьютера вводится программа. Устройство управления считывает содержимое ячейки памяти, где находится первая инструкция (команда) программы и организует ее выполнение; это могут быть арифметические, логические операции, чтение из памяти данных, запись результатов в память, ввод/вывод данных из памяти на внешнее устройство. После выполнения команды возможны две ситуации: переход к выполнению команды из следующей ячейки памяти, либо выполнение команды передачи управления (перехода). Эта команда указывает устройству управления, что следует перейти к некой другой ячейке памяти и продолжить выполнение программы с команды, содержащейся в этой ячейке. Такая возможность передачи управления позволяет использовать в программе одни и те же последовательности команд много раз, т.е. организовывать циклы вычислений. Изменение линейного порядка может происходить в зависимости от каких-то условий либо без всяких условий с целью создания компактной программы. 2. ПРОСТЕЙШИЕ ОПЕРАТОРЫ УСЛОВНОГО И БЕЗУСЛОВНОГО ПЕРЕХОДА Перейти к оператору с меткой n можно без всяких условий. Оператор безусловного перехода имеет вид GO TO n Здесь n - метка оператора. Правило выполнения: следующим выполняется оператор с меткой n. Пример: GOTO 100 Условный арифметический оператор имеет следующий вид IF(A)n1,n2,n3 Здесь А — арифметическое выражение целого или вещественного типа, n1,n2,n3 В.Б. Альгин «Курс лекций по компьютерной информатике» 95 — метки операторов. Две метки из трех могут совпадать. Правило выполнения: если A < 0, то следующим выполняется оператор с меткой n1, если A = 0, то выполняется оператор с меткой n2, если A > 0, то выполняется оператор с меткой n3. Примеры: IF(X+Y-7.5)10,20,30 IF(I-N)10,10,20 3. УСЛОВНЫЕ ЛОГИЧЕСКИЕ ОПЕРАТОРЫ Условный логический оператор имеет вид IF(L)S Здесь L — логическое выражение, a S — оператор. Правило выполнения: если логическое выражение L истинно, то выполняется оператор S, а если оно ложно, то выполняется следующий за IF оператор, a S не выполняется. Примеры: IF(L.LE.N) GOTO 10 IF(X**2+Y**2.LE.R**2) A=1 Следующий оператор является обобщением предыдущего. Структурный оператор IF имеет вид IF(L)THEN S1 S2 END IF Здесь L - логическое выражение, S1,S2,…— операторы, которых может быть любое количество. Правило выполнения: если логическое выражение L — истинно, то выполняются операторы S1,S2,.., а если оно ложно, то выполняется следующий после END IF оператор. Пример: IF(L)THEN F=SIN(X) F1=X**2+5*X END IF Блочный оператор IF (оператор IF THEN ELSE) имеет вид IF(L)THEN операторы 1 ELSE операторы 2 END IF Правило выполнения: если логическое выражение L истинно, то выполняются < операторы 1 >, а если оно ложно, то выполняются < операторы 2 >. Пример. Рассмотрим программу вычисления недельной зарплаты, обознаВ.Б. Альгин «Курс лекций по компьютерной информатике» 96 чаемой переменной PAY [1]. Пусть оплата часа работы при общей рабочей неделе, не превышающей 40 часов, задается переменной RATE. Если рабочая неделя превышает 40 часов, то каждый сверхурочный час оплачивается в полуторном размере. Тогда, задавая время работы в неделю TIME и значение RATE можно записать следующую программу. READ(*,*)RATE, TIME IF(TIME.GT.40)THEN ТТ=Т1МЕ-40.0 PAY=40*RATE PAY=PAY+1.5*RATE*TT ELSE PAY=RATE*TIME END IF WRITE(*,*)PAY STOP END 4. ЦИКЛЫ Часто в программе необходимо “циклить”, т.е. многократно повторять блок одних и тех же операторов. Использование повторяющегося блока можно организовать с помощью операторов управления. Однако во всех современных языках программирования для организации подобных циклических процедур используются специальные конструкции, называемые циклами. Операторы цикла предназначены для многократного выполнения операторов (тело цикла), находящихся между заголовком оператора DO и оператором CONTINUE с меткой или оператором ENDDO. Оператор CONTINUE не порождает каких-либо команд и используется для завершения оператора цикла или для ссылок в программе. В качестве оператора, завершающего тело цикла, можно использовать оператор END DO. В этом случае в заголовке цикла не указывается метка, а вместо оператора CONTINUE записывается END DO. 4.1. Цикл с шагом Конструкция цикла DO с шагом имеет вид: DО n i=ml,m2,m3 DО i=ml,m2,m3 Тело цикла Тело цикла n CONTINUE END DO Здесь n - метка последнего оператора тела цикла (оператора CONTINUE); i переменная целого, вещественного или вещественного двойной точности типа, которая называется параметром цикла, ml, m2, m3 - константы, переменные или арифметические выражения целого, вещественного или вещественного двойной точности типов. После метки n может стоять необязательная запятая. Величина ml определяет начальное значение параметра цикла, m2 — конечное В.Б. Альгин «Курс лекций по компьютерной информатике» 97 значение параметра цикла, а m3 — шаг или приращение. Правило выполнения: Оператор DO автоматически исполняет все операторы до оператора CONTINUE с меткой n для значений i от ml до m2 с шагом m3. Таким образом, вначале параметр i устанавливается равным ml, и с этим значением выполняются все операторы тела цикла; затем i изменяется до величины m1+m3, и с этим значением также выполняются все операторы тела цикла. Этот процесс продолжается до тех пор, пока параметр цикла не перейдет границу значения m2, т.е. при положительном шаге m3 цикл повторяется при всех значениях i ≤ m2, а при отрицательном шаге m3 цикл повторяется при всех значениях i ≥ m2. Если в записи цикла значение шага m3 отсутствует, то оно принимается равным единице. После окончания цикла выполняется оператор, следующий за оператором CONTINUE. Примеры заголовка цикла: D0 10 I=1,N-1 DO 5, A=K,X*Y+5,H При записи заголовка цикла необходимо следить за тем, чтобы шаг не оказался равным нулю (иначе цикл будет бесконечным). Пример использования оператора цикла. Пусть задана функция f(x) в виде ряда по степеням х f(x)=x+ X2/2+ X3/3+..+ ХN/N где N - параметр. Программа, которая для любых Х и N вычисляет соответствующее значение функции F, может иметь следующий вид READ(*,*)X,N F=0 D0 5 I=1,N ! или DO 1=1,N F=F+(X**I)/I 5 CONTINUE ! или END DO WRITE (*,*)F STOP END 4.2. Цикл с условием Конструкция цикла с условием DO WHILE имеет вид DO n WHILE(L) Тело цикла n CONTINUE DO WHILE(L) Тело цикла END DO Здесь n - метка последнего оператора тела цикла (оператора CONTINUE); L логическое выражение. После метки n может стоять необязательная запятая. Правило выполнения: Вычисляется логическое выражение L. Если оно принимает значение .TRUE., то выполняются все операторы тела цикла до оператора CONTINUE с меткой n. Этот процесс продолжается до тех пор, пока логическое выражение не примет значение .FALSE. Тогда ни один оператор тела цикла не исполняется и выполняется оператор следующий за CONTINUE. В.Б. Альгин «Курс лекций по компьютерной информатике» 98 Примеры заголовка цикла DO 25 WHILE(X**2+Y**2.LE.R**2) DO 10,WHILE(Y.GE.A.OR.X.GE.B) Пример использования оператора DO WHILE. Пусть задана функция f(x) в виде ряда по степеням х. f(x)=1-x+ X2/2- X3/3+...+(-1)N (ХN/N)... Суммирование членов ряда в программе будем производить до тех пор, пока модуль члена ряда не станет меньше заданной величины Е. Программа, реализующая данный алгоритм, может иметь следующий вид READ(*,*)X,E F=1.0 А=-Х DO 10 WHILE(ABS(A).GE.E) F=F+A I=I+1 A=-X*A/I 10 CONTINUE WRITE(*,*)F STOP END В приведенной программе присутствует обращение к библиотечной функции Фортрана ABS, которая вычисляет абсолютное значение вещественной величины. 4.3. Правила использования операторов цикла При использовании операторов цикла необходимо придерживаться следующих правил: Если оператор цикла указан внутри другого DO-цикла, его тело должно полностью содержаться внутри тела внешнего DO-цикла (вложенность циклов). Если оператор DO указан внутри блоков IF THEN или IF THEN ELSE, то тело цикла должно полностью содержаться внутри блока. Если блочный оператор IF указывается внутри цикла, то связанный с ним оператор END IF должен находится внутри тела цикла. Переход в тело DO-цикла извне цикла не разрешен. Два или более циклов DO или DO WHILE могут оканчиваться одним терминальным оператором CONTINUE. Однако оператор END DO может быть концом только одного цикла. При выходе из цикла сохраняется текущее значение параметра цикла i для DO-цикла или значение логического выражения L для DO WHILE цикла. Для выхода из цикла может быть использован оператор безусловного перехода GOTO и специальный оператор Exit (в Фортране 90). Примечание. Цикл DO WHILE считается устаревшей конструкцией; планируется замена его “глухим“ циклом do If <логическое выражение> exit end do В.Б. Альгин «Курс лекций по компьютерной информатике» 99 с возможной перестановкой условного оператора и блока [Рыжиков]. 5. КОНСТРУКЦИЯ SELECT CASE [2] [имя:] SELECT CASE (тест-выражение) CASE(СП1) [имя] [БОК1] ! Блок операторов и конструкций 1 [CASE(СП2) [имя] [БОК2]] … [CASE DEFAULT [имя] [БОКn]] END SELECT [имя] Тест-выражение — целочисленное, символьное типа CHARACTER(l) или логическое скалярное выражение. СП — список констант, тип которых должен соответствовать типу тест-выражения. Правило выполнения. Вычисляется значение тест-выражения. Если полученное значение находится в списке СП1, то выполняется БОК1; далее управление передается на следующий за END SELECT оператор. Если значение в СП1 не находится, то проверяется, есть ли оно в СП2, и так далее. Если значение тест-выражения не найдено ни в одном списке и присутствует оператор CASE DEFAULT, то выполняется БОКn, а далее выполняется расположенный за END SELECT оператор. Если же значение тест-выражения не найдено ни в одном списке и CASE DEFAULT отсутствует, то ни один из БОKi не выполняется и управление передается на следующий за END SELECT оператор. Список констант СП может содержать одно значение, или состоять из разделенных запятыми констант, или быть задан как диапазон разделенных двоеточием значений, например 5:10 или 'I':'N'. Левая граница должна быть меньше правой. Если задается диапазон символов, то код первого символа должен быть меньше кода второго. Если опущена левая граница, например :10, то в СП содержатся все значения, меньшие или равные правой границе. И наоборот, если опущена верхняя граница, например 5:, то в СП попадают все значения, большие или равные нижней границе. СП может включать также и смесь отдельных значений и диапазонов. Разделителями между отдельными элементами СП являются запятые, например: case(1, 5, 10:15, 33) Нельзя задать в СП диапазон значений, когда тест-выражение имеет логический тип. Каждое значение, даже если оно задано в диапазоне значений, может появляться только в одном СП. SELECT CASE конструкции могут быть вложенными. При этом каждая конструкция должна завершаться собственным END SELECT. Нельзя переходить посредством оператора GOTO или в результате альтернативного возврата из подпрограммы внутрь конструкции SELECT CASE или переходить из одной CASE-секции в другую. Попытка такого перехода приведет к ошибке компиляции. В.Б. Альгин «Курс лекций по компьютерной информатике» 100 Имя конструкции, если оно задано, должны обязательно иметь операторы SELECT CASE и END SELECT. Пример. Найти число положительных, отрицательных и нулевых элементов целочисленного массива. integer:: а(100), nр = 0, nе = 0, nz = 0, i <ввод массива а> do i = 1, 100 select case(a(i)) case(1:) np = np + 1 case (:-1) ne = ne + 1 case(0) ! или: case default nz = nz + 1 endselect enddo … ЛИТЕРАТУРА 1. Самохин А.Б., Самохина А.С. Фортран и вычислительные методы. — М.: Русина, 1994. — 120 с. 2. Бартеньев О.В. Фортран для студентов. — М.: Диалог-МИФИ, 1999. —400 с. В.Б. Альгин «Курс лекций по компьютерной информатике»