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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2012, 14:54   #1
Таня =)
Новичок
Джуниор
 
Регистрация: 22.04.2012
Сообщений: 2
Печаль Операция сложения для многоразрядных числ (больше 100) с использованием динамического массива (делфи)

Помогите, пожалуйста, с операцией сложения для многоразрядных числ (больше 100) с использованием динамического массива...
не понимаю, почему в мой массив С (результат), записывается ерунда вместо правильного ответа... когда использую статический массив программа работает =)
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Math;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Label4: TLabel;
    Edit3: TEdit;
    Button6: TButton;
    Label5: TLabel;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  str1,str2,str3: string; {три строки, стр1 - первое число, стр2 - второе, стр3 - результат }
  ak,bk:int64;  {переменные для сохранения длины строк ак - 1ое число, бк - 2ое}             
  {C: array[1..1000] of int64;}
  A,B,C: array of int64; {динамические массивы, A - 1ое число, Б - 2ое, С - результат}
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); {ввод 1го числа в динам массив}
var i:integer;
begin
  str1:=Edit1.Text;
  ak:=length(str1);
  setlength(A,ak+1); {ак+1, т.к. динамический массив отсчитывается от 0, а мне надо от единицы, поэтому память беру с запасом.. иначе возникает конфликт со строками, т.к. строки похожи отсчитываются от 1, а не от 0}
{  while n>0 do
    if (str1[n] in ['0'..'9']) then
      begin
        Memo1.Text:='';
        A[n]:=StrToInt(str1[n]);
        dec(n);
      end
    else
      begin
        Memo1.Text:='Îøèáêà ââîäà äàííûõ';
        exit;
      end; }
  for i:=1 to ak do
    begin
      A[ak-i+1]:=0;
      A[ak-i+1]:=StrToInt(str1[i]); {замудренный способ, почерпнутый из книги, но работает со статическим массивом}
    end;
end;

procedure TForm1.Button2Click(Sender: TObject); {ввод 2го числа по аналогии с 1ым}
var i:integer;
begin
  str2:=Edit2.Text;
  bk:=length(str2);
  setlength(B,bk+1);
  {while n>0 do
    if (str2[n] in ['0'..'9']) then
      begin
        Memo1.Text:='';
        B[n]:=StrToInt(str2[n]);
        dec(n);
      end
    else
      begin
        Memo1.Text:='Îøèáêà ââîäà äàííûõ';
        exit;
      end; }
  for i:=1 to bk do
    begin
      B[bk-i+1]:=0;
      B[bk-i+1]:=StrToInt(str2[i]);
    end;
end;

procedure TForm1.Button3Click(Sender: TObject); {операция сложения}
var i,carry: integer; {сарри - перенос циферки в высшей разряд, например, 1+9=10, "1" это карри и мы его должны перенести}
    n:int64;
begin
  if length(str1)>length(str2) then {проверяю какая строчка больше}
    n:=length(str1)
  else
    n:=length(str2);
  setlength(C, n+1);  {выделяю память под массив С также с запасом, т.к. отсчет от 0}
  carry:=0;
  for i:=1 to n do   {сама операция сложения}
    begin
      C[i]:=0;
      carry:=carry+A[i]+B[i];
      C[i]:=carry mod 10;
      carry:=carry div 10;
    end;
  if carry<>0 then {если карри не равно нулю, то добавляем еще один эл-т в массив-результат и добавляем памяти еще на один эл-т массива}
    begin
      n:=n+1;
      setlength(C,n+2);
      C[n]:=carry;
    end;
  str3:='';
  for i:=n downto 1 do {вывод в поле мемо}
    begin
      str3:=str3+IntToStr(C[i]);
    end;
  Memo1.Text:=str3;
end;

end.
Я думаю, что у меня не правильно распределяется память... помогите, пожалуста!
Таня =) вне форума Ответить с цитированием
Старый 22.04.2012, 15:34   #2
Таня =)
Новичок
Джуниор
 
Регистрация: 22.04.2012
Сообщений: 2
По умолчанию

разобралась сама) все заработала как надо!
Таня =) вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли применить FillChar для динамического массива Я_и Общие вопросы Delphi 15 03.10.2010 21:00
Где найти исходники на Java( 1 проект - больше 1000 классов, 2 проект - больше 100, 3 проект - больше 10) Pti44ka Общие вопросы по Java, Java SE, Kotlin 2 09.09.2010 21:31
создать клас для динамического массива supra89kren Общие вопросы C/C++ 5 30.03.2010 00:23
Переделать для динамического массива. Ueshua Общие вопросы C/C++ 1 20.12.2009 21:33
операция NEW для динамического массива -ushёl- Общие вопросы C/C++ 0 14.11.2009 22:00