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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2011, 09:42   #1
Черепаwка
 
Регистрация: 14.04.2011
Сообщений: 5
Печаль Числа в формате с плавающей запятой (Pascal)

Постановка задачи: Число в форме с плавающей запятой определяется с помощью двух параметров: p – смещенный порядок в битах; и m – длинны мантиссы в битах. Для заданной битовой последовательности R необходимо получить представление числа в 2-ичной системе счисления в виде:

|Знак m|P r-1|...|P 1 |P 0 |*|m -1 |m -2 |...|m –n |

Примечание: Для упрощения операций над порядками их приводят к целым положительным числам, смещенный порядок. Для этого к истинному порядку добавляется целое положительное число – смещение. Например, в системе со смещением 128 порядок -3 представляется как 125 (-3 + 128). Если для записи числа с плавающей запятой используется база 2(q = 2), то применяют еще один способ повышения точности представления мантиссы, называемый приемом скрытой единицы. Суть его в том, что в нормализованной мантиссе старшая цифра всегда равна единице (для представления нуля используется специальная кодовая комбинация), следовательно, эта цифра может не записываться, а подразумеваться. Запись мантиссы начинают с ее второй цифры, и это позволяет задействовать дополнительный значащий бит для более точного представления числа. В алгоритме предусмотрен анализ ситуации переполнения порядка и отношений: длина битовой последовательности больше или меньше длинны мантиссы.

Например:
Вводим: 75,285
Результат: + 0,75285 * 10^3 (в 8-ную систему)

Из кусочков собрала вот такую программу, хотелось бы знать свои ошибки. Если не трудно, можете подкорректировать ибо я реальный нуб...
Код:
Uses CRT;

const
 a: string[36] = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
 var  rez, s, s2, s3: string;
  t, cc, ind, cc2, k: integer;
 
{процедура для разделения дробной и целой части числа}
procedure Del(var ss: string);
var i: integer;
begin
  ind := 0;  
  s2 := '';
  for i := 1 to length(ss) do  {идём по строке}
    if ss[i] in [',', '.'] then {если символ входит в множество то}
    begin
      ind := i; {запомнили его индекс}
      break
    end
    else    
      s2 := s2 + ss[i]; {пишим в строку по символам целую часть}
  s3 := '';  {
  if ind <> 0 then {если символ из множества [',','.'] есть в строке то}
  begin
    delete(s, 1, ind); {удаляем с первой позиции по ind элементы из строки
    (т.е. целую часть + [',','.'])}
    s3 := ss; {остаток исходной строки заносим в s3 (т.е. дробную часть)}
  end;
end;
 
{функция для перевода дробной части числа из 10-й в любую сс}
function Drob(d: string; t, c: integer): string;
var
  s, l: string;
  l2, m: real;
  i, k: integer;
begin
if pos('E',d)=0 then 
 val(('0.'+d),m,k)
else {иначе}
val(d,m,k); {переводим строку (без добавления "0.") в число}
  s := '';  {инициализируем переменные}
  i := 0;
  if t <> 0 then  {если точность не равна 0 то переводим}
  begin
    repeat
      l2 := m * c;
      m := frac(l2); {умножаем число на c (основание СС) берём целую часть и
      снова умножаем дробную}
      s := s + a[round(int(l2)) + 1]; {ищим в строке элемент на позиции round(int(l2))+1
      (целая часть от умножения числа на c +1)}
      inc(i); {увеличиваем счётчик}
    until i = t;
  end
  else  
   s := '0';
  Drob := s;
end;
 
{функция для проверки может ли быть это число в заданной системе счисления}
Function prov(c:integer;s:string):boolean;
Var
 i,kol,j:integer;
begin
kol:=0; {инициализируем переменную}
for i:=1 to c do {идём по строке а (где с-заданная система счисления)}
begin
 for j:=1 to length(s) do {идём по строке s (заданному числу)}
 if s[j]=a[i] then {если символ нашего числа равен символу из строки а то}
  inc(kol); {увеличиваем счётчик на 1}
end;
if kol=length(s) then {если кол-во символов=длине строки (т.е. все символы в этой СС то) }
 prov:=true 
else  
 prov:=false; 
end;
 
begin
  ClrScr;
  repeat
    write('Из какой будем переводить сс: ');
    readln(cc2);
    write('Введите СС в которую хотите перевести: ');
    readln(cc);
  until (cc2 in [2..36]) and (cc in [2..36]); {проверка ввода}
  repeat
   write('ввод числа в ', cc2, '-й СС: ');
   readln(s);
   Del(s); {разбиваем на дробную и целую части строку}
   if not prov(cc2,s2) and not prov(cc2,s3)  then
    write('Некорректное число.Повторите ')
  until prov(cc2,s2) and prov(cc2,s3);
  if cc2 = 10 then {если перевод из 10 то юзаем функции Cel и Drob}
  begin
    write('Введите точность: ');
    readln(t);
    if (s3='') then 
      rez := Cel(s2, cc)
    else     
      rez := Cel(s2, cc) + ',' + Drob(s3, t, cc);
  end
  else {иначе если перевод не из 10-й СС }
  begin
    if ind = 0 then
      rez := Cel(ToDec(s2, cc2), cc) {переводим сначала из любой в 10-ю сс, а затем из
     10-й в любую}
    else
      rez := Cel(ToDec(s2, cc2), cc) + ',' + drob(drob2(s3, cc2), length(s3), cc); {переводим из любой сс
      в другую }
  end;
  write('Число ',s,'_',cc2,' в ',cc,'-й системе счисления:=',rez); { THE END }
  readkey
end.


Код нужно оформлять по правилам!

Последний раз редактировалось Serge_Bliznykov; 11.05.2011 в 10:02.
Черепаwка вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Числа с плавающей запятой Сtrl Общие вопросы C/C++ 3 06.05.2011 08:10
Задача по информатике с плавающей запятой ruslove Помощь студентам 0 19.04.2011 23:46
число с плавающей запятой. kotopezzz Помощь студентам 1 25.02.2011 13:11
Числа с плавающей запятой Impuls1989 Помощь студентам 0 03.02.2011 21:03
Числа в формате с плавающей запятой (Pascal) Yamkin Помощь студентам 0 12.12.2010 22:19