Еще один способ получения многомерных массивов 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Еще один способ получения многомерных массивов



 

В Паскале нет ограничений на базовый тип массива. Базовым типом одномерного массива может быть, в частности, одномерный массив. Например,

const MaxLen = 100;

type t_xyz = (x,y,z);

t_point = array[t_xyz] of real;{тип для координат точки или вектора}

t_points = array [1..MaxLen] of t_point; {тип для координат 100 точек}

var p: t_points;

С переменной р можно работать как с двумерным массивом. p[i] - одномерный массив координат i-й точки, содержащий 3 элемента: p[i][х], p[i][y], p[i][z] (i - целое от 1 до 100). Индексы в ТР можно записывать не в отдельных скобках, а перечислить через запятую: p[i, х], p[i, y], p[i, z].

Использование многомерного массива, описанного как массив массивов меньшей размерности, удобно, если предполагается обрабатывать массивы меньшей размерности как единые целые. Например, в массиве точек p обмен i -й и j -й точек выполняет фрагмент программы

t:= p[i]; p[i]:= p[j]; p[j]:= t; (t - переменная типа t_point).

var p: array[1..MaxLen, t_xyz] of real;
При описании аналогичный фрагмент имеет вид:

t:= p[i, х]; p[i, х]:= p[j, х]; p[j, х]:= t;

t:= p[i, y]; p[i, y]:= p[j, y]; p[j, y]:= t;

t:= p[i, z]; p[i, z]:= p[j, z]; p[j, z]:= t;

 

Строковый тип в стандартном Паскале

Строкой называется последовательность символов. В стандартном Паскале нет специального типа для работы со строками переменной длины. Для работы со строками можно использовать упакованные символьные массивы с типом индекса 1..n, где n - константа. Например,

var s1: packed array [1..10] of char; {В ТР packed не обязательно}

s2: packed array [1..10] of char;

Использование упакованных символьных массивов дает некоторые преимущества по сравнению с обычными одномерными массивами:

1. Для совместимости по присваиванию не требуется тождественность типов, достаточно равенства размеров массивов.

2. Строковой переменной можно присвоить строковую константу такой же длины.

3. Определены операции сравнения строк одинаковой длины.

Из двух строк равной длины та больше, у которой первый из неравных символов больше.

Таким образом, для переменных s1 и s2 допустимы присваивания

s1:= ‘студент ‘; s2:=s1; s2[8]:=’ы’;

В первом операторе строковая константа дополнена тремя пробелами до длины 10. После выполнения этих операторов s2=‘студенты ‘ (два последних символа - пробелы), и выражение s1<s2 имеет значение true, так как первый из неравных символов строки s1 (пробел) меньше соответствующего символа (‘ы’) строки s2.

 

Строковый тип в ТР

В ТР есть специальный тип для работы со строками переменной длины. Описание этого типа:

 
 

 

 


Целое определяет максимальную длину строки. Оно должно принадлежать промежутку [1; 255]. Например,

 
 
const n=10; var s: string[n];

 

 


Переменной s, согласно описанию, выделяется n +1 байт. Переменную s можно рассматривать, как символьный массив с типом индекса 0..n и использовать для работы со строками длиной не более n. Собственно строка начинается с символа s[1]. Нулевой элемент массива резервируется для хранения информации о динамической длине строки. В нем хранится символ с кодом, равным динамической длине строки. Если s[0] есть символ с кодом 0 (#0), то строка s не содержит символов. Будем называть такую строку пустой. Динамическая длина определяется выражением ord(s[0]). Кроме этого, динамическую длину строки возвращает стандартная функция length(s:string): byte.

Тип string (без указания размера) эквивалентен типу string[ 255]. Длина строки при этом может изменяться от 0 до 255.

Ввод и вывод строк осуществляется с помощью процедур read[ln] и write[ln]. Следует обратить внимание на то, что при вводе в строку заносятся последовательно все символы из буфера ввода до символа перехода к новой строке. Сам символ перехода к новой строке остается в буфере, и с него начнется следующее считывание. Поэтому одним оператором read несколько строковых переменных ввести нельзя. При выполнении оператора read(s1, s2) строка s2 всегда будет пустой. Последовательный ввод строк можно выполнить, обращаясь к процедуре readln с одним параметром:

readln(s1); readln(s2); readln(s3);

Строковый тип ТР совместим по присваиванию:

1) с любым типом string;

2) c упакованным символьным массивом (равенство длин не требуется);

3) с символьным типом.

s:=’’;
Если строковой переменной присваивается значение, превышающее длину строковой переменной, то перед присваиванием происходит усечение присваиваемого значения.

Оператор инициализации строки s пустой строкой:. В правой части оператора присваивания два апострофа.

В ТP определена бинарная операция конкатенация (соединение строк). Знак этой операции '+'. Операндами могут быть символы, упакованные символьные массивы и строки. Результатом является строка, полученная дописыванием в конец первого операнда второго операнда.

Пример 1. var ch: char; ch_arr: array[1..3] of char; s1: string; s2: string[8]; begin ch:= ‘W’; ch_arr:= ‘ord’; s1:= ‘_and_byte’; s2:= ch+ch_arr+s1; writeln(ch+ch_arr+s1); writeln(s2) end.  

 

В результате выполнения программы примера 1 будет выведено

 
 
Word_and_byte Word_and  

 


Первая строка вывода - результат конкатенации, вторая - значение s2, которое получено в результате конкатенации с последующим усечением до 8 символов.

Над строковым типом определены все операции сравнения, причем если один из операндов имеет строковый тип, то другой может быть строковым, символьным или упакованным символьным массивом. Примеры истинных отношений: ‘abcwt’< ’abd’, ‘abc’ > ’ab’.

