С Новым годом! Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
 Аватар для Виталий5
6 / 6 / 3
Регистрация: 15.06.2013
Сообщений: 69

Как научить программу распознавать функции, знаки, скобки

15.06.2013, 18:31. Показов 2768. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Интересует вопрос, например:

Ввожу в строку (х+3)*(2*х^2)+ln(x) нажимаю ввод, указываю чему равен икс, программа должна вывести на экран значение этой функции что я ввел - f(x).
Могу ввести и другую функцию, например, x^6-14.

Как научить программу распознавать функции ln, cos, e, pi, x^3,скобки, ариф. знаки ну и тому подобное, если пользователь сам вводит нужное выражение?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.06.2013, 18:31
Ответы с готовыми решениями:

Borland_delphi_7_personal_portable_edition научить распознавать шрифты
как заставить borland_delphi_7_personal_portable_edition научить распознавать шрифты?.

Калькулятор на TkInter, как распознавать знаки?
Хочу написать калькулятор на tkinter,но не знаю как сделать чтоб он определял знаки,например:1+2-3+4.Притом что выражение идет в виде...

Как научить IDE Cbuilder 6 понимать русский текст (массив строк с кириллицей преобразуется в знаки вопроса)?
Например массив строк с кириллицей он преобразует в занаки вопросы. Как это исправить?

21
 Аватар для Скромник
24 / 5 / 2
Регистрация: 08.01.2013
Сообщений: 94
15.06.2013, 18:44
При обращении к стандартным функциям необходимо записать имя функции, а в скобках указать аргумент.
Выражения представляют собой формальное правило для вычисления некоторого нового значения. Они могут состоять из констант, переменных, стандартных функций . Например, 0.5 + А, Р - T/A - B, 1.25 * sin (x) + cos (x).
Порядок выполнения операций определяется скобками, а при их отсутствии - согласно приоритету операций:
1. операция отрицания not;
2. операции: * , / , div , mod , and;
3. операции : + , - , or;
4. операции отношения : <= , < , = , < > , > , >=.
Операции одного приоритета выполняются последовательно слева направо.
Есть целая таблица выражения функций в коде.

Например код к ниже указанной формуле к картинке будет такой:
Pascal
1
2
3
4
5
6
7
8
9
10
program u1;
var
   a,b,x,y,z : real;
begin
     writeln ('Введите x, y и z:');
     read (x,y,z);
     a:= ((1+(sqr(sin(x+y))))/(2+(abs(x-(2*x))/(1+(sqr(x)*sqr(y)))))+x);
     b:= sqr(cos(arctan(1/z)));
     writeln ('Ответ: a = ',a:5:2,', b = ',b:5:2);
end.
Извините, если не правильно понял вопрос.
Миниатюры
Как научить программу распознавать функции, знаки, скобки  
0
 Аватар для Виталий5
6 / 6 / 3
Регистрация: 15.06.2013
Сообщений: 69
15.06.2013, 18:56  [ТС]
Вы написали программу на конкретное выражение, повторяюсь, пользователь сам должен написать нужное ему выражение.
0
 Аватар для Скромник
24 / 5 / 2
Регистрация: 08.01.2013
Сообщений: 94
15.06.2013, 19:00
Все, я Вас понял.
Такого я не умею, самому стало интересно, как под пользователя так написать...
Надеюсь, помогут решить... я только начинаю изучать паскаль...
0
Заблокирован
15.06.2013, 20:03
вполне помогут стандартные функции паскаля

IntToStr(i) функция i - integer string преобразует целое число к строке
StrToInt(s) функция s - string integer преобразует строку в целое число . Если преобразование невозможно, то возникает ошибка времени выполнения
FloatToStr(r) функция r - real string преобразует вещественное число к строке
StrToFloat(s) функция s - string real преобразует строку в вещественное число. Если преобразование
2
 Аватар для Виталий5
