![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
setare |
![]()
Сообщение
#1
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 152 Пол: Женский Репутация: ![]() ![]() ![]() |
Здравствуйте! У меня есть задача, нужно сказать является ли строка формулой и рассчитаь ее:
формула::=цифра : (формула знак формула) Цифра::=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 |
![]()
Сообщение
#2
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
FAQ: разбор выражений.
там есть простейший калькулатор, вычисляющий формулу точно как у вас взаднии. -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
volvo |
![]()
Сообщение
#3
|
Гость ![]() |
setare, вот здесь chessman приводил пример программы для расчета формул. Правда она делает немного больше, чем нужно, но лишнее всегда можно убрать
![]() Интерпретатор Единственное, что нужно добавить - проверку на корректность введенной формулы. Но по-моему, что-то о проверке баланса скобок в строке было на форуме... Если я не ошибаюсь - даже в FAQ-е. |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 2:30 |