Пример 2. Словом будем называть последовательность символов, не содержащую пустых символов. К пустым символам отнесем пробел (#32), символ табуляции (#9) и переход к новой строке (#10). Можно считать, что слово не содержит не только пустых, но и любых управляющих символов, то есть символов, меньших #33. Опишем программу для определения количества слов в данной строке:

Program words_number;

var str: string;

k, i: byte; {k - счетчик числа слов, i - параметр цикла}

begin

writeln('Введите строку'); ReadLn(str);

{инициализация счетчика}

if str[1]>#32 then k:=1 {первый символ - начало слова}

else k:=0; {строка начинается пустым символом}

for i:=2 to length(str) do

if (str[i-1]<#33) and (str[i]>#32) {если начало слова }

then k:=k+1;

writeln ('Число слов строки ',str,' равно ',k);

end.

Если, работая со строкой, как с символьным массивом, приходится изменять длину строки, необходимо позаботиться об изменении значения нулевого байта.

Пример 3. Программа удаления из строки символов, равных данному:

Program symb_del;

var str: string;

ch: char;

len, i, j: byte;

begin

writeln('Введите строку'); ReadLn(str);

writeln('Введите символ'); ReadLn(ch);

len:= length(str); {Запоминаем длину исходной строки}

j:= 0; {j - число сохраненных символов в преобразованной строке}

for i:=1 to len do {Просматриваем все символы строки}

if str[i]<>ch {Символ остается в строке}

then

begin j:= j+1; {Увеличиваем число сохраненных символов}

str[j]:= str[i] {Сохраняем символ}

end;

str[0]:= chr(j); {Устанавливаем новую длину строки}

write (‘ Преобразованная строка: ', str);

end.

 

20. ПОДПРОГРАММЫ

 

Один из принципов структурного программирования заключается в разбиении задачи на достаточно самостоятельные подзадачи. Для решения каждой подзадачи можно разработать свой алгоритм и записать его в виде самостоятельного программного блока, называемого подпрограммой. Подпрограммы имеют имена, и обращаться к ним можно по именам.

Подпрограммы позволяют избегать многократной записи одной и той же последовательности действий. В языке Паскаль существует два вида подпрограмм: процедуры и функции.

Программа, содержащая подпрограммы, проще для создания, легче для понимания, удобнее для использования.

При разработке программ, содержащих подпрограммы, необходимо уметь описывать подпрограммы и обращаться к ним.

Подпрограммы, как и другие программные объекты, должны быть описаны в разделе описаний. Структура описания подпрограммы такая же, как и структура программы, но в описании подпрограммы заголовок обязателен и описание подпрограммы заканчивается символом ‘; ’, а не точкой.

 

Область действия описаний

Область действия описания программного объекта - часть программы, где можно обращаться к этому программному объекту. Область действия описания распространяется от точки описания до конца блока, в котором выполнено это описание.

Программные объекты, описанные в блоке, содержащем подпрограмму до ее описания, доступны подпрограмме и являются по отношению к ней глобальными. Программные объекты, описанные в теле подпрограммы, называются локальными. Имена локальных программных объектов могут совпадать с именами глобальных, такие программные объекты в подпрограмме имеют смысл, соответствующий локальному описанию.

Параметры подпрограмм

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

Передаваемые подпрограмме параметры описываются в списке формальных параметров заголовка подпрограммы, который имеет вид

 
 

 

 


В стандартном Паскале существует 2 вида формальных параметров: параметры-значения и параметры-переменные. В ТР, кроме этого, есть нетипизованные параметры-переменные и параметры-константы.

Описание секции параметров-значений:

 
 

 

 


Описание секции параметров-переменных:

 
 

 


Описание секции нетипизованных параметров-переменных:

 
 

 


Описание секции параметров-констант:

 
 

 

 

 


Следует обратить внимание на то, что при описании формальных параметров указывается имя типа. В последних версиях ТР, кроме имени типа, можно использовать конструкцию вида

 
 

 

 


Формальные параметры такого типа называются открытыми массивами

Описание типа здесь недопустимо. Если предполагается передавать параметры нестандартных типов, необходимо предварительно дать типам имена.

Параметры могут передаваться подпрограмме для чтения, записи или чтения и изменения. В список формальных параметров включаются параметры, через которые подпрограмме будут переданы исходные данные (это параметры для чтения), и параметры, в которые будут записаны результаты (это параметры для записи). Иногда подпрограмма должна использовать значение, передаваемое ей через параметр, а затем в этот же параметр записать результат (это параметр для чтения и изменения). В Паскале параметры любого вида доступны подпрограмме для чтения. Для записи доступны параметры-переменные (в том числе и нетипизованные). Как бы мы ни изменяли параметр-значение в теле подпрограммы, после выхода из подпрограммы он будет иметь первоначальное значение. Поэтому параметры-значения после использования переданной через них информации можно использовать как локальные переменные. Значения параметров-констант изменять нельзя. Значения, присвоенные параметрам-переменным в подпрограмме, сохраняются после выхода из подпрограммы.

 

Процедуры

Процедура - это подпрограмма, предназначенная для решения подзадачи, необязательно связанной с вычислением значений. Процедуры можно использовать для ввода или вывода данных структурированных типов, вычисления нескольких значений, преобразования данных и т.п.

Заголовок процедуры:

 

 


Идентификатор после ключевого слова procedure - имя процедуры.

Пример 1. Описание процедуры для решения квадратного уравнения :

Рrocedure sqr_equation(a,b,c: real; var x1,x2: real; var flag:boolean);

{a, b, c - исходные данные (коэффициенты квадратного уравнения), параметры-значения; flag - параметр для записи: true - есть корни, false - нет корней; x1 и x2 - параметры-переменные для записи корней}

var d:real; { дискриминант}

begin

d:= b*b-4*a*c;

flag:= d>=0

if d>0 then

begin

d:= sqrt(d);

x1:= (-b+d)/(2*a); x2:= (-b-d)/(2*a)

end

else if abs(d)<1E-10 then

begin

x1:= -b/(2*a); x2:= x1

end

end; {Конец описания процедуры.}

 



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 125; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.139.86.56 (0.046 с.)