6 / 6 / 3
Регистрация: 15.06.2013
Сообщений: 69
15.06.2013, 20:12  [ТС]
Wiseman, как вы себе представляете перевод (x+x^2)*(x+ln(2*x)) в вещественный или целый тип? в строке и скобки и функции и знаки, нельзя применять такое преобразование.
0
Заблокирован
15.06.2013, 20:16
переобразуй в строчний тип и присвой s
создай множество s2 из ()+-/* и т.д и проверь if s[i] in s2 then .......
1
 Аватар для Виталий5
6 / 6 / 3
Регистрация: 15.06.2013
Сообщений: 69
15.06.2013, 20:18  [ТС]
Фокус со множеством сработает в поисках скобок безусловно, а если sin cos ln и тому подобные...
0
Заблокирован
15.06.2013, 20:18
создай еще одно множество типа стринг и сверяй с ним
1
 Аватар для Виталий5
6 / 6 / 3
Регистрация: 15.06.2013
Сообщений: 69
15.06.2013, 20:20  [ТС]
как-то не очень ясно, если я определю строку то как потом икс подставить?
0
Заблокирован
15.06.2013, 20:29
переобразуеш все
это долго обьяснять но вот удача чтобы найти решение достаточно просто перейти в https://www.cyberforum.ru/search.php
1
 Аватар для Виталий5
6 / 6 / 3
Регистрация: 15.06.2013
Сообщений: 69
16.06.2013, 08:21  [ТС]
Поиск - прекрасно, я сформулировать не могу задачу для поиска...
0
Заблокирован
16.06.2013, 08:39
поищи калькулятор на паскале
дело в том что там стоит такое же задание

Добавлено через 3 минуты
вот для роспознавания математических знаков
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
var
   s : string;
   ar : array [1..100] of integer;
   op : array [1..100] of char;
   i, n, kar, kop : integer;
   f : boolean;
 
{Берёт число}
Procedure Chislo;
var d, a, p : integer;
    b : boolean;
begin
  b := false;
  p := 0;
  for i := i to n do begin
    a := Ord(s[i]);
    if (a > 47) and (a < 58)
    then begin
      a := a - 48;
      p := p*10 + a;
      b := true;
    end
    else begin
      dec(i);break;
    end;
  end;
 
  if b
  then begin
    inc(kar);
    ar[kar] := p;
  end;
end;
 
{Сдвиг массивов}
Procedure Sdvig(b : integer);
var i : integer;
begin
  for i := b to kop do begin
    ar[i+1] := ar[i+2];
    op[i] := op[i+1];
  end;
  kop := kop - 1;
  kar := kar - 1;
 
  for i := 1 to kar do
    write(ar[i], op[i]);
  writeln;
end;
 
 
begin
 
     Readln(s);
     n := length(s);
     i := 1;
     f := false;
 
     while (i <= n) do begin
       Chislo;
 
       inc(i);
       if i > n
       then break;
       if (s[i] = '+') or (s[i] = '-') or (s[i] = '*') or (s[i] = '/')
       then begin
         inc(kop);
         op[kop] := s[i];
       end
       else
         if s[i] <> ' '
         then begin
           f := true;
           break;
         end;
 
       inc(i);
     end;
 
     write('Numerics : ');
     For i := 1 to kar do
       write(ar[i], ' ');
 
     writeln;
     write('Operations : ');
     For i := 1 to kop do
       write(op[i], ' ');
     writeln;
 
     if f
     then Writeln('Error')
     else
     {Выполнение операций}
     begin
       {* /}
       for i := 1 to kop do
         if (op[i] = '*') or (op[i] = '/')
         then begin
 
           if op[i] = '*'
           then ar[i] := ar[i] * ar[i+1];
 
           if op[i] = '/'
           then ar[i] := ar[i] div ar[i+1];
 
           Sdvig(i);
           i := i - 1;
         end;
 
       {+ -}
       for i := 1 to kop do
         if (op[i] = '+') or (op[i] = '-')
         then begin
 
           if op[i] = '+'
           then ar[i] := ar[i] + ar[i+1];
 
           if op[i] = '-'
           then ar[i] := ar[i] - ar[i+1];
 
           Sdvig(i);
           i := i - 1;
         end;
 
       Writeln('Result = ', ar[1]);
     end;
 
     Readln;
end.
Добавлено через 15 секунд
скобки по аналогии
1
 Аватар для Виталий5
6 / 6 / 3
Регистрация: 15.06.2013
Сообщений: 69
16.06.2013, 09:26  [ТС]
Wiseman, Спасибо, попробую разобраться.

Добавлено через 33 минуты
Что-то не то, вы меняете значение итератора i в цикле, компилятор ругается
0
Заблокирован
16.06.2013, 11:26
мой не ругается
1
 Аватар для Виталий5
6 / 6 / 3
Регистрация: 15.06.2013
Сообщений: 69
16.06.2013, 12:33  [ТС]
Wiseman, угу работает,я в паскаль .net просто запускал, сейчас подумаю...

Добавлено через 36 минут
Как-то не в кайф ковыряться в чужом коде... проще самому писать, может кто подскажет, может библиотека какая есть? не обязательно в паскале, могу и в delphi этот проект сделать...
0
Заблокирован
16.06.2013, 12:34
найди калькулятор на Делфи и от туда все возьми
0
 Аватар для Виталий5
6 / 6 / 3
Регистрация: 15.06.2013
Сообщений: 69
16.06.2013, 13:00  [ТС]
калькулятор я разберу, но у меня немного другая процедура, я же пишу с иксом, а потом программе нужно его подставить, калькулятор отделит скобки и т.п. а подставить икс?
0
Заблокирован
16.06.2013, 13:16
ты сделай все остальное а с х я помогу
0
 Аватар для Виталий5
6 / 6 / 3
Регистрация: 15.06.2013
Сообщений: 69
16.06.2013, 14:01  [ТС]
на сайте есть хорошие примеры калькуляторов, но там уже созданные библиотеки, копаться в библиотеке попробовал - не понимаю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.06.2013, 14:01
Помогаю со студенческими работами здесь

Как научить программу различать '1' и '9' от '19'?
Помогите, в string записываются рандомно цифры от 1 до 999 по порядку (К примеру 134678; 3679; ) , в дальнейшем из этого массива будут...

Как научить программу что-то рисовать?
Здравствуйте! Есть ли книги или статьи по написания программы, которая &quot;смогла бы&quot; нарисовать какой-то образ, но не одинаковым...

Как научить программу спрашивать за базар?
Часик в радость, чифир в сладость, бродяги. Собственно, как вышел с зоны, решил шерстить всемирную сеть, наткнулся на такую штуку, как...

Как научить программу отличать win1251 от ibm866?
как научить программу определять 1251 от 866 облазил кучу ресурсов, не нашел подходящего, все пишут что нужно заранее знать кодировку...

Как научить программу выбирать файл для открытия
Вопрос по С++. Помогите сделать открытие нужного файла в бесконечном цикле for(;;), чтобы в зависимости от значения переменной n открывался...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru