Разбор примеров из книги

Книга адресована школьникам средних и старших классов, желающим испытать себя в «олимпийских схватках». Может быть полезна студентам-первокурсникам и преподавателям информатики.

Модераторы: Oleg_D, Модераторы

Re: Разбор примеров из книги

Сообщение Oleg_D » 30.09.2012 13:07:51

Согласен, добавлю и поясню.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Разбор примеров из книги

Сообщение bormant » 01.10.2012 11:48:13

... а заодно можно упомянуть, что такой порядок называется лексикографическим.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Разбор примеров из книги

Сообщение Oleg_D » 01.10.2012 14:04:43

В данный момент дополнил этот параграф так:
Код: Выделить всё
Сравнение строк
Мы уже сравнивали строки на равенство (вспомните проверку пароля). Но строки сравнивают и на больше–меньше — лексикографически. При этом сравниваются слева направо коды символов двух строк в смысле их алфавитного порядка. Если длины строк разные и короткая совпадает с началом длинной, то большей считается длинная строка. Вот примеры:
   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 этой проблемы нет).
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Разбор примеров из книги

Сообщение deka47 » 13.10.2012 23:12:02

Я смог решить все, все задачи до 17 главы, но тут застрял, тупо взял и застрял:

Напишите программу, вычисляющую сумму чисел от 1 до N, где N – число, вводимое пользователем.

Я не могу понять как это делать, я уже полтора часа клацаю в паскале.
И, ксати, где есть решения задач? Я не смог найти в своем варианте книги.
deka47
новенький
 
Сообщения: 33
Зарегистрирован: 07.10.2012 22:43:26

Re: Разбор примеров из книги

Сообщение Oleg_D » 14.10.2012 00:07:54

deka47 писал(а):И, ксати, где есть решения задач? Я не смог найти в своем варианте книги.

И хорошо, что не нашли. :)
На сайте есть метка Скачать все файлы (книга, задачи, ответы, программы) редакция 12.3 (6 MB)
А задачка простая, ещё подумайте немного.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Разбор примеров из книги

Сообщение Vadim » 15.10.2012 02:50:45

deka47 писал(а):Я смог решить все, все задачи до 17 главы, но тут застрял, тупо взял и застрял:

Напишите программу, вычисляющую сумму чисел от 1 до N, где N – число, вводимое пользователем.

Я не могу понять как это делать, я уже полтора часа клацаю в паскале.

А Вы подумайте, как бы Вы решили эту задачу без компьютера. Сможете? Если да, то приложить к готовому решению компьютер - пара пустяков. ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Разбор примеров из книги

Сообщение deka47 » 16.10.2012 12:36:00

Vadim писал(а):А Вы подумайте, как бы Вы решили эту задачу без компьютера. Сможете? Если да, то приложить к готовому решению компьютер - пара пустяков.


Да, спасибо сделал сначала в тетради, потом на компьютере очень легко было. Решил уже давно ее, кстати. Сейчас новая загвоздка, продвинулся с 17 на 23 главу, не могу понять разницы между функцией и процедурой.
deka47
новенький
 
Сообщения: 33
Зарегистрирован: 07.10.2012 22:43:26

Re: Разбор примеров из книги

Сообщение Oleg_D » 16.10.2012 13:31:54

deka47 писал(а):не могу понять разницы между функцией и процедурой

Не знаю, насколько вы сведущи в математике, но функции там широко применяются, например sin(x), cos(x). Функции можно вставлять в формулы, а процедуры - нельзя.
Пример функции: Random(N);
Пример процедуры: Writeln(...);
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Разбор примеров из книги

Сообщение deka47 » 16.10.2012 13:33:47

Oleg_D писал(а):Не знаю, насколько вы сведущи в математике, но функции там широко применяются, например sin(x), cos(x). Функции можно вставлять в формулы, а процедуры - нельзя.
Пример функции: Random(N);
Пример процедуры: Writeln(...);


Хорошо знаю математику, да я теперь понял, спасибо.
deka47
новенький
 
Сообщения: 33
Зарегистрирован: 07.10.2012 22:43:26

Re: Разбор примеров из книги

Сообщение Vadim » 16.10.2012 13:58:53

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.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Разбор примеров из книги

Сообщение deka47 » 16.10.2012 23:52:26

Vadim, спасибо я теперь уже в целом разобрался, иду дальше читать! Спасибо Вам за форум и за людей, которые помогают новичкам в этом нелегком деле! Спасибо и Вам Вадим и Олегу!

Добавлено спустя 2 часа 19 минут 51 секунду:
Для введенной пользователем строки напечатать позиции всех входящих в неё символов (кроме пробелов) в алфавитном порядке. Для символов, которые встречаются несколько раз, напечатать их позиции в одной строке.

Код: Выделить всё
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;


Не могу понять, когда булев тип будет "не фолс", то выводим на экран букву и цифру, под которой она в слове (фразе)? Как это работает, каждый раз булеву с фолса присваивают тру, но опять потом идет прогонка цикла и он опять становится фолс? Как я не пытался изменить эти значения у меня ничего не получалось, пытался сначала тру присвоить, а потом фолс, пытался забрать нот, но во всех случаях программа вела себя неадекватно.
deka47
новенький
 
Сообщения: 33
Зарегистрирован: 07.10.2012 22:43:26

Re: Разбор примеров из книги

Сообщение tema » 17.10.2012 02:38:46

Когда флаг фолс - печатается на экране буква, а потом номер её места в строке и флаг становится тру.
Когда флаг тру - печатается ТОЛЬКО номер места в строке - это нужно для тех букв, которые встречаются в строке несколько раз.
Возможно, недоумение вызывает лишнее действие, а именно присваивание флагу тру, когда он и так тру. Более правильно тут будет:
Код: Выделить всё
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;
tema
постоялец
 
Сообщения: 375
Зарегистрирован: 24.03.2011 20:19:27

Re: Разбор примеров из книги

Сообщение Oleg_D » 17.10.2012 09:25:45

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;

Вариант от tema тоже годится.
Последний раз редактировалось Oleg_D 17.10.2012 09:45:28, всего редактировалось 1 раз.
Причина: Опечатка
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Разбор примеров из книги

Сообщение deka47 » 18.10.2012 00:03:51

Спасибо. К сожалению, все равно не дошло. Я не понимаю зачем там not и вот tema написал: "Если фолс, то...", возможно, он имел ввиду: "Если не фолс, то..."?
deka47
новенький
 
Сообщения: 33
Зарегистрирован: 07.10.2012 22:43:26

Re: Разбор примеров из книги

Сообщение tema » 18.10.2012 00:24:11

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;
tema
постоялец
 
Сообщения: 375
Зарегистрирован: 24.03.2011 20:19:27

Пред.След.

Вернуться в Книга "Песни о Паскале"

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru