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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2010, 07:33   #1
agarum
Пользователь
 
Регистрация: 17.06.2009
Сообщений: 10
По умолчанию Ranged checked error

решаю задачу на длинную арифметику (сложить два длинных числа, длинное число не влезает ни в один тип даных)
написал вот такой код, вроде должен исправно работать, а он пишет Ranged checked error и даже до rewrite(output) не доходит, сразу на end перескакивает, что делать?

Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils, Math;


var a, b, c: string;
i, m, j, i1, i2: integer;
p: boolean;
procedure swap(var x, y: char);
var z: char;
begin
z:=y;
y:=x;
x:=z;
end;

function chrtoint(l:char):integer;
var o: string;
i: integer;
begin
 if l='0' then result:=0;
 if l='1' then result:=1;
 if l='2' then result:=2;
 if l='3' then result:=3;
 if l='4' then result:=4;
 if l='5' then result:=5;
 if l='6' then result:=6;
 if l='7' then result:=7;
 if l='8' then result:=8;
 if l='9' then result:=9;
end;

function inttochr(l1: integer):char;
var o: string;
  begin
  if l1=0 then result:='0'
  else begin
    o:='123456789';
    result:=o[l1];
 end;
  end;


function plus(x, y: char): char;
var prom: integer;
begin
 prom:=chrtoint(x)+chrtoint(y);
 if p then inc(prom);

 if (prom<10) then
  begin
   p:=false;
   result:=inttochr(prom);
  end;
 if (prom>9) then
  begin
   p:=true;
   result:=inttochr(prom mod 10);
  end;
end;


begin
 assign(input,'input.txt');
 assign(output,'output1.txt');
 reset(input);
  readln(a);
  read(b);
 close(input);
   m:=max(length(a), length(b));
  for i:=1 to length(a) div 2 do
    swap(a[i], a[length(a)-i+1]);
  for i2:=1 to length(b) div 2 do
    swap(b[i2], b[length(b)-i2+1]);
  for i1:=1 to m do
    c[i1]:=plus(a[i1], b[i1]);
  for j:=1 to length(c) div 2 do
    swap(c[j], c[length(c)-j+1]);

  rewrite(output);
  write (c);
  close(output);
end.

Последний раз редактировалось Stilet; 19.09.2010 в 12:48.
agarum вне форума Ответить с цитированием
Старый 19.09.2010, 10:03   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Код:
   ...
  SetLength(c, m);  //добавить
  for i1:=1 to m do
    c[i1]:=plus(a[i1], b[i1]);
   ...
Еще одна причина ошибки. На строке c[i1]:=plus(a[i1], b[i1]); обязательно будет вышеназванная ошибка, если количество цифр в переменных a и b разное. Алгоритм необходимо переделать так чтобы количество цифр в обоих переменных было одинаковым. Например, меньшее число дополнять нулями слева.

И выбросьте вы эти абсолютно бесполезные assign(input, output... вместе с close.

Последний раз редактировалось Прик; 19.09.2010 в 10:27. Причина: Добавлен еще одна причина ошибки
Прик вне форума Ответить с цитированием
Старый 19.09.2010, 10:06   #3
Alexei91
Заблокирован
Форумчанин
 
Аватар для Alexei91
 
Регистрация: 30.12.2009
Сообщений: 544
По умолчанию

Внимательно проверьте код,особенно,где идёт с char.
Отладьте каждую функцию отдельно и найдёте,где вылазит ошибка.
Темы для WordPress. Русские WordPress шаблоны
Alexei91 вне форума Ответить с цитированием
Старый 19.09.2010, 10:44   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не в плане исправления косяков в алгоритме, а исключительно в плане оптимизации кода.

Ну не могу я смотреть, на километровый неоптимальный код, который можно заменить ОДНОЙ командой.
Код:
function chrtoint(l:char):integer;
begin
  Result := ord(l)-ord('0');
end;

function inttochr(l1: integer):char;
begin
  result:=chr(l1+ord('0'));
end;
p.s. К слову, а для чего в данном алгоритме SWAP ? для чего переставлять символы местами?!

И надо цикл сложения делать справа налево (как в начальной школе учили).

Последний раз редактировалось Serge_Bliznykov; 19.09.2010 в 10:47.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.09.2010, 13:48   #5
agarum
Пользователь
 
Регистрация: 17.06.2009
Сообщений: 10
По умолчанию

Serge_Bliznykov спасибо за советы по оптимизации, своп нужен - чтобы перевернуть оба числа, чтобы складывались числа "как в начальной школе учили" - справа налево. В конце ответ переворачивается и получается искомое число

Прик, спасибо, сейчас отлаживаю, но той ошибки не вылетает, а assign, close - необходимое условие, тестирующая система требует чтобы была работа с файлами input.txt и output.txt )

Последний раз редактировалось Stilet; 20.09.2010 в 09:36.
agarum вне форума Ответить с цитированием
Старый 19.09.2010, 14:22   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

коли пишите в Делфи так пишите как в Делфи, а не как в паскале(в Делфи AssignFile/CloseFile вообще то)
правда насколько я помню в консоли совместимо с паскалем, но тем не менее лучше избегать недочетов.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.09.2010, 23:34   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Пепел Феникса
коли пишите в Делфи так пишите как в Делфи, а не как в паскале(в Делфи AssignFile/CloseFile вообще то)
+ 1

действительно, в Delphi надо использовать AssignFile вместо Assign и CloseFile вместо Close !
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запоминание Checked после выхода из проги в MainMenu NuR1k Общие вопросы Delphi 2 24.08.2010 19:26
CheckListBox checked iz zarosa marisham0612 Общие вопросы Delphi 1 18.12.2009 00:56
Ищу причину ошибки: Error in loading DLL, она же Error 48. hozpraktik Microsoft Office Excel 1 19.11.2009 12:39
Как решить проблему с Error in loading DLL (Error 48)? Klim Bassenger Microsoft Office Excel 4 23.10.2009 13:44
[VC#] DataGridView - DataGridViewCheckBoxColumn - Checked MuForum Общие вопросы .NET 0 07.06.2008 00:57