Диплом, курсовая, контрольная работа
Помощь в написании студенческих работ

Алгоритмы и программы автоматизации инженерных расчетов

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

Знаки операций предназначены для обозначения тех или иных арифметических, логических или других действий. Они бывают двух типов: состоящие из небуквенных символов (например, +, -, * и т. д.) и буквенные операции (например, not, mod, div и т. д.), представляющие собой зарезервированные слова. Операции над данными делятся на унарные (применимые к одному операнду) и бинарные (применимые к двум… Читать ещё >

Алгоритмы и программы автоматизации инженерных расчетов (реферат, курсовая, диплом, контрольная)

1. Постановка задачи и анализ исходных данных

1.1 Математическая постановка задачи

1.2 Язык программирования

1.3 Системные требования

2. Математическое описание решения задачи

2.1 Анализ данных

2.2 Алгоритм решения

3. Структурные схемы алгоритма решения задачи

4. Описание программы

4.1 Применение программы

4.2 Разработка программы

4.3 Описание структуры программы

4.4 Используемые модули и операторы

4.5 Входные и выходные данные

4.6 Инструкция пользователя

4.7 Выполнение контрольного примера

Заключение

Список литературы

Приложение. Листинг программы

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

Задачи курсовой работы: изучить основные понятия использования массивов; формализовать поставленную задачу; построить модель её решения; реализовать программу на языке программирования Turbo Pascal.

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

Средства выполнения и форма отчетности: работа выполняется с использованием среды разработки Turbo Pascal 7.0.

Персональные компьютеры — это универсальные устройства для обработки информации, они могут выполнять любые действия в этом направлении. Но для этого надо составить для компьютера на понятном ему языке точную и подробную программу.

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

ЭВМ стремительно проникла в нашу жизнь, требуя не только от инженера или техника, но и от студентов и школьников навыков программирования.

1. Постановка задачи и анализ исходных данных

одномерный массив арифметический алгоритм

1.1 Математическая постановка задачи

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

1.2 Язык программирования

Трудно рассказать что-то новое о том, что хорошо известно всем. Действительно, вряд ли найдется в нашей стране программист или просто выпускник средней школы, который не знал бы (или не слышал) об этом языке программирования. Основные концепции языка были разработаны в 1967;1968 г. профессором Николаусом Виртом (Niklaus Wirth) и опубликованы в 1971 году (The Programming Language Pascal Acta Informatica, 1 (Jun 1971), 35−63). Стандарт языка был разработан им в 1974 г. (PASCAL — User Manual and Report, ISO Pascal Standard Kathleen Jensen and Niklaus Wirth) совместно с Кетлин Йенсен (Kathleen Jensen). Паскаль достаточно быстро превратился из средства, предназначенного для обучения студентов программированию, в инструмент, который стали использовать для создания больших программных проектов. Заметим, что ни один из последующих языков, разработанных автором (а Вирт является создателем Модулы и Оберона), не получил такого распространения. Трудно сказать, с чем это связано. Возможно, с тем, что язык удачно сочетает простоту с выразительностью и силой. Возможно, что просто он оказался в нужный момент на нужном месте, поскольку на момент создания языка, получившего свое имя в честь великого французского математика, в распоряжении программистов было весьма и весьма немного языков высокого уровня.

И что самое главное, все они были разработаны для решения конкретных прикладных задач и во многом являлись продуктом «творческого акта», а не результатом серьезного научного труда. Фортран, названный одним из пионеров программирования Дейкстрой (Edsger Dijkstra) инфантильным дезорганизатором, предназначался только для математических расчетов и не выдерживал никакой критики с точки зрения ограничения доступа к данным и отсутствия поддержки структурного программирования. Об интерпретаторе Бейсик (тогда еще без приставки Visual) нельзя было говорить без слез. Кобол был ориентирован на решение экономических задач, a PL/I — чрезмерно сложен и принадлежал скорее к области проблем, чем к области решений. И вот тут появляется язык, на порядок отличающийся от них своим качеством. Основное, что привлекало к нему, — логичность, поддержка концепций структурного и процедурного программирования, работа с динамической памятью, возможность создания своих типов данных. Все это стало теперь настолько привычным, что трудно представить, как можно программировать без использования этих жизненно необходимых возможностей. Строгая типизация позволила сразу же на порядок снизить количество ошибок, появляющихся вследствие невнимательности или банальных опечаток. Кстати, для желающих использовать в своих программах прямой доступ к данным без всяких ограничений язык предоставил возможность создания записей с вариантами, которые можно трактовать в соответствии со своими потребностями. Но при этом программист должен всегда явно указывать, с каким типом данных в конкретной переменной он желает работать. Единственным недостатком языка, существовавшим в то время, было отсутствие поддержки модульности. Программист должен был компилировать весь проект целиком, со всеми входящими в него процедурами и функциями. Но, впрочем, это не удивительно — напомню, что язык-то был предназначен для обучения. Еще одной причиной, которая позволила языку перейти в категорию бестселлеров, стала поддержка разработчиков коммерческого ПО.

И тут мы не можем пройти мимо фирмы Borland (ныне Inprise). Разработанный ею Turbo Pascal во всех его модификациях является в России одним из самых популярных продуктов. Интегрированная оболочка, которая включает в себя редактор, компилятор, компоновщик и отладчик, вместе с интерактивной справочной системой сделали разработку программ на Паскале делом простым и понятным практически любому человеку. Но так было не всегда. Например, в начале восьмидесятых автору довелось поработать с одним из первых компиляторов Паскаля на платформах DEC. В нем сначала нужно было в редакторе создавать программу, затем однопроходный компилятор выдавал код на ассемблере, далее приходилось транслировать его в объектный код, компоновать с системными библиотеками и только после этого запускать программу. Поиск ошибок (без встроенного отладчика, который сейчас просто показывает вам строку, где произошла ошибка) был делом, требующим терпения, и, самое главное, процессом весьма длительным. Кроме создания интегрированной оболочки, Borland ввел в Pascal поддержку модульного программирования, а начиная с версии 5, и поддержку объектно-ориентированного программирования. В настоящее время действуют три стандарта языка. Первый из них — нерасширенный Паскаль (unextended Pascal) был разработан в 1983 году и практически полностью совпадает с описанием языка в нотации Йенсен-Вирта. Второй — Extended Pascal — содержит расширения, касающиеся модульного программирования (раздельная компиляция модулей, импорт-экспорт подпрограмм, интерфейсная часть и реализация), и дополнен рядом процедур и функций (прямой доступ к файлам, работа со строками и т. д.) Последний — объектный Паскаль (Object-Oriented Extensions to Pascal), в отличие от первых двух, формально не утвержден, но оформлен в виде отчета (ANSI Technical Report) в 1993 г. Объектный Паскаль поддерживает классы, обладающие свойствами и методами, наследование классов, переопределение методов у потомков (полиморфизм) и ряд других атрибутов объектно-ориентированного программирования.

Элементы языка Турбо Паскаль

Алфавит языка состоит из множества символов, включающих:

Латинские буквы: от A до Z (прописные) и от, а до z. (строчные);

Знак подчеркивания _;

Цифры: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;

Специальные символы: + - * / (знаки арифметических операций), = <> <= >= (операции отношения),: = (операции присваивания), [ ]. , ():; { } ^ @ $ # ` (ограничители). К спецсимволам относятся служебные слова, смысл которых определен однозначно (begin, end, for, div и т. д.).

Пробел — символ пробела (ASCI1−32) и все управляющие символы кода ASCII (от 0 до 31).

Идентификаторы. Идентификатором называется символическое имя определенного программного объекта. Такими объектами являются имена констант, переменных, типов данных, процедур и функций, программ. Идентификатор — это любая последовательность букв и цифр, начинающаяся с буквы. В Турбо Паскале к буквам приравнивается также знак подчеркивания. Строчные и прописные буквы в идентификаторах и служебных словах не различаются. Например: max, MAX, MaX и mAx — одно и то же имя. Длина идентификатора может быть произвольной, но значащими являются только первые 63 символа.

Комментарии. Конструкции, заключенные в фигурные скобки {} или в скобки вида (* *) являются комментариями, могут занимать несколько строк и игнорируются компилятором.

Строка, начинающаяся с символов {$ или (*$, является директивой компилятора. За этими символами следует мнемоника команды компилятора. Буквы русского алфавита употребляются только в комментариях, в литерных и текстовых константах. 4]

Арифметические операции и выражения

Знаки операций предназначены для обозначения тех или иных арифметических, логических или других действий. Они бывают двух типов: состоящие из небуквенных символов (например, +, -, * и т. д.) и буквенные операции (например, not, mod, div и т. д.), представляющие собой зарезервированные слова. Операции над данными делятся на унарные (применимые к одному операнду) и бинарные (применимые к двум операндам). Приведем примеры бинарных арифметических операций (в таблице буква I обозначает целые типы, R — вещественные типы):

Знак

Выражение

Типы операндов

Тип результата

Операция

А+В

R, R

I, I

I, R; R, I

R

I

R

Сложение

;

А-В

R, R

I, I

I, R; R, I

R

I

R

Вычитание

*

А*В

R, R

I, I

I, R; R, I

R

I

R

Умножение

А/В

R, R

I, I

I, R; R, I

R

R

R

Вещественное деление

Div

A div B

I, I

I

Целое деление

Mod

A mod B

I, I

I

Остаток от деления

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

Порядок выполнения операций в арифметическом выражении подчиняется трем правилам:

Правилу скобок. Оно гласит, что первыми выполняются операции в скобках. Если имеется несколько пар вложенных скобок, вычисления начинаются с самых внутренних скобок.

Правилу учета приоритета операций: вначале вычисляются значения функций, затем выполняются операции умножения и деления и в последнюю очередь — операции сложения и вычитания.

Правилу следования: операции одинакового старшинства (приоритета) выполняются слева направо в порядке их следования.

Пример. Цифрами сверху указан порядок выполнения операций:

Выражение имеет целый тип, если в результате его вычисления получается величина целого типа. Выражение имеет вещественный тип, если результатом его вычисления является вещественная величина. [4]

Стандартные функции

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

Обращение

Тип аргумента

Тип результата

Тип действия

pi

;

R

Число ?

abs (x)

I, R

I, R

Модуль (абсолютная величина) числа х

sqr (x)

I, R

I, R

Квадрат х

sqrt (x)

I, R

R

Корень квадратный из х (х?0)

sin (x)

I, R

R

Синус х (х в радианах)

cos (x)

I, R

R

Косинус х (х в радианах)

arctan (x)

I, R

R

Арктангенс х (результат в радианах)

exp (x)

I, R

R

Экспонента е в степени х (е?2,71 828)

ln (x)

I, R

R

Натуральный логарифм х (x>0)

trunc (x)

R

I

Целая часть х

int (x)

I, R

R

Целая часть х

round (x)

R

I

Округление х до ближайшего целого

frac (x)

I, R

R

Дробная часть х

random

;

I

Случайное число [0,1)

random (x)

I

R

Случайное число [0,х)

dec (x,[n])

I

I

Уменьшение х на n, при отсутствии n — на 1

inc (x,[n])

I

I

Увеличение х на n, при отсутствии n — на 1

odd (x)

Longint

Boolean

true, если значение x нечетное;

false, если x четное

ord (x)

любой порядковый

Longint

Порядковый номер значения х в его типе. Если х — символ, то функция возвращает код символа

pred (x)

любой порядковый

тот же, что для x

Предыдущее относительно х значение в его типе

succ (x)

любой порядковый

тот же, что для x

Следующее относительно х значение в его типе

chr (x)

Byte

Char

Определяет символ с указанным кодом (х — число, определяющее код символа)

Турбо Паскаль не содержит некоторые часто используемые математические функции, поэтому при их вычислении используют эквивалентные математические формулы

Функция

Эквивалентная математическая формула

Запись в программе

ax

exp (x*ln (a))

tg (x)

sin (x)/cos (x)

arcsin (x)

arctan (x/sqrt (1-x*x))

arccos (x)

arctan (sqrt (1-x*x)/x)

logax

ln (x)/ln (a)

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

Оператор присваивания

Значение переменной может быть задано или изменено с помощью оператора присваивания, который имеет вид:

<�имя>:=<�выражение>;

где <�имя> - это имя переменной или функции;

:= - знак операции присваивания.

Оператор присваивания позволяет заменить текущее значение переменной, стоящей слева от знака присваивания, новым значением, задаваемым выражением, стоящим справа.

С правой стороны располагается выражение, которое после вычисления дает некоторое значение. С левой стороны указывается имя переменной, которой это значение присваивается. Данное обстоятельство позволяет использовать с левой и правой стороны знака присваивания имя одной и той же переменной. Пусть, например, имеются следующие операторы:

Var

х, а: real;

.. .. .

х:=2.5;

а:=1.25;

х:=х+а;

После выполнения этих операторов переменная х будет иметь значение 3.75, так как первоначально произойдет вычисление выражения х + а в виде сложения двух констант: 2.5+ 1.25 = 3.75, а затем это значение присваивается переменной х (предыдущее значение х, равное 2.5, заменится новым — 3.75).

Следует обратить внимание на следующее правило: типы переменной и выражения должны быть одинаковыми. Исключение составляет случай, когда выражение имеет целый тип, а переменная — вещественный. [3]

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

Под массивом понимается совокупность конечного числа данных одного типа. Массив обозначается одним именем. Так, всю совокупность действительных чисел 1.6, 14.9, -5.0, 8.5, 0.46 можно считать массивом и обозначить одним именем, например А. Каждый элемент массива обозначается именем массива с индексом. Элементы массива упорядочены по значениям индекса.

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

А (1), А (2), А (3), А (4), А (5) или А1, А2, А3, А4, A5, или в общем виде {Аi}

где i = 1, 2, 3, …, n.

В языке ПАСКАЛЬ индекс заключается в квадратные скобки. Для рассмотренного примера элементами массива, А являются:

А[1] = 1.6, А[2] = 14.9, А[3] = -5.0, А[4] = 8.5, А[5] = 0.46.

Если в программе используется массив, то он должен быть описан либо в разделе переменных VAR, либо в разделе типов TYPE. Рассмотрим сначала описание массива в разделе переменных VAR. Форма описания имеет вид

VАR имя массива: ARRAY [t1] OF t2;

Здесь ARRAY (массив); OF (из) — служебные слова; t1 — тип индекса, в качестве которого может быть любой простой тип, кроме типа REAL; t2 — тип элементов массива, допустимый на языке ПАСКАЛЬ.

Для предыдущего примера описание массива имеет вид

VAR A: ARRAY [1…5] OF REAL;

Здесь, А — имя массива, элементы которого имеют базовый тип REAL;

тип индекса — ограниченный от 1 до 5.

Следует отметить, что поскольку тип индекса не может быть стандартным целым или действительным типом, то нельзя делать следующее описание массива (часто встречающаяся ошибка)

VAR A: ARRAY OF REAL;

или

VAR A: ARRAY [INTEGER] OF REAL;

Примеры правильного описания массивов:

VAR

MASSIV: ARRAY [1.N] OF REAL ;

ГОД: ARRAY [ЯНВАРЬ.ДЕКАБРЬ] OF INTEGER ;

Если несколько массивов имеют одинаковый тип индексов и одинаковый базовый тип, то допускается в описании объединять массивы в список, например

VAR А, В, С: ARRAY [1.50] OF REAL

Здесь объявлено списком три массива А, В, С действительных чисел, каждый из которых содержит по 50 элементов (от 1 до 50):

A[1], A[2], …, А[50],

B[1], B[2], …, B[50],

C[1], C[2], …, C[50],

Нельзя путать понятия «индекс» и «тип индекса». Тип индекса используется только в разделе описания массива, а индекс указывается в разделе операторов для обозначения конкретных элементов массива. При этом индекс должен быть того же типа, что и описание типа индекса.

В качестве индекса может быть выражение, частным случаем которого является константа или переменная. Элемент массива иначе называется переменной с индексом. В отличие от нее переменная без индекса называется простой переменной.

Элементы массива могут стоять как в левой части оператора присваивания, так и в выражениях.

Над элементами массива можно производить те же операции, которые допустимы для данных его базового типа. Если базовый тип есть INTEGER, то допустимы все операции над данными целого типа, включая и стандартные функции. Примеры использования элементов массива в разделе операторов:

В[5] := В[3] +1;

SUM := SUM — C[K];

Р1:= А[2*I+1] ;

Для ввода и вывода числовых значений массива используются циклы. Например, цикл

FOR I := 1 ТО 9 DO

READ (A[I]) ;

организует ввод девяти значений элементов массива А:

А[1], А[2],…, А[9],

а цикл

FOR I := 1 ТО 9 DO

WRITE (А[I]) ;

вывод девяти значений элементов того же массива.

В языке ПАСКАЛЬ помимо явного описания массивов в разделе переменных имеется другая форма описания, состоящая из двух этапов.

Сначала в разделе описания типов TYPE указывается тип массива. Затем в разделе описания переменных VAR перечисляются массивы, относящиеся к указанному типу.

Введение

типа массива увеличивает раздел описаний, но в то же время упрощает отладку программы и удерживает от абсурдных ошибок, таких, как сложение «ЯБЛОК», с «УСКОРЕНИЕМ СВОБОДНОГО ПАДЕНИЯ».

Указание типов в разделе описаний помогает достичь логической ясности программы и является хорошим стилем программирования. Форма объявления массива имеет вид ТУРЕ имя типа = ARRAY [t1] OF t2;

VAR имя массива: имя типа;

Здесь t1 — тип индекса; t2 — базовый тип элементов массива.

Пусть, например, в программе используется массив R, состоящий из 10 элементов действительного типа. Обозначим тип массива именем MAS. Тогда описание массива можно выполнить следующим образом:

TYPE MAS = ARRAY [1.10] OF REAL;

VAR R: МAS ;

Если в программе несколько массивов, например R, А, В, С, имеют тип MAS, то изменится лишь раздел описания переменных

VAR R, А, В, С: MAS;

Следует отметить, что массивы R, А, В, С используются в разделе операторов программы. Тип массива MAS введен формально только в разделе описаний и нигде в программе не указывается и не обрабатывается.

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

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

5 4 3 6

2 8 1 7

4 3 9 5

Данная матрица имеет размер 3 на 4, т. е. она состоит из трех строк и четырех столбцов. Если всю матрицу обозначить одним именем, например А, то каждый элемент матрицы обозначается с двумя индексами, например A[I, J]. Здесь первый индекс I обозначает номер строки (I = 1, 2, 3), второй индекс J — номер столбца (J = 1, 2, 3, 4). Такую матрицу можно описать следующим образом (с использованием имени типа Т):

1) TYPE Т = ARRAY [1.3, 1.4] OF INTEGER;

VAR A: T;

2) TYPE T = ARRAY [1.3] OF ARRAY [1.4] OF INTEGER ;

VAR A: T;

В первом случае описывается каждый тип индекса, затем указывается простой базовый тип элементов массива INTEGER.

Во втором случае сначала описывается тип данных индекса [1.3], затем указывается сложный базовый тип

ARRAY [1.4] OF INTEGER;

который в свою очередь содержит описание типа другого индекса и простого базового типа INTEGER.

Если в программе необходимо выделять отдельные строки матрицы, то удобно ввести такое описание:

TYPE

Т1 = ARRAY [1.4] OF INTEGER;

Т = ARRAY [1.3] OF T1;

VAR

A: T;

В: Т1 ;

Здесь сначала описывается тип одной строки Т1, а затем через тип строки Т1 — тип всей матрицы Т. В разделе переменных указывается, что, А является двухмерным массивом, т. е. матрицей, а В — одномерным массивом.

1.3 Системные требования

Программа должна корректно работать на следующем или совместимым с ним оборудовании:

§ ПЭВМ IBM PC Pentium и выше;

§ объем свободной оперативной памяти 16 Мб;

§ свободный объем жесткого диска 1 Мб;

§ видеоадаптер SVGA;

§ стандартная клавиатура 101/102;

§ манипулятор типа «мышь»;

§ монитор, поддерживающий режим работы SVGA;

Требования к программным средствам, используемым программой:

