Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Решение задач на ЭВМ. Программирование на языке Pascal. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]