Главная страница
Навигация по странице:

  • 8. Основные понятия программирования

  • 9. Этапы разработки программного обеспечения

  • Логический тип данных

  • Арифметические выражения

  • Диалоговый отладчик Code View 3.14 CodeView 3.14

  • FL /Zi /Od иф.рас [ иф.рас ] Запуск CodeView: CV /S иф .exe

  • Назначение некоторых клавиш и их комбинаций: F1

  • Shift F9

  • 2.7. Сделать вспомогательные операторы 2.6. Операторы объявления програмных компонентов. 2.6.1.Основные сведения.

  • 2.6.2. Оператор Program.

  • 2.6.3. Операторы Subroutine и Call.

  • 2.8. Операторы управления файлами.

  • Курс лекций по дисциплине Программирование на языке Фортран


    Скачать 0.98 Mb.
    НазваниеКурс лекций по дисциплине Программирование на языке Фортран
    Дата02.09.2019
    Размер0.98 Mb.
    Формат файлаdoc
    Имя файлаFortran01.doc
    ТипКурс лекций
    #85698
    страница9 из 15
    1   ...   5   6   7   8   9   10   11   12   ...   15
    Содержание пояснительной записки



    Титульный лист

    Министерство образования республики Беларусь

    Белорусский национальный технический университет

    Кафедра “Металлические и деревянные конструкции”
    ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
    к курсовой работе на тему
    “...”
    Исполнитель ст. гр. 11111
    Иванов И.И.
    Руководитель Новиков В.Е.

    Минск, 2002
    Реферат
    Содержание

    Введение (Связь описываемой задачи с более общим вопросом)

    1. Математическая формулировка задачи

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

    1. Техническое задание на разработку программы

      1. Область использования

      2. Задание

      3. Требования к программе

      4. Используемый язык программирования

    2. Описание программы

      1. Идентификация переменных

        п/п

        Описание переменной, константы, массива

        Обозначение

        Тип

        В пояснительной записке

        В программе













        Real*4, ...

      2. Блок-схема программы

        1. Схема взаимодействия модулей

        2. Перечень модулей с пояснением выполняемых ими действий

      3. Схемы алгоритмов (для всех модулей программы)

    3. Методика тестирования программы

      1. Цель и метод тестирования

      2. Ограничения на входные и выходные данные, особенности использования программы.

      3. Ограничения на аппаратные и программные средства (CPU, RAM, OS и т.д.), названия модулей и их объем.

      4. Тестовый пример

    4. Выводы (выводы по результатам тестирования, рекомендации к использованию программы, оценка полноты решений, эффективность).

    5. Литература (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.

    Процесс




    Вычислительное действие или их последовательность.

    3.

    Решение




    Проверка условий.

    4.

    Модификация




    Начало цикла вычислений.

    5.

    Предопределенный процесс




    Определение вычислений по подпрограмме или стандартной программе. Обычно обозначается вызов подпрограммы.

    6.

    Данные




    Ввод-вывод данных.

    7.

    Соединитель




    Разрыв линий схемы (связывающей блоки) алгоритма.

    8.

    Ссылка на другую страницу




    Используется при переносе части схемы на другую страницу. Если блок стоит в конце обрываемой схемы, то m – страница, на которой продолжится прерванная схема, n – номер следующего блока. Если соединитель стоит в начале прерванной схемы, то m – номер страницы, на которой схема прервана, а n – номер предыдущего блока.

    9.

    Комментарий




    Пояснения к схеме алгоритма, формулы.

    Каждый блок необходимо нумеровать в пределах программной единицы (головная программа, подпрограмма и т.д.).

    Принципиальная блок-схема алгоритма решения задачи обычно содержит следующие логические структуры:

    1
    [2]
    . Следование. Структура представляет собой последовательность блоков S
    1, 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.

    X=a*b+c**2

    Z=a*b*c

    Y=a*b

    X=y+c*c

    Z=y*c

    Исключение повторных вычислений, т.е. избыточных команд, повторяющих сделанные ранее вычисления.

    2.

    Do i=1,m

    K=k+k**2

    End do

    Do i=1,m

    K=k+k*k

    End do

    Замена медленно выполняемых операций на более быстрые (особенно в циклах). Время выполнения возрастает в следующем порядке: сложение или вычитание, умножение, деление, возведение в степень.

    3.







    Применение констант в арифметических выражениях, т.е. замена константами переменных, значения которых известны и не изменяются в процессе вычислений.

    4.

    Y=5*a+9*b+4.4*c

    Y=5.*a+9.*b+4.4*c

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

    5.

    Do i=1,10

    A(i)=B(i)*100

    C(i)=B(i)*cos(x)

    End do

    Do i=1,10

    Y=B(i)

    A(i)=Y*100

    C(i)=Y*cos(x)

    End do

    Сокращение индексирования переменных, т.е. замена, где возможно, индексированных переменных на переменные без индекса, что уменьшит число операций индексирования.

    6.

    Do i=1,10

    A(i)=i**5.

    End do

    Do j=1,10

    B(j)=1.+j

    End do

    Do i=1,10

    A(i)=i**5

    B(i)=1.+i

    End do

    Объединение циклов, в случае последовательного исполнения в программе нескольких циклов с одинаковыми параметрами. В случае целой степени точка не ставится, т.к. возведение в целую степень вычисляется как повторное умножение, а в вещественную как логарифмирование (медленнее)

    7.

    Do i=1,10

    A(i)=i**5

    End do

    For j=1,15

    B(j)=j+1

    End do

    Do i=1,10

    A(i)=i**5

    B(i)=i+1.

    End do

    Do j=11,15

    B(j)=j+1.

    End do

    Объединение циклов, в случае если параметры одного цикла являются подмножеством параметров другого цикла.

    8.

    Do i=1,100

    A(i)=1.

    End do

    Do i=1,99,2

    A(i)=1.

    A(i+1)=1.

    End do

    Развертка цикла, позволяющая уменьшить количество повторений цикла за счет увеличения количества операторов, выполняемых внутри области цикла. При этом уменьшается количество необходимой памяти.

    9.

    Do i=1,100

    A(i)=b*c+x(i)

    If(b*c.Lt.0) then

    A(i)=3*b*c+x(i)

    End if

    End do

    Z=b*c

    Flag=Z.Lt.0

    Do i=1,100

    If (flag) then

    A(i)=3.*Z+x(i)

    ElseIf

    A(i)=z+x(i)

    End if

    End do

    Вывод из цикла неизменяемых выражений, позволяющий сократить число операций, выполняемых внутри цикла. В улучшенном коде при b*c<0 элементы A(i) не вычисляются дважды. Код можно оптимизировать далее по п.10.

    10.

    Do i=1,10

    If (x.ge.0.)
    a(i)=0.

    B(i)=i*2

    End do

    If (x.Ge.0.) Then

    Do i=1,10

    A(i)=0.

    Next i

    End If

    Do i=1,10

    B(i)=i*2

    End do

    Разбиение цикла, если внутри цикла есть условный оператор с условием, которое является неизменным. Прием позволяет избежать многократной проверки условия, заменив ее на однократную.

    11.

    Do i=1,100

    Do j=1,10

    a(i,j)=i*j

    End do

    End do

    Do j=1,10

    Do i=1,100

    a(j,i)=i*j

    End do

    End do

    Правильное вложение циклов. При использовании вложенных циклов следует стремиться к уменьшению количества инициализаций внутренних циклов, т.е. внешний цикл должен исполняться меньшее число раз, нежели внутренний.

    12.

    X=1.0E+30

    Y=–1.0E+30

    Z=5.0

    Write(*,*)x+(y+z)

    (x*y+z*c)/k

    X=1.0E+30

    Y=–1.0E+30

    Z=5.0

    Write(*,*)(x+y)+z

    X*y/k+z*c/k


    Избежание вычитания близких чисел, деления больших по модулю чисел на малые для снижения погрешности результатов вычислений. В первом фрагменте будет получен неверный результат 0.000000E+00, во втором верный – 5.000000.

    13.

    x=0.1

    Do i=1,1000

    Write(*,*) x

    X=x+0.1

    If(x.eq.1.0)
    exit

    End do

    X=0.1

    Do i=1,1000

    Write(*,*) x

    X=x+0.1

    If (abs(x–1.0).Le.1.0E-5) exit

    End do

    Устранение ошибок округления выражений с вещественными или комплексными операндами. В первом фрагменте цикл всегда доходит до конца, т.к. х из-за ошибки округления никогда в точности не будет равен 1.0. Во втором фрагменте выход из цикла осуществляется, если х приблизительно равен 1.0, т.е. лежит в интервале [1.0-1.0E-5,1.0+1.0E-5].

    Программа должна быть наглядной и удобочитаемой, для чего необходимо: 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

    123




    +123




    0




    00000123




    32767




    -32767




    -#AB05

    Основание 16

    2#010111

    Основание 2

    -36#ABZ07

    Основание 36

    2) Вещественный тип

    REAL или REAL*4

    -123.456

    +123.456

    123.456

    -123.

    +123.

    123.

    -.456

    +.456

    .456

    +1.000Е-2

    1.Е-2

    1Е-2

    +0.01

    100.0Е-4

    0.0001Е+2

    REAL*8 или DOUBLE PRECISION

    +1.123456789D-2

    1.D-2

    1D-2

    +0.000000001D0

    100.0000005D-4

    .00012345D+2

    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’/ ! Символьный

    Выражения

    Арифметические выражения

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

    Арифметические операторы

    Оператор

    Операция

    Приоритет




    A/B*C



    (A/B)*C

    * *

    Возведение в степень

    Высший




    A**B**C

    A**(B**C)

    /

    Деление

    Средний










    *

    Умножение

    Средний












    Вычитание или отрицание

    Низший










    +

    Сложение или идентичность

    Низший










    Операции равного приоритета, за исключением возведения в степень выполняются слева направо. Возведение в степень выполняется справа налево.

    Результатом деления двух целых чисел является величина, равная математическому частному двух этих величин, округленного до целого в сторону нуля. Поэтому 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.

    Оператор

    Операция

    .LT.

    Меньше чем

    .LE.

    Меньше или равно

    .EQ.

    Равно

    .NE.

    Не равно

    .GT.

    Больше чем

    .GE.

    Больше или равно

    A.LT.B.NE.C  A.LT.B.AND.B.NE.C


    Логические выражения

    Логические операторы:

    Оператор

    Операция

    Приоритет

    Пояснения

    .NOT.

    Отрицание

    Наивысший

    Значение аргумента изменяется на противоположное.

    .AND.

    Конъюнкция

    Средний

    Выражение истинно, если оба аргумента истинны, иначе оно ложно.

    .OR.

    Включающая дизъюнкция

    Низший

    Выражение ложно, если оба аргумента ложны.

    .NOT. A .OR. B.AND. C выполняется как (.NOT. A) .OR. (B .AND. C).

    1 – ИСТИНА, а 0 – ЛОЖЬ.

    Пример. При A=10, B=8, C=6 выражения:

    .Nоt.(A.Gt.B) равно False; .Nоt.(B.Gt.A) равно True; (A.Gt.B.And.B.Gt.C) равно True;

    (B.Gt.A.And.B.Gt.C) равно False; (A.Gt.B.Or.B.Gt.C) равно True; (B.Gt.A.Or.B.Gt.C) равно True;

    (A.Gt.B.Eq.B.Gt.C) равно True; (B.Gt.A.Eq.B.Gt.C) равно False.

    Например, вычислим логическое выражение f.And.g.Or.Nоt.g.Or.h при f=.True., g=.False., h=f. Расставим скобки в порядке вычисления результата: (((f.And.g).Or.(Nоt.g)).Or.h). Определяем .Nоt.g=.True., f.And.g=.False., тогда .False..Or..True.=.True. и окончательно .True..Or..True.=.True.. Выражение f.And.g.Or.Nоt.(g.Or.h) будет равно .False..

    A

    1

    1

    0

    0

    B

    1

    0

    1

    0

    .NOT.A

    0

    0

    1

    1

    A.AND.B

    1

    0

    0

    0

    A.OR.B

    1

    1

    1

    0

    A.EQV.B

    1

    0

    0

    1

    A.NEQV.B

    0

    1

    1

    0




    Когда в одном выражении встречаются арифметические, логические операторы и операторы отношения, они выполняются со следующими приоритетами:

    1. Арифметические (высший); 2. Символьные операции; 3. Отношения; 4. Логические (низший).

    Приоритет выполнения всех операций в логических выражениях приведен в табл.

    **

    * /

    + –

    .Lt. .Le. .Gt. .Ge.

    .Eq. .Ne.

    .Nоt.

    .And.

    .Or.

    .Eqv., .Neqv.

    Приоритет

    Замечания:

    1. Больше основополагающих терминов (выделение курсивом).

    2. Больше текстовых и гиперссылок.

    3. Перенести в 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.

    Последнее обновление произведено понедельник, 2 сентября 2019 г. 17:35


    Разные остатки
    Этапы жизненного цикла ПО (традиционная лавинообразная модель)


    Файл 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) методом простой итерации - значение уравнения на предыдущем шаге является значением независимого аргумента и снова подставляется в уравнение на последующем шаге. Принимаем начальное приближение x
    0=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).

    1. Фактические и формальные параметры обмениваются значениями при вызове п/п значения фактических переменных присваиваются соответствующим формальным, после завершения п/п наоборот. Таким образом, значения дублируются в ОЗУ.




    1. Передается не значение, а ссылка (адрес в ОЗУ) на значение фактического параметра. Таким образом, все действия над формальными переменными есть в действительности над соответствующими фактическими параметрами.

    • Если фактический параметр – выражение, то тип и длина формального параметра берутся равными типу и длине выражения.



    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’)- присоединение данных к файлу.


    1. ‘DIRECT’ – указывает на прямой доступ к файлу.




    1. ‘SEQUENTIAL’- указывает на последовательный доступ к файлу (по умолчанию)



    action – символьное выражение, задающее возможность действия с файлом и вычисляемое со значением:

      1. ‘READ’- процесс может только читать данные из файла.

      2. ‘WRITE’- возможна только запись в файл.

      3. ‘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 – символьное выражение, вычисляемой со значениями:

    1. ‘DENYRW’ – пока файл открыт в этом режиме, никакой другой процесс не может открыть этот файл ни для чтения, ни для записи.




    1. ‘DENYWR’ - пока файл открыт в этом режиме, никакой другой процесс не может открыть этот файл для записи.




    1. ‘DENYRD’ – пока файл открыт в этом режиме, никакой другой процесс не может открыть этот файл для чтения.




    1. ‘DENYNONE’ – любой другой процесс может открыть файл.


    Status – символьное выражение, вычисляемое со значениями:

    1. ‘OLD’ – файл должен уже существовать, иначе возникает ошибка.

    2. ‘NEW’ – файл не должен существовать (он создается), иначе возникает ошибка.




    1. ‘SCRATCH’ – по умолчанию, если опущен параметр FILE, создается временный рабочий файл. Временный файл удаляется при закрытии канала ввода/вывода или при завершении выполнения программы.




    1. ‘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


    1-ый шаг

    M=7

    L=k/10=394679

    J=3946790-10*394679=0

    K=394679

    C1=char(0+48)=’0’

    С(7:7)=с1=’0’


    2-ой шаг

    M=6

    L=k/10=394679/10=39467

    J=394679-10*39467=9

    K=L=39467

    C1=char(9+48)=char(57)=’9’

    C(6:6)=C1=’9’


    Функция 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



    1   ...   5   6   7   8   9   10   11   12   ...   15


    написать администратору сайта