Для корректного компилирования и запуска программы необходима операционная система MS-DOS, Windows XP/7, среда программирования Turbo Pascal не ниже версии 7.

2 Математическое описание решения задачи

2.1 Анализ данных

Входные данные:

§ размерность массива MN (число строк и столбцов соответственно);

§ двумерный массив целых чисел размерностью MN.

Выходные данные:

§ произведение всех элементов каждого столбца массива;

§ четыре вектора, составленные из элементов первых четырех строк;

§ количество инверсий (т.е. таких пар элементов, в которых большее число находится слева от меньшего) для каждого вектора.

2.2 Алгоритм решения

1. Произведение элементов каждого столбца.

Вычисление произведения производится по рекуррентному выражению

П = ПY

где П — накапливаемое произведение; Y — сомножители. По данному выражению каждое новое значение получается из предыдущего добавлением очередного множителя.

Для первого сомножителя Y начальное значение произведения П = 1 (если считается произведение всех элементов).

Алгоритм. Расчет произведения элементов столбцов

1 цикл по j от 1 до n

2 pj = 0

3 цикл по i от 1 до m

4 pj = pj* aij

5 конец цикла по i

6 конец цикла по j

2. Формирование векторов

Алгоритм заключается в следующем: в цикле элементы соответствующих строк матрицы переписываются в вектора (при условии, что число строк матрицы не менее 4).

