Насчет строк.
Тонкость состоит в том, что строка, хоть формально и эквивалентна массиву символов, да не совсем. Строку мало объявить, нужно ее еще и в некотором роде инициализировать. Поясню на примере.
Допустим, я хочу получить строку, содержащую все строчные латинские буквы в алфавитном порядке, и вывести эту строку на экран. Так вот, такая программа не пойдет:
Код:
VAR
S:String;
i:Byte;
BEGIN
for i:=1 to 26 do
S[i]:=CHR(i+96);
WriteLn(S);
ReadLn;
END.
То есть ошибки не выдаст, но и ожидаемого результата - тоже.
А зато такая - пожалуйста:
Код:
VAR
S:String;
C:ARRAY[1..26] of Char;
i:Byte;
BEGIN
for i:=1 to 26 do
C[i]:=CHR(i+96);
S:=C;
WriteLn(S);
ReadLn;
END.
Казалось бы, дело в том, что, "не зная" длины строки, транслятор просто не отводит для нее место в памяти. Но дело в том, что даже вариант с объявленной длиной не спасает, т.е. такое решение:
Код:
VAR
S:String[26];
i:Byte;
BEGIN
for i:=1 to 26 do
S[i]:=CHR(i+96);
WriteLn(S);
ReadLn;
END.
тоже оказывается неправильным.
Вот еще пример корректного решения:
Код:
CONST
G:String='Long ago there were three ';
VAR
S:String;
i:Byte;
BEGIN
S:=G;
for i:=1 to 26 do
S[i]:=CHR(i+96);
WriteLn(S);
ReadLn;
END.