Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
6 / 6 / 0
Регистрация: 04.06.2010
Сообщений: 44

калькулятор

04.06.2010, 21:02. Показов 2339. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте! Очень нуждаюсь в Вашей помочи
Мне надо написать програму которая бы считала выражение из строки
напимер user вводит выражение 10+3-(25/5)+3*2 как строку и надо вывести результат
возможна также операции степеня, модуля и кореня но не обьязательно

Может есть у кого исходник програмы на Паскаль или С++
Заранее спасибо
Я нашел на форуме несколько програм
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
uses crt;
const
     ASCII=[48..57];
var
   s,temp:string;
   i,f,l,code:integer;
   res:integer;
   d:byte;
begin
 write('Введите выражение -->');
 readln(s);
 temp:='';
 for i:=1 to length(s) do
  begin
   if (ord(s[i]) in ASCII) then temp:=temp+s[i];
   if not(ord(s[i]) in ASCII) or (i=length(s)) then
    begin
     if (i<length(s)) then
      begin
       case s[i] of
       '+':d:=1;
       '-':d:=2;
       '*':d:=3;
       '/':d:=4;
       end;
       val(temp,f,code);
       temp:='';
      end else
      val(temp,l,code);
    end;
  end;
 case d of
 1: res:=f+l;
 2: res:=f-l;
 3: res:=f*l;
 4: res:=f/l;
 end;
 writeln(res);
 readln
end.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
uses crt;
const cf=['0'..'9'];
var s:string;
    sm:real;
    i:byte;
begin
clrscr;
writeln('vvedit vyraz = ');
readln(s);
sm:=0;
for i:=1 to length(s) do
 begin
  if(s[i] in cf)and((s[i-1]='+')or(i=1))then sm:=sm+(ord(s[i])-48);
  if(s[i] in cf)and(s[i-1]='-') then sm:=sm-(ord(s[i])-48);
  if(s[i] in cf)and(s[i-1]='*') then sm:=sm*(ord(s[i])-48);
  if(s[i] in cf)and(s[i-1]='/') then sm:=sm/(ord(s[i])-48);
 end;
write('=',sm);
readln
end.
Но здесь 1 програма считает только например 1+2 или 10/5 а во второй если например есть выражение
1*2+3 то считает правильно а если 3+1*2 то неправильно

Добавлено через 2 часа 11 минут
или вот нашол код на С++
C++
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
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <assert.h>
#include <conio.h>
#include <stdio.h>
 
int tok;
double tokval;
 
int next() {
            
    for (;;) {
        int c = getchar();
        if (c == EOF || strchr("+-*/^()\n", c) != NULL) return tok = c;
        if (isspace(c)) continue;
        if (isdigit(c) || c == '.') {
            ungetc(c, stdin);
            scanf(" %lf", &tokval);
            return tok = 'n';
    
        }
        
        fprintf(stderr, "Bad character: %c\n", c); 
    
    }
}
 
void skip(int t) { assert(tok == t); next(); }
 
double plusminus();
 
 
double dugky() {
    if (tok == 'n') { double x = tokval; skip('n'); return x; }
    skip('('); double x = plusminus(); skip(')'); return x;
}
 
 
double stepin() {
    double x = dugky();
    if (tok == '^') { skip('^'); x = pow(x, stepin()); }
    return x;
}
 
 
double mnogdil() {
    double x = stepin();
    for (;;) {
        if (tok == '*') { skip('*'); x *= stepin(); }
        else if (tok == '/') { skip('/'); x /= stepin(); }
        else return x;
    }
}
 
 
double plusminus() {
    double x = mnogdil();
    for (;;) {
        if (tok == '+') { skip('+'); x += mnogdil(); }
        else if (tok == '-') { skip('-'); x -= mnogdil(); }
        else return x;
    }
}
 
int main() {
    next();
    while (tok != EOF) {
        if (tok == '\n') { skip('\n'); continue; }
        printf("%,g\n", plusminus());
    }
    getch();
        return 0;
}
но разобратся никак не могу может кто прокоментировать програму т.е обяснить что делает та или иная строка в коде
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.06.2010, 21:02
Ответы с готовыми решениями:

Калькулятор
В новой программе OpenCalculator появилась новая возможность – можно настроить, какие кнопки отображаются, а какие – нет. Если кнопка не...

Калькулятор
В первой строке записано арифметическое выражение в виде: &lt;число&gt; &lt;операция&gt; &lt;число&gt; = Число - это натуральное число, не превышающее...

