Федеральное агентство морского и речного транспорта Федеральное государственное образовательное учреждение высшего профе...
5 downloads
190 Views
2MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Федеральное агентство морского и речного транспорта Федеральное государственное образовательное учреждение высшего профессионального образования Волжская государственная академия водного транспорта
Кафедра информатики, систем управления и телекоммуникаций Серия «Информационные технологии в системах управления и телекоммуникации» Выпу ск 1
Р.Н. Гурьяшова, А.В. Шеянов
Информатика Сегментация программ Учебно-методическое пособие для студентов очного и заочного обучения технических специальностей Рекомендовано государственным образовательным учреждением высшего профессионального образования "Московский государственный технический университет имени Н.Э.Баумана" в качестве учебного пособия для студентов высших учебных заведений, обучающихся по направлению подготовки 180400 "Эксплуатация водного транспорта и транспортного оборудования", по специальности высшего профессионального образования 180404 "Эксплуатация судового электрооборудования и средств автоматики"
Нижний Новгород Издательство ФГОУ ВПО «ВГАВТ» 2009
УДК 517.2:681.3 Г95 Редакционная коллегия серии «Информационные технологии в системах управления и телекоммуникаций»: д. т. н., профессор Ю.С. Федосенко (отв. редактор), д. т. н., профессор М.М. Чиркова, к. т. н., доцент В.И. Логинов, к. т. н., доцент А.В. Преображенский Гурьяшова, Р.Н. Информатика : Сегментация программ : учеб.-метод. пособие для студ. оч. и заоч. обуч. технич. специальностей / Р.Н. Гурьяшова, А.В. Шеянов. – Н. Новгород : Изд-во ФГОУ ВПО «ВГАВТ», 2009. – 108 с. Излагаются сведения по предлагаемой тематике для алгоритмических языков высокого уровня – Fortran, Basic. Приводятся схемы алгоритмов и программы, иллюстрирующие выполнение лабораторных работ на данных языках. Выполнение заданий на компьютере позволит студентам приобрести практические навыки решения задач с использованием подпрограмм и эффективно использовать их в учебном процессе. Предназначено для студентов высших учебных заведений водного транспорта технических специальностей. При написании пособия использован многолетний опыт преподавания авторами дисциплины «Информатика». Авторы выражают благодарность за ценные замечания доценту, к.т.н. Т.И. Гавриловой. Работа рекомендована к изданию кафедрой информатики, систем управления и телекоммуникации (протокол № 2 от 10.09.2008 г.).
© ФГОУ ВПО «ВГАВТ», 2009 2
Введение Сегментация программ – разбиение программ на подпрограммы – является одним из средств, позволяющих упростить разработку, тестирование и сопровождение больших программ. Использование подпрограмм является логичным шагом развития навыка программирования – от программ, написанных «по вдохновению», «одним куском», к программе, разработанной в соответствии с принципом «разделяй и властвуй», принципами разработки программ сверху вниз. В пособии излагается теоретический материал, связанный с использованием подпрограмм. Приводятся семь лабораторных работ и таблиц заданий к ним по следующим темам: • Функция. o Вычисление значения выражения. o Вычисление значения величины, заданной в форме ветвления. o Вычисление значения выражения (обработка массива). • Процедура. o Исследование функции одной переменной, зависящей от параметра. o Вычисление координат искомой точки. o Анализ итогов сдачи сессии. o Анализ итогов работы предприятия. Для каждой лабораторной работы приводятся программы на алгоритмических языках Basic, Fortran, используемых в учебном процессе. Кроме того, приводится пять таблиц индивидуальных заданий, предназначенных для самостоятельной работы. Приведенные программы тестировались в средах QBasic 1.0 (1.1), GNU g95 Fortran compiler и Intel Fortran. Программы легко могут быть адаптированы для других используемых версий Фортрана и Бейсика. Общие сведения по организации подпрограмм будут полезны при написании программ на любом поддерживающем их языке. 3
Цель пособия – научить студентов пользоваться инструментарием подпрограмм при решении возникающих алгоритмических задач. Предполагается, что приведенные листинги программ с большим количеством комментариев послужат студентам справкой для выполнения своих работ.
1. Теоретические сведения 1.1. Определение Подпрограмма – поименованная часть компьютерной программы (кода), содержащая описание определённого набора действий. Подпрограмма может быть многократно вызвана из разных частей основной (главной) программы и других подпрограмм. Имя подпрограммы образуется по правилам образования идентификаторов в языке (имена переменных образуются по тем же правилам). В некоторых языках различают подпрограммы: – функции, возвращающие значение (результат) в основную программу; – процедуры, не обязательно возвращающие значения. Бейсик и Фортран имеют такое разделение. Их названия в конкретных языках могут отличаться. Так, на Фортране официально используются термины: процедура-функция и процедура-подпрограмма, но суть от этого не меняется. В некоторых языках есть только функции (например, язык С).
1.2. Назначение Изначально подпрограммы появились как средство оптимизации программ по объёму занимаемой памяти – они позволили не повторять в программе идентичные блоки кода, а описывать их однократно и вызывать по мере необходимости. К настоящему времени данная функция подпрограмм стала вспомогательной, главное их назначение – структуризация программы с целью удобства её понимания и сопровождения. 4
Логичность и обозримость Выделение набора действий в подпрограмму позволяет логически выделить целостную подзадачу, имеющую типовое решение. Даже при однократном вызове создание подпрограммы оправдано, так как позволяет сократить размеры целостных блоков кода, составляющих программу, то есть сделать программу более понятной и обозримой. Поддерживаемость Любое изменение (исправление ошибки, оптимизация, расширение функциональности), сделанное в подпрограмме, автоматически отражается на всех её вызовах. В то же время, при копировании идентичных блоков кода каждое изменение необходимо вносить в каждый блок. Параметризация Оформление кода в виде подпрограммы с параметрами позволяет обобщить решение и, таким образом, использовать его для решения целого класса задач. Расширение языка Подпрограммы позволяют добавлять в язык нужные для решения задачи инструменты, которых там не было. Повторное использование Подпрограммы представляют собой обособленные кусочки кода, которые удобно повторно использовать. Хорошо написанная подпрограмма может быть использована в нескольких программах. Библиотеки Набор таких подпрограмм может быть объединен в библиотеку. Примером являются стандартные библиотеки, поставляемые с языками программирования. Концепция «черного ящика» Готовую (отлаженную) подпрограмму можно использовать как «черный ящик» – знать что «подается на вход» и что «получается на выходе», не вдаваясь в подробности происходящего внутри. В некоторых случаях большую программу удается составить из подпрограмм, как из кубиков.
5
1.3. Параметры Подпрограмма, не зависящая от входных данных, при каждом ее вызове выдает один и тот же результат. Стандартный способ передачи данных в подпрограмму – использование механизма параметров. Формальные параметры Формальные параметры используются при описании подпрограммы в ее начальной строке (заголовке). Формальными параметрами могут быть переменные, массивы (в зависимости от языка возможны и другие варианты). Они могут использоваться в подпрограмме аналогично другим переменным, описанным в ней. Фактические параметры Фактические параметры используются при вызове подпрограммы. Они указываются в команде вызова после имени подпрограммы. Фактическими параметрами могут быть переменные, элементы массива, массивы, константы, выражения. Имена формальных и фактических параметров могут совпадать. Значения фактических параметров подставляются вместо формальных (передача данных в подпрограмму), и все вычисления выполняются с ними. Важно! При вызове подпрограммы должно выполняться соответствие формальных и фактических параметров по количеству, порядку их следования в списке параметров, типу данных. Несоблюдение этих правил приводит к ошибкам.
1.4. Описание и вызов подпрограмм В языках высокого уровня описание подпрограммы состоит по меньшей мере из двух частей – заголовка и тела. Заголовок подпрограммы описывает её имя и, возможно, параметры, то есть содержит информацию, необходимую для вызова подпрограммы. Тело – набор операторов, который выполняется при каждом вызове подпрограммы. В Фортране и Бейсике имеется специальный оператор, обозначающий конец подпрограммы. Можно ли использовать для своей подпрограммы имя, совпадающее с именем стандартной подпрограммы, зависит от языка. 6
На QBasic это сделать нельзя (подпрограмму не удается записать). На Фортране подпрограмму записать можно, однако: • •
при вызове будет выполняться стандартная подпрограмма; для того, чтобы выполнялась своя подпрограмма, ее необходимо описать с помощью оператора EXTERNAL. Некоторые языки требуют, чтобы подпрограмма перед использованием была объявлена. Обычно объявление подпрограммы – строка, как правило, идентичная ее заголовку, из которой компилятор «узнает» название подпрограммы, тип входных параметров и для функции – тип возвращаемого значения. В Фортране похожая конструкция называется «блок интерфейса»: INTERFACE тело_интерфейса END INTERFACE
Здесь тело_интерфейса – это копии заголовков подпрограмм, описание параметров и завершающий оператор END. В общем случае блок интерфейса необязателен, но его необходимо использовать, в частности, для передачи в функцию частей массива. Вызов подпрограммы выполняется с помощью команды вызова, включающей в себя имя подпрограммы. В большинстве языков команда вызова представляет собой просто имя подпрограммы, за которым могут следовать фактические параметры. Как уже было сказано, в Фортране и Бейсике различаются подпрограммы и функции. Процедура (подпрограмма, процедура-подпрограмма) Процедура вызывается отдельным оператором. В зависимости от языка программирования, это может быть просто имя процедуры, и возможно – параметры. При вызове процедуры выполняются следующие действия: • •
вычисление фактических параметров (если они являются выражениями); формальные параметры заменяются на значения соответствующих фактических параметров; 7
• •
выполняются операторы тела процедуры; управление передается оператору основной программы следующему за оператором вызова.
Описание на Бейсике Общеупотребительные названия – подпрограмма, процедура, процедура SUB. SUB имя_процедуры [(параметр[, параметр, ...])] [операторы описания] [исполняемые операторы] END SUB П р и м е ч а н и е . Текст, приведенный в квадратных скобках, не является обязательным. В данном случае это означает, что процедура может быть как вообще без параметров (в этом случае не нужны и скобки), так и с одним параметром (в скобках) или несколькими (в скобках, через запятую).
•
Бейсик поддерживает две формы вызова: с помощью ключевого слова CALL: CALL имя_процедуры [(параметр[, параметр, ...])]
•
и без ключевого слова. В этом случае скобки не ставятся: имя_процедуры [параметр[, параметр, ...]]
Оболочка QBasic «прячет» подпрограммы. Вывод списка имен подпрограмм и переключение между ними осуществляется по клавише F2. На самом деле подпрограммы находятся в одном файле с основной программой, после нее.
• •
Пример Создадим две подпрограммы с именами: SAYHELLO – без параметров; TEST(N, K) – с параметрами N, K. Вызовем их различными способами. CALL SAYHELLO SAYHELLO CALL TEST(1, 2) 8
TEST 3, 4 END SUB SAYHELLO PRINT "HELLO" END SUB SUB TEST (N, K) PRINT "N + K = "; N + K END SUB
Результаты работы: HELLO HELLO N + K = 3 N + K = 7
Описание на Фортране Общеупотребительные названия – подпрограмма, процедураподпрограмма, процедура SUBROUTINE. Фортран поддерживает несколько типов подпрограмм, мы рассмотрим только так называемые внешние подпрограммы. Они располагаются после головной программы (после оператора END) в том же файле (или в отдельном программном файле). SUBROUTINE имя_процедуры ([парам1[, парам2, ...]]) [операторы описания] [исполняемые операторы] END [SUBROUTINE]
Использование скобок обязательно даже при пустом списке параметров (аналогично и при вызове процедуры). Поддерживается только одна форма вызова – с помощью ключевого слова CALL: CALL имя_процедуры ([параметр[, параметр, ...]])
• •
Пример Создадим и вызовем две подпрограммы с именами: SAYHELLO( ) – без параметров; TEST(N, K) – с параметрами N, K. 9
CALL SAYHELLO() CALL TEST(1, 2) END SUBROUTINE SAYHELLO() PRINT *,'HELLO' END SUBROUTINE TEST (N, K) PRINT *,'N + K =', N + K END SUBROUTINE
Результаты работы: HELLO N + K = 3
Функция (процедура-функция) Подпрограмма оформляется в виде функции, если в результате ее выполнения получается одно значение. Функция вызывается по имени и возвращает значение, которое можно использовать в выражении, например: y = sin(x) (возвращаемое значение присваивается переменной y); y = 1 – sin2(x) (возвращаемое значение используется в выражении). В случае функции дополнительно нужно выполнить передачу результата в вызывающую программу. На Фортране и Бейсике это делается присвоением вычисленного значения переменной, имя которой совпадает с именем функции. Если этого не сделать, то результатом функции будет неопределенное значение (в используемых реализациях на Бейсике получается 0, а на Фортране – произвольное значение). Вызов функции является выражением, он может использоваться в других выражениях или в качестве правой части оператора присваивания. При вызове функции выполняются следующие действия: •
вычисление фактических параметров (если они являются выражениями); 10
• • • •
формальные параметры заменяются на значения соответствующих фактических параметров; выполняются операторы тела функции (вычисляется результат); выполняется присваивание вычисленного значения (результата) переменной, имя которой совпадает с именем функции; управление возвращается в вызывающую программу. Значение функции является результатом вызова и может использоваться в выражении, откуда выполнялся вызов функции. Описание на Бейсике Общеупотребительное название – функция. FUNCTION имя_функции [(параметр[, параметр, ...])] [операторы описания] [исполняемые операторы] имя_функции = возвращаемое_значение END FUNCTION
При отсутствии параметров скобки в заголовке функции не ставятся (аналогично и при ее вызове). Пример Создадим две подпрограммы с именами: • RND10 – без параметров (с использованием датчика случайных чисел, табл. 6.2); • TEST(N, K) – с параметрами N, K. Вызовем их различными способами: в операторе печати, присваивания и в выражении. PRINT "Функция Test: "; TEST(1, 2) X = TEST(3, 4) Y = 3 * TEST(5, 6) + 1 PRINT "X=";X, "Y=";Y PRINT "Функция Rnd10: ";RND10 Z = RND10 - 2 PRINT "Z=";Z END
11
FUNCTION RND10 RND10 = 10 * RND END FUNCTION FUNCTION TEST (N, K) TEST = N + K END FUNCTION
Результаты работы: Функция Test: 3 X= 7 Y= 34 Функция Rnd10: 7.055475 Z= 3.33424
Описание на Фортране Общеупотребительные названия функция, процедура FUNCTION.
–
функция,
процедура-
[тип] FUNCTION имя_функции ([параметр[, параметр, ...]]) [операторы описания] [исполняемые операторы] имя_функции = возвращаемое_значение END [FUNCTION]
При отсутствии параметров использование скобок в заголовке функции обязательно (аналогично и при ее вызове). Если в заголовке тип функции не указан, то он определяется «по умолчанию», по первой букве имени (как и для переменных). Пример Создадим две подпрограммы с именами: • RND10( ) – без параметров (с использованием датчика случайных чисел, табл. 6.1); • TEST(N, K) – с параметрами N, K. Вызовем их различными способами: в операторе печати, присваивания и в выражении. PRINT *, 'Функция Test: ', TEST(1, 2) X = TEST(3, 4) Y = 3 * TEST(5, 6) + 1 PRINT *, 'X= ',X, 'Y= ',Y 12
PRINT *, 'Функция Rnd10: ', RND10() Z = RND10() - 2 PRINT *, 'Z= ', Z END FUNCTION RND10() CALL RANDOM_NUMBER(RND) RND10 = 10 * RND END REAL FUNCTION TEST (N, K) TEST = N + K END FUNCTION
Результаты работы: Функция Test: 3. X= 7. Y= 34. Функция Rnd10: 9.839003 Z= 4.999507
1.5. Подробнее о параметрах Передача по ссылке и по значению Фраза «формальные параметры заменяются на значения соответствующих фактических» не совсем точна. На самом деле существует два принципиально различных варианта передачи параметров. Первый – это передача по значению (by value). При этом способе значение фактического параметра копируется в новую переменную, далее все действия выполняются над копией. Соответственно даже если формальный параметр внутри подпрограммы меняется, после выхода из подпрограммы значение фактического параметра не изменится. Так, например, происходит вызов функции в языке С. Второй способ – это передача параметров по ссылке (by reference). При этом способе фактический параметр непосредственно подставляется вместо формального, и все изменения в параметрах остаются после выхода из подпрограммы. Так происходит вызов в языках QBasic и Fortran. 13
В некоторых языках имеется возможность указать, как передается тот или иной параметр. К примеру, в Visual Basic параметры передаются по ссылке, а для передачи по значению используется ключевое слово byVal. Назначение параметров – входные, выходные и переопределяемые (входные/выходные) Параметры, передаваемые по ссылке, можно использовать как дополнительные возвращаемые значения. Соответственно можно говорить о входных и выходных параметрах. Fortran позволяет явно указать назначение параметров. Для этого используется атрибут INTENT: • INTENT(IN) – входные, получают значения от соответствующих фактических параметров и не могут изменяться при выполнении подпрограммы; • INTENT(OUT) – выходные, получают значения в подпрограмме и передают их соответствующим фактическим параметрам в вызывающей программе; • INTENT(INOUT) – переопределяемые (входные / выходные), осуществляют связь в обоих направлениях. В таком случае компилятор будет контролировать использование параметров «по назначению», например, не допустит присваивания значения входному параметру. В языке QBasic подобной возможности нет. Пример Процедура MinMax, определяющая наибольшее и наименьшее значение в массиве. • Входные параметры – массив A( ) и его размерность N • Выходные – наибольшее и наименьшее значение AMAX, AMIN Программа, Fortran
Пояснения
REAL :: A(5) = (/2,3,1,4,2/)
Данные
CALL MINMAX(A,5,AMIN,AMAX)
Вызов п/п *
*
Подпрограммы
14
PRINT *,'МАССИВ А' PRINT *,A PRINT *,'AMIN= ',AMIN, 'AMAX= ', AMAX END
Вывод данных и результата
SUBROUTINE MINMAX(A, N, AMIN, AMAX)
П/п MINMAX
REAL, INTENT(IN), DIMENSION(N) :: A REAL, INTENT(OUT) :: AMIN, AMAX AMIN = 1E37 AMAX = -1E37 DO I = 1, N IF (A(I)AMAX) AMAX = A(I) ENDDO END SUBROUTINE
Входной параметр массив Выходные параметры
Результаты работы: МАССИВ А 2. 3. 1. 4. 2. AMIN= 1. AMAX= 4.
Передача массивов В некоторых языках нужно «объяснять», что параметр является массивом. Так, на QBasic после имени массива должны стоять пустые скобки ( ) и при описании подпрограммы, и при ее вызове. Пример Та же процедура MinMax, вариант на QBasic (см. пример предыдущего пункта). Программа, BASIC
DATA 2,3,1,4,2 DIM A(5)
Пояснения
Данные
PRINT "МАССИВ А" 15
FOR I = 1 TO 5 READ A(I) PRINT A(I) NEXT
Ввод/вывод данных
CALL MINMAX(A(), 5, AMIN, AMAX) PRINT "AMIN= ", AMIN, "AMAX= ", AMAX
Вызов п/п Вывод результата
END SUB MINMAX (A(), N, AMIN, AMAX) AMIN = 1E+37 AMAX = -1E+37 FOR I = 1 TO N IF A(I) < AMIN THEN AMIN = A(I) IF A(I) > AMAX THEN AMAX = A(I) NEXT END SUB
П/п, A параметрмассив
Результаты работы: МАССИВ А 2 3 1 4 2 AMIN=
1
AMAX=
4
На Fortran'е соответствующие формальные параметры должны быть описаны как массивы (см. пример предыдущего пункта). Часто язык позволяет внутри подпрограммы определить размер переданного массива. В QBasic'е и Фортране есть функции для определения: • нижней границы массива LBOUND(массив, номер_измерения); • верхней границы массива UBOUND(массив, номер_измерения). Если таких средств нет, то можно передать в подпрограмму вместе с массивом и его размер. В некоторых языках имеется возможность передавать вместо формального параметра-массива только его часть (сечение). Это можно сделать в Фортране 9х и старше, но такие подпрограммы обязательно должны быть описаны в блоке интерфейса. В QBasic'е этого сделать нельзя. 16
Пример Передача сечений массива в подпрограмму. Программа, Fortran
Пояснения
INTERFACE SUBROUTINE PRINTARR(A) REAL, DIMENSION (1:) :: A END SUBROUTINE END INTERFACE
Блок интерфейса
REAL :: A(6) = (/2,3,1,4,2,48/)
Исходные данные
PRINT *,'МАССИВ А - 1-Я ПОЛОВИНА' CALL PRINTARR(A(1:3)) PRINT *,'МАССИВ А - 2-Я ПОЛОВИНА' CALL PRINTARR(A(4:6))
Вызов п/п на сечении A(1:3) Вызов п/п на сечении A(4:6)
END SUBROUTINE PRINTARR(A) REAL, DIMENSION (1:) :: A PRINT *, A END SUBROUTINE
П/п, параметр массив A
Результаты работы: МАССИВ А - 1-Я ПОЛОВИНА 2. 3. 1. МАССИВ А - 2-Я ПОЛОВИНА 4. 2. 48.
На Фортране фактическим параметром для массива может быть его элемент (тогда массив в подпрограмме «начнется» с этого элемента). Это позволяет выполнить передачу части массива проще. Пример Формальный параметр – массив, соответствующий фактический параметр – элемент массива.
17
Программа, Fortran
Пояснения
REAL :: A(6) = (/2,3,1,4,2,48/)
Исходные данные
PRINT *,'МАССИВ А - 1-Я ПОЛОВИНА' CALL PRINTARR(A(1),3)
Вызов п/п с 1-го элемента
PRINT *,'МАССИВ А - 2-Я ПОЛОВИНА' CALL PRINTARR(A(4),3)
Вызов п/п с 4-го элемента
END SUBROUTINE PRINTARR(A,N) REAL, DIMENSION (N) :: A PRINT *, A END SUBROUTINE
П/п, параметрымассив A, длина N
Результаты работы: МАССИВ А - 1-Я ПОЛОВИНА 2. 3. 1. МАССИВ А - 2-Я ПОЛОВИНА 4. 2. 48.
Функция как параметр В некоторых языках можно передавать функцию (процедуру) как параметр. В Фортране это сделать можно, в QBasic'e – нельзя. Область применения очевидна: можно написать процедуру суммирования / интегрирования / построения графика произвольной функции. На Фортране, для передачи встроенной функции в качестве параметра, необходимо описать ее как INTRINSIC (внутренняя), а пользовательскую – как EXTERNAL (внешняя) (или записать для нее блок интерфейса). Пример Процедура ATAB выполняет табулирование переданной функции на заданном интервале [XN, XK] с шагом H. Формальные параметры: F – функция; 18
XN, XK – интервал; H – шаг табулирования. Программа, Fortran
Пояснения
INTRINSIC SIN EXTERNAL F1 CALL ATAB(F1, 0.0, 1.0, .25) CALL ATAB(SIN, 1.0, 3.14, .6) END FUNCTION F1(X) F1 = X*X END FUNCTION
SIN()- встроенная F1() – пользовательская функция Табулируем F1(X) Табулируем SIN(x) Функция F1
SUBROUTINE ATAB(F,XN,XK,H) PRINT *, ' X Y ' PRINT *, '---------------' 1 FORMAT(2X, F5.2, 2X, F5.2) X = XN DO WHILE (X 2. ⎩ Программа, BASIC
Пояснения
N = 10 PRINT "N", "FIB(N) " PRINT N, FIB(N) END FUNCTION FIB (N) IF N = 1 OR N = 2 THEN FIB = 1 ELSE FIB = FIB(N - 1) + FIB(N - 2) END IF END FUNCTION
Функция FIB Условие останова Рекурсивный вызов
Результаты работы: N 10
FIB(N) 55
Не все языки допускают использование рекурсии; QBasic поддерживает рекурсию, Фортран-77 – нет. В Фортране-9х для создания рекурсивной процедуры необходимо описать ее как RECURSIVE, а в случае функции – использовать для возврата значения имя, отличное от имени функции (ключевое слово RESULT).
24
Пример Числа Фибоначчи, Фортран. Программа, Fortran
Пояснения
N = 10 PRINT *, 'N FIB(N)' PRINT *, N, FIB(N) END RECURSIVE FUNCTION FIB(N) RESULT(F) IF (N == 1 .OR. N == 2) THEN F = 1 ELSE F = FIB(N-1) + FIB(N-2) END IF END FUNCTION
П/п, F возвр. знач Условие останова Рекурсивный вызов
Результаты работы: N FIB(N) 10 55.
1.8. Рекомендации по организации подпрограмм Ниже приводится один из возможных сценариев написания программы с использованием подпрограмм. 1. Выделить подзадачу, которая может повторяться неоднократно с различными исходными данными. 2. Записать математическую формулировку подзадачи. 3. Составить схему алгоритма решения подзадачи. 4. Определиться с именем и типом подпрограммы – функция или процедура. 5. Определиться со списком формальных параметров (переменные, используемые в алгоритме подзадачи) 6. Записать начальную строку (заголовок) подпрограммы. 7. Оформить подпрограмму на алгоритмическом языке. 8. Перейти к написанию основной программы, используя созданную подпрограмму для решения выделенной подзадачи. 9. Для каждого вызова подпрограммы определить свой список фактических параметров. Проверить соответствие формальных и фактических параметров по типу и количеству. 25
На практике подпрограммы создаются в результате двух процессов. Проектирование сверху вниз Программа проектируется сверху вниз. Разработка начинается с определения целей решения проблемы. После этого идет последовательная детализация, заканчивающаяся готовой программой. Рисуется схема алгоритма, блоки верхнего уровня разбиваются подробнее... При таком подходе блоки естественно становятся подпрограммами. «Стихийная» («естественная») разработка При программировании решения задачи код добавляется в головную программу (вне подпрограммы) или в подпрограмму, решающую текущую подзадачу. Работающий кусок, решающий обособленную подзадачу, выделяется в подпрограмму. Разграничение полномочий Подпрограмма должна решать только одну задачу. Это позволит вам повторно использовать подпрограммы, не внося в программу ничего лишнего. Например, если вы разделите решение дифференциального уравнения и построение графика, вы сможете использовать их и отдельно. Подпрограмма должна быть обозримой (один-два экрана). Возможно, более длинную подпрограмму стоит разделить на несколько. Комментарии Возможность включать комментарии в программу предусмотрена не зря. Не исключено, что к концу семестра вы не сможете вспомнить, что делает написанная ранее программа. Комментарий должен пояснять то, что непонятно. Пустая строка перед подпрограммой выделит ее лучше, чем комментарий на строке. Аналогично, грамотное использование отступов при записи программы выделит начало и конец блочных конструкций. И наконец, осмысленные имена переменных и процедур / функций прибавят коду понятности. Примеры типичных ошибок при записи арифметических выражений на алгоритмических языках Fortran, Basic приведены в табл. 6.3. 26
1.9. Пример. Вычисление расстояния от точки до начала координат 1. Задание На плоскости (x, y) заданы три точки: M1(a, b), M2(c, d), M3(p, q). Найти расстояние от каждой точки до начала координат. Исходные данные – координаты точек: a = −2, b = 1, c = 1, d = 3, p = 2, q = −2
представлены на графике: y
M2
M1
x
M3
2. Решение
Обозначим искомые величины – расстояния от точек до начала координат:
R1 = a 2 + b2 , R 2 = c 2 + d 2 , R 3 =
p2 + q2 .
Алгоритм решения задачи имеет линейную структуру и состоит из следующих действий: 1. Начало. 2. Ввод значений a, b, c, d, p, q. 3. Вычисление R1, R2, R3. 4. Вывод R1, R2, R3. 5. Останов. Очевидно, что вычисление выражения вида
x 2 + y 2 необхо-
димо выполнять трижды. Поэтому оформим вычисление в виде подпрограммы, например, с именем F. 27
x2 + y2
Для сравнения представим три варианта программ на каждом из алгоритмических языков Fortran, Basic: • •
без использования подпрограмм; с использованием подпрограмм. 3. Программы на алгоритмическом языке Fortran Без использования подпрограммы
! ! !
Объявляем переменные A,B,C,D,P,Q,R1,R2,R3 вещественного типа REAL :: A,B,C,D,P REAL :: Q,R1,R2,R3
! Координаты точек A = -2 ; B = 1 ; C = 1 D = 3 ; P = 2 ; Q = -2 ! Вычисляем R1,R2,R3 R1 = SQRT(A**2 + B**2) R2 = SQRT(C**2 + D**2) R3 = SQRT(P**2 + Q**2) ! Вывод на экран PRINT *, R1, R2, R3 END
Программы на алгоритмическом языке Fortran с использованием подпрограмм: Процедура FUNCTION
Процедура SUBROUTINE
! Объявляем переменные ! A,B,C,D,P,Q,R1,R2,R3 ! вещественного типа
! Объявляем переменные ! A,B,C,D,P,Q,R1,R2,R3 ! вещественного типа
REAL :: A,B,C,D,P REAL :: Q,R1,R2,R3
REAL :: A,B,C,D,P REAL :: Q,R1,R2,R3 28
! Координаты точек A = -2 ; B = 1 ; C = 1 D = 3 ; P = 2 ; Q = -2
! Координаты точек A = -2 ; B = 1 ; C = 1 D = 3 ; P = 2 ; Q = -2
! Вычисляем R1,R2,R3 ! Вызов функции F R1 = F(A,B) R2 = F(C,D) R3 = F(P,Q)
! Вычисляем R1,R2,R3 ! Вызов подпрограммы F CALL F(A,B,R1) CALL F(C,D,R2) CALL F(P,Q,R3)
! Вывод на экран PRINT *, R1, R2, R3 END
! Вывод на экран PRINT *, R1, R2, R3 END
! Процедура FUNCTION F FUNCTION F(X,Y) F=SQRT(X**2+Y**2) END FUNCTION
! Процедура SUBROUTINE F SUBROUTINE F(X,Y,REZ) REZ=SQRT(X**2+Y**2) END SUBROUTINE
Результаты выдаются на экран в виде: 2.236068
3.162278
2.828427
4. Программы на алгоритмическом языке Basic Без использования подпрограммы
'Задаем координаты точек A = -2: B = 1: C = 1 D = 3: P = 2: Q = -2 ' Вычисляем R1 = SQR(A^2 R2 = SQR(C^2 R3 = SQR(P^2
R1,R2,R3 + B^2) + D^2) + Q^2)
' Вывод R1,R2,R3 PRINT R1, R2, R3 END 29
Программы на алгоритмическом языке Basic с использованием подпрограмм: Функция
Процедура
'Задаем координаты точек A = -2: B = 1: C = 1 D = 3: P = 2: Q = -2
'Задаем координаты точек A = -2: B = 1: C = 1 D = 3: P = 2: Q = -2
' Вычисляем R1,R2,R3 ' Вызов функции F R1 = F(A, B) R2 = F(C, D) R3 = F(P, Q)
' Вычисляем R1,R2,R3 ' Вызов подпрограммы F CALL F(A, B, R1) CALL F(C, D, R2) CALL F(P, Q, R3)
' Вывод R1,R2,R3 PRINT R1, R2, R3 END
' Вывод R1,R2,R3 PRINT R1, R2, R3 END
' Функция F FUNCTION F (X, Y) F = SQR(X^2 + Y^2) END FUNCTION
' Подпрограмма F SUB F (X, Y, REZ) REZ = SQR(X^2 + Y^2) END SUB
Результаты выдаются на экран в виде: 2.236068
3.162278
2.828427
1.10. Требования к выполнению лабораторной работы 1. 2. 3. 4.
5.
Выполнить ручной расчет результатов либо контрольных точек (для табулирования функции). Составить схему алгоритма основной программы и процедуры. Составить таблицу имен переменных, используемых в программе. Написать программу на указанном алгоритмическом языке в соответствии со схемой алгоритма, согласованной с преподавателем. Для читаемости программы использовать отступы при записи блочных конструкций (цикл, условие). 30
Для пояснения программы использовать комментарии. Выполнить программу. Проанализировать полученные результаты, сопоставив ручной расчет с машинным. 9. Представить отчет и защитить работу у преподавателя.
6. 7. 8.
Отчет должен включать следующие разделы: 1. Постановка задачи. 2. Ручной расчет результатов. 3. Обозначения переменных, используемые в программе, с пояснением их смысла. 4. Схема алгоритма основной программы и подпрограмм. 5. Программа. 6. Результат выполнения программы – распечатка результатов. Пример отчета – табл. 6.4
2. Примеры выполнения лабораторных работ Лабора торна я рабо та 1
Вычисление значения выражения Индивидуальные варианты – табл. 4.1. Математические функции – табл. 6.1, 6.2, 6.3. 1. Задание
Составить программу решения следующей задачи. Вычислить значение величины Z:
Z = (ln 2 | b | + cos a) 2 −
| ln 2 3 + cos b | a (ln 2 a + cos 2° )
,
где a = 1,5 b = −2. При разработке программы предусмотреть использование функции. 2. Решение
Выделим в функцию с именем F повторяющееся арифметическое выражение вида ln 2 x + cos y . 31
Функция F Формальные параметры функции: • Вещественные переменные X,Y. Результат: • Вычисленное значение. Таким образом, заголовок функции будет иметь вид – F(X,Y).
Для удобства отладки и написания программы введем для хранения промежуточных результатов дополнительные обозначения R, W, Q. R = ln 2 | B | + cos A ;
W = ln 2 3 + cos B ; Q = ln 2 A + cos 2° . С учетом введенных обозначений вычисление Z можно представить в виде:
Z = R2 −
|W | . A⋅Q
Обозначения переменных в программе
A, B R, W, Q Z
Исходные данные Промежуточные переменные Результат, искомая величина
В процессе вычисления значения Z обращение к функции происходит три раза, а именно: Имя переменной
Выражение 2
R W Q
ln |B| + cos A ln2 3 + cos B ln2 A + cos 2º
Вызов функции F
F(|B|, A) F(3, B) F(A, 2º)
П р и м е ч а н и е . Поскольку у тригонометрических функций аргумент должен быть указан в радианах, градусы необходимо перевести в радианы по
формуле
x ⋅π
.
180
Например, cos 2º записать как COS(2*3.1415/180). В реализации Intel Fortran имеются функции с аргументами в градусах (табл. 6.1), так что cos 2º можно записать как COSD(2.0).
32
Алгоритм решения задачи имеет линейную структуру и представляет собой последовательность следующих действий: • Ввод исходных данных – значений A, B. • Вычисление значений промежуточных величин R, W, Q. • Вычисление значения искомой величины Z. • Вывод значений A, B, Z (макет печати – п. 5, п. 8). Схема алгоритма представлена на рис. 2.1. Начало 1
A, B 2 Вычисление Z 3
A, B, Z
Останов
Рис. 2.1. Схема алгоритма к лабораторной работе 1 «Вычисление значения выражения»
Приведем два варианта программ на каждом из алгоритмических языков Fortran и Basic: • с использованием функции, • без использования функции. 3. Fortran-программа с использованием функции Код исходного модуля
! Лабораторная работа 1 ! Петров А.Н. М-11 ! Процедура FUNCTION REAL :: R,W,Q,Z,A = 1.5 , B = -2 R W Q Z
= = = =
F(ABS(B),A) F(3.0,B) F(A,2*3.1415/180) R**2 - SQRT(ABS(W))/(A * Q) 33
Пояснения
Ввод данных Вызов функции F
PRINT 1, A,B,Z FORMAT(1X,' ИСХОДНЫЕ ДАННЫЕ '/ & 3X,' A = ',F3.1,' B = ',F3.0/ & 1X,' РЕЗУЛЬТАТ Z = ',E11.4 ) END
1
! Функция F REAL FUNCTION F(X,Y) REAL :: X,Y F = LOG(X)**2 + COS(Y) END FUNCTION
Вывод данных и результата
Функция F
Результаты работы программы приведены ниже (п. 4). П р и м е ч а н и е . Вычисление значения Z можно представить и в виде одного оператора (должно быть набрано одной строкой): Z = F(ABS(B), A) ** 2 - SQRT(ABS(F (3.0, B))) / (A * F(A, 2 * 3.1415 / 180)) Однако при его написании легко допустить ошибки, чаще всего – несоответствие скобок.
4. Макет печати результатов (по Fortran-программе) ИСХОДНЫЕ ДАННЫЕ A = 1.5 B = -2. РЕЗУЛЬТАТ Z = -0.2056E+00
Для сравнения приведем программы без использования функции. 5. Fortran-программа без использования функции Код исходного модуля
! Лабораторная работа 1 ! Петров А.Н. М-11 ! Линейный алгоритм A = 1.5 ; B = -2
Пояснения
Данные
R = LOG(ABS(B))**2 + COS(A) W = LOG(3.0)**2 + COS(B)
34
Вычисление значения Z
Q = LOG(A)**2 + COS(2 * 3.1415/180) Z = R**2 - SQRT(ABS(W))/(A * Q) PRINT *,' A = ',A,' B = ',B,' Z = ',Z END
Вывод
Результаты работы программы приведены ниже (п. 6). 6. Макет печати результатов (по Fortran-программе) A =
1.5
B =
-2.
Z =
-0.20559886
7. Basic-программа с использованием функции Код исходного модуля
' Лабораторная работа 1 ' Петров А.Н. М-11 ' Подпрограмма FUNCTION DATA 1.5,-2 READ A, B R W Q Z
= = = =
Пояснения
Ввод данных
F(ABS(B), A) F(3, B) F(A, 2 * 3.1415 / 180) R ^ 2 - SQR(ABS(W)) / (A * Q)
PRINT TAB(3); "ИСХОДНЫЕ ДАННЫЕ " PRINT TAB(5); "A= "; A; "B= "; B PRINT "РЕЗУЛЬТАТ Z= "; Z END ! Функция F FUNCTION F (X, Y) F = LOG(X) ^ 2 + COS(Y) END FUNCTION
Вызов функции F
Вывод данных и результата
Функция F
П р и м е ч а н и е . Вычисление значения Z можно представить и в виде одного оператора (должно быть набрано одной строкой): Z = F(ABS(B), A) ^ 2 - SQR(ABS(F(3, B))) / (A * F(A, 2 * 3.1415 / 180))
35
Однако при его написании легко допустить ошибки, чаще всего – несоответствие скобок.
8. Basic-программа без использования функции Код исходного модуля
Пояснения
' Лабораторная работа 1 ' Петров А.Н. М-11 ' Линейный алгоритм A = 1.5: B = -2 R W Q Z
= = = =
Данные
LOG(ABS(B)) ^ 2 + COS(A) LOG(3) ^ 2 + COS(B) LOG(A) ^ 2 + COS(2 * 3.1415 / 180) R ^ 2 - SQR(ABS(W)) / (A * Q)
PRINT "A="; A; " B="; B ; " Z="; Z END
Вычисление значения Z
Вывод
Лабора торна я рабо та 2
Вычисление значения величины, заданной в форме ветвления Индивидуальные варианты – табл. 4.2. 1. Задание
Составить программу решения следующей задачи: Вычислить значение величины Z, заданной в виде ветвления.
⎧max[a, b·max(a, k!)] ⎪b − a ⋅ (2k )! ⎪ Z=⎨ ⎪a + b ⋅ (k + 2)! ⎪⎩a ⋅ b − (k 2 )!
при при при при
a0 B R
3
R=Y
3 P=P·I 4 ZMAX = R
4 Конец цикла по I
Выход
5 FK = P Выход
Рис. 2.2. Схема алгоритма к лабораторной работе 2
39
«Вычисление значения величины, заданной в форме ветвления»
Обращение к функции FK в основной программе выполняется четыре раза: Факториал
Вызов функции FK
K! (2·K)! (K + 2)! (K2)!
FK(K) FK(2·K) FK(K + 2) FK(K2)
Обращение к функции ZMAX в основной программе выполняется дважды: Формула
Вызов функции ZMAX
max(A, K!) max(A,B·max(A, K!))
ZMAX(A, FK(K)) ZMAX(A, B*Z)
Внимание! При каждом конкретном наборе значений A, B, К будет выполняться только одна ветвь. Поэтому для проверки всех ветвей алгоритма необходимо поочередно ввести исходные данные для каждого из четырех вариантов (макет печати – п. 5). Обозначения переменных в основной программе
A, B, K Z
Исходные данные Результат, искомая величина
3. Листинг Fortran-программы Код исходного модуля
! Лабораторная работа 2 ! Петров А.Н. М-11 ! Процедура FUNCTION
Пояснения
Основная программа
REAL :: A,B,Z INTEGER :: K PRINT *,' Введите А,В,К ' 40
Ввод
READ(*,*) A,B,K
данных
IF(A < B) THEN IF(B > 0) THEN Z = ZMAX(A, FK(K)) Z = ZMAX(A, B*Z) ELSE Z = B - A * FK(2 * K) END IF ELSE IF (B == 1) THEN Z = A + B * FK(K + 2) ELSE Z = A * B - FK(K**2) END IF END IF 3
PRINT 3, A,B,K,Z FORMAT(2X,' ИСХОДНЫЕ ДАННЫЕ '/ & 2X,' A = ',F3.0,' B = ',F3.0, & ' K = ',I2/' РЕЗУЛЬТАТ Z=',F3.0) PRINT *, '------------------------'
A0 A=B, B1
Вывод данных и результата
END ! Функция вычисления факториала FK = M! REAL FUNCTION FK(M) REAL :: P INTEGER :: M,I P = 1 DO I = 2, M P = P * I ENDDO FK = P END FUNCTION ! Функция вычисл. максимума 2х чисел REAL FUNCTION ZMAX(X,Y) REAL :: X,Y,R R = X IF (Y > R) R = Y ZMAX = R 41
Функция FK
Цикл
П/п ZMAX
END FUNCTION
Результаты работы программы ниже (п. 5). П р и м е ч а н и я . 1. При проверке условия для краткости программы можно использовать логические связки (AND, OR, NOT), объединяя несколько условий, например: IF (A < B .AND. B > 0) THEN 2. В связи с особенностью используемой оболочки при выполнении программы результат предыдущего выполнения пропадает. 3. На Фортране имеется стандартная функция MAX (и MIN, табл. 6.1). Таким образом, выражение max(A,B·max(A,K!)) можно представить в виде
Z = MAX(A, B* MAX(A, FK(K)) Но тогда это не будет соответствовать постановке задачи («Вычисление наибольшего значения оформить в виде функции»).
4. Листинг Basic-программы Код исходного модуля
Пояснения
' Лабораторная работа 2 ' Петров А.Н. М-11 ' Подпрограмма FUNCTION
Основная программа
INPUT " Введите А,В,К "; A, B, K
Ввод данных
IF A < B THEN IF B > 0 THEN Z = ZMAX(A, Z = ZMAX(A, ELSE Z = B - A * END IF ELSE IF B = 1 THEN Z = A + B * ELSE Z = A * B END IF END IF PRINT PRINT PRINT PRINT
A0
FK(K)) B * Z) FK(2 * K)
FK(K + 2) FK(K ^ 2)
TAB(3); "ИСХОДНЫЕ ДАННЫЕ " "A = "; A; "B = "; B; " K = "; K USING " РЕЗУЛЬТАТ Z = ## "; Z "------------------------" 42
A=B и B1
Вывод данных и результата
END ' Функция вычисления факториала FK=M! FUNCTION FK (M) P = 1 FOR I = 2 TO M P = P * I NEXT I FK = P END FUNCTION ' Функция вычисл. максимума 2х чисел FUNCTION ZMAX (X, Y) R = X IF Y > R THEN R = Y ZMAX = R END FUNCTION
Функция FK Цикл
Функция ZMAX
П р и м е ч а н и е . При проверке условия для краткости программы можно использовать логические связки (AND, OR, NOT), объединяя несколько условий, например: IF A < B AND B > 0 THEN
5. Макет печати результатов (по Basic-программе)
43
Введите А,В,К ? 2,4,3 ИСХОДНЫЕ ДАННЫЕ A = 2 B = 4 K = 3 РЕЗУЛЬТАТ Z = 24 -----------------------Введите А,В,К ? -2,-1,1 ИСХОДНЫЕ ДАННЫЕ A = -2 B = -1 K = 1 РЕЗУЛЬТАТ Z = 3 -----------------------Введите А,В,К ? 2,1,2 ИСХОДНЫЕ ДАННЫЕ A = 2 B = 1 K = 2 РЕЗУЛЬТАТ Z = 26 -----------------------Введите А,В,К ? 5,4,2 ИСХОДНЫЕ ДАННЫЕ A = 5 B = 4 K = 2 РЕЗУЛЬТАТ Z = -4 ------------------------
Лабора торна я рабо та 3
Вычисление значения выражения (обработка массива) Индивидуальные варианты – табл. 4.3. Математические функции – табл. 6.1, 6.2, 6.3. 1. Задание
Составить программу решения следующей задачи. Вычислить значение величины Z: n −1
k
n
i=2
i =1
i =1
Z = ∑ tg ai2 + max{∑ tg bi2 , ∑ tg ai2 } , где n = 4, k = 3. Вычисление суммы оформить в виде функции. Исходные данные – значения элементов массивов А и В – зададим самостоятельно:
44
Массив А
A1 2
A2 3
Массив В
A3 2
A4 4
B1 1
B2 3
B3 2
2. Решение
Введем дополнительные обозначения для сумм – S1, S2, S3 соответственно: n −1
S1 =
∑ tg a
i=2
2 i
k
, S2 =
∑ tg b i =1
2 i
n
, S3 =
∑ tg a i =1
2 i
.
Тогда вычисление Z можно представить в виде Z = S1 + max(S2,S3) Очевидно, что для решения данной задачи значения сумм необходимо вычислить три раза. Выделим в функцию с именем SUM вычисление суммы вида
S=
M
∑ tg c
i=L
2 i
.
Функция SUM Формальные параметры функции: • Массив с именем С – вещественного типа. • Целочисленная переменная L (нижний предел суммирования). • Целочисленная переменная M (верхний предел суммирования). Результат: • Значение суммы. Заголовок функции будет иметь вид – SUM(C,L,M). Алгоритм подпрограммы – это циклический алгоритм вычисления суммы элементов массива (рис. 2.3). Обозначения переменных в функции SUM
S I L, M Ci, C(I) SUM
Сумма Порядковый номер элемента массива, параметр цикла Начальное и конечное значения I Элемент массива с номером I Возвращаемое значение суммы (имя функции)
Основная программа 45
• •
В основной программе осуществляется: Ввод-вывод данных – значений N, K и элементов Аi и Вi. Вычисление искомой величины Z в соответствии с постановкой задачи выполняется в следующем порядке: o Вычисление сумм S1, S2, S3 производится в результате обращения к функции SUM: Имя
Сумма n −1
S1
∑ tg a
2 i
SUM(A,2,N – 1)
2 i
SUM(В,1,К)
i=2 k
S2
∑ tg b
i =1 n
S3
∑ tg a i =1
• •
Вызов функции SUM
2 i
SUM(A,1,N)
o Вычисление наибольшего значения из величин S2, S3. o Вычисление искомой величины Z. Вывод значений промежуточных величин – S1, S2, S3, MAX. Вывод результата Z (макет печати – п. 5).
46
Рис. 2.3. Схема алгоритма к лабораторной работе 3 «Вычисление значения выражения»
47
Обозначения переменных в основной программе
N K Ai, A(I) Bi, B(I) S1, S2, S3 MAX Z
Количество элементов в массиве А Количество элементов в массиве В Элемент массива А с номером I Элемент массива B с номером I Значения сумм S1, S2, S3 Наибольшее из сумм S2, S3 Искомая величина
3. Листинг Fortran-программы Код исходного модуля
Пояснения
! Лабораторная работа 3 ! Петров А.Н. М-11 ! Процедура FUNCTION EXTERNAL SUM REAL :: REAL :: INTEGER REAL :: 2
Основная программа
A(4) = (/2,3,2,4/) B(3) = (/1,3,2/) :: N = 4, K = 3 S1,S2,S3,Z,MAX
Задание исходных данных
PRINT 2, N,K,A,B FORMAT(' ИСХОДНЫЕ ДАННЫЕ '/ & 2X,'N = ',I1,' K = ',I1/ & 1X,' МАССИВ A: ',4(F3.0,2X)/& 1X,' МАССИВ B: ',3(F3.0,2X))
Вывод исходных данных
S1 = SUM(A,2,N-1) S2 = SUM(B,1,K) S3 = SUM(A,1,N) MAX = S2 IF(S3 > MAX) MAX = S3 Z = MAX + S1
Вызов п/п SUM Вызов п/п SUM Вызов п/п SUM Max(S2,S3)
PRINT 4, S1,S2,S3,MAX,Z 4 FORMAT(2X,' S1 = ',E11.4/ & ' S2 = ',E11.4/2X,' S3 = ',& E11.4/' MAX = ',E11.4/, & ' РЕЗУЛЬТАТ Z = ',E11.4) END 48
Вывод промежуточных значений и результата Z
! Функция вычисления суммы SUM REAL FUNCTION SUM(C,L,M) REAL :: C(M),S INTEGER :: I,L,M S = 0 DO I = L,M S = S + TAN(C(I)**2) ENDDO SUM = S END FUNCTION
Функция SUM
Цикл Вычисление суммы
Результаты работы программы представлены ниже (п. 5). П р и м е ч а н и я . 1. В Фортране имеется встроенная функция SUM (для работы с массивами). Для того чтобы использовать собственную функцию с тем же именем, необходимо описать ее как EXTERNAL (внешний). 2. Для вычисления максимума можно использовать встроенную функцию MAX (табл. 6.1): Z = MAX(S2, S3) + S1 3. Ввод данных в программе можно «поручить» датчику случайных чисел (табл. 6.1). Тогда фрагмент программы, осуществляющий ввод-вывод массивов, может выглядеть следующим образом (обратите внимание на операции над массивом «целиком»):
Код исходного модуля
Пояснения
DIMENSION A(4), B(3) N = 4; K = 3
2
CALL RANDOM_SEED() CALL RANDOM_NUMBER(A) A=FLOOR(A*5.0)
Заполнение массива А
CALL RANDOM_NUMBER(B) B=FLOOR(B*5.0)
Заполнение массива B
PRINT 2, N,K,A,B FORMAT(' ИСХОДНЫЕ ДАННЫЕ '/ & 2X,'N = ',I1,' K = ',I1/ & 1X,' МАССИВ A: ',4(F3.0,2X)/& 1X,' МАССИВ B: ',3(F3.0,2X))
Вывод данных
END 49
4. Листинг Basic-программы Код исходного модуля
' Лабораторная работа 3 ' Петров А.Н. М-11 ' Подпрограмма FUNCTION
Пояснения
Основная программа
CLS DIM A(4), B(3) DATA 2,3,2,4,1,3,2 N = 4: K = 3 PRINT "ИСХОДНЫЕ ДАННЫЕ " PRINT STRING$(16, "*") PRINT USING " N = # K = # "; N; K PRINT " МАССИВ А : "; FOR I = 1 TO N READ A(I) PRINT USING " # "; A(I); NEXT PRINT PRINT " МАССИВ В : "; FOR I = 1 TO K READ B(I) PRINT USING " # "; B(I); NEXT PRINT
Задание исходных данных
Ввод-вывод массива А
Ввод-вывод массива B
S1 = SUM(A(), 2, N - 1) S2 = SUM(B(), 1, K) S3 = SUM(A(), 1, N)
Вызов п/п SUM Вызов п/п SUM Вызов п/п SUM
IF S2 > S3 THEN MAX=S2 ELSE MAX=S3 Z = S1 + MAX
Max(S2,S3)
PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT END
Вывод промежуточных значений и результата Z
" РЕЗУЛЬТАТЫ ВЫЧИСЛЕНИЙ : " STRING$(24, "*") USING " S1 = ##.####^^^^ ";S1 USING " S2 = ##.####^^^^ ";S2 USING " S3 = ##.####^^^^ ";S3 " МАХ(S2,S3) = "; USING "##.####^^^^ "; MAX USING " Z = ##.####^^^^ "; Z
50
' Функция вычисления суммы SUM FUNCTION SUM (C(), L, M) S = 0 FOR I = L TO M S = S + TAN(C(I) ^ 2) NEXT SUM = S END FUNCTION
Функция SUM Цикл Вычисление суммы
П р и м е ч а н и е . Ввод данных в программе можно «поручить» датчику случайных чисел (табл. 6.2). Тогда фрагмент программы, осуществляющий вводвывод массивов, будет выглядеть следующим образом:
Код исходного модуля
Пояснения
DIM A(4), B(3) N = 4: K = 3 PRINT " МАССИВ А : "; FOR I = 1 TO N A(I)=INT(RND * 5) PRINT USING " # "; A(I); NEXT PRINT
Ввод-вывод массива А
PRINT " МАССИВ В : "; FOR I = 1 TO K B(I)=INT(RND * 5) PRINT USING " # "; B(I); NEXT PRINT
Ввод-вывод массива B
5. Макет печати результатов (по Fortran-программе) ИСХОДНЫЕ ДАННЫЕ N = 4 K = 3 МАССИВ A: 2. 3. 2. 4. МАССИВ B: 1. 3. 2. S1 = 0.7055E+00 S2 = 0.2263E+01 S3 = 0.2164E+01 MAX = 0.2263E+01 РЕЗУЛЬТАТ Z = 0.2968E+01
51
Лабора торна я рабо та 4
Исследование функции одной переменной, зависящей от параметра Индивидуальные варианты – табл. 4.4. Математические функции – табл. 6.1, 6.2, 6.3. 1. Задание
Составить программу решения следующей задачи. Вычислить таблицу значений аргумента x и функции y = f ( x,α ) на интервале [Xmin, Xmax] с шагом Δx. Параметр α и шаг Δx принимают два набора значений: (α1, Δx1) и (α2, Δx2).
y = α | x | − cos2αx . Протабулировать функцию и найти ее наименьшее и наибольшее значение. При составлении программы предусмотреть использование процедуры. Исходные данные: Xmin
Xmax
α1
α2
Δx1
Δx2
0
1
1
1,5
0,5
0,25
Результаты выдаются в виде двух таблиц (макет печати – п. 5). Вычислим значения функции y = f ( x,α ) в начальной и конечной точке интервала [Xmin, Xmax]: Контрольные точки
Функция Y
Аргумент X Xmin Xmax
f ( x,α1 )
f ( x,α 2 )
–1 0,708
–1 1,495
0 1
2. Решение
52
Оформим в процедуру с именем TB табулирование функции
y = f ( x,α ) на интервале [Xmin, Xmax] с шагом ΔX, а также вы-
числение ее наименьшего и наибольшего значения. Очевидно, что в процессе решения задачи табулирование функции на заданном интервале необходимо выполнить дважды: • с шагом Δx1 – при α = α1; • с шагом Δx2 – при α = α2. Величины Δx и α меняются при повторном вызове подпрограммы, поэтому их мы передадим как параметры. Величины Xmin, Xmax не меняются, их мы сделаем глобальными. Процедура TB Формальные параметры процедуры Входные параметры: • Вещественная переменная A (α – параметр функции y = f ( x,α ) ). • Вещественная переменная DX (ΔX – шаг изменения аргумента X). Глобальные переменные: • Вещественные переменные XMIN, XMAX (Xmin, Xmax – начало и конец интервала табулирования). Результат работы процедуры: • Вычисление и вывод таблицы значений аргумента и функции, а также искомых величин (макет печати – п. 5). Выходных параметров нет, так как все результаты печатаются в процедуре и в основную программу не передаются. Таким образом, заголовок процедуры имеет вид – TB(A, DX).
Алгоритм подпрограммы – циклический алгоритм с параметром цикла I. Используется типовой алгоритм табулирования функции и поиска её наименьшего и наибольшего значения (рис. 2.4). Обозначения переменных в процедуре TB
XMIN XMAX DX (в схеме – Δx) N
Начальное значение аргумента Х Конечное значение аргумента Х Шаг изменения аргумента Х Количество интервалов табулирования (число точек на единицу больше) 53
I X, Y A (в схеме – α) YMIN, YMAX
Параметр цикла Текущие значения аргумента и функции Значение параметра функции Наименьшее и наибольшее значение функции
Основная программа В основной программе осуществляется: Ввод-вывод значений исходных данных. Обращение к процедуре TB для табулирования функции f ( x,α ) на интервале [Xmin, Xmax], а также вычисления ее наименьшего и наибольшего значения.
• •
Параметр α
Шаг ΔX
Вызов процедуры TB
α1 α2
ΔX1 ΔX2
TB(α1, ΔX1) TB(α2, ΔX2)
Переменные, используемые в основной программе, приведены ниже. Обозначения переменных в основной программе XMIN Начальное значение аргумента X XMAX Конечное значение аргумента X DX1, DX2 (Δx1, Δx2) Шаг изменения аргумента X A1, A2 (α1, α2) Значение параметра α
Схема алгоритма представлена на рис. 2.4. 3. Листинг Fortran-программы Код исходного модуля
Пояснения
Основная программа
! Лабораторная работа 4 ! Петров А.Н. М-11 ! Процедура SUBROUTINE
1
IMPLICIT REAL (A,D,X) COMMON XMIN,XMAX REAL :: XMIN, XMAX
Глобальные переменные
REAL :: A1 = 1, A2 = 1.5 REAL :: DX1 = 0.5, DX2 = 0.25 XMIN = 0; XMAX = 1
Задание исходных данных
PRINT 1, XMIN,XMAX,A1,A2,DX1,DX2 FORMAT(6X,' ИСХОДНЫЕ ДАННЫЕ '/1X, ' XMIN = ',F2.0,' XMAX = ',F2.0, ' A1 = ',F2.0/1X,' A2 = ',F3.1, ' DX1 = ',F3.1,' DX2 = ',F4.2) CALL TB(A1,DX1)
& & &
Вывод исходных данных
Вызов
54
PAUSE'нажмите ENTER для продолжения' CALL TB(A2,DX2) END ! Подпрограмма табулирования TB SUBROUTINE TB(A,DX)
55
п/п TB
П/п TB
Рис. 2.4. Схема алгоритма к лабораторной работе 4 «Исследование функции одной переменной, зависящей от параметра»
56
COMMON XMIN,XMAX REAL :: A,DX,X,Y REAL :: XMIN,XMAX,YMIN,YMAX INTEGER :: I,N YMIN = 1E37 ; YMAX = -1E37
4
PRINT '(6X, " A = ",F4.2)', A PRINT *, ' ТАБЛИЦА ' PRINT *, ' X Y '
Вывод α и заголовка таблицы
N = (XMAX-XMIN)/DX DO I = 0, N X = XMIN + I*DX Y = A * SQRT(ABS(X)) & - COS(A * X)**2 PRINT '(3X,F4.2,5X,E11.4)',X,Y IF(Y < YMIN) YMIN = Y IF(Y > YMAX) YMAX = Y END DO
Целочисленный цикл
PRINT 4, YMIN,YMAX FORMAT(1X,' Ymin = ',& E11.4/1X, ' Ymax = ',E11.4) PRINT *,'**********************' END SUBROUTINE
Вывод X,Y Вычисление YMIN,YMAX Вывод значений YMIN,YMAX
Результаты работы программы представлены ниже (п. 5). 4. Листинг Basic-программы Код исходного модуля
Пояснения
' Лабораторная работа 4 ' Петров А.Н. М-11 ' Подпрограмма SUB
Основная программа
COMMON SHARED XMIN, XMAX
Глобальные переменные Ввод данных
DATA 0,1,1,1.5,0.5,0.25 READ XMIN, XMAX, A1, A2, DX1, DX2 CLS PRINT PRINT PRINT PRINT
TAB(13); " ИСХОДНЫЕ ДАННЫЕ " " XMIN = ";XMIN; " XMAX = ";XMAX " A1 = "; A1; " A2 = "; A2 " DX1 = "; DX1; " DX2 = "; DX2
CALL TB(A1, DX1) PRINT " Нажмите любую клавишу " A$ = INPUT$(1) CALL TB(A2, DX2) END
57
Вывод исходных данных Вызов п/п TB
' Подпрограмма табулирования TB SUB TB (A, DX) YMIN = 1E37 : YMAX = -1E37 PRINT USING " A = #.# "; A PRINT " X "; SPC(9); " Y " N = (XMAX - XMIN) / DX FOR I = 0 TO N X = XMIN + I * DX Y = A*SQR(ABS(X)) - COS(A*X)^2 "; X; PRINT USING " #.## PRINT USING "##.####^^^^ "; Y IF Y < YMIN THEN YMIN = Y IF Y > YMAX THEN YMAX = Y NEXT I PRINT USING "Ymin = ##.####^^^^ ";YMIN PRINT USING "Ymax = ##.####^^^^ ";YMAX PRINT STRING$(50, " * ") END SUB
П/п TB Вывод α и заголовка Целочисленны й цикл Вывод X,Y Вычисление YMIN,YMAX Вывод YMIN,YMAX
5. Макет печати результатов (по Fortran-программе) ИСХОДНЫЕ ДАННЫЕ XMIN = 0. XMAX = 1. A1 = 1. A2 = 1.5 DX1 = 0.5 DX2 = 0.25 A = 1.00 ТАБЛИЦА X Y 0.00 -0.1000E+01 0.50 -0.6304E-01 1.00 0.7081E+00 Ymin = -0.1000E+01 Ymax = 0.7081E+00 ********************** A = 1.50 ТАБЛИЦА X Y 0.00 -0.1000E+01 0.25 -0.1158E+00 0.50 0.5253E+00 0.75 0.1113E+01 1.00 0.1495E+01 Ymin = -0.1000E+01 Ymax = 0.1495E+01 **********************
58
Лабора торна я рабо та 5
Вычисление координат искомой точки Индивидуальные варианты – табл. 4.5. 1. Задание
Составить программу решения следующей задачи: На плоскости (X, Y) заданы точки {M1(X1, Y1), …, Mn(Xn, Yn)}. Найти точку M(X*, Y*), координаты которой определяются следующим образом: •
абсцисса – как отношение произведения отрицательных абсцисс заданных точек к их количеству, • ордината – как отношение произведения отрицательных ординат заданных точек к их количеству. При составлении программы предусмотреть использование процедуры. Для выполнения лабораторной работы необходимо: 1. Задать численные значения элементов массива X и Y – координат точек {M1(X1, Y1), …, Mn(Xn, Yn)} в соответствии с постановкой задачи. Выполнить ручной расчет координат искомой точки – 2. значений абсциссы X* и ординаты Y*. Представить заданные и искомую точки графически в 3. плоскости (X, Y). Исходные данные: N – количество точек, N = 5. Массивы абсцисс (X1, …, Xn) и ординат (Y1, …, Yn) заданы в соответствии с постановкой задачи (в данном случае это означает, что есть отрицательные элементы). X1
X2
4
0
Абсциссы точек X3
−2
X4
5
X5
−2
Ординаты точек Y1
5
Y2
−1
Y3
1 59
Y4
−2
Y5
−3
Ниже приведен расчет координат искомой точки M(X*, Y*):
X 3 ⋅ X 5 (−2) ⋅ (−2) = = 2; 2 2 Y ⋅Y ⋅Y (−1) ⋅ (−2) ⋅ (−3) Y* = 2 4 5 = = −2 . 3 3 X* =
Графическое представление точек: М1
Y
М3
X М2
М5
М*
М4
2. Решение
Очевидно, что искомую величину – отношение произведения отрицательных элементов массива к их количеству – необходимо вычислять дважды – для массива X и массива Y. Поэтому оформим данный алгоритм в процедуру с именем PD. Процедура PD Формальные параметры Входные параметры процедуры: • Массив с именем Z – вещественного типа. Выходной параметр процедуры: • Вещественная переменная REZ (искомая величина).
Глобальные переменные: • Целочисленная переменная N (размер массива, количество точек). 60
Заголовок процедуры будет иметь вид – PD(Z, REZ). Процедура вычисляет отношение произведения отрицательных элементов массива Z к их количеству. Алгоритм процедуры – это типовой алгоритм вычисления произведения и количества некоторого множества значений, удовлетворяющих условию Zi < 0 (рис. 2.5). Основная программа
Подпрограмма PD
Начало
PD (Z, REZ)
1
1 K = 0, P = 1
N Xi, (I = 1, …, N) Yi, (I = 1, …, N)
2
I = 1, N
2
N Xi, (I = 1, …, N) Yi, (I = 1, …, N)
Нет
3 Zi < 0
Да 4 P = P · Zi
3 PD (X, XS)
5 K=K+1
4 PD (Y, YS) 5
XS, YS
6 Конец цикла по I
Останов
7 REZ = P / K
Выход
Рис. 2.5. Схема алгоритма к лабораторной работе 5 «Вычисление координат искомой точки» Обозначения переменных в процедуре PD
Z N I Zi или Z(I) P, K REZ
Рабочий массив Количество элементов в массиве Z Параметр цикла, номер элемента в массиве Z Элемент массива Z Произведение и количество отрицательных элементов Zi Возвращаемое значение, P/K 61
• •
•
Основная программа В основной программе осуществляется: Ввод-вывод исходных данных – количества точек N и элементов массива X и Y (координат заданных точек). Обращение к процедуре PD для вычисления координат искомой точки: Искомая точка
Вызов процедуры PD
Абсцисса XS Ордината YS
PD(X,XS) PD(Y,YS)
Вывод значений XS, YS – координат искомой точки (макет печати п. 4, п. 6). Обозначения переменных в основной программе
X, Y N I Xi или X(I) Yi или Y(I) XS, YS
Массив абсцисс и ординат соответственно Количество элементов в массивах (число точек) Параметр цикла, номер точки Элемент массива X Элемент массива Y Абсцисса и ордината искомой точки (X*, Y*)
Схема алгоритма см. рис.2.5. 3. Листинг Fortran-программы Код исходного модуля
Пояснения
Основная программа
! Лабораторная работа 5 ! Петров А.Н. М-11 ! Процедура SUBROUTINE COMMON /A/ N REAL :: X(5) = (/4,0,-2,5,-2/) REAL :: Y(5) = (/5,-1,1,-2,-3/) INTEGER :: N = 5 REAL :: XS,YS PRINT 1, N,X,Y 1 FORMAT(3X,' ИСХОДНЫЕ ДАННЫЕ '/ & 2X,'КОЛИЧЕСТВО ТОЧЕК N = ',I1/& 4X,'КООРДИНАТЫ ТОЧЕК'/ & 2(2X,5F4.0/)) 62
Задание исходных данных Вывод исходных данных
CALL PD(X,XS) CALL PD(Y,YS)
Вызов п/п PD Вызов п/п PD
PRINT 3, XS,YS FORMAT(1X,' ИСКОМАЯ ТОЧКА ( ' & ,F3.0,' ; ',F3.0,' ) ') END
3
! Подпрограмма PD SUBROUTINE PD(Z,REZ) COMMON /A/ N REAL :: Z(N),P,REZ INTEGER :: I,N,K P = 1 ; K = 0 DO I = 1,N IF(Z(I) < 0) THEN K = K + 1 ; P = P*Z(I) END IF END DO REZ = P/K END SUBROUTINE
Вывод результата
Подпрограмма
Цикл Вычисление P,K
П р и м е ч а н и е . Конструкция COMMON /A/ N
называется именованным общим блоком, где А – имя блока. Fortran не разрешает инициализировать переменные непоименованных общих блоков. INTEGER :: N = 5
4. Макет печати результатов (по Fortran-программе) ИСХОДНЫЕ ДАННЫЕ КОЛИЧЕСТВО ТОЧЕК N = 5 КООРДИНАТЫ ТОЧЕК 4. 0. -2. 5. -2. 5. -1. 1. -2. -3. ИСКОМАЯ ТОЧКА (
63
2. ; -2. )
5. Листинг Basic-программы Код исходного модуля
Пояснения
Основная программа
' Лабораторная работа 5 ' Петров А.Н. В-11 ' Подпрограмма SUB COMMON SHARED N N = 5 DATA 4,5,0,-1,-2,1,5,-2,-2 ,-3 DIM X(N), Y(N)
Задание данных
CLS PRINT PRINT PRINT PRINT
Вывод N и заголовка таблицы
TAB(3); " ИСХОДНЫЕ ДАННЫЕ " " КОЛИЧЕСТВО ТОЧЕК N = "; N TAB(3); " КООРДИНАТЫ ТОЧЕК " TAB(4); " X Y "
FOR I = 1 TO N READ X(I), Y(I) PRINT TAB(5); PRINT USING"(## ; ##)";X(I);Y(I) NEXT I
Цикл ввода-вывода координат точек
CALL PD(X(), XS) CALL PD(Y(), YS)
Вызов п/п PD Вызов п/п PD
PRINT " ИСКОМАЯ ТОЧКА "; PRINT USING "M(## ; ##) "; XS; YS END
Вывод результата
' Подпрограмма PD SUB PD (Z(), REZ) K = 0: P = 1 FOR I = 1 TO N IF Z(I) < 0 THEN P = P * Z(I): K = K + 1 END IF NEXT I REZ = P / K END SUB
64
Подпрограмма Цикл Вычисление P,K
6. Макет печати результатов (по Basic-программе) ИСХОДНЫЕ ДАННЫЕ КОЛИЧЕСТВО ТОЧЕК N = 5 КООРДИНАТЫ ТОЧЕК X Y ( 4 ; 5) ( 0 ; -1) (-2 ; 1) ( 5 ; -2) (-2 ; -3) ИСКОМАЯ ТОЧКА M( 2 ; -2)
Лабора торна я рабо та 6
Анализ итогов сдачи сессии Индивидуальные варианты – табл. 4.6. 1. Задание
Составить программу решения следующей задачи: Результаты сдачи экзамена в группе 1 из 10 студентов представлены массивом (A1 , A2 , ... , A10 ) , а в группе 2 из 7 студентов – массивом (B1 , B2 , ... , B7 ) . Определить для каждой группы количество студентов, получивших оценку выше среднего балла в группе. При составлении программы предусмотреть использование процедуры. Исходные данные. Для группы 1: Студент Оценка
1 A1 5
2 A2 5
3 A3 2
4 A4 4
5 A5 5 65
6 A6 4
7 A7 3
8 A8 2
9 A9 5
10 A10 3
Для группы 2: Студент Оценка
1 B1 3
2 B2 4
3 B3 5
4 B4 2
5 B5 5
6 B6 4
7 B7 5
2. Решение
Расчет результатов для каждой группы приведен ниже: Результаты
Группа 1
Группа 2
3,8
4
6
3
Средний балл Количество студентов с оценкой выше средней
Выделим в процедуру с именем PR вычисление среднего балла группы и количества студентов, получивших оценку выше средней. Очевидно, что для решения задачи эти действия необходимо выполнить два раза – для группы 1 и группы 2. Процедура PR Ф ормальные параметры процедуры Входные параметры: o Массив с именем С вещественного типа (оценки студентов в группе). o Целочисленная переменная N (размер массива, количество студентов в группе). o Кроме того, для наглядности будем печатать номер группы, который тоже нужно передать в процедуру (целочисленная переменная M). Результат работы процедуры: • Вывод исходных данных – номера группы, оценок студентов. • Вывод результатов – среднего балла группы и количества студентов с оценкой выше средней (макет печати п. 5). Выходных параметров нет, так как все результаты печатаются в процедуре и в основную программу не передаются. Заголовок процедуры будет иметь вид – PR(C,N,M). Схема алгоритма представлена на рис. 2.6. 66
Основная программа
Подпрограмма PR
Начало
PR (C, N, M)
1 Ai, (I = 1, …, 10) Bi, (I = 1, …, 7)
1 S = 0, K = 0
2 3
2 I = 1, N
PR (A, 10, 1)
3 S = S + Ci
PR (B, 7, 2)
4 Конец цикла по I
Останов
5 Sr = S / N 6 I = 1, N Нет
7 Ci > Sr
Да 8 K=K+1
9 Конец цикла по I 10 M, Ci, (I = 1, … N)
11 Sr , K
Выход
Рис. 2.6. Схема алгоритма к лабораторной работе 6 «Анализ итогов сдачи сессии»
Алгоритм процедуры – циклический, содержит два цикла (рис. 2.6): – 1-й цикл (блоки 2, 3, 4) вычисляет средний балл группы, используется типовой алгоритм вычисления суммы элементов массива; 67
– 2-й цикл (блоки 6, 7, 8, 9) определяет количество студентов, получивших оценку выше средней. Обозначения переменных в процедуре PR
I C(I), в схеме – Ci N S SR K M
• •
Порядковый номер элемента в массиве (студента в группе) Элемент массива (оценка студента с номером I) Количество элементов в массиве (студентов в группе) Сумма элементов массива (сумма оценок группы) Среднее арифметическое элементов массива (средний балл группы) Количество элементов, удовлетворяющих условию Ci > Sr, искомая величина Номер группы – 1 или 2
Основная программа В основной программе осуществляется: Ввод исходных данных – элементов массивов A и B. Обращение к процедуре PR – определение количества студентов с оценкой выше средней для каждой группы: Группа
Число студентов
Вызов процедуры PR
1 2
10 7
PR(A, 10, 1) PR(B, 7, 2)
3. Листинг Fortran-программы Код исходного модуля
! Лабораторная работа 6 ! Петров А.Н. М-11 ! Процедура SUBROUTINE
Пояснения
Основная программа
REAL :: A(10) = (/5,5,2,4,5,4, & 3,2,5,3/) REAL :: B(7) = (/3,4,5,2,5,4,5/) 68
Задание данных (оценок студентов)
CALL PR(A,10,1) CALL PR(B,7,2) END
Вызов п/п PR Вызов п/п PR
! Подпрограмма PR SUBROUTINE PR (C,N,M) INTEGER :: I,N,M,K REAL :: C(N),SR,S S = 0 ; K = 0
3 4
Подпрограмма
DO I = 1,N S = S + C(I) ENDDO SR = S/N
Цикл Вычисление SR
DO I = 1,N IF(C(I) > SR) K = K + 1 ENDDO
Цикл Вычисление K
PRINT 3, M,C FORMAT(9X,' ОЦЕНКИ ГРУППЫ ', & I1/3X,10F3.0) PRINT 4, SR,K FORMAT(3X, ' СРЕДНИЙ БАЛЛ ', & 'SR = ',F3.1/3X, & ' КОЛИЧЕСТВО K = ',I1) PRINT *, '-------------------' END SUBROUTINE
Вывод исходных данных Вывод результатов
Результаты работы программы представлена ниже (п. 5). 4. Листинг Basic-программы Код исходного модуля
' Лабораторная работа 6 ' Петров А.Н. М-11 ' Подпрограмма SUB
Пояснения
Основная программа
CLS DIM A(10), B(7) DATA 5,5,2,4,5,4,3,2,5,3 DATA 3, 4, 5, 2, 5, 4, 5
Задание данных (оценок) 69
FOR I = READ NEXT I FOR I = READ NEXT I
1 TO 10 A(I)
Ввод данных
1 TO 7 B(I) Вызов п/п PR Вызов п/п PR
CALL PR(A(), 10, 1) CALL PR(B(), 7, 2) END ' Подпрограмма PR SUB PR (C(), N, M)
Подпрограмма
S = 0: K = 0 FOR I = 1 TO N S = S + C(I) NEXT I SR = S / N
Цикл Вычисление SR
FOR I = 1 TO N IF C(I) > SR THEN K = K + 1 NEXT I PRINT " ОЦЕНКИ ГРУППЫ "; M FOR I = 1 TO N PRINT C(I); NEXT I PRINT PRINT " СРЕДНИЙ БАЛЛ SR = "; SR PRINT " КОЛИЧЕСТВО K = "; K PRINT STRING$(33, " -") END SUB
Цикл Вычисление K
Цикл Вывод данных (оценок) Вывод результатов
5. Макет печати результатов (по Fortran-программе) ОЦЕНКИ ГРУППЫ 1 5. 5. 2. 4. 5. 4. 3. 2. 5. 3. СРЕДНИЙ БАЛЛ SR = 3.8 КОЛИЧЕСТВО K = 6 ------------------------------ОЦЕНКИ ГРУППЫ 2 3. 4. 5. 2. 5. 4. 5. СРЕДНИЙ БАЛЛ SR = 4.0 КОЛИЧЕСТВО K = 3 -------------------------------
70
Лабора торна я рабо та 7
Анализ итогов работы предприятия Индивидуальные варианты – табл. 4.7. 1. Задание
Составить программу решения следующей задачи: Выполнение плана по объемам производства на судостроительном предприятии в течение года по месяцам (в процентах) представлено в виде массива ( A1 , A2 , ... , A12 ) . Определить для каждого полугодия месяц с наименьшим процентом выполнения плана. При разработке программы предусмотреть использование процедуры. Исходные данные: 1-е полугодие Месяц
%
1
2
3
4
5
6
Январь
Февраль
Март
Апрель
Май
Июнь
A1 101
A2 98
A3 100
A4 108
A5 97
A6 105
2-е полугодие Месяц
%
7
8
9
10
11
12
Июль
Август
Сентябрь
Октябрь
Ноябрь
Декабрь
A7 99
A8 100
A9 112
A10 96
A11 107
A12 98
2. Решение
Результаты расчета для каждого полугодия приведены ниже: Полугодие
Месяц с наименьшим процентом
Наименьший процент
1 2
5 10
97 96
71
Выделим в процедуру с именем POL определение номера и названия месяца с наименьшим процентом выполнения плана. Для решения данной задачи эта процедура выполняется дважды (для 1-го и 2-го полугодия). Процедура POL Формальные параметры процедуры Входные параметры: • Целочисленная переменная N (первый месяц полугодия). • Целочисленная переменная К (последний месяц полугодия). • Целочисленная переменная P (номер полугодия). Глобальные переменные: • Массив с именем А вещественного типа (проценты выполнения плана, по месяцам). • Массив с именем MONTH символьного типа (названия месяцев). Результат работы процедуры: • Вывод номера и названия месяца, а также наименьшего процента и полугодия (макет печати п. 5). Выходных параметров нет, так как все результаты печатаются в процедуре и в основную программу не передаются. Таким образом, заголовок процедуры будет иметь вид – POL(N, K, P).
Алгоритм процедуры – циклический, параметр цикла – переменная I. В алгоритме используется типовая процедура нахождения наименьшего элемента и его позиции в массиве (рис. 2.7). Обозначения переменных в процедуре POL
Ai или A (I) MONTH(I) I N K M AMIN P
Элемент массива (процент выполнения плана) Элемент массива (название месяца) Порядковый номер элемента массива (номер месяца) Начальное значение I (начало полугодия) Конечное значение I (конец полугодия) Номер наименьшего элемента (месяц с наименьшим процентом) Наименьший элемент (наименьший процент) Номер полугодия – 1 или 2 72
Рис. 2.7. Схема алгоритма к лабораторной работе 7 «Анализ итогов работы предприятия»
• •
Основная программа В основной программе осуществляется: Ввод-вывод исходных данных – элементов массива A. Обращение к подпрограмме POL – определение месяца с наименьшим процентом для каждого полугодия: Полугодие
Вызов процедуры POL
1 2
POL(1, 6, 1) POL(7, 12, 2)
Схема алгоритма – см. рис. 2.7. 73
3. Листинг Fortran-программы Код исходного модуля
! Лабораторная работа 7 ! Петров А.Н. М-11 ! Процедура SUBROUTINE INTEGER :: A(12) = (/101,98,100, & 108,97,105,99,100,112,96,107,98/) CHARACTER*10 :: MONTH(12) DATA MONTH & /'Январь','Февраль','Март', & & 'Апрель','Май','Июнь', 'Июль','Август','Сентябрь', & 'Октябрь','Ноябрь','Декабрь'/ COMMON /A/ A, MONTH 2
PRINT 2, A FORMAT(14X,' % ВЫПОЛНЕНИЯ ПЛАНА '/& 2X, 12I4/3X,' МИНИМАЛЬНЫЙ % ')
Данные (проценты) Данные (месяца)
Глобальные массивы Вывод данных Вызов п/п POL
CALL POL(1,6,1) CALL POL(7,12,2) END ! Подпрограмма POL SUBROUTINE POL(N,K,P) INTEGER :: I,N,M,K,P,A(12),AMIN CHARACTER*10 :: MONTH(12) COMMON /A/ A, MONTH AMIN = 1000 DO I = N,K IF(A(I) < AMIN) THEN AMIN = A(I) ; M = I END IF ENDDO 3
Пояснения
Основная программа
PRINT 3, P,AMIN,M, MONTH(M) FORMAT(4X,I1,' ПОЛУГОДИЕ -',I4,& ' % ЗА ',I2,' МЕСЯЦ - ',A) END SUBROUTINE 74
Подпрограмма
Цикл Определение M, AMIN
Вывод результатов
Результаты работы программы представлены ниже (п. 5). 4. Листинг Basic-программы Код исходного модуля ' Лабораторная работа 7 ' Петров А.Н. М-11 ' Подпрограмма SUB
Пояснения Основная программа
DIM SHARED A(12) DIM SHARED MONTH$(12)
Глобальные массивы
DATA DATA DATA DATA
" Январь", "Февраль", " Март" " Апрель", " Май", " Июнь" "Июль", "Август", "Сентябрь" "Октябрь", "Ноябрь", "Декабрь"
Данные (месяца)
DATA 101,98,100,108,97,105 DATA 99,100,112,96,107,98
Данные (проценты)
CLS FOR I = 1 TO 12 READ MONTH$(I) NEXT I
Цикл Ввод данных
PRINT "% ВЫПОЛНЕНИЯ ПЛАНА " FOR I = 1 TO 12 READ A(I) PRINT A(I); NEXT I
Цикл Ввод-вывод данных (%)
PRINT PRINT " МИНИМАЛЬНЫЙ %"; PRINT " ВЫПОЛНЕНИЯ ПЛАНА : "
Вывод заголовка Вызов п/п POL
CALL POL(1, 6, 1) CALL POL(7, 12, 2) END ' Подпрограмма POL SUB POL (N, K, P) AMIN = 1000 FOR I = N TO K IF A(I) < AMIN THEN AMIN = A(I): M = I END IF NEXT I
Подпрограмма Цикл Определение M, AMIN
75
PRINT " < ";P; " > полугодие - "; PRINT AMIN; " % за ";M; " месяц - "; PRINT MONTH$(M) END SUB
Вывод результатов
5. Макет печати результатов (по Basic-программе) % ВЫПОЛНЕНИЯ ПЛАНА 101 98 100 108 97 105 99 100 112 96 107 98 МИНИМАЛЬНЫЙ % ВЫПОЛНЕНИЯ ПЛАНА : < 1 > полугодие - 97 % за 5 месяц - Май < 2 > полугодие - 96 % за 10 месяц - Октябрь
Для варианта задания определить для каждого квартала месяц с наименьшим процентом выполнения плана основная программа примет вид, представленный на рис. 2.8 (процедура не изменится). Основная программа
Начало 1 Ai, (I = 1, … 12) 2
Ai, (I = 1, … 12) 3 POL (1, 3, 1) 4 POL (4, 6, 2) 5 POL (7, 9, 1) 6 POL (10, 12, 2)
Останов.
Рис. 2.8. Схема алгоритма к лабораторной работе 7 «Анализ итогов работы предприятия» для варианта задания с кварталами
76
Макет печати будет иметь следующий вид: % ВЫПОЛНЕНИЯ ПЛАНА 101 98 100 108 97 105 МИНИМАЛЬНЫЙ % ВЫПОЛНЕНИЯ 1 квартал - 98 % за 2 2 квартал - 97 % за 5 3 квартал - 99 % за 7 4 квартал - 96 % за 10
99 100 112 96 107 ПЛАНА : месяц - Февраль месяц - Май месяц - Июль месяц - Октябрь
98
3. Контрольные вопросы 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13 . 14 . 15 . 16 . 17. 18. 19. 20. 21. 22. 23.
Что такое подпрограмма? Зачем используются подпрограммы? Преимущества использования подпрограмм. Типы подпрограмм. Отличие функции от процедуры. Концепция «черного ящика». Формальные и фактические параметры. Можно ли использовать одинаковые имена для формальных и фактических параметров? Соответствие формальных и фактических параметров. Правила именования подпрограмм в используемом языке. Описание и объявление подпрограммы. Структура записи функции. Структура записи процедуры. Оператор вызова процедуры. Особенности вызова функции. Как осуществляется возврат вычисленного значения из функции. Возникновение подпрограмм. Передача параметров по ссылке и по значению. Как организовать передачу нескольких значений из подпрограммы? Входные и выходные параметры. Пример. Особенности использования массива как параметра. Зачем нужно передавать функцию в качестве параметра? Глобальные и локальные переменные. Область видимости переменных. 77
24. 25.
Применение стека при вызове подпрограмм. Рекурсия. Условие останова. Переполнение стека.
4. Задания на выполнение лабораторных работ Для табл. 4.1–4.7 приведены примеры выполнения лабораторных работ (см. раздел 2). Таблица 4.1.
Вычисление значения выражения
Задания для лабораторной работы 1. Математические функции – табл. 6.1, 6.2, 6.3. Пример выполнения лабораторной работы 1 см. стр. 31. Составить программу вычисления величины Ζ с использованием функции. №
Исходные данные
Формула для вычисления Z
a ln 2a + ln b
1
Z=
2
Z = sin 2 8o + sin 2 a +
3
Z=
4
Z=
5
Z=
6
Z = (cos 2
7
Z=
b + ln ab + ln 3
ln 2 a + ln 2 b 2
2
a (ln 3 + ln 3a ) tg a − tg b −
−
a
b
2
1,5
– 0,5
sin 2 π + sin 2 b a(sin 2 ab + sin 2 2b)
–2
1,25
0,2913
b + ln 2 ab) 2 a
1,5
2
– 1,5394
0,8
3
1,1962
1,2
1
0,2524
3
–2
1,1684
–1
1,7
2,4201
a ln a + ln b b
− (ln 2
b + (tg 3o − tg ab) (tg 2a − tg 0,2π )
(cos 2a + cos b) 2 + a (cos 5o + cos 0,3π )
π 3
+ ln a) 2 −
(sin 2a + cos b) 2 + b(sin 3o + cos a)
Значение Z
cos a + cos 2b
cos 2 3o + ln b a(cos 2 b + ln 2) sin b + cos
78
a b
№
b
2
3,1
– 0,4556
a b
2,4
–2
1,1446
(cos π + ln b) 2 cos 3o + ln a
–3
1,5
0,16103
–2
1,85
31,7154
1,2
2,35
– 0,9182
2
–3
3,3657
1,4
0,5
1,1209
–2
1,5
11,8053
–2
1
68,1193
1
2,7
243,73
–3
2
0,4254
1,5
2
6,1465
1
2,5
2,1975
(ln 2 + sin 0,3π ) a(ln a + sin b)
Z=
ln b + sin 2o −
9
Z=
(cos b − tg a) 2 + cos 6o − tg b
10
Z=
cos a + ln 3 −
11
Z=
12
Z=
13
Z=
14
Z=
15
Z=
16
Z = (sin
(ln a − tg b) 2 o
ln b − tg 3
+
cos a − tg
ln 2b − tg
cos 2 a − sin 2 b −
2
π 3
(cos 2 b − sin 2 3o ) 2 a(cos 2 π − sin 2 a)
sin 2 b + ln a + (sin 2 a + ln b ) 2 2 o b(sin 3 + ln 2) e −b + tg 3o −
e 2 a + tg b b − (e b + tg a) 2
ln b − e − a + (ln 2b − e b ) 2 ln a − e 3
π 3
+ e 2b ) 2 −
sin 5o + e a sin a + e −a
e 3 − cos 4o
Z=
e −a
π
+ (e b − cos ) 2 3 − cos 2b
18
Z = (ln a + cos b) 2 −
19
Z=
20
Z =(
ln 3 + cos a b(ln b + cos 3o )
sin a + ln 2 b o
2
Значение Z
a 8
17
Исходные данные
Формула для вычисления Z
a(sin 3 + ln b)
+ (sin
π 3
+ ln 2 3) 2
a a + sin 5o + sin 2a) 2 − b b( b + sin a)
79
Таблица 4.2.
Вычисление значения величины, заданной в форме ветвления
Задания для лабораторной работы 2. Пример выполнения лабораторной работы 2 см. стр. 36. Составить программу вычисления величины Z, заданной в виде ветвления. Вычисление факториала и наименьшей (наибольшей) из двух величин оформить в виде функций. №
1
⎧max[a, b, k!] ⎪b 2 − a (k + 1)! ⎪ Z =⎨ ⎪a + b ⋅ (2 ⋅ k )! ⎪⎩a + b(k 2 )!
при a ≥ 1 при a ≥ 1 при a < 1 при a < 1
2
⎧min[b, a, k!] ⎪a ⋅ b + (2k )! ⎪ Z =⎨ 2 ⎪a ( k )! + b ⎪⎩a + b ⋅ (k − 1)!
при b > 0 и a = 1 при b > 0 и a ≠ 1
3
4
5
6
Исходные данные
Формула для вычисления Z
Z
Z
Z
Z
и и и и
b>0 b≤0 b =1 b ≠1
при b ≤ 0 и a > b при b ≤ 0 и a ≤ b
⎧max[k!,2 ⋅ max(a, b)] при a < 0 и b > 1 ⎪b − a ⋅ (3k )! при a < 0 и b ≤ 1 ⎪ =⎨ 2 a + b ( k )! при a ≥ 0 и a > b ⎪ ⎪⎩b(k + 1)! − a при a ≥ 0 и a ≤ b ⎧min[a,2 ⋅ min(b, k!)] при a > b и b = 1 ⎪( k − 1)! + a ⋅ b при a > b и b ≠ 1 ⎪ =⎨ 2 при a ≤ b и a > 0 ⎪a ⋅ b + (2k )! ⎪⎩a ⋅ b − ( k 2 )! при a ≤ b и a ≤ 0 ⎧max[2a, k!, b] при a = b и a > 0 ⎪a + b(k 2 )! при a = b и a ≤ 0 ⎪ =⎨ при a ≠ b и b > 1 ⎪a ⋅ b + (2k )! ⎪⎩a 2 + b(k + 1)! при a ≠ b и b ≤ 1 ⎧min[a,2b, k!] при a = 1 и b ≥ 0 ⎪b + a(k 2 )! при a = 1 и b < 0 ⎪ =⎨ ( 2 )! при a ≠ 1 и a > b a b k + ⋅ ⎪ ⎪⎩a ⋅ b + ( k + 1)! при a ≠ 1 и a ≤ b
80
Значение Z
a 3
b 1
k 2
3
–1
1
–5
–1
1
2
23
–8 1
2 5
2 4
40 1
3
2
2
30
1
–4
2
20
–2 –1
–1 2
3 3
–4 6
–4
–1
1
23
2
1
2
26
1 3
2 1
2 3
11 2
3
2
4
12
1
2
2
28
–5 2
–4 2
2 3
–4 6
–1
–1
2
–25
2
3
2
30
2 1
–1 4
2 3
–2 1
1
–1
2
23
3
2
1
7
2
3
2
12
3
№
b 2
k 3
3
3
2
3
–1
1
2
5
при b > 1 и a > 0
2 3
1 2
2 4
26 2
при b > 1 и a ≤ 0
–1
2
1
4
при b ≤ 1 и a ≠ 1
–2
–1
2
22
1 –6
–5 1
2 3
19 6
–3
2
1
9
3
1
2
9
1 1
3 –4
2 3
21 –4
–1
–4
2
20
2
1
2
26
7
8
⎧min[k!,3a, b] ⎪a ⋅ b + (k + 2)! ⎪ Z =⎨ 2 ⎪a ⋅ b + (2k )! ⎪⎩b + a ⋅ (k 2 )! ⎧max[a, k!, b 2 ] ⎪ ⎪a + b ⋅ (3k )! Z =⎨ ⎪a ⋅ b + (k + 1)! ⎪⎩a(k 2 )! − b
Значение Z
a –2
⎧max[b,3 ⋅ max(a, k!)] ⎪a 2 b − (2k )! ⎪ Z =⎨ 2 ⎪a ⋅ b + (k + 1)! 2 ⎩⎪a ⋅ b + (k )!
9
Исходные данные
Формула для вычисления Z
при при при при
b ≠1 b ≠1 b =1 b =1
ab
и и и и
при b ≤ 1 и a = 1 при a ≤ 0 и b = 1 при a ≤ 0 и b ≠ 1 при a > 0 и a > b при a > 0 и a ≤ b
b≤0 b≤0 b>0 b>0
10
⎧min[2a, b ⋅ min(a, k!)] ⎪(2k )! − a ⋅ b ⎪ Z =⎨ 2 ⎪a + b(k )! ⎪⎩ab 2 + ( k + 1)!
при при при при
при b > 1 и a > b
–1 3
2 2
3 3
20 9
11
⎧max[k!,3 ⋅ max(a, b)] ⎪a + b ⋅ (k + 2)! ⎪ Z =⎨ 2 ⎪(k )! + ab ⎪⎩a ⋅ b + (2k )!
при b > 1 и a ≤ b
1
2
1
13
при b ≤ 1 и a < 0
–9
–1
2
33
2 –1
–5 9
2 2
14 –1
1
3
2
27
2
1
3
13
2 2
–1 3
1 2
13 24
4
1
3
10
–2
–1
2
47
–4
1
2
2
и и и и
a≥0 a1 a ≤1
18
при b ≤ 1 и a ≥ 0
12
⎧min[a, b, (k 2 )!] ⎪ ⎪ab + (2k )! Z =⎨ ⎪b + a ⋅ k! ⎪⎩b 2 + a (k + 2)!
при при при при
13
⎧max[b, a, (2k )!] ⎪ a 2 − b ⋅ k! ⎪ Z =⎨ 2 ⎪b − a (k )! ⎪⎩ab + (k + 1)!
при a > 0 и a ≤ b при a > 0 и a > b
a 0
a –1
b –4
k 3
Значение Z
–8
–1
2
1
–8
при a ≥ 1 и a < b
1
2
1
8
при a ≥ 1 и a ≥ b
при b = 1 и a ≥ 0 при b = 1 и a < 0
1 9
–1 1
2 2
25 27
–2
1
2
22
при b ≠ 1 и a = b
2
2
2
44
при b ≠ 1 и a ≠ b
3 5
2 –4
4 2
12 2
1
2
2
28
–1
1
2
–5
–3 2
2 2
2 1
45 6
1
1
2
25
2
3
2
3
–1 2
8 2
3 4
2 2
1
2
2
26
1
–1
2
25
–1 1
–2 –4
5 3
2 6
–1
–2
2
4
–2
1
2
22
при a > 1 и b ≤ 0
2 5
1 –4
2 1
28 –4
при a > 1 и b > 0
4
2
3
4
при a ≤ 1 и a ≠ b при a ≤ 1 и a = b
1
3
2
27
1
1
2
6
16
⎧min[2a, b 2 , k!] ⎪ 2 ⎪a ⋅ b + (2k )! Z =⎨ ⎪a (k + 1)! + b ⎪⎩a + b ⋅ (k 2 )!
17
⎧max[a, (3k )!, b] ⎪a (k 2 )! + b ⎪ Z =⎨ 2 ⎪a ⋅ (k + 1)! − b ⎪⎩a ⋅ k! + b
18
⎧min[b, a ⋅ min(b, k!)] ⎪b + a ⋅ ( k 2 )! ⎪ Z =⎨ ⎪a( 2k )! − b ⎪⎩(k − 2)! + ab 2
19
⎧max[k!,2 ⋅ max(b, a 2 )] ⎪ ⎪b − a (k + 1)! Z =⎨ 2 ⎪a + b(k )! ⎪⎩b ⋅ (2k )! + a 2
20
⎧min[ a, (3k )!, b] ⎪2 ⋅ k ! − a ⋅ b ⎪ Z =⎨ 2 ⎪a ( k )! + b ⎪⎩a ⋅ b( k + 1)!
при a ≥ 0 при a ≥ 0 при a < 0 при a < 0 при при при при
a a a a
и b 1 a ≤1 a>0 a≤0
b>0 b>0 b≤0 b≤0
и и и и
a=b a≠b a ≥1 a a и b = 1 Z = ⎨b 2 + min(c, 2a) ⎪ при c > a и b ≠ 1 ⎪⎩min(2a, b ) + c 2
95
Значение Z
a
b
c
2
–1
1
–1
1
1
3
3
–1
4
3
1
№
2
Значение Z
a
b
c
⎧min(a, b 2 , c ) при a < 1 ⎪ ⎪ Z = ⎨c + min(b, a 2 ) при a ≥ 1 и b > c ⎪ 2 ⎪min(2b, c ) − a при a ≥ 1 и b ≤ c ⎩
–2
3
9
–2
2
5
3
7
2
3
4
4
⎧max a, b ⋅ max(b 2 , с) при a ≥ b ⎪⎪ Z = ⎨b + max(a, 2c) при a < b и c > 0 ⎪ при a < b и c ≤ 0 ⎩⎪max(b, c ) − a
3
2
5
10
2
3
4
11
2
3
–4
1
{
3
Исходные данные
Формула для вычисления Z
}
⎧max(b 2 , a , 2c) ⎪⎪ Z = ⎨a − max(2b, c) ⎪ 2 ⎪⎩max(a , с) + b
при b > c
4
3
2
9
при b ≤ c и a > 1
6
2
3
2
при b ≤ c и a ≤ 1
–2
2
3
6
⎧b + min(2a, c ) ⎪ ⎪ Z = ⎨min(b 2 , c) − a ⎪ 2 ⎪min(b, a , 2c) ⎩
при a = b
3
3
16
7
при a ≠ b и c ≤ 0
3
2
–1
–4
при a ≠ b и c > 0
3
2
3
2
при a > c
3
1
2
11
при a ≤ c и b = 1
2
1
4
3
при a ≤ c и b ≠ 1
2
3
9
2
2
1
5
6
–1
4
3
9
1
4
–2
–10
3
2
3
18
8
⎧max{b, a ⋅ max(c, 2a )} при b ≥ 0 ⎪ Z = ⎨c 2 − max(a, b) при b < 0 и a ≠ c ⎪ 2 2 при b < 0 и a = c ⎩max(2c, b ) + a
1
–1
2
3
3
–1
3
15
при b > c
2
3
1
1
9
⎧min c, b ⋅ min(2a, b ) ⎪⎪ Z = ⎨a − min( b , c 2 ) ⎪ 3 ⎪⎩min(a , 3b) + c
при b ≤ c и a > 1
3
4
5
1
при b ≤ c и a ≤ 1
–1
3
6
5
4
5
6
⎧min(2b, c 3 ) + a 2 ⎪⎪ Z = ⎨2a − min(c 2 , b) ⎪ 3 ⎪⎩min a, b ⋅ min(b , c)
7
⎧b + max(a , c) при a ≥ b ⎪⎪ 2 Z = ⎨max( b , 2a, c ) при a < b и c > a ⎪ 3 при a < b и c ≤ a ⎩⎪c − max(2b, a )
{
}
2
{
3
}
96
№
Исходные данные
Формула для вычисления Z
Значение Z
a
b
c
–2
2
3
2
10
⎧min(b 2 , 2a ) − ac при a ≤ 1 ⎪⎪ Z = ⎨min(2b, a 2 , c 2 ) при a > 1 и b ≠ c ⎪ 2 b + min(a, 3c) при a > 1 и b = c ⎩⎪
2
3
4
4
2
3
3
11
3
4
2
16
11
⎧max a , c ⋅ max(c , b ) при b ≥ 0 ⎪ ⎪ Z = ⎨max(a, b 3 ) + 2c при b < 0 и a ≥ c ⎪ 2 при b < 0 и a < c ⎪a − max(b, c ) ⎩
4
–1
3
10
1
–1
2
–3
2
3
4
9
12
⎧max(a 3 , c , b 2 ) при a > 0 ⎪⎪ Z = ⎨c + max(b, 2a ) при a ≤ 0 и b = c ⎪ 2 max(2b, c ) + a при a ≤ 0 и b ≠ c ⎩⎪
–1
3
3
6
–1
2
3
8
⎧min b 2 , c ⋅ min(a, 2c) при a > c ⎪⎪ 2 Z = ⎨a + min(b, c ) при a ≤ c и a > b ⎪ 2 при a ≤ c и a ≤ b ⎪⎩min(2a, b ) − c
3
4
2
6
2
–1
3
1
2
4
3
–7
⎧min(a, b, c 2 ) при c ≥ 1 ⎪⎪ Z = ⎨min(2c, a ) − b при c < 1 и b = a ⎪ 2 ⎪⎩a + min(c , 2b) при c < 1 и b ≠ a
4
1
3
1
4
4
–1
–6
4
3
–1
5
⎧max{a, b ⋅ max(c, b)} ⎪⎪ Z = ⎨max(c, b3 ) + a ⎪ 2 ⎩⎪ c − max(2a, b )
при a > c
5
2
4
8
при a ≤ c и b > 1
–1
2
1
7
при a ≤ c и b ≤ 1
1
–1
9
1
⎧max(c 2 , a ) − b при a > b ⎪ ⎪ Z = ⎨ c + max(2a, b 3 ) при a ≤ b и c = 1 ⎪ 2 3 ⎪max(b , 2c, a ) при a ≤ b и c ≠ 1 ⎩
4
2
3
7
2
3
1
28
2
3
4
9
⎧2c + min(a 2 , b) ⎪⎪ Z = ⎨min(2b, c) − 2a ⎪ 2 ⎩⎪min(2a, b , c )
при a < b при a ≥ b и c ≥ 0
–1
3
1
3
3
1
4
–4
при a ≥ b и c < 0
3
2
–4
2
{
2
{
13
14
15
16
17
}
3
}
97
№
b
c
3
2
2
2
4
2
3
–1
–1
4
3
8
при a = c
2
3
2
9
при a ≠ c и b ≥ 0
2
4
3
12
при a ≠ c и b < 0
2
–1
3
1
2
9
1
3
3
–2
2
6
2
–2
3
–4
18
19
⎧max(a, 2c, b 2 ) ⎪⎪ Z = ⎨b + max(2c, a 3 ) ⎪ max(b 2 , 2a) − c ⎩⎪
{
}
⎧max b , c ⋅ max(c , a ) при b ≥ 1 ⎪ ⎪ 2 Z = ⎨max(a , b ) + c при b < 1 и a ≥ c ⎪a − max(2c, b) при b < 1 и a < c ⎪ ⎩
Таб лица 4.
2
Значение Z
a ⎧min{ b, c ⋅ min(a, b) } при b = c ⎪ Z = ⎨b − min(a 2 , c) при b ≠ c и a ≥ 1 ⎪ 2 при b ≠ c и a < 1 ⎩min(a, 2b) + c
20
Исходные данные
Формула для вычисления Z
Исследование функции одной переменной
Математические функции – табл. 6.1, 6.2, 6.3 (см. лаб. раб. 4). Составить программу решения следующей задачи с использованием процедуры. Вычислить таблицу значений функции y = f ( x) и аргумента x на интервале [xmin , xmax ] с шагом Δx при условии, что шаг принимает различные значения Δx1 и Δx2 в зависимости от интервала: ⎧⎪Δx1, если xmin ≤ x ≤ xср Δx = ⎨ ⎪⎩Δx2 , если xср < x ≤ xmax , где
xср
– одно из значений аргумента
x
в интервале
x min < xср < x max . Протабулировать функцию f ( x) и найти для каждого интервала:
98
Исходные данные №
Задача x min
x ср
x max
Δx1
Δx 2
1 Наименьшее значение функции y = sin(1 − x ) + e x
0
1
2,5
0,2
0,25
2 Наибольшее значение функции y = sin 2 2 x − x − tg x
1
2
5
0,25
0,5
3 Сумму и количество отрицательных значений функции y = tg 2 x − x − cos x
0
1
3,5
0,25
0,5
4 Количество положительных значений функции y = sin 2 x + tg 2 x
5,2
5,7
6,1
0,1
0,05
5 Наибольшее из отрицательных значений функции
0,5
1
2,5
0,1
0,25
3
4
7
0,2
0,5
3
7
9
0,5
0,25
0
1
2
0,25
0,2
1
2
5
0,25
0,5
0
1
4
0,2
0,5
3,5
4,5
7
0,25
0,5
y = cos 2 x + tg 2 ln x
6 Наименьшее из положительных значений функции π y = x − sin 2 x − tg( x + ) 3 7 Сумму отрицательных значений функции y = e − x + cos x 8 Произведение положительных значений функции y = sin 2 3 x − e − x 9 среднее арифметическое отрицательных значений функции y = tg 2 x − 4 ⋅ tg x − 3 10 Сумму положительных значений функции y = sin 2 x − cos 2 x − cos 2 x 11 Количество отрицательных значений функции y = tg x − sin 2 2 x
99
Исходные данные №
Задача x min
x ср
x max
Δx1
Δx 2
12 Произведение отрицательных значений функции y = x − tg x − cos 2 x
–1
0
1,2
0,25
0,2
13 Среднее арифметическое положительных значений функции y = e x − tg x
–1
0,5
2,1
0,25
0,2
14 Произведение и количество отрицательных значений функции y = x 2 + tg x − cos3 x 15 Сумму положительных и произведение отрицательных значений функции
0
1,5
2
0,25
0,1
1
1,5
3
0,1
0,25
1
4
5
0,5
0,2
0
1
1,5
0,2
0,1
5
6
8,5
0,2
0,5
1,5
1,7
2,3
0,05
0,1
0,25
1,5
2,4
0,25
0,1
y=
x − sin x −
1 tg 2 x
16 Сумму положительных и сумму всех значений функции y = x 3 − tg 2 x − sin x 17 Отношение произведения положительных значений функции к их количеству π y = x 3 − sin 2 x + tg( x + ) 3 18 Произведение положительных и произведение отрицательных значений функции y = tg 2 x − 3 cos x 19 Сумму и произведение положительных значений функции y = x + tg x − cos 2 x 20 Произведение положительных и произведение всех значений функции y = x − tg 2 x + sin 2 x
100
Таблица 5.
Анализ выполнения нормы расхода топлива судами
Составить программу решения следующей задачи с использованием процедуры. Судоходная компания устанавливает для судов каждого типа нормативы расхода топлива. За экономию топлива судовые экипажи премируются. Фактические данные о ежемесячном расходе топлива судами типа «Волго-Дон» и «Волжский» должны быть представлены в виде матриц А(5 × 6) и В(4 × 6) соответственно (судно – строка, месяц – столбец). Данные приведены в процентном отношении к нормативному расходу топлива. Норма расхода – 100%, менее 100% – экономия топлива, более – его перерасход. Исходные данные – значения элементов матриц Аij и Вij (расход топлива i-м судном за j-й месяц навигации) – задать самостоятельно в соответствии с решаемой задачей. Названия месяцев навигации задать в виде массива MES(6) символьного типа (см. лаб. раб. 7). Среди судов каждого типа «Волго-Дон» и «Волжский» (Для п. 1–4) Определить судно: №
1 2 3 4
Задача
С наименьшим средним расходом топлива за навигацию С наибольшим средним расходом топлива за навигацию С наименьшей суммарной экономией топлива за навигацию С наибольшим суммарным перерасходом топлива за навигацию
(Для п. 5–6) Среди судов, ежемесячно экономивших топливо, определить судно: 5 6
С наименьшей экономией топлива за навигацию С наибольшей экономией топлива за навигацию 101
(Для п. 7–8) Среди судов, допустивших ежемесячный перерасход топлива, определить судно: 7 8
С наименьшим перерасходом топлива за навигацию С наибольшим перерасходом топлива за навигацию
(Для п. 9–12) Определить количество судов: 9 10 11 12
С ежемесячным перерасходом топлива за навигацию С ежемесячной экономией топлива за навигацию С общей экономией топлива за навигацию С общим перерасходом топлива за навигацию
(Для п. 13–14) Определить количество месяцев, в течение которых все суда: 13 14
Экономили топливо Допускали перерасход топлива
(Для 15–16) Определить месяцы, в течение которых все суда работали: 15 16
С экономией топлива С перерасходом топлива
(Для п. 17–20) Определить месяцы навигации: 17 18 19 20
С наибольшей экономией топлива С наименьшим перерасходом топлива С наибольшим средним расходом топлива С наименьшим средним расходом топлива
102
6. Справочные материалы Таблица 6.1.
Функция
Натуральный логарифм Десятичный логарифм Квадратный корень Экспонента Абсолютная величина (модуль) Остаток от деления Округление с недостатком Округление с избытком Вычисление максимального значения Вычисление минимального значения
Стандартные функции Fortran
Математическое определение
Запись на Фортране
Тип функции и аргумента
Диапазон значений аргумента x
ln x
LOG(X)
REAL
x>0
lg x
LOG10(X)
REAL
x>0
x
SQRT(X)
REAL
x≥0
ex
EXP(X)
REAL
x ≤ 174,673
|x |
ABS(X)
REAL
MOD(A,B)
INTEGER
FLOOR(X)
REAL
CEILING(X)
REAL
MAX
INTEGER или REAL
MIN
INTEGER или REAL
max{xi } i = 1, 2,...n n≥2 min{xi } i = 1, 2,...n n≥2
Тригонометрические функции, аргумент в радианах Синус
sin x
SIN(X)
REAL
Косинус
cos x
COS(X)
REAL
Тангенс
tg x
TAN(X)
REAL
Котангенс
ctg x
COTAN(X)
REAL
103
|x| < 218 ⋅ р |x| < 218 ⋅ р |x| < 218 ⋅ р |x| < 218 ⋅ р
Функция
Математическое определение
Запись на Фортране
Тип функции и аргумента
Диапазон значений аргумента x
Тригонометрические функции, аргумент в градусах (Intel Fortran) Синус
sin x
SIND(X)
REAL
Косинус
cos x
COSD(X)
REAL
Тангенс
tg x
TAND(X)
REAL
Котангенс
ctg x
COTAND(X)
REAL
Обратные тригонометрические функции Арккосинус
arccos x
ACOS(X)
REAL
Арксинус
arcsin x
ASIN(X)
REAL
Арктангенс Арккотангенс
arctg x arcсtg x
ATAN(X) AСОTAN(X)
REAL REAL
Гиперболические функции Синус
shx
SINH(X)
REAL
Косинус
сh x
COSH(X)
REAL
Тангенс Котангенс Случайная величина из диапазона [0,1) Установка датчика случайных чисел случайным образом
th x TANH(X) REAL сth x СОTANH(X) REAL Датчик случайных чисел CALL RANDOM_NUMBER(Y)
CALL RANDOM_SEED()
104
|x| < 218 ⋅ р |x| < 218 ⋅ р |x| < 218 ⋅ р |x| < 218 ⋅ р |x| ≤ 1 |x| ≤ 1
|x| ≤ 174,673 |x| ≤ 174,673
Таб лица 6.2. Функция
Натуральный логарифм Квадратный корень Экспонента Абсолютная величина (модуль) Остаток от деления Округление с недостатком Синус Косинус
Стандартные функции Basic
Математическое определение
на Бейсике
Диапазон значений аргумента x
ln x
LOG(X)
x>0
x
SQR(X)
x≥0
x
e
EXP(X)
|x| ≤ 174,673
|x |
ABS(X)
Запись
MOD(A,B) INT(X) Тригонометрические функции sin x SIN(X) cos x
COS(X)
Тангенс
tg x TAN(X) Обратные тригонометрические функции Арктангенс arctg x ATN(X) Датчик случайных чисел Случайная величина из RND диапазона [0,1) Установка датчика случайных RANDOMIZE TIMER чисел случайным образом
|x| < 218 ⋅ р |x| < 218 ⋅ р |x| < 218 ⋅ р
П р и м е ч а н и е . Гиперболические функции sh x и ch x выражаются через показательную функцию следующим образом:
sh x =
e x − e −x e x + e−x , ch x = . 2 2
Пример Запись арифметического выражения
105
cos x − 1.5 sh ( x − 3) + 3 sin 2 x ⋅ e 2 x на языках Fоrtran и Basic соответственно: Fоrtran: должно быть набрано одной строкой: COS(SQRT(ABS(X))) - 1.5*SINH(X-3) + (SIN(X)**2) ** (1.0/3) * EXP(2*X)
Basic: должно быть набрано одной строкой COS(SQR(ABS(X))) - 1.5*(EXP(X-3) - EXP(3-X))/2 + (SIN(X)^2) ^ (1/3) * EXP(2*X) Таблица 6.3.
Математическая запись
cos x |x|
Язык программирования
BASIC FORTRAN BASIC FORTRAN BASIC
Типичные ошибки при записи арифметических выражений на алгоритмических языках Fortran, Basic Неправильная запись
Пояснение ошибки
Правильная запись
COS X
нет скобок
COS(X)
ABC(X) EXP^X
x
e
FORTRAN
EXP**X
BASIC
SIN^2(X)
FORTRAN
SIN**2(X)
BASIC FORTRAN
X^1/3 X**1/3.0
2
sin x 3
x
106
неверное имя функции Функция EXP() заведена специально, чтобы НЕ возводить в степень В степень возводится функция – после закрывающей скобки Приоритет операций приводит к
ABS(X) EXP(X) SIN(X)^2 SIN(X)**2 X^(1/3) X**(1/3.0)
3
x
FORTRAN
X**(1/3)
Таблица 6.4.
вычислению (x1)/3 Целочисленное деление приводит к вычислению x0
X**(1/3.0)
Пример оформления отчета по лабораторной работе
1. Постановка задачи.
Составить программу решения следующей задачи: Выполнение плана по объемам производства на судостроительном предприятии в течение года по месяцам (в процентах) представлено в виде массива ( A1 , A2 , ... , A12 ) . Определить для каждого полугодия месяц с наименьшим процентом выполнения плана. При разработке программы предусмотреть использование процедуры. Исходные данные: 1-е полугодие Месяц
%
1
2
3
4
5
6
Январь
Февраль
Март
Апрель
Май
Июнь
A1 101
A2 98
A3 100
A4 108
A5 97
A6 105
2-е полугодие Месяц
%
7
8
9
10
11
12
Июль
Август
Сентябрь
Октябрь
Ноябрь
Декабрь
A7 99
A8 100
A9 112
A10 96
A11 107
A12 98
2. Ручной расчет результатов.
Результаты расчета для каждого полугодия приведены ниже:
107
Полугодие
Месяц с наименьшим процентом
Наименьший процент
1 2
5 10
97 96
3. Обозначения переменных, используемые в программе, с пояснением их смысла.
Глобальные переменные: • Массив с именем А вещественного типа (проценты выполнения плана, по месяцам). • Массив с именем MONTH символьного типа (названия месяцев). Обозначения переменных в процедуре POL
Ai или A (I) MONTH(I) I N K M AMIN P
Элемент массива (процент выполнения плана) Элемент массива (название месяца) Порядковый номер элемента массива (номер месяца) Начальное значение I (начало полугодия) Конечное значение I (конец полугодия) Номер наименьшего элемента (месяц с наименьшим процентом) Наименьший элемент (наименьший процент) Номер полугодия – 1 или 2
108
4. Схема алгоритма основной программы и подпрограмм.
5. Программа. Код исходного модуля ' Лабораторная работа 7 ' Петров А.Н. М-11 ' Подпрограмма SUB
Пояснения Основная программа
DIM SHARED A(12) DIM SHARED MONTH$(12)
Глобальные массивы
DATA DATA DATA DATA
Данные (месяца)
" Январь", "Февраль", " Март" " Апрель", " Май", " Июнь" "Июль", "Август", "Сентябрь" "Октябрь", "Ноябрь", "Декабрь"
109
DATA 101,98,100,108,97,105 DATA 99,100,112,96,107,98
Данные (проценты)
CLS FOR I = 1 TO 12 READ MONTH$(I) NEXT I
Цикл Ввод данных
PRINT "% ВЫПОЛНЕНИЯ ПЛАНА " FOR I = 1 TO 12 READ A(I) PRINT A(I); NEXT I
Цикл Ввод-вывод данных (%)
PRINT PRINT " МИНИМАЛЬНЫЙ %"; PRINT " ВЫПОЛНЕНИЯ ПЛАНА : " CALL POL(1, 6, 1) CALL POL(7, 12, 2) END
Вывод заголовка Вызов п/п POL
' Подпрограмма POL SUB POL (N, K, P) AMIN = 1000 FOR I = N TO K IF A(I) < AMIN THEN AMIN = A(I): M = I END IF NEXT I PRINT " < ";P; " > полугодие - "; PRINT AMIN; " % за ";M; " месяц - "; PRINT MONTH$(M) END SUB
Подпрограмма Цикл Определение M, AMIN Вывод результатов
6. Результат выполнения программы – распечатка результатов. % ВЫПОЛНЕНИЯ ПЛАНА 101 98 100 108 97 105 99 100 112 96 107 98 МИНИМАЛЬНЫЙ % ВЫПОЛНЕНИЯ ПЛАНА : < 1 > полугодие - 97 % за 5 месяц - Май < 2 > полугодие - 96 % за 10 месяц - Октябрь
110
Библиографический список 1. Артемов, И.Л. Fortran: основы программирования / И.Л. Артемов. – М. : ДИАЛОГ-МИФИ, 2007. – 304 с. 2. Бартеньев, О.В. Современный Фортран / О.В. Бартеньев. – 4-е изд, доп. и перераб. – М. : ДИАЛОГ-МИФИ, 2005. – 560 с. 3. ГОСТ 19.701–90 (ИСО 5807–85). Единая система программной документации. Схемы алгоритмов, программ, данных и систем. Обозначения условные и правила выполнения. – Взамен ГОСТ 19.002–80, ГОСТ 19.003–80 ; введ. 01.01.92. – М. : Изд-во стандартов, 1998. – 24 с. 4. Кетков, Ю.Л. Практика программирования: Бейсик, Си, Паскаль / Ю.Л. Кетков, А.Ю. Кетков. – СПб. : БХВ, 2001. – 480с. 5. Кетков, Ю.Л. Практика программирования: Visual Basic, C++ Builder, Delphi / Ю.Л. Кетков, А.Ю. Кетков. – СПб. : БХВПетербург, 2002. – 464 с. 6. Князева, М.Д. Алгоритмика: от алгорита к программе : учеб. пособие / М.Д. Князева – М. : КУДИЦ-ОБРАЗ, 2006. – 192 с. 7. Ляхович, В.Ф. Основы информатики : учеб. / В.Ф. Ляхович, С.О. Крамаров. – 5-е изд. – Ростов н/Дон : Феникс, 2005. – 704 с. (СПО.) 8. Немнюгин, С.А. Фортран в задачах и примерах / С.А. Немнюгин, О.Л. Стесик. – СПб. : БХВ-Петербург, 2008. – 320 с. 9. Рыжиков, Ю.И. Современный Фортран : учеб. / Ю.И. Рыжиков. – СПб. : КОРОНА принт, 2007. – 288 с.
111
Оглавление Введение…………………………………………………………………….. 1. Теоретические сведения………………………………………………. 1.1. Определение……………………………………………………….... 1.2. Назначение………………………………………………………….. 1.3. Параметры…………………………………………………………... 1.4. Описание и вызов подпрограмм…………………………………... 1.5. Подробнее о параметрах…………………………………………… 1.6. Подробнее о переменных…………………………………………... 1.7. Подробнее о вызовах……………………………………………….. 1.8. Рекомендации по организации подпрограмм…………………….. 1.9. Пример. Вычисление расстояния от точки до начала координат 1.10. Требования к выполнению лабораторной работы……………… 2. Примеры выполнения лабораторных работ……………………….. Лабораторная работа 1. Вычисление значения выражения………….. Лабораторная работа 2. Вычисление значения величины, заданной в форме ветвления…………………………... Лабораторная работа 3. Вычисление значения выражения (обработка массива) ……………………………………… Лабораторная работа 4. Исследование функции одной переменной, зависящей от параметра…………………….. Лабораторная работа 5. Вычисление координат искомой точки…….. Лабораторная работа 6. Анализ итогов сдачи сессии………………… Лабораторная работа 7. Анализ итогов работы предприятия………... 3. Контрольные вопросы………………………………………………… 4. Задания на выполнение лабораторных работ……………………… Таблица 4.1. Вычисление значения выражения………………………. Таблица 4.2. Вычисление значения величины, заданной в форме ветвления………………………………………………….. Таблица 4.3. Вычисление значения выражения (обработка массива) Таблица 4.4. Исследование функции одной переменной, зависящей от параметра……………………………………………... Таблица 4.5. Вычисление координат искомой точки…………………. Таблица 4.6. Анализ итогов сдачи сессии……………………………... Таблица 4.7. Анализ эффективности работы предприятия…………... 5. Задания для самостоятельной работы………………………………. Таблица 1. Вычисление значения выражения………………………… Таблица 2. Исследование функции одной переменной, зависящей от параметра…………………………………………………... Таблица 3. Вычисление значения величины, заданной в форме ветвления………………………………………………………...
112
3 4 4 4 6 6 13 20 22 25 27 30 31 31 36 44 51 57 63 67 75 76 76 78 81 83 85 87 88 90 90 91 93
Таблица 4. Исследование функции одной переменной………………. 96 Таблица 5. Анализ выполнения нормы расхода топлива судами……. 99 6. Справочные материалы………………………………………………. 101 Таблица 6.1. Стандартные математические функции, Fortran……….. 101 Таблица 6.2. Стандартные математические функции, Basic…………. 103 Таблица 6.3. Типичные ошибки при записи арифметических выражений на алгоритмических языках Fortran, Basic…….. 104 Таблица 6.4. Пример оформления отчета по лабораторной работе……..…..…..…..…..…..…..…..…..…..…..…..…..…..106 Библиографический список……………………………………………….. 110
113
Гурьяшова Римма Николаевна Шеянов Анатолий Владимирович
Информатика Сегментация программ
Учебно-методическое пособие Редактор Н.С. Алёшина Компьютерная вёрстка М.Е. Савинова Подписано в печать 29.01.09. Формат бумаги 60×84 1/16. Гарнитура «Таймс». Ризография. Усл. печ. л. 6,39. Уч.-изд. л. 6,75. Тираж 970 экз. Заказ 264. Издательско-полиграфический комплекс ФГОУ ВПО «ВГАВТ» 603950, Нижний Новгород, ул. Нестерова, 5а
114