Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмизация и языки программирования. Учебно-методический комплекс.pdf
X
- •1. СИЛЛАБУС ДИСЦИПЛИНЫ ДЛЯ СТУДЕНТОВ
- •Тема 1. Понятие алгоритма, свойства, типы, исполнители
- •Структура программы.
- •Имена, ключевые слова и знаки операций
- •Тема 7. Символьные типы данных.
- •Обработка символьных данных.
- •Тема 9. Строки. Строковые процедуры.
- •Функции
- •Тема 11. Множества (Set)
- •Работа с текстовыми файлами
- •Тема 13. Записи
- •Тема 14. Построение изображений на экране
- •Отображение точки на экране
- •Отображение линий на экране
- •Построение прямоугольников на экране
- •Построение многоугольников
- •Построение дуг, эллипсов и окружностей
- •Основная литература
- •Дополнительная литература
- •ГЛОССАРИЙ

В тексте программы константы символьного типа записываются
которым следует десятичный код (т.е. номер от 0 до 255) соответ
лители числовых констант также являются значимыми символами.
u:= 'b';
u:= 'a';
u,v : char;
двумя способами. Наиболее наглядный из них – это заключение
любого изображаемого символа в апострофы. Например: ‘*’, ‘F’, ‘1’.
Второй способ позволяет задавать любые символьные константы, в
том числе и соответствующие управляющим символам, по их кодам.
В этом случае обозначение константы начинается с символа «#», за
-
ствующего символа. Например: #13, #26, #65. Если же мы считываем
значение символьной переменной с клавиатуры или из файла, то
соответствующий символ должен быть набит уже без апострофов. А
если считывается последовательность символов (текст), то они набиваются все подряд, без разделителей, так как пробел, и другие разде-
Итак, переменным типа Char мы можем присваивать стандарт-
ные символы (буквенные или цифровые). В соответствии с пра-
вилами подобным переменным в каждом случае могут в качестве
возможных значений присваиваться следующие знаки:
1) заглавные буквы от A до Z;
2) цифровые символы от 0 до 9;
3) пропуски (или пробелы);
4) знаки операций, скобки и т.д.
Исключением составляет штрих(апостроф) ‘, имеющий спе-
циальное назначение.
Если в программе имеется описание
то возможны, например, операторы присваивания
u:=v;
v:= '*';
Штрих (апостроф) – ‘ – принятая в Паскале форма кавычки
употребляется всякий раз, когда значение типа char явно указывается
в программе. Выполнение операторов
write(u);
приводит к высвечиванию на экране символа b.
31

Каждый символ имеет свой порядковый номер, благодаря чему в
'a'=v;
v<>'b';
L
работе с символами можно использовать стандартные функции
pred(x), succ(x), ord(x) и chr(x).
Пример 1. Демонстрация работы функции pred(x) и succ(x).
Program prim1;
var x1,x2,x3: char;
begin
x1:= 'L'; writeln(x1);
x2:=pred(x1 ); writeln('pred=',x2);
x3:=succ(x1); writeln ('succ=',x3);
Результат
программы:
L
pred=K
succ=M
end.
Пример 2. Демонстрация работы функций ord(x) и chr(x).
Program prim2;
var n : integer; x : char;
begin
x:= 'L'; wr it e ln (x);
n:=ord(x); writ e ln(n);
x:=chr(n); writeln(x);
end.
Результат
программы:
L
76
Для переменных типа char в качестве условий после служебных
слов IF и WHILE могут употребляться отношения
u=v;
а также построенные на их основе составные условия.
Пример 3. Даны символы s
чен от символа «/» и что среди s
Пусть s
…sn - символы данной последовательности, предшест-
1
вующие первому символу «/» (n заранее не известно). Программа
подсчета восклицательных знаков среди s
,… Известно, что символ s1 отли-
1,s2
,… есть хотя бы один символ «/».
2,s3
…sn.
1
32

Решение:
Program prim3;
var c : char; n : integer;
begin
read(c); n:=0;
while c<> '/' do
begin
if c='! ' then n:=n+1;
read(c);
end;
write(n);
end.
При построении условий, располагающихся после IF и WHILE,
можно использовать разнообразные отношения в множестве сим-
волов. Здесь возможен не только знак «=» и комбинация «<>», но
также <, <=, >, >=, т.к. все множество символов считается упоря-
доченным. Упорядоченность получается так: из всех символов
составлен список, и из двух символов меньше тот, который встречается в списке раньше.
Поэтому, например, 'a'<'c', 'y'>'x', '3'>'1'. В остальном вопрос
порядка решается по-разному на разных компьютерах.
Упорядоченность открывает возможность использования в
программах операторов цикла с параметром, имеющим тип char.
Параметр цикла, имеющий тип char, пробегает ряд символов в
указанных границах.
Выполнение оператора цикла
for c:= 'a' to 'z' do write(c);
где с: char, приводит к высвечиванию на экране всех малых букв
латинского алфавита.
Выполнение оператора
for c:=’z’ downto ‘a’ do write(c);
приведет к высвечиванию этих же букв в обратном порядке.
33

Пример 4. Программа вывода последовательностей букв
Program prim5;
a
Program prim4;
var c,d : char;
begin
ab
abc
…….
abcd…z
for c:= 'a' to 'z' do
begin
for d:= 'a' to c do
write(d);
write(' ');
end;
end.
Пример 5. Дана последовательность символов. Определить
существуют ли в данной последовательности хотя бы одна латинская
буква предшествующая символу «/». Если таковая имеется, выдать
соответствующее сообщение на экран.
Решение:
8.1. Одномерные массивы
label 1;
var c : char;
begin
read(c);
while c<>'/' do
if (‘a’<=c) and (c<='z') then
begin
write ('есть'); goto 1;
end
else read(c);
write('нет');
1: end.
Тема 8. Массивы
Ранее обсуждались переменные простых типов данных. По-
другому они называются скалярными типами данных. Каждый из
этих типов данных характеризуется дискретным набором множества
своих значений (напомним, что это относится в том числе и к
вещественным типам, однако перечислить конкретные значения
34

элементов соответствующего множества для того или иного вещест-
Из элементов простых типов в языке Паскаль можно образо
a[1], a[2],…,a[n]
n
àaà ...
21
венного типа достаточно сложно, для этого необходимо абсолютно
точно знать, как именно он реализован в компьютере). Заметим, что
все скалярные типы, кроме вещественных, называются также
порядковыми типами: значения любого из таких типов могут быть
упорядочены так, что компьютерное представление каждого следующего значения есть двоичное число, на единицу больше преды-
дущего (это справедливо и для нечисловых типов данных). С общими
свойствами порядковых типов мы подробно познакомимся в дальнейшем.
-
вывать составные (структурированные) типы данных, так называемые
структуры данных. Примером такой структуры является векторный
тип данных – массив.
Массив – это составной объект, образованный из элементов
(компонент) одного и того же типа. Такой тип данных применяется в
программировании для обозначения объектов, аналогичных число-
вым последовательностям в математике, где сразу целая группа чисел
обозначается одним именем (чаще всего буквой), а для обращения к
каждому отдельному числу данной последовательности используются различные индексы (номера элементов). В математике это
может выглядеть, например, так:
Запись на Паскале выглядит следующим образом:
Тип индекса может быть ограниченным, литерным, перечис-
лимым, логическим, это объясняется тем фактом, что указанные типы
строго упорядочены и пронумерованы.
Например:
1. Если индексы – это упорядоченные символы a…z или A…Z,
то возможна такая запись
2. Для ограниченного типа 0..10
c[‘a’]:=false; c[‘8’]:=true; c[‘x’]:=false;
d5[1]..d5[10] ‘a’..’d’
35

Тип же самих элементов может быть любым, в том числе и
Минимальное
Максимальное
..
Заметьте, что допускается последовательность от false..true, но
никак не true..false. Так же не допускается последовательность ‘y’..’f’.
Для описания подобных объектов в программировании сле-
дует предварительно ввести соответствующий тип в разделе описания типов. Описание типа данных массив производится 2 способами.
1 способ:
type <имя типа>=array[тип индекса] of <тип компонент>;
var a: <имя типа>;
2 способ:
var a: array[тип индекса] of <тип компонент>;
Все компоненты масссива ( то есть составляющие его элементы)
обозначаются элементами упорядоченного множества индексов,
принадлежащих к одному из порядковых типов. Порядковые типы
могут быть различными, но чаще всего для этого используется
ограниченный тип (диапазон) целых чисел, например, 1..100. То есть
фактически на месте порядкового типа обычно стоит следующая
конструкция:
значение
значение
составным. Количество элементов массива называется его размер-
ностью.
В Паскале упомянутую выше последовательность можно
описать, например, следующим образом:
const n=10;
type aa=array[1..n] of real;
var a: aa;
36

То есть мы задали массив вещественных чисел, состоящий из 10
, то в программе будет возможно испо
type lit=array[char] of real;
элементов. Меняя значение константы n, мы можем изменять
количество элементов в массиве.
Примеры:
ogr=array[10,18] of char;
perech=(z1, z2, z2, z4, z5);
bol=array[boolean] of integer;
var l:lit; а:ogr; b: b ol;
p: array[perech] of Boolean;
c, d: boolean;
Проверим правильность записи переменных:
l[5]:=7.5; - не правильная запись, так как индекс относится к
типу char.
l[‘5’]:=‘b’; - ошибка записи, так как переменная l – это действи-
тельное число (тип real).
Правильным было бы следующее выражение:
l['5']:= 7.5;
Проверьте правильность следующих записей:
a[5]:= 'a'; p[z]:=true;
a[11]:= 'a'; b[c and d]:=5;
Проверьте себя. Как опишутся в программе переменные массива
var x: array[1..n] of real ?
Ответ: x[1]:=2.5; x[n]:=0.1; x[2]:=0.5.
Над переменными типа массив возможна только операция
присваивания. То есть содержимое одного массива может быть
присвоено содержимому другого массива того же самого типа.
Например, если мы добавим в описание переменных переменную b
того же типа aa
например, следующий оператор присваивания:
b:=a.
37
льзовать,

Очевидно, что для того, чтобы этот оператор имел смысл,
значения элементов массива a уже должны быть заданы, например,
введены с клавиатуры.
С элементами массива можно осуществлять все те же дейст-
вия, которые допустимы с обыкновенными переменными соответствующего типа. Чтобы обратиться в программе к конкретному эле-
менту массива, после имени переменной типа массив в квадратных
скобках должно стоять выражение для соответствующего индекса
элемента. Это может быть константа, входящая в диапазон кон-
стант, указанный при описании, это может быть переменная того
же самого порядкового типа (если в качестве индексов исполь-
зуется конкретный диапазон целых значений, то переменная может
принадлежать любому целому типу), наконец это может быть
произвольное выражение, значение которого также принадлежит
указанному типу. Например, a[5], a[i], a[i+1], a[2*k-1]. При исполь-
зовании переменных для обозначения индекса их значения к
моменту использования должны быть определены, а в случае ариф-
метических выражений их результат не должен выходить за
границы массива (минимальное и максимальное значения индекса).
Индексы элементов массива могут начинаться с любого целого
числа, в том числе и отрицательного, например:
type a=array[-5..3] of boolean;
Массивы данного типа будут содержать 9 логических пере-
менных, пронумерованных от -5 до 3.
Ввод и вывод значений одномерного массива
Существуют стандартные способы ввода и вывода массива.
Чаще всего массив обрабатывается в цикле for. Вводить значения
элементов массива можно двумя способами.
Первый способ:
for i:=1 to n do read(a[i]);
В данном случае значения элементов массива можно вводить в
одну строку через пробел. Если же оператор read(a[i]) заменить на
readln(a[i]), то элементы массива будет необходимо вводить в
столбец.
Второй способ:
for i:=1 to n do
38

begin
write(‘введите a[’, i, ‘]=’);
readln(a[i]);
end;
Такой способ ввода значений элементов массива позволяет
отслеживать, какой именно элемент был введен в данный момент.
Единственный момент, на который необходимо обратить внимание –
не запутаться в количестве апострофов. Заметьте, то, что обособлено
апострофами будет выведено на экран без изменений, а вместо
переменной i будет выведено ее значение (цифра).
На экране это будет выглядеть следующим образом:
введите а[1]=3 ↵
введите а[2]=5 ↵
введите а[3]=1 ↵
введите а[4]=_
Аналогично производится распечатка массива. Но просто
заменить read на write здесь не достаточно. Для того, чтобы
печатаемые значения не сливались между собой, надо явным образом
вставлять между ними разделитель – пробел или перевод строки.
Приведем два возможных способа распечатки массива:
1) Вывод значений элементов массива в одну строку:
for i:=1 to n do write(a[i], ' ');
writeln;
2) Вывод значений элементов массива в столбец:
for i:=1 to n do writeln(a[i], ' ');
На первый взгляд второй способ может показаться более
простым и удобным, но это далеко не всегда так. Результат работы
такой программы зачастую неудобно, а то и просто невозможно
анализировать. Ведь каждый элемент массива будет располагаться в
отдельной строке, следовательно, мы не сможем увидеть более 25
элементов одновременно. Кроме того, очень часто массив требуется
распечатать дважды, чтобы сравнить состояние массива до обработки
и результат его обработки. В этом случае сравнение состояний
массива гораздо удобнее производить, если они распечатаны в двух
39

соседних строках, а элементы выровнены по столбцам, т.е. к варианту
1 способ:
2 способ:
for i:=1 to n do
for i:=1 to n do
end;
const n=2, m=3;
var a: mas;
2 5 6 4 0
3
1 должна быть добавлена еще и форматная печать (указано
количество позиций, которое должно отводиться на печать одного
элемента).
8.2. Двумерные массивы (матрицы)
Описание двумерных массивов можно представить следующим
образом:
type mas= array[1.. n,1..m] of intege r;
Это описание соответствует таблице, состоящей из n=2 строк и
m=3 столбцов. При таком описании обращение к конкретному
элементу, например, к a
(элементу, стоящему во 2-ой строке и 3-м
23
столбце) в Паскале будет выглядеть следующим образом: a[2,3], а его
значение в нашем примере (см.таблицу) будет равно 3 (т.е. a[2,3]=3).
Ввод и вывод элементов массива
Ввод данных двумерного массива аналогичен одномерному
массиву, осуществлять его можно также несколькими способами.
for j:=1 to n do
read(a[i,j]);
writeln;
for j:=1 to n do
begin
write('a[' ,i, ';' ,j, ']=');
readln(a[i,j]);
Обратите внимание на апострофы: данные, находящиеся внутри
них будут напечатаны на экране без изменения, что позволит
отслеживать, какой элемент в данный момент был введен, что очень
важно при заполнении данных матрицы (таблицы).
Распечатать элементы массива в виде таблицы на экране можно так:
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:4);
end;
40
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
