Учебное пособие C#. Алгоритмы и структуры данных н. А. Тюкачев, В. Г. Хлебостроев издание третье, стереотипное 1 / 23


Листинг 4.30. Метод разбора операций отношения


Download 1.85 Mb.
Pdf ko'rish
bet67/111
Sana19.11.2023
Hajmi1.85 Mb.
#1786905
TuriУчебное пособие
1   ...   63   64   65   66   67   68   69   70   ...   111
Bog'liq
C# Алгоритмы и структуры данных 2018 Тюкачев, Хлебостроев

Листинг 4.30. Метод разбора операций отношения 
void PFormula(ref string s, out Node D) 

s = s.Trim(); 
if (s.Length != 0) 

Expression(ref s, out D);
if (error != 0) return; 
s = s.Trim(); 
Operation chRelation = SetChRelation(s); 
if (chRelation != Operation.NONE) 

switch (chRelation) 

case Operation.LESS: 
case Operation.MORE: 
Pop(ref s, 1); break; 
10 / 23


126 
case Operation.EQUALLY: 
case Operation.NOTEQUALLY: 
case Operation.LESSEQUALLY: 
case Operation.MOREEQUALLY: 
Pop(ref s, 2); 
break; 

Node D2; 
Expression(ref s, out D2);
if (error != 0) return; 
Node D1 = D; 
D = new NodeOperation(chRelation, D1, D2); 


else 

D = null; error = 3;


Существенно изменился метод для разбора множителей, синтаксиче-
ская диаграмма которого представлена на рисунке 4.21. 
Рис. 4.21. Синтаксическая диаграмма для множителей 
В метод Factor
() добавлен разбор функций и переменных: 
11 / 23


127 
Листинг 4.31. Метод разбора операций отношения 
void Factor(ref string s, out Node D) 

D = null; 
s = s.Trim(); 
if (s.Length != 0) 

char[] aCh = { '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', '+', '-' }; 
int k = Array.IndexOf(aCh, s[0]); 
if (k != -1) // const 

double x; TypeVal t; 
SetConst(ref s, out x, out k, out t);
if (t == TypeVal.tFloat) 
D = new NodeConst(t, x); 
else 
D = new NodeConst(t, k); 

else 
if (s[0] == '(')
{// 
формула в скобках 
Pop(ref s, 1); 
PFormula(ref s, out D);
if (error != 0) return; 
s = s.Trim(); 
if ((s.Length > 0) && (s[0] != ')'))
{ error = 9; return; }// 
нет ) 
12 / 23


128 
Pop(ref s, 1); 

else // NOT | 
функция | переменная 

string st = Pop(ref s, 1);
// 
стандартная функция | переменная 
while ((s.Length > 0) && TestCh(s[0]))
st += Pop(ref s, 1); 
bool ok = false; int nf = -1;
// 
поиск функции 
while ((nfok = st == nameFunc[++nf]; 
if (ok) 

if ((s.Length == 1)||(s[0] != '(')) 
{// 
нет скобки "(" 
error = 8; return;

s = s.Trim(); 
st = ""; k = 1; int i = 0; 
while ((i < s.Length) && (k != 0)) 

st += s[++i]; 
switch (s[i]) 

case '(': ++k; break; 
case ')': --k; break; 


13 / 23


129 
st = st.Substring(0, st.Length - 1); 
s = s.Substring(i, s.Length-i-1); 
Node Da; 
PFormula(ref st, out Da);
if (error != 0) return; 
D = new NodeFunc(nf, Da); 
s = s.Trim(); 
return; 

// 
поиск переменной 
ok = false; int nv = -1; 
while ((nv < aVar.Length - 1) && !ok) 
ok = st == aVar[++nv].name; 
if (ok) 

D = new NodeVal(nv); 
s = s.Trim(); return; 

error = 7; // 
неизвестная переменная 


else 

D = null; error = 6; // 
ожидается множитель 


Вычисление переменных на втором этапе решения реализуется с по-
мощью метода Run_Formula() класса Operator
14 / 23


130 

Download 1.85 Mb.

Do'stlaringiz bilan baham:
1   ...   63   64   65   66   67   68   69   70   ...   111




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling