Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2008, 00:22   #1
terminadoor
Пользователь
 
Регистрация: 26.06.2008
Сообщений: 86
Восклицание Математика

Скажите идею как сделать программу калькулятор. Пример: 2+2(IN),4(OUT) Возможние знаки +,-,*,/. вот моя наработка:
Код:
program supermath;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var a,b,c,d,e,f,g,h,j,k,l,m,n,o,p,count,code,pri:int64;
var i:longint;
var act,num:array[0..100] of string;
var res:array[1..100] of int64;
var s1,s2,s3,s,s4:string;
var plus,minus,divide,multiply:boolean;
begin
readln(s);
count:=1;
for i:=1 to 100 do begin
act[i]:='+';
num[i]:='0';
end;
while (pos('+',s)>0) or (pos('-',s)>0) or (pos('*',s)>0) or (pos('/',s)>0) do begin
a:=pos('+',s);
b:=pos('-',s);
c:=pos('*',s);
d:=pos('/',s);
if a=0 then a:=99999999;
if b=0 then b:=99999999;
if c=0 then c:=99999999;
if d=0 then d:=99999999;
plus:=(a<>0) and (a<b) and (a<c) and (a<d);
minus:=(b<>0) and (b<a) and (b<c) and (b<d);
multiply:=(c<>0) and (c<a) and (c<b) and (c<d);
divide:=(d<>0) and (d<a) and (d<b) and (d<c);
if plus then begin
num[count]:=copy(s,1,a-1);
act[count]:=copy(s,a,1);
delete(s,1,a);
inc(count);
end;
if minus then begin
num[count]:=copy(s,1,b-1);
act[count]:=copy(s,b,1);
inc(count);
delete(s,1,b);
end;
if multiply then begin
num[count]:=copy(s,1,c-1);
act[count]:=copy(s,c,1);
delete(s,1,c);
inc(count);
end;
if divide then begin
num[count]:=copy(s,1,d-1);
act[count]:=copy(s,d,1);
delete(s,1,d);
inc(count);
end;
a:=pos('+',s);
b:=pos('-',s);
c:=pos('*',s);
d:=pos('/',s);
if not (a>0) or (b>0) or (c>0) or (d>0) then num[count]:=s;
end;
i:=1;
while i<99 do begin
e:=strtoint(num[i]);
f:=strtoint(num[i+1]);
plus:=false;
minus:=false;
multiply:=false;
divide:=false;
plus:=pos('+',act[i])>0;
minus:=pos('-',act[i])>0;
multiply:=pos('*',act[i])>0;
divide:=pos('/',act[i])>0;
if plus then g:=e+f;
if minus then g:=e-f;
if multiply then g:=e*f;
if divide then g:=trunc(e/f);
res[1]:=res[1]+g;
inc(i,2);
end;
writeln(res[1]);
readln;
end.
Но прога функционирует неправильно. Если сами знаки +,все хорошо. Иначе - нет. Помогоите пожалуйста или дайте ссилку на подобную тему.
Спосибо.
TerMinAdoOR
terminadoor вне форума Ответить с цитированием
Старый 21.09.2008, 14:56   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Что-то Вы наворотили, без бутылки не разберешь. Если нужен сложный калькулятор, принимающий формулу из строки, почитайте в инете или на этом форуме про обратную польскую запись.
puporev вне форума Ответить с цитированием
Старый 22.09.2008, 21:39   #3
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию

TerMinAdoOR, напишите, пожалуйста, ваш пример и ответ, который должна дать программа.

Если она на строчку 2*5-6+3 должна дать ответ 7, то попробуйте эту программу:

program supermath;

{$APPTYPE CONSOLE}

uses
SysUtils;
var a,b,c,d,e,f,g,h,j,k,l,m,n,o,p,count ,code,pri:int64;
i:longint;
num:array[0..100] of string;
s1,s2,s3,s,s4:string;
plus,minus,divide,multiply:boolean;
act:string;


begin
readln(s);
count:=1;
for i:=1 to 100 do
num[i]:='0';
while (pos('+',s)>0) or (pos('-',s)>0) or (pos('*',s)>0) or (pos('/',s)>0) do
begin
a:=pos('+',s);
b:=pos('-',s);
c:=pos('*',s);
d:=pos('/',s);
if a=0 then a:=99999999;
if b=0 then b:=99999999;
if c=0 then c:=99999999;
if d=0 then d:=99999999;
plus:=(a<>0) and (a<b) and (a<c) and (a<d);
minus:=(b<>0) and (b<a) and (b<c) and (b<d);
multiply:=(c<>0) and (c<a) and (c<b) and (c<d);
divide:=(d<>0) and (d<a) and (d<b) and (d<c);
if plus then begin
num[count]:=copy(s,1,a-1);
act:=act+s[a];
delete(s,1,a);
inc(count);
end;
if minus then begin
num[count]:=copy(s,1,b-1);
act:=act+s[b];
inc(count);
delete(s,1,b);
end;
if multiply then begin
num[count]:=copy(s,1,c-1);
act:=act+s[c];
delete(s,1,c);
inc(count);
end;
if divide then begin
num[count]:=copy(s,1,d-1);
act:=act+s[d];
delete(s,1,d);
inc(count);
end;
a:=pos('+',s);
b:=pos('-',s);
c:=pos('*',s);
d:=pos('/',s);
if not (a>0) or (b>0) or (c>0) or (d>0) then num[count]:=s;
end;
i:=2;
g:=strtoint(num[1]);
while (i<99) and (act<>'') do
begin
f:=strtoint(num[i]);
plus:=false;
minus:=false;
multiply:=false;
divide:=false;
plus:='+'=act[1];
minus:='-'=act[1];
multiply:='*'=act[1];
divide:='/'=act[1];
delete(act,1,1);
if plus then g:=g+f;
if minus then g:=g-f;
if multiply then g:=g*f;
if divide then g:=trunc(g/f);
inc(i);
end;
writeln(g);
readln;
end.
Сергей089 вне форума Ответить с цитированием
Старый 22.09.2008, 21:42   #4
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию

Только она не учитывает приоритет операций.
Сергей089 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Математика для программиста Gribushkino Свободное общение 12 07.01.2011 01:25
Математика doniyor Общие вопросы Delphi 2 15.05.2008 18:25
Нужна ли программисту математика? пыхта4ог Общие вопросы по программированию, компьютерный форум 25 20.02.2008 11:11
TDateTime - математика времени _SERGEYX_ Общие вопросы Delphi 2 14.09.2007 14:27
Математика в DELPHI ironden Общие вопросы Delphi 2 17.05.2007 15:01