Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перевод арабских чисел в римские на С.

15K
16 января 2006 года
maxsl
3 / / 16.01.2006
Пожалуйста, подскажите идею как написать данную программу. У меня есть одна мысль, но код получается слишком громоздким для этой программы. Мне кажется здесь нужен какой-то другой подход, попроще.
15K
16 января 2006 года
maxsl
3 / / 16.01.2006
Да, забыл сказать, что можно вводить числа до 2000. А ещё, вот таблица с переводом:
http://www.comp.sibmetal.ru/file/Spravka/a1.htm
15K
17 января 2006 года
Squier
5 / / 10.01.2006
Думаю, что этот код не составит труда переделать в C. Не так сложно как кажется на первый взгляд:
Код:
uses
  Windows,
  SysUtils;

Const
  m='IVXLCDM';

Function ConvR(s:ShortString):Integer;
Var
  i:Integer;
  N:Array[1..7] of Integer;
Begin
Result:=0;
N[1]:=1;
N[2]:=5;
N[3]:=10;
N[4]:=50;
N[5]:=100;
N[6]:=500;
N[7]:=1000;

  For i:=1 To Length(s)-1 Do

    IF Pos(s,m)<Pos(s[i+1],m) Then
      Result:=Result-N[Pos(s,m)]
                                 Else
      Result:=Result+N[Pos(s,m)];

Result:=Result+N[Pos(s[Length(s)],m)];
End;

Function ConvD(n:ShortString):ShortString;
Var
  q,i,j:Integer;
  tmp:String;
Begin
Result:='';
j:=1;

  For i:=Length(n) DownTo 1 Do
    Begin
        IF j>=7 Then Break;
        Case n of
          '1'..'3':Begin
                    tmp:='';
                      For q:=1 To StrToInt(n) Do tmp:=m[j]+tmp;
                    Result:=tmp+Result;
                   End;
          '4':Result:=m[j]+m[j+1]+Result;
          '5'..'8':Begin
                    tmp:=m[j+1];
                      For q:=1 To StrToInt(n)-5 Do tmp:=tmp+m[j];
                    Result:=tmp+Result;
                   End;
          '9':Result:=m[j]+m[j+2]+Result;
        End;
      j:=j+2;
    End;

  IF Length(n)>3 Then
    Begin
      For q:=1 To StrToInt(Copy(n,1,Length(n)-3)) Do
        Result:='M'+Result;
    End;

End;

Var
  nin:ShortString;
  buf:_Input_Record;
  n:Cardinal;
Label Start;
Begin
Start:
WriteLn('Input data{');
Write('Enter value: ');
ReadLn(nin);
WriteLn('}');

  For n:=1 To Length(nin) Do nin[n]:=UpCase(nin[n]);

  For n:=1 To Length(m)-1 Do
    IF Pos(m[n]+m[n]+m[n]+m[n],nin)<>0 Then
      Begin
        WriteLn('ERROR:Incorrect format of input data!!!');
        WriteLn;
        Goto Start;
      End;

WriteLn;
WriteLn('Output data{');
Write('Result: ');

  IF nin[1] in [#48..#58] Then WriteLn(ConvD(nin))
                                         Else WriteLn(ConvR(nin));

WriteLn('}');
WriteLn;
WriteLn('Press ESC for quit or ENTER for continue...');
WriteLn;

  Repeat
    ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE),buf,1,n);
      Case buf.Event.KeyEvent.wVirtualScanCode of
        $01:Break;
        $1C:GoTo Start;
      End;
  Until False;

End.
9.8K
17 января 2006 года
linker3
28 / / 29.11.2005
Цитата:
Originally posted by Squier
Думаю, что этот код не составит труда переделать в C. Не так сложно как кажется на первый взгляд:
Код:
uses
  Windows,
  SysUtils;

Const
  m='IVXLCDM';

Function ConvR(s:ShortString):Integer;
Var
  i:Integer;
  N:Array[1..7] of Integer;
Begin
Result:=0;
N[1]:=1;
N[2]:=5;
N[3]:=10;
N[4]:=50;
N[5]:=100;
N[6]:=500;
N[7]:=1000;

  For i:=1 To Length(s)-1 Do

    IF Pos(s,m)<Pos(s[i+1],m) Then
      Result:=Result-N[Pos(s,m)]
                                 Else
      Result:=Result+N[Pos(s,m)];

Result:=Result+N[Pos(s[Length(s)],m)];
End;

Function ConvD(n:ShortString):ShortString;
Var
  q,i,j:Integer;
  tmp:String;
Begin
Result:='';
j:=1;

  For i:=Length(n) DownTo 1 Do
    Begin
        IF j>=7 Then Break;
        Case n of
          '1'..'3':Begin
                    tmp:='';
                      For q:=1 To StrToInt(n) Do tmp:=m[j]+tmp;
                    Result:=tmp+Result;
                   End;
          '4':Result:=m[j]+m[j+1]+Result;
          '5'..'8':Begin
                    tmp:=m[j+1];
                      For q:=1 To StrToInt(n)-5 Do tmp:=tmp+m[j];
                    Result:=tmp+Result;
                   End;
          '9':Result:=m[j]+m[j+2]+Result;
        End;
      j:=j+2;
    End;

  IF Length(n)>3 Then
    Begin
      For q:=1 To StrToInt(Copy(n,1,Length(n)-3)) Do
        Result:='M'+Result;
    End;

End;

Var
  nin:ShortString;
  buf:_Input_Record;
  n:Cardinal;
Label Start;
Begin
Start:
WriteLn('Input data{');
Write('Enter value: ');
ReadLn(nin);
WriteLn('}');

  For n:=1 To Length(nin) Do nin[n]:=UpCase(nin[n]);

  For n:=1 To Length(m)-1 Do
    IF Pos(m[n]+m[n]+m[n]+m[n],nin)<>0 Then
      Begin
        WriteLn('ERROR:Incorrect format of input data!!!');
        WriteLn;
        Goto Start;
      End;

WriteLn;
WriteLn('Output data{');
Write('Result: ');

  IF nin[1] in [#48..#58] Then WriteLn(ConvD(nin))
                                         Else WriteLn(ConvR(nin));

WriteLn('}');
WriteLn;
WriteLn('Press ESC for quit or ENTER for continue...');
WriteLn;

  Repeat
    ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE),buf,1,n);
      Case buf.Event.KeyEvent.wVirtualScanCode of
        $01:Break;
        $1C:GoTo Start;
      End;
  Until False;

End.


Написано красиво, жаль что не на С, но в переводе, думаю проблем не будет.

15K
18 января 2006 года
maxsl
3 / / 16.01.2006
спасибо за помощь, буду пытаться переводить.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог