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

Тема в разделе "Delphi - FAQ", создана пользователем Khloe, 12 янв 2008.

  1. Khloe

    Khloe Гость

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

    Khloe Гость

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

    root Гость

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

    Khloe Гость

    мне бы он понравился, если я на него хотя бы посотреть могла. у меня страница просто не отражается :) всё у меня не так последнее время! :( :(
     
  5. root

    root Гость

    Выложил на мировой ресурс :)
     

    Вложения:

  6. Khloe

    Khloe Гость

    ой спасибо огромное!!!
     
  7. root

    root Гость

    Для: Khloe
    Всегда пожалуйста :)
     
  8. Khloe

    Khloe Гость

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

    root Гость

    др Калькулятор. только borderIcons свойство формы поднастройте
     

    Вложения:

    • mincalc.rar
      Размер файла:
      178,2 КБ
      Просмотров:
      88
  10. Khloe

    Khloe Гость

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

    Black horse Гость

    <!--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 кода). Если надо могу выложить код этих процедур.
     
  12. Khloe

    Khloe Гость

    да, если не тяжело - выложи, пожалуйста буду очень благодарны!!!!
     
  13. Black horse

    Black horse Гость

    <!--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
    вот функции и процедуры
    Код (Text):
    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
    Код (Text):
    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 - писал ещё когда в школе учился, поэтому там есть метки.
     
  14. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: Black horse
    Такой длинный код лучше выкладывай прикрепленными файлами! Кстати, по-моему я тебе это уже говорил...
     
  15. Black horse

    Black horse Гость

    <!--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]
    во-первых не говорил, во-вторых он не такой уж и длинный.
     
  16. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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]
    Для ветки форума - длинный
     
  17. Khloe

    Khloe Гость

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

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



    спасибо большое!!!! Очень выручил, помог!!!
     
Загрузка...
Похожие Темы - Калькулятор на делфи
  1. DreamForse
    Ответов:
    0
    Просмотров:
    2.216
  2. users574
    Ответов:
    0
    Просмотров:
    2.002
  3. Bonuse
    Ответов:
    1
    Просмотров:
    1.695
  4. Powinteh
    Ответов:
    0
    Просмотров:
    1.085
  5. Powinteh
    Ответов:
    1
    Просмотров:
    1.077

Поделиться этой страницей