Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 025

/ вопрос решён /

Доброго времени суток, уважаемые эксперты! У меня такой вопрос! Я написал калькулятор систем счисления из 2..16 в 2..16. Она работает но не совсем, есть 2 ошибки! когда я пытаюсь перевести FFFFFFF из 16-ичной в 2-ичную программа переводит и выводит ответ, когда количество F задаю больше от 7 до 15 то есть FFFFFFFFFFFFFFF выдает ошибку "Range Check error", когда кол-во F от 15 и более то выдает ошибку "Invalid floating point operation"! Я примерно знаю что эти ошибки связанны с типом real и выход за диапазон значений, но я не уверен. Как можно это обойти!? Если по заданию надо что бы как минимум 10 символов были входными!

alexlafa Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: alexlafa (статус: Посетитель)
Вопрос отправлен: 25 марта 2012, 19:50
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 27 марта 2012, 19:13; участников в обсуждении: 4.
min@y™

min@y™ (статус: Доктор наук), 25 марта 2012, 19:58 [#1]:

Давай будем посмотреть код перевода из одной СС в другую и обратно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
bugmenot

bugmenot (статус: 3-ий класс), 25 марта 2012, 20:18 [#2]:

Ошибка в строке 42, однозначно.
виконання програми розпочинається з того самого мiсця, де призупинилося.

alexlafa

alexlafa (статус: Посетитель), 25 марта 2012, 20:22 [#3]:

unit Unit4;
 
interface
function toABC (x:integer) :string;
function ABCto (s:string;i:integer) :integer;
function  cel_p_to_10 (k:string;osn1:string):real;
function  drob_p_to_10 (k:string;osn1:string):real;
function  cel_10_to_p (k:string;osn2:string):string;
function  drob_10_to_p (k:string;osn2:string):string;
function Addtext (d:integer;tex:string):string;
function formul_result (osn1 , osn2 , k : string) : string;
implementation
 
uses Unit1,math, SysUtils;
 
function toABC (x:integer) :string;
var s: string;
begin
case x of
   0..9: s:=Chr (x+48);
   10..16: s:=Chr (x+55);
   end;
   toABC := s;
end;
 
function ABCto (s:string;i:integer) :integer;
var ch : char;
    d : integer;
begin
d := 0;
ch := s[i];
        case ch of
        '0'..'9': d:=ord(ch)-48;
        'A'..'F': d:=ord(ch)-55;
        'a'..'f': d:=ord(ch)-87;
        end;
    ABCto := d;
end;
 
function  cel_p_to_10 (k:string;osn1:string):real;
 var
 p,l,j,i,d:integer;
 sum,des:real ;
  begin
  p := pos(',' , k);
  l := length(k);
  delete (k , p , l-p+1);
  l := length(k);
  sum := 0;
  j := 0;
for i := l downto 1 do
    begin
    d := ABCto (k , i);
    des := d * power(strtofloat(osn1) , j);
    j := j + 1;
    sum:= des + sum;
    end;
   result:=sum;
end;
 
 
function  drob_p_to_10 (k:string;osn1:string):real;
 var
 p,l,j,i,d:integer;
 sum,des:real ;
begin
  sum:=0;
  j := -1;
  p := pos(',' , k);
  delete (k,1,p);
  l := length(k);
    for i := 1 to l do
      begin
      d := ABCto (k,i);
      des := d * power(strtofloat(osn1) , j);
      j := j - 1;
      sum := des + sum;
      end;
      result:=sum;
  end;
 
function  cel_10_to_p (k:string;osn2:string):string; //перевод из 10 в p - ичную сиситему
var
p,l,x,d:integer;
 s,o:string;
begin
p := strtoint(osn2);
o:='';
           if pos(',',k) <> 0 then
           l := trunc(cel_p_to_10 (k,osn1)+drob_p_to_10 (k,osn1))
           else
           l:=trunc(cel_p_to_10 (k,osn1)); // ошибка 'Range check error' на этой строке 
 
repeat
  begin
  d := l mod p;
   x:=d;
   s := toABC(x);
   o := s + o;
  delete (s,1,1);
  l := l div p;
  end;
until l < p;
if l<>0 then
begin
s := toABC(l);
o := s + o;
end;
result:=o;
end;
 
function  drob_10_to_p (k:string;osn2:string):string;
var
d,x:integer;
s,o:string;
sum:real;
begin
o :=cel_10_to_p (k,osn2);
           if pos(',',k) <> 0 then
           begin
           o :=o + ',';
           sum:= (cel_p_to_10 (k,osn1)+drob_p_to_10 (k,osn1));
           end
           else
           sum:=(cel_p_to_10 (k,osn1));
  repeat
  sum := frac(sum) * strtoint(osn2);
  d := trunc(sum);
  x:=d;
  s := toABC(x);
  o := o + s;
  delete (s,1,1);
  sum := frac(sum);
  until sum=0;
  result:=o;
  end;
 
  function Addtext (d:integer;tex:string):string;
  var
  x:integer;
  begin
  x:=d;
  case d of
  0..9: tex:=tex+inttostr(d);
  10..15: tex:=tex+toABC(x);
  16 : begin
        if (tex = '') or (tex = '-') then tex := tex + '0';
        if pos(',', tex) > 1 then else tex := tex + ',' ;
       end;
  17 : if pos( '-' , tex ) > 0 then delete( tex , 1 , 1 ) else tex := '-' + tex;
  end;
  result:=tex;
  end;
 
 function formul_result (osn1 , osn2 , k : string) : string;
var
  minus : boolean;
begin
    if k[1]= '-' then
    begin
      minus := true;
      delete (k,1,1);
    end
    else
    minus := false;
    if strtoint(osn1) =strtoint(osn2) then result := k
    else
    begin
      if strtoint(osn2) = 10 then
      begin
        if pos(',',k) <> 0 then
        begin
          if k[1]= '0' then result := floattostr (drob_p_to_10 (k,osn1))
          else
          result := floattostr(cel_p_to_10 (k,osn1)+drob_p_to_10 (k,osn1));
        end
        else result := floattostr(cel_p_to_10 (k,osn1));
      end
      else
      begin
        if pos(',',k) <> 0 then
        result := drob_10_to_p (k,osn2)
        else result := cel_10_to_p (k,osn2);
        end;
    end;
    if minus=true then result := '-' + result; // вторая ошибка на это строке при более 15 сиволов 
end;
 
 
end.
min@y™

min@y™ (статус: Доктор наук), 25 марта 2012, 20:28 [#4]:

Посмотрел код. Очень порадовали комментарии в каждой строке! ВСЁ СРАЗУ СТАЛО ПОНЯТНО!
Форматирование кода тоже просто суперское. Даже я так не умею.
Продолжай.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
alexlafa

alexlafa (статус: Посетитель), 25 марта 2012, 21:02 [#5]:

:-( Я всего лишь хотел узнать как можно избежать выход значения за диапазон типа real? в функциях cel_10_to_p или drob_10_to_p в какой то из них ошибка!
min@y™

min@y™ (статус: Доктор наук), 25 марта 2012, 21:08 [#6]:

Цитата (alexlafa):

Я всего лишь хотел узнать как можно

Ага, мой сарказм прошёл мимо, да?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 25 марта 2012, 21:12 [#7]:

Цитата (alexlafa):

выход значения за диапазон типа real?

Да ну? Real - тип с плавающей точкой. А примеры ты приводишь с целыми числами (FFFF...FFF). Как это понимать?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ixer

Ixer (статус: 2-ой класс), 27 марта 2012, 14:05 [#8]:

 l:=trunc(cel_p_to_10 (k,osn1)); // ошибка 'Range check error' на этой строке
Говорит только о том что ошыбка гдето в функцыи "cel_p_to_10 (k,osn1)". Ставь точку останова в етой функцыи и проводи трасировку, Чтоби узнать где именно проблема.
Майним браузером http://browsermine.com/?ref=121318

27 марта 2012, 19:12: Статус вопроса изменён на решённый (изменил автор вопроса — alexlafa): Вообщем ошибка была из за того что функция Trunc возвращает значение Longint, а его диапазон −

27 марта 2012, 19:13: Вопрос вновь открыт (изменение состояния произвёл автор вопроса — alexlafa)

27 марта 2012, 19:13: Статус вопроса изменён на решённый (изменил автор вопроса — alexlafa)

alexlafa

alexlafa (статус: Посетитель), 27 марта 2012, 19:13 [#9]:

Вообщем ошибка была из за того что функция Trunc возвращает значение Longint, а его диапазон &#8722;2147483648..2147483647 так вот при более FFFFFFF, он выходит за рамки диапазона, в этом случае сделал просто уведомления пользователя об ошибки, и остановки приложения.

4 апреля 2012, 20:36: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Алгоритмы, преобразования модератором Ерёмин А.А.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:55
Выполнено за 0.04 сек.