Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


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



 

Тип «массив»

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

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; Просмотров: 692; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.121 с.)
Главная | Случайная страница | Обратная связь