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

> операции над сист счисления
сообщение
Сообщение #1


Новичок
*

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

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


mega_chok.gif good.gif yes2.gif mega_chok.gif есть отличный программный код для умножения и сложения двух чисел в разл системах(целых через строковый тип) помогите реализовать такие же функции для вычитания и деления(это самое главное!))), ещё желательно чтобы все функции решали задачи и для вещественных чисел, сдавать через неделю( unsure.gif unsure.gif unsure.gif вот код:
Code:

// Модуль для работы с натуральными числами в различных системах исчисления

// Далее, если говорится, что Система Исчисления (СИ) задается строкой (CharSet)

// то имеется в виду, что эта строка содержит символы требуемой СИ, начиная с нуля

// Примеры CharSet (стандартный вид)

// Двоичная - '01'

// Восьмиричная - '01234567'

// Десятичная - '0123456789'

// Шестнадцатиричная - '0123456789ABCDEF'

// Можно использовать и нестандартные виды, например для двоичной 'ab', а для

// троичной 'abc' - данному модулю все равно.



// "-Ричность" СИ ограничена только наличием доступных различных символов.

// Работа с числами в определенной СИ производится как со строками, потому величина

// чисел значения почти не имеет, но это отрицательно сказывается на времени работы

// функций (особенно на умножении).

unit MyUnit;



interface



function Convert(Num, SetIn, SetOut: String): String;

function MySum (Num1, Num2, CharSet: String): String;

function MyMulti (Num1, Num2, CharSet: String): String;

function MyOrd(A: Char; CharSet: String): Integer;

function MyChr(Num: Integer; CharSet: String): Char;



implementation



// Функция возвращает позицию символа A в строке CharSet (начиная с 0)

function MyOrd(A: Char; CharSet: String): Integer;

var

i: Integer;

begin

Result := 0;

for i := 1 to Length(CharSet) do

begin

if CharSet[i] = A then begin

Result := i-1;

exit;

end

end;

end;



// Функция возвращает символ из строки CharSet по номеру Num (~CharSet[Num+1])

function MyChr(Num: Integer; CharSet: String): Char;

begin
Result := CharSet[Num mod Length(CharSet) + 1];
end;

// Функция возвращает число без ведущих нулей, то есть ShortNum('0000123')='123'
function ShortNum(Num, CharSet: String): String;
var
k, j: Integer;
begin
Result := '';
k := 1;
while Num[k] = MyChr(0, CharSet) do
k := k + 1;
for j := k to Length(Num) do Result := Result + Num[j];
end;

// Функция выполняет сложение двух чисел Num1 и Num2 в СИ, задаваемой CharSet
function MySum (Num1, Num2, CharSet: String): String;
var
i, Pos, Add, L, L_CharSet: Integer;
N1 , N2 , O, Res: String;
begin
// Далее потребуется что бы первое число по длине было не менее второго,
// если не так, то меняем местами
if Length(Num1)>=Length(Num2) then
begin
N1 := Num1;
N2 := Num2;
end
else
begin
N1 := Num2;
N2 := Num1;
end;
L:= Length(N1);
L_CharSet := Length(CharSet);
O:=MyChr(0, CharSet); // 0 - в СИ, определяемой CharSet
//Уравнняем второе до длины первого нулями справа: 10 = 010
for i := Length(N2) to L-1 do
N2 := O + N2;
Add:=0;
//Суммирование с младших разрядов, Add - добавка от предыдущих разрядов
// для следующего. Напр. для 10-чной СИ: 9+7 - Add = 1, 4+5 - Add=0
for i := L downto 1 do
begin
Pos := MyOrd(N1[i], CharSet)+MyOrd(N2[i], CharSet) + Add;
Add := 0;
while Pos >= L_CharSet do
begin
Pos := Pos mod L_CharSet;
Add := Add + 1;
end;
Res := MyChr(Pos, CharSet) + Res;
end;
If Add<>0
then Result := MyChr(Add, CharSet) + Res
else Result := Res;
end;
// Функция выполняет умножение двух чисел Num1 и Num2 в СИ, задаваемой CharSet
function MyMulti (Num1, Num2, CharSet: String): String;
var
i, e, Res, N1, N2: String;
begin
N1 := ShortNum(Num1, CharSet);
N2 := ShortNum(Num2, CharSet);
i :='';
Res := '';
//e - единица СИ, определяемая CharSet
e := MyChr(1,CharSet);
//Умножение Num1 на Num2 - это Num1 сложеное Num2 раз в СИ, определяемой CharSet
while (i <> N2) do
begin
Res := MySum(Res, N1, CharSet);
i := MySum(i, e, CharSet);
end;
Result := Res;
end;

// Функция выполняет преобразование одноразрядного числа A, заданного
// в СИ, определяемой SetIn, в число в СИ, определяемой SetOut

function f0(A: Char; SetIn, SetOut: String): String;

var
Pos, j, L: Integer;
Res: String;
begin
L := Length(SetOut);
Pos := MyOrd(A, SetIn);
for j := 1 To Pos div (L-1) do
Res := MySum(Res, MyChr(L-1, SetOut), SetOut);
Result := MySum(Res, MyChr(Pos mod (L-1), SetOut), SetOut);
end;
// Функция выполняет преобразование числа Num, заданного
// в СИ, определяемой SetIn, в число в СИ, определяемой SetOut
function Convert(Num, SetIn, SetOut: String): String;
var
Base, Multiplier, N, Res: String;
i: Integer;
begin
// Num = MultilplierN * Base^N + ... + Multiplier0 * Base^0
// Base - основание СИ, это всегда <последний символ CharSet>+<нулевой символ> ~ 10
// MultiplierI - множитель при соответствующей степени
// Напр. для 10-чной СИ - 123 = 1 * 10^2 + 2 * 10^1 + 3 * 10^0
// Тут Base = 10, Multiplier = {1, 2, 3}
Base := MySum(f0(MyChr(Length(SetIn)-1, SetIn), SetIn, SetOut), MyChr(1, SetOut), SetOut);
N := MyChr(1, SetOut); // = Base^0, потом будем домножать на Base (в соотв. СИ)
Res := '';

// Обрабатываем входящее число с хвоста
for i := Length(Num) downto 1 do
begin
Multiplier := f0(Num[i], SetIn, SetOut);
Res := MySum(Res, MyMulti(Multiplier, N, SetOut), SetOut);
N := MyMulti(Base, N, SetOut);
end;
Result := Res;
end;
end.

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


Новичок
*

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

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


ого!, здо'рово! попытаюсь разобраться, вот хотел ещё узнать при конвертации если количество знаков в дробной части увеличивается часть из них может перейти в целую часть числа? зависит ли положение запятой от того в большую сс переводишь число или в меньшую? я кстати сделал уголок, но вот запятая всё косячит norespect.gif
не знаю пока, если пойму возьмусь за твою идею)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(AlexSt @ 21.12.2007 12:32) *

