![](/user_photo/2706_HbeT2.jpg)
- •Текстовый редактор
- •Прогон и отладка программы
- •Справочная служба Турбо Паскаля
- •Строка
- •Строка
- •Задание 2. Разветвления
- •Простейшие циклы
- •Вложенные циклы
- •Примечания
- •Строка
- •Процедуры и функции
- •Процедуры ввода
- •Обозначение
- •Представим определение языка Показушка в расширенной форме Бэкуса-Наура
- •Предложение
- •Синтаксис Паскаля
- •Задание 14
- •Операторы Паскаля
- •Задание 15
- •Новые типы данных. Определение типа. Диапазоны.
r:=r+z*p_x/p; z:=-z; p_n:=p_n*i; i:=i+1
end; r:=r*p_n; writeln(r) end.
Входные данные 2 3
Занятие 9. Разработка программы с вложенными циклами.
Задача: Вычислить значение выражения ∑n i !
i =1
Спецификация.
1. Составить программу для вычисления значения выражения
∑n i ! , где i ! = 1*...*i.
i=1
2.Входные данные: целое число, значение n, например 3
3.Выходные данные: целое число, значение выражения, например, 9 (для входных данных 3).
Таблица разработки
Шаги разработки |
Примечания |
work4 |
|
Æ |
|
begin |
|
ввод входных данных |
|
вычисление значения выражения |
|
вывод результата |
|
end |
|
ввод входных данных |
переменная n (integer) |
Æ |
|
read (n) |
|
вычисление значения выражения |
|
Æ |
|
begin |
|
установить начальное значение суммы |
переменная rez (real) |
установить начальное значение счетчика |
переменная i (integer) |
слагаемых |
|
пока не просуммированы все слагаемые |
|
выполнять |
|
begin |
|
установить начальное значение |
переменная fact |
произведения |
(integer) |
установить начальное значение |
переменная j (integer) |
счетчика произведений |
|
пока не перемножены все сомножители |
|
выполнять |
|
begin |
|
учесть в произведении очередной |
|
сомножитель |
|
увеличить счетчик произведений |
|
end |
|
учесть в сумме очередное слагаемое |
|
увеличить счетчик слагаемых |
|
end |
|
end |
|
установить начальное значение суммы |
|
Æ |
|
rez:=0; |
|
установить начальное значение счетчика |
|
слагаемых |
|
Æ |
|
i:=1; |
|
пока не просуммированы все слагаемые |
|
выполнять |
|
32
![](/html/2706/482/html__9VTDceJaw.fpHT/htmlconvd-O2A2xD33x1.jpg)
Æ
while i<=n do
установить начальное значение произведения
Æ
fact:=1;
установить начальное значение счетчика произведений
Æ
j:=1;
пока не перемножены все сомножители выполнять
Æ
while j<=i do
учесть в произведении очередной сомножитель
Æ
Fact:=fact*j;
увеличить счетчик произведений
Æ
j:=j+1;
учесть в сумме очередное слагаемое
Æ
rez:=rez+fact;
увеличить счетчик слагаемых
Æ
i:=i+1;
вывод результата
Æ
write (rez)
Текст программы
1.Program work4;
2.var i,j,n,fact,rez: integer;
3.begin
4.read( n);
5.rez:=0; i:=1;
6.while i<=n do
7.begin
8.fact:=1; j:=1;
9.while j<=i do
10.begin
11.fact:=fact*j;
12.j:=j+1;
13.end;
14.rez:=rez+fact;
15.i:=i+1;
16.end;
17.write (rez)
18.end.
Вычисление ∑n i! требует применения вложенных циклов.
|
|
|
i=1 |
|
|
|
|
Это |
становится |
ясно, |
если |
его |
переписать |
в виде |
|
n |
n |
n |
i |
|
|
|
n |
∑i! = ∑(i!) = ∑(∏ j) |
или, |
более |
обобщенно, |
∑ (i-ое |
|||
i =1 |
i =1 |
i =1 |
j=1 |
|
|
|
i=1 |
слагаемое), где i-ое слагаемое это i!.
Когда проводится суммирование нескольких слагаемых, то процесс обычно выполняется следующим образом. Вначале (к нулю) прибавляется первое слагаемое, затем к тому, что получилось второе, потом третье и так далее. Таким образом, процесс суммирования схематично можно представить так (здесь также требуется счетчик для учета количества просуммированных слагаемых)
Установить сумму в ноль.
Установить счетчик слагаемых в единицу
33
![](/html/2706/482/html__9VTDceJaw.fpHT/htmlconvd-O2A2xD34x1.jpg)
Пока не просуммированы все слагаемые, выполнить begin
Вычислить очередное слагаемое Учесть в сумме очередное слагаемое Модифицировать счетчик слагаемых
End
В свою очередь, как видно из занятия 7, вычисление факториала (очередного слагаемого) требует использования другого цикла (внутреннего), являющегося вложенным по отношению к циклу суммирования. Здесь также требуется свой счетчик для колличества выполненных умножений в факториале. С учетом сказанного в разделе 3 таблицы разработки представлен общий процесс вычисления требуемого выражения.
Задание 7
Составить подробную спецификацию программы с примерами входных и выходных данных. Разработать программу, используя таблицы разработки. Выполнить трассировку программы. Ввести программу в ЭВМ, сравнить результаты трассировки и работы программы.
1. Дано натуральное число n. Получить f1 f 2 ... f n , где fi = i2 1+1 + i2 1+2 +... + i2 +1i +1.
2.Найти натуральное число от 1 до n c максимальной суммой делителей.
Даны натуральные числа m и n. Вычислить.
3.∑∑n m i +1j2 .
i=1 j=1 n m
4.∑∑sin(i3 + j4 ) .
i=1 j=1
5.∑∑n m ji−+i j+1 .
i=1 j=1
n |
m |
1 |
|
|
6. ∑∑ |
. |
|||
i +2 j |
||||
i=1 |
j=1 |
|
Дано натуральное число n. Вычислить. 7. ∑n k(k +1)...k2 .
k=1
8.∑n kk .
k=1
9. ∑n |
1 |
|
. |
2 |
)! |
||
k =1 |
(k |
|
|
10. ∑n |
(−1)k (2k 2 +1)! . |
||
k =1 |
|
|
|
Даны натуральное число n, действительное число x. Вычислить.
11. |
∑n |
(2i)!+| x | |
. |
|
||||
2 |
|
|||||||
|
|
i=1 |
(i )! |
|||||
12. |
|
1 |
∑n |
(−1)k |
xk |
. |
||
|
|
|
||||||
|
|
n! k =1 |
|
(k!+1)! |
13. ∑n kk x2k .
k=1
14.∑∑n n x m+k .k =1 m=k
Даны действительные числа a, b (a<b), натуральное число n, функция y=f(x), определенная на отрезке [a,b]. Вывести на дисплей график функции. Для построения графика вычислить значения функции yi = f (xi ) , где
34
![](/html/2706/482/html__9VTDceJaw.fpHT/htmlconvd-O2A2xD35x1.jpg)
xi = a + ih, i =0,1,..., n,
h =(b − a) / n.
Ось 0x расположить вертикально, ось 0y – горизонтально. Шаг по оси 0x – это переход на новую строку, шаг по оси 0y – позиция следующего символа в текущей строке. Точки графика изображать символом *.
Рассмотреть следующие функции.
15.y=|sinx|+|cosx|. a=0, b=π, n=25.
16.y=2sinx+3cosx, a=-π, b=π, n=25.
17.y = x2 +1, a=-1, b=2, n=25.
|
1 |
|
18. |
y = x2 − x +1 |
, a=-1, b=3, n=25. |
19.y = xx2 −+32 , a=-1, b=4, n=25.
20.y = x2e−|x|, a=-1, b=3, n=25.
21.y = e−x sin 2x, a=-π/2, b=2π, n=25
22.y = 3 (x +2)2 −3 (x −2)2 , a=-3, b=3, n=25.
Занятие 10. Подпрограммы - процедуры и функции
I. Описание процедуры. Описание функции. II. Вызов процедуры. Вызов функции.
III.Параметры , передаваемые по ссылке и по значению. IV.Локальные и глобальные переменные.
V.Примеры трассировки процедур и функций.
I. Нередко при написании программы требуется повторить один и тот же фрагмент в разных местах. В таких случаях удобнее оформить этот фрагмент отдельно в виде подпрограммы, дать ей
имя и вызывать по имени каждый раз, когда необходимо выполнить этот фрагмент.
Подпрограммой называется часть программы, имеющая свое имя и предназначенная для решения определенной, самостоятельной и вполне законченной задачи. В Паскале есть два вида подпрограмм: процедура и функция.
Процедуры и функции бывают встроенные и определяемые программистом. Встроенные процедуры и функции не нужно описывать, они являются неотъемлемой частью компилятора Паскаля, например: sqr(x), sqrt(x), round(x) - встроенные функции, write(x),read(x) - встроенные процедуры.
Определяемые программистом процедуры и функции необходимо описывать после раздела описания переменных и перед разделом описания операторов.
Как программа описывает весь процесс в целом, так описание подпрограммы описывает отдельный подпроцесс и дает ему имя.
Описание процедуры/функции
Заголовок процедуры |
procedure имя (<список |
|
формальных параметров>); |
Заголовок функции |
function имя (<список формальных |
|
параметров>): тип результата; |
Раздел описания меток |
label ... |
Раздел описания констант |
const ... |
Раздел описания типов |
type ... |
Раздел описания |
var ... |
переменных |
|
Раздел описания операторов |
begin |
(тело подпрограммы) |
S1; |
|
S2; |
|
... |
|
SN; |
35
end;
Функция – это та же процедура, только с именем функции связывается некоторое значение, используемое при вычислении выражения. Описание функции оформляется аналогично описанию процедуры, только: а) указывается тип результата функции; б) в теле функции обязательно должно выполняться присвоение (с типом результата) имени функции; такое присвоение возвращает результат функции.
Иногда требуется выполнить один и тот же фрагмент программы, но с разными данными. В этом случае данные передаются подпрограмме в виде параметров. Таким образом, параметр позволяет одной части программы иметь доступ к информации, относящейся к другой ее части, т.е. с помощью параметров происходит обмен информацией между программой и подпрограммами.
Параметры, которые перечисляются в заголовке подпрограммы, называются формальными, а в вызове подпрограммы - фактическими. Между формальными и фактическими параметрами существует взаимно - однозначное соответствие, которое определяется позицией параметра в списке. Таким образом, начальное значение формального параметра в подпрограмме равно значению соответствующего фактического параметра.
II. Употребление имени подпрограммы - процедуры или функции (с необязательным списком фактических параметров после имени) в программе называется обращением, или вызовом подпрограммы.
Вызов процедуры представляет собой отдельный оператор, называемый оператор процедуры; вызов функции, в отличии от вызова процедуры, не может быть отдельным оператором и происходит только когда имя функции употребляется в качестве компоненты какого-либо выражения, операнда какой-либо операции.
Вызов процедуры -общий вид : имя_процедуры (<список фактических параметров>);.
Выполнение:
1)выполнение основного процесса приостанавливается
2)вычисляются значения фактических параметров
3)вычисленные значения фактических параметров передаются в соответствующие формальные параметры процедуры, и управление передается процедуре
4)выполняются операторы процедуры
5)процедура заканчивает работу и управление передается вызывающей программе; если были параметры, переданные по ссылке, их значения передаются в соответствующие фактические параметры
6)основной процесс продолжает выполняться с первого оператора, следующего после вызова процедуры
Вызов функции - общий вид: ... имя_функции (список фактических параметров) ...; (может быть выражением или частью выражения в различных операторах, но не является отдельным оператором).
Выполнение:
1)выполнение основного процесса приостанавливается
2)вычисляются значения фактических параметров
3)вычисленные значения передаются в соответствующие формальные параметры функции, и управление передается функции
4)выполняются операторы функции
5)По окончании работы функции управление передается вызывающей программе; если были параметры, переданные по ссылке, их значения передаются в соответствующие формальные параметры
6)результат последнего выполненного оператора присваивания вида: имя_функции:=выражение принимается в качестве значения функции, и основной процесс продолжает выполняться с первого оператора, следующего после вызова процедуры
36
|
|
III. Параметры можно передавать по значению и по ссылке. |
области действия уже не доступна ( если только она не передается |
|||||||||||||
|
|
Передача параметра по значению (параметры значения) - в |
как параметр. |
|
|
|
|
|
|
|
||||||
списке формальных параметров (в заголовке подпрограммы) они |
V. Пример трассировки программы с процедурой. |
|
|
|||||||||||||
перечисляются без служебного слова var: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
1) |
вычисляется значение фактического параметра (может быть |
1. |
Program prim4; |
|
|
|
|
|
|
|
||||||
любое выражение соответствующего типа) |
|
|
|
2. |
var n,t: real; x:char; |
|
|
|
|
|
|
|
||||
2) |
это значение копируется в соответствующий формальный |
3. |
procedure P(x,y: real); |
|
|
|
|
|
|
|||||||
параметр |
|
|
|
|
4. |
var n:real; |
|
|
|
|
|
|
|
|||
3) |
формальный параметр употребляется внутри подпрограммы |
|
5. |
begin |
|
|
|
|
|
|
|
|||||
4) |
по выходе из подпрограммы формальный параметр |
6. |
n:=x+t; |
|
|
|
|
|
|
|
||||||
разрушается. |
|
|
|
|
7. |
t:=y; |
|
|
|
|
|
|
|
|||
|
|
Передача параметра по ссылке (параметры переменные): в |
8. |
writeln(n,t,x); |
|
|
|
|
|
|
|
|||||
списке формальных параметров перед ними ставится служебное |
9. |
end; |
|
|
|
|
|
|
|
|||||||
слово VAR. (при передаче параметра по ссылке фактический |
10. |
begin |
|
|
|
|
|
|
|
|||||||
параметр должен быть переменной!!!): |
|
|
|
11. |
read(n); |
|
|
|
|
|
|
|
||||
1) |
в |
подпрограмму |
пересылается |
ссылка |
(адрес) |
на |
12. |
t:=n/2; |
|
|
|
|
|
|
|
|
местоположение переменной - фактического параметра - в памяти |
13. |
x:=’+’; |
|
|
|
|
|
|
|
|||||||
ЭВМ |
|
|
|
|
|
14. |
P(n,0.8); |
|
|
|
|
|
|
|
||
2) |
области памяти с этим адресом на время действия |
15. |
writeln(n,t,x) |
|
|
|
|
|
|
|
||||||
подпрограммы дается имя формального параметра |
|
|
16. |
end. |
|
|
|
|
|
|
|
|||||
3) |
по выходе из подпрограммы этой области памяти возвращается |
|
|
|
|
|
|
|
|
|
|
|||||
имя переменной - фактического параметра и значение, записанное |
Таблица трассировки. |
|
|
|
|
|
|
|
||||||||
в нее подпрограммой, сохраняется. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
IV. Переменные, описанные в тексте подпрограммы |
Входные данные: 1 |
|
|
|
|
|
|
|
||||||
называются локальными переменными и доступны только внутри |
|
|
|
|
|
|
|
|
|
|
||||||
этой подпрограммы, для основной программы они не существуют. |
Строка |
Ход выполнения |
|
n |
t |
x |
|
|
|
|
||||||
|
|
Переменные, определенные в разделе описания программы |
10 |
вход в prim4 |
|
? |
? |
? |
|
|
|
|
||||
называются глобальными. Любой подпрограмме доступны все |
11 |
|
|
1 |
|
|
|
|
|
|
||||||
глобальные переменные за исключением тех, с чьими именами |
12 |
|
|
|
0.5 |
|
|
|
|
|
||||||
совпадают имена ее параметров или локальных переменных. В |
13 |
|
|
|
|
‘+’ |
|
|
|
|
||||||
этом случае говорят, что имя переменной переопределено. Если |
14 |
вызов P |
|
|
|
|
|
|
|
|
||||||
имя некоторой переменной переопределено, то в области действия |
|
|
|
|
|
|
n |
x |
y |
|
||||||
переопределенной программы имеет силу уже новая связь между |
5 |
вход в P |
|
|
|
|
? |
1 |
0.8 |
|
||||||
именем и типом, и глобальная переменная с таким именем в этой |
6 |
|
|
|
|
|
1.5 |
|
|
|
||||||
|
|
|
|
|
|
|
|
37