IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> задача:перевод чисел, прошу помощи в доработке
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


в общем есть у меня курсавая. Задача написать программку перевода чисел из разных систем счисления в другие(с основаниями от 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© - ord('0')
else if (c>='a') and (c<='f')
then get_val:= ord©-ord('a')+10
else if(c>='A') and (c<='F')
then get_val:= ord©-ord('A')+10
else
get_val:= - 10000;
end;

function in_radix(radix: integer; c: char): boolean;
Var
x : integer;
Begin
x:= get_val©;
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®;
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.



Сообщение отредактировано: Kubus -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
программка переводит отдельно дробную, отдельно целую часть, а это неправильно.
Надо полагать, твой преподаватель придумал новый алгоритм перевода дробных чисел? Ну, тогда пускай он поделится, и расскажет, каким образом ВМЕСТЕ переводить и целую и дробную часть... А мы поможем это запрограммировать...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


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

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

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

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 соответственно.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


подскажите, пожалуйста, что нужно изменить, чтоб этот кусочек счетал не из десятичной в двоичную, а из любой в любую?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата(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 !
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Здесь возможно не всё, но мало ли!
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Гость, а ты ссылку видел, которую автор привел? Там есть все те же функции, плюс еще работа с четверичными числами... Так зачем копировать код с Сурсов? Тем более, что этот код работает только с НЕдробными числами...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


так что? никто помочь не может?(
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Да пойми наконец, нельзя переводить числа НЕ через 10-ю систему счисления... Переводишь в 10, оттуда - в другую... Всё. Что тебе непонятно как делается?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


а моя программа переводит сначала в 10, потом в нужную?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.12.2024 20:27
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name