Фрагмент программы по второму способу передачи параметров



 

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

print

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

print

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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!