ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ......

24
Высшее профессиональное образование Н. И. ПарфИлоВа, а. Н. ПылькИН, Б. Г. ТрусоВ ПроГраммИроВаНИе сТрукТурИроВаНИе ПроГрамм И даННых учеБНИк Под редакцией доктора технических наук, профессора Б. Г. Трусова БакалаВрИаТ Рекомендовано Федеральным государственным бюджетным образовательным учреждением высшего профессионального образования «Московский государственный технический университет имени Н. Э. Баумана» в качестве учебника для студентов высших учебных заведений, обучающихся по направлению подготовки «Информатика и вычислительнвая техника»

Transcript of ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ......

Page 1: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

В ы с ш е е п р о ф е с с и о н а л ь н о е о б р а з о в а н и е

Н. И. ПарфИлоВа, а. Н. ПылькИН, Б. Г. ТрусоВ

ПроГраммИроВаНИесТрукТурИроВаНИе ПроГрамм И даННых

у ч е Б Н И к

Под редакцией доктора технических наук, профессора Б. Г. Трусова

Б а к а л а В р И а Т

Рекомендовано Федеральным государственным бюджетным образовательным учреждением высшего профессионального образования «Московский государственный технический университет имени Н. Э. Баумана» в качестве учебника для студентов высших учебных заведений, обучающихся по направлению подготовки «Информатика и вычислительнвая техника»

Page 2: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

УДК 621.391(075.8)ББК 32.973-018я73 П189

Р е ц е н з е н т —профессорМосковскогогосударственноготехническогоуниверситета

имениН.Э.Баумана,доктортехн.наукК.А.Майков

Парфилова Н. И.П189 Программирование.Структурированиепрограммидан-

ных : учебник для студ. учреждений высш. проф. образо-вания /Н.И.Парфилова, А.Н.Пылькин,Б.Г.Трусов ;подред.Б.Г.Трусова.—М. :Издательскийцентр«Академия»,2010.—240с.—(Сер.Бакалавриат).

ISBN978-5-7695-9150-1УчебниксозданвсоответствиисФедеральнымгосударственнымобра-

зовательнымстандартомпонаправлениюподготовки230100«Информатикаивычислительнаятехника»(квалификация«бакалавр»).

Рассмотрены основы современных подходов к программированию,в том числе структурное и объектно-ориентированное программирова-ние,вопросытехнологииразработкиалгоритмовипрограмм,процедурноеимодульноепрограммирование,структурированныетипыданныхипри-мерыихиспользованияприорганизациикакстатических,такидинами-ческихструктур,основыобъектно-ориентированногоподхода,технологияпроектированияиразработкиобъектно-ориентированныхпрограмм.

Текстиллюстрированпримерамипроектированияразличныхалгорит-мовипрограммвсредепрограммированияDelphiязыкаObjectPascal.

Для студентов учреждений высшего профессионального образова-ния.

УДК621.391(075.8)ББК32.973-018я73

Оригинал-макетданногоизданияявляетсясобственностьюИздательскогоцентра«Академия»,иеговоспроизведение

любымспособомбезсогласияправообладателязапрещается

©ПарфиловаН.И.,ПылькинА.Н.,ТрусовБ.Г.,2012 ©Образовательно-издательскийцентр«Академия»,2012ISBN 978-5-7695-9150-1 ©Оформление.Издательскийцентр«Академия»,2012

Page 3: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

3

Предисловие

Образовательный стандарт высшего профессионального образо-вания по направлению подготовки «Информатика и вычислительная техника» предусматривает, что в результате изучения дисциплины «Программирование» обучаемый должен:

• знать: технологию разработки алгоритмов и программ, основы современных подходов к программированию, в том числе струк-турного и объектно-ориентированного, методы отладки программ и решения различных предметных задач с применением средств вы-числительной техники, основные стандарты в области программной документации;

• уметь: выполнять формализованную постановку задачи и раз-рабатывать алгоритм ее решения, используя современные системы программирования, разрабатывать сопровождающие программные документы;

• владеть: практическими навыками разработки и отладки про-грамм на одном из языков программирования высокого уровня.

Общий курс по программированию и структурам данных труден как для преподавания, так и для изучения вследствие многообразия рассматриваемых структур и используемых понятий. Каким образом организовать это изучение — не простой вопрос.

Начинать изучение дисциплины «Программирование» необхо-димо с ее базовых основ: управляющих конструкций языка, техно-логии нисходящего проектирования алгоритмов и программ раз-личной структуры, методов отладки программ, методов решения различных предметных задач и особенностей реализации основных алгоритмов.

Для создания более сложных программных продуктов необходи-мо понимание и освоение таких тем, как общая концепция данных и действий, выполняемых над данными, понятие типа и структуры данных, реализация различных типов и структур данных в языках программирования, возможность обработки данных разного типа по-средством реализуемых операций и функций, управление данными и управление памятью, управление последовательностью действий и организация программ.

В данном учебнике рассматриваются технологии процедурного и модульного программирования с использованием как статических, так и динамических структур данных. Для подготовки студентов к дальнейшему обучению в области разработки сложных програм-мных продуктов с привлечением высоких технологий и формирова-

Page 4: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

ния их кругозора в данной предметной области приведен материал ознакомительного характера по основам объектно-ориентированного подхода и технологии разработки объектно-ориентированных про-грамм1.

Введение посвящено общим проблемам создания сложных про-граммных продуктов.

В главе 1 рассмотрены средства и алгоритмы обработки массивов данных, приведены примеры программирования различных пред-метных задач с использованием массивов.

В главе 2 изложены основные правила описания и использова-ния подпрограмм (процедур и функций), а также основные приемы модульного программирования.

В главе 3 представлены сложные структурированные типы и струк-туры данных (строки, записи, множества, файлы) и примеры их ис-пользования.

В главе 4 описаны ссылочные типы и организация динамических структур данных.

Глава 5 содержит общие вопросы по методологии проектирования программ. В ней дан краткий обзор современных методов проекти-рования. Рассмотрено понятие жизненного цикла программы.

В главе 6 освещена концепция объектно-ориентированного под-хода, рассмотрены основные понятия и технология проектирования и разработки объектно-ориентированных программ.

В приложении описаны процедуры и функции некоторых стан-дартных модулей языка.

Авторы выражают глубокую благодарность рецензентам, сде-лавшим ряд ценных замечаний при подготовке данного учебника, а также преподавателям и студентам, помогавшим в его написании, и всем авторам, материалы которых были использованы, принося извинения за невозможность сослаться в тексте на все случаи тако-го использования.

1 См. подробнее Парфилова Н. И.  Программирование. Основы алгоритми-зации и программирования / Н. И. Парфилова, А. Н. Пылькин, Б. Г. Трусов ; под ред. Б. Г. Трусова. — М. : Издательский центр «Академия», 2012.

Page 5: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

5

введение

Организация данных является важным аспектом программирова-ния. Гибкости средств структуризации данных в языке программиро-вания придается большое значение, так как это крайне существен-но в вопросе оптимизации и надежности программы, безопасности доступа к данным. Механизм контроля типов играет огромную роль в автоматическом диагностировании ошибок.

Любую программу можно рассматривать как описание множе-ства операций, которые необходимо применить к некоторым дан-ным в определенной последовательности. Основные отличия языков программирования друг от друга заключаются в допускаемых типах данных, операциях, применимых к ним, и механизмах управления последовательностью применения операций к данным. Эти три мо-мента — данные, операции и управление — являются центральными в последующем изложении и образуют основу для построения общей методики обучения.

В языках программирования реализованы различные формы данных, которые может определять программист, но в основном это возможности представления числовой, символьной и логической информации. Логическая организация таких данных, называемая в программировании структурой данных, представление в памяти этих структур и управление ими — основные вопросы при разра-ботке сложных программ. При этом очень важен вопрос доступа к элементам структуры, который обязательно должен обсуждаться одновременно с вопросом представления в памяти. Данные неко-торых типов доступны только целиком, например числа, логиче-ские величины, указатели. Такие данные и их типы называются простыми или скалярными. Типы данных, которые разрешают до-ступ к элементам структуры, например, массивы, записи, файлы, списки, называются сложными или структурированными. Разли-чие между простыми и структурированными элементами данных зависит от языка и типа разрешенных операций доступа. Это ка-сается, например цепочки литер, которая может рассматриваться как простой или структурированный элемент данных. С обработ-кой символьных данных тесно связаны данные типа «указатель» или «ссылка». Использование данных этого типа — это возмож-ность организации различных динамических структур. Понимание этих вопросов крайне важно в практическом программировании. Не менее существенно реализованное в языке представление дан-ных на внешнем носителе и организация ввода-вывода данных,

Page 6: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

6

т. е. организация внешних файлов и возможность эффективной работы с ними.

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

Понятие блочной структуры заслуживает специального рассмо-трения. Блочная структура при надлежащей обработке позволяет ис-пользовать чрезвычайно простую и естественную схему управления памятью и обеспечивает весьма гибкий механизм управления данны-ми. Кроме того, блочная структура согласуется со статическим прави-лом для области действия переменных и позволяет получить высоко-эффективные выполняемые программы. Дальнейшее развитие этого понятия в языках программирования нашло в определении модуля как средства организации и использования внешних библиотек.

Современная концепция типа данных отделена от аппаратных возможностей ЭВМ. Тип данных представляет собой абстракцию, определяемую набором логических возможностей. Однако любой абстрактный тип данных и связанные с ним операции нужно реа-лизовать на ЭВМ. Реализация может быть аппаратной или програм-мной, важна возможность такой реализации и то, каким образом это выполнено в конкретном языке программирования. При углублен-ном изучении дисциплины необходимо понимание как абстрактного аспекта вводимых понятий, так и их приложение и реализация. Цель данной книги — ознакомить слушателей с современной концепцией типов и структур данных. Вводятся абстрактные концепции и по-казывается, каким образом они реализованы в конкретном языке и могут быть применены при решении сложных задач.

Для представления абстрактных структур данных используется много различных языков программирования. Однако Паскаль, об-ладая достаточно широкими возможностями, синтаксически безу-пречен и «корректен» с точки зрения организации как простых, так и структурированных типов. Этот язык поддерживает строгий подход к трактовке типа, имеет полный набор структурных типов, что спо-собствует созданию эффективных алгоритмов, а также предоставляет возможность создания новых типов данных.

Page 7: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

При создании больших и сложных программ возникает целый ряд проблем. Первая из них связана с большим размером программы, когда существенное значение имеют средства ее структурирования и инструменты по их использованию. Важно, например, как пред-ставлены подпрограммы: существует ли различие между функциями и процедурами, каков механизм передачи параметров, есть ли воз-можность рекурсивного обращения к подпрограмме. Язык Паскаль обеспечивает использование эффективных средств структуризации программы. Модульное программирование в Паскале используется для создания библиотек и разделения больших программ на логиче-ски связанные модули.

И, наконец, Паскаль — один из наиболее популярных и доступ-ных языков программирования, поддерживает традиционную мето-дологию проектирования программ (нисходящее, модульное проек-тирование, структурное программирование) и, кроме того, содержит средства объектно-ориентированного программирования и объектно-ориентированную оболочку для создания приложений.

Page 8: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

8

Гл а в а 1

ОбрабОтка массивОв данных

1.1. Описание массива

Скалярные (простые) типы данных (целые, вещественные, сим-вольные, логический) имеют два характерных свойства: неделимость и упорядоченность их значений. В Паскале на основе скалярных типов можно определять новые структурированные типы, кото-рые представляют структуры данных — целые наборы значений, организованные определенным образом и выступающие под общим именем. Переменные, представляющие такие структуры, называют-ся структурированными переменными. Числовые наборы принято задавать в виде массивов.

Массив — это упорядоченный набор объектов (например, чисел) одного типа, называемых элементами массива, у каждого из которых имеется его номер в общей последовательности (индекс).

Основные характеристики массива:• имя массива — общее имя, под которым выступают все элемен-

ты массива;• размерность/количество индексов массива — способ организа-

ции его элементов, определяющий их порядок;• размер массива — количество элементов;• тип элементов;• тип индексов.Общая форма описания массива имеет следующий вид:

Var <имя_массива>:array[<тип_индексов>] of<тип_элементов>;

Тип индексов может быть любым порядковым типом, например, целым, символьным или логическим типом, отрезком целого или символьного типа, перечисляемым типом. Использование веще-ственного типа недопустимо, поскольку он не относится к поряд-ковому типу.

Тип элементов массива может быть любым скалярным или струк-турированным, кроме файлового.

Page 9: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

9

Пример 1.1. Описание массива вещественных чисел имеет вид

Var a:array[1..10]of real;

Здесь описан массив с именем a, состоящий из 10 элементов a1, a2, …, a10, каждый из которых является переменной вещественного типа.

1.2. Одномерные массивы

Количество индексов в описании массива определяет число из-мерений массива. Одномерные массивы содержат в описании один индекс и представляют собой линейную последовательность элемен-тов (вектор, линейную таблицу).

Пусть имеется, например, массив чисел Ball, содержащий средний балл успеваемости студентов Иванова, Соколова, Андреева, а также массивы Mas1 и Mas2, содержащие отметки двух групп студентов по математике. Один из вариантов описания данных массивов при-веден в примере 1.2.

Пример 1.2. Описание одномерных массивов имеет следующий вид:

Type {Перечисляемыйтип} Fam=(Ivanov,Sokolov,Andreev); Var Ball:array[Fam]of real; Mas1,Mas2:array[1..30]of integer;

Для массива Ball тип элемента — вещественный, тип индекса пред-ставлен перечисляемым типом. Значением перечисляемого типа может быть идентификатор, пользователь в разделе описания типов указывает имя типа и в скобках значения этого типа. Перечисляемый тип может быть использован в программе как своеобразный комментарий.

Для массивов Mas1 и Mas2 тип элемента — целый, тип индекса пред-ставлен отрезком целого типа.

Выбор отдельного элемента массива осуществляется указанием имени массива, за которым в квадратных скобках следует его индекс/номер, который может быть представлен индексным выражением, в частности константой или переменной. Индексное выражение должно задавать значение, лежащее в диапазоне, определяемом типом индекса. К элементам массива применимы операции и стандартные функции, допустимые для базового типа.

Для данных, рассмотренных в примере 1.2, определив дополни-тельно i, j, k как переменные целого типа, можно записать операто-ры, приведенные далее.

Page 10: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

10

Пример 1.3. Обращение к элементам одномерных массивов

i:=15;j:=20;k:=10; Ball[Ivanov]:=4.35; Mas1[i]:=Mas2[j-k]; Mas[i+1]:=Mas2[k*2+5];

Все операции над массивами (над структурированными пере-менными) в Паскале выполняются поэлементно!

В программе одному массиву может быть присвоено значение другого массива, если их базовые типы и типы индексов совпадают. Так как для массивов Mas1 и Mas2, рассмотренных в примере 1.3, это требование выполняется, то в программе допустим оператор

Mas1:=Mas2;

Пример 1.4. Определить минимальное значение элемента и его но-мер в одномерном массиве из 20 элементов.

Задача может быть решена последовательным сравнением «текущего» минимального значения со значением очередного элемента массива и «запо-минанием» нового минимального значения. Алгоритм показан на рис. 1.1.

Рис. 1.1. Алгоритм определения минимального элемента массива

Page 11: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

11

Программа имеет следующий вид:

{Цель:нахождениеминимальногоэлемента одномерногомассива. } {Метод:минимальногоэлемента. } {Переменные: } {x—исходныймассив; } {n—количествообрабатываемыхэлементовмассива; } {i—параметрцикла; } {xmin—минимальныйэлементмассива; } {imin—егономер. } {Программист:СотковД.Е. } {Дата:10.02.12. } ProgramMinEl; Const Nmax=20; Var i,imin,n:integer; xmin:real; x:array[1..Nmax]of real; Begin{MinEl} WriteLn('Введитеколичествоэлементовмассива'); ReadLn(n); WriteLn('Введите',n:3,'элементовмассива'); fori:=1to n do begin Write('x[',i,']= '); ReadLn(x[i]) end; WriteLn('Вмассиве: '); fori:=1to n do Write(x[i]:6:2); WriteLn; xmin:=x[1]; imin:=1; fori:=2to n do ifx[i]<xmin then begin xmin:=x[i]; imin:=i end; WriteLn('минимальныйэлемент',xmin:6:2, 'сномером',i:3); ReadLn End.{MinEl}

Page 12: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

12

Пример 1.5. Пусть необходимо разработать программу определения количества вхождений каждой строчной буквы латинского алфавита в текст, состоящий из таких букв.

Структурограмма алгоритма решения задачи приведена на рис. 1.2, далее — текст программы.

{Цель:подсчетколичествавхожденийбукввтекст. } {Метод:обработкаодномерногомассива. } {Переменные: } {Stroka—массивсимволов; } {k—массивколичествавхожденийбукв; } {i,x—параметрыциклов; } {n—количествообрабатываемыхсимволов. } {Программист:ФедоровВ.Ф. } {Дата:12.02.12. } ProgramKl; Const Nmax=200; Type Lettre='a'..'z'; Var Stroka:array[1..Nmax]ofLettre; k:array[Lettre]of byte; i,n:byte; x:Lettre; Begin{Kl} WriteLn('Введитеколичествообрабатываемыхсимволов'); ReadLn(n); WriteLn('Введите',n:4,'латинскихбукв'); fori:=1to n do Read(Stroka[i]); ReadLn; WriteLn('Ввашемтексте:'); fori:=1to n do Write(Stroka[i]);{Эхо-печать} WriteLn;

Рис. 1.2. Алгоритм подсчета количества букв, входящих в текст

Page 13: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

13

{Обнулениемассиваk} forx:='a'to 'z' do k[x]:=0; {Подсчетколичествасимволов} fori:=1to n do Inc(k[Stroka[i]]); {Выводрезультата} forx:='a'to 'z' do WriteLn('числобукв',x:2,'равно',k[x]:4); ReadLn End.{Kl}

Распространенным классом задач обработки одномерных масси-вов является их сортировка. Рассмотрим такой пример.

Пример 1.6. Имеется массив A, содержащий n элементов. Разместить элементы массива в порядке возрастания их значений.

При решении этой задачи воспользуемся сортировкой по методу пу-зырька. Суть этого метода состоит в организации упорядоченного спи-ска элементов, в который один за другим на соответствующие им места добавляются элементы из неотсортированной части массива. Алгоритм сортировки одномерного массива методом пузырька дан на рис. 1.3. Текст программы имеет следующий вид:

{Цель:сортировкаэлементоводномерногомассива } {впорядкевозрастанияихзначений. } {Метод:сортировкамассиваметодомпузырька. } {Переменные: } {a—исходныймассив; } {n—количествообрабатываемыхэлементовмассива; } {i,k—параметрыциклов; } {x—вспомогательнаяпеременная. } {Программист:СвиридовЕ.П. } {Дата:13.02.12. } ProgramSort; Var a:array[1..100]of real; i,k,n:integer; x:real; Begin{Sort} WriteLn('Задайтеколичествоэлементовмассива'); Readln(n); WriteLn('Введите',n,'чисел'); fori:=1to n do Read(a[i]); ReadLn; WriteLn;

Page 14: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

14

{Эхо-печать} WriteLn('Исходныймассив:'); fori:=1to n do Write(a[i]:7:2); WriteLn; {Сортировкамассива} fori:=1ton-1do fork:=idownto 1 do ifa[k]>a[k+1] then begin x:=a[k]; a[k]:=a[k+1]; a[k+1]:=x end;

Рис. 1.3. Алгоритм сортировки массива методом пузырька

Page 15: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

15

{Выводрезультата} WriteLn('Отсортированныймассив:'); fori:=1to n do Write(a[i]:7:2); ReadLn End.{Sort}

1.3. двумерные массивы

Если число индексов в описании массива равно N, то массив на-зывается N-мерным. В языке Паскаль не накладываются ограниче-ния на число измерений массива. Однако на практике наиболее ча-сто используются двумерные массивы, соответствующие понятию матрицы (прямоугольной таблице).

Многомерные массивы представляют собой абстракцию. Память в вычислительных устройствах имеет линейную структуру, и одно-мерные массивы однозначно отображаются на линейную структуру памяти ЭВМ. Элементы массива располагаются в памяти последо-вательно друг за другом, под каждый элемент память выделяется со-гласно типу этого элемента. Многомерные массивы также хранятся в памяти в виде линейных последовательностей их элементов, однако это отображение неоднозначно. Так, двумерный массив может рас-полагаться в памяти как «по строкам», так и «по столбцам», что за-висит от компилятора данного языка программирования.

Рассмотрим матрицу А, состоящую из двух строк и трех столбцов (2 × 3 элемента):

Аа а а

а а а=

11 12 13

21 22 23

.

Элементы матрицы могут быть размещены в памяти ЭВМ «по строкам», формируемая при этом последовательность будет a11, a12, a13, a21, a22, a23. Такой способ размещения элементов характерен для языка Паскаль. Расположение элементов массива «по столбцам» привело бы к последовательности a11, a21, a12, a22, a13, a23.

В языке Паскаль многомерный массив можно описать как одно-мерный, элементами которого являются массивы. Описание матрицы А, рассмотренной ранее, дано в примере 1.7.

Пример 1.7. Описание двумерного массива имеет следующий вид:

Type stroka = array[1..3]of integer; matr = array[1..2]of stroka; Var V:stroka; A:matr;

Page 16: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

16

В данном случае переменная V объявлена как одномерный массив из трех элементов целого типа. Переменная A имеет смысл двумерного массива из двух строк, в каждую из которых включено по три элемента.

Приведенное в примере 1.7 описание массива A можно сократить, исключив описание типа Stroka в определении типа Matr:

Type matr = array[1..2]of array[1..3]of integer; Var A:matr;

Еще более краткое описание можно получить, указывая имя мас-сива и диапазоны изменения индексов для каждого его измерения:

Type matr = array[1..2,1..3]of integer; Var A:matr;

Описание массива можно также поместить непосредственно в раз-деле описания переменных:

Var A:array[1..2,1..3]of integer;

Ссылка на элемент матрицы А, лежащий на пересечении i-й строки и j-го столбца, может иметь такой вид: А[i][ j] или А[i, j].

Для массивов, описанных в примере 6, можно записать следую-щие операторы:

v[i]:=a[i,j]+2; a[i,j]:=v[k]+a[k,j];

при условии, что индексные переменные i, j и k лежат в допустимых для них диапазонах.

Кроме оператора присваивания значения элементам массива мож-но задать с помощью процедуры ввода данных. Ввод-вывод массива в языке Паскаль осуществляется поэлементно (в цикле/вложенных циклах). При вводе значения элементов массива отделяются друг от друга пробелом или символом возврата каретки/перевода стро-ки. Программа, осуществляющая ввод-вывод вектора целых чисел V, двумерного массива MAS и символьных массивов S1 и S 2, приведена в примере 1.8. Вектор V содержит всего три элемента, поэтому в опе-раторах ввода-вывода просто перечислены его компоненты.

Пример 1.8. Ввод-вывод одно- и двумерных массивов имеет сле-дующий вид:

{Цель:ввод-выводмассивов. } {Метод:поэлементныйввод-вывод. }

Page 17: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

17

{Переменные: } {pr5—строковаяконстантаизпятипробелов; } {vector—типмассивацелыхчисел; } {stroka—типсимвольногомассива; } {v—одномерныймассивцелыхчисел; } {mas—двумерныймассивцелыхчисел; } {s1,s2—символьныемассивы; } {i,j—параметрыциклов. } {Программист:СеминИ.Р. } {Дата:15.02.12. } ProgramVvod_Vyvod_mas; Const pr5=''; Type vector = array[1..3]of integer; stroka = array [1..10]of char; Var v:vector; mas:array[1..2]of vector; s1,s2:stroka; i,j:integer; Begin{Vvod_Vyvod_mas} {вводмассивов} WriteLn(pr5,'введитемассивv'); ReadLn(v[1],v[2],v[3]); WriteLn(pr5,'введитемассивmas'); fori:=1to 2 do forj:=1to 3 do Read(mas[i,j]); Readln; WriteLn(pr5,'введитеs1иs2'); fori:=1to 10 do Read(s1[i]); Readln; fori:=1to 10 do Read(s2[i]); ReadLn; {выводмассивов} WriteLn; WriteLn(pr5,'массивv'); WriteLn(pr5,v[1]:5,v[2]:5,v[3]:5); WriteLn(pr5,'массивmas'); fori:=1to 2 do begin WriteLn; for j:=1to 3 do

Page 18: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

18

Write(pr5,mas[i,j]:5); end; WriteLn; Write(pr5,'s1='); fori:=1to 10 do Write(s1[i]); Write(pr5,'s2='); for i:=1to 10 do Write(s2[i]); ReadLn End. {Vvod_Vyvod_mas}

Результат работы программы:

массивv 1 2 3 массивmas 4 5 6 7 8 9 s1=abcdefgijks2=lmn

Для ввода-вывода двумерного массива использованы вложенные циклы, осуществляющие ввод-вывод элементов по строкам. В качестве символьных данных вводились 13 букв латинского алфавита. При длине строк S1 и S 2, равных 10 байт, первая строка заполнилась полностью, а во вторую из входного потока было прочитано три символа, и строка была дополнена пробелами.

1.4. Примеры программ с использованием массивов

Представление данных в виде массива является целесообразным, а в некоторых случаях и единственно возможным, при решении многих практических задач (операции с векторами и матрицами, вычисление таблицы значений функции с нерегулярным изменением аргумента, сортировка результатов наблюдения случайных процессов и т. д.). Для обработки числовых табличных данных удобным средством являются двумерные массивы. Рассмотрим примеры решения таких задач.

Пример 1.9. Составить алгоритм и программу вычисления скаляр-ного произведения S двух векторов v и u, состоящих из пяти элементов каждый, по формуле

S v uii

i==∑

1

5

.

Вычислить длину Dv вектора v по формуле

D vv ii

==∑ 2

1

5

.

Page 19: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

19

Блок-схема алгоритма приведена на рис. 1.4, а далее — текст про-граммы.

{Цель:определениедлинывектораDlnискалярного } {произведенияSдвухвекторов. } {Параметрыипеременные: } {v,u—одномерныемассивы(векторы); } {Dln,S—переменныедлярезультатов; } {i,j—вспомогательныепеременные. } {Программист:СтасовК.Т. } {Дата:17.02.12. } ProgramSkalar; Const pr3=''; nmax=10;

Рис. 1.4. Алгоритм вычисле-ния длины вектора и скаляр-ного произведения двух век-торов

Page 20: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

20

Var u,v:array[1..nmax]of real; Dln,S:real; i,j,n:integer; Begin {Skalar} WriteLn(pr3,'введитеразмермассивов'); Readln(n); WriteLn(pr3,'введитемассивыvиuразмера',n); fori:=1to n do Read(v[i],u[i]); ReadLn; WriteLn(pr3,'исходныеданные'); WriteLn(pr3,'массивv'); fori:=1to n do Write(pr3,v[i]:7:3); WriteLn; WriteLn(pr3,'массивu'); fori:=1to n do Write(pr3,u[i]:7:3); WriteLn; S:=0; Dln:=0; fori:=1to n do begin S:=S+v[i]*u[i]; Dln:=Dln+v[i]*v[i] end; Dln:=Sqrt(Dln); WriteLn; WriteLn(pr3,'результатывычислений'); WriteLn; WriteLn(pr3,'скалярноепроизведение—',s:12); WriteLn(pr3,'длинавектораv—',Dln:12); ReadLn End. {Skalar}

Результат работы программы:

исходныеданные массивv 1.100 1.300 3.400 4.100 3.300 массивu 1.200 2.500 3.700 4.200 5.100 результатывычислений скалярноепроизведение—5.120000е+01 длинавектораv—6.493070e+00

Page 21: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

21

В примере 1.9. максимальный размер индекса nmax массивов v и u задан в разделе описания констант. Если размеры массивов из-меняются, то достаточно будет ввести новое значение переменной n, не изменяя остальной части программы. Элементы векторов v и u вводятся парами в цикле ввода. В цикле вычислений происходит на-копление сумм для вычисления скалярного произведения S и длины вектора Dln. В заключительной части программы осуществляется вывод результатов вычислений.

Пример 1.10. Для данной матрицы, размер которой не превышает 10 × 10 элементов, найти максимум среди сумм элементов диагоналей, параллельных главной. Блок-схема алгоритма вычислений приведена на рис. 1.5. Далее приведен текст программы.

Для вычисления сумм элементов диагоналей в программе зарезерви-рован массив S. Если размер исходной матрицы А равен n × n, то в ней содержится 2n - 1 диагоналей, параллельных главной (включая главную диагональ). Ввод элементов матрицы А осуществляется после ввода пере-менной n, определяющей размер данной матрицы. По условию задачи n должно быть не больше 10. Перед вычислениями осуществляется об-нуление элементов массива S.

