Добавил справку и средства для автогенерации справки по системному модулю
3
.gitignore
vendored
|
|
@ -11,6 +11,9 @@ bin/*.xml
|
||||||
bin/log.txt
|
bin/log.txt
|
||||||
bin/CompilerController.ini
|
bin/CompilerController.ini
|
||||||
|
|
||||||
|
**/_vti_cnf
|
||||||
|
**/_vti_pvt
|
||||||
|
|
||||||
TestSuite/CompilationSamples/*.pcu
|
TestSuite/CompilationSamples/*.pcu
|
||||||
TestSuite/CompilationSamples/*.pdb
|
TestSuite/CompilationSamples/*.pdb
|
||||||
TestSuite/CompilationSamples/*.exe
|
TestSuite/CompilationSamples/*.exe
|
||||||
|
|
|
||||||
50
PABCNetHelp/01_decodemnemonics.pas
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
uses System.Collections.Generic;
|
||||||
|
|
||||||
|
var
|
||||||
|
mnem,f,f1: text;
|
||||||
|
d := new Dictionary<string,char>;
|
||||||
|
c: char;
|
||||||
|
s: string;
|
||||||
|
|
||||||
|
function Convert(s: string): string;
|
||||||
|
begin
|
||||||
|
foreach x: KeyValuePair<string,char> in d do
|
||||||
|
begin
|
||||||
|
var p := Pos(x.Key,s);
|
||||||
|
while p>0 do
|
||||||
|
begin
|
||||||
|
Delete(s,p,Length(x.Key));
|
||||||
|
Insert(x.Value,s,p);
|
||||||
|
p := Pos(x.Key,s);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Result := s;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
assign(mnem,'mnemonicsrus.txt');
|
||||||
|
reset(mnem);
|
||||||
|
for c:='а' to 'я' do
|
||||||
|
begin
|
||||||
|
readln(mnem,s);
|
||||||
|
d.Add(Trim(s),c);
|
||||||
|
end;
|
||||||
|
for c:='А' to 'Я' do
|
||||||
|
begin
|
||||||
|
readln(mnem,s);
|
||||||
|
d.Add(Trim(s),c);
|
||||||
|
end;
|
||||||
|
close(mnem);
|
||||||
|
assign(f,'Table of Contents.hhc');
|
||||||
|
assign(f1,'Table of Contents New.hhc');
|
||||||
|
reset(f);
|
||||||
|
rewrite(f1);
|
||||||
|
while not eof(f) do
|
||||||
|
begin
|
||||||
|
readln(f,s);
|
||||||
|
s := Convert(s);
|
||||||
|
writeln(f1,s);
|
||||||
|
end;
|
||||||
|
close(f);
|
||||||
|
close(f1);
|
||||||
|
end.
|
||||||
54
PABCNetHelp/02_collectKeywords.pas
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
var dict := new Dictionary<string,string>;
|
||||||
|
|
||||||
|
procedure CollectInDir(path: string);
|
||||||
|
begin
|
||||||
|
var ff := System.IO.Directory.EnumerateFiles(path,'*.html');
|
||||||
|
foreach f: string in ff do
|
||||||
|
begin
|
||||||
|
var l := new List<string>;
|
||||||
|
ReadLines(f).ForEach(
|
||||||
|
procedure(s) ->
|
||||||
|
begin
|
||||||
|
if s.Contains('name="Keyword"') then
|
||||||
|
begin
|
||||||
|
var p := s.IndexOf('value="');
|
||||||
|
var q := s.IndexOf('"',p+8);
|
||||||
|
l.Add(Copy(s,p+8,q-p-7));
|
||||||
|
end;
|
||||||
|
end);
|
||||||
|
if l.Count>0 then
|
||||||
|
begin
|
||||||
|
dict[f.Substring(2)] := l.JoinIntoString('`\')+'`\';
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
var dd := System.IO.Directory.EnumerateDirectories(path);
|
||||||
|
foreach d: string in dd do
|
||||||
|
CollectInDir(d);
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
CollectInDir('.');
|
||||||
|
//dict.Println(NewLine);
|
||||||
|
|
||||||
|
var f := ReadLines('WinChmWebHelp\Table of Contents.wcp',Encoding.UTF8);
|
||||||
|
|
||||||
|
var name := '';
|
||||||
|
|
||||||
|
f := f.Select(s->begin
|
||||||
|
if s.StartsWith('TitleList.Url') then
|
||||||
|
begin
|
||||||
|
var p := s.IndexOf('=');
|
||||||
|
name := s.Substring(p+1);
|
||||||
|
end;
|
||||||
|
if s.StartsWith('TitleList.Keywords') then
|
||||||
|
begin
|
||||||
|
var p := s.IndexOf('=');
|
||||||
|
if dict.ContainsKey(name) then
|
||||||
|
begin
|
||||||
|
s := s.Substring(0,p+1)+dict[name];
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Result := s;
|
||||||
|
end);
|
||||||
|
WriteLines('WinChmWebHelp\Table of Contents.wcp',f.ToArray,new System.Text.UTF8Encoding(false));
|
||||||
|
end.
|
||||||
92
PABCNetHelp/Common/AdvantagePABC.html
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||||
|
<title></title>
|
||||||
|
<link rel="StyleSheet" href="../default.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<h1>Преимущества PascalABC.NET</h1>
|
||||||
|
<h2>Современный язык программирования Object Pascal</h2>
|
||||||
|
<p>Язык <b>PascalABC.NET</b> включает в себя практически весь стандартный язык
|
||||||
|
Паскаль, а также большинство языковых расширений языка Delphi. Однако, этих
|
||||||
|
средств недостаточно для современного программирования. Именно поэтому <b>PascalABC.NET</b>
|
||||||
|
расширен рядом конструкций, а его стандартный модуль - рядом подпрограмм, типов
|
||||||
|
и классов, что позволяет создавать легко читающиеся приложения средней
|
||||||
|
сложности. </p>
|
||||||
|
<p>Кроме этого, язык <b>PascalABC.NET</b> использует большинство средств,
|
||||||
|
предоставляемых платформой .NET: единая система типов, классы, интерфейсы,
|
||||||
|
исключения, делегаты, перегрузка операций, обобщенные типы (generics), методы
|
||||||
|
расширения, лямбда-выражения.</p>
|
||||||
|
<p>Стандартный модуль PABCSystem, автоматически подключаемый к любой программе,
|
||||||
|
содержит огромное количество стандартных типов и подпрограмм, позволяющих писать
|
||||||
|
ясные и компактные программы. </p>
|
||||||
|
<p>В распоряжении <b>PascalABC.NET</b> находятся все средства .NET-библиотек
|
||||||
|
классов, постоянно расширяющихся самыми современными возможностями. Это
|
||||||
|
позволяет легко писать на <b>PascalABC.NET</b> приложения для работы с сетью,
|
||||||
|
Web, XML-документами, использовать регулярные выражения и многое другое. </p>
|
||||||
|
<p>Язык <b>PascalABC.NET</b> позволяет программировать в классическом <em>
|
||||||
|
процедурном стиле</em>, в <em>объектно-ориентированном стиле</em> и содержит
|
||||||
|
множество элементов для программирования в <em>функциональном стиле</em>. Выбор
|
||||||
|
стиля или комбинации этих стилей - дело вкуса программиста, а при использовании
|
||||||
|
в обучении - методический подход преподавателя.</p>
|
||||||
|
<p>Сочетание богатых и современных языковых средств, возможностей выбора разных
|
||||||
|
траекторий обучения позволяет рекомендовать <strong>PascalABC.NET</strong> с
|
||||||
|
одной стороны как язык для обучения программированию (от школьников до студентов
|
||||||
|
младших и средних курсов), с другой - как язык для создания проектов и библиотек
|
||||||
|
средней сложности.</p>
|
||||||
|
<h2>Простая и мощная среда разработки</h2>
|
||||||
|
<p>Интегрированная среда разработки <strong>PascalABC.NET</strong> ориентирована
|
||||||
|
на создание проектов малой и средней сложности. Она достаточно легковесна и в то
|
||||||
|
же время обеспечивает разработчика всеми необходимыми средствами, такими как
|
||||||
|
встроенный отладчик, средства Intellisense (подсказка по точке, подсказка по
|
||||||
|
параметрам, всплывающая подсказка по имени), переход к определению и реализации
|
||||||
|
подпрограммы, шаблоны кода, автоформатирование кода. </p>
|
||||||
|
<p>В среду <strong>PascalABC.NET</strong> встроен также <em>дизайнер форм</em>,
|
||||||
|
позволяющий создавать полноценные оконные приложения в стиле RAD (Rapid
|
||||||
|
Application Development - быстрое создание приложений).</p>
|
||||||
|
<p>В отличие от многих профессиональных сред, среда разработки <strong>
|
||||||
|
PascalABC.NET</strong> не имеет громоздкого интерфейса и не создает множество
|
||||||
|
дополнительных вспомогательных файлов на диске при компиляции программы. Для
|
||||||
|
небольших программ это позволяет соблюсти принцип "Одна программа - один файл на
|
||||||
|
диске".</p>
|
||||||
|
<p>В среде <b>PascalABC.NET</b>
|
||||||
|
большое внимание уделено связи запущенной программы с оболочкой: консольная
|
||||||
|
программа, запущенная из-под оболочки, осуществляет ввод-вывод в специальное
|
||||||
|
окно, встроенное в оболочку. Можно также запустить несколько программ
|
||||||
|
одновременно - все они будут контролироваться оболочкой.</p>
|
||||||
|
<p>Интегрированная среда <b>PascalABC.NET</b>
|
||||||
|
позволяет переключать в настройках русский и английский язык, при этом
|
||||||
|
локализованы не только элементы интерфейса, но и сообщения об ошибках.</p>
|
||||||
|
<p>Кроме этого, внутренние представления <strong>PascalABC.NET</strong> позволяют создавать
|
||||||
|
компиляторы других языков программирования и встраивать их в среду разработки с помощью
|
||||||
|
специальных
|
||||||
|
<a href="http://pascalabc.net/wiki/index.php/Плагины_для_PascalABC.NET">плагинов</a>.</p>
|
||||||
|
<h2>Специализированные модули для обучения</h2>
|
||||||
|
<p>Платформа Microsoft.NET обеспечивает <strong>PascalABC.NET</strong>
|
||||||
|
стандартной библиотекой, состоящей из огромного количества класссов для решения
|
||||||
|
практически любых задач: от алгоритмических до прикладных. Именно поэтому в
|
||||||
|
<strong>PascalABC.NET</strong> отсутствует необходимость в разработке большого
|
||||||
|
числа собственных модулей.</p>
|
||||||
|
<p>Собственные модули, которые имеются в <strong>PascalABC.NET</strong>,
|
||||||
|
ориентированы именно на начальное обучение программированию. </p>
|
||||||
|
<p>Для обучения программированию школьников реализованы модули классических
|
||||||
|
школьных исполнителей Робот и Чертежник, содержащие около двухсот автоматически
|
||||||
|
проверяемых заданий на основные конструкции языка программирования.</p>
|
||||||
|
<p>Кроме этого, среда <b>PascalABC.NET</b>
|
||||||
|
содержит модуль электронного задачника <a href="http://ptaskbook.com">Programming
|
||||||
|
Taskbook</a> (автор Абрамян М.Э.), позволяющий осуществлять
|
||||||
|
автоматическую постановку и проверку заданий. Имеются также модули для преподавателя, позволяющие создавать
|
||||||
|
задания для исполнителей Робот, Чертежник и электронного задачника.</p>
|
||||||
|
<p>Модуль растровой графики GraphABC и модуль векторных графических объектов
|
||||||
|
ABCObjects могут быть использованы для создания простейших графических. а также
|
||||||
|
интерактивных анимационных приложений, управляемых событиями.</p>
|
||||||
|
<p>Следует также отметить "студенческие" модули: модуль <span lang="en-us">Collections
|
||||||
|
</span>упрощенных коллекций, модуль <span lang="en-us">Arrays </span>для
|
||||||
|
простейших операций с динамическими массивами и модуль Forms для ручного
|
||||||
|
создания простых приложений с оконным пользовательским интерфейсом.</p>
|
||||||
|
<p> </p>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
124
PABCNetHelp/Common/Net.html
Normal file
|
|
@ -0,0 +1,124 @@
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||||
|
<title></title>
|
||||||
|
<link rel="StyleSheet" href="../default.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<h1>Что такое .NET</h1>
|
||||||
|
<p>Платформа <b>Microsoft .NET</b> - это комплекс
|
||||||
|
программ, устанавливаемый поверх операционной системы и обеспечивающий
|
||||||
|
выполнение программ, написанных специально для .NET.
|
||||||
|
.NET-программы компактны, пользуются единым набором типов
|
||||||
|
данных и библиотек. Компания Microsoft активно развивает платформу
|
||||||
|
.NET, выпуская новые версии с расширенными
|
||||||
|
возможностями. На момент начала 2015 г. последней версией является
|
||||||
|
.NET 4.5.</p>
|
||||||
|
<p>В результате компиляции .NET-программы генерируется не машинный код, а
|
||||||
|
так называемый байт-код, содержащий команды <i>виртуальной машины </i>(в
|
||||||
|
.NET он называется <b>IL-кодом</b>
|
||||||
|
от англ. Intermediate Language - промежуточный язык). Команды байт-кода не зависят
|
||||||
|
от процессора и используемой операционной системы. При запуске
|
||||||
|
программа, содержащая IL-код,
|
||||||
|
подается на вход виртуальной машины, которая и производит выполнение программы.
|
||||||
|
Часть виртуальной машины, называемая <b>JIT-</b><b>компилятором</b>
|
||||||
|
(Just In Time - непосредственно в данный момент),
|
||||||
|
сразу после запуска .NET-программы переводит
|
||||||
|
ее промежуточный код в машинный (проводя при этом его
|
||||||
|
оптимизацию), после чего запускает программу
|
||||||
|
на исполнение. Если быть точными, то промежуточный код переводится в машинный
|
||||||
|
частями по мере выполнения программы.</p>
|
||||||
|
<p>Такой способ двойной компиляции сложнее обычного, но имеет
|
||||||
|
ряд преимуществ. Во-первых, JIT-компилятор может
|
||||||
|
определить тип процессора, установленного на данном компьютере, поэтому
|
||||||
|
генерирует максимально эффективный машинный код. Тесты показывают, что за счет
|
||||||
|
этого некоторые программы выполняются даже быстрее обычных. Во-вторых,
|
||||||
|
IL-код - гораздо более высокоуровневый, чем машинный, и содержит
|
||||||
|
ряд объектно-ориентированных команд. В их числе - команда newobj
|
||||||
|
вызова конструктора объекта, команда callvirt
|
||||||
|
вызова виртуального метода объекта и команда throw генерации исключения.</p>
|
||||||
|
<p>Программа или библиотека для .NET
|
||||||
|
называется <i>сборкой</i> и имеет традиционное расширение - exe
|
||||||
|
или dll. Поскольку в сборках содержится IL-код,
|
||||||
|
они значительно компактнее обычных программ и библиотек. Так, приложение с
|
||||||
|
главным окном, меню и элементами управления занимает на диске всего несколько
|
||||||
|
десятков килобайт.</p>
|
||||||
|
<p>Наиболее "чистым" .NET-языком является
|
||||||
|
<b>C#</b>: он создавался специально для платформы .NET
|
||||||
|
и включает практически все ее возможности. .NET-языки легко взаимодействуют друг с другом не только за
|
||||||
|
счет высокоуровневого промежуточного кода, но и за счет общей системы типов (<b>CTS</b>
|
||||||
|
- Common Type System - общая система типов). Все стандартные
|
||||||
|
типы (строковые, символьные, числовые и логический) имеют одинаковое
|
||||||
|
представление в памяти во всех .NET-языках. Это
|
||||||
|
позволяет, например, создать библиотеку dll
|
||||||
|
на C#, <span lang="ru">поместить в нее описание класса, </span>а затем воспользоваться этой
|
||||||
|
библиотекой из программы на PascalABC.NET, <span lang="ru">сконструировав</span> объект
|
||||||
|
<span lang="ru">данного</span> класса. Можно также разработать библиотеку на PascalABC.NET,
|
||||||
|
а потом подключить ее к проекту на Visual Basic.NET.
|
||||||
|
Отметим, что традиционные
|
||||||
|
библиотеки dll не позволяют хранить классы, доступные
|
||||||
|
извне, и обладают рядом других ограничений.</p>
|
||||||
|
<p>Важнейшими средствами, предоставляемыми платформой
|
||||||
|
.NET, являются единый способ обработки ошибок - генерация и
|
||||||
|
перехват исключений, - а также автоматическое управление освобождением
|
||||||
|
динамической памяти, называемое <i>сборкой мусора</i>. Последнее, в частности,
|
||||||
|
означает, что отсутствует необходимость в деструкторах классов.</p>
|
||||||
|
<p>Имеются программы,
|
||||||
|
которые могут восстанавливать текст программы по IL-коду
|
||||||
|
(например, программа <span lang="en-us">ILSpy</span>).</p>
|
||||||
|
<p>Помимо JIT-компилятора, важной частью
|
||||||
|
платформы .NET является набор стандартных библиотек (FCL
|
||||||
|
- Foundation Class Library - общая библиотека классов).
|
||||||
|
Среди них - библиотеки работы с графикой, сетью, базами данных, XML,
|
||||||
|
контейнерами, потоками, содержащие тысячи классов. Каждый .NET-язык
|
||||||
|
может пользоваться всеми возможностями этих библиотек.</p>
|
||||||
|
<p>Имеется открытая кроссплатформенная реализация среды <span lang="en-us">
|
||||||
|
Microsoft.NET - </span><a href="http://www.mono-project.com/">среда
|
||||||
|
<span lang="en-us">Mono</span></a>, позволяющая в частности разрабатывать и
|
||||||
|
запускать <span lang="en-us">.NET-</span>программы под <span lang="en-us">Linux</span>.</p>
|
||||||
|
<p>Кратко отметим достоинства и недостатки платформы .NET.</p>
|
||||||
|
<h2>Достоинства платформы .NET</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Платформа .NET поддерживает множество
|
||||||
|
.NET-языков. В их числе C#,
|
||||||
|
Visual Basic.NET, <span lang="en-us">F</span>#,
|
||||||
|
управляемый C++,
|
||||||
|
<span lang="en-us">Delphi Prism</span>, Oberon, Zonnon,
|
||||||
|
<span lang="en-us">Iron Python, Iron Ruby, </span>PascalABC.NET.</li>
|
||||||
|
<li>Любой .NET-язык содержит самые современные
|
||||||
|
языковые возможности: классы, свойства, полиморфизм, исключения, перегрузка
|
||||||
|
операций, легкое создание библиотек.</li>
|
||||||
|
<li>.NET-языки легко сочетаются друг с другом,
|
||||||
|
похожи друг на друга по синтаксическим конструкциям и системе типов.</li>
|
||||||
|
<li>Имеется обширная библиотека стандартных классов FCL.</li>
|
||||||
|
<li>.NET-приложения компактны.</li>
|
||||||
|
<li>Платформа .NET активно развивается фирмой
|
||||||
|
Microsoft, добавляются как новые языковые возможности,
|
||||||
|
так и новые библиотеки.</li>
|
||||||
|
<li>Компилятор .NET-языка создать значительно проще,
|
||||||
|
чем компилятор обычного языка.</li>
|
||||||
|
</ol>
|
||||||
|
<h2>Недостатки платформы .NET</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Запуск .NET-приложения выполняется в несколько раз
|
||||||
|
медленнее запуска обычного приложения, поскольку требует загрузки в
|
||||||
|
оперативную память компонентов виртуальной машины и внешних библиотек.</li>
|
||||||
|
<li>.NET-код в некоторых ситуациях работает медленнее
|
||||||
|
обычного (однако, в большинстве задач это отставание незначительно, а в
|
||||||
|
некоторых - приложения .NET могут опережать
|
||||||
|
обычные программы).</li>
|
||||||
|
<li>Сборщик мусора начинает работу в момент
|
||||||
|
исчерпания динамической памяти, его работа занимает несколько миллисекунд. Для
|
||||||
|
приложений реального времени это непозволительно.</li>
|
||||||
|
<li>Запуск .NET-приложения обязательно требует
|
||||||
|
установки на компьютере платформы .NET. Без нее
|
||||||
|
приложение работать не будет (Отметим, что в Windows Vista и в
|
||||||
|
<span lang="en-us">Windows 7 </span>платформа .NET встроена).</li>
|
||||||
|
</ol>
|
||||||
|
<p>Отметим, что достоинства платформы .NET
|
||||||
|
многократно перекрывают ее недостатки.</p>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
109
PABCNetHelp/Common/PABCNETvsDelphi.html
Normal file
|
|
@ -0,0 +1,109 @@
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||||
|
<title></title>
|
||||||
|
<link rel="StyleSheet" href="../default.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<H1>Îòëè÷èÿ ÿçûêà PascalABC.NET îò Delphi</H1>
|
||||||
|
<h3>Äîáàâëåíî</h3>
|
||||||
|
<ol>
|
||||||
|
<li>Îïåðàöèè <code>+=</code> <code>-=</code> äëÿ ñîáûòèé .NET è äëÿ ïðîöåäóðíûõ
|
||||||
|
ïåðåìåííûõ.</li>
|
||||||
|
<li>Îïåðàöèè <code>+=</code> <code>-=</code> <code>*=</code> äëÿ öåëûõ è
|
||||||
|
<code>+=</code> <code>-=</code> <code>*=</code> <code>/=</code>
|
||||||
|
äëÿ âåùåñòâåííûõ.</li>
|
||||||
|
<li>Îïåðàöèÿ <code>+=</code> äëÿ ñòðîê.</li>
|
||||||
|
<li>Ïîäïðîãðàììû ñ ïåðåìåííûì ÷èñëîì ïàðàìåòðîâ.</li>
|
||||||
|
<li>Îïåðàöèÿ <b> <code>new</code></b> äëÿ âûçîâà êîíñòðóêòîðà (<code>ident := new type_name(params);</code>).</li>
|
||||||
|
<li>Îïåðàöèÿ <b> <code>new</code></b> äëÿ ñîçäàíèÿ äèíàìè÷åñêîãî ìàññèâà. </li>
|
||||||
|
<li>Îïåðàöèÿ <code><b>typeof</b></code> .</li>
|
||||||
|
<li>Èñïîëüçîâàíèå <code><b>uses</b></code> äëÿ
|
||||||
|
ïîäêëþ÷åíèÿ ïðîñòðàíñòâ èìåí .NET (<span lang="ru">ðåàëèçîâàíî â </span>
|
||||||
|
Delphi Prism).</li>
|
||||||
|
<li>Âèä äîñòóïà <code><b>internal</b></code> (íàðÿäó ñ <code><b>public</b></code>,
|
||||||
|
<code><b>private</b></code>, <code><b>protected</b></code>).</li>
|
||||||
|
<li>Èíèöèàëèçàöèÿ ïåðåìåííûõ: <code><b>var</b> a: integer :=
|
||||||
|
1</code>;</li>
|
||||||
|
<li>Èíèöèàëèçàöèÿ ïåðåìåííûõ: <code><b>var</b> a :=
|
||||||
|
1</code>;</li>
|
||||||
|
<li>Îáúÿâëåíèå ëîêàëüíûõ ïåðåìåííûõ â áëîêå.</li>
|
||||||
|
<li>Îáúÿâëåíèå ïàðàìåòðà öèêëà â çàãîëîâêå öèêëà: <code><b>for</b> <b>var</b>
|
||||||
|
i := 1 <b>to</b> 10 <b>do</b></code>, <code><b>foreach</b>
|
||||||
|
<strong>var</strong> x <b>in</b> a <b>do</b></code>.</li>
|
||||||
|
<li>Îïåðàòîð <code><b>lock</b></code>, îáåñïå÷èâàþùèé ñèíõðîíèçàöèþ ïîòîêîâ.</li>
|
||||||
|
<li>Ìåòîäû â çàïèñÿõ.</li>
|
||||||
|
<li>Èíèöèàëèçàòîðû ïîëåé â êëàññàõ è çàïèñÿõ.</li>
|
||||||
|
<li>Îáîáùåííûå êëàññû (generics).</li>
|
||||||
|
<li>Ðåàëèçîâàíû òèïèçèðîâàííûå ôàéëû (â îòëè÷èå îò
|
||||||
|
Delphi Prism, ãäå îíè óáðàíû).</li>
|
||||||
|
<li>Óïðîùåííûé ñèíòàêñèñ ìîäóëåé.</li>
|
||||||
|
<li>Îïèñàíèå ìåòîäîâ âíóòðè èíòåðôåéñà êëàññà èëè çàïèñè.</li>
|
||||||
|
<li>Ðåàëèçàöèÿ çàïèñüþ èíòåðôåéñà.</li>
|
||||||
|
<li><span lang="ru">Ìåòîäû ðàñøèðåíèÿ.</span></li>
|
||||||
|
<li>Ëÿìáäà-âûðàæåíèÿ.</li>
|
||||||
|
</ol>
|
||||||
|
<h3>Èçìåíåíî</h3>
|
||||||
|
<ol>
|
||||||
|
<li>Òîëüêî ñîêðàùåííîå âû÷èñëåíèå ëîãè÷åñêèõ âûðàæåíèé.</li>
|
||||||
|
<li>Äðóãîé ñèíòàêñèñ <code><b>foreach</b></code>.</li>
|
||||||
|
<li>Èíòåðôåéñû <code><b>interface</b></code> â ñòèëå .NET.</li>
|
||||||
|
<li>Äðóãîé ñèíòàêñèñ ïåðåãðóçêè îïåðàöèé.</li>
|
||||||
|
<li>Ñòàòè÷åñêèå ìåòîäû êëàññîâ âìåñòî êëàññîâûõ ìåòîäîâ. Îòñóòñòâèå òèïà
|
||||||
|
<code>TClass</code>.</li>
|
||||||
|
<li>Äåñòðóêòîðû îñòàâëåíû ëèøü äëÿ ñîâìåñòèìîñòè è íå âûïîëíÿþò íèêàêèõ
|
||||||
|
äåéñòâèé.</li>
|
||||||
|
<li>Òèï <code>object</code> -
|
||||||
|
ñèíîíèì <code>System.Object</code>.</li>
|
||||||
|
<li>Òèï <code>exception</code> -
|
||||||
|
ñèíîíèì <code>System.Exception</code>.</li>
|
||||||
|
<li>Èíäåêñàöèÿ <code>string</code> ñ 1, äèðåêòèâà ïåðåêëþ÷åíèÿ íà èíäåêñàöèþ ñ 0.</li>
|
||||||
|
<li>Ïðîöåäóðà <code>write</code>
|
||||||
|
âûâîäèò ëþáûå òèïû.</li>
|
||||||
|
<li>Ñòðóêòóðíàÿ ýêâèâàëåíòíîñòü òèïîâ äëÿ ïðîöåäóðíûõ ïåðåìåííûõ, äèíàìè÷åñêèõ ìàññèâîâ,
|
||||||
|
òèïèçèðîâàííûõ óêàçàòåëåé è
|
||||||
|
ìíîæåñòâ (â Delphi Object
|
||||||
|
Pascal - èìåííàÿ ýêâèâàëåíòíîñòü òèïîâ çà èñêëþ÷åíèåì îòêðûòûõ
|
||||||
|
ìàññèâîâ).</li>
|
||||||
|
<li>Ìíîæåñòâà íà áàçå ïðîèçâîëüíûõ òèïîâ (<code><b>set</b> <b>of</b>
|
||||||
|
string</code>).</li>
|
||||||
|
<li>Çàïðåò èñïîëüçîâàíèÿ óêàçàòåëåé íà óïðàâëÿåìóþ ïàìÿòü.</li>
|
||||||
|
<li>Ïðîöåäóðíûå ïåðåìåííûå (äåëåãàòû) âìåñòî <code><b>procedure of</b>
|
||||||
|
object</code>.</li>
|
||||||
|
<li>Ñ áåñòèïîâûìè ôàéëàìè <b><code>file</code></b>
|
||||||
|
ìîæíî ðàáîòàòü ñ ïîìîùüþ ïðîöåäóð <code>read</code>,
|
||||||
|
<code>write</code>.</li>
|
||||||
|
<li>Ìàññèâû ìàññèâîâ îòëè÷àþòñÿ ïî òèïó îò äâóìåðíûõ ìàññèâîâ (â ÷àñòíîñòè,
|
||||||
|
çàïèñè <code>a[i][j]</code> è <code>a[i,j]</code> íåýêâèâàëåíòíû).</li>
|
||||||
|
<li>Ïåðåãðóçêà âûïîëíÿåòñÿ áåç êëþ÷åâîãî ñëîâà <b> <code>overload</code></b>.</li>
|
||||||
|
<li>Âñå êîíñòðóêòîðû èìåþò èìÿ <code>Create</code>.</li>
|
||||||
|
<li>Àâòîìàòè÷åñêîå óïðàâëåíèå ïàìÿòüþ ñ ïîìîùüþ ñáîðùèêà ìóñîðà (çà
|
||||||
|
èñêëþ÷åíèåì óêàçàòåëåé íà íåóïðàâëÿåìóþ ïàìÿòü).</li>
|
||||||
|
</ol>
|
||||||
|
<h3>Îòñóòñòâóåò</h3>
|
||||||
|
<ol>
|
||||||
|
<li>Êëþ÷åâûå ñëîâà è äèðåêòèâû <code><b>packed threadvar inline asm exports library unsafe resourcestring dispinterface in out absolute dynamic
|
||||||
|
local platform requires abstract export message resident assembler safecall
|
||||||
|
automated far near stdcall cdecl published stored contains implements
|
||||||
|
varargs default deprecated package register dispid pascal writeonly</b></code>
|
||||||
|
è ñâÿçàííûå ñ íèìè âîçìîæíîñòè.</li>
|
||||||
|
<li>Ïðèâåäåíèå òèïîâ äëÿ ïåðåìåííûõ: <code>Char(b)</code>
|
||||||
|
<code>:=</code> <code>'d'</code>.</li>
|
||||||
|
<li>Âîçìîæíîñòü ïðèñâîèòü àäðåñ ïîäïðîãðàììû óêàçàòåëþ <code>pointer</code>.</li>
|
||||||
|
<li>Çàïèñè ñ âàðèàíòàìè.</li>
|
||||||
|
<li>Ñòðîêè <code>PChar</code>.</li>
|
||||||
|
<li>Âîçìîæíîñòü èñïîëüçîâàòü îïåðàöèþ <code>@</code> äëÿ ïðîöåäóðíûõ ïåðåìåííûõ.</li>
|
||||||
|
<li>Âàðèàíòíûå òèïû.</li>
|
||||||
|
<li>Áåñòèïîâûå ïàðàìåòðû (<code><b>var</b> a; <b>
|
||||||
|
const</b> b</code>).</li>
|
||||||
|
<li>Îòêðûòûå ìàññèâû (íå ïóòàòü ñ äèíàìè÷åñêèìè!).</li>
|
||||||
|
<li>Ìåòîäû, ñâÿçàííûå ñ ñîîáùåíèÿìè (<code><b>message</b></code>).</li>
|
||||||
|
<li>Êëàññîâûå ñâîéñòâà.</li>
|
||||||
|
<li>Âëîæåííûå îïðåäåëåíèÿ êëàññîâ.</li>
|
||||||
|
<li>Êîíñòàíòû-ïîëÿ êëàññîâ.</li>
|
||||||
|
</ol>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
283
PABCNetHelp/Common/features.html
Normal file
|
|
@ -0,0 +1,283 @@
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||||||
|
</object>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||||
|
<title></title>
|
||||||
|
<link rel="StyleSheet" href="../default.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<OBJECT id=exam type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" style="position:absolute; top:-100; left:-100;">
|
||||||
|
<param name="Command" value="TCard">
|
||||||
|
<param name="Text" value="">
|
||||||
|
</OBJECT>
|
||||||
|
|
||||||
|
<H1>Коротко о главном</H1>
|
||||||
|
<p>Данный текст содержит краткий <b>обзор </b>
|
||||||
|
<b>особенностей</b> PascalABC.NET. </p>
|
||||||
|
<ul>
|
||||||
|
<li>PascalABC.NET – легковесная и мощная среда разработки программ с
|
||||||
|
подробной справочной системой, средствами подсказки по коду,
|
||||||
|
автоформатированием, встроенным отладчиком и встроенным дизайнером форм.
|
||||||
|
Интегрированная среда разработки PascalABC.NET ориентирована на создание
|
||||||
|
проектов малой и средней сложности, а также на обучение современному
|
||||||
|
программированию. </li>
|
||||||
|
<li>PascalABC.NET – мощный и современный язык
|
||||||
|
программирования. По предоставляемым возможностям он превосходит язык Delphi
|
||||||
|
и содержит практически все возможности языка C#.</li>
|
||||||
|
<li>PascalABC.NET опирается на платформу Microsoft .NET - её языковые
|
||||||
|
возможности и библиотеки, что делает его гибким, эффективным, постоянно
|
||||||
|
развивающимся. Кроме того, можно легко сочетать <span lang="ru">библиотеки</span>, разработанные на PascalABC.NET
|
||||||
|
и других .NET-языках.</li>
|
||||||
|
<li>Компилятор PascalABC.NET генерирует код, выполняющийся так же быстро,
|
||||||
|
как и код на C#, и несколько медленнее, чем код на
|
||||||
|
C++ и Delphi.</li>
|
||||||
|
<li>PascalABC.NET является представителем линейки современных языков Паскаль
|
||||||
|
вместе с Delphi XE и Oxygene.</li>
|
||||||
|
<li>Мнение, что язык Паскаль устарел и утрачивает свои
|
||||||
|
позиции, основано на представлении о старом Паскале и старых средах
|
||||||
|
программирования (например, <span lang="en-us">Free Pascal </span>с его
|
||||||
|
несовременной консольной оболочкой и языком <span lang="en-us">Delphi </span>
|
||||||
|
образца 2002 года). К сожалению, масса отечественной учебной литературы
|
||||||
|
<span lang="ru">с упорством,
|
||||||
|
достойным лучшего применения, </span>ориентируется на <span lang="ru">отживший
|
||||||
|
</span>Turbo Pascal<span lang="ru"> с древней
|
||||||
|
консольной оболочкой, бедной графической библиотекой и устаревшими
|
||||||
|
средствами объектно-ориентированного программирования, развивая у
|
||||||
|
обучающихся стойкое отвращение к языку Паскаль вообще.</span></li>
|
||||||
|
<li>PascalABC.NET расширен современными языковыми
|
||||||
|
возможностями для легкого, компактного и понятного програмирования.</li>
|
||||||
|
<li>PascalABC.NET – достаточно зрелая среда. Ее прототип – учебная система
|
||||||
|
Pascal ABC – появилась в 2002 году. PascalABC.NET – развивающаяся среда. Ведутся разработки новых языковых возможностей, новых библиотек.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Далее приводится <b>ряд программ с короткими комментариями</b>, раскрывающих
|
||||||
|
возможности и особенности языка PascalABC.NET. </p>
|
||||||
|
<p>Тексты программ располагаются в рабочей папке (по умолчанию
|
||||||
|
C:\PABCWork.NET) в подпапке Samples\!MainFeatures.</p>
|
||||||
|
<p>Для запуска программ данное окно должно быть открыто через
|
||||||
|
пункт меню "Помощь/Коротко о главном" так, чтобы оно не
|
||||||
|
полностью закрывало окно оболочки <b>PascalABC.NET</b>.</p>
|
||||||
|
<p><b>Основное</b></p>
|
||||||
|
<ol>
|
||||||
|
<li><a href="JavaScript:exam.TCard(201,0)"><b>AssignExt.pas.</b></a> Данный
|
||||||
|
пример иллюстрирует использование расширенных операторов присваивания += -=
|
||||||
|
*= /= для целых и вещественных. Оператор /= для целых, разумеется,
|
||||||
|
запрещен. </li>
|
||||||
|
<li><a href="JavaScript:exam.TCard(202,0)"><b>BlockVar.pas.</b></a> Переменные могут описываться внутри блока
|
||||||
|
begin-end
|
||||||
|
и инициализироваться при описании. Это крайне удобно для промежуточных
|
||||||
|
переменных, а в PascalABC.NET в силу особенностей
|
||||||
|
реализации еще и ускоряет доступ к переменным процентов на 30.</li>
|
||||||
|
<li><a href="JavaScript:exam.TCard(203,0)"><b>AutoVars.pas.</b></a> Если переменная инициализируется при описании, то ее тип
|
||||||
|
можно не указывать: он определяется по типу правой части (автоопределение типа). Переменную - параметр цикла for
|
||||||
|
можно описывать прямо в заголовке цикла, сочетая это с автоопределением типа.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(204,0)">SimpleNewFeatures.pas</a>.</b> Пример, объединяющий
|
||||||
|
возможности из предыдущих трех примеров.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(205,0)">WriteAll.pas</a>.</b> Процедура write
|
||||||
|
выводит любой тип.
|
||||||
|
В частности, она выводит все элементы множества. Если тип ей неизвестен, то она
|
||||||
|
выводит имя типа. </li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(206,0)">WriteFormat.pas</a>.</b> Стандартная процедура WriteFormat
|
||||||
|
позволяет осуществлять форматированный вывод. Вид форматной строки заимствуется
|
||||||
|
из .NET.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(207,0)">StandardTypes.pas</a>.</b> В этой программе приведены все стандартные целые и
|
||||||
|
вещественные типы. Программа выводит их размеры.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(208,0)">RandomDiap.pas</a>.</b> К функциям генерации случайных чисел добавилась
|
||||||
|
Random(a,b), возвращающая случайное целое в диапазоне
|
||||||
|
[a,b].
|
||||||
|
Процедуру Randomize в начале программы вызывать не надо.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(209,0)">RealExtNums.pas</a>.</b> Действия с вещественными значениями не могут в .NET
|
||||||
|
привести к переполнению. При некорректных операциях (деление на 0,
|
||||||
|
переполнение или взятие логарифма отрицательного числа) мы получим либо
|
||||||
|
значение "бесконечность", либо значение "NaN" (не число).</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(210,0)">Foreach.pas</a>.</b> Оператор
|
||||||
|
foreach предназначен для цикла по
|
||||||
|
контейнерам, таким как массивы, множества и контейнеры стандартной
|
||||||
|
библиотеки (например, List<T>). Элементы контейнера
|
||||||
|
доступны только на чтение.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(211,0)">Amp.pas</a>.</b> Ключевые слова могут использоваться в качестве имен, в
|
||||||
|
этом случае перед ними следует ставить значок &
|
||||||
|
снятия атрибута ключевого слова. Кроме того, ключевые слова могут
|
||||||
|
использоваться в качестве полей. Например, &Type
|
||||||
|
или System.Type.</li>
|
||||||
|
</ol>
|
||||||
|
<p><b>Типы</b></p>
|
||||||
|
<ol start=12>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(212,0)">CharFunc.pas</a>.</b> Символы Char хранят Unicode и поэтому занимают 2 байта. Для функций Ord и Chr оставлено, тем
|
||||||
|
не менее, прежнее действие (предполагается, что символы находятся в
|
||||||
|
Windows-кодировке). Для
|
||||||
|
работы с кодами Unicode
|
||||||
|
следует использовать OrdUnicode и
|
||||||
|
ChrUnicode.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(213,0)">StringTypes.pas</a>.</b> Строки string
|
||||||
|
занимают память переменной длины и проецируются на .NET-тип System.String. Однако, в отличие от
|
||||||
|
NET-строк они изменяемы и индексируются с 1. Для
|
||||||
|
работы со строками фиксированной длины следует использовать тип
|
||||||
|
string[n] или shortstring=string[255].
|
||||||
|
В частности, типизированные файлы допустимы только для коротких строк.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(214,0)">StringMethods.pas</a>.</b> Строки string имеют ряд
|
||||||
|
методов как .NET-классы. В этих методах
|
||||||
|
предполагается, что строки индексируются с нуля. </li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(215,0)">StringInteger.pas</a>.</b> Все типы - классы. Простые типы тоже. Поэтому преобразование строки в целое и вещественное
|
||||||
|
проще выполнять с помощью статических методов
|
||||||
|
Parse соответствующего класса (например,
|
||||||
|
integer.Parse(s)). Преобразование целого или вещественного в строку
|
||||||
|
удобнее выполнять с помощью экземплярного метода ToString
|
||||||
|
(например, r.ToString). </li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(216,0)">Enum.pas</a>.</b> Перечислимый тип позволяет обращаться к его константам
|
||||||
|
не только непосредственно, но и используя запись вида ИмяТипа.ИмяКонстанты.
|
||||||
|
Нелишне отметить, что все перечислимые типы - производные от System.Enum.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(217,0)">Sets.pas</a>.</b> Множества могут иметь произвольный базовый тип. Внутри
|
||||||
|
множество хранится как хеш-таблица, однако при выводе множества в процедуре
|
||||||
|
write его элементы упорядочиваются.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(218,0)">DynArray.pas</a>.</b> Динамические массивы array of
|
||||||
|
T представляют собой ссылки. Память под них должна выделяться либо
|
||||||
|
вызовом стандартной процедуры
|
||||||
|
SetLength, либо использованием инициализатора вида
|
||||||
|
new T[n]. Процедура SetLength
|
||||||
|
сохраняет старое содержимое массива. Динамические массивы являются классом, производным от
|
||||||
|
класса System.Array, имеющего достаточно
|
||||||
|
богатый интерфейс. Следует упомянуть прежде всего статические методы
|
||||||
|
&Array.Sort и &Array.Resize.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(219,0)">InitRecords.pas</a>.</b> В записях допустимы инициализаторы полей.
|
||||||
|
Поля записи инициализируются при создании переменной-записи.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(220,0)">UntypedFile.pas</a>.</b> Бестиповые файлы file изменены по сравнению с Delphi.
|
||||||
|
Отсутствуют процедуры BlockRead и
|
||||||
|
BlockWrite, но в бестиповой файл можно
|
||||||
|
непосредственно записывать данные разных типов. Лишь бы считывание
|
||||||
|
производилось в том же порядке.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(221,0)">PointerToRef.pas</a>.</b> Имеют место некоторые ограничения для указателей на управляемую память.
|
||||||
|
Так, указатель не может прямо или косвенно указывать на объект класса,
|
||||||
|
память для которого выделена вызовом конструктора.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(222,0)">Pointers.pas</a> и <a href="JavaScript:exam.TCard(22201,0)">References.pas</a>.</b> Указатели утрачивают свои позиции. Вместо них мы
|
||||||
|
рекомендуем активно использовать ссылки.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(223,0)">StructTypeEquiv.pas</a>.</b> В отличие от Delphi,
|
||||||
|
для некоторых типов имеет место структурная, а не именная эквивалентность
|
||||||
|
типов. Так, структурная эквивалентность имеет место для динамических
|
||||||
|
массивов, указателей, множеств и процедурных типов.
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
<p><b>Подпрограммы</b></p>
|
||||||
|
<ol start=24>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(224,0)">FuncParams.pas</a>.</b> Подпрограммы с переменным числом параметров делаются
|
||||||
|
легко добавлением ключевого слова params
|
||||||
|
перед параметром - динамическим массивом. Такой параметр должен быть
|
||||||
|
последним в списке.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(225,0)">Overload.pas</a>.</b> Перегрузка имен подпрограмм осуществляется без ключевого
|
||||||
|
слова overload.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(226,0)">ProcVars.pas</a>.</b> Процедурные переменные могут "накапливать" действия при
|
||||||
|
помощи оператора +=. Эти действия можно отключать при помощи
|
||||||
|
оператора -=. Процедурные переменные могут инициализироваться не только
|
||||||
|
обычными подпрограммами, но и статическими и экземплярными методами класса.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(227,0)">SwapT.pas</a>.</b> Обобщенные подпрограммы имеют простой синтаксис и
|
||||||
|
используются сразу наряду с обычными: procedure
|
||||||
|
Swap<T>(var x,y: T);</li>
|
||||||
|
</ol>
|
||||||
|
<p><b>Модули</b></p>
|
||||||
|
<ol start=28>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(228,0)">SystemUnitTest.pas</a>.</b> Системный модуль имеет название PABCSystem, а не System, как в
|
||||||
|
Delphi, и подключается неявно первым в списке
|
||||||
|
uses. Причина такого именования состоит в том, что
|
||||||
|
важнейшее пространство имен .NET имеет имя
|
||||||
|
System. Системный модуль
|
||||||
|
объединяет многие подпрограммы модулей System,
|
||||||
|
Math и Utils языка
|
||||||
|
Delphi. Данная программа иллюстрирует пересечение имен во модуле
|
||||||
|
PABCSystem и пространстве имен
|
||||||
|
System.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(229,0)">MainProgram.pas</a> и
|
||||||
|
<a href="JavaScript:exam.TCard(22901,0)">MyUnit.pas</a>.</b> Модуль может иметь упрощенный синтаксис (без
|
||||||
|
деления на раздел интерфейса и раздел реализации), что удобно для начального
|
||||||
|
обучения. В этом случае все описанные имена попадают в раздел интерфейса
|
||||||
|
модуля.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(230,0)">SystemUnitTest.pas</a>.</b> Для использования пространств имен .NET
|
||||||
|
применяется тот же синтаксис, что и при подключении модулей:
|
||||||
|
пространства имен .NET указываются в списке uses.
|
||||||
|
Порядок поиска имен такой же, как и в Delphi -
|
||||||
|
справа налево в списке uses, модуль
|
||||||
|
PABCSystem просматривается последним.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(231,0)">Main.pas</a> и
|
||||||
|
<a href="JavaScript:exam.TCard(23101,0)">MyDll.pas</a>.</b> В PascalABC.NET легко создать и использовать
|
||||||
|
dll. Библиотека dll по-существу представляет собой
|
||||||
|
модуль, где вместо ключевого слова unit
|
||||||
|
используется слово library. Для подключения
|
||||||
|
dll к другой программе используется директива
|
||||||
|
компилятора reference. </li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(232,0)">CallCS.pas</a>.</b> PascalABC.NET -
|
||||||
|
полноценный .NET-язык, легко совмещаемый с другими
|
||||||
|
.NET-языками. В данном примере показывается, как в программе
|
||||||
|
на PascalABC.NET вызвать функцию из dll, созданной на
|
||||||
|
C#.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(233,0)">CallNative.pas</a>.</b> PascalABC.NET позволяет легко вызывать функции
|
||||||
|
из обычных dll. </li>
|
||||||
|
</ol>
|
||||||
|
<p><b>Стандартные графические библиотеки</b></p>
|
||||||
|
<ol start=34>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(234,0)">GraphABCTest.pas</a>.</b> Графическая библиотека
|
||||||
|
GraphABC заточена под легкое обучение программированию графики. Она
|
||||||
|
скрывает большинство сложностей программирования графики: сама осуществляет
|
||||||
|
перерисовку графического окна в нужный момент и заботится о синхронизации
|
||||||
|
рисования в нескольких обработчиках. Кроме того, графические примитивы -
|
||||||
|
процедурные, а значит, не надо создавать многочисленные классы, как в
|
||||||
|
NET. И еще можно писать графические команды сразу
|
||||||
|
после begin основной программы, то есть использовать графику в
|
||||||
|
несобытийных приложениях.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(235,0)">MouseEvents.pas</a>.</b> Для графических приложений можно
|
||||||
|
использовать простейшие события мыши и клавиатуры, реализованные как
|
||||||
|
глобальные процедурные переменные.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(236,0)">ABC.pas</a>.</b> Библиотека векторных графических объектов ABCObjects используется нами
|
||||||
|
для раннего обучения школьников основам объектно-ориентированного
|
||||||
|
программирования. Однако, ее вполне можно использовать для написания
|
||||||
|
несложных графических обучающе-игровых приложений.</li>
|
||||||
|
</ol>
|
||||||
|
<p><b>Классы</b></p>
|
||||||
|
<ol start=37>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(237,0)">AllFromObject.pas</a>.</b> Все классы - наследники Object, все типы - классы.
|
||||||
|
У каждой переменной можно узнать тип, вызвав метод
|
||||||
|
GetType. Операция typeof для типа возвращает System.Type.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(238,0)">WriteRecord.pas</a>.</b> Переопределив метод ToString в классе или
|
||||||
|
записи, мы получаем возможность выводить их значения в процедуре
|
||||||
|
writeln</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(239,0)">ClassConstructor.pas</a>.</b> Для статических методов и полей используется ключевое
|
||||||
|
слово class. Статические конструкторы используются для нетривиальной
|
||||||
|
инициализации статических полей.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(240,0)">PersonInternal.pas</a>.</b> Новый синтаксис конструкторов использует ключевое слово
|
||||||
|
new и является предпочтительным. По этой
|
||||||
|
причине все конструкторы, определенные в старом стиле, должны иметь имя
|
||||||
|
Create. Описание методов может производиться непосредственно внутри классов и записей
|
||||||
|
(как в C++, C# и
|
||||||
|
Java)</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(241,0)">Records.pas</a>.</b> Методы и конструкторы в записях можно использовать так же, как и в
|
||||||
|
классах. От записей нельзя наследовать и записи нельзя наследовать.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(242,0)">Boxing.pas</a>.</b> При присваивании размерного типа объекту типа Object происходит упаковка. Для
|
||||||
|
распаковки следует использовать явное приведение типа.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(243,0)">GarbageCollection.pas</a>.</b> Деструкторы отсутствуют. Автоматическая сборка мусора
|
||||||
|
для возврата памяти, распределенной объектной переменной, требует, чтобы на
|
||||||
|
эту память никто более не ссылался, прямо или косвенно. Поэтому для
|
||||||
|
освобождения памяти обычно достаточно присвоить объектной переменной nil.
|
||||||
|
</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(244,0)">OperatorOverloading.pas</a>.</b> Как и в C++ и C#, в PascalABC.NET можно перегружать
|
||||||
|
знаки операций для записей и классов.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(245,0)">Interf.pas</a>.</b> Интерфейсы
|
||||||
|
семантически совпадают с интерфейсами в C# и Java. Сложная
|
||||||
|
реализация интерфейсов Delphi на основе
|
||||||
|
COM отвергнута.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(246,0)">Stack.pas</a>.</b> Обобщенные классы (generics)
|
||||||
|
позволяют создавать классы, параметризованные одним или несколькими типами.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(247,0)">Where.pas</a>.</b> Можно задавать ограничения на типы параметров обобщенных классов.
|
||||||
|
Ограничения бывают трех сортов: наличие у типа-параметра конструктора по
|
||||||
|
умолчанию, наследование его от конкретного класса или реализация интерфейса.</li>
|
||||||
|
</ol>
|
||||||
|
<p><b>Стандартная </b><b>библиотека .NET</b></p>
|
||||||
|
<ol start=48>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(248,0)">DateTime.pas</a>.</b> Данный пример иллюстрирует применение класса DateTime из стандартной библиотеки
|
||||||
|
.NET.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(249,0)">LinkedList.pas</a>.</b> Данный пример иллюстрирует использование контейнерных
|
||||||
|
классов из стандартной библиотеки .NET.</li>
|
||||||
|
<li><b><a href="JavaScript:exam.TCard(250,0)">WinFormWithButton.pas</a>.</b> Данный пример иллюстрирует создание оконного приложения.</li>
|
||||||
|
</ol>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
114
PABCNetHelp/Common/main.html
Normal file
|
|
@ -0,0 +1,114 @@
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||||||
|
<param name="Keyword" value="PascalABC">
|
||||||
|
</object>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||||
|
<title></title>
|
||||||
|
<link rel="StyleSheet" href="../default.css">
|
||||||
|
<style type="text/css">
|
||||||
|
.auto-style1 {
|
||||||
|
color: #FF0000;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<OBJECT id=exam type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" style="position:absolute; top:-100; left:-100;">
|
||||||
|
<param name="Command" value="TCard">
|
||||||
|
<param name="Text" value="">
|
||||||
|
</OBJECT>
|
||||||
|
|
||||||
|
<H1>Система PascalABC.NET</H1>
|
||||||
|
|
||||||
|
<p><strong>PascalABC.NET</strong> <font face="Arial">–</font> это
|
||||||
|
<span class="auto-style1"><strong>система
|
||||||
|
программирования и язык Pascal нового поколения</strong></span> для платформы Microsoft .NET.
|
||||||
|
Язык <strong>PascalABC.NET</strong> содержит все основные
|
||||||
|
элементы
|
||||||
|
современных языков программирования:
|
||||||
|
<a href="../LangGuide/Modules/indexmodule.html">модули</a>,
|
||||||
|
<a href="../LangGuide/Classes/index_classes.html">классы</a>,
|
||||||
|
<a href="../LangGuide/Classes/operoverloading.html">перегрузку операций</a>,
|
||||||
|
<a href="../LangGuide/Interfaces/indexinterf.html">интерфейсы</a>,
|
||||||
|
<a href="../LangGuide/ExceptionHandling/Overview.html">исключения</a>,
|
||||||
|
<a href="../LangGuide/Generics/index_generics.html">обобщенные классы</a>,
|
||||||
|
<a href="../LangGuide/MemoryManagement/index_memory.html">сборку мусора</a>,
|
||||||
|
<a href="../LangGuide/FuncProgramming/lambdas.html">лямбда-выражения</a>, а
|
||||||
|
также некоторые средства параллельности, в том числе
|
||||||
|
<a href="../LangGuide/OpenMP/indexopenmp.html">директивы OpenMP</a>. Система <b>PascalABC.NET</b> включает
|
||||||
|
в себя также простую интегрированную среду, ориентированную на эффективное
|
||||||
|
обучение современному программированию. </p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="../LangGuide/index_lang_guide.html">Описание языка <strong>PascalABC.NET</strong></a>.</li>
|
||||||
|
<li><a href="AdvantagePABC.html">Преимущества <b>PascalABC.NET</b></a> для
|
||||||
|
разработки программ и для обучения. </li>
|
||||||
|
<li><a href="PABCNETvsDelphi.html">Отличия <b>PascalABC.NET</b> от Delphi (Object
|
||||||
|
Pascal)</a>.
|
||||||
|
</li>
|
||||||
|
<li>Примеры, иллюстрирующие основные особенности <b>PascalABC.NET</b>,
|
||||||
|
находятся в меню "Помощь/Коротко о главном".</li>
|
||||||
|
</ul>
|
||||||
|
<p>Язык Паскаль был разработан швейцарским ученым Никлаусом Виртом в 1970 г. как
|
||||||
|
язык со строгой типизацией и интуитивно понятным синтаксисом. В 80-е годы
|
||||||
|
наиболее известной реализацией стал компилятор Turbo Pascal
|
||||||
|
фирмы Borland, в 90-е ему на смену пришла среда
|
||||||
|
программирования Delphi, которая стала одной из
|
||||||
|
лучших сред для быстрого создания приложений под Windows.
|
||||||
|
Delphi ввела в язык Паскаль ряд удачных объектно-ориентированных расширений,
|
||||||
|
обновленный язык получил название Object Pascal. С версии Delphi 7
|
||||||
|
<span lang="ru">язык </span>Delphi Object Pascal<span lang="ru"> стал называться
|
||||||
|
просто </span>Delphi<span lang="ru">. </span>Из
|
||||||
|
альтернативных реализаций Object Pascal следует отметить
|
||||||
|
многоплатформенный open source компилятор Free
|
||||||
|
Pascal.</p>
|
||||||
|
<p>Создание <strong>PascalABC.NET</strong>
|
||||||
|
<font face="Arial">диктовалось двумя основными причинами:</font> устаревание
|
||||||
|
стандартного языка Pascal и систем, построенных на его основе (Free Pascal), а
|
||||||
|
также необходимость в современной простой, бесплатной и мощной
|
||||||
|
интегрированной среде
|
||||||
|
программирования.</p>
|
||||||
|
<p> <strong>PascalABC.NET</strong> опирается на передовую платформу
|
||||||
|
программирования Microsoft.NET, которая обеспечивает язык <b>PascalABC.NET</b>
|
||||||
|
огромным количеством стандартных библиотек и позволяет легко
|
||||||
|
сочетать его с другими .NET-языками: C#,
|
||||||
|
Visual Basic.NET, управляемый C++, Oxygene и др. Платформа .NET предоставляет также такие языковые
|
||||||
|
средства как единый механизм обработки исключений, единый механизм управления
|
||||||
|
памятью в виде <em>сборки мусора</em>, а также возможность свободного использования классов, наследования,
|
||||||
|
полиморфизма и интерфейсов между модулями, написанными на разных .NET-языках.
|
||||||
|
О том, что такое платформа Microsoft.NET, о ее преимуществах для программирования
|
||||||
|
и для обучения можно прочитать <a href="Net.html">здесь</a>.</p>
|
||||||
|
<p>Язык <b>PascalABC.NET</b> близок к реализации Delphi (Object Pascal). В нем
|
||||||
|
отсутствует ряд <a href="PABCNETvsDelphi.html">специфических языковых конструкций Delphi</a>,
|
||||||
|
некоторые конструкции изменены. Кроме этого,
|
||||||
|
добавлен ряд возможностей: имеется автоопределение типа при описании, можно описывать переменные внутри блока, имеются операции <code>+=</code>, <code>
|
||||||
|
-=</code>, <code>*=</code>, <code>/=</code>, методы можно описывать непосредственно в теле класса или
|
||||||
|
записи, можно пользоваться встроенными в стандартные типы методами и свойствами, память под объекты управляется
|
||||||
|
<a href="../LangGuide/MemoryManagement/index_memory.html">сборщиком мусора</a> и
|
||||||
|
не требует явного освобождения, множества <b>
|
||||||
|
<code>set</code></b> могут быть
|
||||||
|
созданы на основе произвольных типов, введен операторы <code><b>foreach</b></code>, переменные
|
||||||
|
циклов <b><code>for</code></b> и <b><code>foreach</code></b>
|
||||||
|
можно описывать непосредственно в заголовке цикла, имеются
|
||||||
|
обобщенные классы и подпрограммы (generics), последовательности, кортежи, срезы, лямбда-выражения и др.</p>
|
||||||
|
<p>Близким по идеологии к <strong>PascalABC.NET</strong>
|
||||||
|
является язык RemObjects Oxygene (Object Pascal 21 века). Однако он сильно изменен в
|
||||||
|
сторону .NET: нет глобальных описаний, все описания
|
||||||
|
помещаются в класс, содержащий <span lang="ru">статический</span> метод Main,
|
||||||
|
отсутствует ряд стандартных подпрограмм языка Паскаль. Кроме того, система
|
||||||
|
RemObjects Oxygene - платная
|
||||||
|
и не содержит собственной оболочки (встраивается в Visual Studio<span lang="ru">
|
||||||
|
и другие </span>IDE), что практически делает невозможным ее использование в сфере образования.</p>
|
||||||
|
<p>Интегрированная среда <strong>PascalABC.NET </strong>
|
||||||
|
обеспечивает подсветку синтаксиса, подсказку по коду (подсказка по точке,
|
||||||
|
подсказка параметров подпрограмм, всплывающая подсказка по коду), форматирование
|
||||||
|
текста программы по запросу, переход к определению и реализации имени, элементы
|
||||||
|
рефакторинга.</p>
|
||||||
|
<p>Все права на систему программирования <b>PascalABC.NET</b>
|
||||||
|
принадлежат PascalABCCompiler Team (web-сайт
|
||||||
|
<a href="http://pascalabc.net/" target=_blank>http://pascalabc.net</a>). </p>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
6
PABCNetHelp/CreateHelp.bat
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
cd PABCSystemDocGen
|
||||||
|
!AllSteps.exe
|
||||||
|
cd ..
|
||||||
|
"C:\Program Files (x86)\HTML Help Workshop\hhc.exe" PascalABCNET.hhp
|
||||||
|
copy PascalABCNET.chm ..\bin\PascalABCNET.chm
|
||||||
|
copy PascalABCNET.chm ..\Release\PascalABCNET.chm
|
||||||
41
PABCNetHelp/Examples/GraphABC/NonBlinkAnim1.html
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
<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>
|
||||||
|
Данная программа иллюстрирует применение процедур <code>LockDrawing</code> и
|
||||||
|
<code>Redraw</code> для реализации анимации без мерцания:
|
||||||
|
<blockquote>
|
||||||
|
<pre>
|
||||||
|
<code><b>uses</b> GraphABC;
|
||||||
|
<b>begin</b>
|
||||||
|
<a href="../../PABCUnits/GraphABC/gr_LockDrawing.html">LockDrawing</a>;
|
||||||
|
<b>for </b><b>var</b> i:=1 to 500 do
|
||||||
|
<b>begin</b>
|
||||||
|
Window.Clear;
|
||||||
|
Brush.Color := clGreen;
|
||||||
|
Ellipse(i,100,i+100,200);
|
||||||
|
<a href="../../PABCUnits/GraphABC/gr_LockDrawing.html">Redraw</a>;
|
||||||
|
Sleep(1);
|
||||||
|
<b>end</b>;
|
||||||
|
<b>end</b>.</code>
|
||||||
|
</pre>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Основная идея состоит в следующем: отключим рисование на экране, вызвав <code>
|
||||||
|
LockDrawing</code> (рисование будет осуществляться только во внеэкранном
|
||||||
|
буфере), после чего будем всякий раз формировать новый кадр изображения и
|
||||||
|
выводить его целиком на экран, вызывая <code>Redraw</code>. При вызове <code>
|
||||||
|
Redraw</code> перерисовывается все графическое окно,
|
||||||
|
поэтому скорость анимации ограничена скоростью вывода внеэкранного буфера на
|
||||||
|
экран.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
37
PABCNetHelp/Examples/GraphABCEvents/GEv1.html
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
<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>
|
||||||
|
Äàííàÿ ïðîãðàììà îñóùåñòâëÿåò ðèñîâàíèå ìûøüþ â ãðàôè÷åñêîì îêíå:
|
||||||
|
<blockquote>
|
||||||
|
<pre>
|
||||||
|
<code><b>uses</b> GraphABC;<b>
|
||||||
|
<span style="font-size: 4pt">
|
||||||
|
</span>procedure</b> MouseDown(x,y,mb: integer);
|
||||||
|
<b>begin</b>
|
||||||
|
MoveTo(x,y);
|
||||||
|
<b>end</b>;
|
||||||
|
<b><span style="font-size: 4pt">
|
||||||
|
</span>procedure</b> MouseMove(x,y,mb: integer);
|
||||||
|
<b>begin</b>
|
||||||
|
<b>if</b> mb=1 <b>then</b> LineTo(x,y);
|
||||||
|
<b>end</b>;
|
||||||
|
<b><span style="font-size: 4pt">
|
||||||
|
</span>begin
|
||||||
|
</b> // Ïðèâÿçêà îáðàáîò÷èêîâ ê ñîáûòèÿì
|
||||||
|
<a href="../../PABCUnits/GraphABC/gr_events.html">OnMouseDown</a> := MouseDown;
|
||||||
|
<a href="../../PABCUnits/GraphABC/gr_events.html">OnMouseMove</a> := MouseMove
|
||||||
|
<b>end</b>.</code>
|
||||||
|
</pre>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
37
PABCNetHelp/Examples/GraphABCEvents/GEv2.html
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
<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>
|
||||||
|
Äàííàÿ ïðîãðàììà îñóùåñòâëÿåò ïåðåìåùåíèå ãðàôè÷åñêîãî îêíà ñ ïîìîùüþ êëàâèàòóðû:
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<pre>
|
||||||
|
<code><b>uses</b> GraphABC;
|
||||||
|
<b><span style="font-size: 4pt">
|
||||||
|
</span>procedure</b> KeyDown(Key: integer);
|
||||||
|
<b>begin</b>
|
||||||
|
<b> case</b> Key <b>of</b>
|
||||||
|
<a href="../../PABCUnits/GraphABC/gr_VK.html">VK_Left</a>: Window.Left := Window.Left - 2;
|
||||||
|
<a href="../../PABCUnits/GraphABC/gr_VK.html">VK_Right</a>: Window.Left := Window.Left + 2;
|
||||||
|
<a href="../../PABCUnits/GraphABC/gr_VK.html">VK_Up</a>: Window.Top := Window.Top - 2;
|
||||||
|
<a href="../../PABCUnits/GraphABC/gr_VK.html">VK_Down</a>: Window.Top := Window.Top + 2;
|
||||||
|
<b> end</b>;
|
||||||
|
<b>end</b>;
|
||||||
|
<b><span style="font-size: 4pt">
|
||||||
|
</span>begin</b>
|
||||||
|
// Ïðèâÿçêà îáðàáîò÷èêîâ ê ñîáûòèÿì
|
||||||
|
<a href="../../PABCUnits/GraphABC/gr_events.html">OnKeyDown</a> := KeyDown;
|
||||||
|
<b>end</b>.</code>
|
||||||
|
</pre>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
37
PABCNetHelp/Examples/Timers/Timer1.html
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
<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>
|
||||||
|
Äàííàÿ ïðîãðàììà âûâîäèò 1 êàæäûå 100 ìèëëèñåêóíä<span lang="en-us"> </span>â
|
||||||
|
òå÷åíèå 3 ñåêóíä:<blockquote>
|
||||||
|
<pre>
|
||||||
|
<code><b>uses</b> <span lang="en-us">Timers</span>;<b>
|
||||||
|
<span style="font-size: 4pt">
|
||||||
|
</span>procedure</b> <span lang="en-us">TimerProc</span>;
|
||||||
|
<b>begin</b>
|
||||||
|
<span lang="en-us">write(1)</span>;
|
||||||
|
<b>end</b>;
|
||||||
|
<b><span style="font-size: 4pt">
|
||||||
|
|
||||||
|
</span>begin
|
||||||
|
</b> <span lang="en-us"><b>var</b> t := <b>new</b> Timer(100,TimerProc);
|
||||||
|
t.Start;
|
||||||
|
Sleep(3000);
|
||||||
|
</span><b>end</b>.</code>
|
||||||
|
</pre>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Âûçîâ <code>Sleep</code><span lang="en-us"> </span>çäåñü îáÿçàòåëåí, èíà÷å
|
||||||
|
ïðîãðàììà ïîñëå ñîçäàíèÿ òàéìåðà ñðàçó çàêîí÷èòñÿ, è îáðàáîò÷èê òàéìåðà íè ðàçó
|
||||||
|
íå ñðàáîòàåò.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
166
PABCNetHelp/ForEducation/CheckedTasks/checkedtasks1.html
Normal file
|
|
@ -0,0 +1,166 @@
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||||
|
<title></title>
|
||||||
|
<link rel="StyleSheet" href="../../default.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<H1>Задание Begin3 из электронного задачника Programming Taskbook</H1>
|
||||||
|
<hr>
|
||||||
|
<p>Задание Begin3 относится к самой первой группе задачника, посвященной
|
||||||
|
знакомству с вводом-выводом и оператором присваивания.
|
||||||
|
Приведем формулировку этого задания.
|
||||||
|
</p>
|
||||||
|
<p><b>Begin3</b>. Даны стороны
|
||||||
|
прямоугольника <code>a</code> и <code>b</code>.
|
||||||
|
Найти его площадь <code>S=a*b</code> и периметр <code>P=2*(a+b)</code>. </p>
|
||||||
|
<p>Далее по шагам опишем сценарий выполнения задания в системе
|
||||||
|
<b>PascalABC.NET</b>.</p>
|
||||||
|
<hr>
|
||||||
|
<p><font color="#0000FF"><b><i>Шаг 1.</i> </b></font>Для
|
||||||
|
выполнения заданий из электронного задачника подключим к программе модуль
|
||||||
|
<code>PT4</code> и вызовем в
|
||||||
|
начале программы процедуру <code>Task</code>, передав ей в
|
||||||
|
качестве параметра имя задания:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><b>uses</b> PT4;<br><b>begin</b><br> Task('Begin3');<br>
|
||||||
|
<br><b>end</b>.</code>
|
||||||
|
</blockquote>
|
||||||
|
<p>Заметим, что эту программу не обязательно набирать вручную. Для автоматической генерации данной программы
|
||||||
|
выполним следующие действия. Нажмем кнопку
|
||||||
|
<img border="0" src="../PT4/gif/load.gif" width="16" height="17">. На экране появится окно
|
||||||
|
программного модуля <b>PT4Load</b>, позволяющего создать программу-заготовку для требуемого задания:
|
||||||
|
</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="../PT4/gif/pt4load.png">
|
||||||
|
</blockquote>
|
||||||
|
<p>Наберем в поле ввода «Задание»
|
||||||
|
текст <code>Begin3</code> и нажмем <b>Enter</b>.
|
||||||
|
После этого указанный выше текст сгенерируется автоматически и сохранится в
|
||||||
|
файле Begin3.pas в рабочем каталоге
|
||||||
|
системы <b>PascalABC.NET</b>
|
||||||
|
(по умолчанию это каталог C:\PABCWork.NET).</p>
|
||||||
|
<p>Запустим программу (нажав клавишу <b>F9</b>),
|
||||||
|
чтобы увидеть на экране текст задания:<a name="s1"></a></p>
|
||||||
|
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Begin3-1.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p>Запуск нашей программы был признан <i>ознакомительным</i> (и поэтому правильность решения не анализировалась),
|
||||||
|
так как в ходе ее выполнения не было совершено ни одной операции ввода-вывода.
|
||||||
|
</p>
|
||||||
|
<hr>
|
||||||
|
<p><b><font color="#0000FF"><i>Шаг 2.</i> </font></b>Переменные
|
||||||
|
<code>a</code> и <code>b</code>
|
||||||
|
считываются из полей ввода, выделенных желтым цветом, с помощью обычной процедуры <code>read</code>. Закроем окно задачника
|
||||||
|
и изменим программу следующим образом:
|
||||||
|
</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><b>uses</b> PT4;<br><b>var </b>a, b: integer;<b><br>
|
||||||
|
begin</b><br> Task('Begin3');<br>
|
||||||
|
read(a, b);<br>
|
||||||
|
<b>end</b>.</code>
|
||||||
|
</blockquote>
|
||||||
|
<p>После запуска этого вариант программы окно задачник примет вид:</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Begin3-2.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p>Как видим, исходные данные поменялись и появилось сообщение
|
||||||
|
об ошибке — переменные <code>a</code> и <code>b</code> должны быть объявлены как
|
||||||
|
вещественные. Если запуск программы не является ознакомительным, то в окне задачника
|
||||||
|
появляется раздел с полученными результатами
|
||||||
|
(в нашем случае он не содержит ни одного числа), а также панель индикаторов,
|
||||||
|
показывающих количество введенных и выведенных данных, а также число успешных тестовых запусков
|
||||||
|
программы.
|
||||||
|
</p>
|
||||||
|
<hr>
|
||||||
|
<p><font color="#0000FF"><b><i>Шаг 3.</i> </b></font>Исправим тип исходных данных:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><b>uses</b> PT4;<br><b>var </b>a, b: real;<b><br>
|
||||||
|
begin</b><br> Task('Begin3');<br>
|
||||||
|
read(a, b);<br>
|
||||||
|
<b>end</b>.</code>
|
||||||
|
</blockquote>
|
||||||
|
<p>Вновь запустим программу:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Begin3-3.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Электронный задачник предупреждает, что не выведен результат.
|
||||||
|
Обратите внимание на то, что для сообщений о различных видах ошибок используются
|
||||||
|
разные цвета (например, фиолетовый для ошибок, связанных с несоответствием типов,
|
||||||
|
и оранжевый для ошибок, связанных с вводом/выводом недостаточного числа данных).
|
||||||
|
</p>
|
||||||
|
<hr>
|
||||||
|
<p><font color="#0000FF"><b><i>Шаг 4.</i> </b></font>Проведем
|
||||||
|
вычисления и выведем результирующие данные, но в неверном порядке:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><b>uses</b> PT4;<br><b>var </b>a, b, S, P: real;<b><br>
|
||||||
|
begin</b><br> Task('Begin3');<br>
|
||||||
|
read(a, b);<br>
|
||||||
|
S := a * b;<br>
|
||||||
|
P := 2 * (a + b);<br>
|
||||||
|
write(P, S)<br>
|
||||||
|
<b>end</b>.</code>
|
||||||
|
</blockquote>
|
||||||
|
<p>Вновь запустим программу:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Begin3-4.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p>Мы видим, что все требуемые исходные данные введены, все результаты выведены,
|
||||||
|
однако полученные результаты имеют неверные значения.
|
||||||
|
В случае ошибочного решения окно задачника всегда содержит раздел с примером
|
||||||
|
верного решения, чтобы можно было сравнить полученные и правильные результаты.</p>
|
||||||
|
<hr>
|
||||||
|
<p><font color="#0000FF"><b><i>Шаг 5.</i> </b></font>Исправим
|
||||||
|
ошибку:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><b>uses</b> PT4;<br><b>var </b>a, b, S, P: real;<b><br>begin</b><br> Task('Begin3');<br> read(a, b);<br>
|
||||||
|
S := a * b;<br>
|
||||||
|
P := 2 * (a + b);<br>
|
||||||
|
write(S, P)<br><b>end</b>.</code>
|
||||||
|
</blockquote>
|
||||||
|
<p>После запуска программы увидим следующее окно:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Begin3-5.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Если решение является правильным, то дополнительный раздел с примером правильного
|
||||||
|
решения в окне не выводится.</p>
|
||||||
|
<hr>
|
||||||
|
<p><font color="#0000FF"><b><i>Шаг 6.</i> </b></font>Чтобы задание считалось выполненным, запустим
|
||||||
|
программу еще два раза. В результате в окне задачника появится сообщение «Задание
|
||||||
|
выполнено!»: </p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Begin3-6.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Поздравляем! Задание <code>Begin3</code>
|
||||||
|
под руководством электронного задачника выполнено! Результаты выполнения заданий можно просмотреть,
|
||||||
|
щелкнув мышью на метке «Результаты (F2)», расположенной в правом верхнем
|
||||||
|
углу окна задачника, или нажав клавишу <b>F2</b>.
|
||||||
|
После закрытия окна задачника и возврата в среду PascalABC.NET результаты можно отобразить на экране,
|
||||||
|
нажав кнопку <img border="0" src="../PT4/gif/results.gif" width="16" height="17"> или нажав клавиатурную
|
||||||
|
комбинацию <b>Shift+Ctrl+R</b>.
|
||||||
|
</p>
|
||||||
|
<p> </p>
|
||||||
|
<p> </p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
101
PABCNetHelp/ForEducation/CheckedTasks/checkedtasks2.html
Normal file
|
|
@ -0,0 +1,101 @@
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||||
|
<title></title>
|
||||||
|
<link rel="StyleSheet" href="../../default.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<H1>Задание a1 для исполнителя Робот</H1>
|
||||||
|
<hr>
|
||||||
|
<p>Задание a1 относится к вводным заданиям, посвященным
|
||||||
|
знакомству с основными командами исполнителя Робот.
|
||||||
|
Приведем формулировку этого задания.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><b>a1</b>. Закрасить помеченные клетки.</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/RBa1-1.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p>Опишем сценарий решения задания.</p>
|
||||||
|
<hr>
|
||||||
|
<p><font color="#0000FF"><b><i>Шаг 1.</i> </b></font>Подключим
|
||||||
|
к программе модуль <code>Robot</code> и вызовем в
|
||||||
|
начале программы процедуру <code>Task</code>, передав ей в
|
||||||
|
качестве параметра имя задания:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><b>uses</b> Robot;<br><b>begin</b><br> Task('a1');<br>
|
||||||
|
<br><b>end</b>.</code>
|
||||||
|
</blockquote>
|
||||||
|
<p>Чтобы не набирать указанный текст, нажмем кнопку
|
||||||
|
<img border="0" src="../PT4/gif/load.gif" width="16" height="17"> и
|
||||||
|
в появившемся окне наберем имя задания <code>RBa1</code> (префикс <code>RB</code>
|
||||||
|
означает, что решается задача для Робота). Запустим программу (нажав клавишу <b>F9</b>), чтобы увидеть окно Робота с
|
||||||
|
графическим изображением задания:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/RBa1-2.png">
|
||||||
|
</blockquote>
|
||||||
|
<hr>
|
||||||
|
<p><font color="#0000FF"><b><i>Шаг 2.</i> </b></font>
|
||||||
|
Наберем несколько команд Робота: </p>
|
||||||
|
<blockquote>
|
||||||
|
<code><b>uses</b> Robot;<br><b>begin</b><br> Task('a1');<br>
|
||||||
|
Right;Right;Right;Right;<br><b>end</b>.</code>
|
||||||
|
</blockquote>
|
||||||
|
<p>Запустим программу, после чего нажмем <b>Enter</b> или кнопку
|
||||||
|
«Пуск» чтобы Робот начал выполнять
|
||||||
|
заложенную в него программу:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/RBa1-3.png">
|
||||||
|
</blockquote>
|
||||||
|
<p>После окончания движения Робота осуществляется проверка, все
|
||||||
|
ли помеченные клетки закрашены и находится ли Робот в конечной клетке.
|
||||||
|
Если проверка дает отрицательный ответ, то задание не считается выполненным.</p>
|
||||||
|
<hr>
|
||||||
|
<p><font color="#0000FF"><b><i>Шаг 3.</i> </b></font>
|
||||||
|
Выполним неверную команду, в результате которой Робот врежется в
|
||||||
|
стенку:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><b>uses</b> Robot;<br><b>begin</b><br> Task('a1');<br>
|
||||||
|
Right;Right;Right;Right;<br>
|
||||||
|
Up;Up;Left;<br><b>end</b>.</code>
|
||||||
|
</blockquote>
|
||||||
|
<p>После запуска программы и нажатия <b>Enter</b>
|
||||||
|
получим следующее окно:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/RBa1-4.png">
|
||||||
|
</blockquote>
|
||||||
|
<p>Заметим, что квадратный индикатор состояния Робота окрасился в красный цвет, а
|
||||||
|
последняя команда <code>Left</code> не выполнилась, так как
|
||||||
|
после фатальной ошибки Робот прекратил выполнение задания.</p>
|
||||||
|
<hr>
|
||||||
|
<p><font color="#0000FF"><b><i>Шаг 4.</i> </b></font>
|
||||||
|
Исправим ошибку и выполним задание до конца:</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<code><b>uses</b> Robot;<br><b>begin</b><br> Task('a1');<br>
|
||||||
|
Right;Right;Right;Right;<br>
|
||||||
|
Up;<br>
|
||||||
|
Left;Paint;<br>
|
||||||
|
Left;Paint;<br>
|
||||||
|
Left;Paint;<br>
|
||||||
|
Left;Paint;<br>
|
||||||
|
Left;<br>
|
||||||
|
<b>end</b>.</code>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/RBa1-5.png">
|
||||||
|
</blockquote>
|
||||||
|
<p>Последний рисунок не нуждается в комментариях.</p>
|
||||||
|
<p>Заметим, что сведения о выполненных заданиях
|
||||||
|
можно просмотреть, нажав кнопку
|
||||||
|
<img border="0" src="../PT4/gif/results.gif" width="16" height="17">.</p>
|
||||||
|
<p> </p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
674
PABCNetHelp/ForEducation/CheckedTasks/ctexam.html
Normal file
|
|
@ -0,0 +1,674 @@
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||||
|
<title></title>
|
||||||
|
<link rel="StyleSheet" href="../../default.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<a name="main"></a>
|
||||||
|
|
||||||
|
<h1>Задания, связанные с ЕГЭ по информатике
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h2>Пример 1. Простая задача на реализацию базовых алгоритмов
|
||||||
|
</h2>
|
||||||
|
<hr>
|
||||||
|
<p>Группа заданий ExamBegin посвящена базовым алгоритмическим задачам,
|
||||||
|
включенным в кодификатор ЕГЭ по информатике. Процесс выполнения подобных заданий мы рассмотрим на примере
|
||||||
|
одной из простых задач, связанных с нахождением максимумов и минимумов из двух, трех или четырех чисел
|
||||||
|
без использования массивов и циклов.
|
||||||
|
</p>
|
||||||
|
<p class="task">ExamBegin2°. На вход подаются три вещественных числа; числа расположены в одной строке.
|
||||||
|
Вывести вначале минимальное, а затем максимальное из них. Каждое число должно выводиться на новой строке
|
||||||
|
и снабжаться комментарием: «MIN=» для минимального, «MAX=»
|
||||||
|
для максимального.
|
||||||
|
</p>
|
||||||
|
<hr>
|
||||||
|
<h3>Создание программы-заготовки и знакомство с заданием
|
||||||
|
</h3>
|
||||||
|
<p>Напомним, что программу-заготовку для решения этого задания можно создать с помощью
|
||||||
|
команды
|
||||||
|
меню «Модули | Создать шаблон программы», кнопки
|
||||||
|
<img border="0" src="gif/Load.gif" width="16" height="17"> или клавиатурной
|
||||||
|
комбинации <b>Shift+Ctrl+L</b>. Приведем текст созданной заготовки:
|
||||||
|
</p>
|
||||||
|
<blockquote><code><pre><b>uses</b> PT4Exam;
|
||||||
|
|
||||||
|
<b>begin</b>
|
||||||
|
Task('ExamBegin2');
|
||||||
|
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>После запуска программы на экране появится <a href="../PT4/window.html">окно задачника</a>:
|
||||||
|
</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/ExamBegin2-1.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Обсудим особенности программы-заготовки и окна задачника.
|
||||||
|
</p>
|
||||||
|
<p>В программе-заготовке вместо модуля <code>PT4</code>
|
||||||
|
подключается модуль <code>PT4Exam</code>, специально предназначенный для использования при выполнении
|
||||||
|
заданий групп Exam. Данный модуль содержит реализацию единственной процедуры <code>Task</code>,
|
||||||
|
инициализирующей задание. Никакие дополнительные процедуры, связанные с вводом-выводом, в него не включены.
|
||||||
|
Это обусловлено тем, что ввод-вывод при выполнении заданий групп Exam надо выполнять, используя
|
||||||
|
<i>стандартные процедуры языка Pascal</i>.
|
||||||
|
</p>
|
||||||
|
<p>Основной особенностью окна задачника является то, что в разделе исходных данных отсутствуют данные,
|
||||||
|
выделенные желтым цветом (напомним, что желтый цвет используется для выделения данных, которые необходимо
|
||||||
|
вводить с помощью специальных процедур ввода задачника). Вместо этого в окне отображается
|
||||||
|
строка бирюзового цвета, содержащая числовые данные. Вид строки подчеркивает то обстоятельство,
|
||||||
|
что вводить данные требуется не с помощью специальных процедур ввода, имеющихся в задачнике,
|
||||||
|
а с помощью стандартных процедур языка Pascal. Отметим, что бирюзовый цвет используется в окне задачника
|
||||||
|
для отображения «внешних» данных (содержащихся в файлах или динамических структурах), доступ к которым
|
||||||
|
должен осуществляться с помощью стандартных средств используемого языка программирования.
|
||||||
|
</p>
|
||||||
|
<p>Пример верного решения выделяется серым цветом
|
||||||
|
(в отличие от «настоящих» результатов, выведенных программой учащегося, которые, как и входные данные,
|
||||||
|
выделяются бирюзовым цветом), однако <i>представление</i> выходных данных совпадает с
|
||||||
|
представлением входных: это набор строк,
|
||||||
|
содержащих числовые данные (дополненные комментариями). Вид данных в разделе результатов показывает,
|
||||||
|
что для их вывода, как и для ввода исходных данных, необходимо использовать стандартные процедуры языка Pascal.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<b>Примечание.</b>
|
||||||
|
Если вы уже выполняли задания, связанные с обработкой файлов, то можете заметить, что отображение данных
|
||||||
|
в заданиях групп Exam
|
||||||
|
в точности соответствует способу отображения содержимого <i>текстовых файлов</i>. Это совпадение не случайно.
|
||||||
|
На самом деле во всех заданиях групп Exam все исходные данные хранятся в специальном входном текстовом файле,
|
||||||
|
а все результаты должны записываться в специальный выходной текстовый файл. Однако при этом не требуется
|
||||||
|
выполнять особых действий, связанных с определением имен этих файлов, связыванием файлов с файловыми
|
||||||
|
переменными, открытием и закрытием файлов (все эти действия выполняются задачником автоматически).
|
||||||
|
Для программы, выполняющей задание, эти файлы играют роль <i>стандартных потоков ввода-вывода</i>,
|
||||||
|
поэтому для доступа к ним достаточно использовать обычные процедуры ввода-вывода языка Pascal.
|
||||||
|
</p>
|
||||||
|
<hr>
|
||||||
|
<h3>Ввод исходных данных и их обработка
|
||||||
|
</h3>
|
||||||
|
<p>Приступим к выполнению задания. В данном случае следует использовать алгоритм, не требующий
|
||||||
|
применения массивов, поэтому опишем три простые переменные вещественного типа и введем в них исходные данные:
|
||||||
|
</p>
|
||||||
|
<blockquote><code><pre><b>uses</b> PT4Exam;
|
||||||
|
<b>var</b>
|
||||||
|
a, b, c: real;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('ExamBegin2');
|
||||||
|
read(a, b, c);
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>Мы воспользовались стандартной процедурой ввода <code>read</code>, введя все три исходных числа за один ее вызов.
|
||||||
|
Этого же результата мы могли бы добиться и с помощью процедуры <code>readln</code>:
|
||||||
|
</p>
|
||||||
|
<blockquote><code><pre>readln(a, b, c);
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>Заметим, что использование <i>отдельных</i> процедур <code>readln</code> для ввода каждого числа приведет к ошибочному результату:
|
||||||
|
</p>
|
||||||
|
<blockquote><code><pre>readln(a);
|
||||||
|
readln(b);
|
||||||
|
readln(c);
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>В этом случае уже после ввода первого числа произойдет автоматический переход на следующую строку
|
||||||
|
с исходными данными. Поэтому оставшиеся в первой строке числа будут пропущены, а поскольку
|
||||||
|
во второй строке «ничего нет» (входной поток состоит из единственной строки),
|
||||||
|
будет выведено сообщение об ошибке «<i>Input string was not in a correct format</i>»
|
||||||
|
(«<i>Входная строка имела неверный формат</i>»).
|
||||||
|
</p>
|
||||||
|
<p>Приведенный пример показывает, что при организации ввода данных в заданиях групп Exam необходимо учитывать особенности
|
||||||
|
стандартных процедур <code>read</code> и <code>readln</code>.
|
||||||
|
</p>
|
||||||
|
<p>При запуске приведенного выше варианта программы вид окна не изменится, поскольку мы не вывели никаких данных.
|
||||||
|
В заданиях групп Exam запуск программы считается ознакомительным до тех пор, пока программа не выведет
|
||||||
|
хотя бы один элемент результирующих данных. Кроме того, задачник не контролирует,
|
||||||
|
каким образом программа читает исходные данные (например, мы могли бы ввести всю исходную строку
|
||||||
|
в переменную типа <code>string</code>, а затем «разобрать» эту строку, выделив из нее три числа
|
||||||
|
и преобразовав их к типу <code>real</code>). Отмеченные особенности характерны именно для заданий групп Exam,
|
||||||
|
в которых для ввода данных не используются специальные средства задачника.
|
||||||
|
</p>
|
||||||
|
<p>Реализуем алгоритм нахождения минимального и максимального элемента. Для этого опишем еще две
|
||||||
|
переменные <code>min</code> и <code>max</code> типа <code>real</code> и добавим в конец программы следующие операторы:
|
||||||
|
</p>
|
||||||
|
<blockquote><code><pre><b>if</b> a < b <b>then</b>
|
||||||
|
<b>begin</b>
|
||||||
|
min := a;
|
||||||
|
max := b;
|
||||||
|
<b>end</b>
|
||||||
|
<b>else</b>
|
||||||
|
<b>begin</b>
|
||||||
|
min := b;
|
||||||
|
max := a;
|
||||||
|
<b>end</b>;
|
||||||
|
<b>if</b> c < min <b>then</b>
|
||||||
|
min := c
|
||||||
|
<b>else</b>
|
||||||
|
<b>if</b> c > max <b>then</b>
|
||||||
|
max := c;
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>Таким образом, для одновременного нахождения минимального и максимального из трех чисел требуется
|
||||||
|
не более трех операций сравнения и не более трех операций присваивания.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3>Вывод результатов и их форматирование
|
||||||
|
</h3>
|
||||||
|
<p>Осталось вывести полученные результаты. Вывод, как и ввод, следует выполнять с помощью стандартных процедур
|
||||||
|
языка Pascal, учитывая их особенности.
|
||||||
|
</p>
|
||||||
|
<p>Вначале, в качестве примера, организуем вывод, не соответствующий условиям задачи. Для этого добавим в конец программы
|
||||||
|
следующий оператор:
|
||||||
|
</p>
|
||||||
|
<blockquote><code><pre>writeln(min, max);
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>Приведем вид окна задачника при запуске полученной программы:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/ExamBegin2-2.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Мы видим, что минимум и максимум найдены правильно, однако выведены не в том формате,
|
||||||
|
который требовался (требуемый формат приводится в разделе с примером верного решения).
|
||||||
|
Мы допустили при выводе три ошибки: во-первых, вывели оба числа в одной строке
|
||||||
|
(при этом они «слились», поскольку мы не предусмотрели вывод пробела-разделителя), во-вторых,
|
||||||
|
не снабдили числа комментариями и, в-третьих, не настроили их отображение в формате
|
||||||
|
с двумя дробными знаками (первое число было выведено с единственным знаком после точки).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<b>Примечание.</b> Следует обратить внимание на панель индикаторов, которая отображается между информационной панелью
|
||||||
|
и разделом с формулировкой задания в случае, если запуск программы не является
|
||||||
|
ни демонстрационным, ни ознакомительным. Обычно на этой панели выводятся три индикатора: первый указывает
|
||||||
|
количество введенных исходных данных, второй — количество выведенных результатов, а третий —
|
||||||
|
количество успешно пройденных тестовых испытаний. При выполнении заданий, связанных с ЕГЭ, первые два
|
||||||
|
индикатора являются неактивными, поскольку, как было отмечено выше, для получения исходных данных
|
||||||
|
и записи результатов не используются средства задачника, и поэтому он не в состоянии
|
||||||
|
проконтролировать каждую операцию ввода-вывода.
|
||||||
|
</p>
|
||||||
|
<p>Для исправления первых двух ошибок достаточно изменить вывод следующим образом:
|
||||||
|
</p>
|
||||||
|
<blockquote><code><pre>writeln('MIN=', min);
|
||||||
|
writeln('MAX=', max);
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>Однако в этом случае числа по-прежнему могут содержать неверное число дробных знаков.
|
||||||
|
Для исправления этой последней ошибки проще всего использовать
|
||||||
|
<i>атрибуты форматирования</i>, начинающиеся с символа «:» (двоеточие):
|
||||||
|
</p>
|
||||||
|
<blockquote><code><pre>writeln('MIN=', min:0:2);
|
||||||
|
writeln('MAX=', max:0:2);
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>Первый атрибут определяет <i>ширину поля вывода</i> (если ширина равна 0, то используется минимально
|
||||||
|
необходимое поле вывода). Наличие второго атрибута (допустимого только для вещественных чисел) означает,
|
||||||
|
что число надо вывести в формате с фиксированной точкой, причем его значение равно количеству дробных знаков.
|
||||||
|
</p>
|
||||||
|
<p>При запуске исправленной программы будет выведено сообщение о верном решении, а после трех
|
||||||
|
запусков — сообщение о том, что задание выполнено:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/ExamBegin2-3.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
<p>В случае успешного прохождения тестового испытания в окно задачника не включается
|
||||||
|
раздел с примером верного решения, поскольку данные этого раздела совпадают
|
||||||
|
с результатами, полученными программой.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<b>Примечание.</b>
|
||||||
|
В системе PascalABC.NET,
|
||||||
|
благодаря специальному механизму перенаправления данных, стандартные процедуры <code>read-write</code> можно использовать
|
||||||
|
и при выполнении заданий из других групп, однако важно учитывать ряд особенностей использования этих процедур
|
||||||
|
в заданиях групп Exam. Во-первых, только в заданиях групп Exam будут проявляться различия в использовании
|
||||||
|
процедур <code>read-write</code> и <code>readln-writeln</code> (в остальных группах для ввода-вывода можно использовать как вариант
|
||||||
|
процедуры с суффиксом «ln», так и вариант без этого суффикса). Во-вторых, только в заданиях
|
||||||
|
групп Exam можно при необходимости <i>использовать атрибуты форматирования</i> при выводе результатов,
|
||||||
|
а также <i>выводить дополнительные комментарии</i>, если этого требует условие задачи. В-третьих,
|
||||||
|
только в заданиях групп Exam можно вводить и выводить элементы данных несколькими способами, с использованием переменных
|
||||||
|
различных типов; например, исходную строку можно либо сразу прочесть в строковую переменную, либо вводить
|
||||||
|
посимвольно в цикле (в других группах заданий проводится более строгая проверка на соответствие типа переменной
|
||||||
|
типу элемента исходных или результирующих данных).
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h2>Пример 2. Ввод и вывод массивов
|
||||||
|
</h2>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<p>Рассмотрим еще одно задание группы ExamBegin, особенностью которого является вывод в качестве результата
|
||||||
|
элементов двумерного массива.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="task">ExamBegin28°. На вход в первой строке подаются два целых положительных числа <i>M</i> и <i>N</i>,
|
||||||
|
во второй строке — вещественное число <i>D</i>, а в третьей строке — набор из <i>M</i> вещественных чисел.
|
||||||
|
Сформировать и вывести двумерный вещественный массив размера <i>M</i> × <i>N</i>, у которого первый
|
||||||
|
столбец совпадает с исходным набором чисел, а элементы каждого следующего столбца равны сумме соответствующего
|
||||||
|
элемента предыдущего столбца и числа <i>D</i> (в результате каждая строка массива будет содержать
|
||||||
|
элементы <i>арифметической прогрессии</i>). Каждую строку элементов массива выводить на новой экранной строке,
|
||||||
|
для каждого числа отводить 7 экранных позиций.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p>При запуске программы-заготовки, созданной для этого задания, окно задачника примет следующий вид:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/ExamBegin28-1.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Анализируя исходные данные, можно заметить, что полученная матрица должна иметь 8 строк, тогда как
|
||||||
|
на экране отображаются только первые пять.
|
||||||
|
Это связано с тем, что по умолчанию используется режим «свернутого» отображения данных, при котором
|
||||||
|
на экране выводится только несколько начальных строк. Признаком того, что имеются данные,
|
||||||
|
не выведенные на экране, является кнопка, которая отображается в правом верхнем углу раздела исходных данных
|
||||||
|
(на этой кнопке изображается стилизованная стрелка, направленная вниз).
|
||||||
|
Для вывода всех данных достаточно нажать эту кнопку; можно также нажать клавишу <b>Ins</b> или выполнить
|
||||||
|
щелчок мышью в любом месте раздела с данными задания (кроме раздела, содержащего формулировку).
|
||||||
|
Если выполнить эти действия для нашего окна, то оно изменится следующим образом:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/ExamBegin28-2.png">
|
||||||
|
</blockquote>
|
||||||
|
<p>Повторный щелчок мышью, нажатие клавиши <b>Ins</b> или кнопки (на которой в данной ситуации будет отображаться
|
||||||
|
стрелка, направленная вверх — см. рисунок) восстанавливает «сокращенное»
|
||||||
|
отображение данных. Заметим, что в режиме «сокращенного» отображения нумеруется только первая строка данных,
|
||||||
|
а в режиме полного отображения нумерацией снабжаются все строки.</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<a href="#scroll">Дополнительные возможности</a>, связанные с просмотром
|
||||||
|
данных большого размера, будут описаны далее, в пункте, посвященном задачам повышенной сложности.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>Если закрыть окно задачника, находясь в режиме отображения всех данных,
|
||||||
|
то при последующих запусках программы окно будет сразу отображаться в этом режиме.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>Приведем вариант правильного решения данной задачи (в этом варианте учитывается, что результирующий
|
||||||
|
двумерный массив имеет не более 10 строк и столбцов; соответствующее условие приведено в
|
||||||
|
преамбуле к описанию
|
||||||
|
группы ExamBegin):
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<blockquote><code><pre><b>uses</b> PT4Exam;
|
||||||
|
<b>var</b>
|
||||||
|
m, n, i, j: integer;
|
||||||
|
d: real;
|
||||||
|
a: array[1..10, 1..10] of real;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('ExamBegin28');
|
||||||
|
readln(m, n, d);
|
||||||
|
<b>for</b> i := 1 <b>to</b> m <b>do</b>
|
||||||
|
read(a[i, 1]);
|
||||||
|
<b>for</b> j := 2 <b>to</b> n <b>do</b>
|
||||||
|
<b>for</b> i := 1 <b>to</b> m <b>do</b>
|
||||||
|
a[i, j] := a[i, j - 1] + d;
|
||||||
|
<b>for</b> i := 1 <b>to</b> m <b>do</b>
|
||||||
|
<b>begin</b>
|
||||||
|
<b>for</b> j := 1 <b>to</b> n <b>do</b>
|
||||||
|
write(a[i, j]:7:2);
|
||||||
|
writeln;
|
||||||
|
<b>end</b>;
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
|
||||||
|
<p>В приведенном решении следует обратить особое внимание на организацию ввода-вывода.
|
||||||
|
Укажем две особенности, связанные с вводом. Во-первых, несмотря
|
||||||
|
на то что по условию число <code>d</code> находится во второй строке, мы смогли включить его в один список с
|
||||||
|
предшествующими числами <code>m</code> и <code>n</code> (поскольку при чтении числовых данных переход на новую строку выполняется
|
||||||
|
автоматически). Во-вторых, при чтении элементов исходного набора <i>необходимо</i> использовать вариант
|
||||||
|
процедуры <code>read</code> без суффикса «ln», чтобы не пропустить оставшиеся в этой строке числа.
|
||||||
|
</p>
|
||||||
|
<p>При выводе полученного двумерного массива необходимо обеспечить его правильное <i>форматирование</i>:
|
||||||
|
каждый элемент должен выводиться на семи экранных позициях с двумя дробными знаками и, кроме того,
|
||||||
|
каждая строка массива должна выводиться на новой экранной строке. Это достигается за счет использования
|
||||||
|
соответствующих атрибутов форматирования и явного перехода на новую строку с помощью процедуры
|
||||||
|
<code>writeln</code> без параметров.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<b>Примечание.</b>
|
||||||
|
Заметим, что в заданиях группы Matrix,
|
||||||
|
также посвященной обработке двумерных массивов, специальные действия по форматированию полученных массивов
|
||||||
|
выполнять не требуется, так как задачник автоматически форматирует все полученные результаты.
|
||||||
|
Таким образом, задания группы ExamBegin «более приближены» к реальной экзаменационной ситуации,
|
||||||
|
в которой программа учащегося должна не только обрабатывать исходные данные, но и обеспечивать наглядное
|
||||||
|
отображение результатов.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<a name="taskc"></a>
|
||||||
|
<h2>Пример 3. Обработка сложных наборов данных
|
||||||
|
</h2>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<p>Группа ExamTaskC содержит 100 типовых заданий, аналогичных заданиям,
|
||||||
|
которые предлагаются на ЕГЭ по информатике
|
||||||
|
в качестве задач повышенной сложности (задача C4). Основную часть данной группы составляют
|
||||||
|
задания на обработку сложных наборов данных (записей) с элементами-полями различных типов.
|
||||||
|
В подобных заданиях требуется правильно выбрать способ хранения данных и организовать их эффективную обработку;
|
||||||
|
при этом обычно требуется применить <i>несколько</i> базовых алгоритмов, например, алгоритм суммирования
|
||||||
|
или нахождения минимума/максимума и алгоритм поиска нужного элемента или сортировки набора данных по требуемому ключу.
|
||||||
|
В группу ExamTaskC включены также задания повышенной сложности на обработку текстовых данных
|
||||||
|
(подобные задания содержатся в завершающем разделе данной группы).
|
||||||
|
</p>
|
||||||
|
<p>Следует заметить, что возможность автоматической генерации
|
||||||
|
больших наборов исходных данных, предоставляемая задачником Programming Taskbook, позволяет существенно ускорить
|
||||||
|
тестирование учебных программ и сделать его более надежным, что, в свою очередь, повышает эффективность изучения
|
||||||
|
типовых приемов решения задач группы C.
|
||||||
|
</p>
|
||||||
|
<p>В заданиях группы ExamTaskC ввод и вывод имеет те же особенности,
|
||||||
|
что и в заданиях группы ExamBegin.
|
||||||
|
</p>
|
||||||
|
<p>Рассмотрим следующее задание.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="task">ExamTaskC25°. На вход подаются сведения об абитуриентах. В первой строке
|
||||||
|
указывается количество абитуриентов <i>N</i>, каждая из последующих <i>N</i> строк имеет
|
||||||
|
формат<br> <tt><Номер школы> <Год поступления> <Фамилия></tt><br>
|
||||||
|
Номер школы содержит не более двух цифр, годы лежат в диапазоне от 1990 до 2010. Для каждого года,
|
||||||
|
присутствующего в исходных данных, вывести общее число абитуриентов, поступивших в этом году
|
||||||
|
(вначале выводить год, затем число абитуриентов). Сведения о каждом годе выводить на новой строке
|
||||||
|
и упорядочивать по возрастанию номера года.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Программа-заготовка, созданная для этого задания, подобно заготовкам для заданий группы ExamBegin,
|
||||||
|
будет использовать специальный модуль <code>PT4Exam</code>:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<blockquote><code><pre><b>uses</b> PT4Exam;
|
||||||
|
|
||||||
|
<b>begin</b>
|
||||||
|
Task('ExamTaskC25');
|
||||||
|
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
|
||||||
|
<p>При запуске этой программы на экране появится окно задачника, содержащее следующие данные:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/ExamTaskC25-1.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Окно будет иметь такой вид, если при его предшествующем закрытии оно находилось в режиме
|
||||||
|
отображения всех данных.
|
||||||
|
Для отображения всех данных на экране может потребоваться увеличить высоту окна; для этого достаточно
|
||||||
|
зацепить мышью заголовок окна и переместить его вверх (для перемещения заголовка окна задачника вверх и вниз
|
||||||
|
можно также воспользоваться клавиатурными комбинациями <b>Ctrl+Up</b> и <b>Ctrl+Down</b>).
|
||||||
|
</p>
|
||||||
|
<p>При первом тестовом испытании программы ей будет предложен для обработки
|
||||||
|
набор данных не слишком большого размера (порядка 10–20 элементов).
|
||||||
|
</p>
|
||||||
|
<p>Вначале следует определиться со структурами данных, которые будут использоваться в программе. Поскольку
|
||||||
|
требуется найти одну характеристику для каждого года, а число лет невелико, можно использовать
|
||||||
|
числовой массив <code>year</code>, каждый элемент которого соответствует определенному году. Так как в языке Pascal можно
|
||||||
|
использовать произвольные границы индексов, удобно в качестве диапазона индексов указать диапазон лет,
|
||||||
|
который требуется проанализировать: <code>1990..2010</code>. В начале программы выполним инициализацию элементов массива,
|
||||||
|
положив их значения равными <code>0</code>
|
||||||
|
(заметим, что если после обработки исходных данных некоторые элементы массива <code>year</code>
|
||||||
|
останутся нулевыми, то это будет означать, что соответствующие годы не были представлены в наборе исходных данных,
|
||||||
|
и выводить информацию о них не следует).
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>После инициализации массива следует прочесть информацию о количестве абитуриентов и организовать цикл,
|
||||||
|
в котором будут обрабатываться данные о каждом абитуриенте и соответствующим образом корректироваться
|
||||||
|
элементы массива <code>year</code>. В дальнейшем сведения об уже обработанном абитуриенте нам не будут нужны, поэтому сохранять
|
||||||
|
их в специальном наборе данных (например, массиве) не требуется. Заметим также, что фамилия абитуриента
|
||||||
|
для решения задачи не требуется, поэтому после чтения двух числовых данных можно сразу переходить к новой строке,
|
||||||
|
пропуская строковый элемент данных (фамилию). В задаче не нужно использовать
|
||||||
|
и номера школ, однако их придется считывать, так как только после номера школы указывается интересующий
|
||||||
|
нас год поступления абитуриента.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>Когда данные обо всех абитуриентах будут обработаны,
|
||||||
|
в массиве <code>year</code> будет содержаться вся необходимая информация, которую останется
|
||||||
|
вывести в формате, указанном в условии задачи.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>Приведем первый вариант решения (этот вариант содержит одну ошибку):
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<blockquote><code><pre><b>uses</b> PT4Exam;
|
||||||
|
<b>var</b>
|
||||||
|
n, i, k, m: integer;
|
||||||
|
year: array[1990..2010] of integer;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('ExamTaskC25');
|
||||||
|
<b>for</b> i := 1990 <b>to</b> 2010 <b>do</b>
|
||||||
|
year[i] := 0;
|
||||||
|
readln(n);
|
||||||
|
<b>for</b> i := 1 <b>to</b> n <b>do</b>
|
||||||
|
<b>begin</b>
|
||||||
|
readln(k, m); <i>{ k - номер школы, m - год поступления }</i>
|
||||||
|
Inc(year[m]);
|
||||||
|
<b>end</b>;
|
||||||
|
<b>for</b> i := 1990 <b>to</b> 2010 <b>do</b>
|
||||||
|
writeln(i, ' ', year[i]);
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
|
||||||
|
<p>Ошибка связана с тем, что на экран выводится информация о годах, отсутствующих в наборе исходных данных.
|
||||||
|
Поэтому она сразу будет выявлена при обработке наборов данных небольшого размера,
|
||||||
|
предлагаемых программе при первом тестовом запуске
|
||||||
|
(для большей наглядности приведем окно задачника в режиме сокращенного отображения данных, при котором
|
||||||
|
выводятся только пять первых элементов из каждого набора данных):
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/ExamTaskC25-2.png">
|
||||||
|
</blockquote>
|
||||||
|
<p>Для исправления ошибки достаточно добавить в последний цикл условный оператор:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<blockquote><code><pre><b>for</b> i := 1990 <b>to</b> 2010 <b>do</b>
|
||||||
|
<b>if</b> year[i] > 0 <b>then</b>
|
||||||
|
writeln(i, ' ', year[i]);
|
||||||
|
</pre></code></blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Теперь все 9 тестовых испытаний программы, требуемых для того, чтобы решение было зачтено как выполненное,
|
||||||
|
будут пройдены успешно.
|
||||||
|
</p>
|
||||||
|
<a name="scroll"></a><p>Завершая рассмотрение этого задания, опишем некоторые дополнительные возможности, связанные
|
||||||
|
с просмотром больших наборов данных.
|
||||||
|
</p>
|
||||||
|
<p>Начиная со второго испытания,
|
||||||
|
программе может быть предложен для обработки набор исходных данных большего размера (порядка 50–100
|
||||||
|
элементов). При этом уже не удастся отобразить на экране все данные, связанные с заданием.
|
||||||
|
В подобной ситуации у правой границы окна задачника появится <i>полоса прокрутки</i>, позволяющая
|
||||||
|
перемещаться к той части данных, которая первоначально не отображается на экране.
|
||||||
|
Прокрутку данных можно выполнять не только с помощью полосы прокрутки, но и используя
|
||||||
|
клавиши со стрелками, <b>PgUp</b>, <b>PgDn</b>, <b>Home</b>, <b>End</b>, а также колесико мыши.
|
||||||
|
</p>
|
||||||
|
<p>Помимо стандартных действий по прокрутке данных, в окне задачника предусмотрены возможности
|
||||||
|
«интеллектуальной» прокрутки,
|
||||||
|
позволяющие быстро перейти к началу каждого раздела задания, а также сравнить соответствующие фрагменты
|
||||||
|
полученных результатов и примера верного решения. Для циклического перебора разделов сверху вниз
|
||||||
|
предназначена клавиша <b>[+]</b> (а также комбинация <b>Ctrl+PgDn</b>), для циклического перебора разделов снизу вверх
|
||||||
|
— клавиша <b>[–]</b> (а также комбинация <b>Ctrl+PgUp</b>). Для быстрого переключения между
|
||||||
|
соответствующими фрагментами разделов с результатами и с примером верного решения предназначена клавиша <b>[/]</b>
|
||||||
|
(а также комбинация <b>Ctrl+Tab</b>). Все эти действия можно выполнить и с помощью мыши; для этого
|
||||||
|
предусмотрены кнопки в левом верхнем углу прокручиваемой области окна, отведенной под отображение разделов задания
|
||||||
|
(эти кнопки отображаются
|
||||||
|
на экране, если размер данных, связанных с заданием, превышает размеры окна).
|
||||||
|
Приведем вид окна задачника с полосой прокрутки и дополнительными кнопками:
|
||||||
|
</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/ExamTaskC25-3.png">
|
||||||
|
</blockquote>
|
||||||
|
<p>Обозначения на кнопках совпадают с клавишами,
|
||||||
|
выполняющими те же действия; при наведении мышью на кнопку рядом с ней появляется всплывающая подсказка.
|
||||||
|
</p>
|
||||||
|
<p>Кроме трех кнопок, связанных с «интеллектуальной» прокруткой,
|
||||||
|
в приведенном на рисунке окне отображаются еще две дополнительные кнопки.
|
||||||
|
Первая из них располагается в правом верхнем углу раздела с формулировкой
|
||||||
|
и позволяет временно скрыть (а в дальнейшем опять отобразить)
|
||||||
|
раздел с формулировкой (эти же действия можно выполнить с помощью клавиши <b>Del</b> или щелчка мышью
|
||||||
|
на разделе с формулировкой).
|
||||||
|
Вторая дополнительная кнопка расположена в правом верхнем углу раздела с исходными данными.
|
||||||
|
Как уже отмечалось ранее, эта кнопка позволяет переключаться между полным
|
||||||
|
и сокращенным отображением наборов данных. Напомним, что
|
||||||
|
изображение на этой кнопке показывает текущий режим отображения данных. Например, если на кнопке изображена
|
||||||
|
стилизованная стрелка, направленная вверх (как на приведенном выше рисунке),
|
||||||
|
значит, в данный момент в окне отображаются все данные, а нажатие на эту кнопку переведет окно
|
||||||
|
в режим отображения нескольких начальных (как правило, пяти) элементов каждого набора данных.
|
||||||
|
</p>
|
||||||
|
<p>Дополнительная информация о возможностях
|
||||||
|
режима окна с динамической компоновкой приведена в <a href="../PT4/window.html#dynmode">соответствующем разделе</a>
|
||||||
|
страницы, посвященной описанию окна задачника.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h2>Пример 4. Более сложное задание на обработку наборов данных
|
||||||
|
</h2>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<p class="task">ExamTaskC53°. На вход подаются сведения о ценах на бензин на автозаправочных станциях (АЗС).
|
||||||
|
В первой строке содержится значение <i>M</i> одной из марок бензина, во второй строке указывается
|
||||||
|
целое число <i>N</i>, а каждая из последующих <i>N</i> строк имеет формат<br>
|
||||||
|
<tt><Марка бензина> <Улица> <Компания> <Цена 1 литра (в копейках)></tt><br>
|
||||||
|
Имеется не более 20 различных компаний и не более 30 различных улиц; названия компаний и улиц
|
||||||
|
не содержат пробелов. В качестве марки бензина указываются числа 92, 95 или 98. Цена задается целым числом
|
||||||
|
в диапазоне от 2000 до 3000. Каждая компания имеет не более одной АЗС на каждой улице;
|
||||||
|
цены на разных АЗС одной и той же компании могут различаться. Для каждой улицы, на которой имеются
|
||||||
|
АЗС с бензином марки <i>M</i>, определить максимальную цену бензина этой марки (вначале выводить максимальную
|
||||||
|
цену, затем название улицы). Сведения о каждой улице выводить на новой строке и упорядочивать
|
||||||
|
по возрастанию максимальной цены, а для одинаковой цены — по названиям улиц в алфавитном порядке.
|
||||||
|
Если ни одной АЗС с бензином марки <i>M</i> не найдено, то вывести текст «Нет».
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p>Приведем окно задачника, которое появится на экране при запуске программы-заготовки для данного задания
|
||||||
|
(в данном окне скрыт раздел с формулировкой; в результате оказались скрытыми и кнопки,
|
||||||
|
отвечающие за «интеллектуальную» прокрутку, поскольку в окне полностью отображается
|
||||||
|
содержимое оставшихся разделов):
|
||||||
|
</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/ExamTaskC53-1.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Выясним, какая структура является наиболее подходящей для хранения информации, необходимой для решения задачи.
|
||||||
|
Нам требуется информация, связанная с различными улицами, которых по условию не более 30, причем для каждой улицы
|
||||||
|
надо хранить сведения двух видов: ее название и максимальную цену бензина марки <i>M</i>. Поэтому мы можем либо завести
|
||||||
|
массив из 30 элементов-записей с двумя полями, либо два массива: один содержащий названия улиц, а другой —
|
||||||
|
максимальные цены. Учитывая, что в конце программы нам потребуется выполнять сортировку полученных данных,
|
||||||
|
целесообразнее использовать массив записей, поскольку это позволит записать алгоритм сортировки
|
||||||
|
в более компактной форме.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>Определим запись <code>Street</code> с двумя полями <code>name</code> и <code>max</code> и опишем массив <code>s</code>
|
||||||
|
из 30 элементов типа <code>Street</code>.
|
||||||
|
Следует также завести переменную <code>ns</code>, в которой будет храниться количество заполненных элементов массива <code>s</code>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>При обработке каждой строки с исходными данными нам будут нужны прежде всего сведения о марке бензина.
|
||||||
|
Если марка бензина не равна <code>M</code>, то оставшуюся часть строки обрабатывать не требуется, и можно сразу перейти
|
||||||
|
к разбору следующей строки. Если марка бензина равна <code>M</code>, то необходимо узнать название улицы <code>s0</code> и цену бензина <code>p</code>.
|
||||||
|
Заметим, что название компании для решения задачи не требуется, однако его необходимо прочесть, чтобы определить
|
||||||
|
следующий элемент данных — цену бензина.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>Если улица с названием <code>s0</code> еще не была включена в массив <code>s</code>, то ее необходимо включить в массив, присвоив
|
||||||
|
полю <code>max</code> значение <code>p</code>. Если же улица уже присутствует в массиве, то необходимо сравнить поле <code>max</code> для данной улицы
|
||||||
|
и значение <code>p</code>, изменив при необходимости поле <code>max</code> (здесь мы используем базовый алгоритм нахождения
|
||||||
|
максимального значения).
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>Для ввода названий улиц и компаний в нашем случае удобно организовать <i>посимвольное</i> чтение строковых данных;
|
||||||
|
признаком завершения такого чтения будет обнаружение пробельного символа.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>После обработки набора исходных данных необходимо проверить, найдена ли хотя бы одна улица с АЗС,
|
||||||
|
предлагающей марку бензина <code>M</code> (для этого достаточно сравнить значение <code>ns</code> с нулем). Если ни одна улица
|
||||||
|
не найдена, то надо вывести строку «Нет»; в противном случае требуется выполнить сортировку
|
||||||
|
массива <code>s</code> по указанному набору ключей и вывести полученные данные в требуемом порядке. Поскольку размер
|
||||||
|
массива невелик, для его сортировки вполне допустимо использовать один из простых алгоритмов,
|
||||||
|
например, алгоритм <i>пузырьковой сортировки</i>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>Приведем один из вариантов правильного решения задачи:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<blockquote><code><pre><b>uses</b> PT4Exam;
|
||||||
|
<b>type</b>
|
||||||
|
Street = <b>record</b>
|
||||||
|
name: string;
|
||||||
|
max: integer;
|
||||||
|
<b>end</b>;
|
||||||
|
<b>var</b>
|
||||||
|
m, n, ns, i, j, k, p: integer;
|
||||||
|
s: array[1..30] of Street;
|
||||||
|
s0: string;
|
||||||
|
x: Street;
|
||||||
|
c: char;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('ExamTaskC53');
|
||||||
|
readln(m); <i>{ m - марка бензина }</i>
|
||||||
|
readln(n);
|
||||||
|
ns := 0;
|
||||||
|
<b>for</b> i := 1 <b>to</b> n <b>do</b>
|
||||||
|
<b>begin</b>
|
||||||
|
read(k);
|
||||||
|
<b>if</b> k <> m <b>then</b>
|
||||||
|
readln <i>{ пропускаем оставшуюся часть строки }</i>
|
||||||
|
<b>else</b>
|
||||||
|
<b>begin</b>
|
||||||
|
s0 := '';
|
||||||
|
read(c); <i>{ пропускаем пробел после первого числа }</i>
|
||||||
|
read(c); <i>{ читаем первый символ названия улицы }</i>
|
||||||
|
<b>while</b> c <> ' ' <b>do</b>
|
||||||
|
<b>begin</b>
|
||||||
|
s0 := s0 + c;
|
||||||
|
read(c);
|
||||||
|
<b>end</b>;
|
||||||
|
read(c); <i>{ читаем первый символ названия компании }</i>
|
||||||
|
<b>while</b> c <> ' ' <b>do</b>
|
||||||
|
read(c); <i>{ название компании не сохраняем }</i>
|
||||||
|
readln(p); <i>{ читаем цену бензина и переходим на новую строку }</i>
|
||||||
|
<i>{ Обработка прочитанной информации }</i>
|
||||||
|
k := 0;
|
||||||
|
<b>for</b> j := 1 <b>to</b> ns <b>do</b>
|
||||||
|
<b>if</b> s[j].name = s0 <b>then</b> <i>{ улица уже содержится в массиве s }</i>
|
||||||
|
<b>begin</b>
|
||||||
|
k := 1;
|
||||||
|
<b>if</b> s[j].max < p <b>then</b>
|
||||||
|
s[j].max := p;
|
||||||
|
break;
|
||||||
|
<b>end</b>;
|
||||||
|
<b>if</b> k = 0 <b>then</b> <i>{ улица еще не содержится в массиве s }</i>
|
||||||
|
<b>begin</b>
|
||||||
|
Inc(ns);
|
||||||
|
s[ns].name := s0;
|
||||||
|
s[ns].max := p;
|
||||||
|
<b>end</b>;
|
||||||
|
<b>end</b>;
|
||||||
|
<b>end</b>;
|
||||||
|
<b>if</b> ns = 0 <b>then</b> <i>{ ни одной улицы не найдено }</i>
|
||||||
|
writeln('Нет')
|
||||||
|
<b>else</b>
|
||||||
|
<b>begin</b>
|
||||||
|
<i>{ Сортировка по возрастанию максимальной цены,</i>
|
||||||
|
<i> а для одинаковых цен - по названиям улиц }</i>
|
||||||
|
<b>for</b> k := 1 <b>to</b> ns - 1 <b>do</b>
|
||||||
|
<b>for</b> i := 1 <b>to</b> ns - k <b>do</b>
|
||||||
|
<b>if</b> (s[i].max > s[i + 1].max) <b>or</b>
|
||||||
|
(s[i].max = s[i + 1].max) <b>and</b>
|
||||||
|
(s[i].name > s[i + 1].name) <b>then</b>
|
||||||
|
<b>begin</b>
|
||||||
|
x := s[i];
|
||||||
|
s[i] := s[i + 1];
|
||||||
|
s[i + 1] := x;
|
||||||
|
<b>end</b>;
|
||||||
|
<i>{ Вывод результатов в требуемом порядке }</i>
|
||||||
|
<b>for</b> i := 1 <b>to</b> ns <b>do</b>
|
||||||
|
writeln(s[i].max,' ',s[i].name);
|
||||||
|
<b>end</b>;
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
|
||||||
|
|
||||||
343
PABCNetHelp/ForEducation/CheckedTasks/ctfile.html
Normal file
|
|
@ -0,0 +1,343 @@
|
||||||
|
<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>В качестве примера задания на обработку файлов рассмотрим задание File48.</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('File48');
|
||||||
|
|
||||||
|
<b>end</b>.</pre></code>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>После запуска данной программы на экране появится <a href="../PT4/window.html">окно задачника</a>:</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/file48-1.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
<p>В первой строке раздела исходных данных указаны имена трех исходных файлов (S<sub>A</sub>, S<sub>B</sub>
|
||||||
|
и S<sub>C</sub>) и одного результирующего (S<sub>D</sub>). В последующих строках раздела исходных данных
|
||||||
|
показано содержимое исходных файлов.
|
||||||
|
Элементы файлов отображаются бирюзовым цветом, чтобы подчеркнуть их отличие от обычных исходных данных (желтого цвета)
|
||||||
|
и комментариев (светло-серого цвета).</p>
|
||||||
|
<p>Поскольку размер файлов, как правило, превышает количество элементов,
|
||||||
|
которое может уместиться на одной экранной строке,
|
||||||
|
для отображения содержимого файла может отводиться
|
||||||
|
более одной экранной строки. Слева от каждой строки с содержимым файла указывается порядковый номер
|
||||||
|
файлового элемента, значение которого указано первым в этой строке (элементы нумеруются от 1).</p>
|
||||||
|
<p>Запуск нашей программы признан <i>ознакомительным</i> (и поэтому правильность решения не анализировалась),
|
||||||
|
так как в ходе ее выполнения не было введено ни одного элемента исходных данных.
|
||||||
|
При ознакомительном запуске раздел результатов не отображается, однако приводится
|
||||||
|
<i>пример верного решения</i>, т. е. те числа,
|
||||||
|
которые должны содержаться в результирующем файле при правильной обработке исходных файлов.</p>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3>Ввод части исходных данных</h3>
|
||||||
|
<p>Добавим в программу фрагмент, позволяющий ввести имена исходных файлов и связать с этими файлами соответствующие
|
||||||
|
файловые переменные. Поскольку мы собираемся работать с четырьмя файлами одного типа, удобно предусмотреть <i>массив</i>
|
||||||
|
для хранения всех файловых переменных:</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<code><pre>
|
||||||
|
<b>uses</b> PT4;
|
||||||
|
<b>var</b>
|
||||||
|
i: integer;
|
||||||
|
s: string;
|
||||||
|
f: <b>array </b>[1..4] <b>of</b> <b>file</b> <b>of</b> integer;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('File48');
|
||||||
|
<b>for</b> i := 1 <b>to</b> 3 <b>do</b>
|
||||||
|
<b>begin</b>
|
||||||
|
read(s);
|
||||||
|
Assign(f[i], s);
|
||||||
|
<b>end</b>;
|
||||||
|
<b>end</b>. </pre></code>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Мы намеренно ограничились <i>тремя</i> итерациями цикла, оставив непрочитанным имя результирующего файла.
|
||||||
|
Считывание имен файлов производится в одну и ту же переменную <code>s</code>, поскольку после связывания файла,
|
||||||
|
имеющего имя <code>s</code>,
|
||||||
|
с соответствующей файловой переменной (процедурой <code>Assign</code>) все остальные действия
|
||||||
|
с данным файлом в нашей программе
|
||||||
|
будут осуществляться с использованием файловой переменной, без обращения к имени файла.</p>
|
||||||
|
<p>Запуск нового варианта программы уже не будет считаться ознакомительным, поскольку в программе
|
||||||
|
выполняется ввод исходных данных. Так как имя результирующего файла осталось непрочитанным, этот вариант
|
||||||
|
решения будет признан неверным и приведет к сообщению «<i>Введены не все требуемые исходные данные</i>»:</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/file48-2.png">
|
||||||
|
</blockquote>
|
||||||
|
<p>При этом на экране появится раздел результатов (кроме комментария он пока ничего не содержит),
|
||||||
|
а также панель индикаторов. Первый из индикаторов
|
||||||
|
(индикатор ввода) показывает
|
||||||
|
количество введенных исходных данных. Обратите внимание на то, что второй индикатор
|
||||||
|
(индикатор вывода) является неактивным: он выделяется серым цветом более светлого
|
||||||
|
оттенка и не содержит текстового заголовка.
|
||||||
|
Это объясняется тем, что индикатор вывода показывает количество результирующих данных,
|
||||||
|
полученных задачником от программы, а в нашем случае программа
|
||||||
|
не должна передавать задачнику никакие данные; вместо этого ей необходимо создать файл и заполнить его
|
||||||
|
требуемыми значениями. Для заданий подобного типа (обычно это задания, связанные с обработкой файлов)
|
||||||
|
индикатор вывода не используется.
|
||||||
|
</p>
|
||||||
|
<hr>
|
||||||
|
<h3>Ввод всех исходных данных без создания требуемого файла</h3>
|
||||||
|
<p>Изменим программу, заменив в заголовке цикла число <code>3</code> на <code>4</code>, и вновь запустим программу. Теперь все данные,
|
||||||
|
необходимые для выполнения задания, введены в программу (это видно по индикатору ввода). Однако задание не выполнено, поскольку результирующий файл
|
||||||
|
не создан. Поэтому решение опять признано ошибочным с диагностикой «<i>Результирующий файл не найден</i>»:</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/file48-3.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3>Пример программы, приводящей к ошибке времени выполнения</h3>
|
||||||
|
<p>Добавим в тело цикла после процедуры <code>Assign</code> вызов процедуры <code>Reset</code>, обеспечивающий открытие существующего файла:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><pre>
|
||||||
|
<b>uses</b> PT4;
|
||||||
|
<b>var</b>
|
||||||
|
i: integer;
|
||||||
|
s: string;
|
||||||
|
f: <b>array </b>[1..4] <b>of</b> <b>file</b> <b>of</b> integer;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('File48');
|
||||||
|
<b>for</b> i := 1 <b>to</b> 4 <b>do</b>
|
||||||
|
<b>begin</b>
|
||||||
|
read(s);
|
||||||
|
Assign(f[i], s);
|
||||||
|
Reset(f[i]);
|
||||||
|
<b>end</b>;
|
||||||
|
<b>end</b>. </pre></code>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Теперь запуск программы приведет к сообщению об ошибке «<i>Error System.IO.FileNotFoundException</i>»:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/file48-4.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Сообщение, начинающееся со слова <i>Error</i>, означает, что при работе программы произошла <i>ошибка времени выполнения</i>
|
||||||
|
(Runtime Error). После слова <i>Error</i> указывается имя этой ошибки (в данном случае <i>System.IO.FileNotFoundException</i>,
|
||||||
|
то есть ошибка ввода-вывода, связанная с тем, что файл не найден)
|
||||||
|
и краткое ее описание на английском языке.</p>
|
||||||
|
|
||||||
|
<p>Сообщение об ошибке времени выполнения появится и в разделе «Список ошибок»
|
||||||
|
окна <b>PascalABC.NET</b>:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/file48-5.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3>Создание пустого результирующего файла</h3>
|
||||||
|
<p>Для того чтобы избежать ошибки времени выполнения, отсутствующий файл результатов следует открыть
|
||||||
|
не процедурой <code>Reset</code>, а процедурой <code>Rewrite</code>, которая
|
||||||
|
и обеспечит создание этого файла. Далее, после завершения работы с файлами, открытыми в программе,
|
||||||
|
их необходимо закрыть процедурой <code>Close</code>. Добавим в программу соответствующие операторы:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><pre>
|
||||||
|
<b>uses</b> PT4;
|
||||||
|
<b>var</b>
|
||||||
|
i: integer;
|
||||||
|
s: string;
|
||||||
|
f: <b>array </b>[1..4] <b>of file of</b> integer;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('File48');
|
||||||
|
<b>for</b> i := 1 <b>to</b> 4 <b>do</b>
|
||||||
|
<b>begin</b>
|
||||||
|
read(s);
|
||||||
|
Assign(f[i], s);
|
||||||
|
<b>if</b> i < 4 <b>then</b> Reset(f[i])
|
||||||
|
<b>else</b> Rewrite(f[i]);
|
||||||
|
<b>end</b>;
|
||||||
|
{ * }
|
||||||
|
<b>for</b> i := 1 <b>to</b> 4 <b>do</b>
|
||||||
|
Close(f[i]);
|
||||||
|
<b>end</b>. </pre></code>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Комментарий <code>{ * }</code> расположен в том месте программы, в котором можно выполнять операции ввода-вывода для всех
|
||||||
|
четырех файлов: они уже открыты процедурами <code>Reset</code> или <code>Rewrite</code> и еще не закрыты процедурой <code>Close</code>.</p>
|
||||||
|
<p>Запуск этого варианта программы не приведет к ошибке времени выполнения; более того, результирующий файл будет создан.
|
||||||
|
Однако созданный файл останется пустым, то есть не содержащим ни одного элемента. Поэтому при запуске программы
|
||||||
|
на информационной панели появится сообщение «<i>Ошибочное решение</i>»,
|
||||||
|
а в строке, которая должна содержать элементы результирующего файла, появится текст <code>EOF:</code> (особое значение EOF для
|
||||||
|
указателя текущей файловой позиции означает, что данный файл существует, но не содержит ни одного элемента):</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/file48-6.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3>Пример программы, использующей неправильные типы для файловых данных</h3>
|
||||||
|
<p>Во всех ранее рассмотренных вариантах программы мы не использовали операции ввода-вывода для файлов.
|
||||||
|
Поэтому тип файлов не играл никакой роли: вместо типа <code><b>file of</b> integer</code> мы могли использовать любой другой файловый тип,
|
||||||
|
например, <code><b>file of</b> real</code>, и результат выполнения программы был бы тем же самым.</p>
|
||||||
|
<p>Тип файловых элементов становится принципиально важным, если в программе используются операции ввода-вывода
|
||||||
|
для данного файла. Чтобы продемонстрировать это на примере нашей программы, внесем в нее следующие изменения:
|
||||||
|
в описании массива <code>f</code> файловых переменных тип <code>integer</code> заменим на <code>real</code>, в раздел описаний добавим описание
|
||||||
|
переменной <code>a</code> типа <code>real</code>, в раздел операторов (в позицию, помеченную комментарием <code>{ * }</code>)
|
||||||
|
добавим следующий фрагмент:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><pre>
|
||||||
|
<b>for</b> i := 1 <b>to</b> 3 <b>do</b>
|
||||||
|
<b>begin</b>
|
||||||
|
read(f[i], a);
|
||||||
|
write(f[4], a);
|
||||||
|
<b>end</b>;
|
||||||
|
</pre></code>
|
||||||
|
</blockquote>
|
||||||
|
<p>Данный фрагмент обеспечивает считывание <i>одного</i> элемента для каждого из трех исходных файлов
|
||||||
|
и запись этих элементов в результирующий файл (в требуемом порядке). Подчеркнем, что мы <i>неправильно</i> указали
|
||||||
|
типы файлов; тем не менее, компиляция программы пройдет успешно, а после ее запуска не произойдет
|
||||||
|
ошибок времени выполнения.</p>
|
||||||
|
<p>Результат работы программы будет неожиданным:</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/file48-7.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Судя по экранной строке с содержимым результирующего файла, в него будут записаны не три, а <i>шесть элементов</i>,
|
||||||
|
по два начальных элемента из каждого исходного файла. Объясняется это тем, что после связывания файлов
|
||||||
|
с файловыми переменными типа <code><b>file of</b> real</code> элементами файлов стали считаться <i>вещественные числа</i>
|
||||||
|
(занимающие в памяти по 8 байтов), тогда как «на самом деле», то есть по условию задания, элементами файлов
|
||||||
|
являются целые числа (занимающие в памяти по 4 байта). Поэтому считывание из файла и последующая запись в файл
|
||||||
|
одного «вещественного элемента» фактически приводит к считыванию и записи блока данных размером 8 байтов,
|
||||||
|
содержащего <i>два</i> последовательных целочисленных элемента исходного файла.</p>
|
||||||
|
<p>Итак, мы выяснили, что ошибки, связанные с несоответствием типов файлов, не выявляются при компиляции
|
||||||
|
и не всегда приводят к ошибкам времени выполнения. Это следует иметь в виду, и при появлении «странных»
|
||||||
|
результирующих данных начинать поиск ошибки с проверки типов файловых переменных.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3>Исправление ошибки, связанной с неверными типами файловых данных</h3>
|
||||||
|
<p>Заменим в нашей программе все описания <code>real</code> на <code>integer</code>:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><pre>
|
||||||
|
<b>uses</b> PT4;
|
||||||
|
<b>var</b>
|
||||||
|
i: integer;
|
||||||
|
s: string;
|
||||||
|
f: <b>array </b>[1..4] <b>of file of</b> integer;
|
||||||
|
a: integer;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('File48');
|
||||||
|
<b>for</b> i := 1 <b>to</b> 4 <b>do</b>
|
||||||
|
<b>begin</b>
|
||||||
|
read(s);
|
||||||
|
Assign(f[i], s);
|
||||||
|
<b>if</b> i < 4 <b>then</b> Reset(f[i])
|
||||||
|
<b>else</b> Rewrite(f[i]);
|
||||||
|
<b>end</b>;
|
||||||
|
<b>for</b> i := 1 <b>to</b> 3 <b>do</b>
|
||||||
|
<b>begin</b>
|
||||||
|
read(f[i], a);
|
||||||
|
write(f[4], a);
|
||||||
|
<b>end</b>;
|
||||||
|
<b>for</b> i := 1 <b>to</b> 4 <b>do</b>
|
||||||
|
Close(f[i]);
|
||||||
|
<b>end</b>. </pre></code>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Мы получим все еще неверное, но вполне «понятное» решение: первые три элемента результирующего файла
|
||||||
|
совпадают с контрольными (то есть «правильными»), а прочие элементы отсутствуют:</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/file48-8.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3>Верное решение</h3>
|
||||||
|
<p>Приведем, наконец, верное решение задания
|
||||||
|
<code>File48</code>:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><pre>
|
||||||
|
<b>uses</b> PT4;
|
||||||
|
<b>var</b>
|
||||||
|
i, a: integer;
|
||||||
|
s: string;
|
||||||
|
f: <b>array </b>[1..4] <b>of file of</b> integer;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('File48');
|
||||||
|
<b>for</b> i := 1 <b>to</b> 4 <b>do</b>
|
||||||
|
<b>begin</b>
|
||||||
|
read(s);
|
||||||
|
Assign(f[i], s);
|
||||||
|
<b>if</b> i < 4 <b>then</b> Reset(f[i])
|
||||||
|
<b>else</b> Rewrite(f[i]);
|
||||||
|
<b>end</b>;
|
||||||
|
<b>while</b> <b>not</b> Eof(f[1]) <b>do</b>
|
||||||
|
<b>for</b> i := 1 <b>to</b> 3 <b>do</b>
|
||||||
|
<b>begin</b>
|
||||||
|
read(f[i], a);
|
||||||
|
write(f[4], a);
|
||||||
|
<b>end</b>;
|
||||||
|
<b>for</b> i := 1 <b>to</b> 4 <b>do</b>
|
||||||
|
Close(f[i]);
|
||||||
|
<b>end</b>. </pre></code>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>От предыдущего варианта данное решение отличается добавлением заголовка цикла <code><b>while not</b> Eof(f[1]) <b>do</b></code>,
|
||||||
|
который обеспечивает считывание всех элементов из исходных файлов (напомним, что по условию задания все исходные
|
||||||
|
файлы имеют <i>одинаковый размер</i>) и запись их в результирующий файл в нужном порядке.
|
||||||
|
После запуска этого варианта мы получим сообщение «<i>Верное решение. Тест номер 1 (из 5)</i>»,
|
||||||
|
а после пяти подобных запусков — сообщение «<i>Задание выполнено!</i>»:</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/file48-9.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3>Просмотр результатов выполнения задания</h3>
|
||||||
|
<p>Щелкнув мышью на метке «Результаты (F2)», расположенной в правом верхнем
|
||||||
|
углу окна задачника, или нажав клавишу <b>F2</b>, мы можем вывести на экран <i>окно результатов</i>,
|
||||||
|
в котором будет перечислены все наши попытки решения задачи:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><pre>
|
||||||
|
File48 a08/09 12:43 Ознакомительный запуск.
|
||||||
|
File48 a08/09 12:50 Введены не все требуемые исходные данные.
|
||||||
|
File48 a08/09 12:52 Результирующий файл не найден.
|
||||||
|
File48 a08/09 12:53 Error System.IO.FileNotFoundException.
|
||||||
|
File48 a08/09 12:57 Ошибочное решение.--3
|
||||||
|
File48 a08/09 13:06 Задание выполнено!
|
||||||
|
</pre></code>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Для закрытия окна результатов достаточно нажать клавишу <b>Esc</b>.
|
||||||
|
Окно результатов можно отобразить на экране и после закрытия окна задачника и возврата в среду PascalABC.NET.
|
||||||
|
Для этого надо использовать команду меню «Модули | Просмотреть результаты», кнопку
|
||||||
|
<img border="0" src="gif/Results.gif" width="16" height="17"> или клавиатурную
|
||||||
|
комбинацию <b>Shift+Ctrl+R</b>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
535
PABCNetHelp/ForEducation/CheckedTasks/ctpointer.html
Normal file
|
|
@ -0,0 +1,535 @@
|
||||||
|
<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>
|
||||||
|
|
||||||
|
<H2>Пример 1. Анализ существующей динамической структуры</H2>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<p>В заданиях группы Dynamic мы встречаемся с двумя новыми видами данных: это <i>динамические структуры</i>,
|
||||||
|
реализованные в виде цепочек связанных друг
|
||||||
|
с другом записей типа <code>TNode</code>, и <i>указатели</i> типа <code>PNode</code> на записи <code>TNode</code>:
|
||||||
|
<code>PNode = ^TNode</code>. Типы <code>TNode</code> и <code>PNode</code> не являются стандартными типами языка Паскаль;
|
||||||
|
они определены в задачнике Programming Taskbook следующим образом (приводятся только те поля записи <code>TNode</code>, которые
|
||||||
|
используются при выполнении заданий группы Dynamic):</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><pre>
|
||||||
|
<b>type</b>
|
||||||
|
PNode = ^TNode;
|
||||||
|
TNode = <b>record</b>
|
||||||
|
Data: integer;
|
||||||
|
Next: PNode;
|
||||||
|
Prev: PNode;
|
||||||
|
. . .
|
||||||
|
<b>end</b>;
|
||||||
|
</pre></code>
|
||||||
|
</blockquote>
|
||||||
|
<p>На примере задания Dynamic2 рассмотрим особенности, связанные с
|
||||||
|
использованием этих новых типов данных.</p>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3>Создание программы-заготовки и знакомство с заданием</h3>
|
||||||
|
|
||||||
|
<p>Программа-заготовка для задания Dynamic2, созданная с помощью команды
|
||||||
|
меню «Модули | Создать шаблон программы», кнопки
|
||||||
|
<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('Dynamic2');
|
||||||
|
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>После запуска данной программы на экране появится <a href="../PT4/window.html">окно задачника</a>:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic2-1.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p>Это окно содержит в качестве исходных и результирующих данных новые элементы: динамические структуры и указатели.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Начнем с описания того, как отображается на экране <i>динамическая структура</i>. Для ее вывода используются две
|
||||||
|
экранные строки; в первой строке отображаются имена указателей, связанных с данной структурой,
|
||||||
|
а во второй — содержимое элементов этой структуры, то есть значения их полей <code>Data</code> и способ связи
|
||||||
|
между ними. Вся информация о динамической структуре отображается бирюзовым цветом (подобно информации об элементах файлов).</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Рассмотрим в качестве примера динамическую структуру, указанную на рисунке:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><pre>
|
||||||
|
P<sub>1</sub>
|
||||||
|
75 - 65 - 22 - 26 - 10 >nil
|
||||||
|
</pre></code>
|
||||||
|
</blockquote>
|
||||||
|
<p>Этот текст означает, что структура состоит из 5 элементов, причем ее первый элемент имеет поле <code>Data</code>,
|
||||||
|
равное 75, и связан с помощью своего поля <code>Next</code> со вторым элементом, поле <code>Data</code>
|
||||||
|
которого равно 65, и так далее до последнего, пятого элемента, поле <code>Data</code> которого равно 10,
|
||||||
|
а поле <code>Next</code> равно <code>nil</code>, что является признаком завершения структуры.
|
||||||
|
Таким образом, текст, описывающий данную динамическую структуру, является максимально упрощенным вариантом
|
||||||
|
следующей схемы:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic2-2.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Поскольку эта структура указана в разделе исходных данных, следовательно, после инициализации задания
|
||||||
|
она <i>уже существует</i> и размещается в некоторой области динамической памяти (подобно тому, как исходные файлы
|
||||||
|
после инициализации задания размещаются в каталоге учащегося).</p>
|
||||||
|
<p>Как получить доступ к этой существующей динамической структуре? Здесь также уместна аналогия с файлами.
|
||||||
|
Для доступа к внешнему файлу необходимо знать его <i>имя</i>, и в любом задании на обработку файлов
|
||||||
|
имена исходных файлов входят в набор исходных данных. Для доступа к данным,
|
||||||
|
размещенным в динамической памяти, необходимо знать их <i>адрес</i>, и поэтому в любом задании на
|
||||||
|
обработку динамических структур в набор исходных данных входят <i>указатели</i>, содержащие адреса этих структур.</p>
|
||||||
|
<p>Из текста, описывающего динамическую структуру, видно, что на ее первый элемент указывает указатель
|
||||||
|
с именем <code>P<sub>1</sub></code>, который также содержится в наборе исходных данных. Описание этого указателя имеет вид</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><pre>
|
||||||
|
P<sub>1</sub> = ptr
|
||||||
|
</pre></code>
|
||||||
|
</blockquote>
|
||||||
|
<p>Здесь текст <code>P<sub>1</sub> =</code> является <i>комментарием</i> и выделяется, как обычный комментарий,
|
||||||
|
светло-серым цветом, а текст <code>ptr</code> означает, что этот элемент исходных данных является <i>указателем</i>,
|
||||||
|
который надо ввести в программу с помощью процедуры ввода <code>read</code>.</p>
|
||||||
|
<p><b>Замечание.</b> Может возникнуть вопрос: почему вместо условного текста «ptr» не отображается «настоящее» значение указателя
|
||||||
|
(то есть некоторый четырехбайтный адрес)? Это связано с тем, что, даже выведя это значение на экран,
|
||||||
|
мы не сможем определить, с какими данными связан этот адрес, поэтому подобная информация на экране будет излишней.</p>
|
||||||
|
<p>Итак, слово <code>ptr</code> в разделе исходных или результирующих данных означает, что соответствующий элемент данных
|
||||||
|
является <i>указателем</i>, причем непустым (для пустого указателя используется слово <code><b>nil</b></code>).
|
||||||
|
Определить, с каким элементом динамической структуры данных связан непустой указатель, можно по экранной
|
||||||
|
информации об этой динамической структуре.
|
||||||
|
Разумеется, при чтении указателя программа учащегося получит «настоящий» адрес, с помощью которого она сможет
|
||||||
|
обратиться к исходной динамической структуре.</p>
|
||||||
|
<p>Аналогично, создав (или преобразовав) некоторую динамическую
|
||||||
|
структуру, программа учащегося должна передать задачнику некоторый адрес,
|
||||||
|
связанный в этой структурой (используя процедуру вывода <code>write</code>).
|
||||||
|
Зная этот адрес, задачник сможет проверить правильность созданной структуры.</p>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3>Приступаем к решению</h3>
|
||||||
|
|
||||||
|
<p>Вернемся к заданию
|
||||||
|
Dynamic2. В нем не требуется ни создавать, ни преобразовывать исходную структуру данных;
|
||||||
|
ее необходимо лишь проанализировать,
|
||||||
|
а именно, определить значения всех ее элементов, подсчитать количество элементов и, кроме того,
|
||||||
|
вывести указатель на последний элемент этой структуры.</p>
|
||||||
|
<p>Приведем вначале неполное решение задачи, выводящее все необходимые данные, кроме указателя на последний элемент:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><pre>
|
||||||
|
<b>uses</b> PT4;
|
||||||
|
<b>var</b>
|
||||||
|
p1: PNode;
|
||||||
|
n: integer;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('Dynamic2');
|
||||||
|
read(p1);
|
||||||
|
n := 0;
|
||||||
|
<b>while</b> p1 <> nil <b>do</b>
|
||||||
|
<b>begin</b>
|
||||||
|
write(p1^.Data);
|
||||||
|
n := n + 1;
|
||||||
|
p1 := p1^.Next;
|
||||||
|
<b>end</b>;
|
||||||
|
write(n);
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code>
|
||||||
|
</blockquote>
|
||||||
|
<p>После запуска программы можно убедиться, что все числовые результирующие данные найдены правильно,
|
||||||
|
однако из-за того, что не выведен указатель
|
||||||
|
на последний элемент, решение признано ошибочным с диагностикой «<i>Выведены не все результирующие данные</i>»:</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic2-3.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Добавим в конец программы оператор</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><pre>
|
||||||
|
write(p1);
|
||||||
|
</pre></code>
|
||||||
|
</blockquote>
|
||||||
|
<p>После запуска нового варианта программы все требуемые данные будут выведены, однако результирующее значение
|
||||||
|
указателя будет равно <code>nil</code>. Это связано
|
||||||
|
с тем, что после завершения цикла <code><b>while</b></code> в переменной <code>p1</code> содержится <i>нулевой указатель</i>,
|
||||||
|
а не указатель на последний элемент динамической структуры:</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic2-4.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3>Правильное решение</h3>
|
||||||
|
|
||||||
|
<p>Для того чтобы получить правильное решение, опишем вспомогательную переменную <code>p2</code>,
|
||||||
|
в которой будем сохранять адрес элемента, <i>предшествующего</i> элементу с адресом <code>p1</code>.
|
||||||
|
После завершения цикла <code><b>while</b></code> в этой переменной будет храниться адрес последнего элемента
|
||||||
|
динамической структуры:</p>
|
||||||
|
<blockquote><code><pre>
|
||||||
|
<b>uses</b> PT4;
|
||||||
|
<b>var</b>
|
||||||
|
p1,p2: PNode;
|
||||||
|
n: integer;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('Dynamic2');
|
||||||
|
read(p1);
|
||||||
|
n := 0;
|
||||||
|
<b>while</b> p1 <> nil <b>do</b>
|
||||||
|
<b>begin</b>
|
||||||
|
write(p1^.Data);
|
||||||
|
n := n + 1;
|
||||||
|
p2 := p1; { сохраняем адрес текущего элемента }
|
||||||
|
p1 := p1^.Next; { и переходим к следующему элементу }
|
||||||
|
<b>end</b>;
|
||||||
|
write(n, p2);
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
|
||||||
|
<p>Запустив эту программу три раза, мы получим сообщение «<i>Задание выполнено!</i>»:</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic2-5.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<H2>Пример 2. Добавление элемента к динамической структуре</H2>
|
||||||
|
<hr>
|
||||||
|
<h3>Знакомство с заданием</h3>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Рассмотрим простейшее задание, связанное с добавлением элемента к динамической структуре-стеку:
|
||||||
|
Dynamic3.</p>
|
||||||
|
<p>При ознакомительном запуске этого задания мы обнаружим новое обозначение в тексте, описывающем результирующий стек,
|
||||||
|
а именно, точки, обрамляющие первый элемент стека:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic3-1.png">
|
||||||
|
</blockquote>
|
||||||
|
<p>Точки обозначают элементы динамической структуры, память для которых <i>должна быть выделена программой учащегося</i>
|
||||||
|
(в отличие от тех элементов, которые размещаются в памяти самим задачником).</p>
|
||||||
|
<hr>
|
||||||
|
<h3>Приступаем к решению</h3>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Что произойдет, если динамическая структура будет создана с ошибками? Для того чтобы это выяснить, вернем в программе, решающей задание
|
||||||
|
Dynamic3, указатель на прежнюю вершину стека, не добавляя к ней новый элемент:</p>
|
||||||
|
<blockquote><code><pre>
|
||||||
|
<b>uses</b> PT4;
|
||||||
|
<b>var</b>
|
||||||
|
d: integer;
|
||||||
|
p1: PNode;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('Dynamic3');
|
||||||
|
read(d, p1);
|
||||||
|
write(p1);
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>После запуска данной программы окно задачника примет вид:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic3-2.png">
|
||||||
|
</blockquote>
|
||||||
|
<p>Скобки вокруг каждого элемента результирующего стека означают, что эти элементы созданы самим задачником, но <i>располагаются
|
||||||
|
не на тех позициях, на которых они должны находиться при правильном решении</i>. Действительно, тот элемент,
|
||||||
|
который в решении является первым, должен (после добавления нового элемента) оказаться вторым и т. д. Итак,
|
||||||
|
наличие скобок в тексте результирующей динамической структуры означает, что ее элементы располагаются не в том порядке,
|
||||||
|
который требуется.</p>
|
||||||
|
<hr>
|
||||||
|
<h3>Правильное решение</h3>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Для получения правильного решения задания Dynamic3 необходимо явно выделить память для нового элемента,
|
||||||
|
используя процедуру <code>New</code>, и заполнить поля этого элемента, связав его с текущей вершиной стека
|
||||||
|
(в результате сам этот элемент станет новой вершиной, адрес которой и следует вывести):</p>
|
||||||
|
<blockquote><code><pre>
|
||||||
|
<b>uses</b> PT4;
|
||||||
|
<b>var</b>
|
||||||
|
d: integer;
|
||||||
|
p1, p2: PNode;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('Dynamic3');
|
||||||
|
read(d, p1);
|
||||||
|
New(p2);
|
||||||
|
p2^.Data := D;
|
||||||
|
p2^.Next := p1;
|
||||||
|
write(p2);
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>Приведем вид окна задачника при первом запуске этой программы:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic3-3.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<H2>Пример 3. Удаление элемента из динамической структуры</H2>
|
||||||
|
<hr>
|
||||||
|
<h3>Знакомство с заданием</h3>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Рассмотрим простейшее задание на удаление элемента из динамической структуры —
|
||||||
|
Dynamic5.
|
||||||
|
В нем требуется удалить из стека вершину и вернуть указатель на новую вершину, то есть на элемент,
|
||||||
|
расположенный непосредственно за удаленным.</p>
|
||||||
|
<p>Особенность заданий на удаление элементов из динамических структур заключается в том, что удаляемый элемент
|
||||||
|
необходимо не только «отсоединить»
|
||||||
|
от исходной динамической структуры, но и полностью «уничтожить», то есть <i>освободить память, занимаемую этим элементом</i>.</p>
|
||||||
|
<p>Для того чтобы напомнить учащемуся о необходимости уничтожения некоторых элементов исходной динамической
|
||||||
|
структуры, эти элементы выделяются на экране синим цветом меньшей яркости, чем обычные элементы (на рисунке
|
||||||
|
таким способом выделен элемент 15):</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic5-1.png">
|
||||||
|
</blockquote>
|
||||||
|
<hr>
|
||||||
|
<h3>Приступаем к решению</h3>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Вначале приведем неправильный вариант решения, в котором
|
||||||
|
не освобождается память, занимаемая удаленным из стека элементом:</p>
|
||||||
|
<blockquote><code><pre>
|
||||||
|
<b>uses</b> PT4;
|
||||||
|
<b>var</b> p1: PNode;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('Dynamic5');
|
||||||
|
read(p1);
|
||||||
|
write(p1^.Data, p1^.Next);
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>Несмотря на то что все результирующие данные будут совпадать с контрольными
|
||||||
|
(то есть текст в разделах «Полученные результаты» и «Пример верного решения» будет одинаковым), на
|
||||||
|
информационной панели появится сообщение об ошибке «<i>Не освобождена динамическая память</i>»,
|
||||||
|
а в разделе исходных данных будет выделен красным цветом тот элемент, который требовалось удалить:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic5-2.png">
|
||||||
|
</blockquote>
|
||||||
|
<hr>
|
||||||
|
<h3>Правильное решение</h3>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Для получения правильного решения достаточно добавить в конец программы оператор вызова
|
||||||
|
процедуры <code>Dispose</code>, освобождающий память, на которую указывает указатель <code>p1</code>:</p>
|
||||||
|
<blockquote><code><pre>
|
||||||
|
<b>uses</b> PT4;
|
||||||
|
<b>var</b> p1: PNode;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('Dynamic5');
|
||||||
|
read(p1);
|
||||||
|
write(p1^.Data, p1^.Next);
|
||||||
|
Dispose(p1);
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>Приведем вид окна задачника при первом запуске этой программы:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic5-3.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<H2>Пример 4. Двусвязные динамические структуры</H2>
|
||||||
|
<hr>
|
||||||
|
<h3>Знакомство с заданием</h3>
|
||||||
|
<p>Особенности работы с двусвязными динамическими структурами рассмотрим на примере задания
|
||||||
|
Dynamic30,
|
||||||
|
в котором требуется преобразовать исходную односвязную структуру в двусвязную. Запустив программу-заготовку,
|
||||||
|
созданную для этого задания, мы увидим в области исходных данных информацию об «обычной» односвязной структуре,
|
||||||
|
подобной рассмотренным в предыдущих примерах:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic30-1.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Динамическая структура, приведенная в разделе результатов, имеет две особенности:
|
||||||
|
во-первых, ее элементы связаны символом <code>=</code>, а во-вторых, перед первым элементом присутствует текст
|
||||||
|
<code>nil<</code>.</p>
|
||||||
|
<p>Это означает, что результирующая структура является <i>двусвязной</i>, то есть каждый ее элемент связан не
|
||||||
|
только с последующим элементом (с помощью поля <code>Next</code>, как в односвязной структуре), но и с
|
||||||
|
предыдущим элементом (с помощью нового поля <code>Prev</code>), а поле <code>Prev</code> первого элемента имеет
|
||||||
|
значение <code>nil</code>:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic30-2.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3>Приступаем к решению</h3>
|
||||||
|
|
||||||
|
<p>Для преобразования исходной односвязной структуры в двусвязную необходимо задать правильные значения для
|
||||||
|
полей <code>Prev</code> всех элементов структуры, перебирая в цикле пары соседних элементов:</p>
|
||||||
|
<blockquote><code><pre>
|
||||||
|
<b>uses</b> PT4;
|
||||||
|
<b>var</b>
|
||||||
|
p1, p: PNode;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('Dynamic30');
|
||||||
|
read(p1);
|
||||||
|
p := p1^.Next;
|
||||||
|
<b>while</b> p <> nil <b>do</b>
|
||||||
|
<b>begin</b>
|
||||||
|
p^.Prev := p1;
|
||||||
|
p1 := p1^.Next;
|
||||||
|
p := p^.Next;
|
||||||
|
<b>end</b>;
|
||||||
|
write(p1); <i>{ вывод указателя на последний элемент }</i>
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>В этой программе мы определили поля <code>Prev</code> для всех элементов, кроме первого. Поэтому решение будет считаться ошибочным
|
||||||
|
(обратите внимание на то, что перед первым элементом полученного списка отсутствует текст <code>nil<</code>):</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic30-3.png">
|
||||||
|
</blockquote>
|
||||||
|
<p><b>Замечание.</b> При анализе ошибочного решения часто оказывается полезным и специальное обозначение «<code>=</code>» для двойной связи.
|
||||||
|
Предположим, например, что информация
|
||||||
|
о результирующей двусвязной структуре, созданной программой, имеет вид:</p>
|
||||||
|
<blockquote><code><pre>
|
||||||
|
P<sub>2</sub>
|
||||||
|
nil< 33 = 64 - 78 = 12 = 51 >nil
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>Это означает, что между вторым и третьим элементом структуры имеется не двойная, а <i>одинарная</i> связь
|
||||||
|
(поле <code>Next</code> второго элемента содержит адрес третьего элемента, а поле <code>Prev</code> третьего элемента
|
||||||
|
<i>не содержит</i> адрес второго).</p>
|
||||||
|
<hr>
|
||||||
|
<h3>Правильное решение</h3>
|
||||||
|
<p>Для получения правильного решения достаточно добавить в программу перед циклом <code>while</code>
|
||||||
|
следующий оператор:</p>
|
||||||
|
<blockquote><code><pre>
|
||||||
|
p1^.Prev := nil;
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>Приведем вид окна задачника при первом запуске исправленной программы:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic30-4.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p><b>Замечание.</b> Для задания Dynamic30 возможен более короткий вариант решения,
|
||||||
|
в котором не требуется особо обрабатывать первый элемент списка:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<blockquote><code><pre>
|
||||||
|
<b>uses</b> PT4;
|
||||||
|
<b>var</b>
|
||||||
|
p1, p: PNode;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('Dynamic30');
|
||||||
|
p := nil;
|
||||||
|
read(p1);
|
||||||
|
<b>while</b> p1 <> nil <b>do</b>
|
||||||
|
<b>begin</b>
|
||||||
|
p1^.Prev := p;
|
||||||
|
p := p1;
|
||||||
|
p1 := p1^.Next;
|
||||||
|
<b>end</b>;
|
||||||
|
write(p);
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<H2>Пример 5. Циклические динамические структуры</H2>
|
||||||
|
<hr>
|
||||||
|
<h3>Знакомство с заданием</h3>
|
||||||
|
<p>Динамическая структура называется <i>циклической</i>, если она замкнута в «кольцо», то есть ее последний элемент
|
||||||
|
связан полем <code>Next</code> с первым (в случае двусвязной структуры требуется также, чтобы ее первый элемент
|
||||||
|
был связан полем <code>Prev</code>
|
||||||
|
с последним элементом). Простейшим заданием на циклические структуры является
|
||||||
|
Dynamic55, в котором требуется
|
||||||
|
преобразовать обычный двусвязный список
|
||||||
|
в циклический.</p>
|
||||||
|
<p>Запустив программу-заготовку для этого задания, мы увидим
|
||||||
|
на экране изображение двух динамических структур, причем исходная структура является «обычным» двусвязным списком,
|
||||||
|
а результирующая структура — циклическим двусвязным списком:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic55-1.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Обозначения <code><< =</code> и <code>= >></code> позволяют отличить циклический список от обычного
|
||||||
|
(напомним, что у обычного двусвязного списка поле <code>Prev</code> первого элемента и поле <code>Next</code> последнего
|
||||||
|
элемента равны <code><b>nil</b></code>).</p>
|
||||||
|
<p>Таким образом, экранный текст, описывающий циклический двусвязный список, является упрощенным вариантом
|
||||||
|
следующей схемы:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic55-2.png">
|
||||||
|
</blockquote>
|
||||||
|
<hr>
|
||||||
|
<h3>Приступаем к решению</h3>
|
||||||
|
<p>Для решения задания Dynamic55 достаточно найти последний элемент исходного списка и связать его с
|
||||||
|
первым элементом:</p>
|
||||||
|
<blockquote><code><pre>
|
||||||
|
<b>uses</b> PT4;
|
||||||
|
<b>var</b>
|
||||||
|
p1, p2: PNode;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('Dynamic55');
|
||||||
|
read(p1);
|
||||||
|
p2 := p1;
|
||||||
|
<b>while</b> p2^.Next <> <b>nil</b> <b>do</b>
|
||||||
|
p2 := p2^.Next;
|
||||||
|
p2^.Next := p1;
|
||||||
|
write(p2);
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>В данном варианте решения мы «забыли» о том, что надо связать не только последний элемент с первым,
|
||||||
|
но и первый с последним (поскольку наш список — двусвязный). Поэтому решение оказалось ошибочным
|
||||||
|
(обратите внимание на то, что после последнего элемента полученного списка изображена одинарная, а не двойная черта):</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic55-3.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3>Правильное решение</h3>
|
||||||
|
<p>Для получения правильного решения достаточно добавить в программу перед процедурой вывода <code>write</code>
|
||||||
|
следующий оператор:</p>
|
||||||
|
<blockquote><code><pre>
|
||||||
|
p1^.Prev := p2;
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>Приведем вид окна задачника при первом запуске исправленной программы:</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Dynamic55-4.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3>Просмотр результатов выполнения заданий</h3>
|
||||||
|
<p>Щелкнув мышью на метке «Результаты (F2)», расположенной в правом верхнем
|
||||||
|
углу окна задачника, или нажав клавишу <b>F2</b>, мы можем вывести на экран <i>окно результатов</i>,
|
||||||
|
в котором будет перечислены все наши попытки решения задачи:</p>
|
||||||
|
|
||||||
|
<blockquote><code><pre>
|
||||||
|
Dynamic2 a08/09 13:11 Ознакомительный запуск.
|
||||||
|
Dynamic2 a08/09 13:15 Выведены не все результирующие данные.
|
||||||
|
Dynamic2 a08/09 13:17 Ошибочное решение.
|
||||||
|
Dynamic2 a08/09 13:20 Задание выполнено!
|
||||||
|
Dynamic3 a08/09 13:21 Ознакомительный запуск.
|
||||||
|
Dynamic3 a08/09 13:24 Ошибочное решение.
|
||||||
|
Dynamic3 a08/09 13:28 Задание выполнено!
|
||||||
|
Dynamic5 a08/09 13:29 Ознакомительный запуск.
|
||||||
|
Dynamic5 a08/09 13:30 Не освобождена динамическая память.
|
||||||
|
Dynamic5 a08/09 13:31 Задание выполнено!
|
||||||
|
Dynamic30 a08/09 13:34 Ознакомительный запуск.
|
||||||
|
Dynamic30 a08/09 13:42 Ошибочное решение.
|
||||||
|
Dynamic30 a08/09 13:43 Задание выполнено!
|
||||||
|
Dynamic55 a08/09 13:54 Ознакомительный запуск.
|
||||||
|
Dynamic55 a08/09 13:57 Ошибочное решение.
|
||||||
|
Dynamic55 a08/09 13:58 Задание выполнено!
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>Для закрытия окна результатов достаточно нажать клавишу <b>Esc</b>.
|
||||||
|
Окно результатов можно отобразить на экране и после закрытия окна задачника и возврата в среду PascalABC.NET.
|
||||||
|
Для этого надо использовать команду меню «Модули | Просмотреть результаты», кнопку
|
||||||
|
<img border="0" src="gif/Results.gif" width="16" height="17"> или клавиатурную
|
||||||
|
комбинацию <b>Shift+Ctrl+R</b>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
215
PABCNetHelp/ForEducation/CheckedTasks/ctstring.html
Normal file
|
|
@ -0,0 +1,215 @@
|
||||||
|
<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>
|
||||||
314
PABCNetHelp/ForEducation/CheckedTasks/cttree.html
Normal file
|
|
@ -0,0 +1,314 @@
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||||
|
<title></title>
|
||||||
|
<link rel="StyleSheet" href="../../default.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<a name="main"></a>
|
||||||
|
|
||||||
|
<h1>Задания на обработку деревьев
|
||||||
|
</h1>
|
||||||
|
<hr>
|
||||||
|
<h2>Пример 1. Анализ бинарного дерева
|
||||||
|
</h2>
|
||||||
|
<hr>
|
||||||
|
<p>В заданиях группы Tree, как и в заданиях группы Dynamic, мы встречаемся с двумя новыми видами данных:
|
||||||
|
это <i>древовидные динамические структуры</i>, реализованные в виде наборов связанных друг с
|
||||||
|
другом записей типа <code>TNode</code>, и <i>указатели</i> типа <code>PNode</code> на записи <code>TNode</code>: <code>PNode =
|
||||||
|
^TNode</code>. <a href="..\PT4\IO.html#node">Типы <code>TNode</code> и <code>PNode</code></a> не являются стандартными типами языка Паскаль; они
|
||||||
|
определены в задачнике Programming Taskbook.
|
||||||
|
</p>
|
||||||
|
<p>Особенности, связанные с использованием новых типов данных, рассмотрим на
|
||||||
|
примере задания Tree2.
|
||||||
|
</p>
|
||||||
|
<p class="task">Tree2°.
|
||||||
|
Дан адрес <i>P</i><sub>1</sub> записи типа TNode — корня дерева.
|
||||||
|
Эта запись связана полями Left и Right с другими записями того же типа (дочерними вершинами),
|
||||||
|
они, в свою очередь, — со своими дочерними вершинами, и так далее до записей,
|
||||||
|
поля Left и Right которых равны nil (у некоторых вершин может быть равно nil одно из полей Left или Right).
|
||||||
|
Вывести количество вершин дерева.
|
||||||
|
</p>
|
||||||
|
<hr>
|
||||||
|
<h3>Создание программы-заготовки и знакомство с заданием</h3>
|
||||||
|
<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('Tree2');
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>После запуска программы на экране появится <a href="../PT4/window.html">окно задачника</a>:
|
||||||
|
</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Tree2-1.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Это окно содержит в качестве исходных и результирующих данных новые
|
||||||
|
элементы: бинарные деревья и указатели.
|
||||||
|
</p>
|
||||||
|
<p>Начнем с описания того, как отображается на экране <i>дерево</i>. Для его вывода используется
|
||||||
|
несколько экранных строк. На каждой строке изображаются вершины дерева,
|
||||||
|
находящиеся на определенном уровне (номер уровня указывается слева от изображения дерева).
|
||||||
|
Для каждой вершины выводится ее значение, т. е. значение поля Data соответствующей записи типа TNode.
|
||||||
|
Любая вершина соединяется линиями со своими дочерними вершинами, расположенными на следующем уровне дерева;
|
||||||
|
левая дочерняя вершина изображается слева от родительской вершины, а правая — справа.
|
||||||
|
Отсутствие у вершины одной или обеих дочерних вершин означает, что ее поля <code>Left</code> и/или <code>Right</code> равны <code>nil</code>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Рассмотрим в качестве примера дерево, приведенное на рисунке.
|
||||||
|
Корень этого дерева имеет значение 15, левая дочерняя вершина корня равна 58,
|
||||||
|
правая дочерняя вершина равна 42, глубина дерева равна 4. Все листья дерева находятся на уровнях
|
||||||
|
3 и 4; листья на уровне 3 имеют значения 15 и 11, листья на уровне 4 — значения 38 и 84.
|
||||||
|
Некоторые из внутренних вершин дерева имеют по две
|
||||||
|
дочерние вершины (это корень и вершины со значениями 55 и 20), некоторые по одной:
|
||||||
|
левой (вершины 42, 87 и 60) или правой (вершина 58).
|
||||||
|
</p>
|
||||||
|
<p>Поскольку это дерево указано в разделе исходных данных, следовательно, после инициализации
|
||||||
|
задания оно уже существует и размещается в некоторой области динамической памяти.
|
||||||
|
Для доступа к данным, размещенным в динамической памяти,
|
||||||
|
необходимо знать их адрес, поэтому в любом задании на обработку деревьев в набор исходных данных входят
|
||||||
|
<i>указатели</i>, содержащие адреса каких-либо вершин этих деревьев (как правило, указывается адрес корня дерева).
|
||||||
|
</p>
|
||||||
|
<p>Работа с исходными и результирующими
|
||||||
|
данными типа указателя подробно обсуждается в разделе, посвященном
|
||||||
|
<a href="ctpointer.html">линейным динамическим структурам</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3>Решение задачи</h3>
|
||||||
|
|
||||||
|
<p>В задании Tree2 не требуется ни создавать, ни
|
||||||
|
преобразовывать исходное дерево;
|
||||||
|
его необходимо лишь проанализировать, а именно определить количество его вершин.
|
||||||
|
</p>
|
||||||
|
<p>Для выполнения этого задания, как и для подавляющего большинства других заданий на обработку деревьев,
|
||||||
|
следует воспользоваться вспомогательной <i>рекурсивной</i> подпрограммой (функцией или процедурой).
|
||||||
|
Рекурсивная природа алгоритмов,
|
||||||
|
связанных с обработкой деревьев (в частности, бинарных деревьев), объясняется тем, что сами
|
||||||
|
определения деревьев общего вида и бинарных деревьев являются рекурсивными.
|
||||||
|
Так, дать словесное описание функции <code>NodeCount(P)</code>, подсчитывающей число вершин дерева с корнем,
|
||||||
|
с которым связан указатель <code>P</code>, можно следующим образом: если указатель <code>P</code> равен <code>nil</code>,
|
||||||
|
то следует вернуть значение <code>0</code>; в противном случае следует вернуть значение
|
||||||
|
<code>1 + NodeCount(P^.Left) + NodeCount(P^.Right)</code>
|
||||||
|
(в этом выражении первое слагаемое соответствует корню дерева, второе —
|
||||||
|
его левому поддереву, а третье — его правому поддереву; при этом не требуется проверять,
|
||||||
|
что указанные поддеревья существуют, так как при их отсутствии соответствующее слагаемое просто будет равно нулю).
|
||||||
|
</p>
|
||||||
|
<p>Таким образом, решение задачи будет иметь следующий вид:
|
||||||
|
</p>
|
||||||
|
<blockquote><code><pre>
|
||||||
|
<b>uses</b> PT4;
|
||||||
|
<b>function</b> NodeCount(P: PNode): integer;
|
||||||
|
begin
|
||||||
|
<b>if</b> P = nil <b>then</b>
|
||||||
|
result := 0
|
||||||
|
<b>else</b>
|
||||||
|
result := 1 + NodeCount(P^.Left) + NodeCount(P^.Right);
|
||||||
|
<b>end</b>;
|
||||||
|
<b>var</b> P1: PNode;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('Tree2');
|
||||||
|
read(P1);
|
||||||
|
write(NodeCount(P1));
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>Цепочка рекурсивных вызовов функции <code>NodeCount</code> завершается при достижении терминальной вершины (листа),
|
||||||
|
у которой поля <code>Left</code> и <code>Right</code> равны <code>nil</code>. Благодаря наличию функции <code>NodeCount</code>,
|
||||||
|
раздел операторов программы является очень кратким: в нем считывается адрес <code>P1</code> корня исходного дерева,
|
||||||
|
после чего вызывается функция <code>NodeCount(P1)</code>, возвращаемое значение которой сразу выводится процедурой write.
|
||||||
|
</p>
|
||||||
|
<p>Запустив эту программу пять раз, мы получим сообщение «<i>Задание
|
||||||
|
выполнено!</i>».
|
||||||
|
</p>
|
||||||
|
<hr>
|
||||||
|
<a name="parent"></a>
|
||||||
|
<h2>Пример 2. Бинарные деревья с обратной связью
|
||||||
|
</h2>
|
||||||
|
<hr>
|
||||||
|
<p>Рассмотренная выше реализация бинарных деревьев позволяет легко переходить от родительских вершин
|
||||||
|
к их дочерним вершинам, но не допускает обратного перехода. В то же время, для некоторых задач,
|
||||||
|
связанных с обработкой деревьев, возможность обратного перехода от потомков к их предку позволяет
|
||||||
|
получить более простое решение. Ясно, что для обеспечения возможности обратного перехода
|
||||||
|
каждую вершину дерева надо снабдить еще одним полем связи, в котором должна храниться ссылка на
|
||||||
|
ее родительскую вершину. Это поле связи естественно назвать <code>Parent</code>. Поскольку корень дерева
|
||||||
|
предка не имеет, его поле <code>Parent</code> должно быть равно <code>nil</code>.
|
||||||
|
</p>
|
||||||
|
<p>Деревья, вершины которых содержат информацию о своих родителях, будем называть <i>деревьями с обратной связью</i>.
|
||||||
|
Особенности работы с подобными деревьями рассмотрим на примере задания Tree49.
|
||||||
|
</p>
|
||||||
|
<p class="task">Tree49°.
|
||||||
|
Дан указатель <i>P</i><sub>1</sub> на корень дерева, вершинами которого являются записи типа TNode,
|
||||||
|
связанные между собой с помощью полей Left и Right. Используя поле Parent записи TNode,
|
||||||
|
преобразовать исходное дерево в <i>дерево с обратной связью</i>, в котором каждая вершина
|
||||||
|
связана не только со своими дочерними вершинами (полями Left и Right), но и с родительской
|
||||||
|
вершиной (полем Parent). Поле Parent корня дерева положить равным nil.
|
||||||
|
</p>
|
||||||
|
<p>Запустив программу-заготовку, созданную для задания Tree49,
|
||||||
|
мы увидим в области исходных данных изображение «обычного» бинарного дерева,
|
||||||
|
в то время как в области результатов будет изображено дерево с обратной связью,
|
||||||
|
вершины которого связаны не одинарными, а двойными линиями.
|
||||||
|
</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Tree49-1.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Обратите также внимание на то, что в области результатов отсутствуют какие-либо данные, кроме
|
||||||
|
измененного дерева. Это означает, что в программе, решающей задачу, не требуется использовать
|
||||||
|
процедуры вывода; достаточно лишь преобразовать исходное дерево требуемым образом.
|
||||||
|
Поскольку при таком преобразовании адрес корня дерева <i>P</i><sub>1</sub>
|
||||||
|
не изменится, задачник сможеть получить доступ к
|
||||||
|
этому дереву и проверить его правильность.
|
||||||
|
</p>
|
||||||
|
<p>Для преобразования исходного дерева в дерево с обратной связью необходимо задать правильные значения
|
||||||
|
для полей <code>Parent</code> всех вершин дерева, перебирая эти вершины с помощью подходящей рекурсивной процедуры.
|
||||||
|
В эту процедуру удобно передавать в качестве параметров не только указатель <code>P</code> на текущую вершину,
|
||||||
|
но и указатель <code>Par</code> на предка этой вершины:
|
||||||
|
</p>
|
||||||
|
<blockquote><code><pre>
|
||||||
|
<b>uses</b> PT4;
|
||||||
|
<b>procedure</b> SetParent(P, Par: PNode);
|
||||||
|
<b>begin</b>
|
||||||
|
<b>if</b> P = nil <b>then</b>
|
||||||
|
exit;
|
||||||
|
P^.Parent := Par;
|
||||||
|
SetParent(P^.Left, P);
|
||||||
|
SetParent(P^.Right, P);
|
||||||
|
<b>end</b>;
|
||||||
|
<b>var</b> P1: PNode;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('Tree49');
|
||||||
|
read(P1);
|
||||||
|
SetParent(P1, nil);
|
||||||
|
<b>end</b>.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>При стартовом запуске рекурсивной процедуры <code>SetParent</code> в качестве
|
||||||
|
второго параметра указывается <code>nil</code>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<b>Примечание.</b> Обозначение для двойной связи может оказаться полезным при анализе ошибочного решения.
|
||||||
|
Так, если в изображении дерева с обратной связью имеется вершина, соединенная со своей родительским
|
||||||
|
вершиной не двойной, а одинарной линией, значит, у этой вершины поле <code>Parent</code> содержит ошибочное значение
|
||||||
|
(например, равно <code>nil</code>).
|
||||||
|
</p>
|
||||||
|
<hr>
|
||||||
|
<a name="general"></a>
|
||||||
|
<h2>Пример 3. Деревья общего вида
|
||||||
|
</h2>
|
||||||
|
<hr>
|
||||||
|
<p>С помощью связанных записей типа <code>TNode</code> можно моделировать не только бинарные деревья,
|
||||||
|
но и произвольные упорядоченные деревья, вершины которых имеют любое число непосредственных потомков
|
||||||
|
(будем называть такие деревья <i>деревьями общего вида</i>; для них также используется название
|
||||||
|
«деревья с множественным ветвлением»).
|
||||||
|
Рассмотрим задание Tree86 — первое из заданий, связанных с деревьями общего вида, в котором
|
||||||
|
описываются особенности подобных деревьев.
|
||||||
|
</p>
|
||||||
|
<p class="task">Tree86°.
|
||||||
|
<i>Дерево общего вида</i> (каждая вершина которого может иметь произвольное число дочерних вершин,
|
||||||
|
расположенных в фиксированном порядке в направлении слева направо) реализуется с помощью набора
|
||||||
|
связанных записей типа TNode следующим образом: для каждой внутренней вершины ее поле Left
|
||||||
|
содержит указатель на ее первую (т. е. левую) дочернюю вершину, а поле Right — указатель на ее
|
||||||
|
правую <i>сестру</i>, т. е. вершину, имеющую в дереве общего вида того же родителя.
|
||||||
|
Поле Right корня дерева общего вида всегда равно nil, так как корень сестер не имеет.
|
||||||
|
Дан указатель <i>P</i><sub>1</sub> на корень непустого бинарного дерева. Создать дерево общего вида,
|
||||||
|
соответствующее исходному бинарному дереву, и вывести указатель <i>P</i><sub>2</sub> на его корень.
|
||||||
|
</p>
|
||||||
|
<p>Приведем пример дерева общего вида, которое реализовано с помощью связанных
|
||||||
|
записей типа <code>TNode</code> (аналогичным образом деревья общего вида изображаются в окне задачника):
|
||||||
|
</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Tree86-1.png">
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Корень этого дерева (со значением 13) имеет три дочерние вершины (71, 73 и 29),
|
||||||
|
причем вершина 71 не имеет потомков, вершина 73 имеет три непосредственных потомка (18, 93 и 92),
|
||||||
|
а вершина 29 — два (24 и 84). На последнем уровне располагается вершина 46, являющаяся
|
||||||
|
единственной дочерней вершиной вершины 93.
|
||||||
|
</p>
|
||||||
|
<p>При ознакомительном запуске задания Tree86 на экране появится окно, подобное следующему.
|
||||||
|
</p>
|
||||||
|
<blockquote>
|
||||||
|
<img border="0" src="gif/Tree86-2.png">
|
||||||
|
</blockquote>
|
||||||
|
<p>Обратите внимание на то, как выглядит одно и то же дерево в двух различных представлениях:
|
||||||
|
вариант, соответствующий обычному бинарному дереву, приводится в разделе исходных данных,
|
||||||
|
а вариант, соответствующий дереву общего вида, — в разделе результатов.
|
||||||
|
При переходе от бинарного дерева к дереву общего вида часть информации о структуре бинарного дерева
|
||||||
|
теряется, поскольку в случае, если некоторая вершина дерева общего вида имеет только одного
|
||||||
|
непосредственного потомка, нельзя определить, каким был этот потомок в исходном бинарном дереве — левым или правым.
|
||||||
|
</p>
|
||||||
|
<p>Напомним, что точки, обрамляющие значения вершин в разделе результатов, означают, что
|
||||||
|
все эти вершины должны быть созданы программой учащегося (в отличие от вершин исходного дерева, созданных
|
||||||
|
самим задачником при инициализации задания).
|
||||||
|
</p>
|
||||||
|
<p>При формировании нового дерева будем использовать рекурсивную функцию <code>CreateNode(P)</code>.
|
||||||
|
Параметр <code>P</code> содержит указатель на вершину исходного дерева, копия которой создается при вызове функции.
|
||||||
|
Возвращаемым значением функции является указатель на созданную вершину (как обычно, если <code>P = nil</code>,
|
||||||
|
то функция не выполняет никаких действий и возвращает <code>nil</code>). Для создания дочерних вершин выполняется
|
||||||
|
рекурсивный вызов этой функции. Заметим, что цепочка дочерних вершин может быть пустой
|
||||||
|
(если вершина <code>P</code> является листом), содержать один элемент (если вершина <code>P</code> имеет только одного
|
||||||
|
непосредственного потомка) или два элемента. Перед формированием цепочки дочерних вершин удобно
|
||||||
|
занести адреса дочерних вершин вершины <code>P</code> во вспомогательные переменные <code>P1</code> и <code>P2</code>. При этом в случае,
|
||||||
|
если вершина <code>P</code> имеет только одного потомка (неважно, левого или правого), адрес этого потомка
|
||||||
|
заносится в переменную <code>P1</code>, а переменная <code>P2</code> остается равной <code>nil</code>. Благодаря использованию
|
||||||
|
переменных <code>P1</code> и <code>P2</code>, фрагмент кода, отвечающий за формирование списка дочерних вершин,
|
||||||
|
удается сделать более кратким. Приведем текст программы, решающей задачу Tree86.
|
||||||
|
</p>
|
||||||
|
<blockquote><code><pre>
|
||||||
|
<b>uses</b> PT4;
|
||||||
|
<b>function</b> CreateNode(P: PNode): PNode;
|
||||||
|
<b>var</b> P1, P2: PNode;
|
||||||
|
<b>begin</b>
|
||||||
|
<b>if</b> P = nil <b>then</b>
|
||||||
|
<b>begin</b>
|
||||||
|
result := nil;
|
||||||
|
exit;
|
||||||
|
<b>end</b>;
|
||||||
|
New(result);
|
||||||
|
result^.Data := P^.Data;
|
||||||
|
result^.Right := nil;
|
||||||
|
P1 := P^.Left;
|
||||||
|
P2 := P^.Right;
|
||||||
|
<b>if</b> P1 = nil <b>then</b>
|
||||||
|
<b>begin</b>
|
||||||
|
P1 := P2;
|
||||||
|
P2 := nil;
|
||||||
|
<b>end</b>;
|
||||||
|
<i>{ формирование списка дочерних вершин }</i>
|
||||||
|
result^.Left := CreateNode(P1);
|
||||||
|
<b>if</b> P1 <> nil <b>then</b>
|
||||||
|
result^.Left^.Right := CreateNode(P2);
|
||||||
|
<b>end</b>;
|
||||||
|
<b>var</b> P1: PNode;
|
||||||
|
<b>begin</b>
|
||||||
|
Task('Tree86');
|
||||||
|
read(P1);
|
||||||
|
write(CreateNode(P1));
|
||||||
|
end.
|
||||||
|
</pre></code></blockquote>
|
||||||
|
<p>
|
||||||
|
<b>Примечание.</b> Фрагмент дерева общего вида, содержащий все дочерние вершины некоторой вершины,
|
||||||
|
можно рассматривать как <i>односвязный список</i>, элементы которого связаны между собой
|
||||||
|
с помощью поля <code>Right</code> (у последнего элемента списка поле <code>Right</code> равно <code>nil</code>).
|
||||||
|
Каждый элемент подобного списка может содержать «подсписок» своих дочерних элементов;
|
||||||
|
адрес начала этого подсписка хранится в поле <code>Left</code> данного элемента.
|
||||||
|
Поэтому в алгоритмах, связанных с обработкой вершин деревьев общего вида,
|
||||||
|
для перебора непосредственных потомков некоторой вершины удобно использовать <i>цикл</i>
|
||||||
|
(как при переборе элементов списка), в то время как для обработки каждой дочерней вершины следует,
|
||||||
|
как обычно, использовать <i>рекурсию</i>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Begin3-1.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Begin3-2.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Begin3-3.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Begin3-4.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Begin3-5.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Begin3-6.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic2-1.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic2-2.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic2-3.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic2-4.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic2-5.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic3-1.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic3-2.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic3-3.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic30-1.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic30-2.png
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic30-3.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic30-4.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic5-1.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic5-2.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic5-3.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic55-1.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic55-2.png
Normal file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic55-3.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Dynamic55-4.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/ExamBegin2-1.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/ExamBegin2-2.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/ExamBegin2-3.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/ExamBegin28-1.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/ExamBegin28-2.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/ExamTaskC25-1.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/ExamTaskC25-2.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/ExamTaskC25-3.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/ExamTaskC53-1.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/File48-1.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/File48-2.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/File48-3.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/File48-4.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/File48-6.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/File48-7.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/File48-8.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/File48-9.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/RBa1-1.png
Normal file
|
After Width: | Height: | Size: 383 B |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/RBa1-2.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/RBa1-3.png
Normal file
|
After Width: | Height: | Size: 6.2 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/RBa1-4.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/RBa1-5.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/String9-1.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/String9-2.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/String9-3.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/String9-4.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/String9-5.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/String9-6.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Tree2-1.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Tree49-1.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Tree86-1.png
Normal file
|
After Width: | Height: | Size: 805 B |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/Tree86-2.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/demo.gif
Normal file
|
After Width: | Height: | Size: 178 B |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/fIle48-5.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/load.gif
Normal file
|
After Width: | Height: | Size: 172 B |
BIN
PABCNetHelp/ForEducation/CheckedTasks/gif/results.gif
Normal file
|
After Width: | Height: | Size: 181 B |
99
PABCNetHelp/ForEducation/CheckedTasks/index.html
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||||
|
<title></title>
|
||||||
|
</head>
|
||||||
|
<link rel="StyleSheet" href="../../default.css">
|
||||||
|
<body>
|
||||||
|
<H1>Что такое проверяемые задания</H1>
|
||||||
|
<hr>
|
||||||
|
<p>Задания, проверяемые автоматически, являются мечтой любого
|
||||||
|
преподавателя. Несомненно, что при автоматической проверке можно проверить
|
||||||
|
только сам факт выполнения задания, но не те знания, которые получил ученик.
|
||||||
|
Поэтому крайне желательно, чтобы выполнение проверяемых заданий проходило под
|
||||||
|
контролем преподавателя.</p>
|
||||||
|
<p>Опыт авторов системы <b>PascalABC.NET</b> и
|
||||||
|
<a href="../PT4/About.html">электронного задачника
|
||||||
|
Programming Taskbook</a> свидетельствует, что обучение программированию с помощью проверяемых заданий,
|
||||||
|
сочетаемое с другими методиками (обучение на примерах, поиск ошибок в
|
||||||
|
программах, ручная и автоматическая трассировка, создание творческих программных
|
||||||
|
проектов и т. д.), позволяет существенно ускорить сам процесс обучения и облегчить
|
||||||
|
труд преподавателя.</p>
|
||||||
|
<p>Итак, что такое <font color="#008000"><i><b>проверяемые
|
||||||
|
задания</b></i></font> и как их выполнять в системе <b>PascalABC.NET</b>?
|
||||||
|
Для того чтобы это узнать, проще всего ознакомиться с несколькими примерами
|
||||||
|
выполнения типовых заданий.
|
||||||
|
</p>
|
||||||
|
<p><a href="checkedtasks1.html">Пример 1. Задание Begin3
|
||||||
|
из электронного задачника <b>Programming Taskbook</b>.</a></p>
|
||||||
|
<p>Выполняя задание <code>Begin3</code>,
|
||||||
|
следует обратить внимание на
|
||||||
|
одну важную особенность работы с электронным задачником:
|
||||||
|
при его подключении процедуры ввода-вывода <code>read</code> и
|
||||||
|
<code>write</code> начинают работать иначе:
|
||||||
|
процедура read получает исходные данные непосредственно от задачника
|
||||||
|
(который генерирует их, используя датчик случайных чисел и учитывая
|
||||||
|
особенности выполняемого задания), а процедура write пересылает
|
||||||
|
результаты задачнику для проверки их правильности. Исходные данные, подготовленные задачником,
|
||||||
|
и результаты, полученные программой, отображаются в соответствующих разделах
|
||||||
|
окна задачника; ученик не должен заботиться об их форматировании и поясняющих
|
||||||
|
подписях, поскольку за эти действия отвечает сам задачник.
|
||||||
|
Важно учитывать, что при каждом запуске программы учащегося ей
|
||||||
|
будут предлагаться <i>различные варианты исходных данных</i>, поэтому для
|
||||||
|
решения задания необходимо разработать алгоритм,
|
||||||
|
правильно обрабатывающий любые наборы допустимых исходных данных.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><a href="checkedtasks2.html">Пример 2. Задание a1 для исполнителя
|
||||||
|
Робот.</a></p>
|
||||||
|
<p>Исполнитель Робот является бесценным источником заданий для быстрого обучения
|
||||||
|
основным конструкциям программирования школьников средних классов. </p>
|
||||||
|
<p><a href="ctstring.html">Пример 3. Задание String9
|
||||||
|
из электронного задачника <b>Programming Taskbook</b>.</a></p>
|
||||||
|
<p>Данное задание знакомит с особенностями выполнения заданий на обработку символов
|
||||||
|
и строк. Следует обратить внимание на диагностику ошибки, связанной с выводом строки, длина которой превышает длину
|
||||||
|
строки — правильного решения.</p>
|
||||||
|
<p><a href="ctfile.html">Пример 4. Задание File48
|
||||||
|
из электронного задачника <b>Programming Taskbook</b>.</a></p>
|
||||||
|
<p>Это задание знакомит с особенностями выполнения заданий
|
||||||
|
на обработку типизированных файлов. Исходные файлы при вызове
|
||||||
|
задания создаются на диске, после чего могут обрабатываться по стандартным
|
||||||
|
правилам. Содержимое файлов, созданных в процессе выполнения задания,
|
||||||
|
проверяется электронным задачником; после проверки исходные и результирующие
|
||||||
|
файлы автоматически удаляются. Следует обратить внимание на то, как содержимое
|
||||||
|
файлов отображается в окне задачника, а также на обработку ошибок времени
|
||||||
|
выполнения, возникающих при выполнении заданий. В примере описаны типичные ошибки при
|
||||||
|
работе с файлами и способы их устранения. </p>
|
||||||
|
<p><a href="ctpointer.html">Пример 5. Задания группы Dynamic
|
||||||
|
из электронного задачника <b>Programming Taskbook</b>.</a></p>
|
||||||
|
<p>В данном примере описываются задания из раздела, посвященного указателям и линейным динамическим
|
||||||
|
структурам данных. При вызове задания в динамической памяти создаются все
|
||||||
|
исходные структуры данных (в виде односвязных или двусвязных списков), а
|
||||||
|
указатели на элементы этих структур выступают в качестве входных данных задания.
|
||||||
|
Содержимое всех структур данных отображается в окне задачника в наглядном виде.
|
||||||
|
Созданные программой ученика структуры данных анализируются задачником и после
|
||||||
|
анализа все структуры данных удаляются из памяти. </p>
|
||||||
|
<p><a href="cttree.html">Пример 6. Задания группы Tree
|
||||||
|
из электронного задачника <b>Programming Taskbook</b>.</a></p>
|
||||||
|
<p>В данном примере описываются задания на обработку иерархических структур данных —
|
||||||
|
деревьев. Подобные структуры, как и линейные динамические структуры, рассмотренные
|
||||||
|
в предыдущем примере, создаются задачником автоматически и в наглядном виде отображаются
|
||||||
|
в его окне. Для доступа к ним также используются указатели.
|
||||||
|
</p>
|
||||||
|
<p><a href="ctexam.html">Пример 7. Задания групп ExamBegin и ExamTaskC
|
||||||
|
из электронного задачника <b>Programming Taskbook</b>.</a></p>
|
||||||
|
<p>Пример содержит описание процесса выполнения заданий, связанных с ЕГЭ
|
||||||
|
по информатике. Основной особенностью этих заданий является то, что
|
||||||
|
при их выполнении требуется использовать стандартные процедуры ввода-вывода языка
|
||||||
|
Pascal (а не их специальные модификации, реализованные для задачника <b>Programming Taskbook</b>).
|
||||||
|
Рассматриваются задания из группы ExamBegin, посвященные базовым алгоритмам,
|
||||||
|
и задания из группы ExamTaskC, посвященные обработке сложных наборов данных.
|
||||||
|
</p>
|
||||||
|
<p>Все примеры, связанные с электронным задачником <b>Programming Taskbook</b>, иллюстрируются
|
||||||
|
изображениями окна задачника
|
||||||
|
в <a href="..\PT4\window.html#dynmode">режиме с динамической компоновкой</a>, появившемся в версии 4.11.
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
BIN
PABCNetHelp/ForEducation/Executors/DMa1.png
Normal file
|
After Width: | Height: | Size: 927 B |
71
PABCNetHelp/ForEducation/Executors/dmstart.html
Normal file
|
|
@ -0,0 +1,71 @@
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||||||
|
<param name="Keyword" value="Чертежник">
|
||||||
|
<param name="Keyword" value="Drawman">
|
||||||
|
<param name="Keyword" value="ToPoint">
|
||||||
|
<param name="Keyword" value="OnVector">
|
||||||
|
<param name="Keyword" value="PenUp">
|
||||||
|
<param name="Keyword" value="PenDown">
|
||||||
|
<param name="Keyword" value="Task">
|
||||||
|
<param name="Keyword" value="Field">
|
||||||
|
<param name="Keyword" value="StandardField">
|
||||||
|
</object>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||||
|
<title></title>
|
||||||
|
<link rel="StyleSheet" href="../../default.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<H1>Исполнитель Чертежник</H1>
|
||||||
|
Исполнитель Чертежник
|
||||||
|
предназначен для построения рисунков и чертежей на плоскости с координатами.
|
||||||
|
Чертежник имеет перо, которое он может поднимать, опускать и перемещать.
|
||||||
|
При перемещении опущенного пера за ним остается след.
|
||||||
|
<p>Исполнитель Чертежник и поле, на котором он работает, отображаются на экране следующим
|
||||||
|
образом:</p>
|
||||||
|
<p><img border="0" src="DMa1.png" width="381" height="213"></p>
|
||||||
|
<p>Здесь маленький квадрат изображает Чертежника, красным цветом изображены
|
||||||
|
отрезки, которые надо нарисовать, а синим — уже нарисованные Чертежником
|
||||||
|
отрезки. Когда перо Чертежника опущено, он изображается квадратом меньшего
|
||||||
|
размера.</p>
|
||||||
|
<p>Команды исполнителя Чертежник
|
||||||
|
содержатся в модуле <code>Drawman</code>:
|
||||||
|
</p>
|
||||||
|
<blockquote>
|
||||||
|
<code>ToPoint(x,y)</code> –
|
||||||
|
перемещает перо Чертежника в точку <code>(x,y)</code>;<code><br>
|
||||||
|
OnVector(a,b)</code>– перемещает перо
|
||||||
|
Чертежника на вектор <code>(a,b)</code>;<code><br>
|
||||||
|
PenUp</code> – поднимает перо Чертежника;<code><br>
|
||||||
|
PenDown</code> – опускает перо Чертежника.</p>
|
||||||
|
</blockquote>
|
||||||
|
<p style="margin-top: 6pt">Для вызова задания для исполнителя Чертежник
|
||||||
|
используется следующий шаблон программы:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><b>uses</b> Drawman;<br>
|
||||||
|
<b>begin</b><br>
|
||||||
|
<a name="Task">Task</a>('c1');<br>
|
||||||
|
<b>end</b>. </code>
|
||||||
|
</blockquote>
|
||||||
|
<p>В конце программы перо Чертежника должно быть поднято и находиться в начале
|
||||||
|
координат.</p>
|
||||||
|
<p>Здесь <code>Task</code> ¦— процедура,
|
||||||
|
содержащаяся в модуле <code>Drawman</code> и вызывающая
|
||||||
|
задание с указанным именем.</p>
|
||||||
|
<p>Имеются следующие группы заданий для исполнителя
|
||||||
|
Чертежник:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code>a</code> – вводные задания;<code><br>
|
||||||
|
c</code> – цикл с параметром;<code><br>
|
||||||
|
cc</code> – вложенные циклы;<code><br>
|
||||||
|
p</code> – процедуры без параметров;<code><br>
|
||||||
|
pp</code> – процедуры с параметрами.
|
||||||
|
</blockquote>
|
||||||
|
<p>Для создания произвольного поля размера 20 x 30
|
||||||
|
используется процедура <code><a name="StandardField">StandardField</a></code> без параметров, а для создания
|
||||||
|
поля размера N x M — процедура <code><a name="Field">Field</a>(N,M)</code>.</p>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
34
PABCNetHelp/ForEducation/Executors/index.html
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
<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>
|
||||||
|
<p><b>Исполнителем</b> будем называть устройство, способное выполнять
|
||||||
|
определенный набор команд. Обычно с исполнителем связана некоторая среда, в
|
||||||
|
которой он работает.
|
||||||
|
</p>
|
||||||
|
<p>Традиционно концепция исполнителей используется для
|
||||||
|
быстрого обучения основным конструкциям языка программирования при проведении
|
||||||
|
занятий в средних классах школы. В <b>PascalABC.NET</b> реализованы исполнители
|
||||||
|
<a href="robotstart.html">Робот</a> и
|
||||||
|
<a href="dmstart.html">Чертежник</a>, описанные в учебнике А. Г. Кушниренко, Г. В. Лебедева
|
||||||
|
и Я. Н. Зайдельмана
|
||||||
|
«Информатика 7–9 классы», М., 2001. Следует отметить, что
|
||||||
|
данный учебник уже не используется для обучения в школе, однако
|
||||||
|
он является наиболее удачным и по интеграции исполнителей в процесс обучения
|
||||||
|
начальному программированию, и по набору задач. </p>
|
||||||
|
<p>Кроме того, исполнители в <b>PascalABC.NET</b>
|
||||||
|
активно используются в <a href="../CheckedTasks/index.html">системе проверяемых заданий</a> — одной из
|
||||||
|
ключевых учебных особенностей системы <b>PascalABC.NET</b>.</p>
|
||||||
|
<p>См. также <a href="../CheckedTasks/checkedtasks2.html">пример выполнения задания a1 для
|
||||||
|
исполнителя
|
||||||
|
Робот.</a></p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
114
PABCNetHelp/ForEducation/Executors/robotstart.html
Normal file
|
|
@ -0,0 +1,114 @@
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||||||
|
<param name="Keyword" value="Ðîáîò">
|
||||||
|
<param name="Keyword" value="Robot">
|
||||||
|
<param name="Keyword" value="Left">
|
||||||
|
<param name="Keyword" value="Right">
|
||||||
|
<param name="Keyword" value="Up">
|
||||||
|
<param name="Keyword" value="Down">
|
||||||
|
<param name="Keyword" value="Paint">
|
||||||
|
<param name="Keyword" value="WallFromLeft">
|
||||||
|
<param name="Keyword" value="WallFromRight">
|
||||||
|
<param name="Keyword" value="WallFromUp">
|
||||||
|
<param name="Keyword" value="WallFromDown">
|
||||||
|
<param name="Keyword" value="FreeFromLeft">
|
||||||
|
<param name="Keyword" value="FreeFromRight">
|
||||||
|
<param name="Keyword" value="FreeFromUp">
|
||||||
|
<param name="Keyword" value="FreeFromDown">
|
||||||
|
<param name="Keyword" value="CellIsPainted">
|
||||||
|
<param name="Keyword" value="CellIsFree">
|
||||||
|
<param name="Keyword" value="Task">
|
||||||
|
<param name="Keyword" value="Field">
|
||||||
|
<param name="Keyword" value="StandardField">
|
||||||
|
</object>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||||
|
<title></title>
|
||||||
|
<link rel="StyleSheet" href="../../default.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<H1>Èñïîëíèòåëü Ðîáîò</H1>
|
||||||
|
<p >Èñïîëíèòåëü Ðîáîò
|
||||||
|
äåéñòâóåò íà ïðÿìîóãîëüíîì êëåòî÷íîì ïîëå. Ìåæäó íåêîòîðûìè êëåòêàìè, à
|
||||||
|
òàêæå ïî ïåðèìåòðó ïîëÿ íàõîäÿòñÿ <i>ñòåíû</i>. Îñíîâíàÿ öåëü Ðîáîòà ¦— çàêðàñèòü
|
||||||
|
óêàçàííûå êëåòêè è ïåðåìåñòèòüñÿ â êîíå÷íóþ êëåòêó.</p>
|
||||||
|
<p>Èñïîëíèòåëü Ðîáîò è ïîëå, íà êîòîðîì îí ðàáîòàåò, îòîáðàæàþòñÿ ñëåäóþùèì
|
||||||
|
îáðàçîì:</p>
|
||||||
|
<p><img border="0" src="../CheckedTasks/gif/RBa1-1.png"></p>
|
||||||
|
<p>Çäåñü áîëüøîé æåëòûé êâàäðàò èçîáðàæàåò Ðîáîòà, ìàëåíüêèé
|
||||||
|
æåëòûé êâàäðàò â ëåâîì âåðõíåì óãëó êëåòêè — êîíå÷íîå ïîëîæåíèå Ðîáîòà, ÷åðíûìè òî÷êàìè ïîìå÷åíû êëåòêè, êîòîðûå íàäî çàêðàñèòü.</p>
|
||||||
|
<p>Êîìàíäû èñïîëíèòåëÿ Ðîáîò ñîäåðæàòñÿ â
|
||||||
|
ìîäóëå <code>Robot</code>:
|
||||||
|
</p>
|
||||||
|
<blockquote>
|
||||||
|
<code>Right</code> –
|
||||||
|
ïåðåìåùàåò Ðîáîòà âïðàâî;<code><br>
|
||||||
|
Left</code> – ïåðåìåùàåò Ðîáîòà âëåâî;<code><br>
|
||||||
|
Up</code> – ïåðåìåùàåò Ðîáîòà ââåðõ;
|
||||||
|
<code><br>
|
||||||
|
Down</code> – ïåðåìåùàåò Ðîáîòà âíèç;
|
||||||
|
<code><br>
|
||||||
|
Paint</code> – çàêðàøèâàåò òåêóùóþ ÿ÷åéêó;<code><br>
|
||||||
|
WallFromLeft</code> – âîçâðàùàåò <code>True</code>
|
||||||
|
åñëè ñëåâà îò Ðîáîòà ñòåíà;
|
||||||
|
<code><br>
|
||||||
|
WallFromRight</code> – âîçâðàùàåò <code>True</code>
|
||||||
|
åñëè ñïðàâà îò Ðîáîòà ñòåíà;
|
||||||
|
<code><br>
|
||||||
|
WallFromUp</code> – âîçâðàùàåò <code>True</code>
|
||||||
|
åñëè ñâåðõó îò Ðîáîòà ñòåíà;
|
||||||
|
<code><br>
|
||||||
|
WallFromDown</code> – âîçâðàùàåò <code>True</code>
|
||||||
|
åñëè ñíèçó îò Ðîáîòà ñòåíà;
|
||||||
|
<code><br>
|
||||||
|
FreeFromLeft</code> – âîçâðàùàåò <code>True</code>
|
||||||
|
åñëè ñëåâà îò Ðîáîòà ñâîáîäíî;
|
||||||
|
<code><br>
|
||||||
|
FreeFromRight</code> – âîçâðàùàåò <code>True</code>
|
||||||
|
åñëè ñïðàâà îò Ðîáîòà ñâîáîäíî;
|
||||||
|
<code><br>
|
||||||
|
FreeFromUp</code> – âîçâðàùàåò <code>True</code>
|
||||||
|
åñëè ñâåðõó îò Ðîáîòà ñâîáîäíî;
|
||||||
|
<code><br>
|
||||||
|
FreeFromDown</code> – âîçâðàùàåò <code>True</code>
|
||||||
|
åñëè ñíèçó îò Ðîáîòà ñâîáîäíî;
|
||||||
|
<code><br>
|
||||||
|
CellIsPainted</code> – âîçâðàùàåò <code>True</code>
|
||||||
|
åñëè ÿ÷åéêà, â êîòîðîé íàõîäèòñÿ Ðîáîò, çàêðàøåíà;
|
||||||
|
<code><br>
|
||||||
|
CellIsFree</code> – âîçâðàùàåò <code>True</code>
|
||||||
|
åñëè ÿ÷åéêà, â êîòîðîé íàõîäèòñÿ Ðîáîò, íå çàêðàøåíà.
|
||||||
|
</blockquote>
|
||||||
|
<p>Äëÿ âûçîâà çàäàíèÿ äëÿ èñïîëíèòåëÿ Ðîáîò èñïîëüçóåòñÿ
|
||||||
|
ñëåäóþùèé øàáëîí ïðîãðàììû:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code><b>uses</b> Robot;<br>
|
||||||
|
<b>begin</b> <br>
|
||||||
|
|
||||||
|
Task('c1'); <br>
|
||||||
|
<b>end</b>. </code>
|
||||||
|
</blockquote>
|
||||||
|
<p>Çäåñü <code>Task</code> — ïðîöåäóðà,
|
||||||
|
ñîäåðæàùàÿñÿ â ìîäóëå <code>Robot</code> è âûçûâàþùàÿ
|
||||||
|
çàäàíèå ñ óêàçàííûì èìåíåì.</p>
|
||||||
|
<p>Èìåþòñÿ ñëåäóþùèå ãðóïïû çàäàíèé äëÿ èñïîëíèòåëÿ Ðîáîò:</p>
|
||||||
|
<blockquote>
|
||||||
|
<code>a</code> – ââîäíûå çàäàíèÿ;<code><br>
|
||||||
|
c</code> – öèêë ñ ïàðàìåòðîì;<code><br>
|
||||||
|
if</code> – ëîãè÷åñêèå âûðàæåíèÿ;<code><br>
|
||||||
|
w</code> – öèêëû ñ óñëîâèåì;<code><br>
|
||||||
|
ñif</code> – öèêëû + ëîãè÷åñêèå âûðàæåíèÿ;<code><br>
|
||||||
|
count</code> – ïåðåìåííûå-ñ÷åò÷èêè;<code><br>
|
||||||
|
cc</code> – âëîæåííûå öèêëû;<code><br>
|
||||||
|
p</code> – ïðîöåäóðû áåç ïàðàìåòðîâ;<code><br>
|
||||||
|
pp</code> – ïðîöåäóðû ñ ïàðàìåòðàìè.
|
||||||
|
</blockquote>
|
||||||
|
<p>Äëÿ ñîçäàíèÿ ñòàíäàðòíîãî ïîëÿ ðàçìåðà 9 x 11
|
||||||
|
èñïîëüçóåòñÿ ïðîöåäóðà <code><a name="StandardField">StandardField</a></code> áåç ïàðàìåòðîâ, à äëÿ ñîçäàíèÿ
|
||||||
|
ïîëÿ ðàçìåðà N x M — ïðîöåäóðà <code><a name="Field">Field</a>(N,M)</code>.
|
||||||
|
Ðîáîò ïðè ýòîì ïîìåùàåòñÿ â öåíòð ïîëÿ.</p>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
108
PABCNetHelp/ForEducation/MakeModules/DMMake.html
Normal file
|
|
@ -0,0 +1,108 @@
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||||||
|
<param name="Keyword" value="TaskProcType">
|
||||||
|
<param name="Keyword" value="DrawmanField">
|
||||||
|
<param name="Keyword" value="DoToPoint">
|
||||||
|
<param name="Keyword" value="DoOnVector">
|
||||||
|
<param name="Keyword" value="DoPenUp">
|
||||||
|
<param name="Keyword" value="DoPenDown">
|
||||||
|
<param name="Keyword" value="TaskText">
|
||||||
|
<param name="Keyword" value="RegisterTask">
|
||||||
|
<param name="Keyword" value="RegisterGroup">
|
||||||
|
</object>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||||
|
<title></title>
|
||||||
|
<link rel="StyleSheet" href="../../default.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<H1>Ìîäóëü </span>DMTaskMaker</H1>
|
||||||
|
<hr>
|
||||||
|
<table border="0" width="100%" id="table3" style="border-width: 0px" cellpadding="8">
|
||||||
|
<tr height=20pt>
|
||||||
|
<td style="border-style:none; border-width:medium; background-color: #99CCFF">
|
||||||
|
<b><font size="2" color="#800080"><span lang="ru">Òèïû</span> ìîäóëÿ </font></b>
|
||||||
|
<font size="2" color="#800080"><b>DMTaskMaker</b></font></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>type</b> TaskProcType<span lang="ru"> </span>=<b><span lang="ru">
|
||||||
|
</span>procedure</b>;</code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p>Òèï ïðîöåäóðû, ãåíåðèðóþùåé êîíêðåòíîå çàäàíèå.
|
||||||
|
Êàæäîå çàäàíèå ðåàëèçóåòñÿ â âèäå îòäåëüíîé ïðîöåäóðû; äëÿ ñâÿçûâàíèÿ ýòîé ïðîöåäóðû
|
||||||
|
ñ èìåíåì çàäàíèÿ íåîáõîäèìî èñïîëüçîâàòü ïðîöåäóðó <code>RegisterTask</code>, îïèñûâàåìóþ íèæå.
|
||||||
|
</p>
|
||||||
|
<table border="0" width="100%" id="table4" style="border-width: 0px" cellpadding="8">
|
||||||
|
<tr height=20pt>
|
||||||
|
<td style="border-style:none; border-width:medium; background-color: #99CCFF">
|
||||||
|
<b><font size="2" color="#800080">Ïðîöåäóðû ìîäóëÿ </font></b>
|
||||||
|
<font size="2" color="#800080"><b>DMTaskMaker</b></font></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> Field(szx,szy: integer); </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Çàäàåò ïîëå ×åðòåæíèêà ðàçìåðà </span><code>szx</code>
|
||||||
|
<span lang="ru">íà </span><code>szy</code> <span lang="ru">êëåòîê</span>.</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> DoToPoint(x,y: integer); </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Ïåðåìåùàåò ïåðî ×åðòåæíèêà-ïîñòàíîâùèêà çàäàíèé â òî÷êó ñ
|
||||||
|
êîîðäèíàòàìè </span> <code>(x</code>,<span lang="ru"> </span><code>y)</code><span lang="ru">.</span></p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> DoOnVector(dx,dy: integer); </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Ïåðåìåùàåò ïåðî ×åðòåæíèêà-ïîñòàíîâùèêà çàäàíèé â òî÷êó ñ
|
||||||
|
êîîðäèíàòàìè </span> <code>(x</code>,<span lang="ru"> </span><code>y)</code><span lang="ru">.</span></p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> DoPenUp; </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Ïîäíèìàåò ïåðî ×åðòåæíèêà-ïîñòàíîâùèêà çàäàíèé.</span></p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> DoPenDown; </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Îïóñêàåò ïåðî ×åðòåæíèêà-ïîñòàíîâùèêà çàäàíèé.</span></p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> TaskText(s: string); </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Çàäàåò èìÿ è ôîðìóëèðîâêó çàäàíèÿ â ñòðîêå </span><code>s</code><span lang="ru">.
|
||||||
|
</span></p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> RegisterGroup(name,description,unitname: string; count: integer); </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p>Îáåñïå÷èâàåò àâòîìàòè÷åñêóþ ðåãèñòðàöèþ íîâîé ãðóïïû çàäàíèé â ïðîãðàììíîì ìîäóëå <b>PT4Load</b>.
|
||||||
|
 ðåçóëüòàòå èìÿ äàííîé ãðóïïû áóäåò îòîáðàæàòüñÿ â îêíå ìîäóëÿ <b>PT4Load</b> â ñïèñêå ãðóïï, ñâÿçàííûõ ñ èñïîëíèòåëåì
|
||||||
|
×åðòåæíèê,
|
||||||
|
÷òî ïîçâîëèò ñîçäàòü ïðîãðàììó-çàãîòîâêó äëÿ âûïîëíåíèÿ ëþáîãî çàäàíèÿ ýòîé ãðóïïû.
|
||||||
|
 êà÷åñòâå ïàðàìåòðîâ ïðîöåäóðû óêàçûâàåòñÿ èìÿ ãðóïïû <code>name</code>,
|
||||||
|
êðàòêîå îïèñàíèå ãðóïïû <code>description</code>,
|
||||||
|
èìÿ ìîäóëÿ <code>unitname</code>, â êîòîðîì îïèñàíà ãðóïïà, è êîëè÷åñòâî çàäàíèé <code>count</code>.
|
||||||
|
Èìÿ ãðóïïû çàäàíèé äîëæíî ñîäåðæàòü íå áîëåå 7 ñèìâîëîâ (öèôð è ëàòèíñêèõ áóêâ) è íå äîëæíî îêàí÷èâàòüñÿ öèôðîé,
|
||||||
|
êîëè÷åñòâî çàäàíèé íå äîëæíî ïðåâûøàòü 999.
|
||||||
|
Ïðîöåäóðà <code>RegisterGroup</code> äîëæíà
|
||||||
|
âûçûâàòüñÿ â ñåêöèè èíèöèàëèçàöèè ìîäóëÿ, ñîäåðæàùåãî ðåàëèçàöèþ íîâîé ãðóïïû çàäàíèé äëÿ ×åðòåæíèêà.
|
||||||
|
</p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> RegisterTask(name: string; p: TaskProcType);</code>
|
||||||
|
</blockquote>
|
||||||
|
<p>Ñâÿçûâàåò èìÿ çàäàíèÿ <code>name</code> ñ ïðîöåäóðîé <code>p</code>, â êîòîðîé ðåàëèçîâàíî äàííîå çàäàíèå.
|
||||||
|
Äàííóþ ïðîöåäóðó ñëåäóåò âûçûâàòü äëÿ <i>êàæäîãî</i> çàäàíèÿ.
|
||||||
|
Ïîäîáíî îïèñàííîé âûøå ïðîöåäóðå <code>RegisterGroup</code>, ïðîöåäóðà <code>RegisterTask</code> äîëæíà âûçûâàòüñÿ â ñåêöèè èíèöèàëèçàöèè
|
||||||
|
ìîäóëÿ, ñîäåðæàùåãî ðåàëèçàöèþ íîâîé ãðóïïû çàäàíèé äëÿ ×åðòåæíèêà. Ïîðÿäîê âûçîâà ýòèõ ïðîöåäóð ìîæåò áûòü ïðîèçâîëüíûì.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
130
PABCNetHelp/ForEducation/MakeModules/DMMakeCreation.html
Normal file
|
|
@ -0,0 +1,130 @@
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||||||
|
<param name="Keyword" value="">
|
||||||
|
</object>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||||
|
<title></title>
|
||||||
|
<link rel="StyleSheet" href="../../default.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<H1>Ñîçäàíèå çàäàíèé äëÿ èñïîëíèòåëÿ <span lang="ru">×åðòåæíèê</span></H1>
|
||||||
|
<hr>
|
||||||
|
<p><span lang="ru">Îïèøåì ïîñëåäîâàòåëüíîñòü ñîçäàíèÿ ãðóïïû çàäàíèé äëÿ
|
||||||
|
èñïîëíèòåëÿ ×åðòåæíèê. Ñîçäàäèì ìîäóëü </span><span lang="en-us">DM</span>Tasks.pas ñî ñëåäóþùè<span lang="ru">ì
|
||||||
|
òåêñòîì:</span></p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>unit</b> <span lang="en-us">DM</span>Tasks;</code></p>
|
||||||
|
<p><code><b>interface</b></code></p>
|
||||||
|
<p><code><b>uses</b> DMTaskMaker;</code></p>
|
||||||
|
<p><code><b>implementation</b></code></p>
|
||||||
|
<p><code><b>procedure</b> First<span lang="en-us">DM</span>;<br>
|
||||||
|
<b>var</b> i,a: integer;<br>
|
||||||
|
<b>begin</b><br>
|
||||||
|
TaskText('Çàäàíèå mydm1. Íà÷åðòèòå, èñïîëüçóÿ öèêë');<br>
|
||||||
|
Field(14,8);<br>
|
||||||
|
DoToPoint(7,7);<br>
|
||||||
|
a:=6;<br>
|
||||||
|
<b>for</b> i:=1 <b>to</b> 6 <b>do</b><br>
|
||||||
|
<b>begin</b><br>
|
||||||
|
DoPenDown;<br>
|
||||||
|
DoOnVector(a,-a);<br>
|
||||||
|
DoOnVector(-a,a);<br>
|
||||||
|
DoOnVector(-a,-a);<br>
|
||||||
|
DoOnVector(a,a);<br>
|
||||||
|
Dec(a);<br>
|
||||||
|
DoPenUp;<br>
|
||||||
|
DoOnVector(0,-1);<br>
|
||||||
|
<b>end</b>;<br>
|
||||||
|
<b>end</b>;</code></p>
|
||||||
|
<p><code><b>begin</b><br>
|
||||||
|
</span>RegisterGroup('mydm','Ìîè çàäàíèÿ äëÿ ×åðòåæíèêà','DMTasks',2);<br>
|
||||||
|
</span>RegisterTask('mydm1',FirstDM);<br>
|
||||||
|
<b>end</b>.</code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Íàáåðåì è çàïóñòèì îñíîâíóþ ïðîãðàììó (ñîõðàíÿòü åå â êàêîì-ëèáî ôàéëå íå òðåáóåòñÿ):</span></p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>uses</b> <span lang="en-us">Drawman</span>, <span lang="en-us">
|
||||||
|
DM</span>Tasks;<br>
|
||||||
|
<b>begin</b><br>
|
||||||
|
Task('my<span lang="en-us">dm</span>1');<br>
|
||||||
|
<b>end</b>.</code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p>Áóäåò âûâåäåíî ñëåäóþùåå çàäàíèå äëÿ <span lang="ru">×åðòåæíèêà</span>:</p>
|
||||||
|
<p><img border="0" src="images/dmmake1.PNG"></p>
|
||||||
|
<p>Äîáàâèì çàäàíèå íà ðàçðàáîòêó ïðîöåäóðû:</p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> DoCross;<br>
|
||||||
|
<b>begin</b><br>
|
||||||
|
DoPenDown;<br>
|
||||||
|
DoOnVector(1,0); DoOnVector(0,-1);<br>
|
||||||
|
DoOnVector(1,0); DoOnVector(0,-1);<br>
|
||||||
|
DoOnVector(-1,0); DoOnVector(0,-1);<br>
|
||||||
|
DoOnVector(-1,0); DoOnVector(0,1);<br>
|
||||||
|
DoOnVector(-1,0); DoOnVector(0,1);<br>
|
||||||
|
DoOnVector(1,0); DoOnVector(0,1);<br>
|
||||||
|
DoPenUp;<br>
|
||||||
|
<b>end</b>;</code></p>
|
||||||
|
<p><code><b>procedure</b> SecondDM;<br>
|
||||||
|
<b>begin</b><br>
|
||||||
|
TaskText('Çàäàíèå mydm2. Íà÷åðòèòå, èñïîëüçóÿ ïðîöåäóðó Cross');<br>
|
||||||
|
Field(18,12);<br>
|
||||||
|
DoToPoint(3,8);<br>
|
||||||
|
DoCross;<br>
|
||||||
|
DoToPoint(8,4);<br>
|
||||||
|
DoCross;<br>
|
||||||
|
DoToPoint(12,11);<br>
|
||||||
|
DoCross;<br>
|
||||||
|
DoToPoint(15,6);<br>
|
||||||
|
DoCross;<br>
|
||||||
|
<b>end</b>;</code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p>Äîáàâèì âûçîâ ïðîöåäóðû ðåãèñòðàöèè äëÿ äàííîãî çàäàíèÿ; â ðåçóëüòàòå ñåêöèÿ èíèöèàëèçàöèè ïðèìåò ñëåäóþùèé âèä:</p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>begin</b><br>
|
||||||
|
RegisterGroup('mydm','Ìîè çàäàíèÿ äëÿ ×åðòåæíèêà','DMTasks',2);<br>
|
||||||
|
RegisterTask('mydm1',FirstDM);<br>
|
||||||
|
RegisterTask('mydm2',SecondDM);<br>
|
||||||
|
<b>end</b>.</code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Èçìåíèì îñíîâíóþ ïðîãðàììó:</span></p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>uses</b> <span lang="en-us">Drawman</span>, <span lang="en-us">
|
||||||
|
DM</span>Tasks;<br>
|
||||||
|
<b>begin</b><br>
|
||||||
|
Task('my<span lang="en-us">dm2</span>');<br>
|
||||||
|
<b>end</b>.</code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p>Ïðè çàïóñêå ýòîé ïðîãðàììû â îêíå èñïîëíèòåëÿ ×åðòåæíèê áóäåò âûâåäåíî íîâîå çàäàíèå:</p>
|
||||||
|
<p><img border="0" src="images/dmmake2.PNG"></p>
|
||||||
|
<p>
|
||||||
|
Ïðè ïåðâîì çàïóñêå ïðîãðàììû ñ ïîäêëþ÷åííûì ìîäóëåì <code>DMTasks</code> ñîçäàííàÿ íàìè ãðóïïà áûëà àâòîìàòè÷åñêè çàðåãèñòðèðîâàíà
|
||||||
|
â ìàñòåðå ïî ñîçäàíèþ ïðîãðàìì-çàãîòîâîê <b>PT4Load</b>.
|
||||||
|
Åñëè òåïåðü íàæàòü êíîïêó <img border="0" src="images/load.gif" width="16" height="17"> è â ïîÿâèâøåìñÿ îêíå
|
||||||
|
<b>PT4Load</b> ââåñòè ïðåôèêñ
|
||||||
|
</span><span lang="en-us"><code>DM</code></span><span lang="ru"> â ïîëå «Çàäàíèå», òî îêíî ïðèìåò ñëåäóþùèé âèä:
|
||||||
|
</span></p>
|
||||||
|
<p><img border="0" src="images/dmmake3.PNG">
|
||||||
|
</p>
|
||||||
|
<p>Ìû âèäèì, ÷òî ãðóïïà çàäàíèé mydm ïîÿâèëàñü â ñïèñêå äîñòóïíûõ ãðóïï äëÿ èñïîëíèòåëÿ ×åðòåæíèê. Íàáåðåì èìÿ çàäàíèÿ
|
||||||
|
<span lang="en-us"><code>mydm1</code></span>:</p>
|
||||||
|
<p>
|
||||||
|
<img border="0" src="images/dmmake4.PNG">
|
||||||
|
</p>
|
||||||
|
<p>Ïîñëå íàæàòèÿ êëàâèøè <span lang="en-us"><b>Enter</b> </span>â ðàáî÷åì êàòàëîãå áóäåò ñîçäàí
|
||||||
|
íîâûé ôàéë <span lang="en-us">DMmydm1.pas </span>ñî ñëåäóþùèì ñîäåðæèìûì:</p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>uses</b> <span lang="en-us">Drawman</span>, <span lang="en-us">
|
||||||
|
DM</span>Tasks;<br>
|
||||||
|
<br>
|
||||||
|
<b>begin</b><br>
|
||||||
|
Task('my<span lang="en-us">dm</span>1');<br>
|
||||||
|
<br>
|
||||||
|
<b>end</b>.</code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p>Ìîæíî ïîïûòàòüñÿ ðåøèòü :)</p>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
131
PABCNetHelp/ForEducation/MakeModules/RobotMake.html
Normal file
|
|
@ -0,0 +1,131 @@
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||||||
|
<param name="Keyword" value="TaskProcType">
|
||||||
|
<param name="Keyword" value="Field">
|
||||||
|
<param name="Keyword" value="HorizontalWall">
|
||||||
|
<param name="Keyword" value="VerticalWall">
|
||||||
|
<param name="Keyword" value="RobotBegin">
|
||||||
|
<param name="Keyword" value="RobotEnd">
|
||||||
|
<param name="Keyword" value="RobotBeginEnd">
|
||||||
|
<param name="Keyword" value="Tag">
|
||||||
|
<param name="Keyword" value="TagRect">
|
||||||
|
<param name="Keyword" value="MarkPainted">
|
||||||
|
<param name="Keyword" value="TaskText">
|
||||||
|
<param name="Keyword" value="RegisterTask">
|
||||||
|
<param name="Keyword" value="RegisterGroup">
|
||||||
|
</object>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||||
|
<title></title>
|
||||||
|
<link rel="StyleSheet" href="../../default.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<H1>Ìîäóë<span lang="ru">ü </span>RobotTaskMaker</H1>
|
||||||
|
<hr>
|
||||||
|
<table border="0" width="100%" id="table1" style="border-width: 0px" cellpadding="8">
|
||||||
|
<tr height=20pt>
|
||||||
|
<td style="border-style:none; border-width:medium; background-color: #99CCFF">
|
||||||
|
<b><font size="2" color="#800080"><span lang="ru">Òèïû</span> ìîäóëÿ </font></b>
|
||||||
|
<font size="2" color="#800080"><b>RobotTaskMaker</b></font></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>type</b> TaskProcType<span lang="ru"> </span>=<b><span lang="ru">
|
||||||
|
</span>procedure</b>;</code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p>Òèï ïðîöåäóðû, ãåíåðèðóþùåé êîíêðåòíîå çàäàíèå.
|
||||||
|
Êàæäîå çàäàíèå ðåàëèçóåòñÿ â âèäå îòäåëüíîé ïðîöåäóðû; äëÿ ñâÿçûâàíèÿ ýòîé ïðîöåäóðû
|
||||||
|
ñ èìåíåì çàäàíèÿ íåîáõîäèìî èñïîëüçîâàòü ïðîöåäóðó <code>RegisterTask</code>, îïèñûâàåìóþ íèæå.
|
||||||
|
</p>
|
||||||
|
<table border="0" width="100%" id="table2" style="border-width: 0px" cellpadding="8">
|
||||||
|
<tr height=20pt>
|
||||||
|
<td style="border-style:none; border-width:medium; background-color: #99CCFF">
|
||||||
|
<b><font size="2" color="#800080">Ïðîöåäóðû ìîäóëÿ </font></b>
|
||||||
|
<font size="2" color="#800080"><b>RobotTaskMaker</b></font></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> Field(szx,szy: integer); </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Çàäàåò ïîëå Ðîáîòà ðàçìåðà </span><code>szx</code>
|
||||||
|
<span lang="ru">íà </span><code>szy</code> <span lang="ru">êëåòîê</span>.</p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> HorizontalWall(x,y,len: integer); </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Ñîçäàåò ãîðèçîíòàëüíóþ ñòåíó äëèíû </span><code>len</code><span lang="ru">
|
||||||
|
è êîîðäèíàòàìè ëåâîãî âåðõíåãî óãëà (</span><code>x</code>,<span lang="ru">
|
||||||
|
</span><code>y</code>)<span lang="ru">.</span></p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> VerticalWall(x,y,len: integer); </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Ñîçäàåò âåðòèêàëüíóþ ñòåíó äëèíû </span><code>len</code><span lang="ru">
|
||||||
|
è êîîðäèíàòàìè ëåâîãî âåðõíåãî óãëà (</span><code>x</code>,<span lang="ru">
|
||||||
|
</span><code>y</code>)<span lang="ru">.</span></p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> RobotBegin(x,y: integer); </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Çàäàåò íà÷àëüíîå ïîëîæåíèå Ðîáîòà â êëåòêå ñ êîîðäèíàòàìè (</span><code>x</code>,<span lang="ru">
|
||||||
|
</span><code>y</code>)<span lang="ru">.</span></p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> RobotEnd(x,y: integer); </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Çàäàåò êîíå÷íîå ïîëîæåíèå Ðîáîòà â êëåòêå ñ êîîðäèíàòàìè (</span><code>x</code>,<span lang="ru">
|
||||||
|
</span><code>y</code>)<span lang="ru">.</span></p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> RobotBeginEnd(x,y,x1,y1: integer); </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Çàäàåò íà÷àëüíîå ïîëîæåíèå Ðîáîòà â êëåòêå ñ êîîðäèíàòàìè (</span><code>x</code>,<span lang="ru">
|
||||||
|
</span><code>y</code>)<span lang="ru"> è êîíå÷íîå â êëåòêå ñ êîîðäèíàòàìè (</span><code>x<span lang="ru">1</span></code>,<span lang="ru">
|
||||||
|
</span><code>y<span lang="ru">1</span></code>)<span lang="ru">.</span></p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> Tag(x,y: integer); </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Ïîìå÷àåò êëåòêó (</span><code>x</code>,<span lang="ru">
|
||||||
|
</span><code>y</code>)<span lang="ru"> äëÿ çàêðàøèâàíèÿ.</span></p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> TagRect(x,y,x1,y1: integer); </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Ïîìå÷àåò ïðÿìîóãîëüíèê èç êëåòîê, çàäàâàåìûé êîîðäèíàòàìè
|
||||||
|
ïðîòèâîïîëîæíûõ âåðøèí ïðÿìîóãîëüíèêà (</span><code>x</code>,<span lang="ru">
|
||||||
|
</span><code>y</code>)<span lang="ru"> è (</span><code>x<span lang="ru">1</span></code>,<span lang="ru">
|
||||||
|
</span><code>y<span lang="ru">1</span></code>)<span lang="ru">, äëÿ
|
||||||
|
çàêðàøèâàíèÿ.</span></p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> MarkPainted(x,y: integer); </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Çàêðàøèâàåò êëåòêó (</span><code>x</code>,<span lang="ru">
|
||||||
|
</span><code>y</code>)<span lang="ru"> (â çàäàíèè íåêîòîðûå êëåòêè ìîãóò áûòü
|
||||||
|
óæå çàêðàøåíû).</span></p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> TaskText(s: <b>string</b>); </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Çàäàåò ôîðìóëèðîâêó òåêñòà çàäàíèÿ â ñòðîêå </span><code>s</code><span lang="ru">.</span></p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> RegisterGroup(name,description,unitname: string; count: integer); </code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p>Îáåñïå÷èâàåò àâòîìàòè÷åñêóþ ðåãèñòðàöèþ íîâîé ãðóïïû çàäàíèé â ïðîãðàììíîì ìîäóëå <b>PT4Load</b>.
|
||||||
|
 ðåçóëüòàòå èìÿ äàííîé ãðóïïû áóäåò îòîáðàæàòüñÿ â îêíå ìîäóëÿ <b>PT4Load</b> â ñïèñêå ãðóïï, ñâÿçàííûõ ñ èñïîëíèòåëåì Ðîáîò,
|
||||||
|
÷òî ïîçâîëèò ñîçäàòü ïðîãðàììó-çàãîòîâêó äëÿ âûïîëíåíèÿ ëþáîãî çàäàíèÿ ýòîé ãðóïïû.
|
||||||
|
 êà÷åñòâå ïàðàìåòðîâ ïðîöåäóðû óêàçûâàåòñÿ èìÿ ãðóïïû <code>name</code>,
|
||||||
|
êðàòêîå îïèñàíèå ãðóïïû <code>description</code>,
|
||||||
|
èìÿ ìîäóëÿ <code>unitname</code>, â êîòîðîì îïèñàíà ãðóïïà, è êîëè÷åñòâî çàäàíèé <code>count</code>.
|
||||||
|
Èìÿ ãðóïïû çàäàíèé äîëæíî ñîäåðæàòü íå áîëåå 7 ñèìâîëîâ (öèôð è ëàòèíñêèõ áóêâ) è íå äîëæíî îêàí÷èâàòüñÿ öèôðîé,
|
||||||
|
êîëè÷åñòâî çàäàíèé íå äîëæíî ïðåâûøàòü 999.
|
||||||
|
Ïðîöåäóðà <code>RegisterGroup</code> äîëæíà
|
||||||
|
âûçûâàòüñÿ â ñåêöèè èíèöèàëèçàöèè ìîäóëÿ, ñîäåðæàùåãî ðåàëèçàöèþ íîâîé ãðóïïû çàäàíèé äëÿ Ðîáîòà.
|
||||||
|
</p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> RegisterTask(name: string; p: TaskProcType);</code>
|
||||||
|
</blockquote>
|
||||||
|
<p>Ñâÿçûâàåò èìÿ çàäàíèÿ <code>name</code> ñ ïðîöåäóðîé <code>p</code>, â êîòîðîé ðåàëèçîâàíî äàííîå çàäàíèå.
|
||||||
|
Äàííóþ ïðîöåäóðó ñëåäóåò âûçûâàòü äëÿ <i>êàæäîãî</i> çàäàíèÿ.
|
||||||
|
Ïîäîáíî îïèñàííîé âûøå ïðîöåäóðå <code>RegisterGroup</code>, ïðîöåäóðà <code>RegisterTask</code> äîëæíà âûçûâàòüñÿ â ñåêöèè èíèöèàëèçàöèè
|
||||||
|
ìîäóëÿ, ñîäåðæàùåãî ðåàëèçàöèþ íîâîé ãðóïïû çàäàíèé äëÿ Ðîáîòà. Ïîðÿäîê âûçîâà ýòèõ ïðîöåäóð ìîæåò áûòü ïðîèçâîëüíûì.
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
114
PABCNetHelp/ForEducation/MakeModules/RobotMakeCreation.html
Normal file
|
|
@ -0,0 +1,114 @@
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||||||
|
<param name="Keyword" value="">
|
||||||
|
</object>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||||||
|
<title></title>
|
||||||
|
<link rel="StyleSheet" href="../../default.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<H1>Ñîçäàíèå çàäàíèé äëÿ èñïîëíèòåëÿ Ðîáîò</H1>
|
||||||
|
<hr>
|
||||||
|
<p><span lang="ru">Îïèøåì ïîñëåäîâàòåëüíîñòü ñîçäàíèÿ ãðóïïû çàäàíèé äëÿ
|
||||||
|
èñïîëíèòåëÿ Ðîáîò. Ñîçäàäèì ìîäóëü </span>RobTasks.pas ñî ñëåäóþùè<span lang="ru">ì
|
||||||
|
òåêñòîì:</span></p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>unit</b> RobTasks;</code></p>
|
||||||
|
<p><code><b>interface</b></code></p>
|
||||||
|
<p><code><b>uses</b> RobotTaskMaker;</code></p>
|
||||||
|
<p><code><b>implementation</b></code></p>
|
||||||
|
<p><code><b>procedure</b> FirstRob;<br>
|
||||||
|
<b>begin</b><br>
|
||||||
|
<span lang="ru"> </span>TaskText('Çàäàíèå myrob1. Çàêðàñèòü ïîìå÷åííûå êëåòêè');<br>
|
||||||
|
<span lang="ru"> </span>Field(10,6);<br>
|
||||||
|
<span lang="ru"> </span>HorizontalWall(0,3,4);<br>
|
||||||
|
<span lang="ru"> </span>VerticalWall(4,3,2);<br>
|
||||||
|
<span lang="ru"> </span>RobotBegin(1,4);<br>
|
||||||
|
<span lang="ru"> </span>VerticalWall(5,1,5);<br>
|
||||||
|
<span lang="ru"> </span>HorizontalWall(5,1,4);<br>
|
||||||
|
<span lang="ru"> </span>RobotEnd(6,2);<br>
|
||||||
|
<span lang="ru"> </span>Tag(6,2);<br>
|
||||||
|
<b>end</b>;</code></p>
|
||||||
|
<p><code><b>begin</b><br>
|
||||||
|
RegisterGroup('myrob','Ìîè çàäàíèÿ äëÿ Ðîáîòà','RobTasks',2);<br>
|
||||||
|
RegisterTask('myrob1',FirstRob);<br>
|
||||||
|
<b>end</b>.</code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Íàáåðåì è çàïóñòèì îñíîâíóþ ïðîãðàììó (ñîõðàíÿòü åå â êàêîì-ëèáî ôàéëå íå òðåáóåòñÿ):</span></p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>uses</b> Robot, RobTasks;<br>
|
||||||
|
<b>begin</b><br>
|
||||||
|
Task('myrob1');<br>
|
||||||
|
<b>end</b>.</code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p>Áóäåò âûâåäåíî ñëåäóþùåå çàäàíèå äëÿ Ðîáîòà:
|
||||||
|
</p>
|
||||||
|
<p><img border="0" src="images/rbmake1.PNG"></p>
|
||||||
|
<p><span lang="ru">
|
||||||
|
Äîáàâèì çàäàíèå, â êîòîðîì êîíôèãóðàöèÿ ïîëÿ ñëó÷àéíà:</span></p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>procedure</b> SecondRob;<br>
|
||||||
|
<b>var</b> n,i: integer;<br>
|
||||||
|
<b>begin</b><br>
|
||||||
|
<span lang="ru"> </span>TaskText('Çàäàíèå myrob2. Çàêðàñèòü êëåòêè ïîä çàêðàøåííûìè');<br>
|
||||||
|
<span lang="ru"> </span>n:=Random(4)+7;<br>
|
||||||
|
<span lang="ru"> </span>Field(n,4);<br>
|
||||||
|
<span lang="ru"> </span>RobotBeginEnd(1,3,n,3);<br>
|
||||||
|
<span lang="ru"> </span>MarkPainted(n,2);<br>
|
||||||
|
<span lang="ru"> </span>Tag(n,3);<br>
|
||||||
|
<span lang="ru"> </span><b>for</b> i:=2 <b>to</b> n-1 <b>do</b><br>
|
||||||
|
<span lang="ru"> </span><b>if</b> Random(3)=1 <b>then</b><br>
|
||||||
|
<span lang="ru"> </span><b>begin</b><br>
|
||||||
|
<span lang="ru"> </span>MarkPainted(i,2);<br>
|
||||||
|
<span lang="ru"> </span>Tag(i,3);<br>
|
||||||
|
<span lang="ru"> </span><b>end</b>;<br>
|
||||||
|
<b>end</b>;</code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p>Äîáàâèì âûçîâ ïðîöåäóðû ðåãèñòðàöèè äëÿ äàííîãî çàäàíèÿ; â ðåçóëüòàòå ñåêöèÿ èíèöèàëèçàöèè ïðèìåò ñëåäóþùèé âèä:</p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>begin</b><br>
|
||||||
|
RegisterGroup('myrob','Ìîè çàäàíèÿ äëÿ Ðîáîòà','RobTasks',2);<br>
|
||||||
|
RegisterTask('myrob1',FirstRob);<br>
|
||||||
|
RegisterTask('myrob2',SecondRob);<br>
|
||||||
|
<b>end</b>.</code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Èçìåíèì îñíîâíóþ ïðîãðàììó:</span></p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>uses</b> Robot, RobTasks;<br>
|
||||||
|
<b>begin</b><br>
|
||||||
|
Task('myrob<span lang="ru">2</span>');<br>
|
||||||
|
<b>end</b>.</code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p><span lang="ru">Ïðè çàïóñêå ýòîé ïðîãðàììû â îêíå èñïîëíèòåëÿ Ðîáîò áóäåò âûâåäåíî íîâîå çàäàíèå:</p>
|
||||||
|
<p><img border="0" src="images/rbmake2.PNG"></p>
|
||||||
|
<p>
|
||||||
|
Ïðè ïåðâîì çàïóñêå ïðîãðàììû ñ ïîäêëþ÷åííûì ìîäóëåì <code>DMTasks</code> ñîçäàííàÿ íàìè ãðóïïà áûëà àâòîìàòè÷åñêè çàðåãèñòðèðîâàíà
|
||||||
|
â ìàñòåðå ïî ñîçäàíèþ ïðîãðàìì-çàãîòîâîê <b>PT4Load</b>.
|
||||||
|
Åñëè òåïåðü íàæàòü êíîïêó <img border="0" src="images/load.gif" width="16" height="17"> è â ïîÿâèâøåìñÿ îêíå
|
||||||
|
<b>PT4Load</b> ââåñòè ïðåôèêñ
|
||||||
|
</span><span lang="en-us"><code>RB</code></span><span lang="ru"> â ïîëå «Çàäàíèå», òî îêíî ïðèìåò ñëåäóþùèé âèä:
|
||||||
|
</span></p>
|
||||||
|
|
||||||
|
<p><img border="0" src="images/rbmake3.PNG">
|
||||||
|
</p>
|
||||||
|
<p>Ìû âèäèì, ÷òî ãðóïïà çàäàíèé myrob ïîÿâèëàñü â ñïèñêå äîñòóïíûõ ãðóïï äëÿ èñïîëíèòåëÿ Ðîáîò. Íàáåðåì èìÿ çàäàíèÿ
|
||||||
|
<span lang="en-us"><code>myrob1</code></span>:</p>
|
||||||
|
<p><img border="0" src="images/rbmake4.PNG">
|
||||||
|
</p>
|
||||||
|
<p>Ïîñëå íàæàòèÿ <span lang="en-us">Enter </span>â ðàáî÷åì êàòàëîãå áóäåò ñîçäàí
|
||||||
|
íîâûé ôàéë <span lang="en-us">RBmyrob1.pas </span>ñî ñëåäóþùèì ñîäåðæèìûì:</p>
|
||||||
|
<blockquote>
|
||||||
|
<p><code><b>uses</b> Robot, RobTasks;<br>
|
||||||
|
<br>
|
||||||
|
<b>begin</b><br>
|
||||||
|
Task('myrob1');<br>
|
||||||
|
<br>
|
||||||
|
<b>end</b>.</code></p>
|
||||||
|
</blockquote>
|
||||||
|
<p>Ìîæíî ïðèñòóïàòü ê ðåøåíèþ ñîáñòâåííîðó÷íî ðàçðàáîòàííîé çàäà÷è :)</p>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
241
PABCNetHelp/ForEducation/MakeModules/default.css
Normal file
|
|
@ -0,0 +1,241 @@
|
||||||
|
BODY,
|
||||||
|
TABLE,
|
||||||
|
TD {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
background-color: #ffffff;
|
||||||
|
font-size: small;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
code {
|
||||||
|
color: #000080;
|
||||||
|
font-size: small;
|
||||||
|
text-align: left
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pre {
|
||||||
|
color: #000080;
|
||||||
|
font-size: small;
|
||||||
|
text-align: left
|
||||||
|
text-indent: 30pt;
|
||||||
|
margin-left: 30pt;
|
||||||
|
margin-top: 3pt;
|
||||||
|
margin-bottom: 0pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
code.codeit {
|
||||||
|
color: #000000;
|
||||||
|
font-family: Times;
|
||||||
|
font-style: italic;
|
||||||
|
font-size: small;
|
||||||
|
text-align: left
|
||||||
|
}
|
||||||
|
|
||||||
|
H1 {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-top: 6pt;
|
||||||
|
margin-bottom: 6pt;
|
||||||
|
font-size: large;
|
||||||
|
color: #000080;
|
||||||
|
text-align: left
|
||||||
|
}
|
||||||
|
|
||||||
|
H2 {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
font-weight: bold;
|
||||||
|
font-style: italic;
|
||||||
|
margin-bottom: 2pt;
|
||||||
|
margin-top: 6pt;
|
||||||
|
font-size: medium;
|
||||||
|
color: #000080;
|
||||||
|
text-align: left
|
||||||
|
}
|
||||||
|
|
||||||
|
H3 {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
margin-bottom: 2pt;
|
||||||
|
margin-top: 6pt;
|
||||||
|
font-size: medium;
|
||||||
|
color: #000080;
|
||||||
|
text-align: left
|
||||||
|
}
|
||||||
|
|
||||||
|
H4 {
|
||||||
|
font-weight: bold;
|
||||||
|
margin-top: 6pt;
|
||||||
|
margin-bottom: 2pt;
|
||||||
|
font-size: small;
|
||||||
|
text-align: left
|
||||||
|
}
|
||||||
|
|
||||||
|
H5 {
|
||||||
|
font-size: 10.0pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
H6 {
|
||||||
|
font-size: 10.0pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
P {
|
||||||
|
margin-top: 3pt;
|
||||||
|
margin-bottom: 0pt;
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
font-size: small;
|
||||||
|
text-indent: 30pt;
|
||||||
|
text-align: justify
|
||||||
|
}
|
||||||
|
|
||||||
|
P.task {
|
||||||
|
margin-top: 3pt;
|
||||||
|
margin-bottom: 0pt;
|
||||||
|
margin-left: 0pt;
|
||||||
|
margin-right: 0pt;
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
font-size: small;
|
||||||
|
text-indent: 30pt;
|
||||||
|
text-align: justify;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 1pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
P.remark {
|
||||||
|
margin-top: 3pt;
|
||||||
|
margin-bottom: 0pt;
|
||||||
|
margin-left: 30pt;
|
||||||
|
margin-right: 0pt;
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
font-size: small;
|
||||||
|
text-indent: 0pt;
|
||||||
|
text-align: justify;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
P.ris {
|
||||||
|
font-family: Arial;
|
||||||
|
margin-top: 3pt;
|
||||||
|
margin-bottom: 0pt;
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
font-size: small;
|
||||||
|
color: #000080;
|
||||||
|
text-indent: 0pt;
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
H1.part {
|
||||||
|
color: #000000;
|
||||||
|
margin-top: 20pt;
|
||||||
|
margin-bottom: 20pt;
|
||||||
|
text-align: center
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
H1.part1 {
|
||||||
|
color: #000000;
|
||||||
|
margin-top: 80pt;
|
||||||
|
margin-bottom: 20pt;
|
||||||
|
text-align: center
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
H1.part2{
|
||||||
|
color: #000000;
|
||||||
|
font-size: medium;
|
||||||
|
margin-top: 0pt;
|
||||||
|
margin-bottom: 20pt;
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
H3.tit {
|
||||||
|
color: #000000;
|
||||||
|
margin-top: 10pt;
|
||||||
|
margin-bottom: 10pt;
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
|
||||||
|
H2.subpart {
|
||||||
|
color: #000000;
|
||||||
|
margin-bottom: 80pt;
|
||||||
|
margin-top: 20pt;
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
|
||||||
|
P.author {
|
||||||
|
margin-top: 0pt;
|
||||||
|
margin-bottom: 0pt;
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
font-size: 9pt;
|
||||||
|
color: #000000;
|
||||||
|
text-indent: 0pt;
|
||||||
|
text-align: right
|
||||||
|
}
|
||||||
|
|
||||||
|
P.refs {
|
||||||
|
margin-top: 0pt;
|
||||||
|
margin-bottom: 3pt;
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
font-size: 10pt;
|
||||||
|
color: #000000;
|
||||||
|
text-indent: 0pt;
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
|
||||||
|
P.foot {
|
||||||
|
margin-top: 0pt;
|
||||||
|
margin-bottom: 0pt;
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
font-size: 9pt;
|
||||||
|
font-style: italic;
|
||||||
|
color: #000000;
|
||||||
|
text-indent: 0pt;
|
||||||
|
text-align: right
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
OL,
|
||||||
|
UL {
|
||||||
|
margin-top: 3pt;
|
||||||
|
margin-bottom: 0pt;
|
||||||
|
font-size: small;
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
text-align: justify
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SPAN.tsktitle
|
||||||
|
{
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: small;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
P.tsk{text-align:justify;text-indent:-50;margin-top:5; margin-left:60;}
|
||||||
|
P.hnt{text-align:justify;margin-left:60;}
|
||||||
|
P.hntc{text-align:justify;margin-left:60;text-indent:0;margin-top:0;}
|
||||||
|
P.hntq{text-align:justify;margin-left: 60;margin-top:0;}
|
||||||
|
P.cmt{text-align:justify;margin-top:5;}
|
||||||
|
P.ttt{text-align:left;}
|
||||||
|
P.cnt{text-align:center;}
|
||||||
|
P.qte{
|
||||||
|
color: #000080;
|
||||||
|
font-size: small;
|
||||||
|
text-indent:0;
|
||||||
|
text-align:left;margin-left:120;margin-top:0;margin-bottom:0;}
|
||||||
|
blockquote{font-family: Arial, sans-serif;text-align:justify;margin-left:100;margin-top:0; margin-bottom:0;}
|
||||||
|
P.cmtc{text-align:justify;}
|
||||||
|
P.cmtq{text-align:justify;}
|
||||||
|
SUB{font-family: Arial, sans-serif;;font-size:x-small;}
|
||||||
|
SUP{font-family: Arial, sans-serif;;font-size:x-small;}
|
||||||
BIN
PABCNetHelp/ForEducation/MakeModules/images/demo_3.png
Normal file
|
After Width: | Height: | Size: 249 B |
BIN
PABCNetHelp/ForEducation/MakeModules/images/dmmake1.PNG
Normal file
|
After Width: | Height: | Size: 8 KiB |
BIN
PABCNetHelp/ForEducation/MakeModules/images/dmmake2.PNG
Normal file
|
After Width: | Height: | Size: 7.2 KiB |
BIN
PABCNetHelp/ForEducation/MakeModules/images/dmmake3.PNG
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
BIN
PABCNetHelp/ForEducation/MakeModules/images/dmmake4.PNG
Normal file
|
After Width: | Height: | Size: 5.9 KiB |
BIN
PABCNetHelp/ForEducation/MakeModules/images/load.gif
Normal file
|
After Width: | Height: | Size: 172 B |
BIN
PABCNetHelp/ForEducation/MakeModules/images/pt4exam1.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
PABCNetHelp/ForEducation/MakeModules/images/pt4exam1a.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
PABCNetHelp/ForEducation/MakeModules/images/pt4exam2.png
Normal file
|
After Width: | Height: | Size: 55 KiB |