Учебная работа. Курсовая работа: Разработка программы для сдвига элементов матрицы по слоям

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (5 оценок, среднее: 4,80 из 5)
Загрузка...
Контрольные рефераты

Учебная работа. Курсовая работа: Разработка программы для сдвига элементов матрицы по слоям

Содержание

Введение

1. Теоретическая часть. Управляющие структуры языка Delphi

2. Анализ задачки

3. Блок – схема метода

4. Управление юзера

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

4.2 структура программки

4.3 {Инструкция} юзера

5. Тестовый пример

Заключение

Перечень использованной литературы

приложение


Введение

Delphi – среда зрительного программирования. Зрительное программирование базируется на объектно-ориентированной технологии. Структурной единицей зрительного программирования, главным «строительным элементом» для программки является компонент.

Компонент – это разновидность класса, который представлен пиктограммой на гамме компонент Delphi, быть может зрительно перенесен в программку и имеет набор параметров, которые можно определять, не изменяя текста программ. В этом сущность зрительного программирования.

Как и хоть какой класс, компонент характеризуется полями, качествами и способами. В Delphi заместо полей обычно употребляются характеристики. Свойство можно разглядывать как разновидность поля класса, воззвание к которому автоматом приводит к вызову способа чтения / записи поля. (Напомним, что неплохим стилем в объектно-ориентированном программировании считается воззвание к полям лишь через способы).

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

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


1.
Теоретическая часть.
Управляющие структуры языка Delphi

На практике изредка встречаются задачки, метод решения которых является линейным. Нередко оказывается, что метод решения даже простой задачки не является линейным. К примеру, пусть нужно вычислить по формуле ток в электронной цепи. Если представить, что юзер постоянно будет вводить верные данные, то метод решения данной задачки вправду является линейным. Но полагаться на то, что юзер будет вести себя так, как следует программке, не следует. Формула расчета подразумевает, что величина сопротивления не равна нулю. А что будет, если юзер введет 0? Ответ обычной: возникнет ошибка «Деление на ноль», и программка аварийно окончит работу. Можно, естественно, возложить ответственность за это на юзера, но лучше внести конфигурации в метод решения (рис. 1), чтоб расчет производился лишь в том случае, если введены верные данные.

Рис. 1. Два варианта метода решения одной задачки


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


Условие

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

Величина сопротивления равна нулю?

Ответ верный?

Сумма покупки больше 300 рублей?

В программке условие – это выражение логического типа (Boolean), которое может принимать одно из 2-ух значений: True (правда) либо False (ересь).

Обычное условие состоит из 2-ух операндов и оператора сопоставления. В общем виде условие записывается последующим образом: Оn1 Оператор On2

где:

On1 и Оп2 – операнды условия, в качестве которых может выступать переменная, константа, функция либо выражение;

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

В языке Delphi есть 6 операторов сопоставления, которые приведены в табл. 1.

Таблица 2.1. Операторы сопоставления


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

>
больше
True, если 1-ый операнд больше второго, по другому False

<
Меньше
True, если 1-ый операнд меньше второго, по другому False

=
Равно
True, если 1-ый операнд равен второму, по другому False

<>
Не равно
True, если 1-ый операнд не равен второму, по другому False

>=
больше либо равно
True, если 1-ый операнд больше либо равен второму, по другому False

<=
Меньше либо равно
True, если 1-ый операнд меньше либо равен второму, по другому False

Ниже приведены примеры критерий: Summa < 1000 Score >= HBound Sim = Chr(13).

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

Во 2-м примере в качестве операндов употребляются переменные.

В 3-ем примере в качестве второго операнда употребляется функция. Значение этого условия будет True, если в переменной Sim находится символьный код клавиши <Enter>, равный 13.

При записи критерий следует направить особенное внимание на то, что операнды условия должны быть 1-го типа либо, если тип операндов различный, то тип 1-го из операндов быть может приведен к типу другого операнда. к примеру, если переменная Key объявлена как integer, то условие Key = Chr(13) синтаксически неправильное, т.к.

Во время трансляции программки при обнаружении неправильного условия компилятор выводит сообщение: incompatible types (несопоставимые типы).

Из обычных критерий с помощью логических операторов: and – «логическое И», or – «логическое ИЛИ» и not – «отрицание» можно строить сложные условия.

В общем виде сложное условие записывается последующим образом: условие1 оператор условие2

где:

условие1 и условие2 – обыкновенные условия (выражения логического типа);

оператор – оператор and либо or.