{Цель:длязаданнойматрицынайтимаксимумсредисумм } {элементовдиагоналей,параллельныхглавной. } {Параметрыипеременные: } {A—двумерныймассивдляисходнойматрицы; } {S—одномерныймассивдлясуммдиагональныхэлементов;} {max—максимальнаясумма. } {Прoграммист:ЛаринВ.И. } {Дата:15.03.12. } Program SumDg; Const pr3=''; Var A:array[1..10,1..10]of integer; S:array[1..20]of integer; i,j,k,n,max:integer; Begin {SumDg} WriteLn(pr3,'введитечисло<=10,характеризующее', 'размерностьматрицы'); Readln(n); WriteLn(pr3,'введитеисходнуюматрицуиз',n*n:5, 'элементов'); for i:=1to n do for j:=1to n do Read(a[i,j]); Readln; Writeln(pr3,'исходнаяматрица');

Page 22: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

22

for i:=1to n do begin for j:=1to n do Write(a[i,j]:5); WriteLn end; {***вычислениесуммдиагональныхэлементов***} k:=2*n-1;

Рис. 1.5. Алгоритм вычисления сумм диагональных элементов

Page 23: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

23

for i:=1to k do s[i]:=0; for i:=1to n do for j:=1to n do s[n-i+j]:=s[n-i+j]+a[i,j]; {***определениемаксимальнойсуммы***} max:=s[1]; for i:=2to k do if s[i]>max then max:=s[i]; WriteLn(pr3,'результатывычислений'); WriteLn(pr3,'суммыдиагональныхэлементов'); for i:=1to n do Write(s[i]:5); WriteLn; for i:=n+1to k do Write(s[i]:5); WriteLn; WriteLn(pr3,'максимальнаясуммадиагональных', 'элементов',max:5); ReadLn End. {SumDg}

Для вычисления сумм диагональных элементов организован вложенный цикл для просмотра всех элементов исходной матрицы А. Нужный индекс элемента массива S определяется выражением n - i + j. После формирова-ния массива S определяется его максимальный элемент: сначала перемен-ной max присваивается значение первого элемента массива, а затем в цикле просматриваются все остальные элементы, и если значение какого-либо элемента массива S превысило значение переменной max, то последней присваивается это новое значение. В заключительной части программы осуществляется вывод элементов исходной матрицы А, сформированного массива сумм диагональных элементов S и максимального элемента массива max. Для контрольного просчета была выбрана матрица размером 7 × 7.

Результаты вычислений приведены далее.

введитечисло<=10,характеризующееразмерностьматрицы 7 введитеисходнуюматрицуиз49элементов исходнаяматрица 1 2 3 4 5 6 7 11 12 13 14 15 16 17 21 22 23 24 25 26 27 31 32 33 34 35 36 37 41 42 43 44 45 46 47 51 52 53 54 55 56 57 61 62 63 64 65 66 67

Page 24: ПроГраммИроВаНИе - academia- · PDF fileПроГраммИроВаНИе ... в том числе структурное и объектно-ориентированное

24

результатывычислений суммыдиагональныхэлементов 61 113 156 190 215 231 238 177 125 82 48 23 7 максимальнаясуммадиагональныхэлементов238

Пример 1.11. Пусть необходимо найти произведение двух матриц А и В размером 2 × 3 и 3 × 3 соответственно.

Элементы результирующей матрицы С (размером 2 × 3) определяют-ся по формуле

cij ik kjk

m

a b==

∑ ,1

i = 1, 2, …, n, j = 1, 2, …, p,

где m — число столбцов матрицы А и число строк матрицы В; n — чис-ло строк матрицы А; p — число столбцов матрицы В. В общем случае результирующая матрица имеет размер n × p.

Алгоритм умножения двух матриц представлен на рис. 1.6. Програм-ма имеет следующий вид:

{Цель:Определениепроизведенияматриц. } {Переменные: } {a,b—исходныедвумерныемассивы(матрицы); } {с—произведениематриц; } {S—вспомогательнаяпеременная; } {i,j,k—параметрыциклов; } {n—числострокматрицыa; } {m—числостолбцовматрицыaистрокматрицыb; } {p—числостолбцовматрицыb. } {Программист:СергеевТ.И. } {Дата:19.02.12. } ProgramMult; Const Nmax=10; Type Matr = array[1..Nmax,1..Nmax]of integer; Var a,b,c:Matr; i,j,k,m,n,p,S:integer; Begin{Mult} WriteLn('ВведитечислострокматрицыA:'); ReadLn(n); WriteLn('столбцов:'); ReadLn(m); WriteLn('истолбцовматрицыB:'); ReadLn(p); {ВводэлементовматрицыА} WriteLn('Введите',n×m:4,'элементовматрицыA:');