Курс лекций по дисциплине Программирование на языке Фортран
Скачать 0.98 Mb.
|
Содержание пояснительной запискиТитульный листМинистерство образования республики Беларусь Белорусский национальный технический университет Кафедра “Металлические и деревянные конструкции” ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к курсовой работе на тему “...” Исполнитель ст. гр. 11111 Иванов И.И. Руководитель Новиков В.Е. Минск, 2002 РефератСодержаниеВведение (Связь описываемой задачи с более общим вопросом) Математическая формулировка задачи Приводятся общие математические формулы, используемые для решения поставленной задачи со всеми обозначениями и размерностями. Приводится информация о возможности решения, его единственности и точности. При использовании численных методов раскрывается смысл их работы. Техническое задание на разработку программы Область использования Задание Требования к программе Используемый язык программирования Описание программы Идентификация переменных
Блок-схема программы Схема взаимодействия модулей Перечень модулей с пояснением выполняемых ими действий Схемы алгоритмов (для всех модулей программы) Методика тестирования программы Цель и метод тестирования Ограничения на входные и выходные данные, особенности использования программы. Ограничения на аппаратные и программные средства (CPU, RAM, OS и т.д.), названия модулей и их объем. Тестовый пример Выводы (выводы по результатам тестирования, рекомендации к использованию программы, оценка полноты решений, эффективность). Литература (5-6 источников) 8. Основные понятия программирования Программа - набор (или последовательность) указаний (команд) исполнителю, т.е. в нашем случае компьютеру. Машинный язык – набор команд, распознаваемых и выполняемых компьютером (в частности процессором). Язык программирования – набор команд (операторов), правил и соглашений, более понятных пользователю, чем машинный язык. Компиляция (трансляция) – дословно составлять (переводить) – процесс перевода завершенной программы на языке программирования в язык машинных кодов. Обратный перевод затруднителен, т.о. компиляция в некотором смысле необратимый процесс. Компилятор (транслятор) – программа, производящая компиляцию. Линкер – программа, производящая связывание частей компилируемой программы и библиотечные файлы в единую программу. Его можно использовать для получения исполняемого файла, статической или динамической библиотеки. Библиотечный файл – программа, выполняющая некоторую (одну или более) законченную задачу (например, взятие синуса аргумента), при необходимости встраиваемая в скомпилированный (выполняемый) файл на этапе компиляции (статическая, .lib), на этапе выполнения (динамическая, .dll). Кроме того, динамическая библиотека одновременно может использоваться несколькими программами и при ее не использовании выгружается из ОЗУ. Объектный код – запись программы в форме, которая может быть обработана аппаратными средствами. Имеет расширение .obj. Исполняемый файл – программа (.exe), готовая к исполнению. По способу получения машинных кодов языки программирования делятся на 3 типа: 1) Компилируемые. Например, Fortran, Pascal, Си. Этапы компиляции изображены на схеме. 2) Интерпретируемые. Например, Basic. Интерпретатор (программа) читает строку исходной программы, формирует машинные коды и сразу их исполняет. 3) Интерпретируемые с элементами компиляции. Например, Форт. 9. Этапы разработки программного обеспечения 9.1 Формулирование задачи. На данном этапе решения задачи необходимо: уяснить и четко изложить условие задачи; выбрать исходные переменные; выбрать переменные, подлежащие определению; записать ограничения переменных; записать связи между переменными в виде уравнений, неравенств, таблиц и т.д. 9.2 Физический и математический анализ. Этап включает в себя: подтверждение существования решения; подтверждение единственности решения; определение теоретических методов, которые будут использованы при решении задачи. 9.3 Численный анализ. При выполнении данного этапа производят: выбор наиболее приемлемого метода численного решения задачи; учет особенностей математической модели решения задачи; оценку возможности реализации выбранного численного метода на принятом алгоритмическом языке, типе персонального компьютера, операционной системе и т.д. 9.4 Решение контрольного примера. На данном этапе, используя принятые математическую модель и численный метод решения задачи, выполняют вручную вычисления по заданным величинам исходных данных, определяя при этом промежуточные и конечные результаты, которые будут контролироваться при расчете по программе. Рекомендуется приготовить несколько контрольных примеров, что позволит с большей достоверностью оценить в дальнейшем эффективность разработанной программы (особенно для алгоритмов разветвленного типа). 9.5 Построение принципиальной схемы алгоритма и структуры данных. В принципиальной схеме алгоритма, реализующего выбранный численный метод решения задачи, с максимальной лаконичностью должны быть отражены основные (без ненужной деталировки) блоки алгоритма. Алгоритм - описание последовательности действий, необходимых для решения определенной задачи. Характеристики алгоритма - вычислительная (количество элементарных операций в процессе его выполнения) и емкостная сложность (объем используемых данных и кода самой программы). В практике программирования применяется общая методика решения задач – метод пошаговой детализации («нисходящее программирование»), заключающийся в том, чтобы решение какой-либо сложной задачи свести к решению некоторого ряда более простых задач. Сначала в решаемой задаче выделяется небольшое число (3-5) более простых задач (подзадач), а в проектируемой программе намечается соответствующее число блоков (частей программы), каждый из которых предназначен для решения одной из выделенных подзадач, определяется назначение каждого из них, порядок выполнения этих блоков и их связи между собой по обрабатываемым данным. На данном этапе важно определить лишь функциональное назначение каждого блока – что он должен делать, т.е. какие данные являются исходными для блока и что является результатом его работы; вопрос о механизме реализации, т.е. как будут выполняться возложенные на блок функции, пока можно не рассматривать. После определения порядка выполнения выделенных блоков и построения общей схемы алгоритма, необходимо проверить его правильность: прослеживая логику его выполнения, убедиться в том, что к началу выполнения каждого блока все его исходные данные будут действительно определены и что на выходе из программы будут действительно определены и что на выходе из программы будут получены требуемые результаты – в предположении, что каждый блок правильно выполняет свои функции. Принятые обозначения алгоритмических элементов:
Каждый блок необходимо нумеровать в пределах программной единицы (головная программа, подпрограмма и т.д.). Принципиальная блок-схема алгоритма решения задачи обычно содержит следующие логические структуры: 1 [2] . Следование. Структура представляет собой последовательность блоков S1, S2, ..., Sn, которые выполняются друг за другом в порядке их следования в тексте программы. [1] 2. Разветвление. Это управляющая структура, которая в зависимости от выполнения заданного условия (значения истинности логического выражения В) определяет выбор для выполнения одного из двух заданных в этой структуре блоков S1 и S2. 3. Повторение типа «делать, пока» (цикл «пока»). Данная структура представляет собой цикл, в котором заданный блок S выполняется повторно, пока справедливо заданное условие (логическое выражение В принимает значение «истина»). В тот момент, когда условие впервые окажется невыполнимым, циклический процесс закончится. В частности, если заданное условие окажется невыполнимым при первой же проверке, то входящий в структуру блок S вообще не будет выполняться. Помимо трех основных используются еще три дополнительные структуры. 4. Повторение типа «делать до» (цикл «до»). Данная структура отличается от цикла «пока» тем, что проверка истинности заданного условия производится только после выполнения заданного блока S. Таким образом, цикл «до» выполняется хотя бы один раз. 5. Обход. Частный случай ветвления, когда одна из ветвей не содержит никаких действий. 6. Множественный выбор. Структура является обобщением ветвления, когда в зависимости от значения переменной i выполняется одно из действий. При i=i1 выполняется блок S1, i=i2 – блок S2 и т.д. Все перечисленные структуры легко соединяются друг с другом в любой последовательности. В частности, каждая структура может содержать любую другую структуру в качестве одного из блоков обработки данных (блоков S). Например, общий вид условия IF представлен на рис. IF Structure (c). Также необходимо предусмотреть поведение программы при задании ошибочных или некорректных исходных данных. 9.6 Детализация алгоритма и построение блок-схем Сложные первоначально выделенные подзадачи необходимо повторно разбить на более простые блоки (второй шаг детализации). Этот процесс может продолжаться до тех пор, пока реализация блока не вызовет трудностей. Именно на этом этапе определяется сущность окончательного алгоритма, который будет реализован. Переходить к следующему уровню детализации имеет смысл лишь при наличии достаточной уверенности в правильности и эффективности алгоритма на данном уровне его детализации. 9.7* Написание текста программы на алгоритмическом языке При необходимости можно вернуться к предыдущему этапу проектирования для уточнения проекта. Приемы повышения эффективности (примеры приведены на языке FORTRAN):
Программа должна быть наглядной и удобочитаемой, для чего необходимо: 1) сдвигать внутренние операторы («тело») цикла и условия на 3-4 позиции вправо; 2) давать необходимые комментарии; 3) размещать метки в возрастающем порядке от начала к концу программы; 4) для процедур, переменных и т.д. применять мнемонические обозначения; 5) группировать операторы формата. Необходимо по возможности избегать оператора перехода Goto. Операторы, имена переменных, констант, подпрограмм и т.д. не должны содержать русских символов. 9.8 Отладка программы Цель данного этапа – выявление имеющихся в программе ошибок, определение и устранение причин их вызвавших. При отладке программ разработчик сталкивается с двумя видами ошибок: 1) Синтаксические ошибки. Это ошибки в записи конструкций языка программирования (чисел, переменных, выражений, меток, операторов, подпрограмм и т.п.). Данные ошибки обнаруживаются на этапе компиляции. Исключение составляют ошибки в операторе Format, которые компилятором не фиксируются, а обнаруживаются только на этапе выполнения. Ошибки могут выдаваться линкером (link error) в том случае, если не обнаружены вызываемые компоненты (модули) или при ошибке записи (обычно если запущен exe файл и компилируется его новая версия). 2) Семантические (смысловые, run-time error, ошибки выполнения) ошибки. Они связаны с неправильным содержанием действий или использованием недопустимых значений величин. Данные ошибки приводят к: прекращению выполнения программы и выдаче предупреждений; отсутствию признаков выполнения программы из-за ее «зацикливания»; появлению непредусмотренной формы или содержания печати результатов; потере точности вычислений; большому времени выполнения вычислений или других операций. 9.9 Тестирование программы На данном этапе необходимо – спланировать и подготовить данные для отладки, разработать драйвера тестов, испытать программу в приближенных к реальным условиям ее использования (на различных ОС, аппаратных системах и т.д.). Необходимо протестировать, по возможности, все возможные варианты прохождения программы. 9.10 Разработка документации на ПО Цель этапа – разработка детального описания принципов функционирования, используемых численных методов, ограничений на входные и выходные данные, требуемых затрат времени и других ресурсов на выполнение программы. В документации на ПО необходимо указать область его применения, возможности, сведения о его быстродействии, затратах памяти, требуемые технические средства, сведения о надежности и т.д. Типы данных Числовой тип данных 1) Целый тип. INTEGER*2, INTEGER*4
2) Вещественный тип REAL или REAL*4
REAL*8 или DOUBLE PRECISION
4) Комплексный тип COMPLEX*8, COMPLEX*16 Каждая компонента (действительная и мнимая) COMPLEX*8 – это REAL*4, а COMPLEX*16 – это REAL*8. Пример: (36.8,–2.633E2); (36.8,–263.3); -(3.8D–5,–2.6D–2). Логический тип данных LOGICAL Логический тип данных содержит две логических величины .TRUE. и .FALSE. Символьный тип данных CHARACTER Символьный тип данных содержит последовательность символов ASCII. Символьная переменная занимает один байт памяти для каждого символа в последовательности. Примеры символьных констант: 'A', ' ', 'Helр!', 'A very lоng CHARACTER cоnstant', 'O''Brien', ''''. В примере последняя символьная константа содержит одиночную кавычку. Пример описания типов Integer*4 i,j,k(10),m/11/ ! Целый: 2 переменных, массив, переменная с начальным значением Real*4 a,b,c(5,5),d(3)/1.1,2.2,3.3/ ! Вещественный Complex*8 cm(/-3.3,1.12E4/) ! Комплексный Logical flag/.True./,nf/.False./ ! Логический Character fname*8/’task01’/,fext*3/’f90’/ ! Символьный Выражения Арифметические выражения Используемые величины переменных, элементов массивов или функций должны быть определены до того, как они появятся в арифметическом выражении. Арифметические операторы
Операции равного приоритета, за исключением возведения в степень выполняются слева направо. Возведение в степень выполняется справа налево. Результатом деления двух целых чисел является величина, равная математическому частному двух этих величин, округленного до целого в сторону нуля. Поэтому 7/3 превращается в 2, а (-7)/3 превращается в -2. Выражения 9/10, 9/(-10), ¼+¼+¼+¼ равны нулю. Когда в арифметическом выражении все операнды одного типа, то величина, являющаяся результатом этого выражения, этого же типа. Когда операнды разного типа, типом результата выражения является тип операнда максимального ранга. Запрещенные операции: 0/0, 5.6/0, 0**0, 0**(-3), (-27)**(1./3.), SQRT(-9.), LOG(-2), LOG10(-5.5), TAN(1.570796327) и т.п. Выражения отношения Выражения отношения сравнивают величины двух арифметических или двух символьных выражений. Результатом выражения отношения является тип LOGICAL.
Логические выражения Логические операторы:
.NOT. A .OR. B.AND. C выполняется как (.NOT. A) .OR. (B .AND. C). 1 – ИСТИНА, а 0 – ЛОЖЬ.
Когда в одном выражении встречаются арифметические, логические операторы и операторы отношения, они выполняются со следующими приоритетами: 1. Арифметические (высший); 2. Символьные операции; 3. Отношения; 4. Логические (низший). Приоритет выполнения всех операций в логических выражениях приведен в табл.
Замечания: Больше основополагающих терминов (выделение курсивом). Больше текстовых и гиперссылок. Перенести в html, программы на Java. Диалоговый отладчик Code View 3.14 CodeView 3.14 - многооконный диалоговый отладчик фирмы Microsoft программ на языках: Fortran, Basic, C, Assembler (машинные коды). Возможности: 1) повторный запуск программ (restart); 2) установка условных и безусловных точек прерывания выполнения программы в ее тексте; 3) пошаговое выполнение программ (animate); 4) просмотр и отслеживание изменения значений переменных при выполнении программы (в окне Watch); 5) анализ содержимого ОЗУ; 6) поиск строк, выражений, переменных в тексте программы; 7) режим отказа. Недостатки: 1) не запускается с синтаксическими ошибками; 2) не запускается без трансляции (без exe-файла); 3) для внесения изменений в текст программы надо выйти из CodeView. Трансляция файлов для работы с CodeView: FL /Zi /Od иф.рас [ иф.рас ] Запуск CodeView: CV /S иф.exe После загрузки-3 окна: 1) location- размещение и отображение значений переменных; 2) source - исходный текст программы; 3) commands- ввод команд отладчика. Меню File: Open Source - помещение в окно Source текста программы; Open Module - помещение в окно Source требуемого модуля; Print - печать окна или выделенного участка текста; Dos Shell -переход в MS-DOS без выхода из отладчика (возврат- exit и ввод); Exit (или Q и ввод) - выход из CodeView. Меню View (просмотр): Source- создание еще одного окна с текстом программы (для просмотра ее частей); Memory-создание окна с содержимым ячеек памяти; Register [ или F2 ] - создание окна с содержимым регистров процессора; 8087- создание окна, отображающего состояние математического сопроцессора; Local, Watch, Command- управление существованием соответствующих окон; Output [или F4]- временный выход в DOS для просмотра результатов счета программы (возврат F4); Maximaze [Ctrl+F10]- установка максимального размера текущего окна; Size [Ctrl+F8]- изменение размера текущего окна (можно и с помощью мыши); Close [Ctrl+F4]-«закрытие» текущего окна. Меню Search (поиск): Find- найти что? Whole Word- символ , текст;: Case Insens- метку; Regular Expression- выражение; Select Text [Ctrl+] - выделение текста; Repeat Last Find- повтор последнего нахождения; Label/Function - поиск функции или метки. Меню Run (выполнить): Restart [Alt rr] - возврат выполнения программы к началу; Animate- автоматическое пошаговое выполнение; Set Runtime arguments- задание или изменение аргументов командной строки для запуска программы; History on- создание протокола работы в системе отладки; Undo [Alt+BackSpace]- «откат» назад на 1 шаг; Reply- повтор ранее введенной команды. Меню Watch: Add Watch [Ctrl+W] - добавление отслеживаемых переменных в окно Watch; Delete Watch [Ctrl+U] - удаление отслеживаемых переменных из окна Watch; Set BreakPoint [F9] - установка точки прерывания программы в тексте: по положению; по положению, если выражение истинно; по положению, если выражение изменялось; если выражение изменялось (остановка там, где оно изменилось); если заданное выражение истинно; Edit Break Point- редактирование точек прерывания; Quick Watch- быстрый просмотр переменной, отмеченной курсором с возможностью ее добавления в Watch. Меню Options: Source [F3] - переключение режима представления программы (язык программирования/Assembler); Memory- изменение представления информации в окне Memory; Trace Speed- изменение скорости пошагового автовыполнения (медленно, средне, быстро); Language- определение языка программирования (автоматически); Reply- повтор ранее введенной команды; Calls- выдача списка вызовов подпрограмм. Назначение некоторых клавиш и их комбинаций: F1- справка; F2- выполнение программы с текущего оператора до точки прерывания или конца; F6- перемещение курсора между окнами; F7- выполнение программы до курсора; F8- выполнение 1 шага программы (выполненная строка выделяется); F9- установить/убрать точку прерывания; F10- пошаговое выполнение программы без входа в подпрограмму (п/п выполняется за 1 шаг); Shift F9- быстрый просмотр значений текущих переменных; Alt A- занесение переменной А в окно Watch. Последнее обновление произведено Разные остатки Этапы жизненного цикла ПО (традиционная лавинообразная модель) Файл EXE, который строит компоновщик состоит из двух частей: - управляющая информация для загрузчика. собственно загрузочный модуль. Информация для загрузчика, описанная ниже, расположена в начале файла и образует так называемый заголовок. Сразу за ним следует тело загрузочного модуля. Тело загрузочного модуля начинается на границе блока и представляет собой копию образа памяти задачи, которую построил компоновщик. Имеется два типа кодов символов, коды ASCII и расширенные коды. Коды ASCII - это байтные числа, которые соответствуют расширенному набору кодов ASCII для IBM PC. Процессор компьютера (CPU) делит память на блоки, называемые сегментами. Каждый сегмент занимает 64 К и каждому сегменту соответствует уникальный числовой адрес. Сегмент - это непрерывный блок памяти, длиной 64К. На стандартной дискете, имеющей по 8 секторов на дорожке, FAT занимает 1 сектор. На стандартной дискете с 9-ю секторами на дорожке для таблицы отводится 2 сектора. Логич – Пролог, LogLisp Функци. - Lisp Процедурные - Процедурная программа состоит из последовательности операторов и предложений, управляющих последовательностью их выполнения. Типичными операторами являются операторы присваивания и передачи управления, операторы ввода-вывода и специальные предложения для организации циклов. Из них можно составлять фрагменты программ и подпрограммы. В основе процедурного программирования лежат взятие значения какой-то переменной, совершение над ним действия и сохранения нового значения с помощью оператора присваивания, и так до тех пор пока не будет получено (и, возможно, напечатано) желаемое окончательное значение.[2] Логическое программирование - это один из подходов к информатике, при котором в качестве языка высокого уровня используется логика предикатов первого порядка в форме фраз Хорна. Логика предикатов первого порядка - это универсальный абстрактный язык предназначенный для представления знаний и для решения задач. Его можно рассматривать как общую теорию отношений. Логическое программирование базируется на подмножестве логики предикатов первого порядка, при этом оно одинаково широко с ней по сфере охвата. Логическое программирование дает возможность программисту описывать ситуацию при помощи формул логики предикатов, а затем, для выполнения выводов из этих формул, применить автоматический решатель задач (т. е. некоторую процедуру). При использовании языка логического программирования основное внимание уделяется описанию структуры прикладной задачи, а не выработке предписаний компьютеру о том, что ему следует делать. Другие понятия информатики из таких областей, как теория реляционных баз данных, программная инженерия и представление знаний, также можно описать (и, следовательно, реализовать) с помощью логических программ.[8]. Функциональная программа состоит из совокупности определений функций. Функции, в свою очередь, представляют собой вызовы других функций и предложений, управляющих последовательностью вызовов. Вычисления начинаются с вызова некоторой функции, которая в свою очередь вызывает функции, входящие в ее определение и т. д. в соответствии с иерархией определений и структурой условных предложений. Функции часто либо прямо, либо опосредованно вызывают сами себя.[2] Каждый вызов возвращает некоторое значение в вызывавшую его функцию, вычисление которой после этого продолжается; этот процесс повторяется до тех пор пока запустившая вычисления функция не вернет конечный результат пользователю. «Чистое» функциональное программирование не признает присваиваний и передач управления. Разветвление вычислений основано на механизме обработки аргументов условного предложения. Повторные вычисления осуществляются через рекурсию, являющуюся основным средством функционального программирования. объектно-ориентированное программирование, ситуационное программирование, продукционное программирование и логическое программирование. Регистр представляет собой совокупность бистабильных устройств (то есть имеющих два устойчивых состояния), предназначенных для хранения информации и быстрого доступа к ней. В качестве таких устройств в интегральных схемах используют триггеры. Триггер в свою очередь выполнен на транзисторных переключателях (электронных ключах). В регистре из N триггеров можно запомнить слово из N бит информации. Порт - некая схема сопряжения, обычно включающая в себя один или несколько регистров ввода-вывода и позволяющая подключить, например периферийное устройство к внешним шинам микропроцессора. Практически каждая микросхема использует для различных целей несколько портов ввода-вывода. Каждый порт на персональном компьютере имеет свой уникальный номер. Заметим, что номера порта - это, по сути, адрес регистра ввода-вывода, причём адресные пространства основной памяти и портов ввода-вывода не пересекаются. Прерывание - сигнал, по которому процессор узнаёт о совершении некоторого асинхронного события. При этом исполнение текущей последовательности команд приостанавливается (прерывается), а в место неё начинает выполняться другая последовательность, соответствующая данному прерыванию. Прерывания можно классифицировать как аппаратные, логические и программные. Аппаратные прерывания обычно связаны с запросами от периферийных устройств (например, нажатие клавиши клавиатуры), логические возникают при работе самого микропроцессора (деление на ноль), а программные инициализируются выполняемой программой и используются для вызова специальных подпрограмм. НАБРАННОЕ СТУДЕНТАМИ П Program SumRow Real b,s,x/0.5/,tmp ! b-текущий члне ряда, tmp-вспомогательная переменная. Tmp=-x*x*0.5 B=x ! Начальное условие. S=b K=1 Do while-(abs(b)>1e-6) ! Вычисление пока член суммы больше прогрессивности. B=b*tmp/(k*(2k*+1)) ! Последующий член. S=s+b ! Суммирование. K=k+1x End do Write(5,*) ‘Сумма ряда S=’,s End еременная К объявлена вещественной для избегания преобразования целого типа к вещественному вспомогательной переменной tmp вынесена из тела цикла для уменьшения числа вычислений. П Program SimpleIter Real x0,x1,x2 X0=0.75 X2=x0 Do while (abs(x2-x1).Gt.1e-6) X1=x2 X2=cos(x1) End do Print *,x2 End Выполнение пока выражение истинно, т.е. пока не достигнута заданная погрешность. ример нахождения корня уравнения x=cos(x) методом простой итерации - значение уравнения на предыдущем шаге является значением независимого аргумента и снова подставляется в уравнение на последующем шаге. Принимаем начальное приближение x0=0.75. Дать программу (метод простой итерации) доказывающую, что вычисление квадратного корня сводится к операциям умножения, деления и сложения. x = 0.5(x + a/x), -> x = . Пример. Сколько раз необходимо сложить лист бумаги толщиной 0.1мм, чтобы достать до Луны? Среднее расстояние от Земли до Луны 384400км. Real t,Dist Integer I T=1e-7 ! Толщина листа в км. Dist=384400. I=0 Do while (t.lt.Dist) T=t*2. I=I+1 ! Число шагов (складываний) End do Print *,i. End Результат работы программы – 42 раза,т.е. t=439804.7км 2.5.6. Оператор Exit. Exit [имя] – передает управление из Do конструкции на первый следующий за конструкцией выполняемый оператор, т.е.Exit обеспечивает выход из цикла. 2.5.7. Оператор Cycle. Cycle [имя] – передает управление на начало Do- конструкции. При этом операторы, расположенные между Cycle и End do не выполняются. Пример. Вычислить сумму элементов массива, значения которых >5, завершая вычисления при обнаружении нулевого элемента. Integer a(100),sa,c,I . . . . . . . . . . . sa=0 do I=1,100 c=a(i) if(c.eq.0)exit !Выход из do if(c.lt.5)cycle !Обход суммирования sa=sa+c end do print *,sa Данный фрагмент можно записать более компактно: Sa=0 I=1 Do while(a(i).ne.0.and.i.or.100) If(a(i).gt.5) sa=sa+a(i) I=I+1 End do. 2.5.8. Оператор Stop. Stop [message] – прекращение выполнения программы. Message – символьная или целочисленная переменная. По умолчанию message выводится сообщение. Stop – program terminated. П Open(2, file=’b.txt’,iostart=icheck) If(icheck.ne.0)stop’Ошибка открытия файла.’ ример 2.7. Сделать вспомогательные операторы ? 2.6. Операторы объявления програмных компонентов. 2.6.1.Основные сведения. При разработке алгоритма исходная задача разбивается на отдельные подзадачи, которые впоследствии реализуются в виде отдельных программных компонентов: головные программы и процедуры (п/п, функцииили блок данных). Программные компоненты (единицы): физически отделены друг от друга; начинаются оператором-заголовком, содержащим одно из слов: program, subroutine,function, block data. заключается оператором End. Обрабатывается компилятором отдельно от остальных. Имя процедуры является глобальным, т.е. оно не должно совпадать с другим глобальным именем или с локальным именем в вызывающей программной единице. 2.6.2. Оператор Program. Оператор Program объявляет головную программу и задает ее имя. [Program [name of prog]] name of prog – имя головной программы. Оператор Program является необязательным. Имя программы является глобальным именем, поэтому оно не может совпадать с именем другой процедуры. Пример. Program Pescribe of Type. 2.6.3. Операторы Subroutine и Call. Оператор Subroutine идентифицирует программный компонент как п/п, задает ей имя, определяет формальные параметры процедуры. Subroutine sname [[sattrs]] [( [nformal [[attrs]] [,nformal [[attrs]]…] )], Где:Sname – определенное пользователем глобальное, внешнее имя п/п. Sattrs – список атрибутов (через запятую и в квадратных скобках). Nformal – определенное пользователем имя формального параметра. Если их несколько, то разделенные запятыми. Attrs – список атрибутов. (через , и в []). Вызов п/п осуществляется по ее имени оператором Call. Call sname ([ nfact [, nfact]…]), где Nfact – определенное пользователем имя фактического параметра. При вызове п/п между фактическими и формальными параметрами устанавливается соответствие. Фактические параметры: выражения, буквенные и символьные константы, переменные, массивы, символы *. Требования к фактическим параметрам снаружи: Количество фактических параметров равно количеству формальных параметров. Типы и длины фактических и формальных параметров должны совпадать. Соответствие между параметрами устанавливается по порядку их следования в списках параматров (1-му формальному параметру соответствует 1-й фактический и т. д.). Если формальный параметр – имя массива, то соответственно фактический параметр – имя массива или элемент массива. Если формальный параметр – имя переменной, то соответственно фактический параметр может быть переменной, выражением или константой (если формальный параметр не получает новых значений в п/п). При обращении к п/п фактические параметры могут ассоциироваться с формальными по значению(value) или по ссылке(peference). Фактические и формальные параметры обмениваются значениями при вызове п/п значения фактических переменных присваиваются соответствующим формальным, после завершения п/п наоборот. Таким образом, значения дублируются в ОЗУ. Передается не значение, а ссылка (адрес в ОЗУ) на значение фактического параметра. Таким образом, все действия над формальными переменными есть в действительности над соответствующими фактическими параметрами. Если фактический параметр – выражение, то тип и длина формального параметра берутся равными типу и длине выражения. Call s (a.and.b,c) . . . . . Subroutine s (log,c) Logical log Call s (int2 (a**2+b+3.6)) . . . . . Subroutine s(c) Integer*2 c Если фактическая параметр – строка, то формальным параметром может быть строка, перенимающая длину. Call write text (‘abcdef’) . . . . . . Subroutine write text (text) character text*(*) П Real A (8) . . . Call M (A, 3, 2) . . . Subroutine p1 (B) Real B (5) Real A (4,4) . . . . Call M (A, 3, 2) . . . . Subroutine M (B,x,y) Integer x,y Real B (x,y) ! Вместе со значениями передаются и размеры массива. ример к массивам. Как видно из примеров, тип и длина формальных параметров задаются внутри п/п операторами описания. 2.8. Операторы управления файлами. Почти все операторы управления файлами должны содержать в качестве одного из параметров – номер устройства к которому подсоединяется файл в результате выполнения оператора Open. 2.8.1. Оператор Open. Оператор создает устройство ввода – вывода и связывает его с внешним устройством или файлом на внешнем устройстве. OPEN ([UNIT=] U [, ACCESS=access][,ACTION=action][,ERR=err] [,MODE=mode][,POSITION=pos][,RECL=recl][,SHARE=share][,STATUS=status]) U – целочисленное выражение, задающее номер устройства, к которому подсоединяются файлы file. В FORTRAN определяем устройства: * - клавиатура или экран. Access – символьное выражение, вычисляемое со значениями, определяющими способ доступа к файлу. Значения: 1) ‘APPEND’ – используется при работе с последовательными файлами, открываемыми для добавления данных (дозаписи). Open(3,file=’1.txt’, ACCESS=’APPEND’)- присоединение данных к файлу. ‘DIRECT’ – указывает на прямой доступ к файлу. ‘SEQUENTIAL’- указывает на последовательный доступ к файлу (по умолчанию) action – символьное выражение, задающее возможность действия с файлом и вычисляемое со значением: ‘READ’- процесс может только читать данные из файла. ‘WRITE’- возможна только запись в файл. ‘READWRITE’- запись и чтение. Если action не задана, то файл открывается в режиме (3), если неудачно, то в режиме (1), затем (2). Status не оказывает никакого влияния на action. Err – метка исполняемого оператора в том же программном модуле, управление на который передается в случае возникновения ошибки. Если Err отсутствует, то ошибка выдается на экран. File – символьное выражение, задающее имя файла, подсоединяемому к устройству и если FILE опущен, то создается временный (стирается CLOSE) файл с уникальным именем. Если FILE=’’(пустое имя), то имя файла будет предложено вести с клавиатуры (File name missing or blank – Pleas enter name UNIT U? Если имя файла ‘USER’ или ‘CON’, то вывод выполняется на экран, ввод – с клавиатуры. Имя FILE может задавать и другие физические устройства, например, принтер (FILE=’PRN’) или последовательный порт №1 (FILE=’COM1’). Form – символьное выражение, вычисляемое со значениями ‘FORMATTED’, ’UNFORMATTED' или ‘BINARY’. При последовательном доступе к файлу по умолчанию устанавливается ‘FORMATTED’, при прямом – ‘INFORMATTED’. Iocheck – целочисленная переменная, возвращающая при отсутствии ошибки, отрицательное число, если обнаружен конец файла, или номер возникшей ошибки. Open(3,file=’1.txt’,IOSTAT=I) If(i.eq.0)then Write(*,*)’Файл открыт успешно’ Else if(i.lt.0)then Write(*,*)’Достигнут конец файла’ Else Write(*,*)’Ошибка открытия файла’,I End if Mode – символьное выражение, задающее подобно action возможные действия с файлом. Имеем значения: ‘READ’,’WRITE’ и ‘READFILE’. Отличие от action – под процессом понимается не любой процесс, а оригинальный, т.е. тот который открыл файл. Параметр STATUS на режим mode воздействия не оказывает. Pos – символьное выражение, задающее способ позиционирования файла при последовательном доступе Возможны значения: ‘ASIS’, ‘REWIND’,’APPEND’. Recl – усложненное выражение, задающее длину каждой записи в байтах. Параметр задается только в файлах прямого доступа. Share – символьное выражение, вычисляемой со значениями: ‘DENYRW’ – пока файл открыт в этом режиме, никакой другой процесс не может открыть этот файл ни для чтения, ни для записи. ‘DENYWR’ - пока файл открыт в этом режиме, никакой другой процесс не может открыть этот файл для записи. ‘DENYRD’ – пока файл открыт в этом режиме, никакой другой процесс не может открыть этот файл для чтения. ‘DENYNONE’ – любой другой процесс может открыть файл. Status – символьное выражение, вычисляемое со значениями: ‘OLD’ – файл должен уже существовать, иначе возникает ошибка. ‘NEW’ – файл не должен существовать (он создается), иначе возникает ошибка. ‘SCRATCH’ – по умолчанию, если опущен параметр FILE, создается временный рабочий файл. Временный файл удаляется при закрытии канала ввода/вывода или при завершении выполнения программы. ‘UNKNOWN’ – используется по умолчанию, сначала файл открывается со значением ‘OLD’, если файла нет, то со значением ‘NEW’. Поэтому если файл существует, то он открывается, если не существует, то создается. Character ch*2, fname*12 . . . . . . . Write (5,*)’открыть старый/новый/временный файл. Read (5,’(\a)’) ch If (ch.eq.’S’.or.eq.’S’) then Open (3,STATUS=’SCRATCH’) Else if (ch.eq.’O’.or.ch.eq.’O’) then Write (5,*) ‘Введите имя старого файла.’ Read (5,’(\a)’) fname Open (3,file=fname, STATUS=’OLD’) Else end Write (5,*) ‘введите имя нового файла’ Read (5,’(\a)’) fname Open (3,file=fname, STATUS=’NEW’) End if Пример организации ввода значений из файла (в каждой строке по одному значению), значение должно находиться в поле шириной 20 символов, начиная с одной стороны колонки. Символьные подстроки и встроенные функции. Variable([first]:[last]) Variable- символьная переменная или элемент символьного массива. First- арифметическое выражение, определяющее первый символ в подстроке. Значение First округляется до целого и по умолчанию= 1. Last- арифметическое выражение, определяющее последний символ в подстроке. Last- округляется до целого числа и по умолчанию равен длине строки. Длина подстроки равна: Last- First+1. A=’yahoo’ A(:3)=’yah ’; A(3:)=’ hoo ’; A(2:4)= ‘ aho ’; A(:)=’ yahoo ’ Должно выполняться соотношение 1+ Last First Если не указана метакоманда $DEBUG, то в случае нарушения условий результат неопределен. Пример использования: Поиск символа ‘а’ в символьной переменной text Do I=1 j=Len trim(text) ! определение длины переменной text If(text(i:i).eq. ‘a’) exit Enddo Если I=j+1, то символ не найден Если I≠j+1, то символ найден в позиции I переменной text. Встроенная функция ICHAR(char)- возвращает ASCII из-под символа. CHAR(int)- обратное преобразование Char- один символ, 0≤int≤255 Например ICHAR(‘0’)=48; ICHAR(‘1’)=49 CHAR (ICHAR(‘2’))=’2’ Пример перевода числа в символьное представление Program num_char Integer number/3946790/ Character*7 string Call numchar(number,7,string) Write(s,*) string End Subroutine numchar(n,m,c) Integer n ! исходное число Integer m ! количество цифр Character(*) c ! выходная строка Integer i,j,k,l Character*1 C1 ! вспомогательная переменная K=n ! исходное числовое значение Do I=m,1,-1 ! позиция(начинаем с конца) L=k/10 ! целое частное J=k-10*L ! очередная цифра= остатку от деления K=L ! новое делимое С1=char(j+48) ! перевод цифры в символ(код0-48,1-49 и т.д.) С(i;i)= c1 ! включение в ответную строку Enddo Для цифры 3946790
Функция LEN(CHAR)-определение длины символьной строки char. LEN(‘Netscape’)=8 LEN_TRIM(char)-определение длины символьной строки без хвостовых пробелов. LEN_TRIM(‘ Explorer ‘)=9 Функция INDEX(char A, char B[,Log])-возвращение номера позиции вхождения строки char B в строку char A. Если LEN(char A)< LEN(char B) или char B не встречается в char A, то результат равен 0. Если char B встречается в char A более 1 раза, то возвращается позиция первой встречи. Log-логическая переменная или выражение. Если Log=.FALSE.(по умолчанию), то поиск идет слева направо, иначе справа налево. Пример INDEX(‘Ixbt.com’,’.’)=5 INDEX(‘AABBBCBB’,’BB’)=3(INDEX(‘AABBBCBB’,’BB’,.true.)=7 VERIFY(char A, char B[,Log])-возвращение номера позиции символа, не содержащегося в char B, в строке char A. В случае обнаружения возвращается ноль. VERIFY(‘ Mathcad’,’ Vaple’)=3 ! символа t нет в char B и его позиция 3. B=’Matlab’ VERIFY(’Matlab’,b)=0 VERIFY(‘banana’,’nbc’,.true.)=6 Пример: Найти в заданном тексте самое длинное слово. Если таких слов больше одного, то принимается первое найденное слово. Program find_word Character*80 wordmax,st Integer wlen, wLmax/0/,wb,we,stlen Integer unit Parameter (unit=3) Open(unit,file=’e:\txt.dat’) Do while(.not.eof(unit))! Цикл выполняется до конца файла. При достижении конца файла eof принят .true. и цикл завершится! Read(unit,’(a)’)st Stlen=Len_trim(st) We=0! Конец очередного слова Do while(we stlen)! Выделение очередного слова .lt. call curword() wLen=we-wb+1 if(wLen.gt.wLmax) then wLmax=wLen!wLmax-максимальное количество позиций в слове wordmax=st(wb:we) endif enddo enddo if(wLmax.gt.0) then write(5,*)’самое длинное слово:’, trim(wordmax) write(5,*)’его длина:’,wLmax else write(5,*)’ в файле нет текста end if end subroutine curword() character*80 st integer wb,we,stlen character*1 bl parameter(bL=’ ‘) wb=we+1 do while (st(wb:wb).eq.bl.and.wb.lt.stlen) wb=wb+1 do while (st(we:we).ne.bl.and.we.lt.stlen) we=we+1! Поиск конца нового слова end do if(we.lt.stlen)we=we-1 end 0> |