
- •Программирование на языке Turbo Pascal Материалы к урокам
- •Тема №1: этапы решения задач на эвм. Алгоритмизация. Основные понятия. Блок-схемы.
- •Свойства алгоритма
- •Элементы блок-схемы
- •Тема №2: работа в среде turbo-pascal. Транслятор. Набор текста программы. Справочная система. Выполнение и отладка программы.
- •Основные понятия:
- •Встроенные стандартные математические функции, используемые в Turbo Pascal.
- •Переменные. Описание переменных.
- •Тип переменных указывается после списка переменных через двоеточие (: ). Числовые переменные можно описать по-разному, в зависимости от вида (целые, вещественные) и значности чисел:
- •Простейшие операторы работы в текстовом режиме.
- •Нестандартный оператор очистки экрана:
- •Операторы ввода данных в переменные с клавиатуры:
- •Оператор ожидания нажатия на клавишу.
- •Целочисленные арифметические операции:
- •Функции, преобразования числовых переменных:
- •Получение случайных чисел.
- •Тема №4: программирование на языке turbo-pascal. Прорядковые типы данных. Ветвление. Операторы условного и безусловного перехода. Составление программ с использование ветвления и переходов.
- •Порядковые типы переменных (дополнительные сведения)
- •Функции, используемые для работы с порядковыми переменными.
- •Условный оператор (выбор одного из двух направлений)
- •Оператор 1, оператор 2 – какой либо оператор, в том числе и составной оператор, т.Е. Несколько операторов, объединенных операторными скобками begin end.
- •Ветвление на несколько направлений (оператор – переключатель, или оператор выбора или оператор варианта):
- •Операторы безусловного перехода goto и halt:
- •Тема №5: программирование на языке turbo-pascal. Организация циклов. Операторы циклов. Составление программ с использование операторов цикла.
- •Оператор цикла с параметром.
- •Цикл с предварительным условием
- •Цикл с последующим условием
- •Особенности и отличия операторов цикла
- •Примеры программ
- •Ответить на вопросы
- •Тема №6: программирование на языке turbo-pascal. Процедуры. Функции. Составление программ с использование процедур и функций. Рекурсия.
- •Тема №7: программирование на языке turbo-pascal. Основные графические операции языка turbo pascal. Составление программ с использование операторов графики.
- •Примеры программ:
- •Составить программу Абстракция, которая выводит на экран всевозможные графические фигуры.
- •Тема №8: программирование на языке turbo-pascal. Массивы, одномерные и вдухмерные. Составление программ с использованием массивов.
- •Задача MaxMin. Программа для поиска максимального и минимального элемента массива, с указанием их номеров (maxmin.Pas).
- •Сортировка массивов
- •Сортировка методом «пузырька»
- •Сортировка методом выбора
- •Поиск элемента в упорядоченном массиве
- •Тема №9: данные типа strung.
- •Тема №8: файлы. Типизированные файлы. Текстовые файлы.
- •Пример записи в текстовый файл:
- •Приложение 1. Структура типов данных
- •Приложение 2. Таблица кодов ascii
- •Назначение некоторых кодов ascii
- •Приложение 3. Расширенные ascii –коды клавиш
- •Приложение 4. Кодировка символов по модифицированной альтернативной кодировке символов госта (десятичный код-символ)
- •Содердание
Ответить на вопросы
Сколько раз будут выполнены инструкции между Begin и End?
For i:=j to j+1 do
Begin
…
end;
Чему будет равен x после выполнения инструкций?
X:=0;
For i:= -5 to 0 do
N:=i*i;
X:=X+N;
Что будет выведено на экран в результате выполнения инструкций?
N:=5;
X:=0;
For i:=1 to N do X:=i;
Writeln(X);
Сколько звездочек будет выведено на экран в результате выполнения инструкций?
For i:=1 to 5 do
For j:=1 to 5 write (‘*’);
Тема №6: программирование на языке turbo-pascal. Процедуры. Функции. Составление программ с использование процедур и функций. Рекурсия.
ПРОГРАММНО - ДИДАКТИЧЕСКОЕ ОБЕСПЕЧЕНИЕ: ЭВМ типа IBM. Turbo-Pascal 5.
ЦЕЛИ И ЗАДАЧИ: Дать основные понятия подпрограмм (процедур и функций). Познакомить с видами формальных параметров: параметры-значения, параметры-переменные. Научить различать фактические и формальные параметры. Знакомство с понятием рекурсии. Выработка навыков составления программ с использованием процедур и функций.
ТРЕБОВАНИЯ К ЗНАНИЯМ И УМЕНИЯМ:
Учащиеся должны знать:
Что такое подпрограмма;
Что такое процедура;
Для чего используются процедуры;
Что такое формальные и фактические параметры;
Чем отличается задание параметров-значений от параметров-переменных;
В каком месте программы ставится описание процедур;
Как вызывается процедура;
Структуру процедуры.
Что такое функция;
Чем отличаются процедуры от функций,
Для чего используются функции;
Чем отличается заголовочная строка функции от заголовочной строки процедуры;
В каком месте программы ставится описание функции;
Как вызывается функция;
Структуру функции;
Что такое рекурсия;
Для чего и как используется опережающее описание подпрограммы.
Учащиеся должны уметь:
Правильно описывать процедуры и функции;
Правильно вызывать процедуры и функции;
Различать формальные и фактические параметры;
Правильно описывать параметры-значения и параметры
Различать формальные и фактические параметры;
Использовать простейшие рекурсии при составлении программ
ПЛАН-СОДЕРЖАНИЕ УРОКА
Подпрограммы.
Автономная часть программы, с помощью которой можно производить одни и те же вычисления, с разными исходными данными и в различных местах программы, многократно, называется подпрограммой. Виды подпрограмм: процедуры и функции.
Процедуры.
Процедура (подпрограмма) – многократно повторяющаяся часть программы, оформленная отдельно от основной программы. Место расположения процедур в программах - Раздел описаний, за описание переменных.
Преимущества использования процедур - уменьшение объем программы, сокращение времени на отладку.
Принцип работы процедуры:
Выполнение программы начинается с выполнения основной части программы. Как только появляется необходимость в выполнении процедуры, она вызывается по имени с передачей входных данных. После выполнения процедура передает в основную часть программы выходных данных (результатов), в то место, откуда была вызвана процедура.
Затем продолжается выполнение основной части программы.
Процедура оформляется подобно основной программе:
-
Раздел описаний основной программы
Заголовок процедуры
Procedure имя
(список параметров);
Описываются формальные параметры
Раздел описаний
label …;
Var …;
Раздел операторов процедуры
Begin
…
end;
Описание функций
Раздел операторов основной программы
Procedure имя (формальные параметры);
Раздел описаний
Begin
Раздел операторов
End;
Все переменные, представленные в разделе описаний основной программы называются глобальными. Они действуют как в разделе операторов основной программы, так и в любой подпрограмме.
Параметры (переменные), определяемые при описании процедуры называются формальными.
Параметры (переменные), задаваемые при вызове процедуры называются фактическими.
Формальные параметры (переменные, описываемые в процедуре) делятся на параметры - значения и параметры - переменные
Параметры-значения – передают информацию только в процедуру (входные), описываются как переменные с указанием типа (без зарезервированного слова Var).
Параметры-переменные – передают информацию, как в процедуру, так и обратно (выходные), их описание начинается со слова Var, затем следует список переменных с указанием типа.
Пример:
Procedure sterline (len: integer); - параметры-значения.
Procedure stl (l: integer, Var n integer); - параметры-значения и параметры – переменные.
Формальные параметра описываются только в заголовке процедуры. Формальные параметры никогда не описываются в разделе описаний процедуры. Если в процедуре используются переменные, отличные от формальных параметров, их необходимо обязательно описать в разделе описания процедуры.
Вызов процедуры подобно специальным операторам происходит по имени с указанием фактических параметров, например:
stl (а, n);
Имена фактических параметров могут не совпадать с именами формальных параметров, но они должны соответствовать друг другу по типу. Формальные параметры описываются в разделе описания основной программы и до вызова процедуры должны получить значения.
Пример использования процедур:
Написать программу, которая выводит на экран строку, состоящую из заданного числа звездочек. Использовать процедуру.
Uses crt;
Var n: integer;
Procedure sterline (var len: integer);
Var i:integer;
Begin
For i:=1 to len do
Write (‘*’);
End;
Begin
Write(‘Введите количество звездочек’); Readln(n);
Sterline (n);
Readln; End.
Функции.
Функция, как и процедура, может содержать несколько операторов, несколько входных (и только) параметров, но результат получается только один. Этот единственный результат обозначается именем функции и передается в основную программу.
В общем виде функция записывается в разделе описания основной программы следующим образом:
Function имя (формальные параметры):тип;
Раздел описаний
Begin
Операторы
Имя:= …
End;
Поскольку результат обозначается именем функции, то после формальных параметров указывается тип функции, который должен совпадать с типом результата вычислений. В конце описания функции имени функции обязательно присваивается какое-то значение. Вызывается функция по ее имени с указанием фактических параметров. Функция может использоваться в операторах присваивания, условных операторах и т.п. Например, Res:=Compare(x1,x2);
Пример использования функций:
Написать программу, которая с помощью функции сравнивает два целых числа и выводит результат сравнения в виде одного из знаков: >,<,=
Uses crt;
Var x1,x2:real; res:char;
Function Compare (a,b: real):char;
Begin
If a>b then Compare:=’>’ else if a<b then Compare:=’<’ else Compare:=’=’;
End;
Begin
Writeln (‘Введите числа’);
Readln(x1,x2);
Res:=Compare(x1,x2);
Writeln(x1:6:2, res,x2:6:2);
Readln; end.
Рекурсия.
Рекурсия – это вывоз подпрограммой
(процедурой или функцией) самой себя.
Рассмотрим построение рекурсивной функции на примере вычисления N!. При правильно организованной рекурсивной подпрограммы осуществляется многократный переход от некоторого текущего уровня организации алгоритма к низшему уровню последовательно до тех пор, пока не будет получено тривиальное решение поставленной задачи.
PROGRAM DEMO1;
USES CRT;
VAR M:BYTE;
FUNCTION FAKT(N:BYTE):LONGINT;
BEGIN
IF N=1 THEN FAKT:=1
ELSE FAKT:=FAKT(N-1)*N;
END;
BEGIN
CLRSCR;
WRITE('N-');READLN(M);
WRITELN('N!=',FAKT(M));
READKEY;
END.
В нашем примере происходит так: в операторе печати вызывается функция FAKT с параметрам N, которая в свою очередь вызывает функцию FAKT с параметрам N-1, и так далее, пока не вызывается FAKT(1). Тогда это процесс останавливается, затем происходить извлечение результата в обратном порядке.
Это хорошо видно на следующем примере программы:
Текст программы: |
Результат работы программы: |
PROGRAM DEMO2; USES CRT; VAR CH: WORD; PROCEDURE WRITEA; BEGIN CH:=CH+1; WRITELN('НАЧАЛО',CH); IF CH<4 THEN WRITEA; WRITELN(' КОНЕЦ',CH); CH:=CH-1; END; BEGIN CLRSCR; CH:=0; WRITEA; READKEY; END. |
НАЧАЛО 1 НАЧАЛО 2 НАЧАЛО 3 НАЧАЛО 4 КОНЕЦ 4 КОНЕЦ 3 КОНЕЦ 2 КОНЕЦ 1
|
Рекурсивная форма организации алгоритма обычно выглядит изящнее итерационной и дает более компактный текст программы, но при выполнении, как правили, медленнее и может вызвать переполнение стека.
Стек – это специальная область памяти (конечное число ячеек), где сохраняется адреса возврата (адрес вызывающей программы, используется для передачи управления вызывающей программе). Стеки используются так же для передачи параметров в процедуры (для обычных параметров в стек заносятся их значения, для параметров-переменных – их адреса), размер стек ограничен. Стек можно представить в виде стопки книг. Если стопка достигла максимального размера, то при добавлении новой книги сверху – нижняя книга должна быть убрана.
Нужно обязательно отслеживать в программе наполнение стека, то есть не допускать зацикливания рекурсии.
Рекурсивный вызов может быть косвенным. В этом случае программа обращается к себе опосредованно, путем вызова другой программы, в которой содержится обращение к первой. При использовании такого подхода нужно использовать опережающее описание. Опережающее описание заключается в том, что объявляется лишь заголовок процедуры, а ее тело заменяется директивой FORWARD. После этого можно в другой процедуре использовать обращение к ней – ведь компилятор уже может правильным образом организовать ее вызов. Обратите внимание: тело второй процедуры описывается после первой и начинается заголовком, в котором уже не указываются описанные ранее формальные параметры.
Пример:
PROCEDURE B( J:BYTE);FORWARD; {тело процедуры заменено директивой FORWARD }
PROCUDURE A( I:BYTE);
BEGIN
…
B(I);
…
END;
PROCEDURE B;
BEGIN
…
A(J);
…
END;
Примеры программ с процедурами и функциями:
При составлении программ обязательно использовать процедуры или функцию.
Найти разность двух факториалов F=m! – k!, используя функцию.
Uses crt; Var F,m,k:integer; Function Fact(n:integer):integer; Var P,i:integer; Begin P;=1; For i:=2 to n do P;=P*i; |
Fact:=P; End; Begin Read (M,K); F:=Fact(m) – Fact(K); Writeln (‘F=’,F:5); repeat until keypressed End. |
Написать программу «Бегущие огни» с использованием процедуры рисования окружности.
uses crt,graph; var gd,gm,x:integer; begin gd:=detect; initgraph(gd,gm,''); x:=20; repeat repeat setcolor(4); circle(x,200,15); setfillstyle(1,3); floodfill(x,200,4); delay(8000); setcolor(0); |
circle(x,200,15); setfillstyle(1,3); floodfill(x,200,0); x:=x+40; until x>600; repeat setcolor(4); circle(x,200,15); delay(8000); setcolor(0); circle(x,200,15); x:=x-40; until x<20; repeat until keypressed; end. |
Примеры программ с использованием рекурсий:
Вычислить Xn: PROGRAM DEMO3; USES CRT; VAR X1,X2: WORD;I,M:BYTE;S:LONGINT; FUNCTION XN(X,N:BYTE):LONGINT; BEGIN IF N=0 THEN XN:=1 ELSE XN:=XN(X,N-1)*X; END; BEGIN CLRSCR; WRITE('X,N-');READLN(X1,M); WRITELN('XN-',XN(X1,M)); READKEY; END. |
Подсчитать сумму N чисел Фибоначчи (1,1,2,3,5,8,13,..): PROGRAM DEMO4; USES CRT; VAR X1,X2: WORD;I,M:BYTE;S:LONGINT; FUNCTION FIB(N:BYTE):LONGINT; BEGIN IF N=1 THEN FIB:=1; IF N=2 THEN FIB:=1; IF N>=3 THEN FIB:=FIB(N-1)+FIB(N-2); END; BEGIN CLRSCR; WRITE('N-');READLN(M); S:=0; FOR I:=1 TO M DO S:=S+FIB(I); WRITELN('S-',S); READKEY; END. |
Написать рекурсивную функцию вычисления суммы 1+2+3+4+5+…+N:
PROGRAM DEMO5;
USES CRT;
VAR M:WORD;
FUNNCTION SUM(N:WORD):LONGINT;
BEGIN
IF N=1 THEN SUM:=1 ELSE SUM:=SUM(N-1)+N;
END;
BEGIN
WRITE(‘N-‘);READLN(M);
WRITELN(‘СУММА -’,SUM(M));
READKEY;END.
Используя рекурсивную функцию получить подобную фигуру: |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 вариант (простая рекурсивная форма) PROGRAM DEMO6; USES CRT,GRAPH; VAR X,Y: WORD;I,K,M,N:BYTE; GD,GM:INTEGER; PROCEDURE LINT(X,Y,N,M:WORD); BEGIN LINETO(X+N,Y); LINETO(X+N,Y+N); LINETO(X+M,Y+N); LINETO(X+M,Y+M); X:=X+M;Y:=Y+M; N:=N-2*M; K:=K+1; IF K<5 THEN LINT(X,Y,N,M); END; BEGIN GD:=DETECT; INITGRAPH(GD,GM,''); LINT(0,0,100,10); READKEY; END. |
2 вариант (рекурсивная форма с опережающим описанием) PROGRAM DEMO7; USES CRT,GRAPH; VAR X,Y: WORD;I,K,M,N:BYTE; GD,GM:INTEGER; PROCEDURE LNT(X,Y,N,M:WORD); forward; PROCEDURE LINT(X,Y,N,M:WORD); BEGIN for k:=1 to 5 do begin lnt(x,y,n,m); X:=X+M;Y:=Y+M; N:=N-2*M; end; END; procedure lnt; begin LINETO(X+N,Y); LINETO(X+N,Y+N); LINETO(X+M,Y+N); LINETO(X+M,Y+M); end; BEGIN GD:=DETECT; INITGRAPH(GD,GM,''); LINT(0,0,100,10); READKEY;
|
|