IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Строки, рассчитывание формулы
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 152
Пол: Женский

Репутация: -  0  +


Здравствуйте! У меня есть задача, нужно сказать является ли строка формулой и рассчитаь ее:
формула::=цифра : (формула знак формула)
Цифра::=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.


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


FAQ: разбор выражений.
там есть простейший калькулатор, вычисляющий формулу точно как у вас взаднии.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






setare, вот здесь chessman приводил пример программы для расчета формул. Правда она делает немного больше, чем нужно, но лишнее всегда можно убрать smile.gif

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

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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 14.05.2024 14:38
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name