Лекции.ИНФО


Работа с массивами и строками



 

Тип «массив»

Массив – последовательность однотипных элементов, число которых фиксировано и которым присвоено одно имя. Положение элемента в массиве однозначно определяется его индексами (одним, в случае одномерного массива, или несколькими, если массив многомерный). Иногда многомерные массивы называют таблицами или матрицами. Описание:

Var <имя>: Array[<тип1>, <тип2>, …, <типN>] of <базовый тип>;

Здесь <тип1>, <тип2>, …, <типN> – типы индексов, их число определяет размерность массива (один – для одномерного массива, два – для двумерного, и т.д.). Чаще всего здесь используется тип «диапазон». Базовый тип – тип элементов массива. Примеры:

Var A: Array[1..3] of real;{массив из трех вещественных чисел}

B: Array[1..10, 1..10] of integer;{матрица 10´10 из целых чисел}

C: Array[Char] of integer;{массив из 256 целых чисел, значения индекса – символы}

Также массив может быть определен с помощью описания нового типа:

Type Vector = Array[1..3] of real;

Matrix = Array[1..10, 1..10] of integer;

Var A: Vector;

B: Matrix;

Этот способ применяется, если массив нужно передать в подпрограмму в качестве параметра.

Единственная операция над массивом в целом – присваивание, например, A:=B; (при этом массивы A и B должны быть определены одинаково). Все остальные операции над массивами производятся поэлементно, чаще всего в циклах. Обращение к элементам массивов производится путем указания в квадратных скобках значений индексов: A[1], B[2,3], B[i,j], и т.п. Допустима другая форма: B[2][3].

Тип «строка»

Строковый тип расширяет понятие символьного массива (Array[…] of char), предоставляя новые возможности. Описание:

Var <имя>: String[<макс. длина>];

Если максимальная длина не указана явно, то по умолчанию берется значение 255. Примеры:

Var S: String[80];

mess: string;

При создании в программе строки с максимальной длиной N символов под нее отводится N+1 байт памяти. Элементы с номерами от 1 до N предназначены для хранения символов, а элемент с номером 0 – для хранения динамической (т.е. текущей) длины строки. Определить текущую длину строки S можно с помощью функцийLength(S) илиOrd(S[0]).

Строковые константы, как и символьные, заключаются в апострофы:

S:='Пример строки';

Если при присваивании максимальная длина строковой переменной оказывается меньше длины строковой константы, то лишние символы отбрасываются.

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

а) конкатенация (т.е. слияние строк): две строки соединяются в одну:

S:='Пример ' + 'строки';

б) сравнение по правилам:

– более короткая строка меньше, чем более длинная;

– если длины строк равны, то попарно сравниваются коды первых символов, если они равны, то вторых, и т.д.

Доступ к отдельным символам строки производится так же, как и к элементам массивов: S[3]:='а';

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

 

Практические задания

 

1. Изучить и запустить программу, осуществляющую ввод массива с клавиатуры, сортировку его по убыванию и вывод на экран. С ее помощью составить программу, выполняющую следующие действия над вещественным одномерным массивом А(n):

а) поиск и вывод на экран минимального и максимального элементов с указанием номера;

б) перестановку элементов массива (1-го с последним, 2-го с предпоследним, и т.д.);

в) сортировку элементов массива по возрастанию методом пузырька;

г) замену каждого из элементов массива aij на разность
aijacp, где acp – среднее арифметическое элементов массива.

 

var A: array[1..100] of real;

i,j,n: integer;

z: real;

Begin

{Ввод массива А(n)}

write(¢Введите длину массива (n<100):¢);

readln(n);

writeln(¢Введите элементы массива:¢);

for i:=1 to n do

Begin

write(¢A[¢, i, ¢]=¢);

readln(A[i])

end;

{Вывод массива в одну строку}

writeln(¢Массив А:¢);

for i:=1 to n do write(A[i]:6:3, ¢ ¢);

writeln;

{Сортировка}

for i:=1 to n-1 do

for j:=i+1 to n do

if A[i]<A[j] then

Begin

z:=A[i]; A[i]:=A[j]; A[j]:=z

end;

{Вывод отсортированного массива}

writeln(¢Отсортированный массив:¢);

for i:=1 to n do write(A[i]:6:3, ¢ ¢);

writeln;

Readln

End.

 

2. Изучить и запустить программу, осуществляющую ввод матрицы А с клавиатуры, перестановку указанных строк и вывод матрицы на экран в виде таблицы. С ее помощью составить программу, выполняющую следующие действия над вещественным двумерным массивом А(m´n), mn:

а) поиск и вывод на экран минимального и максимального элементов матрицы с указанием их позиции;

б) подсчет количества положительных и отрицательных элементов матрицы А;

в) транспонирование матрицы А;

г) вычисление и печать результатов перемножения матриц А и АТ: B=ААТ, С=АТА.

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

 

var A: array [1..10,1..10] of real;

i,j,n,m,m1,m2: integer;

z: real;

Begin

{Ввод матрицы А}

write(¢Введите число строк (m<10):¢);

readln(m);

write(¢Введите число столбцов (n<10):¢);

readln(n);

for i:=1 to m do

for j:=1 to n do

Begin

write(¢A[¢, i, ¢,¢, j, ¢]=¢);

readln[a[i,j]]

end;

{Вывод матрицы в виде таблицы}

writeln(¢Исходная матрица:¢);

for i:=1 to m do

Begin

for j:=1 to n do write(a[i,j], ¢ ¢);

Writeln

end;

{Ввод номеров переставляемых строк}

write(¢Введите номера переставляемых строк: ¢);

readln(m1,m2);

if (m1>m) or (m2>m) or (m1=m2) then

Begin

writeln(¢Неверные номера строк¢);

Exit

end;

{Перестановка}

for j:=1 to n do

Begin

z:=a[m1,j]; a[m1,j]:=a[m2,j]; a[m2,j]:=z

end;

{Вывод матрицы в виде таблицы}

writeln(¢Матрица после перестановка:¢);

for i:=1 to m do

Begin

for j:=1 to n do write(a[i,j], ¢ ¢);

Writeln

end;

Readln

End.

3. Изучить и запустить программу, подсчитывающую, сколько раз встречается каждый символ в задаваемой с клавиатуры строке.

 

Var s: string;

i: integer;

Num: array [char] of byte;

c: char;

Begin

writeln('Введите строку:'); readln(s);

for c:=chr(0) to chr(255) do Num[c]:=0;

for i:=1 to length(s) do

Num[s[i]]:=Num[s[i]]+1;

for c:=chr(0) to chr(255) do

if Num[c]>0 then