к примеру:

(ch >= ‘0’) and (ch <= ‘9’)

(day = 7) or (day = 6)

(Forml. Editl. Text <> ‘ ‘) or (Forml. Edit2. Text <> «)

Forml. CheckBoxl. Checked and (Forml. Editl. Text <> «)

Итог выполнения логических операторов and, or и not представлен в табл. 2.

Таблица 2. Выполнение логических операций


Op1
Op2
Opt and Op2
Op1 or Op2
not Op1

False
False
False
False
True

False
True
False
True
True

True
False
False
True
False

True
True
True
True
False

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

к примеру, пусть условие предоставления скидки сформулировано последующим образом: «Скидка предоставляется, если сумма покупки превосходит 100 руб. и денек покупки – воскресенье», Если денек недельки обозначен как переменная Day целого типа, и равенство ее значения 7 соответствует воскресенью, то условие предоставления скидки можно записать: (Summa > 100) and (Day = 7).

Если условие предоставления скидки дополнить тем, что скидка предоставляется в хоть какой денек, если сумма покупки превосходит 500 руб., то условие можно записать: ((Summa > 100) and (Day =7)) or (Summa > 500).


Выбор

Выбор в точке разветвления метода еще одного шага программки быть может реализован с помощью инструкций if и case. {Инструкция} if дозволяет избрать один из 2-ух вероятных вариантов, {инструкция} case – один из нескольких.


{Инструкция} if

{Инструкция} if дозволяет избрать один из 2-ух вероятных вариантов развития программки. Выбор осуществляется зависимо от выполнения условия.

В общем виде {инструкция} if записывается так:

if условие then

begin

// тут аннотации, которые нужно выполнить,

// если условие поистине.

end

else

begin

// тут аннотации, которые нужно выполнить, // если условие неверно. end;

Обратите внимание, что перед else (опосля end) точка с запятой не ставится.

Производится {инструкция} if последующим образом:

1. Рассчитывается

