Основы программирования (947332), страница 14
Текст из файла (страница 14)
После\B[i]:=0завершения цикла суммирования эту строку и еесумму можно сразу выводить. На рис. 4.7 предr*^j:=I,5,l\-,ставлена схема алгоритма программы (пунктиромвыделено суммирование элементов i-й строки).1 B[i]:=B[i]+ 1 jНиже приведен ее текст.11-^t'ji1 hProgram ex;11;Var А: array[L .4J„5J of real;Вывод/B:array[1..4] of real;/ij:byte;Begin{ Конец jWriteLn(*Введите Mampuify построчно: *);for i:=J to 4 do{вводим матрицу}beginРис. 4.7.
Схемаforj:^l to 5 do Read(A[iJ]);алгоритма программынахождения суммReadLn;элементов строкend;_m_J83Часть L Основы алгоритмизации и процедурное программированиеWriteLn(*Результаты:');for i:=^l to 4 do{для каждой строки}beginB[i]:=0;{обнуляем накапливаемую сумму}forj:-l to 5 do BfiJs^BfiJ-^AfiJJ; {суммируем элементы строки}forj:=I to 5 do Write(A[ij]:7:2);(выводим строку}WriteLnC Сумма равна \B[i]:7:2); {выводим сумму}end;EndСимвольные массивы.
Символьными называют массивы, элементамикоторых являются символы. Такие массивы традиционно использовалисьдля представления символьной информации, например различных текстов.Обработка символьных массивов в Borland Pascal имеет некоторые особенности.1. Объявляя символьный массив как типизированную константу, значения символов можно указывать поэлементно:Const d:array[l,JO] of char ^С0\Ч\ '2\ '3\ *4\ '5\ '6'/7\'8\ V*);или целиком, используя строковую константу, длина которой должна строгосоответствовать размеру массива:Const d:array[L.10] of char =VI23456789';...2.
Присвоить значение символьному массиву также можно целиком, используя строковую константу, длина которой должна совпадать с длиноймассива:Var S: array[LJl] of char;...S:- 'Примеродин*;3. При вводе элементы символьного массива нельзя разделять пробелами, так как пробел будет восприниматься как символ:Var S: array[1„ 10] of char;...for i:=l to 10 do Read(S[i]); {вводим строку «ABODE FILN J » }4. Символьный массив можно выводить поэлементно в цикле, как обычный одномерный массив, а можно - целиком, одним рператором Write илиWriteLn:WriteLn(S); {вывод символьного массива одним оператором}5. В операторе вывода допускается использование операции конкатенации (слияния) символьных массивов, обозначаемой символом «+». Результатом этой операции будет новый символьный массив, число элементов кото844. Структурные типы данныхрого равно сумме размеров исходных массивов, а значениями элементов элементы исходных массивов, последовательно записанные друг за другом:WriteLn(stl + ' * + st2): {конкатенация символьных массивов}Работа с одномерными символьными массивами осуществляется поэлементно, как с обычными массивами.
Рассмотрим пример использования символьных массивов.Пример 4.3. Дана строка не более 40 символов, состоящая из слов; разделенных пробелами, и завершающаяся точкой. Разработать программу удаления «лишних» пробелов. Лишними считать пробелы в начале строки, второй и более пробелы между словами и пробелы в конце строки.Например:Исходная строка:ABC DEРезультат: ABC_DE__FGH.""FGHУдалить пробелы в начале строки не трудно: просто не нужно переписывать пробелы до первого значащего символа из исходной строки в результирующую. Несколько сложнее дело обстоит с пробелами между словами, таккак удалить нужно не все пробелы, а только повторяющиеся. Для решениязадачи используем специальный признак «первый пробел». Этот признак будем устанавливать, встретив первый пробел, и гасить, встретив символ, отличный от пробела (на рис.
4.8). Используя этот признак, мы сможем отличить первый пробел, который необходимо перенести в массив результата отпоследующих, которые переносить не надо. Диаграмма показывает, что еслив конце строки есть пробелы, то с использованием признака «первый пробел» мы получим в строке результата один лишний пробел.
Поэтому послезавершения обработки необходимо проверить признак, и если он установлен,удалить пробел, уменьшив длину строки на единицу. В программе, приведенной ниже, вместо этого на место пробела пишется точка. В том случае, еслипробела в конце нет, для точки «добавляется» элемент.Исходный массивА В СПризнак"первыйпробел"truefalseD Е^F G НXZZZLА В СD ЕF G НРезультатРис. 4.8.
Диафамма установки и гашения признака «первый пробел»85Часть 1. Основы алгоритмизации и процедурное программированиеProgram Stroka;Var ij\n:byte; key: boolean;s:array [L.41] of char; {дополнительный символ - для точки}BeginWriteLnCВведите исходную строку длиной до 40 символов:*);i:-l;{вводим строку посимвольно до точки, но не более 40 символов}Read(s[i]);while (i<40) and (s[i]o\') dobegini:-i+l;Read(sfiJ);end;ReadLn;ifsfij= \ ' then n:=i'l else n:=i; {определяем количество введенныхсимволов без точки}Writef'BeedeHHaM строка: *); WriteLn(s);j:=0; {номер символа в строке результата}key:=false; {гасим признак "первый пробел"}for i:=J to п doifs[i]^* * then {если обнаружен пробел}beginif key then {этот пробел первый}beginkey:=false; {дальше пойдут лишние пробелы}j:=j+J:{пробел переписываем в результат}s[j]:^s[i];end;endelse {символ}beginkey:=true; {устанавливаем признак "первый пробел"}s/jj:=sfi];end;if key thenj:=j+l;{символ переписываем в результат}{если пробела в конце нет, то увеличиваемдлину для записи точки}S[/]:'= \ V {записываем точку}WriteLn('npeo6pa3oeaHHaM строка ');for i:=J toj do Write(s[i]); WriteLn;End.864.
Структурные типы данных4.2. Практикум. Обработка одномерных массивовВсе операции, которые приходится выполнять над элементами одномерных массивов, можно разбить на следующие классы:• последовательная обработка элементов массивов;• переформирование массивов;• одновременная обработка нескольких массивов или подмассивов;• поиск элементов массива по заданным критериям.Как правило, в реальной жизни задачи, включающие только эти операции, встречаются редко.
Однако программирование более сложной обработки включает элементы указанных операций.Для выполнения перечисленных выше операций разработаны соответствующие приемь}. Рассмотрим наиболее распространенные приемы программирования обработки одномерных массивов.Последовательная обработка элементов массивов. Особенностьюопераций данного класса является то, что количество обрабатываемых элементов массива и шаг изменения индексов известны.
Это позволяет для выполнения операции использовать счетный цикл, через переменную которогообеспечивается косвенный доступ к элементам. Если просматриваются всеэлементы массива, то обращение выполняют, используя переменную цикла вкачестве индекса, а если с заданным шагом, то для адресации элементовстроится выражение, в которое входит переменная цикла, например 2*i+l.Однако возможно применение и других типов циклов.Примерами задач, требующих выполнения последовательной обработки, являются: ввод и вывод массивов, нахождение сумм элементов как целиком массива, так и его определенной части, произведения элементов, среднего арифметического, среднего геометрического, подсчет количества элементов, отвечающих определенному условию или обладающих некоторыми признаками, а также их суммы, произведения и т.д. Кроме того, к этой группемогут быть отнесены задачи формирования значений и замены значенийвсех элементов значениями, подчиняющимися определенному закону.Пример 4,4.
Разработать программу определения среднего арифметического значений положительных элементов целочисленного массива А(п), гдеп < 40, кратных трем.Количество элементов массива в условии не определено, но ограничено.Для реального массива, который будет обрабатываться программой, это количество естественно должно быть известно. Следовательно, прежде чемвводить элементы массива, можно запросить у пользователя ввод количестваэлементов п. Массив при этом будем описывать на максимально возможноеколичество элементов, так как в Borland Pascal выделение памяти под массивы реализовано статически^ т.
е. память под массивы, строки и другие структурные типы данных резервируется на этапе компиляции программы. Если87Часть 1, Основы алгоритмюации и процедурное программированиеs:=s+A[i]kol:=kol+lIКонецРис. 4.9. Алгоритм определениясреднего арифметическогоэлементов массива, кратных 3необходимо реализовать выделение памяти во время выполнения программы,то используют указатели (см.
главу 7).Для решения самой задачи необходимо двум вспомогательным переменным S и ко1, которые будут использованы для накопления суммы требуемыхэлементов и их количества, присвоитьнулевые значения. После этого осуществляют перебор всех элементов, и еслиочередной удовлетворяет условию, егозначение добавляют к содержимому переменной S, а значение переменной ко1увеличивают на единицу. После просмотра всего массива среднее арифметическое может быть определено делением накопленной суммы на количество найденных элементов.
(Обратитевнимание, что среднее арифметическоеопределяется после просмотра всегомассива, так как до этого момента у насне полные сумма и количество элементов.) Положительных элементов в массиве может не быть, что необходимопредусмотреть в программе. Алгоритмрешения задачи представлен на рис. 4.9.Ниже представлен текст программы.Program ex;Var a:array[L JO] of integer; s, kol /, n:integer;BeginWriteLn(*Введите количество элементов массива <=40*);Readlnfn); {вводим количество элементов массива}WriteLn(*Введите \ п, * элементов массива:*);for i:=l to п do Read(a[i]);ReadLn; {вводим массив}WriteLnf* Исходный массив *);for i:'=J to n do {выводим массив по 10 элементов в строке}if О mod 10) =0 then WriteLn(a[i]:5)else Write(a[i]:5);WriteLn;kol:-0;{обнуляем количество элементов, кратных 3}s:-0\{обнуляем начальное значение суммы элементов}884, Структурные типы данныхfor i:=l to п doif(a[i] mod 3)=0 then {если элемент кратен 3}beginkol:=kol+l\ {увеличиваем количество на 1}s:-s-¥a[i]; {добавляем элемент к сумме}end;ifkol='0 then {если количество элементов равно нулю, то}}¥гиеЬпСЭлементов, удовлетворяющих условию, нет*)else WriteLnC Среднее арифметическое^ ко1:3,^ элементов, кратных 3-*,(s/kol):7:2);EndПример 4.5.