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.
Перевод арабских чисел в римские на С.
Пожалуйста, подскажите идею как написать данную программу. У меня есть одна мысль, но код получается слишком громоздким для этой программы. Мне кажется здесь нужен какой-то другой подход, попроще.
Да, забыл сказать, что можно вводить числа до 2000. А ещё, вот таблица с переводом:
Думаю, что этот код не составит труда переделать в C. Не так сложно как кажется на первый взгляд:
Цитата:
Originally posted by Squier
Думаю, что этот код не составит труда переделать в C. Не так сложно как кажется на первый взгляд:
Думаю, что этот код не составит труда переделать в 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.
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.
Написано красиво, жаль что не на С, но в переводе, думаю проблем не будет.
спасибо за помощь, буду пытаться переводить.