Алгоритм. Формирование одномерных массивов

1 цикл по j от 1 до n

2 A1i = А1j

3 A2i = А2j

4 A3i = А3j

5 A4i = А4j

6 конец цикла по j

3. Определение количества инверсий.

Для подсчета количества инверсий необходимо выполнять следующие шаги: обнуляем счетчик инверсий; просматриваем массив от первого до предпоследнего элемента; сравниваем соседние элементы; если текущий элемент больше следующего, увеличиваем счетчик инверсий на 1. Процесс повторяется пока не будет просмотрены все пары элементов.

Алгоритм. Количество инверсий

1 k = 0

2 цикл по i от 1 до n — 1

3 если ai > ai+1 то

4 k = k + 1

5 конец если

6 конец цикла по i

3 Структурные схемы алгоритма решения задачи

Блок — схема алгоритма вычисления произведения элементов каждой строки матрицы

Блок — схема алгоритма подсчета количества инверсий вектора

4 Описание программы

4.1 Применение программы

Разработанная программа предназначена для обработки массивов и выполняет следующие функции:

§ ввод матрицы с клавиатуры, файла или заполнение при помощи случайных чисел;

§ расчет произведения элементов каждого столбца матрицы;

§ формирование из строк матрицы одномерных массивов;

§ подсчета количества инверсий каждого вектора.

4.2 Разработка программы

Запуск программы Turbo Pascal выполняется любым из стандартных способов запуска, предусмотренных в OC Windows (например, с помощью ярлыка на рабочем столе).

Для перехода к выбору команд главного меню используется клавиша F10. Для возврата в режим редактирования нужно нажать клавишу ESC.

Для получения справки используются клавиши:

F1 — получение контекстно-зависимой справки;

SHIFT+F1 — выбор справки из списка доступных справочных сообщений;

CTRL+F1 — получение справки о нужной стандартной процедуре, функции, о стандартной константе или переменной.

Текст программы набирается в текстовом редакторе среды Turbo Pascal.

После заполнения очередной строки следует нажать клавишу ENTER, чтобы перевести курсор на следующую строку.

Наиболее часто используемые команды редактора Turbo Pascal:

— смещение курсора

Page Up — на страницу вверх;

Page Down — на страницу вниз;

Home — в начало текущей строки;

End — в конец текущей строки;

Сtrl+ Page Up — в начало текста;

Сtrl+ Page Down — в конец текста.

— команды редактирования

Backspase — стирает символ слева от курсора;

Delete — стирает символ, на который указывает курсор;

Ctrl+Y — стирает строку, в которой расположен курсор;

Enter — вставляет новую строку, разрезает старую;

Сtrl+Q L — восстанавливает измененную строку (действует, если курсор не покидал строку после ее изменения).

— работа с блоками

Ctrl+K B — начинает выделение блока;

Ctrl+K K — заканчивает выделение блока (кроме того, блок можно выделить с помощью мыши);

Ctrl+K Y — уничтожает выделенный блок;

Ctrl+K С — копирует блок;

Ctrl+K V — перемещает блок на новое место;

Ctrl+K W — записывает блок в файл;

Ctrl+K R — читает блок из файла;

Ctrl+K P — печатает блок.

Набранный текст программы запишем в файл. Клавишей F2 вызывается окно диалога, в котором следует задать имя файла.

После подготовки текста программы нужно попытаться исполнить ее, т. е. откомпилировать программу, связать ее (если это необходимо) с библиотекой стандартных программ и функций, загрузить в оперативную память и передать ей управление. Эта последовательность действий — прогон программы — осуществляется после нажатия клавиш CTRL+F9.

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

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

С помощью клавиш ALT+F5 в любой момент можно просмотреть данные, выданные на экран в результате прогона программы.

4.3 Описание структуры программы

Разработанная программа состоит из одного модуля MATMAS4.PAS. Рассмотрим его состав.

Пользовательские типы:

Vector — одномерный массив вещественных чисел максимальной размерности 10 элементов.

Matrix — двумерный массив векторов Vector максимальной размерности 10.

Константы:

Mmenu = 6 — количество команд меню;

Menu — строковой массив названий команд меню;

xy — массив координат точек привязки команд меню;

mcolor — массив цветов фона блоков команд.

Глобальные переменные:

ni — количество инверсий для каждого массива, тип integer;

nfont — номер внешнего экранного шрифта, тип integer;

i, j — параметры циклов, тип integer;

gdrv — номер графического драйвера, тип integer;

gmode — номер режима работы монитора, тип integer;

M, N — число строк и столбцов матрицы соответственно, тип integer;

s — служебная строка, тип string;

selected — номер нажатой кнопки, тип integer;

A — исходная матрица, тип Matrix;

P — произведение элементов столбцов матрицы, тип Vector;

Vrow1, Vrow2, Vrow3, Vrow4 — сформированные массивы, тип Vector;

t — файловая переменная, тип text.

Подпрограммы пользователя.

Процедура Border (x1, y1, x2, y2, color)

Назначение: вывод рамки.

Входные параметры:

x1, y1, x2, y2 — координаты левого верхнего и правого нижнего угла рамки, тип integer;

color — цвет рамки, тип integer.

Процедура TextBar (x, y, L, h, forecolor, backcolor, txt, textcolor, fsize)

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

Входные параметры:

x, y — координаты левого верхнего угла прямоугольника, тип integer;

L — длина прямоугольника, тип integer;

h — высота прямоугольника, тип integer;

forecolor — цвет рамки, тип integer;

backcolor — цвет заливки, тип integer;

txt — текст, тип string;

textcolor — цвет текста, тип integer;

fsize — высота текста, тип integer.

Процедура MainMenu (i)

Назначение: выбор пункта меню.

Входные параметры:

i — номер текущего пункта меню, тип integer.

Выходные параметры:

i — номер выбранного пункта меню, тип integer.

Процедура MainScreen

Назначение: вывод главного окна программы.

Процедура WorkWin (x0, y0, x1, y1, forecolor, backcolor, textcolor, fsize)

Назначение: рабочее окно.

Входные параметры:

x0, y0, x1, y1 — координаты левого верхнего и правого нижнего угла рамки, тип integer;

forecolor — цвет рамки, тип integer;

backcolor — цвет заливки, тип integer;

textcolor — цвет текста, тип integer;

fsize — высота текста, тип integer.

Процедура InMatrix (A, M, N, sender)

Назначение: ввод матрицы с клавиатуры или при помощи генератора случайных чисел.

Входные параметры:

sender — флаг ввода: 1 — клавиатура, 0 — автозаполнение.

Выходные параметры:

A — исходная матрица, тип Matrix;

M, N — число строк и столбцов матрицы соответственно, тип integer.

Локальные переменные:

i, j — параметры циклов, тип integer.

s — служебная строка, тип string.

Процедура LoadMatrix (A, M, N)

Назначение: чтение матрицы из файла.

Выходные параметры:

A — исходная матрица, тип Matrix;

M, N — число строк и столбцов матрицы соответственно, тип integer.

Локальные переменные:

i, j — параметры циклов, тип integer;

t — указатель на текстовый файл, тип text;

s — служебная строка, тип string.

Процедура SaveMatrix (A, M, N)

Назначение: запись матрицы в файл.

Выходные параметры:

A — исходная матрица, тип Matrix;

M, N — число строк и столбцов матрицы соответственно, тип integer.

Локальные переменные:

i, j — параметры циклов, тип integer;

t — указатель на текстовый файл, тип text;

s — служебная строка, тип string.

Процедура MulCol (A, M, N, P)

Назначение: вычисление произведения всех элементов каждого столбца массива.

Входные параметры:

A — исходная матрица, тип Matrix;

M, N — число строк и столбцов матрицы соответственно, тип integer.

Выходные параметры:

Р — произведение положительных элементов матрицы, тип Vector.

Локальные переменные:

i, j — параметры циклов, тип integer.

Функция Invers (A, N)

Назначение: расчет количества инверсий (т.е. таких пар элементов, в которых большее число находится слева от меньшего).

Входные параметры:

A — обрабатываемый вектор, тип Vector;

N — число элементов вектора, тип integer.

Выходные параметры: количество инверсий.

Локальные переменные:

k — количество инверсий, тип integer;

i — параметр цикла, тип integer.

4.4 Используемые модули и операторы

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

Модуль Graph представляет собой библиотеку подпрограмм, обеспечивающую полное управление графическими режимами различных адаптеров дисплеев: CGA, EGA, VGA и т. д. Библиотека содержит более пятидесяти графических процедур и функций, как базовых (рисование точек, линий, окружностей и т. п.), так и расширяющих возможности базовых (многоугольники, заполнение фигур, вывод текста и др.).

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

Кроме того, системе программирования (компилятору) должен быть доступен модуль GRAPH. TPU (он не входит в состав файла TURBO. TPL, а изначально находится в архиве BGI. ARC).

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

При разработке программы мной были использованы следующие процедуры и функции:

writeln, write — вывод исходных данных и результатов расчета;

readln — ввод данных;

if. then. else — условный оператор;

for. to. do — оператор цикла;

random — генератор случайных чисел;

while. do — оператор цикла с предусловием;

if. then. else — условный оператор

assign — Процедура связывает файловую переменную с именем файла.

reset — Инициация файла для чтения.

rewrite — Инициация файла для записи.

close — Закрывает файл.

Процедура инициализации InitGraph. Простейшая программа, использующая графику, обязательно должна содержать блок вызова процедур инициализации графического режима и обращение к процедуре его закрытия. Такой блок инициализирует режим, проверяет правильность переключения и, если все операции прошли успешно, допускает дальнейшую работу программы. Процедура инициализации объявлена следующим образом:

InitGraph (VAR GraphDriver; {тип адаптера}

VAR GraphMode Integer; {режим графики}

DriverPath: String); {путь к драйверу}

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

В модуле Graph предусмотрена возможность программного опроса максимальных адресуемых координат экрана. Она реализована парой функций

GetMaxX: Integer;

GetMaxY: Integer.

Процедура вывода линии (отрезка) на экран (в текущем цвете и стиле) определена в следующем виде:

Line (Х1, Y1, Х2, Y2: Integer)

Здесь задаются координаты начала (X1,Y1) и конца (X2,Y2) отрезка.

В модуле Graph предусмотрены процедуры, с помощью которых можно заполнить (залить) определенным «узором» любую замкнутую область изображения. Вид «узора» задается так называемым шаблоном заливки. В Турбо Паскале предопределен ряд стандартных шаблонов, но кроме того, имеется возможность конструировать собственные.

Назначение шаблона заполнения (заливки) производится процедурой

SetFillStyle (Pattern: Word; Color: Word)

где параметр Pattern определяет вид шаблона заливки, a Color — его цвет. Все разрешенные значения параметра Pattern предопределены в модуле Graph в виде констант.

Bar (X1, Y1, X2, Y2: Integer)

рисует прямоугольник, внутренняя область которого залита по текущему шаблону. Она обычно используется в деловой графике для строения столбчатых диаграмм. Параметры (X1,Y1) и (X2, Y2) — координаты верхнего левого и правого нижнего углов прямоугольника. Еще более наглядное представление информации при рисовании диаграмм позволяет получить процедура

Bar3D (X1, Y1, X2, Y2: Integer; D3: Word; Top: Boolean)

Она рисует параллелепипед, лицевая сторона которого заливается по текущему шаблону, а глубина задается в пикселах параметром D3. Параметр Тор задает режим отображения верхней плоскости: True — отображать, False — не отображать. Этот параметр необходим для того, чтобы можно было рисовать столбцы, стоящие друг на друге.

На экране всегда различаются цвет фона и цвет пера. Все процедуры изображения фигур, если не содержат в себе явной установки цвета, рисуют эти фигуры цветом пера (как символы в текстовом режиме). Этот цвет устанавливается процедурой

SetColor (Color: Word)

Цвет фона — всегда един в поле экрана. Он может быть изменен процедурой

SetBkColor (Color: Word)

После использования этой процедуры цвет экрана сразу же меняется на заданный. Параметр Color не должен превышать текущее значение GetMaxColor. Цветом фона может быть любой из разрешенных цветов, в том числе и яркий. По умолчанию и при реинициализации графики цвет фона равен 0 (Black), а цвет пера равен значению функции GetMaxColor.

Активизация любого из названных шрифтов осуществляется процедурой

SetTextStyle (Font, Direction: Word; CharSize: Word)

Здесь параметр Font — номер шрифта (например, одна из описанных выше констант), Direction — расположение текста (по умолчанию принимается горизонтальное).

Для вывода текста использована процедура OutTextXY (X, Y: Integer; TextString: String} выводит строку, ориентированную относительно координат (X, Y).

Функция ReadKey — возвращает символ нажатой клавиши (тип Char).

4.5 Входные и выходные данные

Входные данные:

§ число строк и столбцов матрицы;

§ вещественная прямоугольная матрица.

Выходные данные:

§ произведения элементов каждого столбца;

§ четыре массива, сформированных из строк матрицы;

§ количество инверсий каждого вектора.

Ограничения:

Размерность обрабатываемых матриц — не более 1010.

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

4.6 Инструкция пользователя

Чтобы начать работать необходимо:

§ открыть окно Проводника;

§ выбрать диск на котором расположена программа;

§ найти папку с программой и открыть ее;

§ запустить файл MATMAS4.EXE.

В одном каталоге с программой должен находиться файл поддержки графики Egavga. bgi и файлы шрифтов Trip. chr, Litt.chr.

После запуска программы на экране появляется главное окно, рис. 3.

Рис. 1. Главное окно

Необходимое действие выбирается нажатием клавиш управления курсором, выполнение — клавиша Enter.

Рассмотрим порядок работы с программой. Вначале необходимо ввести исходные данные. В программе предусмотрен ввод с клавиатуры, случайными числами и из текстового файла.

