extracted_text:
Процедуры  и  функции
       Занятие 14
Понятие подпрограмм.  Процедуры.  Функции. Понятие рекурсии
1. Урок 1.  Понятие подпрограмм. Процедуры.
2. Урок 2.  Функции.
3. Урок 3.  Понятие рекурсии.
4. Контрольные вопросы и упражнения.
Понятие подпрограммы впервые было описано Маврисом Уилксом и связано с использованием ЭВМ  EDSAC,
созданной   в   Кембриджском   университете,   которая   считается   первой   в   мире     ЭВМ   работающей   по   программе,
хранящейся в памяти машины.
Введение   подпрограмм   было   необходимым   шагом   на   пути   развития   программирования,   т.к.   давало
возможность,   вопервых,   повторять   действия,   описанные   в   подпрограмме,   вызывая   ее   каждый   раз,   когда   это
требовалось, со старыми или новыми данными, не описывая эти действия многократно.   Вовторых, конструировать
большие программы из подпрограмм, т.е. по частям, что давало возможность их коллективной разработки.
До   сих   пор   были   написаны   программы,   которые   состоят   из   некоторого   числа   инструкций,   выполняемых
машиной в некоторой последовательности. Такая программа называется монолитной. Программу же, состоящую из
подпрограмм называют модульной. Часто модули такой программы сами состоят из модулей более низкого уровня и
т.д. до самого элементарного уровня, т.е. модульная программа имеет иерархическую структуру.
В языке Паскаль существует  два типа подпрограмм  или модулей  процедуры и функции.
Урок 1.  Понятие  подпрограмм.  Процедуры
1.1. Понятие подпрограмм.
1.2. Процедуры.

1.1.  Понятие подпрограмм
Исходя из вышеизложенного, определим подпрограмму как часть программы, которая выполняет, какие либо
необходимые действия многократно по мере обращения к ней. Покажем это на примере простой задачи.
Задача.  Вывести на экран сообщение, выделив его сверху и снизу строками, состоящими из   нескольких
символов  "=".
Program V1L15P1; {Печать сообщения, заключенного в стоки символов '='}
Uses Crt;
Var i:byte;
{}
begin
ClrScr;
for i:=1 to 22 do
Write('=');
WriteLn;
{}
WriteLn('Печатаем 23 символа "="');
for i:=1 to 23 do
Write('=');
WriteLn;
{}
ReadKey
end.
В данном варианте решения циклическая операция по выводу символов использовалась дважды и, каждый раз
повторяясь, писалась заново в необходимом месте программы.
Рассмотрим   второй   вариант   решения,   который   сложнее   чем   первый,   где   показан   пример   использования
подпрограммы средствами, которые нам известны.
Жирным курсивом в обоих вариантах выделена циклическая операция печати символов.
Program V1L15P2; {Печать сообщения. Программа с использованием безусловных переходов}
Uses Crt;
Label metka1,metka2;
Var i:byte; k:boolean;
{}
begin
ClrScr;
k:=True;
{k  присвоить значение "Истина"}
84 Понятие подпрограмм.  Процедуры.  Функции. Понятие рекурсии
GoTo metka1;
metka2:
WriteLn('Печатаем 23 символа "="');
k:=False;
{}
metka1:
for i:=1 to 23 do
Write('=');
WriteLn;
{}
if k then GoTo metka2;
ReadKey
end.
Результат работы прогрымм
{k  присвоить значение "Ложь"}
{Логическое условие, если k истина, то иди на metka2}
=======================
Печатаем 23 символа "="
=======================
Проанализируем  первый и второй варианты решения задачи.
1. Количество переменных равно 1 и 2 соответственно.
2. Количество меток  0 и 2.
3. Количество операторов 14 и 19.
4. Использование циклической операции печати символов 2 и 1 раз.
Из чего следует, что второй вариант хуже для решения данной задачи, несмотря на то, что циклическая операция
печати символов используется во втором варианте один раз. Если бы в условии задачи был задан вывод двойных строк
символов,   и   мы   знали   бы   средства   работы   с   подпрограммами,   то   единственным   грамотным   решением   было   бы
использование этих средств.

1.2.  Процедуры
Процедурой называется часть программы, имеющая имя и предназначенная для решения определенной задачи.
Каждая процедура определяется в программе только один раз и может быть использована многократно. Процедуру
можно вызвать из различных мест основного блока программы. Процедура может возвращать вычисленные результаты
в основную программу и ей можно передавать информацию, которую она использует для выполнения вычислений.
Процедуры   состоят   из   локальных   данных,     внутренних   процедур,   внутренних   функций     и   операторов.
Структура описания процедуры имеет следующий вид.
{Описание   локальных    меток,}
  констант, типов и переменных}
Procedure  Имя (Список формальных параметров);
{}
Label
Const
Type
Var
{}
Procedure
Function
{}
begin
Оператор_1;
Оператор_2;
{Описание внутренних процедур
  и функций}
{Операторная часть процедуры}
. . .
Оператор_n
end;
Описание  процедуры  начинается   с  заголовка,  который  является  обязательным  (в  отличии  от  заголовка
программы). Заголовок состоит из служебного слова Procedure, за которым следует имя. Имя процедуры обязательно
и назначается по правилам,  аналогичным указанию имени программы. За именем процедуры в круглых скобках может
следовать список  формальных параметров, в виде каких либо переменных, которые могут быть заданы явно (т.е.
значениями) в основном блоке программы. Если в заголовке отсутствует список формальных параметров, то процедура
выполняет действия, которые описаны внутри ее  с собственными заданными переменными. Такая конструкция
называется процедурой без параметров, пример которой приведен ниже.
85 Вызов процедуры в основном блоке программы осуществляется ее именем, за которым может следовать через
запятую   список   формальных   параметров,   заключенных   в   круглые   скобки.   Рассмотрим   это   в   нижеприведенных
примерах.
Program V1L15P3; {Пример процедуры без параметров}
Uses Crt;
Procedure PrintSymbols;
Var i:byte;
begin
{Имя процедуры}
{Описание локальной переменной}
for i:=1 to 23 do
Write('=');
WriteLn;
end;
{Основной блок программы}
begin
ClrScr;
{}
PrintSymbols;
WriteLn('Печатаем 23 символа "="');
PrintSymbols;
{Вызов процедуры без параметров}
{Вызов процедуры без параметров}
{}
ReadKey
end.
Результат работы программы
=======================
Печатаем 23 символа "="
=======================
Следующий   вариант   решения   задачи   более   универсален,   т.к.   позволяет   использовать   параметры,   которые
могут   задаваться   непосредственно   при   вызове   процедуры.   Эти   параметры   называются  формальными  и
указываются в скобках после имени процедуры.
Формальные параметры одного типа пишутся  через запятую, затем  ставится двоеточие и указывается  тип
переменных (переменной). Если параметров несколько и разного типа, то они указываются через точку с запятой. Такая
форма называется процедурой с параметрами.
 Порядок следования параметров при вызове процедуры должен быть строго таким, каким он указан в скобках
после имени процедуры. В противном случае последует сообщение об ошибке.
 Если в процедуре используются переменные, которые не являются формальными, то они описываются в блоке
описания переменных процедуры и называются  локальными переменными. Локальные переменные используются
только в процедуре (см. программу V1L15P3).
Program V1L15P4; {Пример процедуры с параметнрами}
Uses Crt;
Procedure PrintSymbols(number:integer; s:char);
Var i:byte;
begin
{Локальная переменная}
for i:=1 to number do
Write(s);
WriteLn;
end;
{Основной блок программы}
begin
ClrScr;
{}
PrintSymbols(25,'*');
{Параметры в скобках передаются в процедуру, которая
 осуществит печать 25 символов '*'}
WriteLn('Печатаем   22   символа');
PrintSymbols(22,'=');
{Параметры в скобках передаются в процедуру, которая
 осуществит печать 22 символов '='}
{}
ReadKey
end.
Результат работы  программы
*************************
86 Понятие подпрограмм.  Процедуры.  Функции. Понятие рекурсии
Печатаем  22   символа
======================
Здесь,     при   вызове   процедуры,   формальным   параметрам    namber    и    s
 в   основном   блоке   программы
указываются   количество   символов   и   сам   символ,   которые   передаются   в   процедуру   для   выполнения   действия,
описанного в ней.
Возможен обратный процесс, когда результат вычислений производимых в процедуре, передается какой либо
переменной   (переменным)   в   основном   блоке   программы.   В   этом   случае   в   списке   формальных   параметров   эта
переменная  пишется после ключевого слова  Var  с указанием типа. Покажем это на следующем примере.
Задача. Найти сумму чисел от 1 до n.
Постановка задачи.
1. Количество чисел n вводить с клавиатуры, отвечая на сообщение "Введи количество чисел".
2. Результат вычислений выводить на экран дисплея с сообщением "Сумма чисел от 1 до  n  = ".
Количество чисел n печатать введенным с клавиатуры значением.
Program V1L15P5; {Сумма целых чисел от 1 до n}
Uses Crt;
Var k,s:integer;
{Описание процедуры}
Procedure Summa(n:integer; Var sm:integer);
Var i:byte;
begin
sm:=0;
for i:=1 to n do
sm:=sm+i;
end;
{Основной блок программы}
begin
ClrScr;
Write('Введи количество чисел ');
ReadLn(k);
Summa(k,s);
{Значение k передается в процедуру. Переменная s
 принимает значение sm,  вычисленное в процедуре}
WriteLn('Сумма чисел от 1 до ',k,' = ',s:4);
{}
ReadKey
end.
Результат работы программы
Введи количество чисел 3
Сумма чисел от 1 до 3 =  6
Здесь формальный параметр n получает значение k из основного блока программы, а формальный параметр sm
вычисляется в процедуре и его значение передается в основной блок программы переменной s.
Урок 2.  Функции
Выше   было   сказано,   что  функция,   аналогично  процедуре,     является   подпрограммой   (ее   еще   называют
процедуройфункцией).   Однако   результатом   выполнения   функции   всегда   будет   определенное   значение,   которое
должно быть присвоено имени функции. Структура описания функции имеет следующий вид.
{Описание   локальных    меток,}
{констант, типов и переменных}
Function  Имя (Список формальных параметров) : Тип результата;
{}
Label
Const
Type
Var
{}
Procedure
Function
{}
begin
{Описание внутренних процедур}
 {и функций}
87 {Операторная  часть,   среди    которой   должен    быть}
{хотя бы один оператор для  присвоения  имени  функции}
{результата вычислений}
Оператор_1;
Оператор_2;
. . .
Оператор_n
end;
Таким образом, описание функции имеет три отличия от описания процедуры.
1. Описание начинается служебным словом Function.
2. В заголовке функции указывается имя и тип результата вычислений функции.
3. В теле функции должен присутствовать хотя бы один оператор присваивания вида:
<Имя функции> := <Выражение вычисляемой функции>;
 или
<Имя функции> := <Переменная, принимающая результат вычислений>;.
Операторов   присваивания   указанного   типа   может   быть   несколько.   Результат   последнего   по   времени
выполнения оператора присваивания указанного вида принимается в качестве окончательного значения функции.
Функция  в основном блоке программы вызывается точно так же, как и процедура, т.е. своим именем, за
которым   в   круглых   скобках   следует   список   формальных   параметров,   передаваемых   в   тело   функции.   Как   и   в
процедуре, формальные параметры функции могут отсутствовать.
Рассмотрим в качестве примера предыдущую задачу нахождения суммы чисел   от 1 до  n. Программу этой
задачи напишем с использованием подпрограммы в виде функции.
Program V1L15P6; {Пример программы с использованием функции}
Uses Crt;
Var s,k :integer;
{Описание глобальных переменных}
{Описание функции}
Function Summa(n:integer):integer;
Var i:byte;sm:integer;
begin
{Указание типа имени функции}
{Описание локальных переменных}
sm:=0;
for i:=1 to n do sm:=sm+i;
Summa:=sm;
{Начальное значение суммы}
{Вычисление суммы чисел}
{Присвоение имени функции значения суммы чисел}
end;
{Основной блок программы}
begin
ClrScr;
Write('Введи количество чисел ');
ReadLn(k);
s:=Summa(k);
{Вызов функции. Присвоение переменной значения функции}
WriteLn('Сумма чисел от 1 до ',k,' = ',s:5);
{}
ReadKey
end.
В нижеприведенном варианте в списке локальных параметров отсутствует локальная переменная sm, функцию
которой выполняет глобальная переменная s, которая "работает" в подпрограмме и в основном блоке  программы.
Program V1L15P7; {Пример, где применяется глобальная переменная в качестве локальной}
Uses Crt;
Var n,s:integer;
{Описание глобальных переменных}
{Описание функции}
Function Summa(n:integer) :integer;
Var i :byte;
begin
{Указание типа имени функции}
{Описание локальных переменных}
s:=0;
for i:=1 to n do s:=s+i;
Summa:=s;
{Начальное значение суммы}
{Вычисление суммы чисел}
{Присвоение имени функции значения суммы чисел}
end;
{Основной блок программы}
begin
ClrScr;
Write('Введи количество чисел ');
88 Понятие подпрограмм.  Процедуры.  Функции. Понятие рекурсии
ReadLn(n);
s:=Summa(n);
{Присвоение переменной значения функции}
WriteLn('Сумма чисел от 1 до ',n,' = ',s:5);
{}
ReadKey
end.
А в этом варианте глобальная переменная n может быть не описана как локальная переменная в теле функции.
В результате чего получим функцию без параметров.
Program V1L15P8; {Функция без параметров}
Uses Crt;
Var s,n:integer;
{Описание глобальных переменных}
{Описание функции}
Function Summa:integer;
Var i:byte;
begin
s:=0;
for i:=1 to n do s:=s+i;
Summa:=s;
end;
{Локальная переменная}
{Начальное значение суммы}
{Цикл накопления суммы}
{Присвоение имени функции значения суммы}
{Основной блок программы}
begin
ClrScr;
Write('Введи количество чисел ');
ReadLn(n);
WriteLn('Сумма чисел от 1 до ',n,' = ',Summa:5);
{}
ReadKey
end.
Результат работы программ
Введи количество чисел 3
Сумма чисел от 1 до 3 =    6
Урок 3.  Понятие рекурсии
Рекурсия  (recurrence) в переводе с английского языка означает   возвращение, повторение. В живой природе
рекурсия   организована   в   виде   воспроизведения   себе   подобных.   Рекурсия   в   программировании      это   организация
вычислительного  процесса, при котором подпрограмма в ходе выполнения ее операторов, обращается сама к себе.
Рассмотрим   несколько   примеров   решения   задачи   получения   некоего   ряда   чисел,   имеющего   определенную
закономерность.
Задача. Вычислить значения функции
 
1



2
5
x




y

1

5
2
x









5
для целых   x  (1 <= x <= 10).
Постановка задачи
1. Количество, задаваемых значений аргумента, определить в тексте программы.
2. Результат вычислений выводить на экран в столбик в формате "Значение аргумента   Значение
функции".
Program V1L15P9; {Вычисление значений ряда Фибоначчи, заданной в виде функции}
Uses Crt;
Var a,b,y,q :real; x :byte;
{}
begin
ClrScr;
WriteLn('    x    y');
89 WriteLn('   ');
{}
a:=1;b:=1;
q:=Sqrt(5);
     {Цикл вычисления функции}
for x:=1 to 10 do
begin
a:=a*(1+q)/2;
b:=b*(1q)/2;
y:=(ab)/q;
WriteLn(x:5,y:5:0);
end;
    {Конец цикла}
ReadKey
end.
{Начальные значения уменьшаемого и вычитаемого числителя}
{Вычисление квадратного корня}
{Накопление значения уменьшаемого}
{Накопление значения вычитаемого}
{Вычисление функции при заданном аргументе 'x'}
Результат работы программы
         x    y

    1    1
    2    1
    3    2
    4    3
    5    5
    6    8
    7   13
  8   21
  9   34
 10   55
Анализируя  результат  вычислений  можно  определить  закономерность,  а  именно,  последующее  число  ряда
вычисленных значений равно сумме двух предыдущих. Эту закономерность впервые получил в 1202 году Леонардо да
Пиза, известный нам под именем Фибоначчи, решая задачу о кроликах. Задача формулировалась следующим образом.
Сколько пар кроликов рождается за год, если через месяц одна пара кроликов производит на свет другую. Кролики
начинают производить себе подобных через два месяца после своего рождения.
Итак, полученную числовую закономерность можно записать следующим образом:
F(n) = F(n  1) + F(n  2),
(**)
с условием, что F(1) = 1 и   F(2) = 1. Составим программу для вычисления ряда Фибоначчи, используя формулу (**).
Для чего необходимо организовать одномерный массив f. Программа будет выглядеть следующим образом.
Program V1L15P10; {Вычисление ряда Фибоначчи с использованием массива}
Uses Crt;
Var f :array [1..20] of integer; i,n :integer;
{}
begin
ClrScr;
WriteLn('Ряд Фибоначчи');
Write('Введи количество чисел ряда '); ReadLn(n);
for i:=1 to n do
begin
{Цикл вычислений значений ряда}
if (i=1) or (i=2) then f[i]:=1 else f[i]:=f[i1]+f[i2];
WriteLn(i:3,f[i]:5);
end;
{}
ReadKey
end.
{Конец цикла вычислений значений ряда}
В этой программе есть один существенный недостаток, а именно, одномерный массив f, который  не оправдано,
занимает оперативную память компьютера.
 Следующая версия программы лишена этого недостатка. Алгоритм решения задачи.
1. Обозначить в формуле (**) первое слагаемое через  ' a ',  второе через ' b '.
2. Присвоить  начальные  значения    переменным   a = 1,  b = 0.
3. Организовать циклическую операцию со счетчиком по переменной ' i ' до n, которое определяет
количество выводимых элементов ряда Фибоначчи.
90 Понятие подпрограмм.  Процедуры.  Функции. Понятие рекурсии
4. Поменять  местами  значения  переменных,   т. е.  a = 0,   b = 1.
5. Сложить значения переменных и записать результат в переменную  ' b '.
6. Вывести на экран дисплея  значения  переменной  цикла ' i '  и ' b '.
Program V1L15P11; {Вычисление ряда Фибоначчи без использования массива}
Uses Crt;
Var i,n: byte; a,b,k :longint;
{}
begin
ClrScr;
WriteLn('Ряд Фибоначчи');
Write('Введи количество чисел ряда '); ReadLn(n);
a:=1;b:=0;
for i:=1 to n do
begin
{Начальные значения переменных}
{Цикл расчета значений ряда}
k:=a;a:=b;b:=k;
b:=a+b;
WriteLn(i:3,b:5)
end;
{}
ReadKey
end.
{Обмен значениями переменных}
{Присвоение переменной 'b' значения суммы переменных}
И, наконец, программа с использованием подпрограммы в виде функции и рекурсии.
Program V1L15P12; {Использование рекурсии в вычислении ряда Фибоначчи}
Uses Crt;
Var x,m :byte;
{Рекурсивная функция вычислений чисел ряда Фибоначчи}
Function Fib(n:byte):longint;
begin
if (n=1) or (n=2) then Fib:=1 else Fib:=Fib(n1)+Fib(n2);
end;
{Рекурсия}
{Основная программа}
begin
ClrScr;
WriteLn('Ряд Фибоначчи');
Write('Введи количество чисел ряда '); ReadLn(m);
{}
for x:=1 to m do
WriteLn(x:3,Fib(x):7);
{Вызов функции и печать результатов вычислений}
{}
ReadKey
end.
Результат работы программ
Ряд Фибоначчи
Введи количество чисел ряда 8
  1    1
  2    1
  3    2
  4    3
  5    5
  6    8
  7   13
  8   21
Следует отметить, что последний вариант решения задачи проще и нагляднее предыдущих примеров.
Контрольные вопросы и упражнения
1. Что называется подпрограммой, какой цели они служат?
2. Какие виды подпрограмм существуют,  в чем их сходство и различие?
3. Как  передать параметры  процедуры и функции в основную программу?
4. Как  передать параметры для вычислений из основной программы в процедуру или функцию?
91 5. Что называется рекурсией, в каких вычислениях ее выгодно использовать?
Для заметок, вопросов и ответов
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
_____________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
92

file_name: Занятие 14ч1.doc

title: Процедуры  и  функции


extracted_text:
Символьные константы и переменные. Кодировка символов. Функции преобразования символьных переменных. Коды управляющих клавиш
Символьные  константы  и  переменные
   Занятие 15
1. Урок 1.    Символьные константы  и  переменные.    Кодировка символов.
2. Урок 2.    Функции преобразования символьных переменных.
3. Урок 3.    Работа с клавиатурой.   Коды   управляющих   клавиш клавиатуры.
4. Контрольные вопросы и упражнения.
Большая   часть  информации,   которая   обрабатывается  на  современных  компьютерах,   является   символьной,
представленной в виде текста, отдельных строк или таблиц. Такая информация, как правило, вводится в компьютер
вручную с помощью клавиатуры, затем подвергается обработке для формирования баз данных. На физическом уровне
компьютеры работают только с цифровой информацией, поэтому символьная информация кодируется  цифровыми
кодами.
Урок 1.  Символьные константы и переменные.  Кодировка символов
При нажатии любой клавиши клавиатуры, генерируется код, соответствующий символу, изображенному на
клавише. Эти коды собраны в таблицу, которая называется  ASCII (American Standard Code for Information Interchange
– стандартный американский код для обмена информацией).  Существует стандартный и расширенный  набор кодов
символов.   Стандартный   набор   состоит   из  126  символов   и   соответствующих   им   кодов,   расширенный   из  255.
Стандартный набор представлен латинским алфавитом (строчные и прописные буквы), набором десятичных цифр
и     специальных   символов.  Расширенный  код   включает   в   себя   и  другие  алфавиты,   например,   кириллицу   для
славяноязычных стран.
Символьные константы и переменные  имеют тип   char   (от английского  слова   character   буква) и
следующие форматы в блоке описания переменных  Pascal  программы:
для констант:
Const <Имя_константы> = # <Код_символьной_константы>;
или
Const <Имя константы> = '<Символ ASCII>';
для символьных переменных:
<Имя символьной переменной> : char;
Например, для  Const ch = #72;, при выводе константы на экран  дисплея будет индицирован символ  H.  Для
Const ch = 'H';  так же будет выведен символ  H.
Небольшая программа продемонстрирует правоту, изложенного выше утверждения,  для символьных констант.
Program V1L16P1; {Вывод символьной константы}
Uses Crt;
Const a=#72;b='H';
{}
begin
ClrScr;
WriteLn(a);
WriteLn(b);
{}
ReadKey
end.
{Присвоение значений символьным константам}
{Вывод констант на экран дисплея}
{В обоих случаях выводится символ H}
Для   символьных   переменных   в   качестве   примера   рассмотрим   задачу   вывода   на   экран   дисплея   десяти
символов. Для решения задачи необходимо  преобразовать  цифровой код символа в символ.   Для этого используем
функцию преобразования Char. Функция имеет следующий формат:
<Имя символьной переменной> := Char (x);
где x    код в кодовой таблице ASCII,  тип переменной  x  byte. Функция возвращает символ.  Здесь можно заметить,
что  имя функции  совпадает  с  именем типа переменной. Это допускает  Pascal  и для  других  типов, в качестве
функции преобразования типов. Нижеприведенная  программа выводит на экран дисплея два столбика, состоящих из
десяти кодов символов и десятичных символов цифр (0 : 9).
Program V1L16P2; {Вывод 10ти символов десятичных цифр}
Uses Crt;
Var a:char; i:byte;
{}
begin
{Определение переменных}
92 Символьные константы и переменные. Кодировка символов. Функции преобразования символьных переменных. Коды управляющих клавиш
ClrScr;
WriteLn('Десять числовых символов с кодами 48  57');
for i:=48 to 57 do
begin
{Цикл изменения кода символа}
a:=Char(i);
WriteLn(i,a:3);
{Функция преобразования кода в символ}
{Вывод на экран дисплея}
end;
{}
ReadKey
end.
Результат работы программы
Десять числовых символов с кодами 48  58
48  0
49  1
50  2
51  3
52  4
53  5
54  6
55  7
56  8
57  9
Урок 2.  Функции преобразования символьных переменных
Имея   таблицу   кодов   символов  ASCII,   может   возникнуть   необходимость   нахождения   кода   по   заданному
символу, либо символа по заданному коду. Такая операция возможна с помощью функций преобразования символьных
переменных.  Задачу преобразования символьных переменных решают следующие функции.
Chr(<Код>);
   возвращает   символ,   который   задан   кодом       в     кодовой   таблице    ASCII,   где
переменная  <Код>  имеет тип  byte (аналогично функции  Char(x) см. программу  V2L01P2).
 возвращает код, заданным символом     в кодовой таблице  ASCII, где переменная
Ord(<Символ>);
<Символ>  имеет тип  char.
Upcase(<Символ>);
переменная  <Символ>  имеет тип char. Данная функция не обрабатывает кириллицу.
 возвращает символ записанный в верхнем регистре, в символ нижнего регистра, где
Pred(<Символ>);
 возвращает  символ, который предшествует   ему   в кодовой таблице  ASCII, где
переменная  <Символ> имеет тип  char.
Succ(<Символ>);
 возвращает символ, следующий после  указанного  в кодовой таблице ASCII,  где
переменная  <Символ>  имеет тип  char.
Нижеприведенная программа демонстрирует работу функции  преобразования  Ord.
Program V1L16P3; {Преобразование символа в код символа}
Uses Crt;
Var a:char; b:byte;
{}
begin
ClrScr;
{Стирание экрана}
WriteLn('Введи символ. Для завершения работы введи символ "*"');
repeat
{Объявление переменных}
if (a<>#13)and(a<>#10) then Write('Символ: ');
Read(a);
if (a<>#13)and(a<>#10) then
begin
{Цикл ввода символа и печати кода}
{Печать строки при условии "да"}
{Ввод символа}
{Преобразование и печать кода при условии "да"}
b:=Ord(a);
WriteLn('Код: ',b:4)
{Преобразование символа в код}
{Вывод кода}
end;
until a='*';
WriteLn('Работа с программой завершена! Нажми любую клавишу.');
{}
{Завершение цикла при вводе символа "*"}
93 ReadKey
end.
{Ожидание нажатия любой клавиши}
Возможный результат работы программы
Введи символ. Для завершения работы введи символ “*”
Символ: a
Код:   97
Символ: A
Код:   65
Символ: а
Код:  160
Символ: А
Код:  128
Символ: *
Код:   42
Работа с программой завершена! Нажми любую клавишу.
Циклическая операция по вводу символов прерывается после ввода символа  “*”.
Следующая программа демонстрирует работу функций Pred(x) и Succ(x) и выводит на экран дисплея символы,
которые находятся выше и ниже от  введенного с клавиатуры символа.
{Объявление переменных}
Program V1L16P4; {Вывод на экран символа указанного выше или ниже от заданного символа}
Uses Crt;
Var a,b,c:char;
n,m,i:byte;
{}
begin
ClrScr;
Write('Введи символ из таблицы ASCII ');
Read(a);
Write('Введи номер символа, от указанного, вверх ');
Read(n);
Write('Введи номер символа, от указанного,  вниз ');
Read(m);
b:=a;c:=a;
for i:=1 to n do
{Цикл поиска символа, от указанного, вверх}
{Движение вверх на один символ}
{Цикл поиска символа от указанного вниз}
{Движение вниз на один символ}
b:=Pred(b);
WriteLn('Предыдущий  символ ',b);
for i:=1 to m do
c:=Succ(c);
Write('Последующий символ ',c);
ReadKey
end.
Возможные результаты работы программы
Вариант 1
Введи символ из таблицы ASCII a
Введи номер символа, от указанного, вверх 3
Введи номер символа, от указанного,  вниз 2
Предыдущий  символ ^
Последующий символ c
Вариант 2
Введи символ из таблицы ASCII A
Введи номер символа, от указанного, вверх 3
Введи номер символа, от указанного,  вниз 2
Предыдущий  символ >
Последующий символ C
Урок 3. Работа с клавиатурой. Коды управляющих клавиш клавиатуры
Клавиатура является основным устройством ручного ввода информации в память компьютера. Все клавиши
клавиатуры можно разделить на три группы:
1. Клавиши  и комбинации клавиш,  нажатие которых  посылает  в буфер клавиатуры  ASCII  –  код
(символьный).
94 Символьные константы и переменные. Кодировка символов. Функции преобразования символьных переменных. Коды управляющих клавиш
К таким клавишам относятся  алфавитноцифровые и специальные символы на обоих регистрах (т.е. с Shift и
без него), а также комбинации клавиш  Ctrl + Алфавитноцифровая   и Ctrl + Некоторые специальные символы,
которые    вырабатывают  ASCIIкоды   управляющих  символов (0  32).
2. Клавиши и комбинации клавиш, нажатие которых посылает в буфер клавиатуры   расширенный
код.
кодов.
К таким клавишам относятся функциональные клавиши, так и  в комбинации с любой из клавиш Shift, Ctrl,
Alt; алфавитноцифровые клавиши, нажатые в комбинации с   Alt   и другие клавиши и комбинации. Символьный код
занимает 1 байт памяти компьютера. Коды управляющих, функциональных и комбинации клавиш  2 байта. Такие
коды называется  расширенными.     Расширенный   код состоит из двух символов:  первый    символ с кодом   0,
второй – ASCII код управляющего символа клавиатуры.
3. Клавиши   и  комбинации  клавиш,   нажатие   которых  не  посылает   в  буфер  клавиатуры     никаких
К ним относятся клавиши   Shift, Ctrl, Alt, CapsLock, NumLock,   ScrollLock и некоторые комбинации клавиш
(см. приложения).
Для работы с клавиатурой в модуле  Crt  предусмотрены следующие функции.
KeyPressed, имеет тип  boolean  и возвращает значение  True  (истина), если на клавиатуре нажата какая либо
клавиша. В противном случае, функция возвращает значение False.  При этом введенные символы остаются в буфере
клавиатуры и доступны для дальнейшей обработки.

ReadKey, имеет тип char, считывает символ с клавиатуры, который не отображается на экране дисплея, как
это происходит при использовании процедуры   Read.
Рассмотрим   пример   использования   данных   функций   в   нижеприведенной   программе.     Работа   программы
заключается в перемещении символа  ‘*’ по экрану дисплея, который оставляет след, клавишами перемещения курсора.
{Вызов библиотечного модуля}
{Описание}
{переменных}
Program V1L16P5; {Позиционирование курсора}
Uses Crt;
Var i,j,n,m:integer;
k:char;
{}
begin
ClrScr;
m:=1;n:=1;
i:=40;j:=12;
GoToXY(i+m,j+n);
Write('');
{}
repeat
{Операторная скобка начала основного блока программы}
{Стирание экрана}
{Установка курсора в центр экрана дисплея}
{На экран дисплея выводиться курсор}
{Начало цикла}
{Считывание символа первого байта кода}
{Сравнение со значением 1го байта кода}
k:=ReadKey;
if k=#0 then
begin
k:=ReadKey;
if k=#77 then i:=i+1;
if k=#75 then i:=i1;
if k=#72 then j:=j1;
if k=#80 then j:=j+1;
{Считывание и сравнение символа 2го байта кода}
{вправо}
{влево}
{вверх}
{вниз}
end;
GoToXY(i+m,j+n);
Write('*');
until k=#27;
{}
ReadKey
end.
{Позиционирование курсора}
{Вывод на экран символа ‘*’}
{Пока не нажата клавиша ‘Esc’}
{Операторная скобка конца основного блока программы}
{Ожидание нажатия любой клавиши}
Возможный результат работы программы
                   **************
                   *            *
                   *            *
                   *            *
                  ****************
95 *              *
                  *              *
                  *              *
                  *              *
                  ****************
1. Вывести на экран дисплея символы, которые отстоят от введенного с клавиатуры на два символа вверх и на два
Контрольные вопросы и упражнения
вниз таблицы кодов ASCII.
2. Напишите программы,   в которых используются все функций преобразования (см. текст   программы   V1L16P3,
V1L16P4).
3. Вывести   на   экран   дисплея   все   символы   таблицы   кодов  ASCII,   которые   отстоят   от   введенного   с   клавиатуры
символа на  ‘n’  вверх и на ‘m’ вниз. Все выводимые символы должны быть расположены на экране дисплея.
4. Написать программу перемещения символа  ‘*’ по экрану дисплея клавишами перемещения курсора,  который не
оставляет след.
5. Написать программу перемещения символа ‘*’ по экрану дисплея со следом, без следа и удаления следа при
6. Вывести на экран дисплея в строку символы стандартной и расширенной таблицы кодов ASCII.
7. Вывести  на  экран  дисплея  в  формате  таблицы  в  два столбца коды и символы стандартной и расширенной
необходимости.
таблицы кодов ASCII
8. Вывести  в  формате   таблицы   коды   и   символы стандартной и расширенной таблицы кодов ASCII, которая вся
должна помещаться на экране дисплея.
9. Дана некая строка символов в виде осмысленной фразы. Определить количество одинаковых символов в ней.
10. Даны 20 тетрад из прописных символов русского алфавита. Вывести на экран дисплея все тетрады, у которых
второй символ буква  “а”.
Для заметок, вопросов и ответов
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
96 Символьные константы и переменные. Кодировка символов. Функции преобразования символьных переменных. Коды управляющих клавиш
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
______________________________________________________________________________________________________
97

file_name: Занятие 15ч1.doc

intro:
Занятие строится таким образом, что после прослушивания теоретического материала (10 –15 мин.), учащимся предлагается практическое задание, которое выполняется ими за 20 - 30 мин. и корректируется в процессе изучения материала в более сложную задачу по изучаемой теме.
Автор сознательно избегал сложных примеров, будучи убежденными, в том, что гораздо важнее для учащихся понимание алгоритмов предлагаемых  задач,  приобретение навыков  разработки  алгоритмов, их программирования и выполнения на компьютере в течение одного занятия. Такой подход к изучению языка программирования позволяет сосредоточить внимание на самом процессе программирования, который в данном случае более важен для изучения языка, чем  решение сложной задачи, наверняка трудной большинству учащихся. Такие задачи, по мнению авторов, неоправданно занимают большое количество учебного времени, превращая учителя из инициатора процесса обучения  в диктатора.

информатика

group: Дисциплины

title: Символьные  константы  и  переменные


extracted_text:
Доклад
на тему : «Арт-терапия в работе с детьми имеющие
сложный дефект»

                                             Май ,2016
       Арт –терапия это метод коррекции и развития посредством
художественного творчества.Ее привлекательность можно объяснить тем, что
Арттерапия использует «язык» визуальной и пластической экспрессии. Это
особенно актуально при работе с детьми и делает ее незаменимым
инструментом для исследования, развития и гармонизации в тех случаях,
когда ребенок не может выразить словами свое эмоциональное состояние.
Дети в большинстве случаев затрудняются объяснить словами  свои проблемы Арттерапия   не   имеет   ни   ограничений,
и переживания Несловесное  выражение  для них более естественно. Особенно
это значимо для детей с речевыми нарушениями, т. к. их поведение более
спонтанно и они менее способны к рефлексии своих действии  и поступков.
Важна естественная склонность ребенка к игровой деятельности ,богатство
детской фантазии. Учитывая это при организации коррекционной работы
элементами арттерапии, на занятиях создается атмосфера игры и творчества
           Как только ребенок берет в руки кисточку, пластилин или глину для
лепки,   он   высвобождает   свое   подсознание.   В   итоге   получается   исцеление
через самовыражение творческого потенциала. Рассматривая методы работы
с   детьми,   арттерапия   является   одним   из   самых   действенных   способов.
Интересен и сам процесс: размазывание, разбрызгивание, смешение, подбор
или импульсивное рисование красками .
       Арттерапия – это специализированная форма психотерапии, основанная
на искусстве, в первую очередь изобразительной и творческой деятельности.
Выражение   себя   через   искусство   является   безболезненным   способом
выражения   чувств.
  ни
противопоказаний,   являясь   безопасным   методом   снятия   напряжения.   Это
естественный   путь   исцеления,   когда   негативные   эмоции   преобразуются   в
позитивные.  Арттерапевтические занятия придают сил, уверенности, могут
помочь   найти   выход   из   сложной   ситуации.   В   процессе   творчества   на
поверхность   выходят   многие   проблемы,   которые   были   глубоко   скрыты   и
решаются они безболезненно.
       Арттерапия   сопровождается терапевтическими эффектами. Искусство
само по себе обладает целительным действием.
      При проведении арттерапии важен творческий акт как таковой, а также
особенности   внутреннего   мира   творца,   которые   выявляются   в   результате
осуществления   этого   акта.   Поощряются   выражения   своих   внутренних
переживаний   как   можно   более   произвольно   и   спонтанно,   совершенно   не
беспокоясь о художественных достоинствах своих работ.
      Среди позитивных феноменов, зафиксированных как зарубежными, так и
отечественными специалистами, можно выделить наиболее значимые.
     Арттерапия:
 Создает положительный эмоциональный настрой.
 Позволяет обратиться к тем реальным проблемам или фантазиям, которые
по каким – либо причинам затруднительно обсуждать вербально.  Дает возможность на символическом уровне экспериментировать с самыми
разными   чувствами,   исследовать   и   выражать   их   в   социально   приемлемой
форме.   Работа   над   рисунками,   картинками,   скульптурами   –   безопасный
способ   разрядки   разрушительных   и   саморазрушительных   тенденций.
Позволяет проработать мысли и эмоции, которые человек привык подавлять.
 Развивает  чувство  внутреннего   контроля. Арт    терапевтические  занятия
создают   условия   для   экспериментирования   с   кинестетическими   и
зрительными ощущениями, стимулируют развитие сенсомоторных умений и в
целом   правого   полушария   головного   мозга,   отвечающих   за   интуицию   и
ориентацию в пространстве.
   Способствует   творческому   самовыражению,   развитию   воображения,
эстетического опыта, практических навыков изобразительной деятельности,
художественных способностей в целом.
   Повышает   адаптационные   способности   ребенка   к   повседневной   жизни   и
школе.   Снижает   утомление,   негативные   эмоциональные   состояния   и   их
проявления, связанные с обучением.
 Эффективна в коррекции различных отклонений и нарушений личностного
развития. Опирается на здоровый потенциал личности, внутренние механизмы
саморегуляции и исцеления. Наиболее популярными и часто используемыми
видами   арттерапии   являются: изотерапия,
  игровая
терапия, песочная терапия, музыкальная терапия, фототерапия. Очень
часто   перечисленные   виды   терапии   переплетаются   в   одном   занятии
(терапевтической сессии).

  Занятия   с   детьми   не   должны   ограничиваться   обычным   набором
изобразительных средств (бумага, кисти, краски) и традиционными способами
их использования. Ребенок более охотно включается в процесс, отличный от
того,   к   чему   он   привык.   Арсенал   способов   создания   изображений   широк:
акватушь,   рисование   сыпучими   продуктами   или   засушенными   листьями,
рисование пальцами и ладонями, пульверизатором и т. д. Немного фантазии, и
на песке, приклеенном к бумаге, расцветут цветы, в воздух взлетит фейерверк
из   мелких   бумажек,   кляксы   превратятся   в   бабочек,   пятна   краски   —   в
невиданных   животных.   Ребята   почувствуют   свой   успех,   ведь   они   смогут
победить злых чудовищ, сжечь свои страхи, помирить игрушки.
  сказкотерапия,

Рисование сыпучими материалами (песок, сухие листья, крупы и
др.). С   помощью   сыпучих   материалов   и   клея   ПВА   можно   создавать
изображения.   На   лист   бумаги   клеем,   который   выдавливается   из   тюбика,
наносится   рисунок.   Затем   сухие   листья   растираются   между   ладонями   на
мелкие   частички   и   рассыпаются   над   клеевым   рисунком.   Лишние,   не
приклеившиеся частички стряхиваются. Так же используется в работе песок,
крупы и другие сыпучие материалы.
                 рис. 1. Рисование сыпучими материалами (кварцевый песок).

                                  Рисование пластилином.
Пластилином можно создавать различные изображения. Это трудоемкая
техника,   требует   от   ребенка   усидчивости   и   длительного   сосредоточения
внимания. Хорошо данную технику использовать с гиперактивными детьми. Рис. 2. Рисование пластилином.
              Техника марания (разбрызгивание красок).
Игра с красками очень завлекает и завораживает, тем более, если
разрешено брызгаться и «пачкать» лист красками. Дети выполняют такие
работы с особым удовольствием и интересом. Рис. 4. Техника марания (разбрызгивание красок)
                                  Рисование пальцами.
Рисование   пальцами   не   бывает   безразлично   ребенку.   В   связи   с
нестандартностью ситуации, особыми тактильными ощущениями, экспрессией
и нетипичным результатом изображения, оно сопровождается эмоциональным
откликом. с. 6. Рисование пальцами.
Ри

file_name: Доклад Арт-терапия.docx

description:
с. 6. Рисование пальцами.
Ри

intro: Арт –терапия это метод коррекции и развития посредством художественного творчества.Ее привлекательность можно объяснить тем, что Арт-терапия использует «язык» визуальной и пластической экспрессии. Это особенно актуально при работе с детьми и делает ее незаменимым инструментом для исследования, развития и гармонизации в тех случаях, когда ребенок не может выразить словами свое эмоциональное состояние.Арт –терапия это метод коррекции и развития посредством художественного творчества.Ее привлекательность можно объяснить тем, что Арт-терапия использует «язык» визуальной и пластической экспрессии. Это особенно актуально при работе с детьми и делает ее незаменимым инструментом для исследования, развития и гармонизации в тех случаях, когда ребенок не может выразить словами свое эмоциональное состояние.

дефектология

group: Педагогика

title: Арт-терапия


extracted_text:
Строковые константы и переменные
    Занятие 16
1. Урок 1.  Строковые константы  и  переменные.
2. Урок 2.  Операции         над         строковыми          переменными (присваивание, сцепление,  отношения).
3. Урок 3.  Встроенные функции и процедуры для обработки строк.
4. Контрольные вопросы и упражнения.
Урок 1. Строковые константы и переменные
1.1. Первый способ реализации строк.
1.2. Строковые константы и переменные.
1.3. Второй способ реализации строк.
Строка представляет собой набор символов некоторого алфавита, которая имеет определенное смысловое
значение. Строку можно представить как  особую форму одномерного массива символов, которая определяется в
программе при описании и имеет две разновидности длины:
заданную длину строки, которая определяет размер памяти, выделяемый строке при описании;

 фактическую   длину строки,  которая   всегда  меньше  или  равна    заданной  длине  строки  и  показывает
количество смысловых символов в каждый конкретный момент времени.
К каждому  символу строки можно обратиться по его  номеру, присвоить  в программе некой  символьной
переменной и вывести на экран дисплея или принтер  с помощью стандартных процедур  Write, WriteLn.

Строковые переменные могут быть введены в программу с клавиатуры стандартной процедурой ReadLn. При
этом строка вводится целиком и заканчивается клавишей  Enter, а не поэлементно,  как  массивы данных.
1.1. Первый способ реализации строк
В этом случае  фактическая  длина строки  указывается    в   нулевом  элементе строки.  В этот  элемент
записывается символ, код которого указывает длину строки. Нулевой элемент строки не видим для пользователя,
но его значение  можно посмотреть  или  присвоить  какой либо переменной.  Максимальная  фактическая длина
строки меньше или равна 255 символов. Такой способ записи имеет преимущество в том, что информация о длине
строки всегда доступна (см. рис. 1). К недостатку следует отнести ограничение в максимальной длине строки.
1.2. Строковые константы и переменные
Строковые константы  – это последовательность символов, заключенная в апострофы, например:   ‘Turbo
Pascal’,  ‘Строка’.
Строковые константы могут быть объявлены в описательной части программы в разделе констант в формате:
или записаны в теле программы оператором присваивания строки некой строковой переменной в формате:
Const  <Имя  строковой константы> = ‘Строка символов’;
<Имя  строковой переменной> := ‘Строка символов’;
Строковые переменные – это аналогия символьным массивам (тип   char). Их отличием является то, что
число   символов  (фактическая   длина   строки)   может  динамически   меняться  от     0   до  заданного    количества
символов в строке.   Строковая переменная имеет тип   string   и определяется в описательной части программы в
формате:
Var  <Имя  строковой переменной> : string [<Заданная длина строки>];
где <Заданная длина строки>  указывается в   квадратных   скобках   со значениями от 1 до 255. Реально, длина
строки может принимать меньшее или равное значение, чем указанное в скобках. Если длина строки не указывается,
то по умолчанию принимается равной  255 символов.
Например:
по умолчанию.
Var  str1: string[30]; str2: string;   где заданная длина строки   str1   30 символов, а  str2  255
Фактическая   длина   строки   определяется   в   процессе   выполнения   программы   и   не   может   быть  больше
заданной длины. В противном случае ошибка не индицируется, а строка  обрезается  до заданной  длины.
 В программе  vv67 показано все, что было описано выше.
Program V1L17P1; {Определение заданной и фактической длинны строк}
Uses Crt;
Var nstr1,nstr2,vnstr1,vnstr2:byte;
    str1:string[10];str2:string[5];
    vstr1,vstr2:string;
{}
begin
{Вызов стандартного модуля}
{Определение переменных}
{Определение  строк}
{Определение вводимых строк}
97 Строковые константы и переменные.  Операции над строковыми переменными.  Встроенные функции и процедуры для обработки строк
ClrScr;
WriteLn('Введи первую строку');
ReadLn(vstr1);
vnstr1:=Ord(vstr1[0]);
{Стирание экрана}
{Ввод первой строки}
{Заданная длина первой строки}
WriteLn('Заданная длина первой строки',vnstr1:6);
WriteLn;
WriteLn('Введи вторую строку');
ReadLn(vstr2);
{Перевод строки}
{Ввод второй строки}
vnstr2:=Ord(vstr2[0]);
{Заданная длина второй строки}
WriteLn('Заданная длина второй строки',vnstr2:6);
str1:=vstr1;
str2:=vstr2;
{Присвоение заданной 1ой строке фактической}
{Присвоение заданной 2ой строке фактической}
nstr1:=Ord(str1[0]);
nstr2:=Ord(str2[0]);
{Фактическая длина 1ой строки}
{Фактическая длина 2ой строки}
WriteLn;
WriteLn('Фактическая длина первой строки',nstr1:4);
if vnstr1>10 then
WriteLn(', обрезана до длины в 10 символов, указанных в описании.');
WriteLn('Фактическая длина второй строки',nstr2:4);
if vnstr2>5 then
WriteLn(', обрезана до длины в 5 символов, указанных в описании.');
{}
ReadKey
end.
{Ожидание нажатия любой клавиши}
Результаты решений могут быть следующими:
Вариант 1
Введи первую строку
1234567890=
Заданная длина первой строки    12
Введи вторую строку
12345678
Заданная длина второй строки     8
Фактическая длина первой строки 10, обрезана до длины в  10  символов, указанных в описании.
Фактическая длина второй строки 5, обрезана до длины в  5  символов, указанных в описании.
Вариант 2
Введи первую строку
1234567
Заданная длина первой строки     7
Введи вторую строку
123
Заданная длина второй  строки     3
Фактическая длина первой строки   7
Фактическая длина второй строки   3
На рис. 1 представлена структура первого способа реализации строк. Заданная длина строки задана размером
в 14 символов в блоке описания переменных программы.  Фактическая длина строки равна  6ти символам.
 0        1       2       3        4       5       6       7       8       9       10     11     12     13    14
♠ P
A
L
S
C
A
Рис. 1. Структура первого способа реализации строк в языке Turbo Pascal 7.0.
В нулевой позиции стоит символ,  код которого равен 6  по   расширенной таблице кодов  ASCII. Для того,

чтобы узнать количество символов в фактической строке, необходимо преобразовать символ в нулевой позиции в его
код с помощью функции   Ord  (см. программу  V2L02P1).
1.3. Второй способ реализации строк
98 В этом способе реализации строк  фактическая длина строки фиксируется специальным символом
признаком, который ставится  после последнего  символа строки.    В   Turbo  Pascal  это символ с нулевым кодом,
который называется   “нольсимвол”   и обозначается или   NULL  или  \0.   Этот способ ограничивает длину строки
размером  64 K  байт (65534 символа). Строки с завершающим нулем называют  также  ASCIIZстроками.
На рис. 2 представлена  структура  второго способа реализации строк. Заданная  длина строки определена
размером в 14 символов в блоке описания переменных программы.  Фактическая длина строки равна  6ти символам.

0        1       2       3        4       5       6       7       8       9       10     11     12     13    14
P
\0
A
S
C
A
L
Рис. 2. Структура второго способа реализации строк  в языке Turbo Pascal 7.0.
Строки в этом способе хранятся в виде символьных массивов с нулевой базой, то есть, нижняя граница
которых равна нулю, и заканчиваются  нольсимволом  (\0).
Кроме   того,   в   языке  TP  7.0   имеется   тип    Pchar,   который   представляет   собой  указатель   на   строку   с
завершающим   нулем.   При   этом   символьный   массив   с   нулевой   базой   совместим   с   указанным   типом  Pchar.
Переменные типа   Pchar    допускается  индексировать  аналогично  символьному  массиву с нулевой базой,  что
показано в  программе V2L02P1.
В программе переменная  str   описана как символьный массив.   Переменная   s,   как   указатель на строку с
завершающим нулем (тип   Pchar). В цикле по переменной цикла   i   происходит вывод на экран дисплея каждого
символа  строки в отдельную строку, т.е. исходная горизонтальная строка  печатается как вертикальная.
Program V1L17P2; {Печать введенной строки с завершающим нулем}
Uses Crt;
Var str:array[0..12] of char;
i,dstr:byte;
s:pchar;
{}
begin
ClrScr;
WriteLn('Введи строку');
ReadLn(str);                     {Ввод строки}
s:=str;
{Описание символьного массива}
{Описание целых переменных}
{Описание указателя на строку}
dstr:=Length(str);
{Присвоение переменной "s" введенного строчного значения}
{Вычисление длины строки}
WriteLn('Длина строки',dstr:5);
for i:=0 to dstr do              {Цикл печати символов строки}
WriteLn(s[i]);
{Печать символа строки}
{}
ReadKey
end.
Урок 2. Операции над строковыми переменными
2.1. Операция присваивания.
2.2. Операция сцепления.
2.3. операции отношения.
Строковые данные могут участвовать в строковых выражениях, которые состоят из  строковых констант,
переменных  типа    string    и    char,  знаков   операций  и  встроенных   функций.   Над   строковыми   переменными
производятся операции  присваивания,  сцепления и отношения.
2.1. Операция присваивания
Эта операция предназначена для присваивания некоторой строковой переменной определенного строкового
выражения в формате:
<Имя строковой переменной> := ’Строковое выражение’;
Операция  неоднократно  была использована в предыдущих программах (V1L17P1,  V1L17P2),  где строка символов
вводилась   с   клавиатуры   стандартной   процедурой   ввода    ReadLn.     При   этом     ввод   строки   осуществляется    без
апострофов.
2.2. Операция сцепления
99 Строковые константы и переменные.  Операции над строковыми переменными.  Встроенные функции и процедуры для обработки строк
Операция   сцепления   применяется   для  сцепления  нескольких   строк   в  одну  результативную   строку.   Для
обозначения   операции   сцепления   используется   знак    +  (плюс)   или   функция   конкатенации  Concat,  которая   имеет
следующий формат:
Concat(<Строка 1>, <Строка 2>, …, <Строка N>);
Program V1L17P3; {Сцепление строк}
Uses Crt;
Var str1,str2:string[6];str3:string[12];
{}
begin
ClrScr;
str1:='Turbo ';
str2:='Pascal';
{}
WriteLn('Первая строка, записанная в теле программы');
WriteLn(str1);
WriteLn('Вторая строка, записанная в теле программы');
WriteLn(str2);
{}
WriteLn('Результативная строка');
{Описание строк}
{Значение первой строки}
{Значение второй строки}
{Вывод первой строки}
{Вывод второй строки}
str3:=str1+str2;
WriteLn(str3);
{}
ReadKey
end.
или
{Сцепление строк}
{Вывод результативной строки}
Program V1L17P4; {Сцепление строк}
Uses Crt;
Var str1,str2:string[6];str3:string[12];
{}
begin
ClrScr;
str1:='Turbo ';
str2:='Pascal';
{}
WriteLn('Первая строка, записанная в теле программы');
WriteLn(str1);
WriteLn('Вторая строка, записанная в теле программы');
WriteLn(str2);
{}
WriteLn('Результативная строка');
{Описание строк}
{Значение первой строки}
{Значение второй строки}
{Вывод первой строки}
{Вывод второй строки}
str3:=Concat(str1,str2);
{Сцепление строк}
{Вывод результативной строки}
WriteLn(str3);
{}
ReadKey
end.
2.3. Операции отношения
Операции отношения:

равно         =;
неравно  <>;
больше      >;
меньше     <;
больше, равно  >=;
меньше, равно  <=.
Эти   операции   производят   сравнение   двух   строковых   операндов   и   имеют   более  низкий  приоритет,   чем
операция сцепления.  Сравнение строк производится слева направо до первого несовпадающего символа.  Строка
считается  большей, в которой  первый несовпадающий символ  имеет  больший номер  в кодовой таблице   ASCII.
Результат выполнения операций отношения всегда имеет логический тип (Boolean)  и принимает значение (true) или
(false).     Строки   считаются  равными,     если   они   полностью   совпадают   по  фактической,     а   не  заданной  длине,
100 объявленной в описательной части программы, и содержат одни и те же символы. Обязательно следует учитывать
регистр символов строки.
Приведенная   в   качестве   примера   программа,   демонстрирует   сказанное   выше.   В   программе   происходит
сравнение двух введенных с клавиатуры строк и вывод на экран дисплея сообщений об этом.
Program V1L17P5; {Операции отношения}
Uses Crt;
Var nstr1,nstr2,nvstr1,nvstr2:byte;
    vstr1,vstr2:string;
{}
begin
ClrScr;
WriteLn('Введи первую строку');
ReadLn(vstr1);

nvstr1:=Ord(vstr1[0]);
WriteLn('Общая длина первой строки',nvstr1:6);
WriteLn;
{}
WriteLn('Введи вторую строку');
ReadLn(vstr2);
nvstr2:=Ord(vstr2[0]);
WriteLn('Общая длина второй строки',nvstr2:6);
{}
{Вызов стандартного модуля}
{Переменные длин строк}
{Определение вводимых строк}
{Стирание экрана}
{Ввод первой строки}
{Определение заданной длины 1ой строки}
{Ввод второй строки}
{Определение заданной длины 2ой строки}
nstr1:=Ord(vstr1[0]);
nstr2:=Ord(vstr2[0]);
{Определение фактической длины 1ой строки}
{Определение фактической длины 2ой строки}
WriteLn;
WriteLn('Фактическая длина первой строки',nstr1:4);
WriteLn('Фактическая длина второй строки',nstr2:4);
{Логическое условие равенства строк}
if vstr1=vstr2 then WriteLn('Строки равны') else WriteLn('Строки неравны');
{Логическое условие неравенства строк}
if vstr1>vstr2 then WriteLn('Первая строка больше второй')
 else WriteLn('Вторая строка больше первой');
{}
ReadKey
end.
{Ожидание нажатия любой клавиши клавиатуры}
Результаты работы программы могут быть следующими:
Вариант 1
Введи первую строку
Turbo Pascal
Заданная длина первой строки     12
Введи вторую строку
Turbo Pascal
Заданная длина второй строки     12
Фактическая длина первой строки  12
Фактическая длина второй строки  12
Строки равны
Вариант 2
Введи первую строку
Turbo Pascal 7.0
Заданная длина первой строки     16
Введи вторую строку
Turbo Pascal
Заданная длина второй строки     12
Фактическая длина первой строки  16
Фактическая длина второй строки  12
Строки неравны
Первая строка больше второй
Вариант 3
Введи первую строку
Turbo Pascal
101 Строковые константы и переменные.  Операции над строковыми переменными.  Встроенные функции и процедуры для обработки строк
Заданная длина первой строки     12
Введи вторую строку
Turbo pascal
Заданная длина второй строки     12
Фактическая длина первой строки  12
Фактическая длина второй строки  12
Строки неравны
Вторая строка больше первой
В данном случае во второй строке слово pascal начинается с символа малого регистра, код которого больше
чем код символа   P (большой регистр), следовательно, по определению вторая строка больше первой (см.  таблицу
кодов ASCII).
Урок 3. Встроенные функции и процедуры для обработки строк
3.1. Функция  Length.
3.2. Функция  Copy.
3.3. Функция  Pos.
3.4. Процедура  Delete.
3.5. Процедура  Insert.
3.6. Процедура  Str.
3.7. Процедура  Val.
Встроенные функции и процедуры являются удобным и, в некоторой степени, достаточным сервисом для
работы со строковыми данными.
 Рассмотрим стандартные функции и процедуры  TP 7.0.
3.1. Функция  Length – определяет длину фактической текстовой строки. При подсчете фактической длины строки
учитываются все входящие в нее символы, в том числе и пробелы.
 Формат функции:
<Имя целой переменной> := Length(<Имя строковой переменной>);
где,  Имя целой переменной – идентификатор, объявленный в блоке описания, должен иметь целочисленный тип.
Грамотнее объявить типом Byte или Word, т.к. отрицательной длины строки не бывает.
Имя строковой переменной, может быть объявлено в виде константы в блоке описания или в теле программы.
Program V1L17P6; {Определение фактической длины строки}
Uses Crt;

Var vstr:string;
    str: string[20];
    vlen,len:byte;
{}
begin
ClrScr;
WriteLn('      Введи исходную строку');
ReadLn(vstr);
{}

{Стирание экрана}
{Вызов библиотечного модуля}
{Определение исходной строки}
{Определение заданной строки}
{Определение длин строк}
{Ввод исходной строки}
vlen:=Length(vstr);
{Длина исходной строки}
WriteLn('      Длина  исходной   строки',vlen:4,'символов.');
WriteLn;
{}
str:=vstr;
{}
WriteLn('      Фактическая строка');
WriteLn(str);
{}
{Печать заданной строки}
{Присвоение исходной строки заданной}
len:=Length(str);
{Длина заданной строки}
{}
WriteLn('      Длина фактической строки',len:4,' символов.');
{}
if vlen>20 then
WriteLn('Исходная строка обрезана до 20 заданных символов.');
{}
102 ReadKey
end.
Результаты работы программы могут быть следующими.
Вариант 1.
Введи исходную строку
qwertyuiop
Длина исходной строки 10 символов.
Фактическая строка
qwertyuiop
Длина фактической строки 10 символов.
Вариант 2.
Введи исходную строку
1234567890=йцукенгшщзхъфывапр
Длина исходной строки 30 символов.
Фактическая строка
1234567890=йцукенгш
Длина фактической строки 20 символов.
Исходная строка обрезана до 20 заданных символов.
3.2. Функция   Copy  – копирует выделяемую из исходной  фактической  строки   подстроку   в  другую  строчную
переменную.
Формат функции:
<Имя подстроки> := Copy(<Имя строки>, <Позиция начала подстроки><Длина подстроки>);
где, < Длина подстроки>  и  <Позиция начала подстроки > должны иметь целочисленный тип.
В случае   если   <Позиция начала подстроки>    будет больше чем   <Длина строки>, то  результатом
копирования будет пробел.
Program V1L17P7; {Определение подстроки}
Uses Crt;
Var vstr,pstr:string;
      p,d,len:byte;
{}
begin
ClrScr;
WriteLn('      Введи исходную строку');
ReadLn(vstr);
Write('      Введи позицию первого символа подстроки ');
Read(p);
Write('      Введи длину подстроки ');
Read(d);
{Ввод исходной строки}
{Определение исходной строки}
{Определение переменных}
pstr:=Copy(vstr,p,d);
{Выделение подстроки}
WriteLn('      Выделенная подстрока');
WriteLn(pstr);
len:=Length(pstr);
WriteLn('      Длина подстроки',len:4,' символов.');
{}
ReadKey
end.
{Печать заданной строки}
{Длина подстроки}
Возможный результат работы программы.
Введи исходную строку
123 456 789 0
Введи позицию первого символа подстроки  3
Введи длину подстроки  7
Выделенная подстрока
3 456 7
Длина подстроки 7 символов
3.3. Функция   Pos – определяет    наименьший     номер     позиции     начала подстроки, входящей в некую строку
как подстрока. Если  подстрока в строке не найдена, то результат равен  нулю.
103 Строковые константы и переменные.  Операции над строковыми переменными.  Встроенные функции и процедуры для обработки строк
Формат функции:
<Наименьший номер позиции строки> := Pos(<Имя подстроки>,<Имя строки>);
где, <Наименьший номер позиции строки>  должен иметь целочисленный тип  Byte или Word.
{Определение строки и подстроки}
{Определение переменных}
Program V1L17P8; {Определение наименьшего номера позиции начала подстроки в строке}
Uses Crt;
Var str,pstr:string;
      p,len:byte;
{}
begin
ClrScr;
WriteLn('      Введи строку str');
ReadLn(str);
len:=Length(str);
Write('      Длина строки',len:4,' символов.');
WriteLn;WriteLn;
{}
WriteLn('      Введи  подстроку pstr');
ReadLn(pstr);
len:=Length(pstr);
Write('      Длина подстроки',len:4,' символов.');
WriteLn;
{}
{Ввод подстроки}
{Вычисление длины подстроки}
{Стереть экран}
{Ввод строки}
{Вычисление длины строки}
{Два перевода строк}
p:=Pos(pstr,str);
{Опред. позиции начала подстроки в строке}
{}
WriteLn;
Write('      Позиция начала подстроки в строке');
WriteLn(p:4);
{}
ReadKey           {Ожидание нажатия любой клавиши клавиатуры}
end.
{Печать позиции}
Возможные результаты работы программы.
Вариант 1.
Введи строку  str
asdfghjkl
Длина строки  9 символов.
Введи подстроку  pstr
dfghj
Длина подстроки  5 символов.
Позиция начала подстроки в строке 3
Вариант 2.
Введи строку  str
1234567890
Длина строки  10 символов.
Введи подстроку  pstr
qwer
Длина подстроки  4 символа.
Позиция начала подстроки в строке  0
3.4. Процедура  Delete  – удаляет в исходной строке  фрагмент  определенной длины, начинающийся с  указанной
позиции. Результатом является новая строка, которая записывается в исходную строку без удаленного фрагмента.
Формат процедуры:
Delete(<Исходная строка>,<Позиция начала подстроки>,<Длина подстроки>);
где, <Позиция начала подстроки>, и < Длина строки>  имеют целочисленный тип Byte  или Word.
Program V1L17P9; {Удаление подстроки из строки}
Uses Crt;
Var str,pstr:string;
{Определение строки и подстроки}
104 {Определение переменных}
     d,p,len:byte;
{}
begin
ClrScr;
WriteLn('      Введи строку str'); ReadLn(str);
len:=Length(str);
Write('      Длина строки',len:4,' символов');
WriteLn;WriteLn;
Write('      Введи позицию первого символа подстроки  '); Read(p);
Write('      Введи   длину   удаляемой     подстроки  '); Read(d);
{Перевод строк}
{Стереть экран}
{Ввод строки}
{Вычисление длины строки}
Delete(str,p,d);
{Удаление подстроки с позиции "p". Количество символов "d"}
WriteLn;
WriteLn('      Преобразованная строка');
WriteLn(str);
len:=Length(str);
Write('      Длина строки',len:4,' символов');
{}
ReadKey           {Ожидание нажатия любой клавиши клавиатуры}
end.
{Печать преобразованной строки}
{Вычисление длины преобразованной строки}
Результат работы программы может быть следующим.
Введи строку  str
1234567890
Длина строки 10 символов.
Введи позицию первого символа подстроки  3
Введи   длину   удаляемой     подстроки  2
Преобразованная строка
12567890
Длина строки  8 символов.
3.5. Процедура  Insert  –  вставляет    строку 1  в  строку 2,  начиная  с некоторой  указанной  позиции в строке 2.
Результатом является новая строка, которая записывается во вторую строку. Если результат будет строкой размером
больше 255 символов, то все символы, начиная с 256, будут удалены.
Формат процедуры:
Insert(<Имя строки 1>, <Имя строки 2>, <Позиция в строке 2>);
Program V1L17P10; {Вставка строки в строку}
Uses Crt;
Var str1,str2:string;
      p,len:byte;
{}
begin
ClrScr;
WriteLn('      Введи первую строку'); ReadLn(str1);
WriteLn('      Введи вторую строку'); ReadLn(str2);
Write('      Введи позицию строки str2 для вставки str1  ');Read(p);  {Ввод позиции строки
str2}
{Определение исходных строк длиной в 255 символов}
{Определение переменных}
{Ввод первой строки}
{Ввод второй строки}
Insert(str1,str2,p);
WriteLn('      Результат'); WriteLn(str2);
len:=Length(str2);   {Длина результативной строки}
WriteLn('  Длина результативной строки',len:4,' символов.');
{}
ReadKey
end.
{p  позиция вставки  str1 в строку str2}
{Печать результативной строки}
Результат работы программы может быть следующим.
Введи первую строку
123456
asd
Введи вторую строку
Введи позицию строки str2 для вставки str1  3
Результат
as123456d
Длина результативной строки  9 символов.
105 Строковые константы и переменные.  Операции над строковыми переменными.  Встроенные функции и процедуры для обработки строк
3.6.  Процедура  Str     преобразует   числовое    значение    в    строковое      представление.      Формат      процедуры
        следующий:
Str(<Числовая переменная>:<Общее кол.  цифр>:<Кол. цифр дробной части числа>,<Строковая
переменная>);
где,  <Общее количество цифр>  обозначает их общее количество, включая десятичную точку.
Преобразованное число в виде  цифровых  символов  записывается  в  <Строковую переменную>. Например,
Str(1020:4,str1); возвращает в   переменную  str1 строку "1020",   Str(1020.56:7:2,str2); возвращает  в переменную  str2
строку "1020.56".
3.7. Процедура   Val   преобразует строку цифровых символов “0 : 9”, символы   “E”, “+” и   “”   в их численное
представление.  Формат процедуры следующий:
Val(<Строка цифровых символов>, <Численное представление строки>, <Код>);
где  в <Код>  возвращается признак ошибки. Если  <Код> <>  0, то при записи результирующего числа  наблюдается
переполнение или обнаруживается недопустимый символ. В этом случае <Код> равен номеру недопустимого символа.
Program V1L17P11; {Преобразование числа в цифровую строку и и цифровой строки в число}
Uses Crt;
{Использование модуля работы с дисплеем}
Var nstr:string;                {Длина строковой переменной 255 символов по умолчанию}
n,v:real; c,f,d,len:word;
{}
begin
{Очистить экран}
ClrScr;
WriteLn('       Введи число  '); Read(n);
{Ввод числа}
WriteLn('       Введи  общее  количество  цифр в числе,');
WriteLn('       включая  десятичную   точку'); Read(f);  {Ввод общего количества цифр в числе}
WriteLn('       Введи количество  чисел дробной  части');
Read(d);
{Ввод количества чисел дробной части числа}
{Определение числовых переменных}
Str(n:f:d,nstr);
{Преобразование числа в строку символов}
WriteLn('       Строка   цифровых   символов');
WriteLn(nstr);
len:=Length(nstr);
WriteLn('       Количество символов в строке'); WriteLn(len);   {Печать длины строки}
{Печать строки символов}
{Вычисление длины строки}
Val(nstr,v,c);
{Преобразование строки nstr в число v}
WriteLn('       Числовое значение строки цифровых символов');
WriteLn(v:f:d);
ReadKey         {Ожидание нажатия любой клавиши клавиатуры}
end.
{Печать числа в заданном при вводе формате}
Возможный результат  работы программы.
Введи число  123.78
Введи  общее  количество  цифр в числе,
включая   десятичную   точку  6
Введи количество  чисел дробной  части  2
Строка   цифровых   символов  123.78
Количество символов в строке  6
Числовое значение строки цифровых символов  123.78
1. Ввести с клавиатуры строку символов и подсчитать, сколько раз в данной строке встречается символ, введенный с
Контрольные вопросы и упражнения
клавиатуры.
2. Ввести с клавиатуры некий текст и подсчитать, сколько раз встречается символ, введенный с клавиатуры в каждой
строке.
3. Ввести с клавиатуры строку символов и сосчитать количество гласных букв в ней.
4. Удалить из введенной с клавиатуры строки средний символ, если количество символов в строке нечетное и удалить
два средних символа, если количество символов в строке четное.
Заменить все символы  Ch1 в строке на символы Ch2. Строку и символы вводить с клавиатуры.
5.
6. Дана последовательность слов. Вывести на экран эту последовательность в алфавитном порядке.
7. Дана последовательность слов. Вывести на экран дисплея все слова, которые встречаются в ней по одному разу.
8. Дано  целое число  n > 2 31. Подсчитать сумму   его цифр.
9. Даны две строки. Если они начинаются с одинаковых символов, то напечатать  “Да” и вывести  эти символы. В
противном случае напечатать “Нет”. Количество рассматриваемых символов вводить с клавиатуры.
106 10. Ввести   с  клавиатуры   некий  текст.  Напечатать   этот  текст  словами  –   перевертышами,   оставив  на  месте   знаки
препинания   и  пробелы.  Например,   текст:     “Печатаю   текст   словами      перевертышами   ”   .    Вывести   на   экран:
“Юатачеп  тскет имаволс  имашытревереп”.
Для заметок, вопросов и ответов
[encoded data, 4491 characters]

file_name: Занятие 16ч1.doc

title: Строковые константы и переменные