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

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 12.04.2015
Размер файла 602,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

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

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

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

на тему:

"Расстановка скобок"

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

Группы ПМ-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 и т.д.)

Размещено на Allbest.ru


Подобные документы

  • Особенности составления программы (сценария) на языке JavaScript. Построение выражений из литералов, переменных, знаков операций, скобок. Элементы, используемые для хранения данных. Приоритет операций, порядок, в котором выполняются операции в выражении.

    лабораторная работа [40,2 K], добавлен 19.09.2019

  • Разработка технологии обработки информации, структуры и формы представления данных. Проектирование программных модулей. Блок-схема алгоритма и исходный код программы анализа арифметического выражения, синтаксического анализа простой программы на языке С.

    курсовая работа [2,4 M], добавлен 12.12.2011

  • Схема разбора арифметического и логического выражения. Внешняя спецификация конвертора и алгоритм перевода программ на языке Паскаль в текст на языке Си. Назначение подпрограмм, особенности констант и переменных. Код программы и ее тестирование.

    курсовая работа [567,5 K], добавлен 03.07.2011

  • Методы арифметического кодирования. Основные функции программ, реализующие алгоритмы кодирования по методам Хаффмана, Голомба, Фибоначчи и Элиаса. Разработка программно-аппаратных средств оптимального арифметического кодирования и их экономический расчет.

    дипломная работа [1,1 M], добавлен 26.05.2012

  • Условная функция. Логические выражения. Вложенные логические функции ЕСЛИ. Особенности записи логических операций в табличных процессорах: сначала записывается имя логической операции (И, ИЛИ, НЕ).

    реферат [7,9 K], добавлен 17.11.2002

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

    презентация [166,7 K], добавлен 19.10.2014

  • Изучение структуры компьютера и принципов его функционирования. Центральный процессор и основной цикл его работы. Выполнение арифметических операций в ЭВМ. Разработка программы реализации арифметического выражения и отладка ее с помощью отладчика TD.

    контрольная работа [87,3 K], добавлен 12.03.2011

  • Общая форма записи условного оператора, его назначение и синтаксис. Случаи использования сокращенных вариантов записи при программировании на С++. Вложенные операторы условия и условия их правильной работы. Составные логические выражения и их применение.

    лабораторная работа [25,2 K], добавлен 15.07.2009

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

    курсовая работа [2,6 M], добавлен 01.07.2011

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

    контрольная работа [372,3 K], добавлен 24.01.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.