Помощь - Поиск - Пользователи - Календарь
Полная версия: задача:перевод чисел
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Kubus
в общем есть у меня курсавая. Задача написать программку перевода чисел из разных систем счисления в другие(с основаниями от 2 до 16) с дробной частью. Задача не новая да и не особо сложноя. Сделал я ее и понес к преподу. Там-то и выяснилось, что сделана она через одно местно, так как программка переводит отдельно дробную, отдельно целую часть, а это неправильно. Так вот может кто-нибудь возьмется помочь и отредактирует так, как надо? или мож у кого готовая есть? а то мне сдавать в понедельник, а у самого завал с мейплом, не успеваю. Буду очень, очень благодарен.

вот исходный текст:

 Program Radix1;
uses crt;
var
      ch : char;
      continue : boolean;
      radix,i : integer;
      number : real;
      int,decimal : integer;
function enter_radix : integer;
begin
      repeat
             clrscr;
             writeln('Input radix  ');
             readln(radix);
      until (radix>=2) and (radix<=16);
enter_radix:= radix;
end;

function get_val(c:char) : integer;
begin
      if (c>='0') and (c<='9')
      then get_val := ord(c) - ord('0')
      else if (c>='a') and (c<='f')
      then get_val:= ord(c)-ord('a')+10
      else if(c>='A') and (c<='F')
      then get_val:= ord(c)-ord('A')+10
      else
      get_val:= - 10000;
end;

function in_radix(radix: integer; c: char): boolean;
Var
      x : integer;
Begin
      x:= get_val(c);
      if(radix<=abs(x)) then in_radix:= false
      else in_radix:= true;
end;

function get_char(x : integer) : char;
begin
      if(x<10)then get_char:= chr(x+ord('0'))
      else get_char:= chr(x-10+ord('A'));
end;

function enter_digit(radix : integer; Var int, decimal : integer) : boolean;
Var   str : string[21];
      z : char;
      i,l : integer;
      dot_flag : boolean;
begin
dot_flag:= false;
int:= 0;
decimal:= 0;
writeln('Input number with radix = ',radix);
readln(str);
l:=length(str);
writeln(int);
      for i:= 1 to l do
             begin
                    if(str[i]='.' ) then
                           begin
                                  if dot_flag then
                                         begin
                                         enter_digit:=false;
                                         exit;
                                         end
                                  else
                           dot_flag:= true;
                           end
                    else if in_radix (radix, str[i]) then
                    begin
                           if dot_flag then
                                  begin
                                  decimal:= decimal*radix+get_val(str[i]);
                                  end
                           else
                           begin
                           int:= int*radix+get_val(str[i]);
                           end;
                    end
                    else
                    begin
                    enter_digit:= false;
                    exit;
                    end;
               end;
               enter_digit:= true;
end;

procedure print_number(radix : integer; num : integer);
Var   c : char;
      i,j : integer;
      out : string[20];
      q,r : integer;
begin
      for i:=1 to 20 do out[i]:=' ';
             repeat
             q:=num div radix;
             r:=num mod radix;
             c:= get_char(r);
             out[i]:= c;
             i:= i-1;
             num:= q;
             until num = 0;
      i:= 1;
      while(out[i]=' ') do i:=i+1;
             for j:= i to 20 do write  (out[j]);
end;

procedure startup_init;
Var
      i,j : integer;
      c : char;
begin
textmode (co80);
clrscr;
textcolor(0);
textbackground(10);
clrscr;
gotoxy (11,19);
      for i:=11 to 70 do write (#219);
             for i:=7 to 19 do
                    begin
                    gotoxy(71,i);
                    writeln(#219);
                    END;
             window (10,6,70,17);
             textbackground(blue);
             textcolor(0);
             clrscr;
             window(10,6,70,21);
             write(#218);
                    for i:=11 to 69 do write (#196);
                    write(#191);
                           for i:=2 to 12 do
                                  begin
                                  gotoxy(1,i);
                                  write(#179);
                                  gotoxy (61,i);
                                  write(#179);
                                  end;
                           write(#192);
                           gotoxy(2,13);
                                  for i:=11 to 69 do write (#196);
                                  write(#217);
                                  window(12,7,68,12);
                                  textcolor(lightgreen);
end;

begin
startup_init;
ch:='r';
while ch='r' do
      begin
      radix:=enter_radix;
             repeat
             clrscr;
             continue:=enter_digit(radix,int,decimal);

             until continue;
      radix:=enter_radix;
      clrscr;
      writeln('Nuber in radix = ',radix);
      print_number(radix,int);
             if(decimal<>0) then
                    begin
                    write('.');
                    print_number(radix,decimal);
                    end;
             gotoxy(1,4);

             writeln('Press r to repeat');
             writeln('and other kay to exit');
             ch:=readkey;
      end;
end.

volvo
Цитата
программка переводит отдельно дробную, отдельно целую часть, а это неправильно.
Надо полагать, твой преподаватель придумал новый алгоритм перевода дробных чисел? Ну, тогда пускай он поделится, и расскажет, каким образом ВМЕСТЕ переводить и целую и дробную часть... А мы поможем это запрограммировать...
Kubus
я, наверное, неправильно выразился. То, что у меня есть берет целую часть и переводит и берет дробную часть и точно так же, как и целую ее переводит. А это, походу, неправильно Целая и дробная часть не равноправны.....) И еще она что-то про точность говорила. Хоть чуть-чуть стало понятнее?

Вообще-то эту программу писал не я, а сам я с паскалем особо не знаком. Поэтому получив текст неделю назад я сел, намутил четыре учебника по паскалю и стал построчно "переводить", а то надо же знать, что вообще сдаешь и как оно работает, да и вообще интересно..........)
чуток в ней исправил\добавил, а то там графика убогая была

так вот посидев ночь сегодня намутил вот такую штуку
Код

uses crt;

const
    value     = 0.1875; { число, которое будем переводить }
    base      = 2;         { в какую систему переводим }
    precision = 5;        { точность }

var
    ivalue, nbase, digit, k : integer;
    fvalue, eps             : real;
    sym                     : char;

begin
    ivalue := trunc(value);
    fvalue := value - ivalue;

    nbase := 1;
    while (ivalue >= nbase) do nbase := nbase * base;
    while (nbase > 1) do begin
        nbase := nbase div base;
        digit := ivalue div nbase;
        ivalue := ivalue - digit * nbase;
        if (digit < 10) then sym := chr(48+digit)
                        else sym := chr(55+digit);
        write(sym);
    end;

    write('.');
    eps := 1;
    for k := 1 to precision do eps := eps * base;

    for k := 1 to precision do begin
        digit := trunc(fvalue * base);
        fvalue := fvalue * base - digit;
        if (digit < 10) then sym := chr(48+digit)
                        else sym := chr(55+digit);
        write(sym);
        if (fvalue < 1/eps) then break;
    end;

    writeln;
    readkey;
end.


....вот по этой ссылке http://forum.pascal.net.ru/index.php?showt...993&#entry46993
Только проблема в том, что я не особо понимаю, что там написано. Построчно перевести не получилось.....)

прикинул, что из моей программы нужно выкинуть, а что вставить. Например задаем новую переменную precision и вводим ее с клавиатуры. Переменная base у меня уже есть, только называется она radix. Переменная value - это, я так понимаю, str (хотя я могу ошибаться....). Далее invalue & fvalue - int & decimal соответственно.
Kubus
подскажите, пожалуйста, что нужно изменить, чтоб этот кусочек счетал не из десятичной в двоичную, а из любой в любую?
Гость
Цитата(Kubus @ 25.12.2005 22:44) *

подскажите, пожалуйста, что нужно изменить, чтоб этот кусочек счетал не из десятичной в двоичную, а из любой в любую?

Код
(*
Function Dec2Hex (num: Word): String;  { перевод из 10-ичной в 16-ичную }
Function Dec2Bin (num: word): String;  { перевод из 10-ичной в 2-ичную }
Function Hex2Dec (hs:string): longint; { перевод из 16-ичной в 10-ичную }
Function Bin2Dec (S: String): longint; { перевод из 2-ичной в 10-ичную }
*)

Function Dec2Hex (num: Word): String;
var result: string;
    remainder: word;
    c: char;
begin
     result := '';
     while num <> 0 do
     begin
          remainder := num mod 16;
          num := num div 16; { или  num := num shr 4 }
          if remainder < 10 then
             c := chr (remainder + ord ('0'))
          else
             c := chr (remainder + ord ('A') - 10);
          result := c + result;
     end;
     Dec2Hex := '$' + result
end;

Function Dec2Bin (num: word): String;
var result: string;
    remainder: word;
    c: char;
begin
     result := '';
     while num <> 0 do
     begin
          remainder := num mod 2;
          num := num div 2; { или num := num shr 1 }
          c := chr (remainder + ord ('0'));
          result := c + result;
     end;
     Dec2Bin := result
end;

Function Hex2Dec (hs:string): longint;
var
  res,k: longint;
  r,i: word;
  c: char;
begin
       res := 0;
       k := 1;
       for i := length (hs) downto 1 do
       begin
            c := UpCase (hs[i]);
            case c of
            'A'..'F': r := ord(c) - (ord('A') - 10);    { ord (c) - 55 }
            '0'..'9': r := ord(c) - ord('0');           { ord (c) - 48 }
            else break
            end;
            inc (res, r * k); { res := res + r * k}
            k := k * 16; { или k := k shl 4 }
       end;
       Hex2Dec := res;
end;

Function Bin2Dec (S: String): longint;
var
  i, bit: word;
  p, result: longint;
Begin
       result := 0;
       p := 1;
       for i := length (S) downto 1 do
       begin
            bit := ord (S[i]) - ord ('0');
            inc (result, bit * p);
            p := p * 2;                    { или   p := p shl 1 }
       end;
       Bin2dec:=result;
End;

begin
     writeln (dec2bin (2004));
     writeln (dec2hex (2004));
     writeln (hex2dec ('fff0'));
     writeln (bin2dec ('11111010100'))
end.


Может это приблизит тебя к истине wink.gif !
-Kosinus-
Здесь возможно не всё, но мало ли!
volvo
Гость, а ты ссылку видел, которую автор привел? Там есть все те же функции, плюс еще работа с четверичными числами... Так зачем копировать код с Сурсов? Тем более, что этот код работает только с НЕдробными числами...
Kubus
так что? никто помочь не может?(
volvo
Да пойми наконец, нельзя переводить числа НЕ через 10-ю систему счисления... Переводишь в 10, оттуда - в другую... Всё. Что тебе непонятно как делается?
Kubus
а моя программа переводит сначала в 10, потом в нужную?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.