Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Решение задач на ЭВМ. Программирование на языке Pascal. Учебное пособие
.pdf
for i:=1 to 10 do
for j:=1 to 10 do begin
a [I, j ] := random (30);
write ( `a ( ` , I, `,`, j, ` ) =` , a [I, j ])
end
end.
Типовые задачи на матрицы
нахождение экстремумов;
суммирование значений элементов матрицы
нахождение количества значений элементов матрицы;
формирование нового одномерного массива из значений
элементов матрицы и т.п.
Двумерный массив хорошо иллюстрирует различие между физическим и логическим представлением данных. Он представляет
собой логическую структуру данных, которая удобна для программирования и решения задач. Двумерный массив может оказаться
полезным при описании объекта, который является двумерным физически, например, шахматная доска или карта. Его используют и
при организации набора значений или при вычислениях, зависящих от двух параметров, например, вычислении значений двойных
сумм.
Паскаль допускает работу с массивами, размерность которых
больше двух. Трехмерный действительный массив может быть
объявлен следующим образом:
Var A: Array [1..3], 1..4, 1..5] of Real;
Элементы в таком массиве адресуются тремя индексами. Первый индекс задает номер матрицы, второй – номер строки и третий
– номер столбца. Такой массив полезен, если некоторое значение
определяется тремя параметрами. Например, массив температур
может быть проиндексирован по широте, долготе и высоте. При
выходе за третье измерение геометрическая аналогия по очевидным причинам невозможна. Количество измерений формально не
ограничено, но сумма размеров всех компонентов массива не
должна превосходить 64КБ.
81

Как и одномерные, многомерные массивы можно задавать одним из способов ввода данных в программу.
Рассмотрим пример решения задачи с двумерным массивом.
Задана матрица А, размером 44. Получить транспонирован-
ную матрицу А
Т
, т.е. поменять местами строки и столбцы (i-й столбец становится i-й строкой).
Текст программы:
program Tr;
var i, j:integer;
a, t:array[1..4,1..4] of integer; {описание массивов а и t}
begin
for i:=1 to 4 do
for j:=1 to 4 do
begin
writeln ('введите',i,j,'элемент массива а');
readln (a[i,j]); {ввод элемента массива a}
end;
writeln('заданная матрица ');
for i:=1 to 4 do
begin
for j:=1 to 4 do write(a[i,j]);
writeln; {вывод элементов массива а}
end;
for i:=1 to 4 do
for j:=1 to 4 do t[j,i]:=a[i,j]; {замена сток(столбцов)
массива t столбцами(строками) массива а}
writeln('транспонированная матрица ');
for j:=1 to 4 do
begin
for i:=1 to 4 do write(t[j,i]);
writeln; {вывод элементов массива t}
end;
readln
end.
Схема решения задачи представлена на рисунке 17.
82

Рис. 17 . Схема алгоритма решения задачи
Начало
Ввод a[i,j]
i=1..4, 1
1
3
t[j,i]=a[i,j]
10
j=1..4, 1
2
Вывод a[i,j]
i=1..4, 1
5
7
j=1..4, 1
6
Заданная
матрица a[i,j]
4
i=1..4, 1
j=1..4, 1
9
8
1
Транспонир.
матрица t[j,i]
11
Конец
Вывод t[j,i]
j=1..4, 1
i=1..4, 1
83

Контрольные вопросы для самоконтроля при изучении
1. Дайте понятие массива.
2. Как описывается тип – массив?
3. Как осуществляется доступ к элементу массива?
4. Какому типу принадлежат индексы массива, а какому его
элементы?
5. Как задаются одномерные и двумерные массивы?
6. Какие операции можно производить над элементами масси-
ва?
7. Какие операторы языка Паскаль можно использовать для
ввода, вывода и обработки массивов?
8. Каковы особенности организации цикла при обработке мас-
сивов?
9. Каковы особенности программирования при обработке мас-
сивов?
10. Каковы особенности ввода и вывода массивов?
11. Представление строковых переменных типа String, как од-
номерных массивов.
84

4.9. Строки, множества, записи
Строковый тип – полезное и часто используемое расширение языка Паскаль. В распоряжение программиста Паскаль предоставляет ряд функций и процедур обработки строк.
Переменная типа String состоит из цепочки символов, т.е.
элементов типа Char.
Описание строковых переменных
<имя переменной>: string [ <количество символов>];
где:
<имя переменной> - идентификатор переменной
string – тип переменной (строковый)
<количество символов> - количество символов в строке,
(если данный компонент отсутствует, то берется по умолчанию 256 символов в строке).
Пример.
Описать строку с именем STROKA, которая состоит из 20
символов.
Var
Stroka: string [20];
При построении алгоритмов обработки строк полезно знать
и использовать следующие возможности:
стандартные процедуры и функции для строк;
упорядоченность множества символов;
механизм динамических строк и их внутреннее представление;
два способа обработки переменных типа String.
Стандартные процедуры и функции для строк приведены в
таблице 4.7.
85

Таблица 4.7.
Функции и
процедуры
Назначение
Length
Возвращает текущую длину строки Z
Concat
Возвращает слияние (конкатенацию) строк Z
1 ,
Z
2…, Zn
Copy
Возвращает подстроку строки Z длиной Count,
начинающуюся с позиции Index
Pos
Определяет первое вхождение подстроки в строку и возвращает 0, если Z не содержит Substr или
номер первого символа Substr в Z
Insert
Вставляет в строку Z подстроку Source, начиная с
позиции Index
Delete
Удаляет из строки Z подстроку длиной Count,
начинающуюся с позиции Index
Str
Преобразует числовое значение N в строковое Z.
Возможно задание формата для N
Val
Преобразует строковое значение Z (строку цифр)
в значение числовой переменной N
Стандартные процедуры и функции для строк
Length (<имя переменной>) – определяет фактическую длину тек-
стовой строки, хранящейся в указанной переменной, включая все
пробелы (а не величину предельного размера строки, установленную при описании).
Пример.
var
word: string;
begin
writeln (`введите слово - `);
readln (word);
writeln (`это слово состоит из ` , length (word), ` букв `)
end.
86

Copy (par1, par2, par3) - позволяет копировать фрагмент некоторой строки из одной переменной в другую.
par1 – имя строки, из которой должен извлекаться копируемый
фрагмент;
par2 – позиция в строке, начиная с которой будет копироваться
фрагмент;
par3 – число копируемых символов.
Пример.
Var
Word: string [20];
Word1, Word2, Word3: string [20];
Begin
Word:= `форматирование` ;
Writeln (Word);
Word1:=copy (Word, 1, 5);
Writeln (Word1); {форма}
Word2:=copy (Word, 6, 3);
Writeln (Word2); {тир}
Word3:=copy (Word, 8, 3);
Writeln (Word3); {ров}
End.
Pos – поиск определенного фрагмента в строке (возвращает № по-
зиции, с которой этот фрагмент начинается).
Процедуры Insert и Delete – позволяют вставлять фрагмент из од-
ной строки в другую или удалять его из строки.
Insert (stroka 1, strokа, 4) – необходимо в строку strokа перед 4
позицией вставить строку stroka 1.
Delete (stroka 1, 2, 3) – удаляет из строки stroka 1 фрагмент, со-
стоящий из трех символов и начинающийся со второй позиции.
Пример.
Var
Word: string [100];
Word1: string [20];
Begin
Word:= `математика` ;
87