хотел ещё узнать при конвертации если количество знаков в дробной части увеличивается часть из них может перейти в целую часть числа?

Дробная часть меньше единицы, целая - больше. Они живут отдельно, независимо. Нет, знаки не могут "переходить".

Я тут на досуге накорябал все четыре действия над вещественными числами smile.gif. Любая длина (до 32К), любое основание (до 32К), со знаками. Теперь сделать конвертацию займет не более 15 минут.. Если хочешь - могу показать.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

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


Цитата(Lapp @ 23.12.2007 3:16) *

Дробная часть меньше единицы, целая - больше. Они живут отдельно, независимо. Нет, знаки не могут "переходить".

Я тут на досуге накорябал все четыре действия над вещественными числами smile.gif. Любая длина (до 32К), любое основание (до 32К), со знаками. Теперь сделать конвертацию займет не более 15 минут.. Если хочешь - могу показать.

1. Что знечит "любое основание"? Или числа хранятся в виде текста?
2. 15 минут на конвертацию числа - это сильно даже для IBM PC с ее 4.77. МГц. smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
AlexSt   операции над сист счисления   6.12.2007 1:35
Lapp   AlexSt, пожалуйста, не дублируй темы. Два дубля э…   6.12.2007 7:06
AlexSt   помогите модернизировать алгоритм конвертации чисе…   14.12.2007 14:51
AlexSt   что, никто не может объяснить даже на словах как з…   15.12.2007 3:38
Lapp   Послушай, AlexSt, а сам-то ты что-нибудь сделал?..…   15.12.2007 14:04
AlexSt   в проге я разобрался, сам сделал вычитание, хочу щ…   15.12.2007 15:19
Lapp   в проге я разобрался, сам сделал вычитание, хочу …   15.12.2007 18:50
AlexSt   ок, только что весьма надёжно получилось сделать у…   16.12.2007 1:24
AlexSt   и ещё там есть ф-ция преконверт, гре я пытался сде…   16.12.2007 14:13
AlexSt   и ещё, под каким номером находится shift и space, …   16.12.2007 18:13
andriano   Пробел - #20, у Shift кода нет - это клавиша-модиф…   16.12.2007 18:44
AlexSt   спасибо за подсказочку :4: , сегодня за целый день…   17.12.2007 1:26
Lapp   наваял код по конвертированию в др сс с дробной ча…   18.12.2007 13:06
AlexSt   а какие ещё есть варианты кроме как "разделит…   19.12.2007 1:25
Lapp   а какие ещё есть варианты кроме как "раздели…   19.12.2007 12:48
Гость   спасибо, наверно так и сделаю, деление только как.…   19.12.2007 15:16
Lapp   спасибо, наверно так и сделаю, деление только как…   19.12.2007 15:42
AlexSt   ))) если есть алгоритм или знаешь где есть отпишис…   19.12.2007 23:02
AlexSt   кстати, к свелению у меня прога на делфы... я дума…   19.12.2007 23:44
Lapp   к свелению у меня прога на делфы...Не знаю, к како…   21.12.2007 12:25
AlexSt   ого!, здо'рово! попытаюсь разобраться,…   21.12.2007 16:32
Lapp   хотел ещё узнать при конвертации если количество …   23.12.2007 7:16
andriano   Дробная часть меньше единицы, целая - больше. Он…   23.12.2007 16:13
Lapp   1. Что знечит "любое основание"? Или чис…   23.12.2007 19:40
AlexSt   lapp, если не трудно, выложи :good: я вот конверта…   25.12.2007 12:39
Lapp   Выкладываю. Предупреждаю: 1. решение не оптимиз…   25.12.2007 19:58


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

 





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