if (j div 2)<>(r/2) then j:=j-1;
n:=j div 2;
Эти две строки стоит поменять местами. Чтоб два раза не выполнять вычисления.
Переворачиание в функцию. Чтобы для проверки не повторять код.
Много лишних вычисления при переворотах.
Думаю так будет симпатичнее.
Code
USES crt;
var
str : string;
function Change(iStr : string) : string;
var
i : integer;
strLen : integer;
tmp : char;
begin
strLen := length(iStr);
i:=2;
while i < strLen do begin
tmp := iStr[i-1];
iStr[i-1] := iStr[i];
iStr[i] := tmp;
i := i+2;
end;
Change := iStr;
end;
begin
clrscr;
str:='I want to write good programs';
writeln(str);
str := Change(str);
writeln(str);
str := Change(str);
writeln(str);
readkey;
end.
Длинна строки вычисляется в данном коде два раза - это для чистоты, чтоб функция была "полноценной"
Под рукой компилятора нет - воспользловался онлайн http://ideone.com
Вот результат работы предыдущего автора http://ideone.com/5Gb92
вот результат моего кода: http://ideone.com/cceMU
То, что начинаем с индекса 2 плюс ограничение цикла длинной дает нам условие, что обрабатываются только пары.
Замена for на while дает возможность применять шаг 2