лабораторные работы паскаль. Практикум по программированию на языке Паскаль Учебное пособие
Скачать 0.89 Mb.
|
Тема: "Структурные циклические процессы" Цель работы Овладение практическими навыками работы с векторами и матрицами при программировании. Краткие сведения из теории При организации структурных циклов в вычислительном процессе обязательным элементом являются массивы данных. 7.1. Регулярные типы данных или массивы Массив - это упорядоченная последовательность данных, обозначаемая одним именем (идентификатором). Члены этой последовательности называются элементами массива. Каждый элемент определяется именем массива и его положением в массиве. Положение элемента в массиве определяется его индексом (порядковым номером). Упорядоченность последовательности данных заключается в том, что элементы массива располагаются в последовательных ячейках памяти. Массивы бывают одномерные, двумерные, трехмерные, четырехмерные и т.д. Понятие массива соответствует таким математическим понятиям как вектор и матрица. Одномерный массив соответствует понятию вектора; двумерные, трехмерные и т.д. массивы соответствуют понятию матрицы. Размерность ("мерность") массива определяет количество индексов отдельного элемента. На языке Паскаль массивы описываются в разделе переменных следующим образом: VAR A : array[1..k] of < тип элементов массива > ; - описание одномерного массива (вектора) А. Переменная k задает количество элементов в массиве, при этом значение индекса элементов лежит в интервале от 1 до k и может принимать только целые значения. Все элементы массива имеют один и тот же тип. При этом тип элементов массива может быть как базовым, так и сложным (типом, обьявленным в разделе TYPE). B : array[1..k1, 1..k2] of < тип элементов массива >; - описание двумерного массива (двумерной матрицы). Здесь k1 задает количество строк и диапазон изменения индекса строк, k2 - количество столбцов и диапазон изменения индекса столбцов. С : array[1..k1, 1..k2, 1..k3] of < тип элементов массива> ; - описание трехмерного массива (трехмерной матрицы). Здесь k1 задает количество строк и диапазон изменения индекса строк, k2 - количество столбцов и диапазон изменения индекса столбцов, k3 - количество слоев и диапазон изменения индекса слоев. Подобным образом описываются массивы и более высокой размерности. Ограничений на максимальное значение размерности не существует. Но программист должен помнить, что обьем массива в байтах не должен превышать 64К в оперативной памяти. Упорядочение элементов многомерных массивов выполняется от внутреннего индекса к внешнему, так, например, элементы двумерной матрицы упорядочены сначала по строкам, а затем по столбцам. Обращение к отдельным элементам массива осуществляется по имени массива и последовательности его индексов, заключенных в квадратные скобки и разделенных запятой. Например : A[1], A[n], A[2*k+1] - обращение к элементам вектора. Индекс может быть задан константой, переменной и арифметическим выражением, причем, индекс должен быть целого типа; B[1,5], B[i,j], B[2, trunc(sqrt(X))] - обращение к элементам двумерной матрицы. Пример Задана двумерная матрица B размерностью 3х2: 51 b 11 b 12 b 13 b 21 b 22 b 23 Ее описание может быть следующим: VAR B : ARRAY [1..3,1..2] OF INTEGER; Так как тип элементов INTEGER и длина элемента этого типа равна четырем байтам, а количество элементов в массиве 3 * 2 = 6, то обьем оперативной памяти, занимаемый массивов, составляет 24 байта. Элементы двумерного массива В расположены в памяти следующим образом: b 11 , b 12 , b 13 , b 21 , b 22 , b 23 - упорядочение выполнено по строкам, а затем по столбцам. Обращаясь к элементу второй строки третьего столбца, достаточно записать B[2,3]. 7.2. Организация структурных циклических процессов При организации таких процессов в качестве параметра цикла практически всегда удобно использовать индекс массива. При работе с векторами организуются простые циклы. Если размерность массива превышает единицу, то в этом случае организуются вложенные циклы. При программировании структурных циклов удобно использовать оператор цикла с параметром - FOR. Пример Составить программу для вычисления суммы положительных элементов каждой строки матрицы А(10х8). Для решения этой задачи небезразлично, какой цикл будет внешним. Внешний цикл определяет изменение индексов строк, а внутренний - номера элементов по строке, то есть индекс столбцов. Перед внутренним циклом необходимо задать начальное значение суммы SUM = 0. Так как значения индексов строк и столбцов определены, можно воспользоваться оператором цикла FOR. Программа имеет вид: Program Sunstr; Const nm = 10; mm = 8; Var sum : real; n, m, i, j : integer; a : array [1..nm, 1..mm] of real; astr : array [1..nm] of real; Begin { Ввод данных } WriteLn('Введите количество строк и столбцов матрицы:'); Readln(n, m); WriteLn('Введите построчно значения элементов матрицы.'); For i:= 1 to n do begin WriteLn('Строка ', i:2:0, ' :'); For j:= 1 to m do Read(a[i,j]); WriteLn; end; { Выполнение суммирования } For i:= 1 to n do { внешний цикл по индексу строк } Begin { начало тела внешнего цикла } sum:=0; For j:= 1 to m do { внутренний цикл по индексу столбцов} 52 If a[i,j] > 0 then sum:=sum+a[i,j]; { оператор тела внутреннего цикла} astr[i]:=sum { вычисление текущего элемента вектора } End; { конец тела внешнего цикла } { Вывод результата } WriteLn('Вектор положительных элементов строк матрицы:'); For i:=1 to n do Write ('astr[',i:2:0,'] = ',astr[i]); End. 7.3. Приемы программирования с использованием операторов цикла В практике программирования имеется банк типовых алгоритмов. Рассмотрим их реализацию на следующих примерах: 1. Организация циклов с несколькими одновременно меняющимися параметрами. Пример Составить программу для вычисления функции Z = (X + Y(i)) / (X - Y(i)) , если X изменяется одновременно с Y(i) от начального значения A с шагом h. Значения Y(i) являются элементами массива Y[1..20]. Программа имеет вид: Program Func; Const N = 20; Var X, h, A, Z : real; I : integer; T : array[1..N] of real; Begin { инициализация } WriteLn('Введите величину шага и начальное значение переменной Х:'); Read (h, A); X := A; { цикл } For i := 1 to N do begin Read(Y[i]); Z := (X + Y[i]) / (X - Y[i]); Writeln(' Z = ', Z); X := X + H end End. 2. Табулирование функции. Пример Составить программу для вычисления и запоминания функции Z x i = + ( ) / 1 , где X - элемент вектора X[1..50]. Для вычисления и вывода результатов удобно использовать оператор цикла FOR. Программа имеет вид: Program Tab; Const nn = 50; Var n, i : integer; 53 X, Z : array[1..nn] of real; Begin { инициализация } Write('Введите количество элементов в векторе: '); ReadLn(n); { цикл } For i := 1 to n do begin Read(X[i]); Z[i] := Sqrt((X[i] + 1) / i) end; WriteLn; For i := 1 to n do Write(Z[i]:10:3) End. 3. Формирование нового массива по заданному условию (проекция). Пример Переписать элементы целочисленного массива М[1..40], кратные пяти, подряд в массив М5. Если такие элементы отсутствуют, то выдать диагностическое сообщение об этом. Программа имеет вид: Program Project; Сonst nn=40; Var k, i, n : integer; M, M5 : array [1..nn] of integer; Begin { инициализация } Write('Введите количество элементов в векторе: '); ReadLn(n); k := 0; { цикл } For i := 1 to n do begin Read (M[i]); If M[i] div 5*5 = M[i] then begin k := k + 1; M5[i] := M[i] end end; If k = 0 then writeln('Элементов, кратных 5, нет.') else begin WriteLn('Элементы нового массива:'); For i := 1 to k do Write (M5[i]:8); end End. 4. Вычисление суммы и произведения элементов массивов. Пример A. 54 Составить программу для вычисления значения функции Z X i i = ∑ 2 / , где X i -элемент массива X[1..20]. Программа имеет вид: Program Summa; Const nn = 20; Var n, i : integer; Z : real; X : array [1..nn] of real; Begin { инициализация } Write('Введите количество элементов в векторе : '); ReadLn(n); Z := 0; { цикл } For i := 1 to n do begin Read (X[i]); Z := Z + Sqr(X[i])/i end; End. Пример Б. Составить программу для вычисления произведения Z положительных элементов массива Х[1..100]. Программа имеет вид: Program Mult; Const nn = 100; Var i, n : integer; Z : real; X : array[1..nn] of real; Begin { инициализация } Write('Введите количество элементов в векторе : '); ReadLn(n); Z := 1; { цикл } For i := 1 to n do begin Read (X[i]); If X[i] > 0 then Z := Z * X[i] end; Writeln('Произведение элементов Z = ', Z) End. 5. Вычисление суммы членов бесконечного ряда с заданной точностью. Пример Составить программу для вычисления суммы членов ряда 55 Z x n n n n = + − = ∞ ∑ 1 1 2 2 1 ( ) ( )! c точностью до члена ряда, меньшего Еps. Программа имеет вид Program SumRow; Var Y, Z, X, Eps : real; n : integer; Begin { инициализация } Write('Введите значения переменной Х и погрешности: '); ReadLn(X, Eps); Y := 1; Z := 1; n := 1; { цикл } Repeat Y := Y * (-X * X / ( 2n - 1) * 2 n ))); Z := Z + Y; n:=n+1 until Y < Eps; Write('Сумма ряда = ', Z) End. 6. Нахождение наибольшего и наименьшего значения элементов массива и функции. Пример А. Составить программу для нахождения наименьшего значения функции Y = a * Exp(- b * X) * Sin(omega * X + fi) при изменении аргумента X в интервале от 0 до c с шагом h. При организации программы с предложением For необходимо подсчитать число повторений, зависящее от интервала аргумента и его шага. При использовании предложений While и Repeat введение дополнительного параметра не требуется, так как цикл предусматривает изменение аргумента. Программа с оператором For имеет вид Program MinF; Var a, b, c, omega, fi, h, Y, Ymin : real; k, i : integer; Begin { инициализация } WriteLn('Введите значения переменных a,b,c,omega,fi,h:'); ReadLn(a, b, c, omega, fi, h); Ymin := 1e19; k := trunc(c/h) + 1; X := 0; { цикл } For i:= 1 to k do begin Y := a * exp(-b * X) * Sin(omega * X + fi); If Y < Ymin then Ymin := Y; X := X + h end; Write('Ymin = ', Ymin) 56 End. В программе с предложением While отсутствует описание переменных К и I, а собственно цикл имеет вид While X <= c do Begin Y := a * exp(-b * X) * Sin(omega * X + fi); If Y < Ymin then Ymin := Y; X := X + h End. Пример Б. Составить программу для нахождения наибольшего значения элемента массива Х[1..40] и его порядкового номера. Программа имеет вид Program Max; Const n = 40; Var Xmax : real; i, n, nmax : integer; X : array[1..n] of real; Begin { инициализация } Write('Введите количество элементов в векторе : '); Read (n); { Ввод знчений элементов вектора } For i := 1 to n do Write(' X[', i:2:0, '] = '); Read(X[i]); Xmax := X[1]; nmax := 1; { цикл по поиску максимального значения элементов вектора } For i:= 2 to n do If X[i] > Xmax then Begin Xmax := X[i]; nmax := 1; End; Writeln('Xmax = ', Xmax); Writeln('nmax = ', nmax) End. 7. Нахождение корней нелинейного уравнения методом итераций. Пример. Методом итераций найти корень уравнения ArcSin(2X+1)-X=0, расположенный на отрезке [-0.5; 0], с абсолютрой погрешностью Eps = 10. Напечатать число итераций, необходимых для вычисления корня. Заданное уравнение преобразуем к виду X = F(X) следующим образом: ArcSin(2X + 1) = X; Sin(ArcSin(2X + 1)) = SinX; 2X + 1 = SinX; X = 0.5(SinX -1). 57 Проверка условия сходимости метода итераций: F'(X) = X CosX. Очевидно, что ′ = ≤ F x x x ( ) cos 05 для всех -0.5 ≤ X ≥ 0. Следовательно, рассматриваемый процесс итераций сходится. Программа имеет вид: Program Prim; Var a, b, X1, X0, delta, Eps : real; n : integer; Begin { инициализация } WriteLn('Введите значения переменных a, b, Eps:'); ReadLn(a, b, Eps); X0 := (a + b)/2; n := 0; { цикл } Repeat X1 := 0.5 * Sin(X0 * X0 - 1); n := n + 1; delta:= Abs(X1 - X0); X0 := X1; until delta < Eps; WriteLn('Корень=', X1:9:4); WriteLn('Число итераций=',n:5) End. Контрольные вопросы Дайте классификацию циклических процессов с указанием их особенностей. Укажите отличительные особенности каждого из трех операторов цикла. Дайте определение массива. Напишите формулу для вычисления обьема памяти, занимаемого массивом. В оперативной памяти любой многомерный массив располагается линейно. Выведите формулу, по которой процессор определяет порядковый номер элемента многомерного массива в памяти при известных значениях индексов. Чему равен шаг изменения параметра цикла в предложении For? В чем отличия итерационных циклов и циклов с фиксированным числом повторений. В чем состоят преимущества использования операторов цикла? Указажите основные правила организации вложенных циклов. Возможен ли выход из внутреннего цикла до его полного завершения ? Как организовать ввод матрицы размером N*M элементов ? Как организовать вывод матрицы ? Задание к работе 1. Выполнить индивидуальное задание А. 2. Выполнить индивидуальное задание Б. Методические указания При выполнении индивидуального задания необходимо соблюдать технологию решения задач на ЭВМ: изучить словесную постановку задачи, выделив при этом все виды данных; сформулировать математическую постановку задачи, выделив при этом все виды данных; сформулировать математическую постановку задачи; выбрать метод решения задачи, если это необходимо; записать разработанный алгоритм на языке Паскаль; 58 разработать контрольный тест к программе; отладить программу; представить отчет по работе к защите. Содержание отчета 1. Титульный лист. 2. Словесная постановка задачи. 3. Математическая постановка задачи. 4. Графическая схема алгоритма решения задачи. 5. Листинг программы. 6. Контрольный тест. 7. Результаты тестирования программы. 8. Ответы на контрольные вопросы. Варианты индивидуальных заданий Задание А. Обработать на ЭВМ массив в соответствии с вариантом задания. Вариант задания Массив Действия Условия и ограничения 1 X(100) Вычислить сумму и количество элементов массива Х. 0 ≤ x[i] ≤1 2 A(80) Вычислить среднее арифметическое значение элемента массива А a[i] > 0 3 X(70) Переписать элементы массива Х в массив Y и подсчитать их количество. -1 x[i] ≤ 1 4 B(50) Oпределить максимальный элемент массива В и его порядковый номер. x[i] > 0 5 C(40) Вычислить минимальный элемент массива С и его номер. x[i] < 0 6 D(80) Найти максимальный и минимальный элементы массива D и поменять их местами. 7 Y(20) Вычислить среднее геометрическое элемента массива Y. y[i] > 0 8 Z(30) Расположить в массиве R сначала положительные, а затем отрицательные элементы массива Z. 9 N(50) Определить сумму элементов массива N, кратных трем. n[i]/3*3=n[i] 10 X(N) Вычислить сумму и количество элементов массива Х. N ≤ 40 Задание Б. Вариант задания Матрица Действия Условия и ограничения 1 А(10,15) Вычислить и запомнить сумму и число положительных элементов каждого столбца матрицы. Результаты отобразить в виде двух строк. a[i,j]>0 2 А(N,M) Вычислить и запомнить суммы и числа элементов каждой строки матрицы. Результаты отобразить в виде двух столбцов. N <= 20 M <= 15 3 B(N,N) Вычислить сумму и число элементов матрицы, находящихся под главной диагональю и над ней. N ≤12 59 4 C(N,N) Вычислить сумму и число положительных элементов матрицы, находящихся над главной диагональю. c[i,j]>0 N ≤12 5 D(K,K) Записать на место отрицательных элементов матрицы нули и отобразить ее в общепринятом виде. K ≤ 10 6 D(10,10) Записать на место отрицательных элементов матрицы нули, а на место положительных - единицы. Отобразить нижнюю треугольную матрицу в общепринятом виде. 7 F(N,M) Найти в каждой строке матрицы максимальный и минимальный эле менты и поместить их на место первого и последнего элемента строки соответственно. Матрицу вывести в общепринятом виде. N ≤20 M ≤10 8 F(10,8) Транспонировать матрицу и вывести на печать элементы главной диагонали и диагонали, расположенной под главной. 9 N(10,10) Для целочисленной сатрицы найти для каждой строки число элементов, кратных пяти, и наибольший из полученных результатов. n ij /5*5= n ij 10 P(N,N) Найти в каждой строке матрицы наибольший элемент и поменять его местами с элементом главной диагонали. Отпечатать полученную матрицу в общепринятом виде. N ≤15 60 ЛАБОРАТОРНАЯ РАБОТА N 8 Тема : " Строковые данные " Цель работы 1. Ознакомиться со строковыми данными. 2. Получить навыки в организации работы со строковыми переменными: удалением, вставкой, копированием, заменой одной строки на другую и т.д. Краткие сведения из теории 8.1. Объявление строковых переменных Турбо-Паскаль предоставляет средства для работы с данными строкового типа, которые в дальнейшем будем называть стрингами. Строковый тип данных представляет собой цепочку символов. Длина цепочки может изменяться от 0 до 255. Для определения строкового типа используется служебное слово STRING, за которым в квадратных скобках указывается максимальная длина строки, например: TYPE line = string[25]; VAR mline : line; В данном примере переменная mline представляет собой последовательность, включающую до 25 символов, причем каждый символ имеет стандартный тип CHAR. Значение строковой переменной может быть назначено оператором присваивания, либо введено с устройства ввода, например: aline := 'ВСТИ'; mline := aline; readln(mline); Изображение строки строится из цепочки символов и заключается в апострофы. Максимальная длина строки может быть задана целым числом, или константой целого типа. Указание максимальной длины может быть опущено; в этом случае подразумевается число 255, например: TYPE line = string; line1 = string[255]; Описания типов в данном примере эквивалентны. Основное отличие строк от символьных массивов заключается в том, что строки могут динамически изменять свою длину, например : mline := 'строка'; mline := mline + 'стала длинной'; В приведенном примере после первого присваивания длина переменной mline равна шести. Второе присваивание увеличивает ее длину до 19 символов. Динамические строки организуются в Турбо-Паскале следующем образом: память под стринги отводится по максимуму (согласно описанию), а используется лишь та ее часть, которая реально занята символами строки. При такой организации работы со стрингами Турбо-Паскаль должен знать реальную длину стринга. Поэтому для строковой переменной длиной N символов отводится (N+1) байтов памяти, из которых N байтов предназначены для хранения символов строки, а один байт - для хранения текущей длины строки. Символы строки нумеруются целыми числами, начиная с единицы, а байт с текущей длиной строки считается нулевым ее элементом. Длину текущей строки можно определить следующим образом: 61 len := ord(st[0]); Здесь st - переменная строкового типа. Если стрингу присваивается значение строкового выражения с длиной, большей чем максимально допустимая, происходит отсечение строки до максимальной длины, например: VAR st : string[5]; BEGIN st := 'очень длинная строка'; writeln(st); { будет отображено только: 'очень'} 8.2. Основные операции Для строковых типов данных определена операция "конкатенация", обозначаемая символом '+'. Смысл операции заключается в формировании новой строки. Динамическая длина сформированной строки равна сумме символов строк-операндов, а ее значение равно последовательности символов исходных строк. Например : VAR str1, str2 : string[10]; st : string[25]; BEGIN str1 := 'Паскаль - '; str2 := 'программа'; st := str1 + str2; WriteLn(st) END. В результате выполнения программы будет на экране отображена текстовая строка: 'Паскаль - программа'. Кроме операции конкатенации над значениями строковых типов разрешены операции сравнения < , <=, > , >=, = , <>, IN, при выполнении которых действуют следующие правила: а) более короткая строка всегда меньше более длинной; б) если длины сравниваемых строк равны, то происходит поэлементное сравнение символов этих строк с учетом лексикографической упорядоченности значений в) компаратор IN определяет вхождение левого операнда в правый. Если левый операнд входит в правый, то результат компарации будет истинным (TRUE), в противном случае - ложным (FALSE). Левым операндом может быть только элементарное данное (здесь символ), а правым - любое множество элементов, в данном случае стринг или литерный ряд. 8.3. Доступ к элементам строковых данных Доступ к отдельным элементам строк осуществляется аналогично доступу к элементам одномерного массива: после имени строковой переменной необходимо в квадратных скобках указать арифметическое выражение целого типа, например: VAR mline : string; i : integer; BEGIN for i := 1 to length( mline ) do 62 if mline[i] IN ['a'...'z'] then mline[i] := chr( ord( mline[i] ) + 1); Можно заметить, что работа со строковыми данными аналогична работе с символьными массивами, однако, это не означает их полную идентичность. Так, распространенной ошибкой является работа с элементами строки без учета ее текущей длины. Необходимо помнить, что если длина символьного ряда статична, то длина стринга динамична. 8.4. Стринги и литерные ряды Регулярную переменную типа ARRAY OF CHAR ( или литерный ряд) можно рассматривать как стринг постоянной длины. Данные указанного типа могут быть использованы в любых стринговых выражениях. При этом согласование операндов по типам обеспечивается компилятором, который в подобных случаях просто преобразует литерный ряд в стринг длиной, равной количеству элементов ряда. Это позволяет, например , сравнивать литерные ряды между собой и обращаться с ними точно так же, как с переменными типа STRING. Допускается выполнять присваивание, в левой части которого стоит имя литерного ряда, в правой - стринговый литерал ( константа ) длиной, равной количеству элементов ряда. Однако нельзя присваивать какой-либо переменной типа литерный ряд переменную типа STRING или наоборот. Например: Сonst message = 'верно'; Type СharАrray = array[1..5] of char; Var FixedString, FiveChar : CharArray; VarString : string[10]; Begin FiveString := 'мерно'; FixedString := message; if FiveChar > FiveString then writeln('"', FiveChar,' "больше, чем"', FiveString,'"'); VarString := 'при'; VarString := concat(VarString,FiveChar); VarString := 'голос'; FiveChar := VarString; { так нельзя} Пояснение к программе. В рассмотренном примере объявлено два литерных ряда ( типа СharАrray) - FixedString и FiveChar, а также стринг VarString. 1. Стринговый литерал 'мерно' присваивается переменной FiveChar. 2. Переменной FixedString присваивается стринговая константа message, имеющая значение 'верно'. 3. Сравниваются два ряда, в результате которого выясняется, что FiveChar больше FixedString (поскольку 'мерно' > 'верно'). 4. Переменная VarString получает значение 'при'. 5. В результате конкатенации VarString получает новое значение - 'примерно', которое на следующем шаге затирается значением 'голос'. 6. В последнем операторе делается попытка литерному ряду назначить стринговую переменную, это недопустимо по обычной в таких случаях ошибке "несоответствие типов". В программе левый операнд объявлен как литерный ряд, а правый как стринг. 8.5. Пустой стринг 63 Стринг, длина которого равна 0, называется пустым. Пустой стринг изображается в виде двух апострофов, записанных рядом, без пробела: ''. Например : If st = '' then writeln('стринг st пуст'); Следует отметить, что переменную типа STRING необходимо инициировать пустым значением. В противном случае, если к моменту первого использования переменной она не получила какого-то определенного значения, в программе может возникнуть непредсказуемая ситуация. Дело в том, что при включении компьютера оперативная память очищается, в результате любые переменные инициализированы: числовые переменные обнулены, а стринги получают нулевую длину. В любое другое время работы ЭВМ переменные будут содержать неопределенные значения, обусловленные прежним содержимым памяти. В этом случае текущая длина переменной типа STRING может быть ненулевой. 8.6. Функции преобразования Для строковых типов данных определены следующие функции преобразования: a) STR(x[:width[:decimals]];var s:string) - эта функция преобразует численное значение x в его строковое представление s. b) VAL(s:string; var x code:integer) - эта функция преобразует строковое значение s в его численное представление x. 8.7. Стандартные процедуры и функции Для строковых типов данных определены следующие процедуры и функции: a) INSERT(source: string; var s: string; index: integer) - эта процедура предназначена для вставки строки SOURCE в строку S, начиная с символа с номером INDEX в этой строке. b) DELETE(var s: string; index, count: integer) - эта процедура производит удаление из строки-параметра S подстроки длиной COUNT, начиная с символа с номером INDEX. c) CONCAT(s1, [s2,...]: string): string - эта функция выполняет слияние строк-параметров, которых может быть произвольное количество. Каждый параметр является выражением строкового типа. Если длина результирующей строки превышает 255 символов, то она усекается до этой длины. d) COPY(s: string; index: integer; count: integer): string - эта функция возвращает подстроку, выделенную из исходной строки S, длиной COUNT символов, начиная с символа под номером INDEX. e) POS(substr, s: string): byte - эта функция производит поиск в строке S подстроки SUBSTR. Результатом функции является номер позиции подстроки в исходной строке. f) LENGTH(s: string): integer - эта функция возвращает текущую длину строки S. g) MOVE(var x, y; count: word) - эта функция копирует заданное количество COUNT последовательных байт из источника X в приемник Y. h) FILLCHAR(var x; count: word; value) - эта функция заполняет заданное количество COUNT последовательных байт переменной X указанным значением VALUE. Контрольные вопросы 1. Дайте определение строковой переменной. 2. Какие типы данных используются в качестве базовых в строковых данных? 3. Каким образом распределяется память под строковые переменные? 4. Какие операции выполняются над строковыми переменными? 5. В чем состоит сходство и различие строковых переменных и символьных массивов? 6. Возможно ли преобразование строковых переменных? 7. Назовите основные функции над строковыми переменными и их назначение. 8. Каково назначение процедур DELETE,INSERT. 64 9. Как реализуется ввод и вывод строковых переменных. 10. Предложите схему преобразования действительных чисел в стринги. 11. Что такое литерный ряд? 12. В чем состоит отличие стринга от литерного ряда? Задание к работе Выполнить индивидуальное задание. Методические указания 1. Строка символов формируется при вводе с клавиатуры. 2. При выполнении задания необходимо использовать стандартные функции и процедуры работы со стрингами: СОРУ, POS, LENGTH, INSERT, DELETE и операцию конкатенации. 3. Написать и отладить программу. 4. Написать отчет по работе. Содержание отчета 1. Титульный лист. 2. Словесная постановка задачи. 3. Графический или текстуальный алгоритм решения задачи. 4. Листинг программы. 5. Контрольный тест и результаты тестирования программы. 6. Анализ ошибок, допущенных при программировании. 7. Ответы на контрольные вопросы по согласованию с преподавателем. Варианты индивидуальных заданий 1. Дана строка символов. Подсчитать сколько среди символов данной строки встречается буква x. 2. Дана строка символов. Подсчитать: a) сколько раз в данной строке встречается символ + и сколько раз символ *; b) общее число вхождений символов +, -, * в строку. 3. Дана строка символов. Преобразовать данную строку, заменив в ней: a) все восклицательные знаки точками; b) каждую точку многоточием. 4. Дана строка символов S. Выяснить имеются ли в данной строке такие символы s i , s i+1 , что s i - это запятая, а s i+1 - это тире. 5. Даны две строки символов S1 и S2. Выяснить, верно ли, что среди символов строки S1 имеются все буквы строки S2. 6. Дана строка символов. Удалить из данной строки все группы букв вида asdf. 7. Дана строка символов. Преобразовать строку, удалив каждый символ * и повторив каждый символ, отличный от *. 8. Дана строка символов. Заменить в данной строке каждую группу букв child группой букв children. 9. Дана строка символов. Исключить из строки группы символов, расположенные между парами скобок (, ), {, }. Сами скобки тоже должны быть исключены. Предполагается, что внутри каждой пары скобок нет других скобок. 10. Дана строка символов. Словом будем называть группы символов, разделенных пробелами (одним или несколькими). Подсчитать количество слов в данной строке. |