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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2017, 21:36   #1
Richards
Пользователь
 
Регистрация: 04.05.2017
Сообщений: 10
По умолчанию Сложение, вычитание, умножение, деление используя СС

Я надеюсь это у меня последний вопрос по системе счисления, короче перейдем к вопросу. Вопрос таков как можно складывать, вычитать, умножать и делить используя систему счисления. Программа у меня переводит в другие системы но не складывает, вычитает и т. п. так как нужно. Вот пример сложения в двоичной СС:
Как должен вычитать:
110111+10001=1001000
Как вычитает у меня программа:
110111+10001=120112
Вот исходник:
Calc.7z
Richards вне форума Ответить с цитированием
Старый 07.05.2017, 08:09   #2
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Код:
function SlozhenieChisel(chislo1, chislo2: string): string;
var i, dlina: integer;
    p: array of byte;
begin
   dlina:=Length(chislo1);
   If Length(chislo2)>dlina then
      dlina:=Length(chislo2)+1 else
      dlina:=dlina+1;
   While Length(chislo1)<dlina do
      Insert('0', chislo1, 1);
   While Length(chislo2)<dlina do
      Insert('0', chislo2, 1);
   SetLength(p, dlina);
   Result:='';
   For i:=0 to dlina-1 do
      p[i]:=0;
   For i:=dlina downto 2 do
   begin
      p[i-1]:=p[i-1]+StrToInt(chislo1[i])+StrToInt(chislo2[i]);
      If p[i-1]>=2 then
      begin
         p[i-2]:=p[i-1] div 2;
         p[i-1]:=p[i-1] mod 2;
      end;
   end;
   For i:=0 to dlina-1 do
      Result:=Result+IntToStr(p[i]);
   While (Result<>'') and (Result[1]='0') do
      Delete(Result, 1, 1);
end;

var s1,s2,s:string;
begin
   s1:='110111';
   s2:='10001';
   s:=SlozhenieChisel(s1,s2);
   Writeln(s);
   Readln;
end.

Образец: http://newerow1989.narod.ru/publ/slo...hisel/1-1-0-27
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 07.05.2017, 09:16   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Richards Посмотреть сообщение
Вот пример сложения в двоичной СС:
Как должен вычитать:
110111+10001=1001000
я же уже говорил Вам - не заморачивайтесь - СС должна влиять только (ИСКЛЮЧИТЕЛЬНО) на ввод и вывод чисел.
ввели число - программа сразу преобразовала его из нужной СС в десятичную.
ввели второе число - программа сразу преобразовала его из нужной СС в десятичную.
выбрали действие - программа выполнила сложение (вычитание, умножение, деление) и полученный результат перевела в нужную СС.

т.е. фактически, где у Вас стоит X := StrToInt(Edit1.Text); (если у Вас strtofloat - то замените его)
меняйте на
Код:
X:= ConvertToDecimal( Edit1.Text, BaseSS);
а где у Вас
Edit1.Text := IntToStr(X);
меняете на
Код:
Edit1.Text := ConvertToSS(X, BaseSS);
т.е. программа внутри будет оперировать привычными десятичными значениями.
Никаких "костылей" для вычислений в двоичном, восьмеричном и шестнадцатеричном виде не понадобится.

Теперь идея понятна?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.05.2017, 15:29   #4
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Перевод чисел из одних систем счисления в другие можно узнать здесь.

ConvertToSS на Delphi отсутствует.
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]

Последний раз редактировалось newerow1989; 07.05.2017 в 15:31.
newerow1989 вне форума Ответить с цитированием
Старый 07.05.2017, 18:44   #5
Richards
Пользователь
 
Регистрация: 04.05.2017
Сообщений: 10
По умолчанию

Так я до сих пор туплю, на сколько я понял вы хотите чтоб я вычитал по такому алгоритму:
1. Перевести числа в десятичную систему счисления
2. Выполнить действие
3. Перевести результат обратно в исходную систему счисления
Но мне нужно чтоб так же функционировал как "Калькулятор Windows"
Вложение 87853
Вот функция, может её можно как то поправить?
Код:
function CharToInt(Ch:char):integer;
begin 
  case Ch of
    '0'..'9': Result:= Ord(Ch) - Ord('0');
    'A'..'F': Result:= Ord(Ch) - Ord('A') + 10;
     else Result:= 0;
  end;
end;
function IntToChar(N:integer):char;
begin
  case N of
    0..9   : Result:= char(Ord('0') + N);
    10..15 : Result:= char(Ord('A') + N - 10);
    else Result:= '0';
  end;
end;
function StringToInt(const S:string; Radix:integer):integer;
var i:integer; 
begin
  Result:= 0;
  for i:= 1 to Length(S) do
    Result:= Result*Radix + CharToInt(S[i]);
end;

function IntToString(N,Radix:integer):string;
begin 
  while N > 0 do begin
    Result:= IntToChar(N mod Radix) + Result;
    N:= N div Radix;
  end;
end;
procedure TForm1.RadioGroup1Click(Sender: TObject);
var N:integer;
begin
  N:= StringToInt(pnlVisor.Caption,Radix);
  case RadioGroup1.ItemIndex of
    0: Radix:= 2;
    1: Radix:= 8;
    2: Radix:= 10;
    3: Radix:= 16;
  end;
Richards вне форума Ответить с цитированием
Старый 07.05.2017, 18:46   #6
Richards
Пользователь
 
Регистрация: 04.05.2017
Сообщений: 10
По умолчанию

Мне не нужно чтоб он вычислял длинные числа, мне нужно чтоб он мог использовать любые арифметические действия с выбранным СС (в моем случае 2, 8, 10, 16 СС)
Richards вне форума Ответить с цитированием
Старый 08.05.2017, 11:09   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Richards Посмотреть сообщение
мне нужно чтоб он мог использовать любые арифметические действия с выбранным СС
Вот скажите, Вы не читаете, то, что я Вам пишу?
или просто не можете понять смысл того, что я предлагаю?

вот, конкретно, тут что непонятного?

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
я же уже говорил Вам - не заморачивайтесь - СС должна влиять только (ИСКЛЮЧИТЕЛЬНО) на ввод и вывод чисел.
ввели число - программа сразу преобразовала его из нужной СС в десятичную.
ввели второе число - программа сразу преобразовала его из нужной СС в десятичную.
выбрали действие - программа выполнила сложение (вычитание, умножение, деление) и полученный результат перевела в нужную СС.

т.е. фактически, где у Вас стоит X := StrToInt(Edit1.Text); (если у Вас strtofloat - то замените его)
меняйте на

Код:

X:= ConvertToDecimal( Edit1.Text, BaseSS);


а где у Вас
Edit1.Text := IntToStr(X);
меняете на
Код:

Edit1.Text := ConvertToSS(X, BaseSS);


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

Теперь идея понятна?

ладно.
видимо, не дано мне донести свои мысли до Вас.
берите готовый код:
Unit1_pas.rar
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.05.2017, 19:45   #8
Richards
Пользователь
 
Регистрация: 04.05.2017
Сообщений: 10
По умолчанию

Можно последний вопрос, ваш Unit конечно рабочий (и спасибо вам за это) но там появился один минус , калькулятор не выводит отрицательные числа и нули при сложении или вычитании, это можно как то исправить?
Richards вне форума Ответить с цитированием
Старый 09.05.2017, 22:29   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Richards Посмотреть сообщение
калькулятор не выводит отрицательные числа и нули при сложении или вычитании
ну, строго говоря, для представления отрицательных чисел в двоичном (восьмеричном и т.д.) коде не всё так просто и очевидно.
откройте виндузовый калькулятор, перейдите в режим "Программист" и введите любое отрицательное число. А потом переключите в другую СС.
думаю, что будете немного удивлены.

Но, если не брать во внимание представление отрицательных чисел
и Вас устроит просто знак "-" в начале, то предлагаю такую модификацию:

Код:
function StringToInt(const S: string; Radix: integer): integer;
var i: integer; //преобразуем цифровую строку S в число
   neg : boolean;
begin
  Result := 0;
  neg := false;
  if (Length(S)>0) and (S[1]='-') then neg := true;
  for i := 1 to Length(S) do
    Result := Result * Radix + CharToInt(S[i]);
  if neg then Result := -Result;
   
end;

function IntToString(N, Radix: integer): string;
var neg : boolean;
begin //преобразуем число N в строку цифр
  neg:= N<0;
  N := abs(N);
  while abs(N) > 0 do begin
    Result := IntToChar(N mod Radix) + Result;
    N := N div Radix;
  end;
  if neg then Result := '-'+Result;
end;

Последний раз редактировалось Serge_Bliznykov; 09.05.2017 в 22:32.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.05.2017, 23:15   #10
Richards
Пользователь
 
Регистрация: 04.05.2017
Сообщений: 10
По умолчанию

Спасибо, вам, за помощь!)
Richards вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложение, вычитание, умножение полиномов _Лето_ Общие вопросы C/C++ 0 08.12.2013 01:25
Написать программу, выполняющую по выбору сложение, вычитание, умножение или деление нацело двух многоразрядных чисел. dmitriy20104 Паскаль, Turbo Pascal, PascalABC.NET 1 20.08.2012 19:12
Уважаемые программисты, отзовитесь. (С++) Арифметические действия для комплексных чисел (сложение, вычитание, умножение и деление) Meurtre Помощь студентам 4 19.12.2011 01:15
ВЫчитание, умножение и деление массивов на С++ Flood Помощь студентам 2 15.05.2010 16:54
Сложение, вычитание, деление, умножение в Turbo Debugger GaJIbI4 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 08.03.2010 15:23