- •Часть 3
- •Содержание
- •30. Работа с файлами
- •Примечание:
- •31. Открытие файлов
- •File not found
- •32. Непосредственная работа с файлом
- •33. Форматный вывод информации
- •34. Форматное чтение информации из файла
- •35. Обработка сбойных ситуаций и ситуаций “конец файла” при вводе-выводе информации
- •Обработка сбойной ситуации:
- •7 Write (6,*) ’Введите a,I,b’
- •Обработка ситуации “конец файла”:
- •36. Операторы для работы с записями в файле
- •37. Дополнение файла информацией
- •Первый способ дополнения файла информацией:
- •10 Write (6,*)’Всего записей в файле’,kzap
- •Второй способ дополнения файла информацией
- •4 Write (6,*)’в файле было записей’,kz
- •38. Работа с текстом
- •39. Текстовые константы
- •Правило:
- •10 Format (a8)
- •10 Format (a)
- •1) Вводится меньше 8 символов, то они помещаются в переменную imfile, а недостающие до 8 позиции дополняются пробелами.
- •2) Вводится имя большего размера, чем 8 позиций, то будут восприняты только первые 8 символов и они будут записаны в переменную imfile;
- •8 Format (a10/5a5)
- •9 Format (1x,a10/1x,5a5)
- •9 Format (1x,a10/1x,5a5)
- •Семин а.В.
- •Правила ввода-вывода текстовой информации:
- •1). Ввод информации
- •Примечание:
- •40. Текстовые подцепочки
- •41. Вывод графиков
- •42. Эквивалентирование текстовых переменных
- •If(fam1.Eq.Fam2) write(6,9) fam2,k1,k2,k3,k4
- •7 Format (a40,i5,a15,i5,a7)
- •If (ngod.Ne.1962) goto 4
- •9 Format (1x,a40,i5,a15,i5,a7)
- •10 Write(4,*)’Конец просмотра базы данных’
- •43. Создание библиотек
- •44. Решение дифференциальных уравнений
- •45. Работа с комплексными данными
- •Правило:
- •46. Ввод-вывод переменных комплексного типа
- •Примечание:
- •47. Встроенные функции комплексного типа
- •48. Оператор equivalence
- •Правило:
- •49. Результаты арифметических операций в выражениях с данными разного типа
- •50. Файлы прямого доступа
- •51. Способы передачи форматных записей
- •52. Модификации оператора цикла do
- •6 Continue
- •If (y.Lt.0.05) cycle
- •55. Командные файлы
- •If errorlevel 1 go to exit
- •If errorlevel 1 go to done
51. Способы передачи форматных записей
Передача форматных записей осуществляется следующими способами:
WRITE (*, FMT=метка) список
FMT – ключевое слово, которое назначает метку оператора FORMAT, описывающего порядок вывода информация из списка.
* – вывод на системное устройство (дисплей).
WRITE (*,*)
Ключевое слово FMT может быть опущено.
WRITE (*, FMT=9) A, B или, что аналогично: WRITE (6, 9) A, B
FORMAT (1X,’A=’, F8.3,’ B=’, F11.4)
Вместо метки оператора FORMATв операторе вывода может быть указана текстовая константа, которая содержит текст оператораFORMAT:
WRITE (6,’(1X,’A=’,F8.3,’ B=’,E11.4)’) A, B
содержимое оператора FORMAT список
52. Модификации оператора цикла do
Существуют несколько модификаций оператора цикла DO, которые отличаются не только по форме их записи, но и по принципу организации цикла.
Одна из модификаций рассматривалась в прошлых главах и использовалась во всех программах, где требовалось организовать циклический процесс. Эта модификация имеет вид:
DO 6 X=A,B,DX
…
область цикла
…
6 Continue
В цикле идёт изменение переменной Х от начального значения А до конечного значения В с шагом DX. В области цикла выполняются любые операции (можно организовать ещё циклыDO). При достижении метки 6 выполняется переход на начало цикла, последнему значению Х присваивается шагDXи если полученное значение меньше либо равно В (конечному значению), то выполняется область цикла и процесс повторяется. Если приращённое значение больше величины В, то происходит передача управления операторам, которые следуют за меткой 6.
Вторая модификация цикла DOпохожа на предыдущую, только отсутствует метка, и оператор окончания циклаCONTINUEзаменяется на операторENDDO:
DO X=A,B,DX
…
область цикла
…
END DO
Принцип работы аналогичен предыдущей модификации: происходит выполнение области цикла с постепенным приращением Х от А до В с шагом DX. Циклический процесс осуществляется междуDOиENDDO. При достижении значения Х большего значения В происходит передача управления первому оператору, следующему заENDDO.
Третья модификация использует совершенно иной способ организации цикла:
DO m, WHILE (логическое выражение)
…
область цикла
…
m CONTINUE
Здесь происходит выполнение цикла в области до метки mдо тех пор, пока выполняется (TRUE) логическое выражение в скобках. Если логическое выражение стало ложным (FALSE), то управление передаётся оператору, следующему после области цикла.
Пример:
X=XN
DO 5, WHILE (X.LT.XK)
Z=…
WRITE (…
X=X+DX
Следующая модификация цикла DO:
DO WHILE (логическое выражение)
…
область цикла
…
END DO
Цикл выполняется, пока логическое выражение не примет значение FALSE.
Кроме того, внутри цикла DOWHILEили оператораDO(в котором цикл заканчивается операторомENDDO) используются операторыCYCLE(цикл) иEXIT(выход). ОператорCYCLEпередаёт управление на конец цикла, а операторEXITосуществляет выход из области цикла и передаёт управление оператору, следующему послеENDDO.
Пример:
X=XN
DO WHILE (X.LT.XK)
Y=…
Z=…
If (y.Lt.0.05) cycle
IF (Z.GT.10.5) EXIT
WRITE (…
X=X+DX
END DO
Строки IF(Y.LT.0.05)CYCLEиIF(Z.GT.10.5)EXITсоответствует следующим операциям:
DO 8 I=1,10
X=…
IF(Y.LT.0.05) GO TO 8
IF (Z.GT.10.5) GO TO 10
WRITE …
8 CONTINUE
10 Y=…
Модификации оператора цикла DOудобно использовать в тех случаях, когда не заданы начальные и конечные значения цикла, а цикл должен выполняться только тогда когда выполняется какое либо условие.
53. Модификация оператора GO TO
Как уже ранее рассматривалось, оператор GOTOявляется оператором перехода, с помощью которого можно передавать управления в любую часть программы. При этом мы рассматривали безусловную модификацию оператораGOTO, когда управление обязательно передавалось на метку, которая указывалась за операторомGOTO.
Существует вторая модификация оператора
GOTO: вычисляемый.
GO TO(m1, m2, m3, …, mn) арифметическое выражение
Пример:
GO TO(5, 4, 1, 5) A*SIN(X)
Происходит вычисление арифметического выражения и полученный результат приводится к целому типу. Если полученный результат имеет значение 1, то оператор GOTOпередаёт управление на первую метку, т.е. на метку 5, если равен 2, то на метку 4 и т.д. Если значение арифметического выражения меньше 1 либо большеn, то операторGOTOне выполняется.
ОператорGOTOпо предписанию
GOTO целая переменная(метки)
Где: целая переменная определяется в специальном операторе ASSIGN. Оператор назначает номер метки переменной целого типа. А операторGOTOпо предписанию может осуществить переход на одну из перечисленных меток в зависимости от значения целой переменной.
IF (A .GT. B) THEN
ASSIGN 10 TO MET
ELSE IF (A .EQ. B) THEN
ASSIGN 20 TO MET
ELSE
ASSIGN 25 TO MET
END IF
Затем осуществим переход на одну из меток:
GOTO MET (10,20,25)
….
….
….
10 WRITE …
…
20 IF …
…
25 WRITE …
Если значение METсовпадает с любой из меток списка, то осуществляется переход на эту метку. ЕслиMETне совпадает ни с одной из меток списка, то операторGOTOне выполняется.
54. Теория ошибок
Рассмотрим из-за чего в “правильно работающей” программе могут получаться не точные или совсем не правильные данные.
х – число;
– его ошибка;
– относительная ошибка.
В операциях сложения: , то есть при сложении чисел происходит сложение их ошибок.
В операциях умножения: .
При делении:
При возведении вещественного числа в целую и вещественную степень, мы получим разный результат, но в простом случае это расхождение будет в 9–10 знаке после запятой. B=5.7
A=5.7
B1=B**2=…
A1=A**2.=…
IF(A1.EQ.B1) THEN …
При сравнении переменных оператором IF, получим значениеTRUE.
Однако если А1 и В1 являются результатом длительных вычислений (вычисление суммы, например) с использованием библиотечных программ ЭВМ для вычисления функций типа log, eхp, tg, sin, th,которые вычисляются с помощью разложения в бесконечный ряд, то окончательная ошибка будет возрастать. На некотором этапе может возникнуть ситуация, когда различие между переменными А1 и В1 обнаружится в 7 знаке после запятой. При этом оператор сравнения этих переменных не выполнится (результат сравнения будет равенFALSE). Если в алгоритме работы программы должна предусматриваться ситуация, когда А1 должна быть равна В1, то вместоIF(A1.EQ.B1) с ранее заданной точностью можно записать:IF(ABS(A1-B1).LT.1.E–6)THEN…