Writeln (Word) ;
Delete (Word, 1, 2);
Writeln (Word) ; {тематика}
Delete (Word, 5, 4);
Writeln (Word) ; {тема}
Word1:= `сис`;
Insert (Word1, Word, 1);
Writeln (Word) ; {система}
End.
Упорядоченность множества символов стандартного
набора ASCII понимается так: все символы пронумерованы, и из
двух символов больше тот, номер которого больше.
При сравнении значений строковых типов действуют следующие правила:
более короткая строка меньше более длинной;
если длины сравниваемых строк равны, то происходит
поэлементное сравнение символов этих строк с учетом
лексикографической упорядоченности значений стандартного типа Char.
При построении условий, располагающихся после if и
while, можно использовать не только знаки = и <>, но также и зна-
ки >, >=, < , <=.
Упорядоченность дает возможность использовать параметр
цикла типа Char. Например, заглавные латинские буквы в алфавит-
ном порядке выведет цикл
for ch: = ` A` to ` Z` do write (ch), а вложенные циклы
for ch1: = ` A` to ` Z` do
begin
for ch2: = ` A` to ch1 do write (ch2); writeln
end;
выведут на дисплей столбец последовательностей различной длины
A AB ABC … ABCD..WXYZ.
Наряду с символами, собственно представляющими содержание строки, в строке хранится её показатель длины. Так как каждый символ занимает байт и для хранения длины строки (макси-
мальная длина строки равна 255 символов) тоже требуется байт, то
88

реальная длина области памяти в байтах, выделяемая для перемен-
0 1 2 3 … i i+1 … n-1
n
Chr(i)
Занятая часть строки
Свободная часть строки
ной типа String, всегда на единицу больше декларируемой. Важно
то, что само поле, хранящее показатель длины строки, доступно
для изменения, т.е. возможны присваивания z[0]:= Chr(65), в пра-
вой части которых величина типа Byte со значением от 0 до 255,
преобразуемая к типу Char. Такое преобразование необходимо, так
как каждый элемент строки, включая и показатель длины, должен
представляться как символ.
Внутреннее представление строки можно пояснить рисун-
ком и программой, которая иллюстрирует «прямой доступ» к байту
длину и выводит на дисплей те же последовательности символов,
что и вложенные циклы выше:
Const z: String[26] = `ABCDEFGHIJKLMNOPQRSTUVWXYZ`;
Var i: 1..26;
Begin
for i:=1 to 26 do
begin
z[0] := Chr (i) ; {изменение байта длины строки}
Writeln (z) {вывод подстроки }
end
End.
Объявляется длинная строка, а затем по мере надобности
меняется ее показатель длины и берется начальный фрагмент строки необходимой длины.
В Паскале доступны два способа обработки переменных
типа String. Первый способ предполагает обработку всей строки
как единого целого. Второй способ рассматривает строку как составной объект, состоящий из отдельных символов, т.е. элементов
типа Char, доступных при обработке каждый в отдельности. Первый способ предоставляет возможность присваивания строковой
89

(символьной, литерной) переменной сразу за одну операцию зна-
Функция
Назначение функции
Chr (x)
Возвращает символ, соответствующий числу X по
ASCII - коду
Ord (x)
Возвращает число, соответствующее символу X в
ASCII - таблице
Upcase
(x)
Преобразует символы из строчных букв в пропис-
ные
(русские литеры не обрабатываются)
Pred (x)
Возвращает символ, который предшествует числу X
в ASCII - таблице
Succ (x)
Возвращает символ, который следует за символом
X в ASCII - таблице
чения целой строки символов или выполнять слияние (объединение) нескольких строк. Второй способ обеспечивает доступ к отдельным символам строки по номеру позиции для их чтения и записи аналогично доступу к элементам одномерного массива. Для
доступа к отдельному символу в строке необходимо указать имя
строки и в квадратных скобках номер позиции этого символа в
строке.
Пример.
Stroka [5] – пятый символ в переменной Stroka.
Однако определенную аналогию строковых типов с сим-
вольными массивами нельзя понимать, как полную их идентичность.
Символьные переменные
Таблица 4.8. Операции над символами
Рассмотрим некоторые типовые задачи на строковые пере-
менные.
1. Дана строка, содержащая 20 символов. Подсчитать сколько раз
буква F встречается в этой строке.
Program zadacha;
{подсчет количества повторений буквы F в слове}
Var
s : string [20];
90
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
