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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2011, 19:38   #1
enternity
Новичок
Джуниор
 
Регистрация: 16.09.2011
Сообщений: 1
По умолчанию перевода целого числа в римскую систему счисления

Разработка программы перевода целого числа в римскую систему счисления и наоборот
Обеспечить перевод чисел в интервале от 1 до 999

Как это сделать? хотя бы дайте толчок и задумку, если не затруднит то можете сделать если она легкая...
enternity вне форума Ответить с цитированием
Старый 17.10.2011, 00:56   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

зря не пользуетесь поиском. такие задачи здесь уже решались.

вот, например (в поиск мне лень идти, проще выложить готовый код!).
вариант 1
Код:
{Источник: "Наука и жизнь" N12 1986  cтр. 95 }
{Алгоритм: В. Птицын г.Москва }
{доработка 30.05.2010 - проверка входного римского числа на ошибочность}
type str2 = string[2];

const
   MaxVariant = 14;
const
   Rims : array[1..MaxVariant] of str2 = ('M','CM','D','CD','C','XC','L','XL','X','IX','V','IV','I',' ');
   Arab : array[1..MaxVariant] of integer = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1, 0);

var
  N, NI, I, J : integer;
  S    : string;

  function Arab2Rim(N : integer) : string;
  var S : string;
      I : integer;
  begin
    S := ''; I:=1;
    while N > 0 do begin
      while Arab[I]<=N do begin
        S := S + Rims[I];
        N := N - Arab[I]
      end;
      I:=I+1
    end;
    Arab2Rim := S
  end;

  function Rim2Arab (S:string) : integer;
  var I, N, Offset : integer;
    s0 : string;
  begin
    I:=1; N := 0; Offset := 0; s0 := S;
    while S<>'' do begin
      while Rims[I] = Copy(S, 1, Length(Rims[I]) ) do begin
        S := Copy( S, 1+Length(Rims[I]), 255);
        Offset := Offset + Length(Rims[I]);
        N := N + Arab[I]
      end;
      I:=I+1;
      if I>MaxVariant then begin
         WriteLn('Ошибка в исходной строке '+s0+' с позиции ',Offset:1);
         Rim2Arab := -1;
         exit
      end;
    end;
    Rim2Arab := N
  end;

begin
  WriteLn('Перевод из арабских цифр в римские. 1999 B_SA');
{  Write('Введите число для преобразования:'); ReadLn(N);}

{  for NI := 26 to 46 do
    WriteLn(NI,' = ',Arab2Rim(NI),' обратно ', Rim2Arab( Arab2Rim(NI) ));
}
  WriteLn(Rim2Arab('XCIXCI'));
end.
вариант 2.
Код:
{Перевод из арабской в римскую систему и наоборот

Алгоритм весьма прост и извлекается непосредственно из исходника.
}

{ Copyright MM Andrew Usachov }

const

  R: array[1..13] of string[2] =
  ('I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M');

  A: array[1..13] of Integer =
  (1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000);

function Roman(N: Integer): string;
var Result: string;
  i: Integer;
begin
  Result := '';
  i := 13;
  while N > 0 do
  begin
    while A[i] > N do Dec(i);
    Result := Result + R[i];
    Dec(N, A[i]);
  end;

  Roman := Result;

end;

function Arabic(S: string): Integer;
var Result: Integer;
  i, p: Integer;
begin
  Arabic := -1;
  Result := 0;
  i := 13;
  p := 1;
  while p <= Length(S) do
  begin
    while Copy(S, p, Length(R[i])) <> R[i] do
    begin
      Dec(i);
      if i = 0 then Exit;
    end;
    Result := Result + A[i];
    p := p + Length(R[i]);
  end;
  if Roman(Result) = S then Arabic := Result
end;

var N, Err: Integer;
  S: string;
begin
  repeat
    ReadLn(S);
    if S = '' then Break;
    Val(S, N, Err);
    if Err = 0 then
      WriteLn(Roman(N))
    else
      WriteLn(Arabic(S));
  until false;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.10.2011, 01:37   #3
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Полчаса искал более короткий код. Вот источник: http://programmersforum.ru/showthread.php?p=365036 (это если не для "сдачи", а так, для дома для семьи).
Код:
Sub MakeRoman() 'преобразует выделенное в документе Word целое число в римское
If Not IsNumeric(Trim(Selection.Text)) Then Exit Sub
ActiveDocument.Fields.Add(Selection.Range, wdFieldEmpty, "= " & Selection.Text & "\*Roman").Unlink
End Sub
Он работает для натуральных чисел до 32767 включительно. Сейчас приложу в контейнере.
Вложения
Тип файла: doc RomanLemon.doc (31.5 Кб, 24 просмотров)

Последний раз редактировалось Sasha_Smirnov; 17.10.2011 в 02:02. Причина: источник.
Sasha_Smirnov вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Римские числа в любую систему счисления phreaker228 Помощь студентам 2 07.06.2011 13:59
Перевод целого числа из 5 в 8 систему счисления и обратно. Whitt Помощь студентам 7 08.09.2010 07:14
Перевод числа в семеричную систему счисления PastoriXx Общие вопросы .NET 5 14.05.2010 12:58
Перевод вещественного числа из 10 в 2 Систему счисления. [С++] Veselyn Помощь студентам 9 17.01.2010 00:39
написал алгоритм перевода чисел из 10 в любую другую систему счисления...компилиться, но не выполняеться STR78 Общие вопросы C/C++ 4 03.11.2008 17:07