Помощь - Поиск - Пользователи - Календарь
Полная версия: Help!строки!
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
SERGSWAT
Текст адания:
Дан текст из заглавных латинских букв, за которыми следует пробел. Определите, является ли этот текст правильной записью римскими цифрами числа от 1 до 999, и если является, то записать его арабскими(в десятичной системе)...вот и все. Уменя есть программа для преобразования римских цифр в арабские, но она работает не корректно, т.е число 4 записывает в виде IIII а не IV. Вот она:


Код
program TranslateRomanToArab;
USES CRT;
const
Trans: array[1..13] of record
Arab: word;
Roman: string;
end = ((Arab: 1000; Roman:'M'), (Arab: 900; Roman: 'CM'),
(Arab: 500; Roman: 'D'), (Arab: 400; Roman: 'CD'),
(Arab: 100; Roman: 'C'), (Arab: 90; Roman: 'XC'),
(Arab: 50; Roman: 'L'), (Arab: 40; Roman: 'XL'),
(Arab: 10; Roman: 'X'), (Arab: 9; Roman: 'IX'),
(Arab: 5; Roman: 'V'), (Arab: 4; Roman: 'IV'),
(Arab: 1; Roman: 'I'));

var
Rchislo: string;
Achislo: longint;
CurNumber: byte;
CurSymbol: string;
CurVal: word;
begin
clrscr;
Write('Input Roman Number: ');
ReadLn(Rchislo);

{ If value in RomanNumber is incorrect, then value of ArabianNumber is }
{ incorrect too }

{--- Translate ---------}
Achislo := 0;
CurNumber := 1;
repeat
CurSymbol := Trans[CurNumber].Roman;
CurVal := Trans[CurNumber].Arab;

while Copy(Rchislo, 1, Length(CurSymbol)) = CurSymbol do
begin
Inc(Achislo, CurVal);
Delete(Rchislo, 1, Length(CurSymbol));
end;

Inc(CurNumber); {smeshenie poryadka na 1}
until Rchislo = '';
{--- End of translate ---------}

WriteLn('Arabian Number: ', Achislo);
READLN;
end.


Как мне сюда вставить условие на проверку является ли введеная строка римским числом или нет!!!
volvo
FAQ: Работа с римскими числами смотрел?

Кроме этого, пользуйся тегами [ code ] и в следующий раз давай более корректное название темы...
SERGSWAT
Народ, вот у меня возникла проблема: вроде бы работающая прога:

program stroka;
USES CRT;
Const
     konst=13 ;
     R: Array[1 .. konst] of String =
        ('I','IV','V','IX','X','XL','L','XC','C','CD','D','CM','M');
     A: Array[1 .. konst] of Integer =
        (1,4,5,9,10,40,50,90,100,400,500,900,1000);
Var
	N, Err,i : Integer;
	vv_stroka: string;
        BigText: string;
{---------- perevod stroki v verhniy registr ---------------}
function Big(vv_stroka: string): string;
begin
		for i:=1 to length(vv_stroka) do
              	begin
                   case vv_stroka[i] of
                        'a'..'z': dec(vv_stroka[i],32);
                        '1'..'0': dec(vv_stroka[i],1);
              	   end;
     	        end;
	 	BigText:=vv_stroka;
end;
{---------opredelenie pravil'nosti zapisi rimskogo chisla----------------}
Function Rchislo(N: Integer): String;
Var
	Result: String;
	i: Integer;
begin
	Result:= '';
	i :=13;        {kolichestvo elementov v massive}
	While N > 0 do
        	begin
			While A[i] > N do Dec(i);
			Result := Result + R[i];
			Dec(N, A[i]);                           		end;
	Rchislo := Result;
end;

{------------ rimskoe chislo to arabskoe chislo ---------------}
Function Achislo(BigText: String): integer;
Var
	Result,i, p: Integer;
        error:string;
begin
        Achislo := -1 ;	
        error:='Dannaya stroka ne yavlaetsya chislom';
	Result := 0;
	i :=13;
	p := 1;
        begin
	     While p <=Length(BigText) do
		begin
			While Copy(BigText, 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 Rchislo(Result) = BigText then Achislo := Result
        end;

end;
{================= osnovnaya programma ======================}
begin
     clrscr;
	write('Vvedite stroku:');   {vvod stroki}
       	readln(vv_stroka);
        Big(vv_stroka);           {preobrazovanie v verxniy registr}
        writeln('Preibrazovannaya stroka:',BigText:5);
        Achislo(BigText);
        writeln('chislo:',Achislo(BigText):7);
        readln;
end.




Как мне вставить вот эту часть проги на разбиение строки на слова в основную часть проги (выше):


 {------------ razbienie stroki na slova ----------------}

Procedure Razbienie(vv_stroka:string);
Var
 i:Integer;
 w:String;

Begin

     If vv_stroka[Length(vv_stroka)]<>' 'Then
     vv_stroka:=vv_stroka+' ';
     W:=' ';
     writeln('VVEDENIE SLOVA:');
     For i:=1 To length(vv_stroka) Do
         begin
          If vv_stroka[i]<>' ' Then w:=w+vv_stroka[i]
             Else
              Begin
                   WriteLn(w);
                   w:=' ' ;
              End;

         End;
READLN;
end;


вот здесь возникает вопрос: Как вывести на экран, что введеная строка не является римским числом!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.