Читайте также:
|
|
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 | Поможем написать вашу работу | Нарушение авторских прав |
<== предыдущая лекция | | | следующая лекция ==> |
КЛАССИФИКАЦИЯ | | | Образовательные технологии. |