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

Алгоритм решения. Выражение просматривается слева направо. Если встречается число, то его значение (как целое) заносится в стек, а если встечается знак операции, то из стека извлекаются два последних элемента (это операнды данной операции), над ними выполняется операция и ее результат записывается в стек. В конце в стеке остается только одно число — значение всего выражения.

{ Turbo Pascal, файл ST2.PAS } Program St2; Uses Spisok, Stack; Const Znak = ['+', '-', '*', '/']; Var S, S1 : String;

 T : Text;
 I, N : Byte;
 X, Y : BT; Code : Integer;
 NS : U;

Begin Write('Введите имя файла: '); ReadLn(S1); Assign(T, S1); ReSet(T); NS := Nil; While Not Eof(T) Do

Begin
  ReadLn(T, S);  I := 1;
  While I <= Length(S) Do
    Begin
      If S[I] In ['0'..'9']
      Then
      Begin
       N := I;
       While S[I] In ['0'..'9'] Do
        I := I + 1;
       Val(Copy(S, N, I - N), X, Code);
      V_Stack(NS, X);
      End
      Else
      If S[I] In Znak
      Then
       Begin
         Iz_Stack(NS, X);
         Iz_Stack(NS, Y);
         Case S[I] Of
         '+' : X := X + Y;
         '-' : X := Y - X;
         '*' : X := X * Y;
         '/' : X := Y Div X
         End;
         V_Stack(NS, X)
       End;
      I := I + 1
     End;
     Iz_Stack(NS, X);
     WriteLn(S, ' = ', X);
   End

End. /* C++, файл ST2.CPP */ #include «STACK.CPP» #include < string.h > #include < stdio.h > void main(void) { char S[255]; FILE *T; int I; BT X, Y; Zveno *NS; clrscr(); cout « «Введите имя файла: »; cin » S; T=fopen(S, «r»); NS = NULL; while (!feof(T)) {

  fgets(S, 255, T);
  I = 0;
  while (I <= strlen(S)-1)

{

if (S[I]>='0'&&S[I]<='9')
{
 X=0;
 while(S[I]>='0'&&S[I]<='9') {X=X*10+(S[I]-'0'); I++;}
 NS=V_Stack(NS, X);
}
else
if (S[I]=='+'||S[I]=='-'||S[I]=='/'||S[I]=='*')
{
   X=V_Vershine(NS);
   NS=Iz_Stack(NS);
   Y=V_Vershine(NS);
   NS=Iz_Stack(NS);
   switch (S[I]) {
   case '+' : X += Y; break;
   case '-' : X = Y - X; break;
   case '*' : X *= Y; break;
   case '/' : X = Y / X; break;}
   NS=V_Stack(NS, X);
}
I++;

} X=V_Vershine(NS); NS=Iz_Stack(NS); cout « S « » ⇒ » « X « «\n»;}

  }
 
tema/primer.txt · Последние изменения: 2009/02/24 19:22 От tu
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki