Модераторы: Oleg_D, Модераторы
Сравнение строк
Мы уже сравнивали строки на равенство (вспомните проверку пароля). Но строки сравнивают и на больше–меньше — лексикографически. При этом сравниваются слева направо коды символов двух строк в смысле их алфавитного порядка. Если длины строк разные и короткая совпадает с началом длинной, то большей считается длинная строка. Вот примеры:
Writeln (’Borland’ > ’Pascal’); { false, поскольку ’B’ < ’P’ }
Writeln (’ABC’ > ’AB’); {true, поскольку ’ABC’ длиннее ’AB’ }
Writeln (’ABC’ > ’abc’); { false, поскольку ’A’ < ’a’ }
Writeln (’45’ > ’1000’); { true, поскольку ’4’ > ’1’ }
В первом примере код буквы «B» меньше кода буквы «P», поэтому левая строка меньше правой. Во втором случае первые символы совпадают, но левая строка длиннее, а значит больше. В третьем примере левая строка меньше, — тоже в соответствии с таблицей кодировки. Обратите внимание на неожиданный результат сравнения строк, содержащих цифры!
Сравнивая строки, можно отсортировать их в лексикографическом порядке (как если бы они располагались в словаре). К сожалению, такое сравнение работает только для латинских букв, для русских оно не всегда верно, приходится изобретать свою функцию сравнения (в DELPHI этой проблемы нет).
deka47 писал(а):И, ксати, где есть решения задач? Я не смог найти в своем варианте книги.
deka47 писал(а):Я смог решить все, все задачи до 17 главы, но тут застрял, тупо взял и застрял:
Напишите программу, вычисляющую сумму чисел от 1 до N, где N – число, вводимое пользователем.
Я не могу понять как это делать, я уже полтора часа клацаю в паскале.
Vadim писал(а):А Вы подумайте, как бы Вы решили эту задачу без компьютера. Сможете? Если да, то приложить к готовому решению компьютер - пара пустяков.
deka47 писал(а):не могу понять разницы между функцией и процедурой
Oleg_D писал(а):Не знаю, насколько вы сведущи в математике, но функции там широко применяются, например sin(x), cos(x). Функции можно вставлять в формулы, а процедуры - нельзя.
Пример функции: Random(N);
Пример процедуры: Writeln(...);
deka47 писал(а):Сейчас новая загвоздка, продвинулся с 17 на 23 главу, не могу понять разницы между функцией и процедурой.
//Функция, вычисляющая обратное значение передаваемого ей параметра. Она возвращает результат вычисления
Function InverseX(x: integer): float;
Begin
InverseX:=1/x;
End;
//Процедура, которая выводит результат вычисления функции на экран. У самой процедуры возвращаемого значения нет
Procedure PrintResult(x: float);
Begin
WriteLn(x);
End;
//Основная программа
Begin
PrintResult(InverseX(12345));
End.
var S: string;
c: char;
i: integer;
flag: boolean;
begin
Write('S = '); Readln(S);
for c:=Char(33) to Char(255) do begin
flag:=false;
for i:=1 to Length(S) do if c=S[i] then begin
if not flag then Write(c, ' - ');
Write(i,' ');
flag:=true
end;
if flag then Writeln;
end;
end.
if not flag then Write(c, ' - ');
Write(i,' ');
flag:=true
end;
if flag then Writeln;
for i:=1 to Length(S) do if c=S[i] then begin
if not flag then
begin
Write(c, ' - ');
flag:=true
end;
Write(i,' ');
end;
deka47 писал(а):Обьясните что делает этот кусок:
for c:=Char(33) to Char(255) do begin { исследуем весь алфавит }
flag:= false; { признак того, что буквы в строке нет }
for i:=1 to Length(S) do { пробегаем по строке }
if c=S[i] then begin { если буква найдена }
if not flag then Write(c, ' -'); { если это первая находка, то печатаем букву }
Write(i,''); { печатаем индекс }
flag:= true; { признак того, что буква уже найдена }
end;
if flag then Writeln; { если буква в строке была, то завершаем строку }
end;
deka47 писал(а):Спасибо. К сожалению, все равно не дошло. Я не понимаю зачем там not и вот tema написал: "Если фолс, то...", возможно, он имел ввиду: "Если не фолс, то..."?
for c:=Char(33) to Char(255) do begin { исследуем весь алфавит }
flag:= false; { признак того, что буквы в строке нет } - это мы просто изначально предполагаем, что буквы в строке нет и ставим флаг отвечающий за это в значение фолс. Т.е. "утверждение, что буква есть ложно!"
for i:=1 to Length(S) do { пробегаем по строке } - перебираем все символы строки от первого до последнего номер которого совпадает с длиной строки Length(S)
if c=S[i] then begin { если буква найдена } если символ из диапазона (см. выше) от Char(33) до Char(255) найден в строке
if not flag then { если это первая находка, то печатаем букву } букву мы нашли проверяем флаг у нас фолс или нет. Условие выполнится если флаг фолс, ибо not фолс даёт тру.
begin
Write(c, ' -'); итак, если было фолс, то мы печатаем найденную букву
flag:= true; { признак того, что буква уже найдена } и меняем флаг на тру, показывая, что буква таки найдена. Больше это условие и этот блок действий не выполнится и буква не напечатается, пока флаг снова не сменится на фолс
end;
Write(i,''); { печатаем индекс } Тут просто печатаем индекс найденной буквы и если их несколько, то сам символ напечатается только один раз, ибо флаг после первой встречи становится тру, а вот распечатка позиций от флага не зависит, поэтому номера позиций будут распечатаны все.
end;
if flag then Writeln; { если буква в строке была, то завершаем строку } Если мы за нашу программу нашли букву и флаг сменился таки на тру просто переводим каретку на следующую строку
Дальше возвращаемся выше к флагу снова устанавливаем флаг в фолс, предполагая, что следующая буква "c" в строке отсутствует и так далее
end;
Вернуться в Книга "Песни о Паскале"
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1