Ввод с клавиатуры. Пользователь задает число строк и столбцов матрицы — целые числа из диапазона от 1 до 10, число строк должно быть не менее 4. Далее вводятся построчно элементы матрицы (рис. 4).

Случайные числа. Пользователь задает только число строк и столбцов матрицы. Элементы матрицы заполняются случайными числами.

Рис. 2 Ввод с клавиатуры

Загрузка из файла. Пользователь задает имя файла (файл должен быть предварительно создан) из которого будут считаны данные. Если файл не существует, выводится сообщение об ошибке (рис. 5).

Рис. 3. Ввод из файла

По окончании ввода исходные данные можно записать в файл — Запись в файл. Предварительно задается имя файла.

После ввода исходных данных выбирается пункт Решение задачи и производится обработка матрицы и вывод результатов расчета на экран Выбор пункта Выход приводит к завершению работы с программой.

4.7 Выполнение контрольного примера

При отладке программы использовался тестовый пример со случайной матрицей. В результате прогонки программы с этим контрольным примером на экран были выведены следующие результаты:

Рис. 4. Результат выполнения программы

Заключение

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

Кроме этого данная курсовая работа позволила закрепить приемы программирования в среде программирования Turbo Pascal:

§ использование в программах стандартных операторов языка;

§ разработка пользовательского интерфейса средствами графического модуля Graph;

§ работа с файлами.

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

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

1. Бондарев В. М., Рублинецкий В. И., Качко Е. Г. Основы программирования. Харьков: Фолио, 1997. -368 с.

2. Гордон Я. Язык программирования Паскаль без секретов: Учебное пособие по программированию на ПК. -М.: «Новый издательский дом», 2004. 319 с.

3. Гусева А. И. Учитесь программировать: Pascal 7.0; Задачи и методы их решения. — М.: «ДИАЛОГ-МИФИ», 1997. — 256 с.

4. Епанешников А. М., Епанешников В. А. Программирование в среде Turbo Pascal 7.0. -М.: Диалог-МИФИ, 2005. -288 с.

5. Поляков Д. Б., Круглов И. Ю. Программирование в среде Турбо Паскаль / Справочно-методическое пособие. -М.: Изд-во МАИ, 1992. -506 с.

6. Фаронов В. В. Turbo Pascal 7.0. Начальный курс М.: Нолидж, 1997. -616 с.

Приложение

Листинг программы

Program v26;

Uses Graph, Crt;

type

Vector = array [1.10] of real;

Matrix = array [1.10] of Vector;

const

Mmenu = 6;

Menu: array [1.Mmenu] of string[25] = ({меню}

'Ввод с клавиатуры',

'Случайные числа',

'Загрузка из файла',

'Запись в файл',

'Решение задачи',

'Выход');

xy: array [1.Mmenu, 1.2] of integer = ((7, 6), (7, 160), (7, 314),

(320, 6), (320, 160), (320, 314));

mcolor: array [1.Mmenu] of integer = (White, LightGray, White, LightGray,

White, LightGray);

var

ni, nfont, i, j, gdrv, gmode: integer;

s: string;

selected: integer;

M, N: integer;

A: Matrix;

P, Vrow1, Vrow2, Vrow3, Vrow4: Vector;

t: text;

Procedure Border (x1, y1, x2, y2, color: integer);

begin

SetColor (color + 8);

Rectangle (x1 — 1, y1 — 1, x2 + 1, y2 + 1);

Rectangle (x1 + 1, y1 + 1, x2 — 1, y2 — 1);

SetColor (color);

Rectangle (x1, y1, x2, y2);

end;

Procedure TextBar (x, y, L, h, forecolor, backcolor: integer;

txt: string; textcolor, fsize: integer);

var

lt, ht: integer;

Old: TextSettingsType;

begin

GetTextSettings (Old);

SetColor (forecolor);

SetFillStyle (1, backcolor);

Bar3D (x, y, x + L, y + h, 0, True);

SetTextStyle (1, 0, fsize);

lt := TextWidth (txt);

ht := TextHeight (txt);

SetColor (textcolor);

OutTextXY (x + (L — lt) div 2, y + (h — ht) div 2, txt);

SetTextStyle (Old.Font, 0, Old. CharSize);

end;

Procedure MainMenu (var i: integer);

{выбор пункта меню}

var

ch: char;

begin

repeat

ch := Readkey; {читаем клавишу}

if ch = #0 then

ch := Readkey;

