| 
| 
 | Вопрос # 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 (статус: Посетитель)Вопрос отправлен: 25 марта 2012, 19:50
 Состояние вопроса: решён, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 9; последнее сообщение — 27 марта 2012, 19:13; участников в обсуждении: 4. 
|   | min@y™ (статус: Доктор наук), 25 марта 2012, 19:58 [#1]:Давай будем посмотреть код перевода из одной СС в другую и обратно. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | bugmenot (статус: 3-ий класс), 25 марта 2012, 20:18 [#2]:Ошибка в строке 42, однозначно. виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | 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™ (статус: Доктор наук), 25 марта 2012, 20:28 [#4]:Посмотрел код. Очень порадовали комментарии в каждой строке! ВСЁ СРАЗУ СТАЛО ПОНЯТНО! Форматирование кода тоже просто суперское. Даже я так не умею.
 Продолжай.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | alexlafa (статус: Посетитель), 25 марта 2012, 21:02 [#5]:  Я всего лишь хотел узнать как можно избежать выход значения за диапазон типа real? в функциях cel_10_to_p или drob_10_to_p в какой то из них ошибка! |  
|   | min@y™ (статус: Доктор наук), 25 марта 2012, 21:08 [#6]: Цитата (alexlafa): Я всего лишь хотел узнать как можно Ага, мой сарказм прошёл мимо, да?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 25 марта 2012, 21:12 [#7]: Цитата (alexlafa): выход значения за диапазон типа real? Да ну? Real - тип с плавающей точкой. А примеры ты приводишь с целыми числами (FFFF...FFF). Как это понимать?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | 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 (статус: Посетитель), 27 марта 2012, 19:13 [#9]:Вообщем ошибка была из за того что функция Trunc возвращает значение Longint, а его диапазон −2147483648..2147483647 так вот при более FFFFFFF, он выходит за рамки диапазона, в этом случае сделал просто уведомления пользователя об ошибки, и остановки приложения. |  4 апреля 2012, 20:36: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Алгоритмы, преобразования модератором Ерёмин А.А. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |