Калькулятор на делфи

  • Автор темы Khloe
  • Дата начала
K

Khloe

#1
Помогите мне пожалуйста!!! Конечно не безвозмезно. Мне нужен исходный код программы калькулятор на Делфи 40 разрядов, чтобы он считал плюс минус умножить и разделить. НУ умоляю вас!!!! ПОМОГИТЕ!!!!
 
K

Khloe

#2
Ну неужели на этом огромном форуме никто никогда не делал калькулятор??? Сбросте мне код, прошу вас!!! :) :( :(
 
R

root

#3
Для: Khloe
не надо в каждом разделе тему создавать, все кто хочет помочь просматривают всесь форум.
 
K

Khloe

#4
Для: Khloe
А чем не устраивает тот что root вам нашел? нормальный такой калькулятор ...
http://www.delphiforfun.org/Programs/Downl...eCalcSource.zip
мне бы он понравился, если я на него хотя бы посотреть могла. у меня страница просто не отражается :) всё у меня не так последнее время! :( :(
 
K

Khloe

#8
Подскажите ещё пожалуйста, как сделать так чтобы он считал не только целые числа??? ПОЖАЛУЙСТА, ОТКЛИКНЕТЕСЬ КТО ЗНАЕТ!!!!!!
 
R

root

#9
Подскажите ещё пожалуйста, как сделать так чтобы он считал не только целые числа??? ПОЖАЛУЙСТА, ОТКЛИКНЕТЕСЬ КТО ЗНАЕТ!!!!!!
др Калькулятор. только borderIcons свойство формы поднастройте
 

Вложения

K

Khloe

#10
Да, и ещё вопрос, возможно ли переделать из 16 разрядного калькулятов в 40 рязрядный?? Или прийдётся всё заново??? :)
 
B

Black horse

#11
<!--QuoteBegin-Khloe+18:01:2008, 16:41 -->
<span class="vbquote">(Khloe @ 18:01:2008, 16:41 )</span><!--QuoteEBegin-->Да, и ещё вопрос, возможно ли переделать из 16 разрядного калькулятов в 40 рязрядный?? Или прийдётся всё заново???
[snapback]94144" rel="nofollow" target="_blank[/snapback]​
[/quote]
Там используется для вычислений тип double - и его точности на 40 знаков точно не хватит. Чтобы достичь нужной тебе точности нужно использовать либо какие дополнительные модули(классы) либо алгоритм длинной арифметики, слелдеут отметить что для +,-,* - сложность таких алгоритмов средняя, но для деления - высокая сложность(строк 200 кода). Если надо могу выложить код этих процедур.
 
K

Khloe

#12
Там используется для вычислений тип double - и его точности на 40 знаков точно не хватит. Чтобы достичь нужной тебе точности нужно использовать либо какие дополнительные модули(классы) либо алгоритм длинной арифметики, слелдеут отметить что для +,-,* - сложность таких алгоритмов средняя, но для деления - высокая сложность(строк 200 кода). Если надо могу выложить код этих процедур.
да, если не тяжело - выложи, пожалуйста буду очень благодарны!!!!
 
B

Black horse

#13
<!--QuoteBegin-Khloe+21:01:2008, 17:48 -->
<span class="vbquote">(Khloe @ 21:01:2008, 17:48 )</span><!--QuoteEBegin-->да, если не тяжело - выложи, пожалуйста буду очень благодарны!!!!
[snapback]94411" rel="nofollow" target="_blank[/snapback]​
[/quote]
OK
вот функции и процедуры
Код:
Const
MAX_LENGTH = 200;
Type
BigNumber=Array[0..MAX_LENGTH] of integer;
Var
t1,t2:longint;
lk,g,h,n,o,p,z,c,a,b:BigNumber;
str: String;
code, i:integer;
ch :char;

Function getLength(number : BigNumber) : integer;
Begin
getLength := number[0];
End;

Procedure setLength(len : integer; var number : BigNumber);
Begin
number[0] := len;
End;


Procedure writeoln(s:BigNumber);
Var
i:longint;
Begin
For i:=getLength(s) downto 1 do
write(s[i]);
End;

Function neravno(s,d:BigNumber):boolean;
Var
i:longint;
Begin
If getLength(s)<>getLength(d) then
neravno:=true
Else
Begin
For i:=1 to getLength(s) do
If s[i]<>d[i] then
Begin
neravno:=true;
exit;
End;
neravno:=false;
End;
End;

Procedure plus(s,d:BigNumber;var pl:BigNumber);
Var
i,k:longint;
Begin
Fillchar(pl,sizeof(pl),0);
If getLength(s) > getLength(d) then
k:=getLength(s) + 1
Else
k:=getLength(d) + 1;
For i:=1 to k do
Begin
pl[i]:=s[i] + d[i] + pl[i];
If pl[i] > 9 then
Begin
pl[i+1]:=1;
pl[i]:=pl[i] mod 10;
End;
End;
If pl[k]=0 then
dec(k);
setLength(k,pl);
End;

Procedure ymn(s,d:BigNumber;var ym:BigNumber);
Var
i,j,k:longint;
Begin
Fillchar(ym,sizeof(ym),0);
k:=getLength(s) + getLength(d);
For i:=1 to getLength(s) do
For j:=1 to getLength(d) do
ym[i+j-1]:=s[i]*d[j]+ym[i+j-1];
For i:=1 to k-1 do
Begin
ym[i+1]:=ym[i+1] + ym[i] div 10;
ym[i]:=ym[i] mod 10;
End;
While ym[k]=0 do
dec(k);
setLength(k,ym);
End;

Function bolshe(s,d:BigNumber):boolean;
Var
i:longint;
Begin
If getLength(s) > getLength(d) then
bolshe:=true;
If getLength(s) < getLength(d) then
bolshe:=false;
If getLength(s) = getLength(d) then
Begin
i:=getLength(s);
If s[i] > d[i] then
Begin
bolshe:=true;
exit;
End;
If s[i]<d[i] then
Begin
bolshe:=false;
exit;
End;
While (s[i]=d[i])and(i>0) do
Begin
If s[i]>d[i] then
Begin
bolshe:=true;
exit;
End;
If s[i]<d[i] then
Begin
bolshe:=false;
exit;
End;
dec(i);
End;
If i<>0 then
If s[i]>d[i] then
Begin
bolshe:=true;
exit;
End
Else
bolshe:=false;{Если >=то надо писать true}
bolshe:=false;{Если >=то надо писать true}
End;
End;

Function bolsher(s,d:BigNumber):boolean;
Var
i:longint;
Begin
If getLength(s) > getLength(d) then
bolsher:=true;
If getLength(s) < getLength(d) then
bolsher:=false;
If getLength(s) = getLength(d) then
Begin
i:=getLength(s);
If s[i] > d[i] then
Begin
bolsher:=true;
exit;
End;
If s[i]<d[i] then
Begin
bolsher:=false;
exit;
End;
While (s[i] = d[i]) and (i > 0) do
Begin
If s[i] > d[i] then
Begin
bolsher:=true;
exit;
End;
If s[i]<d[i] then
Begin
bolsher:=false;
exit;
End;
dec(i);
End;
If s[i]>d[i] then
Begin
bolsher:=true;
exit;
End
Else
bolsher:=false;
End;
End;

procedure minus(s,d:BigNumber;var min:BigNumber);
var K,i:longint;
begin
fillchar(min,sizeof(min),0);
if getLength(s) > getLength(d) then
k:=getLength(s)
else
k:=getLength(d);
for i:=1 to k do
begin
min[i]:=s[i] - d[i] + min[i];
if min[i] < 0 then
begin
min[i+1]:=min[i+1] - 1;
min[i]:=min[i] + 10;
end;
end;
while (min[k] = 0) and (k > 0) do
dec(k);
setLength(k,min);
end;

Procedure diving(s,d:BigNumber;var dl:BigNumber);
label 1,2,3;
var
q,e,t,r,t1:BigNumber;
k,u,j,min,max:longint;
begin
fillchar(q,sizeof(q),0);
fillchar(e,sizeof(e),0);
if bolsher(s,d) then
begin
for j:=1 to getLength(d) do
e[getLength(d) - j + 1]:=s[getLength(s) - j + 1];
setLength(getLength(d),e);
u:=getLength(d);
if bolshe(d,e) then
begin
for j:=getLength(e) downto 1 do
e[j+1]:=e[j];
setLength(getLength(e) + 1, e);
e[1]:=s[getLength(s) - u];
inc(u);
end;
while u<=getLength(s) do
begin
min:=1;
max:=9;
1:{}if k=(min+max+1) div 2 then
begin
k:=(min+max) div 2;
goto 3;
end;{}k:=(min+max+1) div 2;
if (min=1)and(max=2) then k:=1;
3:setLength(1, t);
t[1]:=k;
ymn(t,d,t1);
if bolshe(t1,e) then
begin
max:=k;
goto 1;
end
else
begin
minus(e,t1,r);
if bolsher(r,d) then
begin
min:=k;
goto 1;
end;
end;
setLength(getLength(q) + 1, q);
q[getLength(q)]:=t[1];
ymn(d,t,r);
minus(e,r,e);
2:if (u<getLength(s)) then
begin
if (s[getLength(s) - u]<>0) or (getLength(e) <> 0) then
begin
for j:=getLength(e) downto 1 do
e[j+1]:=e[j];
setLength(getLength(e) + 1, e);
e[1]:=s[getLength(s) - u];
end;
inc(u);
if (bolshe(d,e)) then
begin
k:=10;
setLength(getLength(q) + 1, q);
q[getLength(q)]:=0;
goto 2;
end;
end
else
if k=10 then
break
else
inc(u);
end;
end{конец цикла}
else
setLength(0, dl);
for j:=1 to getLength(q) do
dl[j]:=q[getLength(q) - j + 1];
setLength(getLength(q), dl);
end;
вот main
Код:
Begin {main}
Readln(str);
setLength(length(str), b);
For i:=getLength(b) downto 1 do
Begin
ch:=str[i];
val(ch,b[getLength(b)-i+1],code);
End;
Readln(str);
setLength(length(str), a);
For i:=getLength(a) downto 1 do
Begin
ch:=str[i];
val(ch,a[getLength(a) - i + 1],code);
End;

fillchar(o,sizeof(o),0);
diving(b,a,o);
writeoln(o);
End.
если тебе нужен калькультор с дробной частью то надо немного подмодифицировать. Например дорисовывать лишние нули.

Функцию diving - писал ещё когда в школе учился, поэтому там есть метки.
 
04.09.2006
2 566
3
#14
Для: Black horse
Такой длинный код лучше выкладывай прикрепленными файлами! Кстати, по-моему я тебе это уже говорил...
 
B

Black horse

#15
<!--QuoteBegin-European+22:01:2008, 11:58 -->
<span class="vbquote">(European @ 22:01:2008, 11:58 )</span><!--QuoteEBegin-->Такой длинный код лучше выкладывай прикрепленными файлами! Кстати, по-моему я тебе это уже говорил...
[snapback]94491" rel="nofollow" target="_blank[/snapback]​
[/quote]
во-первых не говорил, во-вторых он не такой уж и длинный.
 
04.09.2006
2 566
3
#16
<!--QuoteBegin-Black horse+22:01:2008, 14:52 -->
<span class="vbquote">(Black horse @ 22:01:2008, 14:52 )</span><!--QuoteEBegin-->во-первых не говорил,
[snapback]94529" rel="nofollow" target="_blank[/snapback]​
[/quote]
Ну тогда говорю :)
<!--QuoteBegin-Black horse+22:01:2008, 14:52 -->
<span class="vbquote">(Black horse @ 22:01:2008, 14:52 )</span><!--QuoteEBegin-->во-вторых он не такой уж и длинный.
[snapback]94529" rel="nofollow" target="_blank[/snapback]​
[/quote]
Для ветки форума - длинный
 
K

Khloe

#17
если тебе нужен калькультор с дробной частью то надо немного подмодифицировать. Например дорисовывать лишние нули.

Функцию diving - писал ещё когда в школе учился, поэтому там есть метки.
[/quote]



спасибо большое!!!! Очень выручил, помог!!!