Модераторы: 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