Не уверен, что сюда... Читаю книжку по Fortran, назрел вопрос.
Нужно считать с клавиатуры числа и вывести определённые статистические данные (среднее арифметическое и т.п.). Пускай ситуация такова, что все числа положительны и условие окончания ввода - отрицательное число. Вроде "полный проход":
Код:
WRITE (*, *) 'Enter number: '
READ (*, *) x
DO WHILE (x >= 0)
n = n + 1
sum_of_x = sum_of_x + x
WRITE (*, *) 'Enter number: '
READ (*, *) x
END DO
Надеюсь, код будет понятен и тем, кто не знаком с Fortran. Понятно, что можно операторы ввода/вывода "запихать" в отдельную подпрограмму. Не суть.
Автор предлагает такой вариант:
Код:
DO
WRITE (*, *) 'Enter number: '
READ (*, *) x
IF (x < 0) EXIT
n = n + 1
sum_of_x = sum_of_x + x
END DO
Вот значит какая штука. Цикл-пока в Fortran можно записать по-разному:
вариант 1Код:
DO WHILE (условие)
...
END DO
или
вариант 2Код:
DO
...
IF (условие) EXIT
...
END DO
Первая конструкция является частным случаем более общей второй, у которой IF следует непосрдественно за заголовком цикла. А так можно это условие куда угодно "запихать". То есть можно заиметь и while, и repeat, и нечто среднее.
Пугающая универсальность...
Этих условий выхода может быть даже несколько. Начал читать Дейкстру. Он за то, что бы каждый программный блок имел "a single entry at the top and a single exit at the bottom." Конструкций с множеством EXIT, следовательно, нужно избегать.
А вот как быть с конструкциями вариант 2? То есть важно ли, что-бы выход был именно "at the bottom"? Ведь и в while выход отнюдь не "at the bottom"...
И правильно ли я тут "полный проход" увидел?