Федеральное агентство по образованию ГОУ ВПО «Уральский государственный технический университет – УПИ» ПРАКТИЧЕСКАЯ РАБОТА В ИНТЕГРИРОВАННОЙ СРЕДЕ TURBO PASCAL Методические указания к лабораторным работам по курсу «Информатика» для студентов всех форм обучения всех специальностей Екатеринбург 2007 УДК 004.43 Составитель Т.И. Полупанова Научный редактор канд. тех. наук. И.Н. Обабков Практическая работа в интегрированной среде Turbo Pascal: методические указания к лабораторным работам / Т.И. Полупанова. – Екатеринбург : ГОУ ВПО УГТУ–УПИ, 2007. – 41 с. Методические указания предназначены для студентов, изучающих базовый курс «Информатика», и отражают раздел дисциплины «Программирование». В указаниях представлен перечень лабораторных работ, позволяющих освоить этапы работы в интегрированной среде Turbo Pascal. Библиогр.: 6. Рис. 5. Табл. 10. Подготовлено кафедрами «Интеллектуальные информационные технологии», «Вычислительная техника». © ГОУ ВПО «Уральский государственный технический университет – УПИ», 2007 1. Простые приемы отладки программ 1.1. Алгоритм вычисления квадратного корня методом Герона Приемы работы в интегрированной среде Turbo Pascal рассмотрим на примере простой задачи: вычисление квадратного корня из произвольного положительного числа методом Герона. Метод основан на многократном применении формулы z n +1 = 1 x ( z n + ) при начальном значении z0 =1. 2 zn Считается, что 5-6 итераций достаточно для достижения хорошей точности результата. Алгоритм вычисления квадратного корня на естественном языке включает следующие шаги. 1. Ввести с клавиатуры положительное число x. 2. Присвоить результату z начальное приближение, равное 1. 3. Переменной i (номер итерации) присвоить значение, равное 0. 4. Перейти к следующему шагу итерации: i = i + 1. 5. Вычислить квадратный корень по формуле: z = (z + x/z)/2. 6. Если i < 6, то перейти к пункту 4, иначе вывести число x и результат z. Этот алгоритм решения задачи наглядно представлен в виде структурной схемы, табл. 1.1. Выполнив этап разработки алгоритма решения задачи, можно перейти к его кодированию – записи программы, табл. 1.1. 1.2. Набор и компиляция программы Интегрированная среда Turbo Pascal объединяет текстовый редактор, компилятор и отладчик. Среда формируется файлом turbo.exe, а сам файл turbo.exe, как правило, можно найти в каталоге C:\TP\BIN. Набор и редактирование текста программы производится средствами встроенного текстового редактора интегрированной среды. Создание новой программы происходит следующим образом. После запуска интегрированной среды на экране должно появиться пустое активное окно редактирования. Если появившееся окно не пустое, то с помощью команды File ► New следует 3 активизировать окно ввода нового текста. В верхней части окна редактирования появится имя noname00.pas, которое интегрированная среда автоматически присваивает новому файлу. Надо обязательно изменить имя файла, иначе есть опасность потерять его, если он случайно будет замещен другим файлом с таким же стандартным именем. Таблица 1.1 Этапы вычисления квадратного корня Структурная схема алгоритма Н ачало x i=0 1 z=1 i=i+1 ( z=(z+x /z)/2 нет да i>6 x, z К онец Тест для задачи x 0.0169 z 0.13 Листинг program geron; var {описание переменных задачи} x,z:real; {Переменные действительного типа} i:integer; {Переменная целого типа} begin writeln('Введите число x'); readln (x); {ввод в форме «запрос – ответ»} i:=0; z:=1; repeat{начало цикла} i:=i+1; z:=(z+x/z)/2 until i>6; {конец цикла} writeln('x=', x:15:8,' z=',z:8:5) {Вывод на экран числа x и результата z. Под число x отведено 15 позиций на экране, из которых под дробную часть – 8, под число z – соответственно 8 и 5 позиций. Вводимые данные сопровождены пояснениями: 'x=' и ' z='}. end. Задание 1. Запустите программу Turbo Pascal в соответствии с рекомендациями преподавателя. Сохраните пустой файл (клавиша F2). Задайте имя файла в открывшемся диалоговом окне, например, mfirst. Расширение .pas автоматически задается средой. Задание 2. Наберите текст программы, соответствующей нашему алгоритму, табл. 1.1. Комментарии к программе (текст в фигурных скобках) опустите. Через каждые 5-10 набранных строк периодически производите сохранение файла, так как всегда имеется вероятность аварийной ситуации в работе компьютера, после которой не сохраненный на диске файл будет потерян. 4 Задание 3. После завершения набора программы приступите к компиляции (клавиша F9). Компилятор обнаруживает допущенные при вводе синтаксические ошибки с выдачей соответствующего сообщения о них. Курсор, как правило, устанавливается в той строке программы, где обнаруживается ошибка. Откорректируйте текст программы в соответствии с обнаруженными ошибками. Исправленную программу сохраните, нажав клавишу F2. Результатом успешной компиляции является файл с расширением .exe, а имя его совпадает с именем исходного файла. По умолчанию этот файл размещается в оперативной памяти. 1.3. Верификация программы Однако работа над программой не закончена. Надо выяснить, правильно ли составлен алгоритм, нет ли скрытых и логических ошибок в программе, в каких пределах изменения числа x результат вычисления является правильным. Такое доказательство работоспособности программы называется верификацией (тестированием). Для этапа верификации разрабатывается система тестов со специально подобранными параметрами, для которых задача может быть решена точно. Первый тест для программы выберем самый простой, табл. 1.1. Задание 4. Запустите программу на выполнение (команда Run ► Run или комбинация клавиш Ctrl-F9). На экране появится окно пользователя, в котором отображается текст подсказки (введите число x): программа ожидает ввода данных по оператору readln(x). Следуя подсказке, введите число x, используя подобранный пример, табл. 1.1. В экспоненциальной форме вещественное число набирается так: 1.69e-2. Нажмите клавишу Enter – программа выполнится автоматически, а система вернется в окно редактирования. Задание 5. Познакомьтесь с результатами работы программы в окне пользователя. Для этого нажмите комбинацию клавиш Alt-F5. На экране монитора появятся результаты работы: x=0.0169 z=0.13. Итак, мы получили верный результат – скрытых и логических ошибок в программе нет. Теперь выясним, в каком диапазоне изменения исходных данных 5 работает алгоритм. Для этого составим набор данных, для которых результат известен точно, табл. 1.2. Задание 6. Перейдите в окно редактирования нажатием любой клавиши. Проведите верификацию программы в соответствии с нижеследующей таблицей. Заполните эту таблицу в рабочей тетради. Установите, для каких значений переменной x предложенный алгоритм является справедливым. Таблица 1.2 Контрольные примеры для тестирования № теста Значение x Известное решение Результат тестирования 1 2 3 4 5 6 7 1,69ּ10-6 1,69ּ10-4 1,69ּ10-2 1,69 1,69ּ102 1,69ּ104 1,69ּ106 1,3ּ10-3 1,3ּ10-2 1,3ּ10-1 1,3 13 1,3ּ102 1,3ּ103 Предъявите работу преподавателю. Итог вашей работы: программа может правильно вычислять квадратный корень из положительного числа, меняющегося в пределах примерно от 10-4 до Таблица 1.3 Трассировочная таблица для числа 1,69 10-4 i 0 1 2 2 4 5 6 7 8 9 z 1,00000 0,50008 0,25021 0,12544 0,06339 0,033031 103. Изменим алгоритм решения задачи. Мы можем поступить двояко. Первый путь – это кардинально изменить алгоритм, задав требуемую точность вычислений результата z. Второй путь – это увеличение числа итераций. Произведем отладку алгоритма, используя второй путь. Выберем в качестве контрольного примера тот, для которого на предыдущем этапе тестирования был получен неправильный результат (x = 1,69·10-4). При этом заполним трассировочную таблицу. Каждый столбец такой таблицы соответствует определенной переменной, а каждая строка – одному шагу алгоритма, табл. 1.3. Для заполнения таблицы необходимо шаг за шагом проследить выполнение алгоритма, записывая в таблицу текущие значения выбранных для трассировки 6 переменных. Пошаговое выполнение программы с просмотром значений различных переменных позволяет сделать интегрированный отладчик Turbo Pascal. Задание 7. Измените в тексте программы условие until i>6 на until i>8. Для запуска сеанса отладки выберите команду Run ►Trace Into (клавиша F7). При этом программа вначале компилируется, а затем начинается ее пошаговое выполнение. Каждый шаг заключается в выполнении очередной строки операторов, и происходит он при нажатии на клавишу F7. На время отладки включите окно просмотра изменения переменных (команда Debug ► Add Watch или комбинация клавиш Ctrl-F7). В появившемся окне наберите имя переменной, текущее значение которой необходимо узнать. В нашем случае это i. Для добавления второй переменной z повторно используйте команду Add Watch. Составьте трассировочную таблицу для вычисления квадратного корня из числа 1,69ּ10-4, табл. 1.3. Часть таблицы уже заполнена. Вам осталось заполнить в рабочей тетради только несколько строк и сделать вывод о правомерности нового алгоритма. Предъявите работу преподавателю. Завершите работу в среде нажатием клавиш Alt-X. 1.4. Контрольные вопросы 1. Как в среде Turbo Pascal запустить программу на выполнение? 2. Как познакомиться с результатами работы программы? 3. Как запустить сеанс отладки программы? 4. Как узнать текущее значение переменной при выполнении программы? 5. Как называется унифицированная структура, использованная в алгоритме? 7 2. Программирование алгоритмов линейной структуры 2.1. Ядро языкаTurbo Pascal 2.1.1. Идентификаторы Неделимые последовательности символов алфавита языка образуют слова – идентификаторы, используемые для обозначения констант, переменных, функций и т.д. Идентификатор строится из букв латинского алфавита (в любом регистре), цифр и символа подчеркивания. Он должен начинаться с буквы или символа подчеркивания. Пример идентификатора: _SUM1. 2.1.2. Константы В качестве констант могут использоваться числа, логические константы, символы и строки символов. Целые числа записываются со знаком или без него по обычным правилам. Вещественные использованием числа записываются десятичной точки со и/или знаком или без экспоненциальной него с части. Экспоненциальная часть начинается символом е (Е), за которым могут следовать знаки «+» или «-» и десятичный порядок. Символ Е означает «умножить на 10 в степени». Например, запись 3.14Е5 означает 3,14·105, а запись 17е-2 – это 17·10-2. Логическая константа – это слово false (ложь) либо слово true (истина). Символьная константа – это любой символ, заключенный в апострофы, например: 'z' – символ z. Строковая константа – последовательность символов, заключенная в апострофы. В качестве примера приведем строковую константу из предыдущей работы: 'Введите число x'. 2.1.3. Понятие арифметического выражения Арифметическое выражение содержит один или несколько операндов, которые связаны между собой знаками арифметических операций и сгруппированы в круглые скобки. Операндом может быть имя переменной, ссылка на функцию, константа. При отсутствии скобок выражения вычисляются слева направо. Сначала выполняются операции с высоким приоритетом, затем — с низким приоритетом. 8 Арифметические операции одного уровня старшинства группируются в порядке убывания приоритета групп следующим образом: * – умножение; / – деление; div – деление нацело (с отбрасыванием дробной части); mod – целый остаток от деления; + – сложение; - – вычитание. В языке Turbo Pascal используются следующие арифметические функции: abs(выражение) – модуль выражения; sqr(выражение) – квадрат выражения; sqrt(выражение) – квадратный корень; ln(выражение) – натуральный логарифм; exp(выражение) – экспонента; sin(выражение) – синус угла, измеренного в радианах; cos(выражение) – косинус угла, измеренного в радианах; arctan(выражение) – арктангенс в радианах. В языке отсутствует операция возведения в степень, поэтому ее приходится выполнять, используя различные приемы. Так, если показатель степени не слишком большое натуральное число, можно комбинировать умножение и функцию SQR. В общем случае, когда в выражении ab показатель b – вещественное число, можно использовать логарифмическое тождество ab =ebּln(a). 2.1.4. Оператор присваивания Структура оператора присваивания такова: <имя переменной>:=<выражение>; Здесь знак := обозначает операцию присваивания. Имя переменной и конкретное выражение определяет пользователь в соответствии с синтаксисом языка1. В результате выполнения операции переменной в левой части присваивается значение выражения правой части оператора. 1 Здесь и далее конструкция, представленная формой<пояснение>, означает, что ее формирует пользователь. 9 2.1.5. Процедуры ввода и вывода Ввод информации обеспечивают процедуры read (список переменных); readln (список переменных); В соответствии с их работой каждое вводимое с клавиатуры значение последовательно присваивается очередной переменной из списка. Процедура readln после чтения последнего вводимого значения переводит курсор в начало следующей строки экрана. Вывод информации обеспечивают две процедуры: write (список выражений); writeln (список выражений); Они работают одинаково: последовательно выводят на экран значения выражений, указанных в списке. Только вторая процедура после вывода последнего выражения переводит курсор в первую позицию следующей строки. Кроме значений выражений, на печать можно выводить и произвольный набор символов, заключенный в апострофы. Размещение данных на экране достигается при помощи форматированного вывода. Форматированный вывод позволяет выделить на экране каждому значению определенное число позиций (ширину поля). Например, для вещественного числа следует записать конструкцию write(выражение:w:d). Здесь w – общая ширина поля вывода значения выражения, d – точность или ширина дробной части значения. В качестве примера приведем форматированный вывод из предыдущей работы: writeln('x=', x:15:8); Эта процедура выполняется так: сначала выводятся символы, заключенные в апострофы (пояснение к результату), затем выводится значение переменной x. 2.1.6. Простые типы данных Любые данные, т. е. константы, переменные, значения функций или выражения в языке Turbo Pascal характеризуются своими типами. Тип определяет множество допустимых значений, которые может иметь тот или иной объект, а 10 также множество допустимых операций, которые применимы к нему. Все типы данных разделяются на две группы – простые и составные. К простым (скалярным) типам относятся: integer – данные этого типа могут принимать только целые значения (положительные, отрицательные, 0) в диапазоне от –32768 до +32767; real – величины этого типа могут принимать только вещественные значения; boolean – логический тип, принимает два значения true (истина) и false (ложь); char – данные этого типа могут принимать значение одного символа. Все переменные должны быть объявлены в разделе описания var так: var <список имен>:<тип>; В качестве примера приведем описание переменных из предыдущей работы: var x,z:real; 2.2. Структура программы на Паскале Типичная программа на Паскале в упрощенном варианте имеет следующую структуру (в фигурных скобках указывается комментарий к программе). PROGRAM <имя>; {заголовок программы} USES <подключаемые библиотеки>; TYPE <имя>=<тип>; {объявление типа, отличного от стандартного} CONST <имя>=<значение>; {объявление постоянных, представленных именем} VAR <список имен>:<тип>; {объявление переменных} {далее записывается блок выполняемых операторов} BEGIN {начало блока операторов} <оператор>; <оператор>; ... <оператор> {перед end точку с запятой можно не ставить} END. {конец программы – завершается точкой!} 11 Обратите внимание на то, что все конструкции заканчиваются точкой с запятой. Все выделенные слова являются зарезервированными. 2.3. Пример программы «Банкир» Некто, обладая суммой s, открыл счет в банке под процент p на n лет. Месячная выплата m по займу вычисляется по формуле: m=sּrּ(1+r)n/(12((1+r)n-1)), r=p/100. Вычислить m по известным значениям s, p, n. Представим алгоритм решения такой задачи в виде структурной схемы, тест для его верификации и программу, табл. 2.1. Таблица 2.1 Этапы решения задачи «Банкир» Структурная схема алгоритма Листинг Начало s, p, n r=p/100 a=(1+r)n m=s·r·a/(12(a – 1)) s, p, n, m Конец Тест для задачи s p 100000 10 n 2 m 894,97 program loans; var p,s, r,a:real; n:integer; begin writeln('Введите заем s, процент p, число лет n'); read(s,p,n); r:=p/100; a:=exp(ln(1+r)*n);{возведение в степень через ln} m:=(s*r*a)/(12*(a-1)); writeln;{начинает новую строку} write(' Взято $',s:5:2); write(' под',p:5:2,'%');{печать числа в поле из 5 позиций с двумя знаками после десятичной точки} write(' на ',n:5:2,' лет'); writeln; write('Месячная выплата $', m:5:2); writeln end. 2.4. Индивидуальные задания к лабораторной работе 1. Домашнее задание. Построить структурную схему алгоритма вычисления арифметического выражения z = f(x). Для этапа верификации разработать простой тест. Составить программу. Размещение исходных данных и результата на экране произвести при помощи форматированного вывода, выводимые значения 12 сопроводить пояснениями. В данной работе под число x можно отвести 6 позиций на экране, из которых под дробную часть – 3. Под число z можно отвести 8 позиций на экране, из которых под дробную часть – 5. 2. Предъявить преподавателю вышеперечисленные этапы работы, оформленные в рабочей тетради. 3. Произвести отладку программы в компьютерном классе. Предъявить результаты тестирования программы преподавателю. Оформить отчет. Таблица 2.2 № 1 Список вариантов f(x) № 14 sin x − 5 sin x 2 3 4 5 6 sin x − 0,75 sin x sin x sin x − 3 sin x sin x − 5 sin x − 2 4 sin x sin x sin x − 3 f(x) cos x − 3 4 cos x 15 ex e x − e−x 16 e x − e−x ex 17 e x + e−x ex 18 2x 2 x − 2−x 19 2 x − 2−x 2x 7 cos x − 4 cos x 20 2 x + 2−x 2x 8 sin x − 0,8 sin x 21 sin x sin x − 5 9 cos x cos x − 3 22 sin x − 0,75 cos x 10 sin x − 0,75 cos x − 3 23 cos x − 1,75 cos x 11 cos x cos x − 5 24 cos x − 3,75 cos x 12 sin x − 3 sin x 25 e x + e−x +1 ex 13 sin x − 0,9 sin x 26 e x + e−x −1 ex 13 2.5. Контрольные вопросы 1. Как в программе на языке Turbo Pascal описываются переменные? 2. Найдите строковую константу в примере программы. 3. Какой вид имеет оператор присваивания? 4. Каким символом отделяются друг от друга операторы в программе? 5. Какая процедура служит для вывода информации на печать? 6. Какая процедура служит для ввода значений с клавиатуры? 8. Какие арифметические функции используются в языке? 3. Программирование алгоритмов разветвляющейся структуры 3.1. Логические выражения Логическое выражение (ЛВ) в программировании используется как средство записи условий, по которым в программе организуется передача управления. ЛВ строится из операндов логического типа, соединенных знаками логических операций: not, and, or (расположены по старшинству операций) и знаками отношений (=, <>, <, <=, >, >=). Операндами логических выражений могут быть константы и переменные логического типа. Переменные логического типа в программе объявляются так: var <список имён>: boolean; Операции отношения вырабатывают результат логического типа. Например, логическое выражение -6 > 6 при вычислении принимает значение false. Логические операции вырабатывают также результат логического типа в соответствии с их определением, например: <TRUE> and <TRUE> = <TRUE> <TRUE> and <FALSE> = <FALSE>. да нет Условие Действие1 Действие2 3.2. Условный оператор Условный оператор используется, когда в алгоритме решения задачи предусмотрены унифицированные структуры: развилка полная и да Условие нет Действие 14 Рис. 3.1. Развилки полная и неполная неполная, реализующие альтернативные пути решения, рис. 3.1. Для реализации полной развилки используется условный оператор в форме: if <условие> then <оператор_1> else <оператор_2>; Здесь if, then, else – зарезервированные слова (если, то, иначе). В качестве оператора используется любой оператор языка. Условный оператор работает по следующему алгоритму. Вначале вычисляется условие. Если результат true, то выполняется оператор_1, если результат false, то – оператор_2. Затем (в обоих случаях) управление передается к следующему оператору. Для реализации неполной развилки используется условный оператор в форме: if <условие> then <оператор>; 3.3. Составной оператор Если при некотором условии надо выполнить определенную последовательность операторов, то их объединяют в один составной оператор: begin <оператор_1>; <оператор_2>; ...; <оператор_n> end; 3.4. Оператор выбора Для выбора одной из нескольких альтернатив используется унифицированная структура «выбор» (рис. 3.2), а в языке ей соответствует оператор выбора (варианта). Данный оператор является обобщением условного оператора для случая произвольного числа k k1 S1 k2 kn S2 …. Sn 15 Рис. 3.2. Структура выбора альтернатив и имеет следующий синтаксис: case <селектор> of <список значений_1>: <оператор_1>; <список значений_2>: <оператор_2>; ... <список значений_n : <оператор_n> end; Селектором может служить выражение любого упорядоченного типа, например, integer, char и т. д. (тип real не является упорядоченным). Элементы списка значений являются константными значениями, которые может принимать селектор. В качестве оператора используется любой оператор языка. В зависимости от значения селектора управление передается на одну из альтернативных ветвей. 3.5. Примеры программ 1. Составить программу для вычисления значения функции x1/2 , если x ≥ 1 y(x) = x1/3 , если 0 <x < 1 |x|1/4 ,если x < 0 Алгоритм решения такой задачи и программа представлены в табл. 3.1. Здесь же приведены данные для проверки работы трех ветвей вычислений. Таблица 3.1 Этапы вычисления значений функции y(x) Структурная схема алгоритма Листинг 16 Начало x x≥ 1 y= x1/2 нет x> 0 y= x1/3 y= |x|1/4 x, y Конец program f_3wetwi; Uses Crt; {подключение модуля, управляющего выводом на экран} var x,y:real; begin writeln('Введите x'); read(x); ClrScr; {очистка экрана после ввода данных} if x>=1 then y:=sqrt(x) else if x>0 then y:=exp(1/3*ln(x)) else y:=sqrt(sqrt(abs(x))); writeln('x=',x :8:2, ' y=',y :8:4) end. Тест для задачи x y 4 2 0,027 0,3 -16 2 2. Определить, является ли заданное число k кратным 3. Ввиду простоты структурную схему алгоритма приводить не будем. В программе введем переменную порядкового типа ost, значениями которой могут быть только 0, 1 и 2. Такая переменная вполне подойдет на роль селектора. program kratnost; uses crt; var k:integer; ost: 0..2; begin writeln('введите число k'); readln(k); clrscr; ost :=k mod 3; case ost of 0: writeln(k, ' кратно 3 '); 1: writeln(k, ' кратно 3 с избытком 1'); 2: writeln(k, ' кратно 3 с недостатком 1'); end {case} end. 3.6. Индивидуальные задания к лабораторной работе 1. Домашнее задание. Построить структурную схему алгоритма и написать программу для вычисления значения функции y(x). Предусмотреть форматируемый вывод исходных данных и результата с простыми пояснениями. Для этапа верификации разработать тест. 2. Предъявить преподавателю вышеперечисленные этапы работы, оформленные в рабочей тетради. 17 3. Произвести отладку программы в компьютерном классе. Предъявить результаты тестирования программы преподавателю. Оформить отчет. Таблица 3.2 Список вариантов Функция y(x) № 2 3 № 1 1 2 3 y= x2 , x ≤ 0 ln( x), x > 0 14 y= x3 , x ≤ 0 ln( x) + 1, x > 0 15 0,007, x ≤ 0 16 y= 4 5 lg( x) + 1, x > 0 y= 2x , x ≤ 0 ln( x) + 1, x > 0 17 y= 0,007, x ≤ 0 tg ( x) + 1, x > 0 18 Функция y(x) 4 y= 0,3 ∗ 10−4 , x ≤ 0 ln( x), x > 0 y= 0,3 ∗ 103 , x ≤ 0 sin( x), x > 0 y= 0,3 ∗ 10−4 , x ≤ 0 tg ( x), x > 0 y= 0,3 ∗ 10−4 , x ≤ 0 ln( x), x > 0 y= 0,3 ∗ 10−4 , x ≤ 1 sin( x), x > 1 Окончание табл. 3.2 1 6 7 8 9 10 11 2 y= y= 0,0009, x ≤ 1 3 19 lg( x) + 1, x > 1 0,0567, x ≤ 1 20 lg( x) − 2, x > 1 0,00067, x ≤ 1 log 2 ( x) + 1, x > 1 21 0,0097, x ≤ 1 y= log3 ( x) − 2, x > 1 22 y= 0,0055, x ≤ 1 log 4 ( x) − 1, x > 1 23 y= 0,0055, x ≤ 1 log 4 ( x), x > 1 24 y= 4 y= 0,3 ∗ 10−4 , x ≤ 0 cos( x), x > 0 0,3 ∗ 10−4 , x ≤ 1 y= ln( x), x > 1 y= x2 , x ≤ 1 ln( x), x > 1 x2 , x ≤ 1 y= log 2 ( x), x > 1 y= x, x ≤ 2 log 2 ( x), x > 2 3 y= x, x ≤ 1 log 2 ( x), x > 1 18 12 13 y= y= 0,0055, x ≤ 1 lg( x), x > 1 25 0,0055, x ≤ 1 26 e ,x >1 x 3 y= x, x ≤ 1 ln( x), x > 1 x, x ≤ 1 cos( x), x > 1 3 y= 3.7. Контрольные вопросы 1. Что понимают под алгоритмом ветвления? 2. Как обозначается ветвление в структурных схемах? 3. Какие условные операторы существуют в языке Turbo Pascal? 4. Из чего состоит логическое выражение? 5. В каких случаях используется оператор выбора? 6. В каких случаях используется составной оператор? 4. Программирование алгоритмов циклической структуры 4.1. Алгоритмы циклической структуры Циклом называется такая форма организации действий, при которой повторяется одна и та же последовательность действий. Для организации цикла необходимо выполнить следующее: перед началом цикла задать начальное значение параметра цикла; внутри цикла задать правило изменения параметра цикла; проверять условие повторения или окончания цикла; управлять циклом, т.е. переходить к его началу, если он не закончен, и выходить из цикла в противном случае. Различают циклы с известным числом повторений и с неизвестным числом повторений (итерационные). В цикле с известным числом повторений параметр изменяется в заданном диапазоне. Если в цикле изменяется простая переменная, то она является параметром цикла; если в цикле изменяется переменная с индексом, то индекс этой переменной является параметром цикла. Последнее будет демонстрироваться в следующей главе. С точки зрения программирования, цикл – повторяющиеся фрагменты программ. В языке Turbo Pascal имеются три различных оператора, служащих для 19 программирования циклов: цикл с параметром, цикл с предпроверкой условия прекращения повторений и цикл с постпроверкой условия прекращения повторений. 4.2. Оператор цикла с параметром Оператор цикла с параметром, который кодирует соответствующую унифицированную структуру (рис. 4.1), имеет следующий формат: for <i>:= <i0> to <in> do <оператор>; Здесь for, to, do – зарезервированные слова («для», «до», «выполнить»); i – параметр цикла (переменная порядкового типа, например, integer); i0 (начальное значение) и in (конечное значение параметра) – константы или выражения того же типа; i=i0, in оператор – любой оператор языка (тело цикла). Шаг приращения параметра постоянен и равняется Тело цикла Рис. 4.1. Цикл с параметром +1 (для параметра цикла типа char шаг приращения – это переход к следующему символу). При выполнении оператора for вначале вычисляется выражение i0 и выполняется присваивание i:= i0 . После этого циклически повторяется: проверка условия i<= in (если условие не выполнено, то оператор for прекращает свою работу); выполнение тела цикла; наращивание переменной цикла на единицу. Существует и другая форма записи оператора for, при которой шаг приращения параметра принимает значение -1: for <i>:= <i0> downto <in> do <оператор>; 4.3. Оператор цикла с постусловием Оператор цикла с постусловием, который кодирует соответствующую унифицированную структуру (рис. 4.2), имеет следующий формат: 20 repeat <тело цикла> until <условие>; Здесь repeat, until – зарезервированные слова («повторять», Тело цикла да «пока не [выполнится условие]»); тело Условие цикла – произвольная последовательность операторов; нет Рис. 4.2. Цикл с постусловием условие – выражение логического типа. Операторы тела цикла всегда выполняются хотя бы один раз, после чего вычисляется условие: если его значение ложь, операторы тела цикла повторяются. Прекращение действий в теле цикла происходит при значении условия Истина. 4.4. Оператор цикла с предусловием Оператор цикла с предусловием, который кодирует соответствующую унифицированную структуру (рис. 4.3), имеет следующий нет Условие формат: while <условие > do <оператор>; да Тело цикла Рис. 4.3. Цикл с предусловием Проверка условия производится перед выполнением оператора. Если условие имеет значение истина, то выполняется оператор, после чего вычисление условия и его проверка повторяются. Если условие имеет значение ложь, оператор while (пока) прекращает свою работу. В теле цикла while можно использовать только один оператор. Для выполнения последовательности операторов следует применить составной оператор. 4.5. Примеры программ x 1! 1. Определить сумму ряда S = 1 − + Структурная схема алгоритма x2 x3 xn − + ... + (−1) n для заданного x и n. 2! 3! n! Листинг 21 program sumup; uses crt; var x,s,p : real; i, n : integer; begin write('введите n = '); readln(n); write('введите x = '); readln(x); writeln; clrscr; s := 1; p := 1; for i := 1 to n do begin p := - p*x /i; {получение очередного слагаемого} writeln(' p = ', p:7:3); s := s + p end; writeln('ответ : s = ', s : 7:3 ); readln end. Начало x, n S=1 P=1 i=1, n P = -P·x/i S=S+P x, n, S Конец Тест: x=1; n=3; S=0,33 2. Определить сумму ряда n 1 ∑ (2i + 1) i =0 2 , пока очередной член ряда не станет меньше 10-8. Листинг program sum_posled; var S,a,eps : real; N : word; begin Eps:=1e-8; {точность вычислений} S:=0; N:=0;{начальные значения параметров} repeat a:=1/(2*N+1)/(2*N+1);{текущий член ряда} inc(N); {счетчик членов ряда} S:=S+a;{частичная сумма ряда} until a<eps; writeln('Для N=',N, ' s=',s:11:8); readln end. 4.6. Индивидуальные задания к лабораторной работе 1. Домашнее задание. Построить структурную схему алгоритма задачи и написать программу. Предусмотреть форматируемый вывод исходных данных и результата с пояснениями. Для этапа верификации разработать тест. 2. Предъявить преподавателю вышеперечисленные этапы работы, оформленные в рабочей тетради. 3. Произвести отладку программы в компьютерном классе с составлением трассировочной таблицы. Предъявить результаты тестирования программы преподавателю. Оформить отчет. 22 Таблица 4.1 Список вариантов № Вид суммы n 1 xi ∑ i =1 i! n 2 x ∑ 2 i =1 ( 2i + 1) n 3 x ∑i i =1 4 x ∑ i =1 i! n x ∑ 2 i =1 ( 2i − 1) 6 9 n sin(ix) ∑ 2i i =1 10 11 число х. Вычислить сумму ряда, табл. 4.1. Условие задачи для вариантов 13 – 20. Рассчитать сумму бесконечного ряда. (i + 1) x i!) i =1 n x ∑ 2 i =1 ( 2i − 1) Суммирование проводить, пока очередной n ∑ n |x| ∑ (2i − 1) i =1 12 12. Дано натуральное n, действительное ∑ i(2i + 1) i =1 2 n 5 № Вид суммы n 7 1 + cos(ix) ∑ 2i i =1 n 8 x Условие задачи для вариантов 1 – 2 n cos(ix) ∑ i2 i =1 член ряда по модулю не станет меньше заданной точности ε. Результат сравнить с известным значением (ST), а погрешность сопоставить с величиной ε, табл. 4.2. Таблица 4.2 № Ряд 13 1 1 1+ 2 + 2 + ... 2 3 14 15 16 1+ 1 1 + 4 + ... 4 2 3 ST Список вариантов № Ряд ε ST ε π2/6 10-4 17 π2/8 10-4 π4/90 10-6 18 π4/96 10-5 π/4 10-4 π3/32 10-5 1- 1 1 + 2 − ... 2 2 3 π2/12 10-5 19 1- 1 1 + 4 − ... 4 2 3 -7 7π4/720 10 20 1 1 1+ 2 + 2 + ... 3 5 1+ 1 1 + 4 + ... 4 3 5 1 1 1- + − 3 5 1- 1 1 + 2 − ... 2 3 5 Задачи для вариантов 21 – 26 21. Дано натуральное n, действительное число х. Вычислить: sin x+sin2 x+…+sinn x. 22. Дано натуральное n, действительное число х. Вычислить: sin x+sin x2+…+sin xn. 23. Вычислить сумму Z = 1 + 2 + 3 + ... . Вычисления прекратить, когда значение Z превысит заданное значение A. 23 24. Известен начальный вклад клиента в банк и процент годового дохода. Определить, через сколько лет вклад превысит заданный размер и каков при этом будет размер вклада. 25. Торговая фирма в первый день работы реализовала товаров на P тыс. р., а затем ежедневно увеличивала выручку на 3 %. Какой будет выручка фирмы в тот день, когда она впервые превысит заданное значение Q? Сколько дней придется торговать фирме для достижения этого результата? 26. Малое предприятие в первый день работы выпустило P единиц товарной продукции. Каждый последующий день оно выпускало продукции на Q единиц больше, чем в предыдущий. Сколько дней потребуется предприятию, чтобы общее количество выпущенной продукции за все время работы впервые превысило запланированный объем? 4.7. Контрольные вопросы 1. Что называется циклом, телом цикла? 2. Какие операторы цикла языка Turbo Pascal вы знаете? 3. С каким шагом может изменяться параметр оператора for? 4. Как можно рассчитать число шагов в операторе for? 5. Поясните отличия в операторах цикла с постусловием и предусловием. 6. Какой формат имеет оператор while? 7. Поясните, в каком случае прекращаются повторения в операторе while . 8. Какой формат имеет оператор repeat? 9. Поясните, в каком случае прекращаются повторения в операторе repeat. 5. Обработка регулярных структур данных: операции над одномерными массивами 5.1. Определение массива Массив представляет собой упорядоченное («пронумерованное») множество элементов одного типа, обозначенных одним именем. Положение элемента в массиве указывает его индекс или совокупность индексов. 24 Массивы, объединяющие переменные с одной индексной величиной, называются одномерными. Одномерные массивы, в которых диапазон индексов начинаются с 1, также называются иногда векторами. Элементы одномерного массива обозначаются именем массива и следующим за ним в квадратных скобках индексом. Они называются переменными с индексом. Например, элементы Z[1], Z[2], Z[3], Z[4] образуют одномерный массив с именем Z. Его текущий элемент Z[i], где i =1, 2, 3, 4. 5.2. Описание одномерного массива Описать массив в программе можно разными способами. Первый способ. Массив-переменная описывается в разделе var: var <имя_массива>:array [n1..n2] of <тип_элементов_массива>; Здесь n1 – это нижняя граница, n2 – верхняя граница индекса элементов массива. Например, массивы a и b, состоящие из 15 вещественных чисел, и массив c, содержащий 10 вещественных чисел, могут быть описаны так: var a,b:array [1..15] of real; c:array [1..10] of real Второй способ. Массив описывается путем указания на его принадлежность к типу, специально определенному в разделе type: type <имя_типа>=array [n1..n2] of <тип_элементов_массива>; var <имя_массива>:<имя_типа>; Те же массивы a, b, c (или подобные им по структуре) могут быть описаны так: type vector=array [1..15] of real; var a,b,c:vector; Массив является структурой данных статического типа. Это значит, что память для него выделяется один раз при компиляции программы и резервируется до конца её исполнения. Память для массива выделяется «по максимуму» в соответствии с описанием массива. Например, для массивов a, b, c во втором способе описания выделяется 15x4 последовательных байт памяти. Однако память под массив c использована не полностью, а частично, т. е. фактическая 25 длина массива меньше максимальной. Фактическую длину массива обычно задают при вводе данных. 5.3. Формирование массивов исходных данных В программе формирование массивов исходных данных производится поэлементно в цикле. Параметром цикла является индекс элемента. Ввод с клавиатуры программируется при помощи процедур ввода read и readln с использованием текстовых пояснений (ввод с «подсказкой») по схеме: writeln('Введите длину массива:'); readln(n); {n –фактическая длина массива} for i:=1 to n do read(b[i]); {индекс i является параметром цикла} Исходные данные можно вводить, располагая их в одной строке (нажимается «пробел») или в одном столбце (нажимается клавиша Enter). Ввод с клавиатуры сопряжен с ошибками ввода, поэтому желательно в программе организовать контроль и блокировку ошибок ввода. Этих проблем ввода можно избежать, если использовать для формирования массивов порождающие выражения. Например, в таком виде: for i:=1 to 15 do b[i]:=sin(0.4*i); Если значения исходных данных при решении задачи роли не играют, то для формирования массивов можно использовать генератор случайных чисел – функцию Random. Она генерирует случайные числа в диапазоне от 0,0 до 1,0. Для заполнения массива случайным образом числами 0 и 1 используют функцию с параметром: Random(2). Для изменения диапазона случайных чисел применяют формулу: c + (d -c)*Random. Здесь c – левая, d – правая граница диапазона. Если необходимо получить неповторяющуюся серию случайных чисел, то перед генерацией используют встроенную процедуру Randomize. Например, для заполнения массива b случайными числами от -10.0 до +10.0 следует запрограммировать фрагмент: Randomize; for i:=1 to n do b[i]:= -10+20*Random; 26 5.4. Особенности вывода одномерных массивов Наиболее простым способом является вывод массива на экран. Он программируется при помощи процедур вывода write и writeln с использованием текстовых заголовков и пояснений по схеме: writeln('Массив b'); for i:=1 to n do write(b[i]:5:2); Здесь b – одномерный массив, описанный ранее. Размещение данных на экране достигнуто при помощи форматированного вывода. Вывод массива осуществляется в одну строку в 75 позиций. Для вывода «длинного» массива применяется перевод строки по образцу: for i:=1 to 15 do begin write(b[i]:13:5); if(i mod 5=0) then writeln{перевод строки через 5 чисел} end; 5.5. Обработка одномерных массивов Что же касается собственно процедуры обработки, то доступ к элементам массива также производится в цикле2. Пример обработки массива: вывести номера элементов массива b, которые меньше или равны 2. writeln('Номера элементов массива, меньших 2'); for i:=1 to 15 do if b[i]<=2 then write(i:3);{форматированный вывод целого числа} 5.6. Примеры программ 1. Вычислить сумму элементов числового массива A = (a1, a2 , ... , an). Для решения задачи используем циклический алгоритм. Перед началом цикла задаем начальное значение суммы (S=0). В качестве параметра цикла используем индекс элемента i. Начальное значение i равно 1, конечное значение – числу элементов (n). В теле цикла выполняется последовательное суммирование. 2 Структурный стиль программирования рекомендует не совмещать процедуры формирования исходных данных, их обработки и вывода данных. Для исключения взаимного влияния нужно оформлять их отдельно. 27 Структурная схема алгоритма Трассировочная таблица i 0 1 2 3 4 5 S 0 0 + A1 = 0+3 = 5 A1 + A2 = 3+5 = 8 A1+A2+A3 = 8-2 = 6 A1+A2+A3+A4 = 6+6 = 12 A1+A2+A3+A4+A5 = 12+3=15 Листинг program summa; uses crt; type mas = array [1..20] of real; var a:mas; i, n : integer; s:real; begin write('введите n = '); readln(n); {ввод фактического числа элементов массива} for i := 1 to n dо {цикл по индексу элементов массива} begin write('a [ ', i , ' ] = '); readln(a[i]) {ввод элементов массива} end; clrscr; {очистка экрана после ввода данных} s:=0; {присваивание начального значения сумме} for i := 1 to n do s:= s+a[i]; {суммирование} writeln; writeln('массив a:'); for i:=1 to n do write(a[i]:5:1); writeln; writeln('сумма элементов массива= ', s:6:1); readln end. 2. Дан массив X(N). Получить новый массив Y(N) такой, что в нем сначала идут положительные, затем нулевые и отрицательные числа из массива X(N). 28 Часть структурной схемы алгоритма k=0 i=1, N i=1, N нет да xi > 0 да k=k+1 yk = y i нет xi = 0 k=k+1 yk = yi i=1, N да нет xi < 0 k=k+1 yk = yi Тест Данные N=7 X=(-1, 2, 0, 4, -3,-2,0) Результат Y=(2, 4, 0, 0, -1, -3, -2) Листинг program neworder; uses crt; var n, i, k : integer; x,y:array [1..20] of real; begin write('введите N = '); readln(N); for i := 1 to N do begin write('x[ ', i, ' ] = '); readln(x[i]) end; clrscr; k:=0; for i := 1 to N do if x[i]>0 then begin k:=k+1; y[k]:=x[i] end; for i := 1 to N do if x[i]=0 then begin k:=k+1; y[k]:=x[i] end; for i := 1 to N do if x[i]<0 then begin k:=k+1; y[k]:=x[i] end; write('исходный массив'); for i := 1 to N do write(x[i]:5:1); writeln; write('полученный массив'); for i := 1 to N do write(y[i]:5:1); writeln; readln end. 3. Известны результаты 5 студентов по итогам экзаменов по химии и физике. Найти фамилии студентов, сдавших оба экзамена на отличную оценку. В программе для хранения фамилий студентов используется одномерный строковый массив st типа fam, для хранения оценок студентов – двумерный целочисленный массив r типа ball. Первый столбец матрицы r используется для хранения результатов экзамена по химии, второй столбец – для хранения результатов экзамена по информатике. Если у студента оценки за оба экзамена составили 5 баллов, то его фамилия будет выведена на экран с сообщением «Студент-отличник». 29 program Sessia; type ball =array [1..5,1..2]of integer; fam=array[1..5]of string[10]; var r: ball; st:fam; i,j:integer; begin for i:=1 to 5 do begin writeln('Введите фамилию ',i,'-го студента '); readln(st[i]); writeln('Введите оценку студента по химии); readln(r[i,1]); writeln('Введите оценку студента по физике); readln(r[i,2]); end; for i:=1 to 5 do if (r[i,1]=5) and (r[i,2]=5) then writeln('Студент-отличник - ',st[i]); end. 5.7. Индивидуальные задания к лабораторной работе 1. Домашнее задание. Построить структурную схему алгоритма обработки одномерного массива. Написать программу: предусмотреть форматируемый вывод исходного массива и результата обработки его. Для этапа верификации разработать тест. 2. Предъявить преподавателю вышеперечисленные этапы работы, оформленные в рабочей тетради. 3. Произвести отладку программы в компьютерном классе. Предъявить результаты тестирования программы преподавателю. Оформить отчет. Список вариантов 1. Дан массив P(N), состоящий из N вещественных чисел. Заменить его отрицательные элементы нулями, и новый массив переписать в S(N). 2. Дан массив P(N), состоящий из N вещественных чисел. Определить, сколько раз встречается число 7.13 среди элементов массива. 3. Дан массив P(N), состоящий из N вещественных чисел. Найти сумму элементов массива, превышающих число 5,89. 4. Проверить, есть ли в целочисленной последовательности a1, a2 , ..., an элементы, равные нулю. Если есть, найти номер первого из них, если нет – выдать соответствующий текст. 5. Дан массив P(N), состоящий из N вещественных чисел. Выяснить, имеются ли в заданном массиве два подряд идущих нулевых элемента. 6. Дан массив A(N), состоящий из N вещественных чисел. Если у заданного массива есть хотя бы один элемент меньше числа q, то все отрицательные 30 элементы заменить их квадратами, оставив остальные элементы без изменения; в противном случае элементы массива A умножить на 0,1. Новый массив переписать в S(N). 7. Имеется последовательность чисел a1, a2,.., an. Найти сумму первых из них (считая слева направо), произведение которых не превышает числа М. 8. Все элементы заданного массива вещественных чисел A(N), начиная с первого по порядку положительного элемента, уменьшить на единицу. Новый массив переписать в S(N). 9. Дан массив P(N), состоящий из N вещественных чисел. Найти элементы массива, удовлетворяющие условию a<P(i)<b, где a и b – числа, и переписать их в массив X(M). 10. Дан массив P(N), состоящий из N вещественных чисел. Найти максимальный элемент массива и его порядковый номер. 11. Определить, имеется ли в заданном целочисленном массиве X(N) число, кратное заданным числам А и В, и не кратное числу С. 12. Дан массив P(N), состоящий из N вещественных чисел. Переписать в массив X(K) подряд положительные элементы массива P(N), а в массив Y(L) – отрицательные элементы. 13. Массив вещественных чисел A(N) упорядочен по возрастанию. Известно, что вещественное число x принадлежит отрезку числовой оси, вмещающему заданный массив. Определить номер k, для которого A(k– 1)<x<=A(k). 14. Даны два вектора A(N) и B(N), состоящие из N вещественных чисел. Если эти векторы различны, то вектору C(N) присвоить их сумму, иначе в вектор C(N) переписать элементы вектора A(N). 15. Дан массив P(N), состоящий из N целых чисел. Определить сумму элементов массива, кратных трем. Вывести номера этих элементов. 16. Дан массив P(N), состоящий из N вещественных чисел. Вычислить среднее арифметическое значение элементов массива. 31 17. Дан массив X(N), состоящий из N вещественных чисел. Найти первый отрицательный элемент и его порядковый номер k. Если отрицательных элементов нет, то k присвоить значение 0. 18. Дан массив X(N), состоящий из N вещественных чисел. Вычислить y=X(1)*X(n) + X(2)*X(n-1) +...+ +X(n)*X(1). 19. Дан массив X(N), состоящий из N вещественных чисел, где N – четное число. Вычислить y = X(1)2 + +X(3)2 +...+ X(N-1)2 и z=X(2)2 + X(4)2 +...+ X(N)2. 20. Дан массив P(N), состоящий из N вещественных чисел. Определить отдельно сумму положительных и отрицательных элементов массива. 21. Дан массив P(N), состоящий из N вещественных чисел. Заменить отрицательные элементы массива их квадратами, и новый массив переписать в S(N). 22. Дан массив X(N) из N вещественных чисел. Вычислить наибольшее значение модуля разности между соседними элементами массива. 23. Дан массив P(N), состоящий из N вещественных чисел. Определить, сколько элементов массива меньше, чем число 6,5·10-7. 24. Дан массив P(N), состоящий из N вещественных чисел. Найти разность между значениями наибольшего и наименьшего элементами массива. 25. Дан массив P(N), состоящий из N вещественных чисел. Найти произведение отрицательных элементов массива. 26. Дан массив P(N), состоящий из N вещественных чисел. Найти сумму всех элементов массива, имеющих четные индексы. 27. Дан массив P(N), состоящий из N вещественных чисел. Найти наибольший из элементов массива, имеющих нечетные индексы. 28. Дан массив P(N), состоящий из N вещественных чисел. Найти среднее арифметическое положительных элементов массива. 29. Дан массив P(N), состоящий из N вещественных чисел. Найти максимальный и минимальный элементы массива и поменять их местами. 32 30. Числа Фибоначчи (Fi) определяются по формулам F0 = F1= 1; Fi = Fi–1+ Fi–2 при i = 2, 3, ... Найти первое из чисел Фибоначчи, которое превосходит заданное число M (M>0). 31. Если в заданном целочисленном векторе A(N) есть элементы со значением, равным заданному числу B, то переменной C присвоить значение, равное сумме всех элементов, предшествующих первому по порядку такому элементу; в противном случае вывести соответствующий текст. 32. Имеется монотонно убывающая последовательность чисел a1 , a2 , ..., an. Определить квадрат суммы положительных членов этой последовательности. 33. Дан массив X(N) из N вещественных чисел. Вычислить наименьшее значение модуля разности между соседними элементами массива. 5.8. Контрольные вопросы 1. Что понимают под массивом данных? 2. Что называют размерностью массива? 3. Что понимают под индексом элемента массива? 4. Какой массив называется одномерным? 5. Приведите примеры одномерных массивов. 6. Как описываются одномерные массивы на языке Turbo Pascal? 6. Обработка регулярных структур данных: операции над двумерными массивами 6.1. Описание двумерных массивов Массив, для задания элементов которого требуется использовать два индекса, называется двумерным. Двумерные массивы, в которых диапазоны индексов начинаются с 1, также называются иногда матрицами. Размерность каждой матрицы определяется как MxN, где М – число строк в матрице, N – число столбцов. Элементами массива являются переменные с двумя индексами. Приведем пример квадратной матрицы A(3 x 3), имеющей 3 строки и 3 столбца: ⎛ a11 ⎜ A = ⎜ a 21 ⎜a ⎝ 31 a12 a 22 a32 a13 ⎞ ⎟ a 23 ⎟ a33 ⎟⎠ 33 Ее элементы в языке Turbo Pascal обозначаются как a[1,1], a[1,2], .., a[3,3]. Элементы матрицы вида a[1,1], a[2,2], a[3,3] образуют главную диагональ матрицы. Элементы вида a[1,n], a[2,n-1], a[3,n-2]…a[n,1], где n – число строк (столбцов) матрицы, образуют побочную диагональ. Описание типов двумерных массивов в языке осуществляется аналогично описанию типов одномерных массивов с добавлением диапазона изменения второго индекса. При описании задается требуемый объем памяти под двумерный массив, указываются имя массива и в квадратных скобках диапазоны изменения индексов. Описать массив в программе можно разными способами. Первый способ. Массив-переменная описывается в разделе var: var <имя_массива>:array [n1..n2,n3..n4] of <тип_элементов_массива>; Здесь n1 и n2 – нижняя и верхняя граница первого индекса, а n3 и n4 – нижняя и верхняя границы второго индекса элементов массива. Второй способ. Массив описывается путем указания на его принадлежность к типу, специально определенному в разделе type: type <имя_типа>=array[n1..n2,n3..n4] of <тип_элементов_массива>; var <имя_массива>:<имя_типа>; Например, массив A, или ему подобные, могут быть описаны так: type matrix=array [1..3,1..3] of integer; var a:matrix; Идентификатор типа matrix может быть использован для описания любых других массивов с такой же структурой. 6.2. Особенности формирования двумерных массивов При вводе и выводе элементов двумерных массивов используются вложенные циклы, в которых внешний оператор цикла, как правило, задает изменение номера строки, внутренний оператор цикла – изменение номера столбца массива. В случае двумерного массива с n строками и m столбцами ввод программируется по схеме: 34 writeln('Введите число строк и столбцов матрицы:'); readln(n,m); writeln('Введите матрицу по строкам:'); for i:=1 to n do for j:=1 to m do read(a[i,j]); Исходные данные (n x m чисел) в этом случае вводятся по строкам (параметр i меняется медленнее, чем j). Элементы строки можно вводить через пробел, строки отделять нажатием клавиши Enter. При формировании двумерного массива можно использовать порождающее выражение, например в таком виде: for i:=1 to n do for j:=1 to m do a[i,j]:=i*j; Для заполнения матрицы можно использовать процедуру Random. Например: for i:=1 to n do for j:=1 to m do a[i,j]:=Random(2); 6.3. Особенности вывода двумерных массивов При выводе двумерных массивов применяются те же самые приемы, что и в случае одномерных массивов. Особенность состоит в том, что при выводе применяются вложенные циклы и перевод строки для получения массива на экране в матричной форме: writeln('Матрица A:'); for i:=1 to n do{перебор n строк} begin for j:=1 to m do{перебор элементов вдоль строки – по столбцам} write(a[i,j]:5:2); writeln; {перевод строки после вывода m чисел в строке} 35 end; 6.4. Особенности обработки двумерных массивов Двумерный массив является частным случаем массивов, поэтому методические рекомендации по обработке одномерных массивов из предыдущей работы справедливы и для двумерных массивов. Обработка двумерных массивов обычно (но не всегда) производится в конструкции вложенных циклов. При этом часто имеет значение порядок вложения циклов – обработка по строкам или по столбцам. Доступ к элементам массива по строкам: for i:=1 to n do{перебор n строк} for j:=1 to m do{перебор элементов вдоль i-й строки – по m столбцам} <обработка элемента a[i,j>; Доступ к элементам массива по столбцам: for j:=1 to m do{перебор m столбцов} for i:=1 to n do{перебор элементов вдоль j-го столбца – по n строкам} <обработка элемента a[i,j>; 6.5. Примеры программы 1. Найти максимальный элемент главной диагонали матрицы A(N x N) и вывести всю строку, в которой он находится. Структурная схема алгоритма Листинг 36 program max_diag; uses crt; const nm=20; type m=array[1..nm, 1..nm] of real; var i,j,n,k:integer; max:real; a:m; begin writeln(‘введите число элементов массива’); readln (n); writeln(‘введите элемент массива’); for i:=1 to n do for j:=1 to n do begin writeln('a[', i, ',', j, '] ');read (a[i,j]); end; clrscr; k:=1; max:=a[1,1]; for i:=2 to n do if max < a[i,i] then begin max := a[i,i]; k:=I end; writeln(‘массив a’); for i:=1 to n do for j:=1 to n do begin write(a[i,j]:6:2); writeln; end; writeln; writeln(‘строка ’, k); for i:=1 to n do write(a[k,i]:6:2); writeln; writeln(‘max=’, max:6:2); end. Страница №1 Страница №2 Тест Исходная матрица Результат 1.10 5.5 5.56 max = 2.6 6.7 2.6 2.6 строка 2 6.7 2.6 2.6 9.9 3.1 -3.0 2. Дана целочисленная квадратная матрица. Найти в каждой строке наибольший элемент и поменять его местами с элементом главной диагонали. Листинг program obmen; var n,i,j,max,ind,vsp:integer; a:array[1..15, 1..15] of integer; begin write('введите количество элементов в max:= a[i, 1]; ind:=1; for j:= 2 to n do if a[i, j] > max then begin max:= a[i, j]; ind:=j 37 end; vsp:= a[i, i]; a[i, i]:= a[i, ind]; a[i, ind]:=vsp end; for i:= 1 to n do begin writeln; for j := 1 to n do write(a[i, j]:3); end; writeln end. массиве: '); readln(n) writeln (‘введите элемент массива’); for i:= 1 to n do for j:= 1 to n do begin write('a[', i, ',', j, '] '); readln(a[i, j]) end; for i:= 1 to n do begin 6.6. Индивидуальные задания к лабораторной работе 1. Домашнее задание. Построить структурную схему алгоритма обработки двумерного массива. Написать программу: предусмотреть вывод исходного массива и результата обработки его. Для этапа верификации разработать тест. 2. Предъявить преподавателю вышеперечисленные этапы работы, оформленные в рабочей тетради. 3. Произвести отладку программы в компьютерном классе. Предъявить результаты тестирования программы преподавателю. Оформить отчет. Список вариантов 1. Найти наибольший элемент главной диагонали матрицы A(N x N) и вывести всю строку, в которой он находится. 2. Переписать положительные элементы главной диагонали матрицы A(N x N) в одномерный массив X(M). 3. Найти наибольший по абсолютной величине элемент второй строки матрицы A(N x M). 4. Найти наименьший элемент главной диагонали матрицы A(N x N) и вывести весь столбец, в котором он находится. 5. Найти сумму элементов главной (S1) и побочной (S2) диагоналей матрицы A(N x N). 6. Дана прямоугольная матрица A(N x M). Получить новую матрицу с элементами (i+j)*A(i,j). 38 7. Дана прямоугольная матрица A(N x M). Подсчитать сумму всех элементов больше, чем 0,5. 8. Дана матрица A(N x N). Подсчитать сумму квадратов элементов главной диагонали. 9. Определить, сколько элементов матрицы A(N x M) превышает число 2, 67. 10. Дана матрица A(N x M). Переменной В присвоить значение, равное количеству строк матрицы А, содержащих хотя бы одну нулевую компоненту. 11. Среди строк заданной целочисленной матрицы, содержащих только нечетные элементы, найти строку с максимальной суммой модулей элементов. 12. Среди столбцов заданной целочисленной матрицы, содержащих только такие элементы, которые по модулю не больше 10, найти столбец с минимальным произведением элементов. 13. В заданной матрице A(N x M) найти количество строк, не содержащих отрицательных чисел. 14. Найти произведение элементов, расположенных на побочной диагонали матрицы A(N x N). 15. Дана матрица A(N x N) и массив X(N). Заменить нечетные строки матрицы элементами массива X(N). 16. Дана матрица A(N x N). Сформировать новую матрицу B(N x N), в которой все элементы совпадают с элементами матрицы A за исключением: если элемент Aij превышает значение 20, то соответствующему элементу из B присваивается значение 20. 17. Дана матрица A(N x N). Сформировать новую матрицу B(N x N), в которой диагонали совпадают с соответствующими диагоналями матрицы A, а все остальные элементы равны 0. 18. Переписать положительные элементы матрицы A(N x N) в одномерный массив X(M). 19. Найти наибольший элемент в третьем столбце матрицы A(N x M). 20. Найти сумму всех положительных элементов матрицы A(N x M). 39 21. Найти среднее арифметическое значение элементов второго столбца матрицы A(N x M). 22. Найти сумму элементов первой и третьей строк матрицы A(N x M). 23. Определить, сколько раз встречается число 5,3 среди элементов всей матрицы A(N x M). 24. Дана прямоугольная матрица A(N x M). Извлечь корень квадратный из элементов массива и просуммировать полученные значения. 25. Найти количество отрицательных элементов в матрице A(N x M). 26. Дана матрица A(N x N). Сформировать новую матрицу B(N x N), в которой каждый элемент меньше, чем соответствующий элемент матрицы A, на сумму значений индексов этого элемента. 27. Найти количество неотрицательных элементов во втором столбце матрицы A(N x M). 28. Найти наибольший элемент в матрице A(N x M). 29. Найти наименьший по модулю элемент первой строки матрицы A(N x M). 30. Найти среднее арифметическое значение всех отрицательных элементов матрицы A(N x M). 6.7. Контрольные вопросы 1. Поясните понятия двумерного массива, матрицы. 2. Что обозначают индексы матрицы? 3. Сколько элементов в матрице из 7 строк и 9 столбцов? 4. Дайте понятие диагоналей квадратной матрицы. 5. Приведите пример описания двумерных массивов на языке Turbo Pascal. 6. Поясните порядок использования вложенных циклов при вводе элементов двумерного массива. 7. Библиографический список 1. Фаронов В.В. Турбо Паскаль: В 3 кн. Кн. 1. Основы Турбо Паскаля / В.В Фаронов. – М. : Учебно-инженерный центр «МВТУ-ФЕСТО ДИДАКТИК», 1992. – 304 с. 40 2. Джонс Ж. Решение задач в системе Турбо Паскаль; пер. с англ. / Ж. Джонс, К. Харроу. – М. : Финансы и статистика, 1991. – 720 с. 3. Алкок Д. Язык Паскаль в иллюстрациях; пер. с англ. / Д. Алкок. – М. :Мир, 1991. – 192 с. 4. Пильщиков В.Н. Сборник упражнений по языку Паскаль: учебное пособие для вузов / В.Н. Пильщиков. – М. : Наука, 1989. – 160 с. 6. Фаронов В.В. Турбо Паскаль 7.0. Начальный курс / В.В Фаронов. – М. : Нолидж, 2000. – 576 с. 41 ОГЛАВЛЕНИЕ 1. Простые приемы отладки программ .....................................................................................3 1.1. Алгоритм вычисления квадратного корня методом Герона.......................................3 1.2. Набор и компиляция программы...................................................................................3 1.3. Верификация программы ...............................................................................................5 1.4. Контрольные вопросы ....................................................................................................7 2. Программирование алгоритмов линейной структуры ........................................................8 2.1. Ядро языкаTurbo Pascal ..................................................................................................8 2.2. Структура программы на Паскале...............................................................................11 2.3. Пример программы «Банкир»......................................................................................12 2.4. Индивидуальные задания к лабораторной работе .....................................................12 2.5. Контрольные вопросы ..................................................................................................14 3. Программирование алгоритмов разветвляющейся структуры.........................................14 3.1. Логические выражения.................................................................................................14 3.2. Условный оператор.......................................................................................................14 3.3. Составной оператор ......................................................................................................15 3.4. Оператор выбора...........................................................................................................15 3.5. Примеры программ .......................................................................................................16 3.6. Индивидуальные задания к лабораторной работе .....................................................17 3.7. Контрольные вопросы ..................................................................................................19 4. Программирование алгоритмов циклической структуры.................................................19 4.1. Алгоритмы циклической структуры ...........................................................................19 4.2. Оператор цикла с параметром .....................................................................................20 4.3. Оператор цикла с постусловием..................................................................................20 4.4. Оператор цикла с предусловием .................................................................................21 4.5. Примеры программ .......................................................................................................21 4.6. Индивидуальные задания к лабораторной работе .....................................................22 4.7. Контрольные вопросы ..................................................................................................24 5. Обработка регулярных структур данных: операции над одномерными массивами......24 5.1. Определение массива....................................................................................................24 5.2. Описание одномерного массива ..................................................................................25 5.3. Формирование массивов исходных данных...............................................................26 5.4. Особенности вывода одномерных массивов..............................................................27 5.5. Обработка одномерных массивов ...............................................................................27 5.6. Примеры программ .......................................................................................................27 5.7. Индивидуальные задания к лабораторной работе .....................................................30 5.8. Контрольные вопросы ..................................................................................................33 6. Обработка регулярных структур данных: операции над двумерными массивами ........33 6.1. Описание двумерных массивов ...................................................................................33 6.2. Особенности формирования двумерных массивов ...................................................34 6.3. Особенности вывода двумерных массивов ................................................................35 6.4. Особенности обработки двумерных массивов...........................................................36 6.5. Примеры программы ....................................................................................................36 6.6. Индивидуальные задания к лабораторной работе .....................................................38 6.7. Контрольные вопросы ..................................................................................................40 7. Библиографический список .................................................................................................40 42 Учебное электронное текстовое издание ПРАКТИЧЕСКАЯ РАБОТА В ИНТЕГРИРОВАННОЙ СРЕДЕ TURBO PASCAL Полупанова Тамара Ивановна Редактор Н.В. Рощина Компьютерная верстка Т. И. Полупанова Рекомендовано РИС ГОУ ВПО УГТУ – УПИ Разрешен к публикации 02.07 Электронный формат – PDF Формат 60x90 1/8 Объем 2,1 уч.-изд. л. Издательство ГОУ ВПО УГТУ – УПИ 620002, г. Екатеринбург, ул. Мира, 19 e-mail: sh@uchdep.ustu.ru Информационный портал ГОУ ВПО УГТУ УПИ http://www.ustu.ru