Фрагмент программы по второму способу передачи параметров
rem основная программа
……
dim c(20) ‘ объявление массива с
……
call ads 2 ‘ вызов процедуры ads 2
…....
x=f(c(i),l) ‘ переменная x является функцией
‘ значения массива с и переменной l
‘ (используется алгебраическая форма записи)
……
stop
sub ads 2
shared c( ), 1 ‘ массив с и простая переменная l
‘ объявлены как глобальные переменные
……
с(i)=……. ‘ массив с вычисляется в процедуре
l=…… ‘ переменная l вычисляется в процедуре
…….
end sub
В этом примере отсутствуют фактические и формальные параметры в операторах call и sub соответственно. Связь между модулями осуществляется с помощью глобальных переменных массива с и переменной l. Они определяются в процедуре, однако ими можно пользоваться в основной программе после оператора call. В операторе shared при объявлении массивов используются «пустые» скобки.
Фрагмент программы по 3-му способу передачи параметров
rem основная программа
……
dim а(5,10),b(17)
……
A(i,j)=….. ‘ вычисляется матрица
call ads 3 (a(i,j),b(k))
…....
x=f(a(i,j),b(k)) ‘ переменная x является функцией
‘ матрицы а и массива b
|
|
……
stop
sub ads 3 (a(2),n,m)
shared b( ) ‘ массив b объявлен как глобальные
……
b(i)=……. ‘ массив b вычисляется в процедуре
end sub
В этом примере связь между модулями осуществляется через матрицу а и массив b. Матрица а предается через список параметров, а массив b объявлен как глобальный.
Пример построения программы сложной структуры с использованием процедуры
Рассмотрим следующую задачу: дана матрица размерностью 7х7, значения элементов целые произвольные числа в диапазоне от 0 до 50, необходимо сформировать одномерный массив b, элементы которого вычисляются по маршруту - перебор элементов по спирали к центру по часовой стрелке, требуется составить программу сложной структуры: ввод значений матрицы осуществить в основной программе, формирование массива b – в процедуре, вывод результатов – в подпрограмме.
В представленной ниже программе используются два новых оператора. Первый оператор locate позволяет выводить любую информацию на заданную строку и заданную позицию в строке, второй оператор dealy осуществляет задержку экрана для фиксации изображения на нем. Форматы операторов locate и dealy
|
|
locate <nstr>, <pos>
где
<nstr> - номер позиции на строке (от1 до 80)
<pos> - номер строки на экране (от 1 до 25)
dealy <sek>
где
<sec> - количество секунд задержки
rem построение программы сложной структуры с п/п и процедурой
rem создание массива b из матрицы а. маршрут перебора – по спирали к центру
cls
randomize int (timer)
dim a(7,7),b(49)
print “ исходная матрица а ”
for i=1 to 7
for j=1 to 7
a(i,j)=int((50-l)*rnd(1)+1) ‘ ввод значений матрицы случайным образом
print a(i,j);” “; ‘ построчный вывод матрицы
‘ на экран монитора
next j
next i
print “ подождите 5 секунд ”
dealy 5
call arif (a( ),b( ),7,7,l) ‘ вызов процедуры arif (1-й
‘ способ передачи параметров)
gosub result ‘ вызов подпрограммы для вывода результатов
stop
sub arif (a( ),b( ),n1,n2,l) ‘ заголовок процедуры arif
cls
l=0 : i0=2 : mk=2 : j0=1 : l0=n2-l : jk=n2 : m0=n1-l : lk=1
s=1
t=n2
for s=1 to (n1+1)/2 ‘ внешний цикл – перебор строк в
‘ матрице от верхней строки к центру
for j=j0 to jk ‘ движение вдоль верхней строки слева направо
l=l+1
b(l)=a(s,j)
next j
for i=i0 to ik ‘ движение вниз по последнему столбцу
|
|
l=l+1
b(l)=a(i,t)
next i
for l1=l0 to lk step -1 ‘ движение вдоль последней строки справа налево
l=l+1
b(1)=a(t,l1)
next l1
for m1=m0-1 to mk step -1 ‘ движение снизу вверх вдоль
‘ первого столбца
l=l+1
b(1)=a(m,s)
next m
j0=j0+1 : jk=jk-1 : i0=i0+1 : ik=ik-1 : l0=l0-1 : lk=lk+1
m0=m0-1 : mk=mk+1 : t=t-1
next s
locate 12,35:print “ массив b сформирован ”
end sub
result:
rem начало п/п вывода
cls
print “ исходная матрица ”
for i=1 to 7
for j=1 to 7
print a(i,j); “ ”;
next j
next i
locate 12,30: print “ результирующий массив b ”
locate 12,27:print “ закручивающаяся спираль к центру ”
s0=1
y0=14
s=s0
for k=1 to l
if s>77 then
s=s0
y0=y0+1
end if
locate y0;s:print b(k)
s=s+4
next k
return
Процедура как отдельный программный модуль.
Препроцессорный оператор $include
Как уже было сказано в предыдущей главе, процедура является мощным средством для построения программ сложной структуры, то есть многомодульной программы, состоящей из отдельных процедур, как правило, функционально законченных частей общей задачи, например: ввод исходных данных, преобразование (обработка) первичной информации в конечные результаты, вывод результатов в удобной для дальнейшего анализа форме (таблицы, графики, т. п.). в ТБ в этом случае каждую процедуру оформляют в виде отдельного файла (программного модуля), а в основной (управляющей) программе включают эти модули с помощь специального оператора $include. Часто этот оператор называют препроцессорным, или директивой компилятору, так как перед тем как выполнить программу сложной структуры, компилятор просматривает текст основной, выбирает операторы $include и присоединяет все программные модули, описанные в этих операторах, только потом происходит компиляция программы сложной структуры в целом.
|
|
Формат оператора
$include “<имя дисковода:><имя файла>”
Указывается имя дисковода, в который вставляется дискета с записью процедуры (а: или b:)
Имя файла с расширением, в этом файле находиться процедура. Если файл находиться в директории, то указывается путь к файлу (ads10.bas или \programm\ads11.bas)
Достоинство структурирования такой программы заключается в том, что каждый файл можно рассматривать как отдельную программу, а значит отлаживать (выявлять и устранять ошибки) независимо от других программ. Появляется возможность вести параллельный процесс проектирования программного обеспечения задач, решаемых с помощью ЭВМ.
Оператор $include записывается в начале программы.
Рассмотрим следующий пример. Составим программу сложной структуры, в основной программе произведем ввод значений исходного одноименного массива g и вывод результатов работы. Массив g состоит из 20 элементов, значения – целые произвольные числа в диапазоне от -10 до 10. во внешней процедуре b определяется количество положительных (s1) и отрицательных (s2) элементов. Процедура записывается как отдельный программный модуль в виде файла ads10.bas на дискете. Считывание файла в основную программу осуществляется с дисковода а:. механизм передачи параметров из основной программы в процедуру и наоборот посредством замещения формальных параметров фактическими в операторах sub и call соответственно.
rem основная (управляющая) программа
$include “a:ads10.bas” ‘ включение текста файла
‘ ads10.bas в основную программу
dim g(20)
cls
randomize int(timer)
print “ исходный массив ”
for i=1 to 20
g(i)=int(20*rnd(1)-10)
print using “####”; g(i); ‘ оператор форматного вывода
‘ каждый символ # в форматном
‘ шаблоне «…»означает одно
‘ знакоместо для вывода значений
‘ элемента g(i), выравнивание
‘ происходит по правой границе шаблона
next i
print ‘ “пустой оператор вывода отмена символа”;”
call b(g( ),20,s1,s2) ‘ вызов процедуры b, которая
‘ храниться в файле ads10.bas
print “ Количество положительных элементов равно ”;s1
print “ Количество отрицательных элементов равно ”;s2
stop
Текст процедуры b? записанной в файле ads10.bas
sub b(g(1),n,s1,s2) ‘ заголовок внешней процедуры b
s1=0:s2=0
for i=1 to n
if g(i)>0 then s1=s1+l
if g(i)<0 then s2=s2+l
next i
end sub
Результат работы
Исходный массив b
-6 -6 7 -6 -2 -2 9 -1 8 -7 8 1 0 -8 0 5 3 -2 -1 4
Количество положительных элементов равно 8
Количество отрицательных элементов равно 10
Как записать процедуру b в файл ads10.bas, подробно рассматривается в первой части текстов лекций, здесь же кратко скажем, что используется подкоманда save функции file турбо среды Бейсика.
Дата добавления: 2021-11-30; просмотров: 16; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!