if ch in [#72, #75, #77, #80] then

begin

TextBar (xy[i, 1], xy[i, 2], 310, 150, LightBlue,

mcolor[i], Menu[i], Black, 1);

case ch of {обработка}

#77:

begin

i := i + 3;

if i > Mmenu then i := i — 3;

end;

#75:

begin

i := i — 3;

if i < 1 then i := i + 3;

end;

#80:

begin

i := i + 1;

if i > Mmenu then i := 1;

end;

#72:

begin

i := i — 1;

if i < 1 then i := Mmenu;

end;

end;

TextBar (xy[i, 1], xy[i, 2], 310, 150, LightBlue,

Green, Menu[i], White, 1);

end;

until ch = #13; {пока не нажата Enter}

end;

Procedure MainScreen;

var

i: integer;

begin

ClearDevice;

Border (2, 2, GetMaxX — 3, GetMaxY — 3, Red);

for i := 1 to Mmenu do

TextBar (xy[i, 1], xy[i, 2], 310, 150, LightBlue,

mcolor[i], Menu[i], Black, 1);

selected := 1;

TextBar (xy[selected, 1], xy[selected, 2], 310, 150, LightBlue,

Green, Menu[selected], Black, 1);

end;

procedure WorkWin (x0, y0, x1, y1, forecolor, backcolor,

textcolor, fsize: integer);

{рабочее окно}

begin

ClearDevice;

SetColor (forecolor);

SetFillStyle (1, backcolor);

Bar3D (x0, y0, x1, y1, 0, True);

SetTextStyle (nfont, 0, fsize);

SetColor (textcolor);

end;

Procedure InMatrix (var A: Matrix; var M, N: integer; sender: integer);

{ввод матрицы с клавиатуры}

var

i, j: integer;

s: string;

begin

TextColor (15);

SetColor (0);

OutTextXY (130, 30, 'Введите число строк M (>=4): ');

GotoXY (37, 2);

ReadLn (M);

OutTextXY (130, 42, 'Введите число столбцов N: ');

GotoXY (37, 3);

ReadLn (N);

for i := 1 to M do

begin

if sender = 1 then

begin

Str (i, s);

OutTextXY (130, 42 + i * 17, 'Введите строку ' + s + ': ');

GotoXY (30, 3 + i);

end;

for j := 1 to N do

if sender = 1 then

Read (A[i, j])

else

A[i, j] := Round (Random * 500 — 250) / 100;

if sender = 1 then

ReadLn;

end;

OutTextXY (130, 250, 'Ввод завершен.');

OutTextXY (130, 270, 'Нажмите Enter для продолжения.');

ReadLn;

end;

Procedure LoadMatrix (var A: Matrix; var M, N: integer);

{чтение матрицы из файла}

var

i, j: integer;

s: string;

t: text;

begin

TextColor (15);

SetColor (0);

OutTextXY (130, 30, 'Имя файла с данными: ');

GotoXY (37, 2);

ReadLn (s);

{$I-}

Assign (t, s); Reset (t);{$I+}

if IOResult <> 0 then

begin

OutTextXY (130, 50, 'Файл не найден!');

OutTextXY (130, 70, 'Нажмите Enter для продолжения.');

ReadLn;

Exit;

end;

ReadLn (t, M, N);

for i := 1 to M do

begin

for j := 1 to N do

Read (t, A[i, j]);

ReadLn (t);

end;

Close (t);

OutTextXY (130, 50, 'Матрица загружена.');

OutTextXY (130, 70, 'Нажмите Enter для продолжения.');

ReadLn;

end;

Procedure SaveMatrix (A: Matrix; M, N: integer);

{запись матрицы в файл}

var

i, j: integer;

s: string;

t: text;

begin

TextColor (15);

SetColor (0);

OutTextXY (130, 30, 'Имя файла для записи:');

GotoXY (37, 2);

ReadLn (s);

Assign (t, s); Rewrite (t);

WriteLn (t, M, ' ', N);

for i := 1 to M do

begin

for j := 1 to N — 1 do

Write (t, A[i, j]: 3:2,' ');

WriteLn (t, A[i, N]: 3:2);

end;

Close (t);

OutTextXY (130, 50, 'Матрица сохранена.');

OutTextXY (130, 70, 'Нажмите Enter для продолжения.');

ReadLn;

end;

Procedure MulCol (A: Matrix; M, N: integer; var P: Vector);

{вычисление произведения всех элементов каждого столбца массива}

var

i, j: integer;

begin

for j := 1 to N do

begin

P[j] := 1;

for i := 1 to M do

P[j] := P[j] * A[i, j];

end;

end;

Function Invers (var A: Vector; N: integer): integer;

{расчет количества инверсий (т.е. таких пар элементов, в

которых большее число находится слева от меньшего)}

var

i, k: integer;

begin

k := 0;

for i := 1 to N — 1 do

if A[i] > A[i + 1] then

k := k + 1;

Invers := k;

end;

begin

gmode := VGAHi;

gdrv := VGA;

nfont := InstallUserFont ('litt');

InitGraph (gdrv, gmode, '');

SetTextJustify (0, 0);

SetTextStyle (nfont, 0, 1);

SetColor (15);

DirectVideo := False;

Randomize;

repeat

MainScreen;

MainMenu (selected);

WorkWin (2, 2, GetMaxX — 3, GetMaxY — 3, Red, White, Black, 4);

case selected of

1: InMatrix (A, M, N, 1);

2: InMatrix (A, M, N, 2);

3: LoadMatrix (A, M, N);

4: SaveMatrix (A, M, N);

5: begin

Assign (t, 'temp'); Rewrite (t);

Vrow1 := A[1];

Vrow2 := A[2];

Vrow3 := A[3];

Vrow4 := A[4];

MulCol (A, M, N, P);

WriteLn (t, 'Матрица');

for i := 1 to M do

begin

for j := 1 to N do

Write (t, A[i, j]: 8:2);

WriteLn (t);

end;

WriteLn (t);

WriteLn (t, 'Произведение элементов столбцов');

for j := 1 to N do

Write (t, P[j]: 8:2);

WriteLn (t);

WriteLn (t);

WriteLn (t, 'Массив 1');

for j := 1 to N do

Write (t, Vrow1[j]: 8:2);

WriteLn (t);

ni := Invers (Vrow1, N);

WriteLn (t, 'количество инверсий ', ni);

WriteLn (t, 'Массив 2');

for j := 1 to N do

Write (t, Vrow2[j]: 8:2);

WriteLn (t);

ni := Invers (Vrow2, N);

WriteLn (t, 'количество инверсий ', ni);

WriteLn (t, 'Массив 3');

for j := 1 to N do

Write (t, Vrow3[j]: 8:2);

WriteLn (t);

ni := Invers (Vrow3, N);

WriteLn (t, 'количество инверсий ', ni);

WriteLn (t, 'Массив 4');

for j := 1 to N do

Write (t, Vrow4[j]: 8:2);

WriteLn (t);

ni := Invers (Vrow4, N);

WriteLn (t, 'количество инверсий ', ni);

Close (t);

Reset (t);

SetColor (0);

j := 25;

while not EOF (t) do

begin

ReadLn (t, s);

OutTextXY (20, j, s);

j := j + 11;

end;

Close (t);

OutTextXY (20, j + 11, 'Нажмите Enter для продолжения.');

ReadLn;

end;

end;

until selected = Mmenu;

CloseGraph;

end.

.ur

Показать весь текст
Заполнить форму текущей работой