Помощь - Поиск - Пользователи - Календарь
Полная версия: Строки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
setare
Здравствуйте! У меня есть задача, нужно сказать является ли строка формулой и рассчитаь ее:
формула::=цифра : (формула знак формула)
Цифра::=0123456789
Знак::=+ - *
Строка вводится с клавиатуры. Я написала программу, но она ничего не считает. В чем проблема? Конечно, может я написала все не правильно, потому что у меня сейчас температура под 39 и я ничего не соображаю, но все-таки надеюсь на вас. Заранее благодарю.

Код

program formula;
const
 chislo='1234567890';
 type
  str=string[255];
 function znak(E:str):boolean;
  begin
   znak:=(E='+') or (E='-') or (E='*');
  end;
function chis(s:str):boolean;
 begin
  chis:=(pos(s,chislo)<>0);
 end;
procedure devide(s:str;var s1,s2,s3:str;var c:boolean);
 var
  i,k:integer;
   begin
    c:=true;
     if (length(s)<>1) then
      begin
       if (copy(s,1,1)<>'(') and (copy(s,1,1)<>')') then
        c:=false
       else
        begin
         s1:='';
         k:=0;
         i:=2;
          repeat
           s1:=s1+copy(s,i,1);
            if (copy(s,i,1)='(') then
             k:=k+1;
            if (copy(s,i,1)=')') then
             k:=k-1;
             i:=i+1;
          until
           (k=0) or (i=length(s));
          s2:=copy(s,i,1);
           if (s2<>'+') or (s2<>'-') or(s2<>'*') then
            c:=false
           else
            begin
             s3:='';
             i:=i+1;
             k:=0;
              repeat
               s3:=s3+copy(s,i,1);
                if (copy(s,i,1)='(') then
             k:=k+1;
            if (copy(s,i,1)=')') then
             k:=k-1;
             i:=i+1;
          until
           (k=0) or (i=length(s));
            end;
        end;
      end;
   end;
  function phormula(s:str):boolean;
   var

    s2,s3,s1:str;
    c:boolean;
     begin
      if (length(s)=1) and chis(s) then
       phormula:=c
      else
       begin
        devide(s,s1,s2,s3,c);
       if (copy(s,1,1)='(') and phormula(s2) and (c) and phormula(s3) and (c) and (copy(s,length(s),1)=')') then
        phormula:=true
       else
        phormula:=false;
       end;
     end;
   function rasschet (s:str):integer;
    var
     c:boolean;
     s1,s2,s3:str;
     code,x:integer;
     ch:char;
      begin
       devide(s,s1,s2,s3,c);
        if (length(s)=1) then
         begin
          val(s,x,code);
          rasschet:=x;
         end
        else
        begin
         ch:=s2[1];
        case ch of
      '+': rasschet:=rasschet(s1) + rasschet(s3);
      '-': rasschet:=rasschet(s1) - rasschet(s3);
      '*': rasschet:=rasschet(s1) * rasschet(s3);
    end;
     end;
      end;
  var
   s:str;
  begin
   writeln('Vvedite stroku');
   readln(s);
    if phormula (s) then
     begin
      writeln('Dannaya stroka yavlyaetsa formuloy');
      writeln('Eye znacheniye ravno= ',rasschet(s));
     end
    else
     writeln('Dannaya stroka ne yavlyayetsya formuloy');
     readln;
  end.
Altair
FAQ: разбор выражений.
там есть простейший калькулатор, вычисляющий формулу точно как у вас взаднии.
volvo
setare, вот здесь chessman приводил пример программы для расчета формул. Правда она делает немного больше, чем нужно, но лишнее всегда можно убрать smile.gif

Интерпретатор

Единственное, что нужно добавить - проверку на корректность введенной формулы. Но по-моему, что-то о проверке баланса скобок в строке было на форуме... Если я не ошибаюсь - даже в FAQ-е.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.