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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2010, 12:30   #1
Oriqami
Новичок
Джуниор
 
Регистрация: 15.09.2010
Сообщений: 1
Восклицание Оформление в Delphi.

Добрый день, джентельмены.
Есть 2 задачи, которые написаны на Паскале и которые нужно оформить в Делфи.
1. Проверить, делится ли данное ОченьДлинноеЦелое на 11 (использовать признак делимости). Вывести результат,если признак делимости выполняется. (В Делфи нужно сделать так, вводимое в эдит число проверялось по условию по нажатию на кнопку и выводился ответ. Во второй задаче просто кнопка проверить и, возможно, как нибудь вывести значения сравниваемых чисел)
Код задачи.
Код:
//---------------------------------------------------------
// Задача 1 
// Алгоритм использует следующее равенство
// (10^(n-1)*x[0] + 10^(n-2)*x[1] + ... + 10*x[n-2] + x[n-1])*11 =
// 10^n*x[0] + 10^(n-1)*(x[1] + x[0]) + ... + 10*(x[n-1] + x[n-2]) + x[n-1] =
// 10^n*z[0] + 10^(n-1)*z[1] + ... + 10*z[n-1] + z[n],
// откуда прежде всего следует, что x[n-1] = z[n].
// Далее (x[n-1] + x[n-2]) mod 10 = z[n-1].
// Если ((a+b) mod 10) = с > a, то это означает, что a+b < 10 и наоборот
// если ((a+b) mod 10) = с < a, то a+b > 10 (например (4+3) mod 10 = 7,
// (4+8) mod 10 = 2). Т.е., если x[n-1] < z[n-1], то x[n-2] = z[n-1] - x[n-1],
// в противном случае x[n-2] = z[n-1] + 10 - x[n-1] и при этом еще
// 1 перейдет на следующий шаг. Ну и так далее.
// в функции z - делимое, x - результат.
// --------------------------------------------------------
function qoutient_11(z : String; var x : String) : integer;
var
  n, i, j, x0, x1, d : Integer;
  w                  : array[1..256] of char;
begin
  n := length(z);

  x0 := 0;
  i  := 1;
  while i <= n do            // Сумма цифр на нечетных позициях
  begin
    x0 := x0 + Ord(z[i]) - Ord('0');
    Inc(i, 2);
  end;

  x1 := 0;
  i  := 2;
  while i <= n do            // Сумма цифр на четных позициях
  begin
    x1 := x1 + Ord(z[i]) - Ord('0');
    Inc(i, 2);
  end;

  if (x1 - x0) mod 11 <> 0 then  // Проверка признака делимости на 11:
  begin                          // разность x1 - x0 должна делиться на 11.
    qoutient_11 := 0;
    exit;
  end;

  j := n - 1;
  i := j;
  d := 0;
  w[i] := z[n];
  while j > 1 do
  begin
    Dec(j);
    if Ord(w[i]) + d < Ord(z[i]) then
    begin
      w[j] := Chr(Ord(z[i])- Ord(w[i]) - d + Ord('0'));
      d := 0;
    end
    else
    begin
      w[j] := Chr((Ord(z[i]) + 10) - Ord(w[i]) - d + Ord('0'));
      d := 1;
    end;
    i := j;
  end;

  for i:=1 to n - 1 do
  x := x + w[i];
  qoutient_11 := 1;
end;

и

2. Вычесть КороткоеЦелое из ОДЦ.
Код:
// -----------------------------------------------------
// Задача 2 
//  x - y = z
//-----------------------------------------------------
function difference(x : String; y: String; var z: String): integer;
var
  nx, ny, ix, iy, d: Integer;
  w                : Array[1..256] of Char;
  error            : boolean;
begin
  nx := length(x);
  ny := length(y);

  error := false;                   // проверка того, что x > y
  if nx < ny then
  error := true
  else
  if nx = ny then
  begin
    ix := 1;
    while ix <= nx do
    begin
      if Ord(x[ix]) > Ord(y[ix]) then
      break;
      Inc(ix);
    end;
    if ix > nx then
    error := true;
  end;

  if error then
  begin
    difference := 0;      // x < y - выходим из функции
    exit;
  end;

  ix := nx;              // Далее идет вычитание "столбиком"
  iy := ny;
  d := 0;
  while iy > 0 do
  begin
    if Ord(y[iy]) + d <= Ord(x[ix]) then
    begin
      w[ix] := Chr(Ord(x[ix]) - Ord(y[iy]) - d + Ord('0'));
      d := 0;
    end
    else
    begin
      w[ix] := Chr((Ord(x[ix]) + 10) - Ord(y[iy]) - d + Ord('0'));
      d := 1;
    end;
    Dec(ix);
    Dec(iy);
  end;
  while ix > 0 do
  begin
    if d <= Ord(x[ix]) - Ord('0') then
    begin
      w[ix] := Chr(Ord(x[ix]) - d);
      d := 0;
    end
    else
    begin
      w[ix] := Chr((Ord(x[ix]) + 10) - d);
      d := 1;
    end;
    Dec(ix);
  end;

  ix := 1;
  while w[ix] = '0' do
  inc(ix);

  z  := '';
  while ix <= nx do
  begin
    z := z + w[ix];
    Inc(ix);
  end;

  difference := 1;
end;
Пожалуйста, помогите переоформить этот код под Делфи!
Oriqami вне форума Ответить с цитированием
Старый 15.09.2010, 12:34   #2
fbus
Форумчанин
 
Аватар для fbus
 
Регистрация: 23.10.2008
Сообщений: 460
По умолчанию

я думаю на халяву не пройдет, пиши мне в аську, я переделаю.
fbus вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi - оформление ссылок Alexmur07 Помощь студентам 3 30.11.2009 11:05
оформление delphi Virus191288 Общие вопросы Delphi 10 24.07.2009 16:07
оформление FIIR Помощь студентам 1 16.06.2008 20:40