Разбор примеров из книги
Модераторы: 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 этой проблемы нет).
Я смог решить все, все задачи до 17 главы, но тут застрял, тупо взял и застрял:
Напишите программу, вычисляющую сумму чисел от 1 до N, где N – число, вводимое пользователем.
Я не могу понять как это делать, я уже полтора часа клацаю в паскале.
И, ксати, где есть решения задач? Я не смог найти в своем варианте книги.
Напишите программу, вычисляющую сумму чисел от 1 до N, где N – число, вводимое пользователем.
Я не могу понять как это делать, я уже полтора часа клацаю в паскале.
И, ксати, где есть решения задач? Я не смог найти в своем варианте книги.
deka47 писал(а):И, ксати, где есть решения задач? Я не смог найти в своем варианте книги.
И хорошо, что не нашли.
На сайте есть метка Скачать все файлы (книга, задачи, ответы, программы) редакция 12.3 (6 MB)
А задачка простая, ещё подумайте немного.
deka47 писал(а):Я смог решить все, все задачи до 17 главы, но тут застрял, тупо взял и застрял:
Напишите программу, вычисляющую сумму чисел от 1 до N, где N – число, вводимое пользователем.
Я не могу понять как это делать, я уже полтора часа клацаю в паскале.
А Вы подумайте, как бы Вы решили эту задачу без компьютера. Сможете? Если да, то приложить к готовому решению компьютер - пара пустяков.
Vadim писал(а):А Вы подумайте, как бы Вы решили эту задачу без компьютера. Сможете? Если да, то приложить к готовому решению компьютер - пара пустяков.
Да, спасибо сделал сначала в тетради, потом на компьютере очень легко было. Решил уже давно ее, кстати. Сейчас новая загвоздка, продвинулся с 17 на 23 главу, не могу понять разницы между функцией и процедурой.
deka47 писал(а):не могу понять разницы между функцией и процедурой
Не знаю, насколько вы сведущи в математике, но функции там широко применяются, например sin(x), cos(x). Функции можно вставлять в формулы, а процедуры - нельзя.
Пример функции: Random(N);
Пример процедуры: Writeln(...);
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.Vadim, спасибо я теперь уже в целом разобрался, иду дальше читать! Спасибо Вам за форум и за людей, которые помогают новичкам в этом нелегком деле! Спасибо и Вам Вадим и Олегу!
Добавлено спустя 2 часа 19 минут 51 секунду:
Для введенной пользователем строки напечатать позиции всех входящих в неё символов (кроме пробелов) в алфавитном порядке. Для символов, которые встречаются несколько раз, напечатать их позиции в одной строке.
Обьясните что делает этот кусок:
Не могу понять, когда булев тип будет "не фолс", то выводим на экран букву и цифру, под которой она в слове (фразе)? Как это работает, каждый раз булеву с фолса присваивают тру, но опять потом идет прогонка цикла и он опять становится фолс? Как я не пытался изменить эти значения у меня ничего не получалось, пытался сначала тру присвоить, а потом фолс, пытался забрать нот, но во всех случаях программа вела себя неадекватно.
Добавлено спустя 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;Не могу понять, когда булев тип будет "не фолс", то выводим на экран букву и цифру, под которой она в слове (фразе)? Как это работает, каждый раз булеву с фолса присваивают тру, но опять потом идет прогонка цикла и он опять становится фолс? Как я не пытался изменить эти значения у меня ничего не получалось, пытался сначала тру присвоить, а потом фолс, пытался забрать нот, но во всех случаях программа вела себя неадекватно.
Когда флаг фолс - печатается на экране буква, а потом номер её места в строке и флаг становится тру.
Когда флаг тру - печатается ТОЛЬКО номер места в строке - это нужно для тех букв, которые встречаются в строке несколько раз.
Возможно, недоумение вызывает лишнее действие, а именно присваивание флагу тру, когда он и так тру. Более правильно тут будет:
Когда флаг тру - печатается ТОЛЬКО номер места в строке - это нужно для тех букв, которые встречаются в строке несколько раз.
Возможно, недоумение вызывает лишнее действие, а именно присваивание флагу тру, когда он и так тру. Более правильно тут будет:
Код: Выделить всё
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;Вариант от tema тоже годится.
Последний раз редактировалось Oleg_D 17.10.2012 09:45:28, всего редактировалось 1 раз.
Причина: Опечатка
Причина: Опечатка
Спасибо. К сожалению, все равно не дошло. Я не понимаю зачем там not и вот tema написал: "Если фолс, то...", возможно, он имел ввиду: "Если не фолс, то..."?
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;