216 lines
8.1 KiB
HTML
216 lines
8.1 KiB
HTML
<html>
|
||
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||
<title></title>
|
||
<link rel="StyleSheet" href="../../default.css">
|
||
</head>
|
||
|
||
<body>
|
||
<H1>Задание на обработку строк</H1>
|
||
|
||
<hr>
|
||
<h3>Создание программы-заготовки и знакомство с заданием</h3>
|
||
|
||
<p>В качестве примера задания на обработку строк рассмотрим задание String9.</p>
|
||
<p>Программу-заготовку для решения этого задания можно создать с помощью
|
||
команды
|
||
меню «Модули | Создать шаблон программы», кнопки
|
||
<img border="0" src="gif/Load.gif" width="16" height="17"> или клавиатурной
|
||
комбинации <b>Shift+Ctrl+L</b>. Эта заготовка будет иметь следующий вид:</p>
|
||
|
||
<blockquote><code><pre>
|
||
<b>uses</b> PT4;
|
||
|
||
<b>begin</b>
|
||
Task('String9');
|
||
|
||
<b>end</b>.
|
||
</pre></code></blockquote>
|
||
|
||
<p>После запуска данной программы на экране появится <a href="../PT4/window.html">окно задачника</a>:</p>
|
||
|
||
<blockquote>
|
||
<img border="0" src="gif/string9-1.png">
|
||
</blockquote>
|
||
|
||
<p>Данные типа <code>char</code> и <code>string</code> в окне задачника заключаются в <i>апострофы</i>; это позволяет, в частности,
|
||
отличить числовые данные (например, <code>9</code>) от символьных и строковых данных, содержащих цифры
|
||
(например, <code>'9'</code>).
|
||
Кроме того, апострофы дают возможность увидеть <i>пробелы</i>, находящиеся в начале или конце строк.
|
||
|
||
<hr>
|
||
<h3>Ввод исходных данных</h3>
|
||
<p>Добавим в программу фрагмент, обеспечивающий ввод исходных данных
|
||
(мы намеренно ввели данные не в том порядке, в котором они указаны в окне задачника):
|
||
</p>
|
||
<blockquote>
|
||
<code><pre>
|
||
<b>uses</b> PT4;
|
||
<b>var</b>
|
||
n: integer;
|
||
c1, c2: char;
|
||
<b>begin</b>
|
||
Task('String9');
|
||
read(c1, c2, n);
|
||
<b>end</b>.
|
||
</pre></code></blockquote>
|
||
|
||
|
||
<p>Запуск нового варианта программы уже не будет считаться ознакомительным, поскольку в программе
|
||
выполняется ввод исходных данных. Так как порядок ввода исходных данных является ошибочным,
|
||
этот вариант решения будет признан неверным и приведет к сообщению
|
||
«<i>Неверно указан тип при вводе исходных данных</i>»:</p>
|
||
|
||
<blockquote>
|
||
<img border="0" src="gif/string9-2.png">
|
||
</blockquote>
|
||
|
||
<p>Общее правило, определяющее порядок ввода и вывода данных для задачника <b>Programming Taskbook</b>
|
||
гласит:
|
||
<i>ввод и вывод данных производится по строкам (слева направо), а строки просматриваются сверху вниз</i>.
|
||
Иными словами,
|
||
данные, отображаемые в окне задачника, вводятся и выводятся в том порядке, в котором читается обычный
|
||
текст.</p>
|
||
<p>На панели индикаторов, расположенной под информационной панелью,
|
||
отмечено, что введен всего один элемент исходных данных (из трех), хотя в процедуре <code>read</code> нашей программы
|
||
были
|
||
указаны три переменные. Это объясняется тем, что при вводе первой из этих переменных (<code>с1</code>)
|
||
была обнаружена ошибка несоответствия типа, поэтому задачник не стал анализировать остальные данные,
|
||
которые программа пыталась ввести. Здесь проявляется еще одно правило задачника
|
||
<b>Programming Taskbook</b>: <i>при обнаружении первой ошибки ввода-вывода
|
||
анализ оставшихся исходных данных и результатов не проводится</i>.
|
||
</p>
|
||
<p>Исправим нашу программу, изменив порядкок параметров в процедуре ввода:</p>
|
||
<blockquote>
|
||
<code><pre>
|
||
read(n, c1, c2);
|
||
</pre></code></blockquote>
|
||
<p>Теперь с вводом данных проблем не возникает, однако из-за того что в программе отсутствует вывод результирующих
|
||
данных, решение по-прежнему считается ошибочным:</p>
|
||
<blockquote>
|
||
<img border="0" src="gif/string9-3.png">
|
||
</blockquote>
|
||
<p>Данная ошибка, в отличие от предыдущей, связана не с вводом исходных данных, а с выводом результатов.
|
||
Это отмечается в окне задачника двумя способами: цветной маркер ошибки располагается рядом с индикатором вывода,
|
||
и этим же цветом выделяется заголовок раздела результатов (который в данном случае не содержит никаких данных).
|
||
</p>
|
||
<hr>
|
||
<h3>Формирование и вывод требуемой строки</h3>
|
||
<p>Для формирования нужной строки воспользуемся операцией <code>+</code> (<i>сцепления</i> строк):</p>
|
||
<blockquote>
|
||
<code><pre>
|
||
<b>uses</b> PT4;
|
||
<b>var</b>
|
||
n, i: integer;
|
||
c1, c2: char;
|
||
s: string;
|
||
<b>begin</b>
|
||
Task('String9');
|
||
read(n, c1, c2);
|
||
s := '';
|
||
<b>for</b> i := 1 <b>to</b> n <b>do</b>
|
||
s := s + c1 + c2;
|
||
write(s);
|
||
<b>end</b>.
|
||
</pre></code></blockquote>
|
||
<p>Заметим, что в операторе <code>s := ''</code> нет необходимости, так как все глобальные переменные в Паскале автоматически
|
||
инициализируются «нулевыми» значениями (для числовых данных это обычные нули, для символов — это
|
||
символ <code>#0</code>, для
|
||
строк — пустая строка <code>''</code>).</p>
|
||
<p>Результат выполнения этой программы будет следующим:</p>
|
||
<blockquote>
|
||
<img border="0" src="gif/string9-4.png">
|
||
</blockquote>
|
||
<p>Красная звездочка, расположенная в конце выведенной строки, означает, что длина полученной строки превышает
|
||
длину верной строки. Для того чтобы увидеть на экране всю полученную строку, достаточно подвести курсор мыши
|
||
к строке со звездочкой; при этом полный текст строки появится во всплывающей подсказке:</p>
|
||
<blockquote>
|
||
<img border="0" src="gif/string9-5.png">
|
||
</blockquote>
|
||
<p><b>Замечание.</b> Красная звездочка может появиться и при выводе ошибочных числовых данных. Например, если ожидается
|
||
целое число в диапазоне от <code>1</code> до <code>99</code>, а получено число <code>10000</code>, то на экране изобразится первая цифра этого большого
|
||
числа, за которой будет указана красная звездочка: <code>1<font color=red>*</font></code>.</p>
|
||
<hr>
|
||
<h3>Верное решение</h3>
|
||
<p>Ошибка в предыдущей программе возникла из-за неверного указания количества итераций цикла. Действительно,
|
||
на каждой итерации к строке добавляется по <i>два</i> символа, поэтому после <code>n</code> итераций
|
||
строка будет содержать <code>2*n</code> символов (а не <code>n</code>, как требуется в задании).
|
||
<p>Для исправления ошибки достаточно вдвое
|
||
уменьшить число итераций:</p>
|
||
<blockquote>
|
||
<code><pre>
|
||
<b>uses</b> PT4;
|
||
<b>var</b>
|
||
n, i: integer;
|
||
c1, c2: char;
|
||
s: string;
|
||
<b>begin</b>
|
||
Task('String9');
|
||
read(n, c1, c2);
|
||
s := '';
|
||
<b>for</b> i := 1 <b>to</b> n <b>div</b> 2 <b>do</b>
|
||
s := s + c1 + c2;
|
||
write(s);
|
||
<b>end</b>.
|
||
</pre></code></blockquote>
|
||
<p>После запуска этого варианта мы получим сообщение «<i>Верное решение. Тест номер 1 (из 5)</i>»,
|
||
а после пяти подобных запусков — сообщение «<i>Задание выполнено!</i>»:</p>
|
||
<blockquote>
|
||
<img border="0" src="gif/string9-6.png">
|
||
</blockquote>
|
||
<p><b>Замечание.</b> Приведем другой, более быстрый, способ решения задания String9,
|
||
в котором результирующая строка заполняется <i>посимвольно</i>, как обычный массив:</p>
|
||
<blockquote>
|
||
<code><pre>
|
||
<b>uses</b> PT4;
|
||
<b>var</b>
|
||
n, i: integer;
|
||
c1, c2: char;
|
||
s: string;
|
||
<b>begin</b>
|
||
Task('String9');
|
||
read(n, c1, c2);
|
||
SetLength(s, n);
|
||
<b>for</b> i := 1 <b>to</b> n <b>div</b> 2 <b>do</b>
|
||
<b>begin</b>
|
||
s[2 * i - 1] := c1;
|
||
s[2 * i] := c2;
|
||
<b>end</b>;
|
||
write(s);
|
||
<b>end</b>.
|
||
</pre></code></blockquote>
|
||
<p>Обратите внимание на процедуру <code>SetLength(s, n)</code>, которая обеспечивает правильную настройку <i>длины</i> результирующей
|
||
строки <code>s</code>. Без вызова этой процедуры программа работала бы неверно, так как любая
|
||
глобальная строковая переменная инициализируется пустой строкой, а при работе с отдельными символами строки
|
||
корректировка ее длины не производится.</p>
|
||
|
||
|
||
|
||
|
||
<hr>
|
||
<h3>Просмотр результатов выполнения задания</h3>
|
||
<p>Щелкнув мышью на метке «Результаты (F2)», расположенной в правом верхнем
|
||
углу окна задачника, или нажав клавишу <b>F2</b>, мы можем вывести на экран <i>окно результатов</i>,
|
||
в котором будет перечислены все наши попытки решения задачи:</p>
|
||
|
||
<blockquote>
|
||
<code><pre>
|
||
String9 a08/09 11:17 Ознакомительный запуск.
|
||
String9 a08/09 11:18 Неверно указан тип при вводе исходных данных.
|
||
String9 a08/09 11:21 Выведены не все результирующие данные.
|
||
String9 a08/09 11:26 Ошибочное решение.
|
||
String9 a08/09 11:29 Задание выполнено!
|
||
</pre></code>
|
||
</blockquote>
|
||
<p>Для закрытия окна результатов достаточно нажать клавишу <b>Esc</b>.
|
||
Окно результатов можно отобразить на экране и после закрытия окна задачника и возврата в среду <b>PascalABC.NET</b>.
|
||
Для этого надо использовать команду меню «Модули | Просмотреть результаты», кнопку
|
||
<img border="0" src="gif/Results.gif" width="16" height="17"> или клавиатурную
|
||
комбинацию <b>Shift+Ctrl+R</b>.
|
||
</p>
|
||
|
||
</body>
|
||
|
||
</html>
|