Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Работа с массивами и строками
Тип «массив» Массив – последовательность однотипных элементов, число которых фиксировано и которым присвоено одно имя. Положение элемента в массиве однозначно определяется его индексами (одним, в случае одномерного массива, или несколькими, если массив многомерный). Иногда многомерные массивы называют таблицами или матрицами. Описание: 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 на разность
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), m≠ n: а) поиск и вывод на экран минимального и максимального элементов матрицы с указанием их позиции; б) подсчет количества положительных и отрицательных элементов матрицы А; в) транспонирование матрицы А; г) вычисление и печать результатов перемножения матриц А и АТ: 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; Просмотров: 738; Нарушение авторского права страницы