Основы программирования (947332), страница 19
Текст из файла (страница 19)
При этом можно было бы выделитьтри случая (рис. 4.25).Окончательно алгоритм будет включать сортировку отрезков по левойгранице и цикл накопления тени, включающий анализ вариантов добавления. Программа в этом случае имеет видProgram ten;Var х: array[1. .100J..2] of real;iJ,n,k: integer;xk,SyW:real;BeginWrite('Beedume количество отрезков: *);Readln(n);WriteLnCВводите начала и концы отрезков. *);for i:==I to n do ReadLn(x[iyl],x[i,2]);{сортировка отрезков по возрастанию левой границы}yV=7; к:=1;while к<>0 dobeginк:=0;for i:=J to n-j doifx[ij]>x[i-^lj]thenbegin k:=k-^I;{меняем отрезки местами }w:=x[ij]; x[ij]:^x[i-^lj];x[i+l,l]:==w;w: =xfi, 2J; x[l 2]: =xfi+J, 2J; xfi+ 7,2J: =w;end;111Часть L Основы алгоритмизации и процедурное программированиеend;{определение тени}S:'=x[l,2]'X[lJ];(длина первого отрезка}xk:=x[]JJ;{правая граница первого отрезка}for i:=2 to п doifxfi, 1]> =xk then{случай б}begin S: =S-^xfi,2]'X[i, 1];xk:=x[i,2J;endelse ifx[i,2J>xk then {случай a}begin S: =S+xfi, 2J'Xk;xk:=xfi,2J;end;Write In ('Длина тени равна \ S:6:2);End.Задания для самопроверкиЗадание 1.
Дана матрица вещественного типа D(n,m), п, m < 20. Разработайтепрограмму, которая в заданной матрице вычеркивает все строки, содержащие болеетрех отрицательных элементов. Вывести на печать исходную матрицу и матрицу-результат или соответствующие сообщения, если таких строк не окажется или всестроки будут удовлетворять условию.Задание 2. Дана матрица A(n,m), п, m < 15. Разработайте программу, формирующую одномерный массив В(п), элементами которого должно являться количествоэлементов каждой строки, превышающих среднее арифметическое значение матрицы в целом.
Если в строке таких элементов нет, в соответствующий элемент одномерного массива заносится 0. Вывести исходную матрицу, значение среднего арифметического элементов матрицы и сформированный массив В.Задание 3. Разработайте программу, формирующую квадратную матрицуD(n,n), п < 15, элементы которой определяются по формулеD[iJ]=I sin(i+j)1I (i+j)/(2i+3j)npHi<j;npHi=j;npHi>j,где i - номер строки, a j - номер столбца элемента матрицы. В сформированной матрице поменять местами максимальный элемент среди элементов, лежащих нижеглавной диагонали, с минимальным элементом среди элементов матрицы, лежащихниже побочной его диагонали.
Вывести исходную матрицу, соответствующие элементы и их координаты, а также преобразованную матрицу.1124. Структурные типы данных4.5. СтрокиУже на простом примере обработки символьной информации, рассмотренном в параграфе 4.1, видно, что обработка строк с использованием одномерных массивов представляет собой достаточно специфическую задачу. Вто же время большинство операций, которые выполняют со строками текста,повторяются в разных программах: поиск, копирование, удаление и вставкафрагментов строки.
Поэтому для упрощения работы со строками в BorlandPascal существует специальный тип данных - строковый, который приспособлен для обработки символьной информации.Синтаксическая диаграмма объявления строкового типа данных представлена на рис.
4.26.Целое без знака - это максимальная длина строки, которая не должнапревышать 255 байт. Если длина не указана, то по умолчанию принимаетсямаксимальное значение - 255 символов.Объявление переменных строкового типа, так же как и массивов, можновыполнить двумя способами:• в операторе объявления переменных, например:Var Sly S2:string[40]; {символьные строки длиной 40 байт}S3:strmg:{символьная строка длиной 255 байт}• с предварительным объявлением типов, например:Туре S40 = strmg[40]; {тип - строка длиной 40 байт}ST = string; {тип - символьная строка длиной 255 байт}Var SJ,S2: S40; {символьные строки типа S40}S3:ST;{символьная строка типа ST}Внутреннее представление строки показано на рис 4.27, откуда видно,что строка представляет собой одномерный символьный массив, индексы которого изменяются от О до максимального значения, указанного при объявлении строкового типа. Следовательно, физическая длина строки на единицупревышает максимальную.Инициализация строк.
Для инициализации строковых переменных,так же как и переменных других типов, можно использовать типизированные— « / string V j -^\J^fI без знака | v L /Рис. 4.26. Синтаксическая диаграмма<Объявление строкового типа>113Часть 1. Основы алгоритмизации и процедурное программированиеМаксимальная длина строки ^ 255А0 1 2 3 4 5 6 7 8 9 10 11 12 13 ...[silAJщ с|__^н^II1М 1 1 )VТекущаядлина строкиНезанятаячасть строкиРис.
4.27. Внутреннее представление строкиконстанты, причем строка-литерал может быть короче инициализируемойстроки, например:Const S:strmgf40]= Типизированная константа VSJ:string= '*;... {пустая строка нулевой длины}Операции над переменными строкового типа. Над переменнымистрокового типа помимо операции доступа к символам определены операцииприсваивания, конкатенации (сцепления) и отношений.Доступ к сглмволам строки. Обращение к символам строки выполняется как к элементам массива символов, т.
е. с указанием имени строки и номера элемента, например st[l] или s[i]. Нулевой байт содержит текущее значение длины строки, но так как строка - это массив символов, длина автоматически интерпретируется как символ. Для получения текущей длины строки ввиде числа необходимо явное преобразование символьного типа в целый.Например, если i - переменная целого типа, а S3 - переменная строковоготипа, то получить текущую длину строки S3 можно:1) /. = byte(S3[0]); {явное преобразование с помощью автоопределения}2) i:-ord(S3[0]): {явное преобразование с помощью специальной функции}Однако лучше это сделать, используя специальную функцию Length,описанную ниже.Присваивание строк. Можно присвоить строке значение строки и значение символа. При выполнении операции символы заполненной части строкии ее длина переписываются в CTpoity-результат, например:S1:- 'ABCD V {присваиваем строке значение строковой константы}52.= 'А V{присваиваем строке значение символа}5.-=57;{переписываем одну CTpoiQ^ в другую}При присваивании строке значения символа последний интерпретируется как строка единичной длины.
Если строка-источник длиннее, то при присваивании она усекается в соответствии с длиной строки-результата.1144. Структурные типы данныхКонкатенация, Операция конкатенации позволяет сцепить строки с другими строками или символами. При сцеплении длины строк суммируются, асимволы объединяются в одну последовательность. Например:*fdc'+ 'ghj V {получаем ' fdcghj'}S4+ Vvv V{к строке S4 дописывается 'vvv'}Результат этой операции можно присвоить какой-либо строке или вывести на экран.Отношения.
Над строками допускается выполнять операции отношения: = , о , >, <, >=, <=. Сравнение строк при этом выполняется последовательно слева направо с учетом внутренней кодировки символов до первогонесовпадающего символа. Большей считается та строка, код несовпадающего символа которой по таблице ASCII больше. Если длина одной строкименьше другой, то недостающие значения до длины большей строки заполняются символами #0. Результатом операций отношения для строк, как и длячисел, является значение false и true.Допускается сравнение символов со строками, при этом символы преобразуются в строки единичной длины.Так, еслиS4:='ABCD';S3:='ADFH';C:='L';то при выполнении операций отношения:S4S4S3S3= S3> S3> S4=С{получим{получим{получим{получимfalse}false}true}false}Ввод-вывод строк. Ввод-вывод переменных строкового типа осуществляется одной операцией Read (ReadLn) или Write (WriteLn), например:ReadLn(S]);WriteLn(Sl):При вводе за строку принимается последовательность символов до кодаклавиши ENTER.
Если длина введенной строки больше указанной максимальной длины, то лишние символы отбрасываются, а в нулевой байт записывается значение максимальной длины. В противном случае в нулевой байтзаписывается количество введенных символов. Поскольку строкой считаются все символы до кода клавиши ENTER, ввести в одной строке строковоезначение, а затем, например, число нельзя.Если при вводе строки просто нажать клавишу Enter, не вводя никакихсимволов, то считается, что введена пустая строка.115Часть L Основы алгоритмизации и процедурное программированиеПроцедуры и функции для работы со строками.
Все основные действия над строками и символами реализуют с помощью стандартных процедури функций.1. Функция Length(st):word- возвращает длину строки st, например:n:=Length(stl);{целочисленной переменной п присваивается значение длины строки}2. Процедура Delete(sU index, count) - удаляет count символов строки st,начиная с символа с номером index, например:S1: = ^dddddsssssfffff;Delete(Sl,6,5); {получим результат 'dddddfflfff'}3. UpoixQjjypa. Insert(St2,Stl,index) - вставляет подстроку символов St2 встроку Stl, начиная с символа с номером index. Процедура обычно используется при формировании строк, включающих числовую информацию, например:SJ = 'dddddddddd';S2 = 'аааааа';Insert(Sl, S2,6);{получим 'dddddaaaaaaddddd'}Insert(Tas\ S2,6);{получим 'dddddPasaaaaaaddddd'}4.