Калькулятор
Я только начал изучать Паскаль, думаю у меня будет много вопросов =) Вот хочу решить задачку program calc; uses CRT; ...

3
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
04.06.2010, 21:25
Вот есть такая программа, писал не я, я ее только адаптировал к Паскалю. Считает выражения в виде строки с учетом приоритета и скобок.
Суть: выражение считает построчно. Если встречается выражение в скобках, рекурсивно функция вызывает сама себя, рассчитывает выражение внутри скобок и продолжает считать дальше.
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
uses crt;
function Calculate(SMyExpression: string; digits: Byte): string;
 
var 
   z: Char;
   ipos: Integer; 
 
   function StrToReal(chaine: string): Real;
   var
     r: Real; 
     Pos: Integer; 
   begin 
     Val(chaine, r, Pos); 
     if Pos > 0 then Val(Copy(chaine, 1, Pos - 1), r, Pos); 
     StrToReal := r;
   end; 
 
   function RealToStr(inreal: Extended; digits: Byte): string; 
   var 
     S: string; 
   begin 
     Str(inreal: 0: digits, S); 
     realToStr := S; 
   end; 
 
   procedure NextChar; 
   var 
     s: string; 
   begin 
     if ipos > Length(SMyExpression) then 
     begin 
       z := #9; 
       Exit; 
     end 
     else 
     begin 
       s := Copy(SMyExpression, ipos, 1); 
       z := s[1]; 
       Inc(ipos); 
     end; 
     if z = ' ' then nextchar; 
   end; 
 
   function Expression: Real; 
   var 
     w: Real; 
 
     function Factor: Real; 
     var 
       ws: string; 
     begin 
       Nextchar; 
       if z in ['0'..'9'] then 
       begin 
         ws := ''; 
         repeat 
           ws := ws + z; 
           nextchar 
         until not (z in ['0'..'9', '.']); 
         Factor := StrToReal(ws); 
       end 
       else if z = '(' then 
       begin 
         Factor := Expression; 
         nextchar 
       end 
       else if z = '+' then Factor := +Factor 
       else if Z = '-' then Factor := -Factor;
     end; 
 
     function Term: Real;
     var 
       W: Real; 
     begin 
       W := Factor; 
       while Z in ['*', '/'] do 
         if z = '*' then w := w * Factor 
       else 
         w := w / Factor; 
       Term := w;
     end; 
   begin 
     w := term; 
     while z in ['+', '-'] do 
       if z = '+' then w := w + term 
     else 
       w := w - term; 
     Expression := w;
   end;
begin 
   ipos   := 1; 
   Calculate := RealToStr(Expression, digits);
end;
var s,s1:string;
begin
clrscr;
writeln('Vvedite vyrazenye:');
readln(s);
s1:=Calculate(s, 3);
write(s1);
readln
end.
1
6 / 6 / 0
Регистрация: 04.06.2010
Сообщений: 44
04.06.2010, 21:38  [ТС]
Puporev, спасибо большое а можете конкретно обяснить что делает та или иная функция и процедура

Добавлено через 3 минуты
Puporev, и вот еще: в строке 22 выдает ощибку: Must be in 8087 mode to compile this
что ето значит
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
04.06.2010, 21:43
Цитата Сообщение от Ferolayt Посмотреть сообщение
что делает та или иная функция и процедура
А это уж Вы сами, говорю же, не я писал.
Цитата Сообщение от Ferolayt Посмотреть сообщение
Must be in 8087 mode to compile this
Это у вас не подключен математический сопроцессор, поэтому самой первой строкой напишите
{$N+}
или в опциях компилятора в Compiler поставьте крест против 8087/80287
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.06.2010, 21:43
Помогаю со студенческими работами здесь

калькулятор
Нужно написать программу калькулятор. Плиз может кто-нить уже делал дак выложите ссылку или напишите.

калькулятор
Дайте пожалуйста текст калькулятора!!!!!

Калькулятор
Товарищи програмисты помогите написать мудрёный кулкулятор точнее найти ошибку в готовом коде: uses crt; var op1,op2,code,rez:...

Калькулятор
Есть программа, её суть - калькулятор, но не могу понять почему не работает Program example1; Var a: char; x, y, c: real; ...

калькулятор
Есть калькулятор и надо сделать его строками например 2*2-7+3+10/2 = 5 uses crt; var f,n:integer; a,b,w:real; i:longint; begin ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю 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. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru