Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Вычисление выражения по обратной польской записи

Читайте также:
  1. E) простая, копировальная, ручная, машинная, шахматная и линейная записи.
  2. II раздел. Задания этого раздела выполняются студентами самостоятельно письменно или устно (в записи на электронном носителе).
  3. II раздел. Задания этого раздела выполняются студентами самостоятельно письменно или устно (в записи на электронном носителе).
  4. SADT. Виды, назначение, использование обратной связи на диаграммах.
  5. V) По наличию обратной связи
  6. Алгоритм. Свойства алгоритмов. Способы записи алгоритмов. Базовые структуры алгоритмов. Примеры.
  7. Анализ связи парной корреляции. Вычисление параметров уровня регрессии.
  8. Аналитические выражения второго закона термодинамики.
  9. Арифметические выражения, арифметические операции, стандартные арифметические функции. Оператор присваивания.
  10. Аудио- и видеозаписи как средства доказывания.

Do

{

if (GetSize(&Stack) == 0)

{ printf ("%s\n", "Invalid source form!"); return (-1); }

opz[po] = Pop(&Stack);

} while (opz[po++]!= '(');

Po--;

}

//----------------------------------------------

else if(formula[pi] >= 'a' && formula[pi] <= 'z')

opz[po++] = formula[pi];

//----------------------------------------------

else if (formula[pi] =='+' || formula[pi]=='-' ||

formula[pi] == '*' || formula[pi] == '/')

{

while(GetSize(&Stack)>0 && Priority(Read(&Stack)) >= Priority(formula[pi]))

opz[po++] = Pop(&Stack);

Push(&Stack,formula[pi]);

}

//----------------------------------------------

Else

{printf("%s\n","Invalid symbol in source form!");

return (-2); }

pi++;

} // while

while (GetSize(&Stack)>0)

{

opz[po] = Pop(&Stack);

if (opz[po] == '(')

{ printf ("%s\n", "Invalid source form!"); return (-3); }

po++;

}

opz[po] = '\0';

Free(&Stack);

Return 1;

}

/////////////////////////////////////////////////

// Вычисление приоритета операции

// Возвращаемое значение: приоритет операции

/////////////////////////////////////////////////

Int Priority (char p)

{

Switch(p)

{

case '+': return 2;

case '-': return 2;

case '*': return 3;

case '/': return 3;

}

Return -1;

}

 

4. Выполнение интерпретации обратной польской записи.

((a+b)*(a-c)*d)/a -> ОПЗ: ab+ac-*d*a/ ->МИП: abcd

/////////////////////////////////////////////////

//Построение массива имен используемых переменных

// Возвращаемое значение: количество переменных

/////////////////////////////////////////////////

int CreateVarArray(char* opz, char* Variable)

{

int i, j, flag, pV=0;

// Перебираем все символы полученной ОПЗ

for (i=0; opz[i]!='\0'; i++)

{

// Очередной символ - буква (имя переменной)

if (opz[i] >= 'a' && opz[i] <= 'z')

{

// Ищем имя переменной в списке имен

for (j=0, flag=0; j<pV; j++)

{

if (opz[i] == Variable[j])

flag = 1; // Имя нашлось

}

if (flag==0) // Если имя не нашлось -

Variable[pV++] = opz[i]; // заносим его в список

}

}

Return pV;

}

 

for(i=0;i< pV; i++)//Перебор найденных переменных

{ // и ввод их значений

printf ("\nInput variable '%c':",Variable[i]);

scanf ("%lf",&VarValues[i]);

}

 

pi-1–pi, pi-1/pi

/////////////////////////////////////////////////

Вычисление выражения по обратной польской записи

/////////////////////////////////////////////////

double Compute(char* opz, char* Variable, double* VarValues, int pV)

{

dSTACK dSt; // Cтек для проведения вычислений

double dw; // Рабочая переменная

dInit(&dSt,100); // Создание стека

for(int i=0;opz[i]!='\0'; i++)//Перебор элементов

{

if(opz[i]>='a'&&opz[i]<='z')//Очередной символ буква

{




Дата добавления: 2015-02-16; просмотров: 136 | Поможем написать вашу работу | Нарушение авторских прав

<== предыдущая лекция | следующая лекция ==>
КЛАССИФИКАЦИЯ| Образовательные технологии.

lektsii.net - Лекции.Нет - 2014-2025 год. (0.008 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав