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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2015, 21:57   #1
crazyMYXA
Новичок
Джуниор
 
Регистрация: 12.01.2015
Сообщений: 5
По умолчанию Вопросы по программе (Delphi)

Программа для перевода из 10-ой системы счисления в 14-ую и обратно.
Может кто объяснить как работает программа (поподробней если можно)?
Например:
1) Водим число 13 в десятичной системе счисления, что с ним происходит по ходу программы и как получается "D".
2) Водим число "DD", как получается 195.


Код:
program ProjectPerevod;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
  R:string='0123456789ABCD';
  C:array[0..13] of Byte=(0,1,2,3,4,5,6,7,8,9,10,11,12,13);
var
  N,F,J,K,I,P:Integer;
  G:string;
begin
  Write('Vedite osnovanie sistemi = ');
  ReadLn(N);
  if N=10 then
    begin
      Write('Vedite chislo = ');
      ReadLn(F);
      while F>0 do
        begin
          G:=R[F mod 14+1]+G;
          F:=F div 14;
        end;
      Write('V sisteme 14 = ',G);
    end;
  if N=14 then
    begin
      Write('Vedite chislo = ');
      Readln(G);
      F:=0;K:=1;
      for I:=Length(G) downto 1 do
        for J:=0 to 13 do
          if G[I]=R[J+1] then
            begin
              F:=F+C[J]*K;
              K:=K*14;
            end;
      Write('V sisteme 10 = ',F);
    end;
  ReadLn;
end.
crazyMYXA вне форума Ответить с цитированием
Старый 13.01.2015, 08:54   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Может кто объяснить как работает программа (поподробней если можно)?
а что тут объяснять то.
правила перевода из десятичной системы счисления (СС) в любую другую и обратное преобразование выполняются по стандартной схеме, которая не зависит от основания СС. Алгорим расписан буквально в любом школьном букваре по информатике (и не только так).


когда переводим из 10-й СС, то поступаем так:
в цикле:
берём остаток от целочисленного деления числа на основание_новой_СС и записываем остатки справа налево.
теперь число целочисленно делим на основание_новой_СС
выполняем цикл пока число после деления на станет равно нулю.

когда переводим число из НЕДЕСЯТИЧНОЙ СС в десятичную,
то поступаем так:
вычисляем вес каждого разряда справа налево (самый младший == правый разряд) имеет вес равный 1 (это переменная K).
каждый следующий разряд это предыдущий умноженый на основанием системы счисления (K := K * 14)
десятичное число можно получить, если сложить цифры, записанные в каждом из разрядов, умноженные на их вес.
например, берём число DD записанное в 14-ной СС.
K равно 1.
десятичное число в переменной F (для накопления суммы) пока равно нулю.
младший разряд "D" (по таблице это число 13) умножаем на K
получаем
F:=F+C[J]*K ==> F := 0 + 13*1 => F равно 13
теперь вычисляем вес следующего разряда K := K * 14 => K := 1 * 14 => K равно 14
следующия разряд числа, это тоже "D" (по таблице это число 13), умножаем на K
F:=F+C[J]*K ==> F := 13 + 13*14 => 13 + 182 => F равно 195
больше разрядов нет, значит, десятичное число равно 195


Если что-то непонятно - спрашивайте. Только, пожалуйста, поконкретней.


p.s. программа написана не очень оптимально, можно без вложенных циклов обойтись...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.01.2015, 13:42   #3
crazyMYXA
Новичок
Джуниор
 
Регистрация: 12.01.2015
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение

Если что-то непонятно - спрашивайте. Только, пожалуйста, поконкретней.

У меня вопрос по поводу этой строки:
G:=R[F mod 14+1]+G;
Почему мы делим на 15, а не на 14?

Последний раз редактировалось crazyMYXA; 14.01.2015 в 13:44.
crazyMYXA вне форума Ответить с цитированием
Старый 14.01.2015, 13:45   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Делим на 14 и к результату 1
F mod 14+1 <=> (F mod 14)+1
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.01.2015, 19:55   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Аватар, точно объяснил.
ещё поясню, почему добавляем единичку.
Дело в том, что R - это строка:
Цитата:
Код:
const
  R:string='0123456789ABCD';
а символы строки индексируются от единицы.
Поэтому, если мы получили остаток 0 (ноль), нам нужно взять 1-й символ строки R[1] ('0')
Если мы получили остаток 13, нам нужно взять 14-й элемент строки (R[14] = 'D')
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
delphi 7 вопросы anastassia Помощь студентам 3 24.03.2015 16:38
вопросы по delphi Julia21 Помощь студентам 0 24.06.2013 00:23
Automate - вопросы по программе... Demon83ad Софт 1 07.10.2011 17:41
Вопросы по Delphi Dinkall Помощь студентам 1 08.09.2010 19:01
С++ и Delphi. Вопросы UnD)eaD)Snake Общие вопросы C/C++ 3 21.08.2007 20:11