writeln('Символов ''',c,''' - ',Num[c], ' шт');

Readln

End.

Задания для самостоятельной работы

 

1. Составить программу, которая в массиве А(15) подсчитывает число отрицательных и число неотрицательных элементов и формирует из них два массива, в один из которых войдут неотрицательные, а в другой – отрицательные элементы.

 

2. Составить программу, осуществляющую ввод с клавиатуры вещественных матриц А(3´3) и В(3´3) и выполняющую следующие действия:

а) сложение матриц: С=А+В;

б) перемножение матриц: С=АВ;

в) вычисление скалярного произведения указанной строки матрицы А и того же столбца матрицы B.

3. Составить программу, которая во введенной с клавиатуры строке удаляет лишние пробелы между словами, оставляя один.

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

Лабораторная работа №5

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

 

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

 

Процедуры

Структура подпрограммы, в том числе процедуры, в целом идентична структуре основной программы – заголовок, разделы описаний и раздел операторов, только в отличие от основной программы заголовок здесь не может отсутствовать:

Procedure <имя>(<список формальных параметров>);

<разделы описаний>

Begin

<операторы>

End

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

Procedure Print_max(x,y: real);

Begin

if x>y then writeln(x:9:6)

Else writeln(y:9:6)

End

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

Print_max(a, b);

или

Print_max(a+b, 2*c);

Между формальными и фактическими параметрами должно быть строгое соответствие по количеству, типу и порядку следования.

Чтобы передать в подпрограмму в качестве параметра массив, строку или другую переменную составного типа, этот тип данных должен быть описан в разделе Type с присвоением нового имени. Например, процедура печати первых N элементов массива:

Type mass = array[1..100] of real;

Var a: mass;

n: integer;

Procedure print_mass(z: mass; n: integer);

var i: integer;

Begin

for i:=1 to n do write(z[i]:6:2,’ ’);

Writeln

End

 

Функции

Описание функции похоже на описание процедуры – заголовок, разделы описаний, раздел операторов. Отличие заключается в том, что функция имеет результат, тип которого указывается после круглых скобок (его имя совпадает с именем функции):

Function <имя>(<форм. параметры>): <тип результата>;

<разделы описаний>

Begin

<операторы>

End

Чтобы результат функции был вычислен, внутри нее должен быть хотя бы один оператор присваивания, в котором имя функции стоит слева. Например, функция вычисления длины вектора имеет вид:

Type vector = array[1..3] of real;

Function Len(z: vector): real;

Begin

Len:=sqrt(z[1]*z[1]+ z[2]*z[2]+z[2]*z[2])

end;

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

L:=Len(a);

x:=(1+sin(t))/2;

writeln(’sin y = ’, sin(y));

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

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

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

Параметры-переменные позволяют передавать данные в обоих направлениях – и из основной программы в подпрограмму, и обратно. Поэтому с их помощью можно возвращать в основную программу результаты, полученные в подпрограмме. Это возможно потому, что в подпрограмму передается не значение фактического параметра, а ссылка на него, т.е. его адрес в памяти. Поэтому все изменения формального параметра в подпрограмме – это на самом деле изменения фактического параметра, так как в этом случае оба параметра суть одно и то же. Такой способ передачи параметров называется передачей по ссылке. В этом случае в качестве фактических параметров можно использовать только переменные (в том числе элементы массивов, поля записей и т.п.), а выражения и константы использовать нельзя. При описании подпрограммы в списка формальных параметров перед параметрами-переменными ставится слово Var. Например, заголовок процедуры, возвращающей минимальное и максимальное значения из элементов массива длиной N:

Type mass = array[1..100] of real;

Var a: mass;

Procedure MinMax(z: mass; n: integer; var min, max: real);

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

Если формальный параметр является нетипизированным параметром-переменной, то соответствующий ему фактический параметр может представлять собой любую ссылку на переменную, независимо от ее типа. Описание таких параметров выглядит как группа параметров с ключевым словом Var впереди, за которыми не следует указание типа, например:

Function Fun(var First, Second): Boolean;

Если некая переменная объявлена в разделе Var основной программы, то ее называют глобальной переменной. Она существует от места описания до конца программы (эту область называют областью видимости данной переменной). Таким образом, она видна и может быть использована и во всех подпрограммах этой программы.

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

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

Встретив в тексте подпрограммы какой-либо идентификатор, компилятор начинает искать его описание сначала в разделе Var этой подпрограммы, затем в списке формальных параметров, и если не находит, то продолжает поиск во внешнем по отношению к этой подпрограмме блоке, пока не доберется до раздела Var основной программы. Таким образом, если имя некоторой глобальной переменной совпадет с именем локальной переменной подпрограммы, то в этой подпрограмме можно будет обращаться только к локальной переменной, а глобальная будет недоступна. Говорят, что в этих случаях локальное имя закрывает (маскирует) глобальное.

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

Практические задания

 

1. Изучить и запустить программу вычисления площади треугольника, заданного тремя сторонами a, b, c, по формуле Герона, в которой проверка существования треугольника и вычисление площади реализованы в виде функций.

 

Program Geron;

var a,b,c,s: real;

function exist(x,y,z: real): boolean;

Begin

if (x<=0) or (y<=0) or (z<=0) or

(x+y<z) or (x+z<y) or (y+z<x) then

exist:=false

else exist:=true;

end;

function square(x,y,z: real): real;

var p: real;

Begin

p:=(x+y+z)/2;

square:=sqrt(p*(p-x)*(p-y)*(p-z))

end;

Begin

writeln(’Введите длины сторон a,b,c:’);

readln(a,b,c);

if exist(a,b,c) then

Begin

s:=square(a,b,c);

writeln(’Площадь S=’,s:9:6)

End

else writeln(’Треугольник не существует’);

Readln

End.

 

2. Изучить и запустить программу вычисления длины вектора, заданного в виде массива из 3 чисел, в которой вычисление длины вектора реализовано в виде функции. С ее помощью составить программу обработки векторов, заданных в виде массива из 3 чисел, выполняющую следующие действия: а) вычисление скалярного произведения двух векторов; б) вычисление угла между двумя векторами; в) вычисление векторного произведения двух векторов.

Указание. Функцию arcсos(t) вычислять как .

Program Vectors;

type vect=array[1..3] of real;

var a,b: vect;

z: real;

function len(x:vect):real;

Begin

len:=sqrt(x[1]*x[1]+x[2]*x[2]+x[3]*x[3])

end;

Begin

writeln(’Введите компоненты вектора’);

readln(a[1],a[2],a[3]);

z:=len(a);

writeln(’Длина вектора а: ’,z:6:2);

Readln

End.

 

3. Изучить и запустить программу, осуществляющую ввод квадратных матриц А и В и вывод их суммы С=А+В (ввод, вывод и сложение матриц реализованы в виде процедур). С ее помощью составить программу обработки матриц, выполняющую следующие действия (реализовать в виде процедур):

а) транспонирование матрицы A;

б) вычисление произведения двух матриц С=АВ;

в) вычисление следа матрицы (т.е. суммы элементов главной диагонали);

г) поиск максимального и минимального из элементов матрицы и их позиции;

д) поменять местами элементы матрицы А симметричным образом относительно главной (или побочной) диагонали.

 

Program Matrix;

type matr=array[1..10,1..10] of real;

var a,b,c: matr;

n: integer;

procedure inp(var x:matr; n:integer; t:char);

var i,j:integer;

Begin

for i:=1 to n do

for j:=1 to n do

Begin

write(t,’[’, i, ’,’, j, ’]=’);

readln(x[i,j])

End

end;

procedure outp(x:matr; n:integer);

var i,j:integer;

Begin

for i:=1 to n do

Begin

for j:=1 to n do write(’ ’,x[i,j]:6:2);

Writeln

End

end;

 

procedure sum(x,y:matr; n:integer; var s:matr);

var i,j:integer;

Begin

for i:=1 to n do

for j:=1 to n do s[i,j]:=x[i,j]+y[i,j]

end;

Begin

writeln(’Введите размерность матриц n: ’);

readln(n);

writeln(’Введите матрицу А’);

inp(a,n,’A’);

writeln(’Матрица А:’);

outp(a,n);

writeln(’Введите матрицу B:’);

inp(b,n,’B’);

writeln(’Матрица B: ’);

outp(b,n);

sum(a,b,n,c);

writeln(’Матрица C=A+B:’);

outp(c,n);

Readln

End.

 

Задания для самостоятельной работы

 

1. Используя функцию, составить программу решения квадратного уравнения ax2+bx+c=0.

2. Составить программу решения системы трех линейных уравнений с тремя неизвестными методом Крамера. Вычисление определителя 3-го порядка оформить в виде функции.

3. Треугольник задан координатами вершин на плоскости. Используя функции, составить программу вычисления длин сторон треугольника, углов между сторонами и определения самой длинной из сторон.

4. Используя процедуры, составить программу обработки одномерного целочисленного массива, которая: а) находит количество четных и нечетных элементов; б) формирует из одного исходного массива два, из четных и нечетных элементов соответственно; в) удаляет из массива идущие подряд одинаковые элементы, оставляя один.

5. Используя процедуры, составить программу обработки строк, которая: а) печатает самое длинное слово в строке; б) находит и печатает все слова заданной длины; в) заменяет в заданной строке все прописные буквы на строчные.

Лабораторная работа №6









Последнее изменение этой страницы: 2017-03-17; Просмотров: 23;


lektsia.info 2017 год. Все права принадлежат их авторам! Главная