2. Если условие поистине (

Если условие неверно (

На рис. 2 представлен метод, соответственный аннотации if–tnen–else.


Рис. 2. метод, реализуемый аннотацией if–then–else

к примеру, если переменная t обозначает тип соединения сопротивлений в электронной цепи (t=1 соответствует поочередному соединению, t=2 – параллельному), a r1 и r2 – величины сопротивлений, то приведенная ниже {инструкция} if производит выбор формулы, по которой будет выполнен расчет.

if t=l then

begin

z:=r1+r2;

end

else

begin

z:=(r1+r2)/(r1*r2);

end;

Если в аннотации if меж begin и end находится лишь одна {инструкция}, то слова begin и end можно не писать.

к примеру, аннотацию

if otv=3

then

begin

prav:=prav+1;

end

else

begin

ShowMessage (‘Ошибка!’);

end;

можно переписать так:

if otv=3 then

prav:=prav+l

else

ShowMessage (‘Ошибка!’);

Если какое–или действие обязано быть выполнено лишь при выполнении определенного условия и пропущено, если это условие не производится, то {инструкция} if быть может записана так:

if условие then

begin

{аннотации, которые нужно выполнить, если условие производится, поистине} end

На рис. 3 представлен метод, соответственный аннотации if–then.

Рис. 3. метод, реализуемый аннотацией if–then

к примеру, {инструкция}

if n=m

then c:=c+l;

наращивает случае, если значения переменных n и m равны.


{Инструкция} case

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

В языке Delphi есть {инструкция} case, которая дозволяет отлично воплотить множественный выбор. В общем виде она записывается последующим образом:

case Селектор of список1:

begin

{аннотации 1} end; список2:

begin

{аннотации 2} end; списокМ:

begin

{аннотации N}

end;

else

begin

(аннотации)

end;

end;

где:

Селектор – выражение,

Перечень N – перечень констант. Если константы представляют собой спектр чисел, то заместо перечня можно указать первую и последнюю константу спектра, разделив их 2-мя точками. к примеру, перечень 1, 2, 3, 4, 5, 6 быть может заменен спектром 1..6.

Производится {инструкция} case последующим образом:

1. Поначалу рассчитывается

2.

3. Если

4. Если одной константой из всех списков, то производится последовательность инструкций, последующая за else.

Синтаксис аннотации case дозволяет не писать else и подобающую последовательность инструкций. В этом случае, если значение выражения не совпадает ни с одной константой из всех списков, то производится последующая за case {инструкция} программки.

На рис. 4 приведен метод, реализуемый аннотацией case.

Рис. 4. метод, реализуемый аннотацией case


Циклы

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

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

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

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

В программке цикл быть может реализован с помощью инструкций for, while и repeat.


{Инструкция} for

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

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

Процедура TForm1. ButtonlClick (Sender: TObject); var

у: real; //

x: real; // аргумент функции

dx: real; // приращение аргумента

st: string; // изображение таблицы

begin

st:=»;

x:= –1; dx:= 0.5;

у:= 5*х*х –7;

st:= st+ FloatToStr(x)+’ ‘+ FloatToStr(y)+chr(13);

x:=x + dx;

у:= 5*х*х –7;

st:= st+ FloatToStr(x)+* ‘+ FloatToStr(y)+chr(13);

x:=x + dx;

у:= 5*х*х –7;

st:= st+ FloatToStr(x)+* ‘+ FloatToStr(y)+chr(13);

x:=x + dx;

у:= 5*х*х –7;

st:= st+ FloatToStr(x)+’ ‘ + FloatToStr(y)+chr(13);

x:=x + dx;

у:= 5*х*х –7;

st:= st+ FloatToStr(x)+’ ‘+ FloatToStr(y)+chr(13);

x:=x + dx;

Label1. Caption:= st;

end;

Из текста процедуры видно, что группа инструкций

у:= 5*х*х –7;

st:= st+ FloatToStr(x)+’ ‘+ FloatToStr(y)+chr(13);

x:=x + dx;

Обеспечивающая вычисление значения функции, формирование строчки таблицы и повышение аргумента, производится 5 раз.

Воспользовавшись аннотацией for, приведенную функцию можно переписать последующим образом:

Процедура TForm1. ButtonlClick (Sender: TObject);

var

у: real; //

x: real; // аргумент функции

dx: real; // приращение аргумента

st: string; // изображение таблицы

i: integer; // счетчикциклов

begin

st:=»; x:= –1; dx:= 0.5;

for i:=l to 5 do begin

у:= 5*x*x –7;

st:= st+ FloatToStr(x)+’ ‘+ FloatToStr(y)+chr(13); x:=x + dx; end;

Label1. Caption:= st;

end;

2-ой вариант процедуры, во-1-х, просит меньше усилий при наборе, во-2-х, процедура наиболее эластичная: для того чтоб прирастить количество строк в выводимой таблице, к примеру до 10, довольно в строке for i:=1 to 5 do число 5 поменять на 10.

{Инструкция} for употребляется в том случае, если некую последовательность действий (инструкций программки) нужно выполнить несколько раз, при этом число повторений заблаговременно понятно.

В общем виде {инструкция} for записывается последующим образом: for счетчик:= нач_знач to кон_знач do begin

// тут аннотации, которые нужно выполнить пару раз end

где:

счетчик – переменная–счетчик числа повторений инструкций цикла;

нач_знач – выражение, определяющее изначальное

кон_знач – выражение, определяющее конечное

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

количество повторений инструкций цикла можно вычислить по формуле

(кон_знач – нач_знач + l).

Примеры:

for i:=l to 10 do begin

label1.caption:=label1.captionactiveXend;

for i: =1 to n do s:= s+i;

Примечание

Если меж begin и end находится лишь одна {инструкция}, то слова begin и end можно не писать.

метод, соответственный аннотации for, представлен на рис. 5. Обратите внимание, что если изначальное значение счетчика больше конечного значения, то последовательность операторов меж begin и end не будет выполнена никогда.

Не считая того, опосля всякого выполнения инструкций тела цикла счетчик циклов возрастает автоматом.

Переменную–счетчик можно употреблять снутри цикла (но ни в коем случае не изменять).

Рис. 5. Метод аннотации for


{Инструкция} while

{Инструкция} (цикл) while употребляется в том случае, если некую последовательность действий (инструкций программки) нужно выполнить несколько раз, при этом нужное число повторений во время разработки программки непонятно и быть может определено лишь во время работы программки.

Обычными примерами использования цикла while являются вычисления с данной точностью, поиск в массиве либо в файле.

В общем виде {инструкция} while записывается последующим образом:

while условие do begin

// тут аннотации, которые нужно выполнить пару раз

end

где условие – выражение логического типа, определяющее условие выполнения инструкций цикла.

1. {Инструкция} while производится последующим образом:

2. Поначалу рассчитывается

3. Если

4. Если тела цикла. Опосля этого опять проверяется выполнение условия. Если условие производится, то аннотации цикла производятся снова. И так до того времени, пока условие не станет неверным (False).

метод, соответственный аннотации while, представлен на рис. 6.

внимание!

Для того чтоб аннотации цикла while, которые находятся меж begin и end, были выполнены хотя бы один раз, нужно, чтоб перед выполнением аннотации while

Рис. 6. метод аннотации while

Для того чтоб цикл закончился, необходимо, чтоб последовательность инструкций меж begin и end влияла на


{Инструкция} repeat

{Инструкция} repeat, как и {инструкция} while, употребляется в программке в том случае, если нужно выполнить повторные вычисления (организовать цикл), но число повторений во время разработки программки непонятно и быть может определено лишь во время работы программки, т.е. определяется ходом вычислений.

В общем виде {инструкция} repeat записывается последующим образом:

repeat

// аннотации unti1 условие

где условие – выражение логического типа, определяющее условие окончания цикла.

{Инструкция} repeat производится последующим образом:

1. Поначалу производятся находящиеся меж repeat и until аннотации тела цикла.

2. Потом рассчитывается значение выражения условие. Если условие неверно (тела цикла производятся снова.

3. Если условие поистине (

Таковым образом, аннотации цикла, находящиеся меж repeat и unti1, производятся до того времени, пока условие неверно ( равно False).

метод, соответственный аннотации repeat, представлен на рис. 7.

Рис. 7. метод, соответственный аннотации repeat

внимание!

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


{Инструкция} goto

Аннотации if и case употребляются для перехода к последовательности инструкций программки зависимо от некого условия. Потому их время от времени именуют инструкциями условного перехода. Кроме этих инструкций управления ходом выполнения программки существует еще одна – {инструкция} бесспорного перехода goto.

В общем виде {инструкция} goto записывается последующим образом:

goto Метка

где метка – это идентификатор, находящийся перед аннотацией, которая обязана быть выполнена опосля аннотации goto.

Метка, применяемая в аннотации goto, обязана быть объявлена в разделе меток, который начинается словом label и размещается перед разделом объявления переменных.

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

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


2. анализ задачки

Для решения задачки нужны последующие начальные данные:

— число строк матрицы – целочисленное

— число столбцов матрицы – целочисленное

значения частей матрицы – целочисленные значения.

Примем ограничение на размерность матрицы – число строк и столбцов не обязано превосходить 10.

Пошаговый метод решения задачки.

Начальные данные:

n, m – число строк и столбцов соответственно;

aij
– элементы матрицы;

Сij
– матрица цветов всякого элемента;

с – исходный цвет слоя;

di
– массив, составленный из частей слоев;

k – число частей в слое;

fn
– индекс слоя (номер строчки и столбца с которого он начинается), изначальное

1) Формирование слоев.

а. Помещаем в d элементы fn
– й строчки;

б. Помещаем в d элементы m – го столбца начиная с (fn
+ 1) – й строчки по n – ю строчку;

в. Помещаем в d элементы n – й строчки, начиная с m – 1 столбца по fn
столбец;

г. Помещаем в d элементы fn
– го столбца начиная с n – 1‑й строчки по fn
+ 1 строчку;

В надлежащие элементы матрицы цветов С помещаем

2) Сдвигаем элементы массива d на 1 позицию на Право.

а. запоминаем

б. исполняем присвоение di
= di
–1
для i = k, 2;

в. помещаем крайний элемент на пространство первого d1
= t.

3) Изменяем значения:

fn
= fn
+ 1,

n = n – 1,

m = m – 1

и повторяем шаги метода с 1 по 3, пока n > 2 и m > 2.


3. Блок – схема метода









4. Управление юзера




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

Для функционирования приложения нужен индивидуальный комп со последующими чертами:

— микропроцессор CPU – не ужаснее Pentium;

— оперативная память RAM – не наименее 16 Мб;

— свободное место на твердом диске – не наименее 500 Кбайт;

— обычная мышь для COM порта;

— обычная IBM PC/АT клавиатура;

Приложение работает под управлением операционной системы Windows 95/98/2000/ХР. Наличие среды зрительного программирования для работы программки не является неотклонимым.










4.2 Структура программки

программка состоит из последующих программных модулей:

unit1 – основной интерфейсный модуль;

ms – проект.

Разглядим состав головного модуля.

В нем определены два пользовательских типа данных:

mas – одномерный массив целых чисел из 100 частей;

mat – двумерный массив целых чисел размерности 10´10 частей.

цвета слоев описывает константа – массив частей TColor – cc.

Более важные переменные программки.

mf, тип string – имя файла с матрицей;

c – двумерный массив цветов слоев с элементами типа TColor;

a, тип mat – данная матрица;

k, тип integer – счетчик слоев;

d, тип mas – одномерный массив с элементами слоя;

n, m, тип integer – число строк и столбцов матрицы;

f, тип textfile – текстовый файл из которого считывается матрица.

Процедуры юзера.

Sdvig (d, n)

Предназначение: сдвиг массива по часовой стрелке.

характеристики:

d, тип mas – одномерный массив с элементами слоя;

n, тип integer – число частей массива;

SloiColor (fn, n, m, sd)

Предназначение: определение цветов слоев и их сдвиг.

характеристики:

fn, тип integer – номер определяемого слоя;

n, m, тип integer – число строк и столбцов матрицы;

sd, тип boolean – логическая переменная, имеющая цвет.

MQuitClick

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

MOpenFileClick

Предназначение: открыть файл данных.

FillGrid (a, n, m)

Предназначение: вывод матрицы с данными цветами частей.

характеристики:

a, тип mat – данная матрица;

n, m, тип integer – число строк и столбцов матрицы;

MRunClick

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


Рис. 8. Окно программки









4.3 {Инструкция} юзера

Разглядим последовательность действий юзера при использовании программки для сдвига частей матрицы. Ему нужно запустить на выполнение программку, которая именуется «ms.exe».

Для удобства пуска программки под управлением Microsoft Windows, можно создать последующее: щелкните правой клавишей мыши по Рабочему Столу Windows Þ в показавшемся меню изберите Сделать Þ Ярлычек Þ в показавшемся окне в Командной строке набираем путь доступа к программке и жмем клавишу Дальше Þ в последующем окне назовем наш ярлычек Сдвиг и жмем клавишу Дальше Þ изберите иконку и нажмите клавишу Готово. сейчас у Вас на десктопе находится иконка программки.

Опосля пуска юзер увидит на дисплее окно, изображенное на рисунке 8.

В верхней строке окна находится основное меню с 2-мя пт:

файл. Содержит подпункты:

— Открыть – загрузка матрицы из текстового файла;

— Выход – окончить работу с программкой.

Обработка, содержит один подпункт Начать – пуск метода сдвига частей матрицы.

Остальную часть окна занимает область вывода матрицы.

порядок работы:

-выбрать файл с начальными данными файл — Открыть;

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

Для хранения матриц употребляется текстовый файл со последующей структурой:

1 строчка – два целочисленных значения n, m из спектра 1…10 разбитые пробелом – число строк и столбцов матрицы соответственно;

В следующих n строчка размещена сама матрица, m целочисленных значений в строке, разделитель – пробел.

нужно держать в голове, что обработке подлежат матрицы наибольшей размерности 10´10 частей.


5. Тестовый пример


Заключение

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

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

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

В теоретической части работы мной были приведены материалы о программирование в среде Delphi.


Перечень использованной литературы

1. Бобровский С.И. Delphi 7. Исходный курс: Учебное пособие – М.: Диалог – МИФИ, 2002. -416 с.

2. Гофман В.Э. Delphi 7. – Спб.: BHV‑Петербург, 2003. -488 с.

3. Лишнер Рэй. Delphi. Справочник. – М.: БЕК, 2003. -715 с.

4. Поган А.М., Царенко Ю.А. Программирование в Delphi. Просто как два раза два. – М.: Нолидж, 2004. -557 с.


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

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Menus, Grids, StdCtrls;

type

mas = array [1..100] of integer;

mat = array [1..10, 1..10] of integer;

TForm1 = class(TForm)

MainMenu1: TMainMenu;

N1: TMenuItem;

MOpenFile: TMenuItem;

N4: TMenuItem;

MQuit: TMenuItem;

N6: TMenuItem;

MRun: TMenuItem;

OpenDialog1: TOpenDialog;

StringGrid1: TStringGrid;

procedure MQuitClick (Sender: TObject);

procedure MOpenFileClick (Sender: TObject);

procedure MRunClick (Sender: TObject);

procedure FillGrid (a: mat; n, m: integer);

private

{Private declarations}

public

{Public declarations}

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

const

cc: array [1..10] of TColor = (clBlue, clFuchsia, clGreen,

clLime, clMaroon, clNavy, clOlive,

clRed, clTeal, clYellow);

var

mf: string; // имя файла с матрицей

c: array [1..10, 1..10] of TColor; // массив цветов слоев

a: mat; // заданая матрица

k: integer; // счетчикслоев

procedure Sdvig (var d: mas; n: integer);

var

i, l: integer;

begin

if n = 0 then Exit;

l:= d[n];

for i:= n downto 2 do

d[i]:= d [i – 1];

d[1]:= l;

end;

procedure SloiColor (fn, n, m: integer; sd: boolean);

var

i, j: integer;

d: mas;

begin

if ((n >= 2) or (m >= 2)) and ((fn < n) and (fn < m)) then

begin

j:= 0;

for i:= fn to m do

begin

c [fn, i]:= cc[k];

j:= j + 1;

d[j]:= a [fn, i];

end;

for i:= fn + 1 to n do

begin

c [i, m]:= cc[k];

j:= j + 1;

d[j]:= a [i, m];

end;

for i:= m – 1 downto fn do

begin

c [n, i]:= cc[k];

j:= j + 1;

d[j]:= a [n, i];

end;

for i:= n – 1 downto fn + 1 do

begin

c [i, fn]:= cc[k];

j:= j + 1;

d[j]:= a [i, fn];

end;

if sd then

begin

Sdvig (d, j);

j:= 0;

for i:= fn to m do

begin

j:= j + 1;

a [fn, i]:= d[j];

end;

for i:= fn + 1 to n do

begin

j:= j + 1;

a [i, m]:= d[j];

end;

for i:= m – 1 downto fn do

begin

j:= j + 1;

a [n, i]:= d[j];

end;

for i:= n – 1 downto fn + 1 do

begin

j:= j + 1;

a [i, fn]:= d[j];

end;

end;

Inc(k);

SloiColor (fn + 1, n – 1, m – 1, sd);

end;

end;

procedure TForm1.MQuitClick (Sender: TObject);

var

fi: integer;

begin

fi:= Application. MessageBox (‘Вы вправду желаете окончить программку?’,

информация‘, mb_YesNo); // вывод окна

if fi = IDYes then

Application. Terminate; // выход

end;

procedure TForm1.MOpenFileClick (Sender: TObject);

// открытьфайлданных

var

n, m, i, j: integer;

f: textfile;

begin

if OpenDialog1. Execute then

begin

mf:= OpenDialog1. FileName;

MRun. Enabled:= True;

AssignFile (f, mf); Reset(f);

ReadLn (f, n, m);

for i:= 1 to n do

begin

for j:= 1 to m do

Read (f, a [i, j]);

ReadLn(f);

end;

CloseFile(f);

for i:= 1 to n do

for j:= 1 to m do

c [i, j]:= clBlack;

k:= 1;

SloiColor (1, n, m, false);

FillGrid (a, n, m);

end;

end;

procedure TForm1. FillGrid (a: mat; n, m: integer);

var

i, j: integer;

r: trect;

begin

StringGrid1. Refresh;

for i:= 1 to 10 do

StringGrid1. Cells [i, 0]:= «;

for i:= 1 to 10 do

begin

StringGrid1. Cells [0, i]:= «;

for j:= 1 to 10 do

begin

r:= StringGrid1. CellRect (j, i);

StringGrid1. Canvas. TextOut (r.topleft.x + 1, r. Top + 2, ‘ ‘);

end;

end;

for i:= 1 to m do

StringGrid1. Cells [i, 0]:= IntToStr(i);

for i:= 1 to n do

begin

StringGrid1. Cells [0, i]:= IntToStr(i);

for j:= 1 to m do

begin

StringGrid1. Canvas. Font. Color:= c [i, j];

r:= StringGrid1. CellRect (j, i);

StringGrid1. Canvas. TextOut (r.topleft.x + 1, r. Top + 2, IntToStr (a[i, j]));

end;

end;

StringGrid1. Canvas. Refresh;

end;

procedure TForm1.MRunClick (Sender: TObject);

var

i, j, n, m: integer;

f: textfile;

begin

AssignFile (f, mf); Reset(f);

ReadLn (f, n, m);

CloseFile(f);

for i:= 1 to n do

for j:= 1 to m do

c [i, j]:= clBlack;

k:= 1;

SloiColor (1, n, m, true);

FillGrid (a, n, m);

Append(f);

WriteLn(f);

for i:= 1 to n do

begin

for j:= 1 to m do

Write (f, a [i, j]:5);

WriteLn(f);

end;

CloseFile(f);

end;

end.

]]>