program lang;
var
inp,out:array[0..67]of char;
f1,f2:text;
nin,nout,t1,t2:string;//names for from and to filrs respectively
n:char;
text:array of char;
begin
while true do
begin
t1:='';
t2:='';
writeln('file with lang to translate from: ');
readln(nin);
writeln('file with lang to translate to: ');
readln(nout);
Assign(f1,nin+'.txt');
reset(f1);
for var i:integer :=0 to 67 do
begin
readln(f1,n);
inp[i]:=n;
end;
close(f1);
Assign(f2,nout+'.txt');
reset(f2);
for var i:integer :=0 to 67 do begin readln(f2,n);out[i]:=n;end;
close(f2);
writeln('text to translate: ');
readln(t1);
Первый вариант:
text:=new char[t1.Length-1];
for var i:integer :=0 to t1.Length-1 do
begin
text[i]:=t1.Substring(i,1).ToCharArray[0];
end;
for var i:integer :=0 to t1.Length-1 do
begin
for var j:integer :=0 to 67 do
begin
if text[i] = inp[j] then
begin
t2:=t2+out[i];
end
else if text[i] = ' ' then
begin
t2:=t2 + ' ';
end;
end;
end;
writeln(t2);
end;
end.
Второй вариант:
for var i:integer :=0 to t1.Length-1 do
begin
for var j:integer :=0 to 67 do
begin
if t1.chars[i] = inp[j] then
begin
t2:=t2+out[i];
end
else if t1.chars[i] = ' ' then
begin
t2:=t2 + ' ';
end;
end;
end;
writeln(t2);
end;
end.
Вы бы исходную задачу привели. Потому что решение средствами полувековой давности. Возможно, это решается значительно проще в PascalАВС.NЕТ. А если нужен именно старый код - Вам не сюда.
В чём суть программы:
Возможно у Вас часто была следующая ситуация: вы набираете какой-то текст, но забываете переключить раскладку, и теперь всё нужно писать заново. Эта программа берёт порядок символов разных языков из текстовых документов, и в соответствии с ним делает текст «нормальным».
Я понимаю, речь о том, что символы просто в строку записаны, любой длины. Не проще сделать две строки в одном файле? Найденный в первой строке символ заменяется тем, который под ним записан во второй строке.
function TR(Self,sOld,sNew:string):string; extensionmethod;
begin
Result:='';
var n:=Min(sOld.Length,sNew.Length);
for var i:=1 to Self.Length do begin
var fnd:=false;
for var j:=1 to n do
if Self[i]=sOld[j] then begin
Result+=sNew[j];
fnd:=true;
break
end;
if not fnd then Result+=Self[i]
end
end;
begin
var s1 := ReadAllText('Файл со старой кодировкой.txt');
var s2 := ReadAllText('Файл с новой кодировкой.txt');
var s := ReadlnString('Что перекодировать?');
s.Tr(s1,s2).Print
end.
У меня многие модули, много напрямую работающие со строками по средствам .SubString и т.п. всегда имеют эту директиву, чтоб не путаться в индексах. И всегда всё работало.
{$string_nullbased+}
begin
// Откуда брать эти строки - ваше дело, как из файла заружать в 1 строку RAlex уже показал
//Внимание: 2 символа ' потому что посреди строки в программе, если сувать в файл - надо 1 копию удалить
var enc1 := 'qwertyuiop[]asdfghjkl;''\zxcvbnm,./';
var enc2 := 'йцукенгшщзхъфывапролджэ\ячсмитьбю.';
ReadString('Строка для перевода:')
.Select(ch->
begin
var ind := enc1.IndexOf(ch);
Result := ind=-1 ? ch : enc2[ind];
end).Print;
end.