Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
15 / 15 / 5
Регистрация: 07.11.2010
Сообщений: 57
1

Стек. Логическое выражение

10.04.2011, 22:41. Показов 2914. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задали задачу:
Используя стек, решить следующую задачу (решение описать в виде функции или процедуры). В текстовом файле LOG записано без ошибок логическое выражение (ЛВ) в следующей форме:
<ЛВ>::=true | false | (!<ЛВ>) | (<ЛВ> ^ <ЛВ>) | (<ЛВ> & <ЛВ>)
где знаки !, &, ^ обозначают соответственно отрицание, коньюнкцию, дизьюнкцию.
Вычислить (как boolean) значение этого выражения.
Но я ни как не могу понять как к ней подступиться. Получается здесь будет использоваться рекурсия, или как? Может кто-то уже решал такое? Спасибо заранее

Добавлено через 5 часов 27 минут
Всем спасибо - уже сам написал

Кому будут нужны исходники - пишите

Суть такова - считываем строку - переводим в обратную польскую нотацию - считаем
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2011, 22:41
Ответы с готовыми решениями:

Логическое выражение !!!!
Дано число А и натуральное число N. Найти результат следующего выражения 1 -А + А*2 -А*3 + … +...

Логическое выражение
Написать логическое выражение, принимающее значение истина или ложь при выполнение условия:...

Логическое выражение
Помогите решить пару задачек: а) 74,28 (10) стрелочка вправо &quot;2&quot;; &quot;8&quot;; &quot;16&quot; с.с.; &lt;я вообще не...

Вычислить логическое выражение
Напишите программу которая вычисляет значение логического выраже- ния, утверждающего, что ...

4
3067 / 727 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
10.04.2011, 22:44 2
Так Вы бы выложили решение. Другие через год будут искать точно такую же задачу и найдут правильное и хорошее решение.
0
1 / 1 / 0
Регистрация: 29.05.2011
Сообщений: 13
29.05.2011, 10:03 3
Цитата Сообщение от xNum3n Посмотреть сообщение
Кому будут нужны исходники - пишите
xNum3n, будь добр, выложи пожалуйста, если не сложно =)
0
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 3
05.03.2012, 01:05 4
выложите решение пожалуйста)
0
15 / 15 / 5
Регистрация: 07.11.2010
Сообщений: 57
05.03.2012, 17:51  [ТС] 5
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
uses
  CRT;
 
{
’а**б«пв®а «®ЈЁзҐбЄЁе ўла*¦Ґ*Ё©.
‚ў®¤Ёвбп «®ЈЁзҐбЄ®Ґ ўла*¦Ґ*ЁҐ Ё§ 0, 1, бЄ®Ў®Є Ё §**Є®ў «®ЈЁзҐбЄЁе ®ЇҐа*жЁ©.
’а**б«пв®а ЇҐаҐў®¤Ёв ўла*¦Ґ*ЁҐ ў Ї®бвдЁЄб*го §*ЇЁбм * §*⥬ ўлзЁб«пҐв ҐЈ® §**зҐ*ЁҐ.
}
 
const
  OperSet: set of char = ['+', '&', '*', '!', '(', ')', 'A', 'V', '>'];
 
var
  S: String;
  OutputString: String;
 
function DelSpase(S: String): String;
var
  T: String;
  I: Word;
begin
  T := '';
  for I := 1 To Length(S) Do 
  begin
    if S[I] <> ' ' Then T := T + S[I];
  end;
  DelSpase := T;
end;
 
function InfixPostfix(N: String): String;
var
  T: String;
  I, TopStack: Word;
  Stack: array [1..10] of Char;
  SymbTmp, Symb: Char;
  
  function ChToInt(C: Char): Integer;
  var
    Result: Integer;
  begin
    case C Of
      '(': Result := 0;
      ')': Result := 1;
      '+': Result := 2;
      'V': Result := 2;
      '*': Result := 3;
      '&': Result := 3;
      '>': Result := 3;
      'A': Result := 3;
      '!': Result := 4;
    End;
    ChToInt := Result;
  end;
  
  function PRCD(Ch1, Ch2: Char): Boolean;
  var
    Result: Boolean;
  begin
    if ChToInt(Ch1) >= ChToInt(Ch2) Then Result := True
    Else Result := False;
    if Ch2 = '(' Then Result := False;
    if Ch1 = '(' Then Result := False;
    if (Ch2 = ')') And (Ch1 <> '(') Then Result := True;
    if (Ch2 = '(') And (Ch1 = ')') Then Result := False;
    PRCD := Result;
  end;
  
  function Empty: Boolean;
  var
    Result: Boolean;
  begin
    if TopStack = 0 Then Result := True
    Else Result := False;
    Empty := Result;
  end;
  
  function TopStackSymb: Char;
  begin
    TopStackSymb := Stack[TopStack];
  end;
  
  procedure Push(Ch: Char);
  begin
    Inc(TopStack);
    Stack[TopStack] := Ch;
  end;
  
  function Pop: Char;
  begin
    Pop := Stack[TopStack];
    Stack[TopStack] := ' ';
    Dec(TopStack);
  end;
 
begin
  T := '';
  TopStack := 0;
  for I := 1 To 10 Do Stack[I] := ' ';
  for I := 1 To Length(N) Do 
  begin
    Symb := N[I];
    if Symb IN OperSet
    Then begin
      while not (Empty) And PRCD(TopStackSymb, Symb) Do 
      begin
        SymbTmp := Pop;
        T := T + SymbTmp;
      end;
      if (Empty) Or (Symb <> ')') Then Push(Symb) 
      Else SymbTmp := Pop;
    end Else T := T + Symb;
  end;
  while not (Empty) Do 
  begin
    SymbTmp := Pop;
    T := T + SymbTmp;
  end;
  InfixPostfix := T;
end;
 
 
function Sintax: Boolean;
var
  Skobka: Word;
  I: Word;
  F: Boolean;
  
  function Lexica(C: Char): Byte;
  var
    Result: Byte;
  begin
    case C Of
      '(': Result := 2;
      ')': Result := 3;
      '+': Result := 1;
      'V': Result := 1;
      '*': Result := 1;
      '&': Result := 1;
      'A': Result := 1;
      '>': Result := 1;
      '!': Result := 0;
      '0': Result := 4;
      '1': Result := 4;
    Else Result := 5
    End;
    Lexica := Result;
  end;
  
  procedure ERROR;
  begin
    F := False;
  end;
  
  procedure SOU; forward; {г**а*л© ®ЇҐа*в®а}
  
  procedure SOB; forward; {ЎЁ**а*л© ®ЇҐа*в®а}
  
  procedure SRO; forward; {а*§¤Ґ«ЁвҐ«м ®вЄалў*ойЁ©}
  
  procedure SRZ; forward; {а*§¤Ґ«ЁвҐ«м §*Єалў*ойЁ©}
  
  procedure SC; forward;  {зЁб«®}
  
  procedure SC;
  begin
    Inc(I);
    if F AND (I <= Length(S))
      Then case Lexica(S[I]) Of
        1: SOB;
        3: SRZ;
      Else ERROR
      End ;
  end;
  
  procedure SOU;
  begin
    Inc(I);
    if F AND (I <= Length(S))
      Then case Lexica(S[I]) Of
        2: SRO;
        4: SC;
      Else ERROR
      End 
    Else ERROR;
  end;
  
  procedure SOB;
  begin
    Inc(I);
    if F AND (I <= Length(S))
      Then case Lexica(S[I]) Of
        0: SOU;
        2: SRO;
        4: SC;
      Else ERROR
      End 
    Else ERROR;
  end;
  
  procedure SRO;
  begin
    Inc(Skobka);
    Inc(I);
    if F AND (I <= Length(S))
      Then case Lexica(S[I]) Of
        0: SOU;
        2: SRO;
        4: SC;
      Else ERROR
      End 
    Else ERROR;
  end;
  
  procedure SRZ;
  begin
    Dec(Skobka);
    Inc(I);
    if F AND (I <= Length(S))
      Then case Lexica(S[I]) Of
        1: SOB;
        3: SRZ;
      Else ERROR
      End ;
  end;
 
begin
  F := True;
  Skobka := 0;
  I := 1;
  if F Then case Lexica(S[I]) Of
      0: SOU;
      2: SRO;
      4: SC;
    Else ERROR
    End ;
  if Skobka <> 0 Then F := False;
  Sintax := F;
end;
 
function Calc(St: String): Boolean;
var
  I: Integer;
  Top: Integer;
  Stack: Array[1..10] Of Boolean;
  
  function CharToBool(N: Char): Boolean;
  begin
    if N = '0' Then CharToBool := FALSE;
    if N = '1' Then CharToBool := TRUE;
  end;
 
begin
  Top := 1;
  Stack[Top] := CharToBool(St[1]);
  
  for I := 2 To Length(St) Do 
  begin
    if St[I] IN OperSet
    Then begin
      case St[I] Of
        {Ё*ўҐабЁп}           '!': Stack[Top] := not (Stack[Top]);
        {Є®*ко*ЄжЁп} '&', 'A', '*': 
          begin
            Stack[Top - 1] := Stack[Top - 1] AND Stack[Top];
            Dec(Top);
          end;
        {¤Ё§ко*ЄжЁп}     '+', 'V': 
          begin
            Stack[Top - 1] := Stack[Top - 1] OR Stack[Top];
            Dec(Top);
          end;
        {Ё¬Ї«ЁЄ*жЁп}         '>': 
          begin
            Stack[Top - 1] := not (Stack[Top - 1]) OR Stack[Top];
            Dec(Top);
          end; {begin}
      End; {case}
    end {then}
    Else begin
      Inc(Top);
      Stack[Top] := CharToBool(St[I]);
    end; {else}
  end;
  Calc := Stack[Top];
end;
 
begin
  ClrScr;
  OutputString := '';
  Write('‚ўҐ¤ЁвҐ «®ЈЁзҐбЄ®Ґ ўла*¦Ґ*ЁҐ Ё§ 0 Ё 1 : ');
  ReadLn(S);
  
  {г¤*«пҐ¬ Їа®ЎҐ«л}
  S := DelSpase(S);
  Write('‚ўҐ¤Ґ*®Ґ ўла*¦Ґ*ЁҐ ЎҐ§ Їа®ЎҐ«®ў : ');
  WriteLn(S);
  
  {Їа®ўҐа塞 ** **«ЁзЁҐ ®иЁЎ®Є}
  if Sintax Then begin
    OutputString := InfixPostfix(S);
    
    Write('Џ®бвдЁЄб**п §*ЇЁбм ўла*¦Ґ*Ёп : ');
    WriteLn(OutputString);
    
    Write('‡**зҐ*ЁҐ ўла*¦Ґ*Ёп : ');
    WriteLn(Calc(OutputString));
    
  end Else WriteLn('‘Ё*в*ЄбЁзҐбЄ*п ®иЁЎЄ*');
  ReadLn;
end.
0
05.03.2012, 17:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2012, 17:51
Помогаю со студенческими работами здесь

Составить логическое выражение
Задание 1 : Составить логическое выражение, значение которого равно True, если высказывание...

логическое выражение Pascal
Вычислить значения логического выражения при следующих значениях логических величин x,y и z;...

составить логическое выражение
Помогите, пожалуйста решить задачу: Составить логическое выражение, значение которого равно True,...

Записать логическое выражение, которое является истинным, на паскале
Есть задача: записать логическое выражение, которое является истинным, когда число N делится на 3,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru