Приём заказов:
Круглосуточно
Москва
ул. Никольская, д. 10.
Ежедневно 8:00–20:00
Звонок бесплатный

Расстановка скобок в арифметическом выражении

Диплом777
Email: info@diplom777.ru
Phone: +7 (800) 707-84-52
Url:
Логотип сайта компании Диплом777
Никольская 10
Москва, RU 109012
Содержание

Московский Государственный Университет леса

Кафедра «Прикладная Математика»

Курсовая работа

на тему:

«Расстановка скобок»

Выполнил: студент ФЭСТ

Группы ПМ-11 Сафин В.С.

Проверила: доцент кафедры ПМ Афанасьев А.В.

(Афанасьева В.В.)

г. Москва, 2013

1) Обзор литературы:

Арифметическое выражениеэто запись математической формулы с использованием констант, переменных, функций, знаков арифметических операций и круглых скобок.

Константапостоянная, не изменяющаяся величина.

Переменнаяэто величина, характеризующаяся множеством значений, которое она может принимать.

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

2) Точная формулировка задачи:

III.2.7 Расставить скобки в арифметическом выражении, указав последовательность выполнения операций в соответствии с правилом старшинства

3) Расширенная формулировка задачи:

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

4) Описание алгоритма:

1) Считываем входную строку посимвольно. Операнды заносим в один массив, операции в другой так, чтобы их индексы не пересекались (например, строку `a+b’ запишем вмассивы как: [`a’, «, `b’], [`’,’+’,»]).

2) Проходим по массиву операций, ищем операцию с максимальным приоритетом выполнения.

3) Когда находим, заменяем первый операнд этой операции на ` (+operand1+operation+operand2+) ‘, производим сдвиг остальных элементов массива на пустые места. Переходим к пункту 2.

Процедура OverWrite — выводит пункты меню в графической оболочке

Процедура Wind (k: integer) — управление меню с клавиатуры

Функция isOperation (symbol: char): boolean — проверка является ли символ операцией

Функция isRightExpression (inString: string): boolean — проверка правильности введенного выражения

Функция getPriority (symbol: char): integer — возвращает приоритет операции

Функция arrangeBrackets (inString: string): string — расставляет скобки в выражении

Процедура Work — пункт меню, запускающий программу

Процедура aboutProgram — пункт меню, в котором указаны сведения о программе

5) Блоксхема алгоритма

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

6) Реализация на языке ТР:

unit brackets;

interface

function isOperation (symbol: char): boolean;

function bracketsBalance (inString: string): boolean;

function isRightExpression (inString: string): boolean;

function getPriority (symbol: char): integer;

function arrangeBrackets (inString: string): string;

procedure work;

procedure aboutProgram;

implementation

function isOperation (symbol: char): boolean; // проверка является ли символ операцией

begin

isOperation: = false;

case symbol of

‘+’: isOperation: = true;

‘-‘: isOperation: = true;

‘*’: isOperation: = true;

‘/’: isOperation: = true;

‘^’: isOperation: = true;

end;

end;

function bracketsBalance (inString: string): boolean; // проверка баланса скобок

var

flag, i: integer;

begin

flag: = 0;

for i: = 1 to Length (inString) do

begin

if ( (inString [i] = ‘ (‘) and (flag >= 0)) then

Inc (flag);

if (inString [i] = ‘) ‘) then

Dec (flag);

end;

if (flag = 0) then

bracketsBalance: = true

else

bracketsBalance: = false;

end;

function isRightExpression (inString: string): boolean; // проверка является ли введенное выражение правильным

var

prevFlag, curFlag, flag: boolean;

i: integer;

begin

flag: = true;

prevFlag: = isOperation (inString [1]);

for i: = 2 to Length (inString) do

begin

curFlag: = isOperation (inString [i]);

if ( (prevFlag = true) and (curFlag = true)) then

flag: = false; // если предыдущий и текущий символы — операции, то выражение неправильное

prevFlag: = curFlag;

end;

if (flag = true) then

isRightExpression: = bracketsBalance (inString)

else

isRightExpression: = flag;

end;

function getPriority (symbol: char): integer; // получение приоритета операции для правильной расстановки скобок, чем выше приоритет — тем раньше выполняется операция

begin

if ( (symbol = ‘-‘) or (symbol = ‘+’)) then

getPriority: = 1

else if (symbol = ‘*’) then

getPriority: = 2

else if (symbol = ‘/’) then

getPriority: = 3

else if (symbol = ‘^’) then

getPriority: = 4;

end;

function arrangeBrackets (inString: string): string;

var

i, m, count, maxPriority, maxPosition: integer;

priorities: array [1.100] of integer;

symbols: array [1.100] of string;

operand, bracketsExpression: string;

begin

m: = 1;

i: = 1;

while i <> Length (inString) + 1 do

begin

if (isOperation (inString [i]) = true) then // если текущий символ — операция

begin

symbols [m]: = operand; // заносим накопленный операнд в массив элементов выражения

operand: = »; // обнуляем операнд

Inc (m); // переходим к следующей ячейке массива

priorities [m]: = getPriority (inString [i]); // заносим в массив приоритетов приоритет данной операции

symbols [m]: = inString [i]; // заносим операцию в массив элементов выражения

Inc (m); // переходим к следующей ячейке массива

Inc (count); // увеличиваем счетчик операций

end

else if (inString [i] = ‘ (‘) then

begin

while (inString [i + 1] <> ‘) ‘) do

begin

Inc (i);

bracketsExpression: = bracketsExpression + inString [i];

end;

symbols [m]: = arrangeBrackets (bracketsExpression);

Inc (m);

bracketsExpression: = »;

if (i < Length (inString) — 1) then

Inc (i)

end

else

operand: = operand + inString [i];

Inc (i);

end;

symbols [m]: = operand;

while (count <> 0) do // пока не прошли по всем операциям

begin

maxPriority: = 0;

i: = 2;

while (i <> m) do

begin

if (priorities [i] >= maxPriority) then // ищем в массиве элементов выражения позицию оператора с наивысшим приоритетом

begin

maxPriority: = priorities [i];

maxPosition: = i;

end;

if (symbols [i] = ») and (symbols [i + 1] <> ») then // удаление из массива элементов выражения пустых ячеек (такое бывает после объединения двух операндов и операции)

begin

symbols [i]: = symbols [i + 1];

symbols [i + 1]: = »;

priorities [i]: = priorities [i + 1];

priorities [i + 1]: = 0;

i: = 1;

end;

Inc (i);

end;

symbols [maxPosition — 1]: = ‘ (‘ + symbols [maxPosition — 1] + symbols [maxPosition] + symbols [maxPosition + 1] + ‘) ‘; // объединяем два операнда с операцией с максимальным приоритетом в одну ячейку, освободившиеся обнуляем

symbols [maxPosition]: = »;

symbols [maxPosition + 1]: = »;

priorities [maxPosition]: = 0;

Dec (count);

end;

arrangeBrackets: = symbols [1];

end;

procedure work;

var inString, outString: string;

expressionFlag: boolean;

begin

expressionFlag: = false;

while (expressionFlag <> true) do

begin

writeln (‘Please enter a source expression: ‘);

readln (inString);

expressionFlag: = isRightExpression (inString);

end;

outString: = arrangeBrackets (inString);

writeln (outString);

end;

procedure aboutProgram;

begin

writeln (‘Министерство образования и науки РФ’);

writeln (‘Московский Государственный Университет леса’);

writeln;

writeln;

writeln (‘Курсовая работа’);

writeln (‘по дисциплине: «Программирование»‘);

writeln (‘на тему: ‘);

writeln (‘»Расстановка скобок в арифметическом выражении»‘);

writeln;

writeln;

writeln (‘Выполнил: …’);

writeln (‘Проверил: …’);

writeln;

writeln;

writeln (‘Москва — 2013’);

end;

begin

end.

program III27;

uses CRT, brackets;

const s3 = ‘ Выход ‘;

s2 = ‘ О программе ‘;

s1 = ‘ Начать работу ‘;

Col = 15;

Fon = 0;

FonInv = Col;

ColInv = Fon;

var ActivStr: integer;

c: char;

procedure OverWrite; // вывод пунктов меню

begin

GotoXY (4, ActivStr);

case ActivStr of

7: write (s1);

8: write (s2);

9: write (s3);

end;

end;

Procedure Wind (k: integer); // управление меню с клавиатуры

begin

OverWrite;

ActivStr: = ActivStr + k;

if (ActivStr < 7) then

ActivStr: = 9;

if (ActivStr > 9) then

ActivStr: = 7;

TextBackGround (FonInv);

TextColor (ColInv);

OverWrite;

TextBackGround (Fon);

TextColor (Col);

end;

begin

Activstr: = 7;

while TRUE do

begin

TextBackGround (Fon);

TextColor (Col);

ClrScr;

GotoXY (10,3);

Writeln (‘Расстановка скобок’);

GotoXY (10,5);

Writeln (‘MENU’);

GotoXY (4,7);

WRITE (S1);

GotoXY (4,8);

WRITE (S2);

GotoXY (4,9);

WRITE (S3);

WIND (0);

repeat

c: = ReadKey;

if (c = #0) then

begin

c: = ReadKey;

if c = #38 then

WIND (-1);

if c = #40 then

WIND (1);

end;

until c = #13;

case ActivStr of

0:;

7: begin ClrScr; writeln (S1); work; readln; end;

8: begin ClrScr; writeln (S2); aboutProgram; readln; end;

9: begin ClrScr; writeln (S3); Delay (1000); Halt; end;

end;

ClrScr;

end;

end.

7) Примеры работы программы:

1.

2.

3.

4.

5.

6. В случае ошибки программа начинает работу заново:

8) Инструкция:

Запустив программу, пользователь видит диалоговое окно, в котором предлагается «Начать работу» с программой, узнать «О программе»или выйти из программы. Выбрав пункт «Начать работу» откроется окно, в котором предлагается ввести арифметическое выражение. Введя выражение, программа расставляет скобки по старшинству операций. Если выражение будет введено со скобками, то программа не изменит их, а если скобки будут не закрыты, то программа начнет свое действие заново.

9) Возможности для модификации:

1. Добавить функцию, которая расставляет порядок выполнения действий

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

3. Сделать возможность расставления скобок в функциях (таких как sin, cos, tg, log и т.д.)

Picture of Леонид Федотов
Леонид Федотов
Окончил НИУ ВШЭ факультет компьютерных наук. Сам являюсь кандидатом наук. По специальности работаю 13 лет, за это время создал 8 научных статей и 2 диссертации. В компании подрабатываю в свободное от работы время уже более 5 лет. Нравится помогать школьникам и студентам в решении контрольных работ и написании курсовых проектов. Люблю свою профессию за то, что это направление с каждым годом становится все более востребованным и актуальным.