Программное обеспечение КС
Определение и характеристика сущности конвейерных систем, как универсального многофункционального процессора. Ознакомление с процессом разработки программы автоматического преобразования (трансляции) арифметического выражения в параллельную форму.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 06.12.2015 |
Размер файла | 1,3 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Национальный Технический Университет Украины «КПИ»
ФАКУЛЬТЕТ ИНФОРМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ
Курсовой проект
«Программное обеспечение КС»
Выполнила: студентка ФИВТ
VІ-курса гр. ЗИВ-01
Ангелейко Н.И.
Проверила: Русанова О.В.
Киев 2005
Техническое задание
Разработать программу автоматического преобразования (трансляции) арифметического выражения (АВ) в параллельную форму для оптимальной (критерий оптимизации - минимальное время выполнения) его реализации в ВС заданной архитектуры.
1. Произвести синтаксический анализ выражения на предмет его корректности.
2. Построить дерево параллельной формы.
3. Построить множество эквивалентных деревьев параллельной формы с учетом правил раскрытия скобок и правил вынесения за скобки.
4. Выполнить моделирование параллельного выполнения задачи по заданным алгоритмам формирования очереди. По заданию, очередь готовых вычислительных работ формируется при помощи трех алгоритмов:
4.1. Алгоритм формирования очереди в порядке убывания критического по времени путей до конца графа задачи
4.2. Алгоритм формирования очереди в порядке возрастания критического пути по количеству вершин путей от начала графа, а при равных значениях в порядке убывания времени исполнения
4.3. Алгоритм формирования очереди в порядке возрастания критического пути по количеству вершин путей от начала графа задач
4.4. Алгоритм формирования очереди случайным образом
5. Погрузить задачу на вычислительную систему, с учетом алгоритмов формирования очередей вычислительных работ
6. Отобразить состояния ВС потактово.
Исходные данные:
арифметическое выражение в скобочной записи;
конвейерная система со статической перестройкой такта;
1. Теоретические сведения
Конвейерные системы - универсальный многофункциональный процессор. Состоят из одного или множества многофункциональных конвейерных процессоров. Эти системы относятся к классу синхронных. Конвейерные системы можно разделить на следующие классы:
Конвейер - с постоянным тактом.
Конвейер - со статической перестройкой такта.
Конвейер - с динамической перестройкой такта.
Конвейер представляет собой структуру, которая показывает наивысшую производительность при однородном и непрерывном потоке операций. Это объясняется тем, что каждый тип операций требует различных по сложности вычислений, а поэтому и индивидуальных настроек. В конвейерной системе такой настройкой является длительность такта, то есть время вычислений на одном слое. Конвейер со статической перестройкой такта - является многофункциональным, но в фиксированный момент времени работает как однофункциональный. Перестройка конвеера с одной функции на другую происходит только в момент его полного освобождения, т. е. статически.
Модель конвейера
Конвейер представляет собой список выполняемых операций. Каждый элемент списка отражает состояние соответствующего слоя. Каждая операция на слое характеризуется оставшимся временем обслуживания. Когда это время для всех операций в конвейере принимает значение 0, происходит переход между слоями и выборка новой операции.
Каждая операция может находиться в четырех состояниях:
Вне рассмотрения (еще не готова к выполнению)
Ожидание (находится в очереди для выборки)
Выполнение (находится в конвейере)
Закончена (снята с конвейера)
Признаком окончания вычислений является пребывание корневой операции графа в состоянии "закончена".
2. Организация ввода вычислительного алгоритма и его анализ на корректность
2.1 Ввод нового алгоритма
Ввод выражения осуществляется путем нажатия соответствующих кнопок в окне программы с клавиатуры.
Информация о вычислительном алгоритме первично представляется в виде строки символов, в которой привычным образом описывается последовательность выполняемых операций. В числе разрешенных операций "+", "-", "*" и "/". В качестве аргументов могут выступать десятичные целые и дробные константы или переменные. Правила их написания соответствуют общепринятым. Выражение может содержать скобки.
2.2 Синтаксический и лексический анализ
Основной синтаксический и лексический анализ происходит во время выполнения ввода пользователем необходимого арифметического выражения. Ввод выражения осуществляется путем нажатия соответствующих кнопок в окне программы с клавиатуры.
Проверка введенного выражения на предмет соответствия количества открытых скобок количеству закрытых, а так же других синтаксических ошибок, происходит при нажатии на кнопку enter. По результату синтаксического анализа, в поле вывода выдается соответствующее сообщение, с описанием всевозможных синтаксических ошибок. После чего необходимо повторить ввод заново.
3. Отображение арифметического выражения в параллельный граф алгоритма
3.1 Формирование вершин дерева
В основу формирования каждого узла дерева положен следующий принцип. Операция (вершина дерева) считается распознанной, если в списке подряд следуют лексемы: "Аргумент", "Оператор", "Аргумент". Причем в качестве лексемы "Аргумент" могут выступать "Константа", "Переменная" или "Операция", но не "Выражение в скобках". Это гарантирует, что в узел войдут только аргументы текущего уровня или уже объединенные в вершину. После распознания тройка лексем заменяется на одну ("Операция") и распознавание продолжается со следующего элемента списка. При достижении конца списка алгоритм повторяется. При нахождении лексемы "Выражение в скобках" осуществляется построение дерева для этого выражения. Признак завершения - наличие единственной лексемы "Операция", заключенной в скобки. процессор программа автоматический
3.2 Преобразование дерева выражения в очередь заявок для выполнения в конвейере
Преобразование дерева происходит следующим образом:
Производится поиск вершины, потомки которой являются "листьями дерева", т.е. не имеют потомков.
Формируется заявка состоящая из двух операндов ("листьев дерева") и операции, и указывается номер вершины, выполнение которой зависит от данной. Найденная вершина на первом шаге заменяется на вершину не имеющую потомков и состоящей из результата выполнение операции. Первый шаг повторяется до тех пор, пока в дереве останется одна вершина.
4. Применение правил раскрытия скобок и правил вынесения за скобки при вычислении арифметических выражений
На первой стадии осуществляется упрощение выражения с целью устранения его избыточности. Избыточность, представляя собой корректное сочетание лексем, затрудняет обработку выражения. Далее указаны избыточные и соответствующие упрощенные сочетания лексем.
4.1 Раскрытие скобок
Конвейерная архитектура, в отличие от матричной, очень чувствительна к количеству выполняемых операций. Другими словами, как правило, любые преобразования исходного выражения, ведущие за собой увеличение количества операций, заранее проигрышны. К таким преобразованиям относится раскрытие скобок.
Реализация этого метода осуществляется следующим образом:
1. Пусть мы имеем исходное выражение
(a+b)-x*(d-e)+q
2. На следующем шаге исходное выражение разбиваем на «лексемы», т.о. мы получаем следующий набор лексем:
1 |
2 |
3 |
|
(a+b) |
x*(d-e) |
q |
3. Затем, начинаем просмотр всех подвыражений на предмет нахождения скобок.
4. Далее, анализируем наличие знаков (*,/) относительно скобок.
5. Если знаков (*,/) относительно скобок нет, то скобки отбрасываются и выражение переписывается без скобок. Если есть наличие знаков (*,/) перед скобками или за скобками, то тогда содержимое в скобках умножается(делится) на переменную(константу) стоящую перед(после) знака (*,/).
6. Избавление от скобок производится поэтапно:
1- (a+b)-x*(d-e)+q
2- a+b-x*(d-e)+q
3- a+b-x*d+x*e+q
4.2 Вынесение за скобки
Закон вынесения за скобки общих членов применяется для упрощения реализации арифметического выражения не только параллельным образом, но и последовательным. В данной курсовой работе этот метод реализован по следующему алгоритму:
1. Разбивается исходное выражение на отдельные подвыражения («лексемы») относительно знаков « + » и « - ». Таким образом, получаем список выражений, в которых будем отыскивать общие члены.
2. Определяем список всех простейших переменных и числовых констант выражения в целом.
3. Начинаем просмотр всех подвыражений на совпадение переменных и констант, при этом выполняем эту операцию в таком порядке, в котором все значения переменных и числовых констант записаны в списке.
4. Затем мы циклически сдвигаем эти значения в списке и начинаем 3 шаг заново. Выполняем до тех пор, пока не получим исходный список значений.
5. Описание алгоритмов формирования очередей вычислительных работ
5.1 Алгоритм формирования очереди в порядке убывания критического по времени путей до конца графа задачи
Этот алгоритм реализуется при помощи процедуры поиска критического пути по времени до конца задачи для каждой вершины графа, и последующей сортировки вершин в порядке убывания этих критических путей. Рассмотрим пример:
a * (b +c ) - d / (e - f)
время выполнения операции +, - 1 такт
время выполнения операции *, / 2 такта
Алгоритм:
Создаем двумерный массив, с числом ячеек равным количеству вершин. Заполняем его номерами вершин, ячейки зарезервированные для времени критического пути оставляем пустыми.
Используя алгоритм Дейкстра из каждой вершины проходим до конца графа, записывая для каждой ячейки критический путь.
Простейшей сортировкой сортируем их по убыванию критического пути.
Выводим результат.
5.2 Алгоритм формирования очереди в порядке возрастания критического пути по количеству вершин путей от начала графа, а при равных значениях в порядке убывания времени исполнения
Для того, чтобы сформировать очередь вычислительных работ по этому алгоритму мы должны предварительно отсортировать вершины по ярусам, а вершины, которые находятся на одном ярусе расположить в порядке убывания времени исполнения (весов вершин).
Возьмем пример, рассмотренный в п.5.1 рис.2.
1. Для каждой из вершин графа расчитываем Nkpi (критический путь і- тых вершин от начала графа по их количеству)
Nkpi1 = 1
Nkpi1 = 1
Nkpi1 = 2
Nkpi1 = 2
Nkpi1 = 3
2. Формируем очередь в порядке возрастания по Nkpi .
3. При равных значениях Nkpi, рассматриваем веса этих вершин, и ставим их по убыванию. 1(1), 2(1), 3(2), 4(2), 5(3)
Алгоритм:
1. Устанавливаем свойство Nkpi всех вершин в 0;
2. Находим вершины, из которых нет входящих связей, Nkpi этих вершин устанавливается равным 1;
3. Находим все вершины, для которых Nkpi всех вершин с которыми они связаны входящими связями не равно 0. Nkpi данных вершин присваиваем максимальное значение из Nkpi наследников + 1
4. Пункт 3 повторяется до тех пор, пока Nkpi для всех вершин не будет рассчитано.
5.3 Алгоритм формирования очереди в порядке возрстания критического пути по количеству вершин путей от начала графа задач
Для каждой из вершин графа расчитываем Nkpi (критический путь і- тых вершин от начала графа по их количеству). Затем, формируем очередь в порядке возрастания по Nkpi. 1(1), 2(1), 3(2), 4(2), 5(3)
5.4 Алгоритм формирования очереди случайным образом
1. Очередь формируется случайным образом.
2. Выбирается заявка из очереди.
3. Анализируется приоритет и Текущая операция в конвейере.
4. Если приоритет =0 и текущая операция совпадает с операцией заявки или конвейер пуст. Заявка поступает в конвейер. Если нет п.5.
5. Такт конвейера увеличивается на 1, если операция +,- нижний слой передает результат в верхний, если *,/ остается на 1 такт в своем слое.
6. После выхода заявки из конвейера, у заявки потомка (выполнение зависит от результата родителя). Приоритет уменьшается на 1. п.2.
6. Алгоритм погружения на вычислительную систему
Для реализации алгоритма погружения в качестве исходных данных используется дерево параллельной реализации задачи и очередь, сформированная одним из четырех алгоритмов;
Моделирование конвейера
Моделирование конвейера. Приняты следующие допущения. Количество слоев в конвейере 4. Время выполнения операции +,- 1 такт, время выполнения операции *,/ 2 такта. Значение приоритета может быть 0 ( заявка не зависит от результатов выполнения каких либо заявок), 1 (заявка зависит от выполнения одной заявки ), и 2 ( заявка зависит от выполнения двух заявок)
Погружаем задачу на вычислительную систему, с учетом алгоритмов формирования очередей вычислительных работ.
Результаты работы программы
Работа модуля программы по синтаксическому и лексическому анализу выражения
Результаты работы модуля программы по построению параллельного графа введенного выражения и исследования эффективности применения правил раскрытия скобок и вынесения за скобки
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Список литературы
1. Русанова О.В. Программное обеспечение компьютерных систем.- К.: «Корнійчук», 2003.-94 с.
2. Системы параллельной обработки /Под ред.Д.Ивенса.-М:Мир, 1985 - 413 с.
3. Корнеев В.В. Параллельные вычислительные системы.-М.: «Нолидж», 1999.-320 с.
4. Э.А.Трахтенгерц Программное обеспечение параллельных процессов.М.:Наука, 1987.-272 с.
Приложение
Листинг программы
unit Prg_my;
interface
uses
Windows, SysUtils,Dialogs,ComCtrls;
type
Pinfo =^info;
serch = record
maxy : integer;
iNumer :word;
end;
info =record
sp1,sp2:string;
sgn:char;
Md:string;
end;
inf2 =record
S1:string;
Prior :word;
MyNum :word;
MyPar :word;
sgn :char;
end;
Ary=array of info;
Ar2=array of inf2;
procedure ClSk (lkS :string; var glS :string);
procedure OpSk (ST0: string;V : byte;var ST1 :string);
procedure Comt(i_St:string;var o_ST :string);
procedure Check_STR(var Str: string;var Fl:boolean);
procedure FormArr(var st:string;var Mas_Rec:Ary){ BuildTree(var st:string;var Mas_Rec:Ary)};
function Extr(St: string;var i:word):string;
function SupExtr(St: string;var i:word):string;
procedure F_MulArr(var st:string;var Mar:Ary;var sSt:string);
function Half(i:byte):byte;
procedure SubZero(var SPT: string;const c:byte);
procedure Sgnl(var S : string);
function Cl(S0:string):word;
procedure Comt2(inST:string;var outST :string);
procedure SortArr(var B: ar2);
implementation
Uses Tree,classes;
procedure SortArr(var B: ar2);
var i,j: word;
tmp :inf2;
begin
for i:=low(B) to High(B)-1 do
for j:=i+1 to High(B) do
if B[j].Prior<=b[i].Prior then
begin
tmp:=B[i];
B[i]:=B[j];
B[j]:=tmp;
end;
end;
function SupExtr(St: string;var i:word):string;
var tm_I:string;
begin
tm_I:=extr(ST,i);
while (ST[i]='/')or(ST[i]='*') do begin
tm_I:=tm_I+Extr(ST,i);
end;
Result:=tm_I;
finalize(tm_I);
end;
procedure Comt2(inST:string;var outST :string);
var i,j :word;
tm_I:String;
begin
i:=1;
j:=i;
tm_I:=Supextr(inST,j);
if tm_I[1]<>'-' then begin
tm_I:='+'+tm_I;
if inST[j]='-' then inST:='-'+inST;
end;
if (tm_I[1]='-')and(inST[j]='+') then delete(inST,1,1);
delete(inST,i,length(tm_I));
insert(tm_I,inST,length(inST)+1);
outST:=inST;
end;
procedure Comt(i_St:string;var o_ST :string);
var i,j : word;
tmpS1,tmpS2 : string;
sgn: char;
begin
i:=1;
while i<=length(i_ST) do begin
j:=i;
tmpS1:=Supextr(i_ST,j);
if (i=1)and(tmpS1[i]<>'-') then tmpS1:='+'+tmpS1;
if j>= length(i_ST) then begin o_ST:=i_ST;exit;end;
tmpS2:=SupExtr(i_ST,j);
if (i=1)and(tmpS2[1]<>'-') then begin delete(tmpS2,1,1);end;
if (i=1)and(tmpS2[1]='-')and(tmpS1[1]='+') then begin i_ST:='!'+i_ST;inc(j);end;
if (i=1)and(tmpS2[1]<>'-')and(tmpS1[1]='-') then begin delete(i_ST,1,1);dec(j);end;
begin
tmpS1:=tmpS2+tmpS1;
delete(i_ST,i,length(tmpS1));
insert(tmpS1,i_ST,i);
end;
i:=j;
end;
o_ST:=i_ST;
end;
function Cl(S0:string):word;
var i,j:word;
begin
j:=0;
for i:=1 to length(S0) do begin
if S0[i]='(' then inc(j);
end;
result:=j;
end;
procedure ClSk (lkS :string; var glS :string);
var List1: TStringList;
tmS : string;
i,j : word;
begin
list1:=TStringList.Create;
i:=1;
while i<=length(lkS) do begin
j:=i;
tmS:=Extr(lkS,j);
list1.Add(tmS);
inc(j);
i:=j;
end;
//Form1.memo2.lines.assign(list1);
list1.Free;
end;
procedure Sgnl(var S: string);
var j:word;
begin
j:=1;
while j<>0 do begin
j:=Pos('+-',S);
if j<>0 then begin
delete(S,j,2);
insert('-',S,j);
end;
j:=Pos('-+',S);
if j<>0 then begin
delete(S,j,2);
insert('-',S,j);
end;
j:=Pos('--',S);
if j<>0 then begin
delete(S,j,2);
insert('+',S,j);
end;
end;
end;
procedure OpSk (ST0: string;V : byte;var ST1 :string);
var i,y,j,k,f,Sizer : word;
tmp1,t0 : string;
tmpST,sgn : string;
begin
i:=1;
j:=1;
tmpST:='';
ST1:=ST0;
Sizer:=length(ST0);
if (Pos('(',ST0)=1)or(Pos('+(',ST0)<>0)or(Pos('-(',ST0)<>0) then begin
while i<=length(ST0) do
begin
if (i=1)and(ST0[i]='(') then begin
j:=i;
tmpST:=Extr(ST0,j);
if ST0[j] in ['*','/'] then break;
Delete(ST0,i,length(tmpST));
Delete(tmpST,1,1);
Delete(tmpST,length(tmpST),1);
insert(tmpST,ST0,i);
if Sizer<>length(ST0) then begin Sgnl(ST0);ST1:=ST0;exit;end;
end;
j:=1;
tmpST:='';
if (ST0[i]='(')and((i>1)and(ST0[i-1]in['+','-','('])) then
begin
j:=i;
tmpST:=Extr(ST0,j);
if ST0[j] in ['*','/'] then break;
if ST0[i-1]='-' then
Subzero(tmpST,1);
Delete(ST0,i,length(tmpST));
Delete(tmpST,1,1);
Delete(tmpST,length(tmpST),1);
insert(tmpST,ST0,i);
if Sizer<>length(ST0) then begin Sgnl(ST0);ST1:=ST0;exit;end;
dec(i);
end;
inc(i);
end;
Sgnl(ST0);
if Sizer<>length(ST0) then begin ST1:=ST0;exit;end;
end;
//---------------------------
i:=1;
j:=1;
k:=1;
if (Pos('*(',ST0)<>0)or(Pos(')*',ST0)<>0) then begin
while i<=length(ST0) do begin
j:=i;
tmp1:='';
tmpST:=Extr(ST0,j);
f:=j+1;
t0:=Extr(ST0,F);
if (t0[1]='(')and(ST0[j]='*')and(Pos('(',tmpST)=0) then begin
if tmpST[1] in ['-','+'] then begin delete(tmpST,1,1);inc(i);end;
tmp1:=t0+ST0[j]+tmpST;
delete(ST0,i,length(tmp1));
insert(tmp1,ST0,i);
tmp1 := t0;
t0 := tmpST;
tmpST:= tmp1;
tmp1:='';
j:=i+length(tmpST);
end;
if (tmpST[1]='(') and (ST0[j]='*')and(ST0[i-1]<>'*') then begin
repeat
tmp1:=tmp1+Extr(ST0,j);
until ST0[j]<>'*';
if ST0[i-1]='-' then begin
Subzero(tmpST,1);
end;
Delete(ST0,i,length(tmpSt));
Delete(tmpSt,1,1);
Delete(tmpSt,length(tmpSt),1);
k:=1;
y:=0;
if (tmpST[k]in ['-','+']) then inc(k);
while k<=length(tmpST) do begin
if tmpST[k]='(' then inc(y);
if tmpST[k]=')' then dec(y);
if y=0 then begin
case tmpSt[k] of
'+':begin insert(tmp1,tmpST,k);inc(k,length(tmp1));end;
'-':begin insert(tmp1,tmpST,k);inc(k,length(tmp1));end;
end;
end;
inc(k);
end;
insert(tmpST,ST0,i);
j:=i+length(tmpST)+length(tmp1);
if Sizer<>length(ST0) then begin Sgnl(ST0);ST1:=ST0;exit;end;
end;
inc(j);
i:=j;
end;
Sgnl(ST0);
end;
if ST0[1]='+' then delete(ST0,1,1);
//------------
ST1:=ST0;
end;
procedure OpenSK (ST0: string;V : byte;var ST1 :string);
var i,j,T0,k : word;
tmpST : string;
muler : string;
begin
T0:=0;
i:=1;
muler:='*XX';
while i<=length(ST0) do
begin
if (ST0[i]='(')and((i=1)or(ST0[i-1]in['+','-','('])) then
begin
tmpST:=Copy(ST0,i,length(ST0)+1-i);
j:=i;
tmpST:=Extr(ST0,j);
Delete(ST0,i,length(tmpST));
Delete(tmpST,1,1);
Delete(tmpST,length(tmpST),1);
insert(tmpST,ST0,i);
dec(i);
//i:=j;
ST1:=ST0;
end;
if (ST0[i]='(')and(ST0[i-1]='*') then
begin
j:=i;
tmpST:=Extr(ST0,j);
Delete(ST0,i,length(tmpST));
Delete(tmpST,1,1);
Delete(tmpST,length(tmpST),1);
k:=1;
if tmpST[k]='-' then inc(k);
while k<=length(tmpST) do begin
case tmpST[k] of
'+':begin insert(muler,tmpST,k);inc(k,length(muler));end;
'-':begin insert(muler,tmpST,k);inc(k,length(muler));end;
end;
inc(k);
end;
insert(muler,tmpST,k);
insert(tmpST,ST0,i);
ST1:=ST0;
end;
inc(i);
end;
end;
procedure SubZero (var SPT :string;const c:byte);
var i,y : byte;
begin
y:=0;
for i:=1 to length(SPT) do begin
if SPT[i]='(' then inc(y);
if SPT[i]=')' then dec(y);
if y=1 then
case SPT[i] of
'+':SPT[i]:='-';
'-':SPT[i]:='+';
end;
end;
if C=0 then begin
if SPT[2]<>'+' then insert('-',SPT,2)
else delete(SPT,2,1);
end;
if C=1 then begin
if SPT[2]='+' then begin delete(SPT,2,1);
insert('-',SPT,2);
end;
end;
end;
function Half(i:byte):byte;
begin
if i=1 then Half:=1
else if (i mod 2)=1 then Result:=(i div 2)+1
else Result:=(i div 2);
end;
function Extr (St:string;var i:word):string;
var tmp : string;
ct,f : byte;
begin
ct:=0;
f:=0;
Repeat
if St[i]='(' then begin inc(ct);f:=1;end;
if St[i]=')' then begin dec(ct);end;
tmp:=tmp+St[i];
INC(i);
Until not(St[i] in ['0'..'9','(','a'..'z'])and(f=0)or(ct=0)and(f=1);
Result:=tmp;
end;
procedure FormArr (var st:string;var Mas_Rec:Ary);
var from : byte;
tmp1,tmp2,St1 : string;
Sgn,Z1 : char;
k : 0..10;
i:word;
begin
if (length(st)=0) then begin exit;end;
k :=0;
St1 :='';
from :=1;
Repeat
I :=1;
tmp1 :='';
tmp2 :='';
if St[i]='+' then inc(i);
tmp1:=Extr(St,i);
Mas_Rec[k].Md:='';
if i<=length(st) then
begin
Sgn :=St[i];
inc(i);
tmp2:=Extr(St,i);
if St[i]='-' then dec(i);
Z1:=St[i];
if (z1 in ['*','/'])
then
begin
if (sgn in ['-','+'])then from:=length(tmp1)+1
else tmp2:=tmp1+sgn+tmp2;
if sgn='-' then tmp2:=sgn+tmp2;
Mas_Rec[k].Md:=tmp2;
repeat
Mas_Rec[k].Md:=Mas_Rec[k].Md+Extr(St,i);
until not(st[i] in ['*','/'])or(i>=length(st));
i:=i-from;
end;
Mas_Rec[k].sp1:=tmp1;
Mas_Rec[k].sp2:=tmp2;
Mas_Rec[k].sgn:=sgn;
end
else
begin
Mas_Rec[k].sp1:=tmp1;
Mas_Rec[k].sp2:='0';
Mas_Rec[k].sgn:=sgn;
end;
inc(k);
Delete(St,from,i);
i:=1;
from:=1;
until i>length(st);
SetLength(Mas_Rec,k);
end;
//-----------------------------------------
procedure Check_STR (var Str:String;var Fl:boolean);
var
k,i : word;
Flag : Boolean;
tmpstr : String;
Sign : array[0..50] of char;
begin
K :=0;
tmpstr :='0';
Flag :=true;
if str[1] in ['+','*','/'] then begin ShowMessage('Error in '+IntToStr(1));exit;end;
if str[length(str)] in ['+','*','/','-'] then begin ShowMessage('Error in '+IntToStr(length(str)));exit;end;
try
for i:=1 to length(str) do
begin
if (str[i] in ['0'..'9',',','a'..'z']) then tmpstr:=tmpstr+Str[i]
else
begin
sign[k]:=Str[i];
if (sign[k]='(')and(tmpstr<>'0') then begin ShowMessage('Error in '+IntToStr(i));exit;end;
if (sign[k]=')')and(str[i+1] in ['0'..'9','a'..'z','('])and(i<length(str)) then begin ShowMessage('Error in '+IntToStr(i+1));exit;end;
if (sign[k]=')')and(str[i-1] in ['+','-','*','/'])and(i>1) then begin ShowMessage('Error in '+IntToStr(i-1));exit;end;
if (sign[k]='(')and(i<length(str))and(str[i+1] in ['+','*','/']) then begin ShowMessage('Error in '+IntToStr(i+1));exit;end;
if (sign[k] in ['+','-','*','/'])and(i<length(str))and(str[i+1] in ['+','-','*','/'])then begin ShowMessage('Error in '+IntToStr(i+1));exit;end;
tmpstr:='0';
k:=k+1;
Flag:=not(Flag);
end;
end;
FL:=true;
except
end;
end;
procedure F_MulArr (var st:string;var Mar:Ary;var sSt:string);
var from : byte;
tmp1,tmp2,St1 : string;
Sgn,s2 : char;
k : 0..10;
i: word;
begin
if (length(st)=0) then begin exit;end;
k :=0;
St1 :='';
from :=1;
sst :='';
Repeat
I :=1;
tmp1 :='';
tmp2 :='';
tmp1:=Extr(St,i);
if i<=length(st) then
begin
Sgn :=St[i];
inc(i);
tmp2:=Extr(St,i);
MaR[k].sp1:=tmp1;
MaR[k].sp2:=tmp2;
MaR[k].sgn:=sgn;
s2:=st[i];
sSt:=sSt+s2;
end
else
begin
MaR[k].sp1:=tmp1;
MaR[k].sp2:='0';
MaR[k].sgn:=s2;
sSt:=sSt+s2;
end;
inc(k);
Delete(St,from,i);
i:=1;
from:=1;
until i>length(st);
SetLength(MaR,k);
end;
end.
Лексический анализ-----
unit check;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Memo1: TMemo;
Button1: TButton;
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Edit1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
s:string[80];
GlobStr,tmp :string;
x,kol_sk,z:integer;
Form1: TForm1;
LevelTree:integer;
implementation
uses Tree;
{$R *.DFM}
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if ord(key) = 13 then
begin
kol_sk:=0;
z:=0;
s:=Edit1.Text;
Globstr:=Edit1.Text;
Memo1.Clear;
for x:=1 to Edit1.GetTextLen-1 do
begin
//----------Два знака подряд--------------
if ((s[x] in ['+','-','*','/']) and (s[x+1] in ['+','-','*','/']))
then
begin
tmp :='Два знака подряд - '+s[x]+s[x+1];
Memo1.Lines.Add(tmp);
end;
//----------Пустые скобки--------------
if (((s[x]='(') and (s[x+1]=')')) or ((s[x]=')') and (s[x+1]='(')))
then
begin
tmp :='Пустые скобки (),)( - '+s[x]+s[x+1];
Memo1.Lines.Add(tmp);
end;
//----------Знак перед скобкой или знак после скобки--------------
if (((s[x]='(') and (s[x+1] in ['+','*','/'])) or ((s[x+1]=')') and (s[x]in ['+','-','*','/'])))
then
begin
tmp :='Знак перед скобкой или знак после скобки - '+s[x]+s[x+1];
Memo1.Lines.Add(tmp);
end;
//----------Число перед скобкой или число после скобки--------------
if (((s[x]=')') and (s[x+1] in ['0'..'9'])) or ((s[x+1]='(') and (s[x]in ['0'..'9'])))
then
begin
tmp :='Число перед скобкой или число после скобки - '+s[x]+s[x+1];
Memo1.Lines.Add(tmp);
end;
end;
for x:=1 to Edit1.GetTextLen do
begin
//----------Недопустимый символ--------------
if s[x] in ['A'..'Z','a'..'z','+','-','*','/','(',')','0'..'9']
then
else
begin
tmp :='Недопустимый символ - '+s[x];
Memo1.Lines.Add(tmp);
end;
//---------количество скобок )---------------
if s[x]=')'
then
begin
kol_sk :=kol_sk-1;
end;
//---------количество скобок (---------------
if s[x]='('
then
begin
kol_sk :=kol_sk+1;
end;
//------------------------Закрывающая скобка без открывающей
if ((kol_sk < 0) and (z = 0)) then
begin
z:=z+1;
tmp :='Закрывающая скобка без открывающей - ';
Memo1.Lines.Add(tmp);
end;
end;
if kol_sk <> 0 then
begin
tmp :='Не одинаковое количество откр. и закр. скобок - ';
Memo1.Lines.Add(tmp);
end;
if s[1] in ['+','*','/']
then
begin
tmp :='Первый знак';
Memo1.Lines.Add(tmp);
end;
if s[Edit1.GetTextLen] in ['+','*','/','-']
then
begin
tmp :='Последний знак - ';
Memo1.Lines.Add(tmp);
end;
if Memo1.GetTextLen =0 then
begin
Memo1.Lines.Add('ВЫРАЖЕНИЕ СИСНТАКСИЧЕСКИ ВЕРНО!');
Button1.Enabled:=true;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Enabled:=false;
kol_sk:=0;
z:=0;
for x:=1 to Edit1.GetTextLen
do s[x]:=' ';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show;
Form2.BildClick(Sender);
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
form1.Button1.Enabled:=false;
end;
end.
Построение дерева ------
unit tree;
interface
uses
Windows, Messages, SysUtils,Forms, Dialogs,
StdCtrls, Buttons, Prg_my,
ComCtrls, ExtCtrls, Classes, Controls, Grids;
type
Tlayer = record
Parent :word;
Str :string;
sop :char;
end;
PTint=^word;
Tconv = class(TObject)
layer: array[0..4] of Tlayer;
actOper :char;
actTimer :word;
empty :boolean;
procedure inCon(St1:string;sgn :char;Num :word);
procedure Tik(var B :Ar2; ti :word);
procedure cDraw(var Ts1,Ts2,TS3,Ts4: TStaticText);
end;
TForm2 = class(TForm)
Panel1: TPanel;
BitBtn1: TBitBtn;
LB1: TListBox;
TreeView1: TTreeView;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure BildClick(Sender: TObject);
procedure CloseClick(Sender: TObject);
procedure OnMoClick(Sender: TObject);
procedure Memo1KeyPress(Sender: TObject; var Key: Char);
procedure BitBtn1Click(Sender: TObject);
procedure Memo1Enter(Sender: TObject);
procedure comClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure LB1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
private
procedure TreeBld(Ar: Ary;var TN:TTreeNode;Ssn:string);
procedure BuildTree(Ar: Ary;var TN:TTreeNode);
procedure Scobc(var swp:TTreeNode;ch_st:string);
procedure BAll(BA_Str: string; var TN:TTreeNode; Ar :Ary);
procedure BB2C( iNum :word);
public
Flag:boolean;
Ar_Node: array[0..1] of TTreeNode;
g_str,op_str : string;
cou_str: byte;
BigArray :TStringlist;
BigA :Ar2;
aCount : word;
Maximum: serch;
end;
var
Form2: TForm2;
Conv: Tconv;
pint: PTint;
implementation
uses check;
{$R *.DFM}
procedure Tconv.cDraw(var Ts1,Ts2,TS3,Ts4: TStaticText);
begin
TS1.Caption:=layer[0].Str;
TS2.Caption:=layer[1].Str;
tS3.Caption:=layer[2].Str;
Ts4.Caption:=layer[3].Str;
end;
procedure Tconv.Tik(var B :Ar2; ti :word);
var j: byte;
gh: byte;
begin
if actTimer>0 then dec(actTimer);
if (actOper in ['*','/'])and((ti) mod 2 =0) then exit;
for j:=4 downto 1 do begin
layer[j]:=layer[j-1];
end;
layer[0].Str:='';
layer[0].Parent:=0;
layer[0].sop:=#11;
gh:=0;
if layer[4].Str<>'' then begin
dec(B[layer[4].Parent].Prior);
if (layer[3].Str='')and(layer[3].Parent=0) then actOper:=#11;
for j:=0 to 3 do begin
if layer[j].sop='*' then gh:=2;
if layer[j].sop='/' then gh:=2;
end;
if gh=2 then actOper:='*';
if gh=0 then actOper:=#11;
layer[4].Str:='';
layer[4].Parent:=0;
layer[4].sop:=#11;
end;
end;
procedure Tconv.inCon(st1 :string;sgn: char;Num :word);
begin
if (layer[0].Str='') then begin
layer[0].Parent:=Num;
layer[0].Str:=St1;
layer[0].sop:=sgn;
case sgn of
'+','-':inc(actTimer,4);
'/','*':begin inc(actTimer,8); actOper:='*'; end;
end;
end;
end;
procedure TForm2.BB2C( iNum :word);
var Item,Del :TTreeNode;
tr:TTreeNodes;
i,j,mul,Icount :word;
Flg,Fl :boolean;
ChecFlag: boolean;
Ar0:Ary;
begin
SetLength(BigA,25);
ChecFlag:=(iNum=0);
item:=Form2.treeview1.Items[0];
Acount:=0;
New(Pint);
bigarray.Clear;
Icount:=1;
Form2.treeview1.Visible:=false;
while Form2.treeview1.Items.Count>2 do begin
if Item.GetNext<> nil then Item:=Item.GetNext
else item:=Form2.treeview1.Items[0];
if item.HasChildren then begin
if (not(item.Item[0].HasChildren))and(not(item.Item[1].HasChildren)) then begin
bigArray.Add(item.Item[0].text+item.text+item.Item[1].Text);
BigA[Acount].S1:=item.Item[0].text+item.text+item.Item[1].Text;
BigA[Acount].Prior:=0;
BigA[Acount].sgn:=item.text[1];
BigA[Acount].MyNum:=Acount;
inc(Icount);
if item.item[0].Data<>nil then begin
PTint(item.item[0].Data)^:=Acount;
inc(BigA[Acount].Prior);
end;
if item.item[1].data<>nil then begin
pTint(item.item[1].Data)^:=Acount;
inc(BigA[Acount].Prior);
end;
inc(Acount);
Del:=item;
pint:=@(BigA[Acount-1].MyPar);
del:=Form2.treeview1.items.InsertObject(del,'['+BigA[aCount-1].S1+']',pint);
item.Delete;
item:=del;
end;
end;
end;
Ball(GlobStr,AR_Node[0],Ar0);
Form2.treeview1.Visible:=true;
if Acount=0 then begin finalize(BigA);exit;end;
SetLength(BigA,Acount);
j:=0;
Flg:=true;
Fl:=True;
conv.layer[0].Str:='';
conv.actTimer:=0;
mul:=1;
for i:=1 to 100 do begin
if (BigA[j].Prior=0)then begin
Flg:=(Conv.layer[0].Str='');
Conv.inCon(BigA[j].S1,BigA[j].sgn,BigA[j].MyPar);
if Flg then inc(j);
end;
if (conv.layer[0].Str='')and(conv.layer[1].Str='')and(conv.layer[2].Str='')and(conv.layer[3].Str='') then conv.actTimer:=0;
if (j>=ACount)and(conv.actTimer=0) then break;
if conv.actOper in['*','/'] then inc(mul);
if Fl and(conv.actOper in['*','/']) then begin mul:=2;Fl:=false; end;
if conv.actOper in['+','-'] then Fl:=true;
Conv.Tik(BigA,mul);
end;
if i<maximum.maxy then
begin
maximum.maxy:=i;
maximum.iNumer:=iNum;
end;
finalize(BigA);
end;
procedure TForm2.Scobc(var swp:TTreeNode;ch_st:string);
var TM_A: Ary;
begin
swp.text:='+';
Delete(ch_st,1,1);
Delete(ch_st,length(ch_st),1);
Setlength(TM_A,25);
FormArr(ch_st,TM_A);
BuildTree(TM_A,swp);
finalize(TM_A);
end;
procedure TForm2.BuildTree(Ar: Ary;var TN:TTreeNode);
var TM_A,u_m: Ary;
jk :byte;
sgnSt:string;
T_t,swpT:TTreeNode;
begin
if high(Ar)=low(Ar) then
begin
if Ar[low(Ar)].sp2='0' then
begin
tn.Text:=Ar[low(Ar)].sp1;
with Ar[low(Ar)] do begin
if (sp1[1]='-')and(sp1[2]='(') then
begin
Delete(sp1,1,1);
SubZero(sp1,0);
end;
if sp1[1]='(' then Scobc(Tn,sp1);
end;
end
else begin
if Ar[low(Ar)].Md<>'' then
begin
SetLength(u_m,15);
F_MulArr(Ar[low(Ar)].Md,u_m,sgnSt);
jk:=Half(length(sgnSt));
tn.Text:=sgnst[jk];
TreeBld(u_m,Tn,sgnSt);
finalize(u_m);
end
else begin
Tn.Text:=Ar[low(Ar)].sgn;
with Ar[low(Ar)] do begin
swpT:=Form2.TreeView1.Items.addChild(Tn,sp1);
if (sp1[1]='-')and(sp1[2]='(') then
begin
Delete(sp1,1,1);
SubZero(sp1,0);
end;
if sp1[1]='(' then begin
Scobc(swpT,sp1);
end;
swpT:=Form2.TreeView1.Items.addChild(Tn,sp2);
if sp2[1]='(' then begin
Scobc(swpT,sp2);
end;
end;
end;
end;
exit
end
else
begin
TM_A:=Copy(Ar,low(Ar),((low(Ar)+high(Ar)) div 2)+1);
t_t:=Form2.TreeView1.Items.addChild(Tn,'+');
BuildTree(TM_A,t_t);
TM_A:=Copy(Ar,((low(Ar)+high(Ar)) div 2)+1,((low(Ar)+high(Ar)) div 2)+1);
t_t:=Form2.TreeView1.Items.addChild(Tn,'+');
BuildTree(TM_A,t_t);
finalize(TM_A);
end;
end;
procedure TForm2.TreeBld(Ar: Ary;var TN:TTreeNode;Ssn:string);
var TM_A: Ary;
jk,sco :byte;
locSt:string;
T_t,swpT:TTreeNode;
begin
if high(Ar)=low(Ar) then
begin
if Ar[low(Ar)].sp2='0' then begin tn.Text:=Ar[low(Ar)].sp1;
if Ar[low(Ar)].sp1[1]='(' then
Scobc(Tn,Ar[low(Ar)].sp1);
end
else begin
Tn.Text:=Ar[low(Ar)].sgn;
with Ar[low(Ar)] do begin
swpT:=Form2.TreeView1.Items.addChild(Tn,sp1);
if (sp1[1]='-')and(sp1[2]='(') then
begin
Delete(sp1,1,1);
SubZero(sp1,0);
end;
if sp1[1]='(' then begin
Scobc(swpT,sp1);
end;
swpT:=Form2.TreeView1.Items.addChild(Tn,sp2);
if sp2[1]='(' then begin
Scobc(swpT,sp2);
end;
end;
end;
exit
end
else
begin
jk:=Half(length(SSn));
sco:=((low(Ar)+high(Ar)) div 2)+1;
TM_A:=Copy(Ar,low(Ar),sco);
locst:=Copy(SSn,low(Ar),((low(Ar)+high(Ar)) div 2)+1);
sco:=((low(Tm_A)+high(Tm_A))div 2)+1;
t_t:=Form2.TreeView1.Items.addChild(Tn,locst[sco]);
TreeBld(TM_A,t_t,SSn);
//--------------------------------
sco:=((low(Ar)+high(Ar)) div 2)+1;
TM_A:=Copy(Ar,((low(Ar)+high(Ar)) div 2)+1,sco);
locst:=Copy(SSn,jk,high(Ar)+1);
sco:=Half(length(locst));
t_t:=Form2.TreeView1.Items.addChild(Tn,locst[sco]);
TreeBld(TM_A,t_t,SSn);
end;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
maximum.maxy:=1000;
cou_str:=1;
Conv:=Tconv.Create;
Conv.actOper:=#11;
Conv.empty:=false;
BigArray:=TstringList.Create;
aCount:=0;
end;
procedure TForm2.BildClick(Sender: TObject);
var
A:Ary;
lin:string;
begin
Form2.TreeView1.Items.Clear;
lin:=trim(Form1.Edit1.text);
op_STR:=lin;
lb1.Clear;
lb1.Items.Add(lin);
AR_Node[0]:=Form2.TreeView1.Items.add(nil,'Корень дерева');
AR_Node[0]:=Form2.TreeView1.Items.add(AR_Node[0],'+');
Setlength(A,25);
FormArr(lin,A);
BuildTree(A,AR_Node[0]);
AR_Node[0].Expand(True);
finalize(A);
finalize(lin);
BitBtn1.Enabled:=true;
end;
procedure TForm2.CloseClick(Sender: TObject);
begin
Close;
end;
procedure TForm2.OnMoClick(Sender: TObject);
var STR: string;
begin
Str:=trim(Form1.Edit1.Text);
end;
procedure TForm2.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 then
begin
BildClick(Sender);
BitBtn1.SetFocus;
end;
end;
procedure TForm2.BitBtn1Click(Sender: TObject);
var A0 : Ary;
STR : string;
c0,c1 : byte;
begin
STR:=trim(form1.Edit1.Text);
if Pos('(',STR)=0 then begin showmessage('Скобок больше нет');exit;end;
if STR='' then begin showmessage('Пустая строка');exit;end;
c0:=cl(STR);
c1:=length(STR);
repeat
OpSK(STR,0,STR);
until (c0<>cl(STR))or(c1<>length(STR));
form1.Edit1.Text:=STR;
LB1.Items.Add(STR);
inc(cou_str);
BALL(STR,AR_Node[1],A0);
//---------------------
finalize(A0);
finalize(STR);
end;
procedure TForm2.BAll(BA_Str: string; var TN:TTreeNode; Ar :Ary);
begin
Form2.TreeView1.Items.Clear;
TN:=Form2.TreeView1.Items.add(nil,':'+'Результат');
TN:=Form2.TreeView1.Items.add(TN,'+');
Setlength(Ar,25);
FormArr(BA_STR,Ar);
BuildTree(Ar,TN);
TN.Expand(True);
end;
procedure TForm2.Memo1Enter(Sender: TObject);
begin
BitBtn1.Enabled:=false;
end;
procedure TForm2.comClick(Sender: TObject);
var A0: Ary;
STR: string;
data,res: string;
StrTmp,StrTmp1:string;
begin
StrTmp:=Form1.Edit1.Text;
repeat
data :=Form1.Edit1.Text;
Comt2(data,res);
StrTmp1:=res;
Form1.Edit1.Text :=res;
LB1.Items.Add(res);
Comt(res,res);
LB1.Items.Add(res);
until StrTmp = StrTmp1;
finalize(A0);
finalize(STR);
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Conv.Free;
Bigarray.Free;
end;
procedure TForm2.LB1Click(Sender: TObject);
var i,K: word;
Ar0: Ary;
Loc_Str: string;
begin
for i := 0 to (LB1.Items.Count - 1) do begin
if LB1.Selected[i] then
begin
Loc_Str:=LB1.Items.Strings[i];
GlobStr:=loc_str;
k:=Pos(' ;',Loc_Str);
if k<>0 then delete(Loc_Str,k,length(loc_str)-(k-1));
Ball(Loc_Str,AR_Node[0],Ar0);
end;
end;
finalize(Ar0);
finalize(Loc_Str);
end;
procedure TForm2.BitBtn2Click(Sender: TObject);
begin
BB2c(0);
end;
procedure TForm2.BitBtn5Click(Sender: TObject);
begin
Close;
end;
procedure TForm2.BitBtn4Click(Sender: TObject);
var i,k: word;
Ar0:Ary;
loc_Str: string;
begin
if lb1.Items.Count=0 then exit;
for i:=0 to lb1.Items.Count-1 do begin
Loc_Str:=LB1.Items.Strings[i];
k:=Pos(' ;',Loc_Str);
if k<>0 then delete(Loc_Str,k,length(loc_str)-(k-1));
Ball(Loc_Str,AR_Node[0],Ar0);
BB2C(1);
end;
finalize(Ar0);
maximum.maxy:=1000;
end;
end.
Размещено на Allbest.ru
Подобные документы
Обзор методов составления математических моделей систем автоматического управления. Математические модели системы в векторно-матричной форме записи. Моделирование в пакете программы Simulink. Оценка устойчивости системы, рекомендации по ее применению.
курсовая работа [514,5 K], добавлен 10.11.2011Техническое задание для разработки программного обеспечения "Больница". Обоснования для проведения разработки. Цель, назначение подсистемы. Требования ко всем видам обеспечения программы. Общесистемное программное обеспечение. Применение языка Delphi 6.0.
курсовая работа [832,9 K], добавлен 18.01.2010Определение и свойства алгоритма, его разработка. Технология создания прикладной программы. Системное программное обеспечение персонального компьютера, его назначение. Приложения, входящие в пакет MS Office XP. Характеристика внутренних и внешних модемов.
методичка [1,7 M], добавлен 26.03.2010Сравнительный анализ программ-аналогов, характеристика инструментальных средств разработки. Анализ требований и определение спецификаций программного обеспечения, отладка и тестирование программы. Изучение руководства по использованию программы.
курсовая работа [2,1 M], добавлен 10.04.2023Методологии разработки информационных систем в отечественной и зарубежной литературе. Государственные и международные стандарты в области разработки программного обеспечения. Разработка фрагмента информационной системы "Учебно-методический ресурс".
курсовая работа [364,6 K], добавлен 28.05.2009Определение и характеристика цели автоматизации проектирования. Ознакомление с достоинствами процесса внутреннего шлифования. Исследование и анализ сущности САПР – системы, объединяющей технические средства, математическое и программное обеспечение.
курсовая работа [949,8 K], добавлен 02.06.2017Анализ технического обеспечения информационных систем (микропроцессоры). Программное обеспечение информационных систем. Классификация программного обеспечения. Программы подготовки первичных документов на примере "1С: Бухгалтерия", "1С: Налогоплательщик".
контрольная работа [808,5 K], добавлен 20.07.2010Функциональное описание процесса разработки системы автоматического проектирования цилиндрической емкости. Математическая постановка и программное обеспечение задачи. Алгоритм работы программы и результаты ее работы, анализ использования основных окон.
курсовая работа [876,0 K], добавлен 20.12.2012Понятие арифметического выражения как записи математической формулы. Использование при записи арифметического выражения констант, переменных и скобок. Расстановка скобок в выражении по старшинству операций. Описание алгоритма, программа и ее реализация.
курсовая работа [602,6 K], добавлен 12.04.2015Характеристика современных зарубежных и отечественных SCADA-систем. Описания программного комплекса для визуализации и диспетчеризации технологических процессов. Обработка, отображение и архивирование информации об объекте мониторинга или управления.
реферат [600,8 K], добавлен 26.10.2014