МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИИ Томский политехнический университет ____________________________________________________...
15 downloads
345 Views
191KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИИ Томский политехнический университет _______________________________________________________
УТВЕРЖДАЮ Декан АВТФ ________________ Мельников Ю.С. “__” ______2002 г.
ИСПОЛЬЗОВАНИЕ ЦИКЛОВ В OBJECT PASCAL Методические указания к лабораторной работе № 133 по курсу “Программирование и основы алгоритмизации” для студентов направления 550200 “Автоматизация и управление”
Томск - 2002
УДК 681.3 Использование циклов в Object Pascal. Методические указания к лабораторной работе № 133 по курсу “Программирование и основы алгоритмизации ” для студентов направления 550200 “Автоматизация и управление”
Составитель Н.М. Семёнов Рецензент к.т.н., доцент Е.И. Громаков
Методические указания рассмотрены и рекомендованы методическим семинаром кафедры интегрированных компьютерных систем управления “___” ___________ 2002 г. Зав. кафедрой
А.М. Малышенко
ОГЛАВЛЕНИЕ 1 Пример программы просмотра файлов.................................................. 4 1.1 Создание программы просмотра файлов .................................. 4
1.2 Ввод текста программы просмотра файлов .................... .......... 1.3 Запуск программы просмотра файлов ...................................... 2 Развитие программы просмотра файлов............................................... 2.1 Улучшение внешнего вида программы ..................................... 2.2 Запуск усовершенствованной программы просмотра файлов ........................................................... .......... 3 Создание более сложных циклических конструкций ........................... 3.1 Настраиваемые циклы ................................................................ 3.2 Создание бесконечных циклов ................................................... 3.3 Конструкция цикла с вызовом Break ....................................... 3.4 Пропуск итераций в цикле ................................................ ......... 4 Контрольные вопросы ............................................................................ 5 Дополнительные задания ........................................................................ 6 Литература ..............................................................................................
6 8 9 9 10 11 11 12 12 13 13 14 14
ИСПОЛЬЗОВАНИЕ ЦИКЛОВ В OBJECT PASCAL Цель работы: познакомить студентов с некоторыми особенностями циклов в языке Object Pascal и развить навыки работы со средой Delphi. Использование циклов - один из наиболее важных аспектов программирования. Скучные повторяющиеся действия являются наиболее подходящей работой для компьютеров, и циклические структуры позволяют организовать выполнение таких заданий. Потребность в повторении набора действий возникает часто, и Object Pascal предоставляет по крайней мере три различных управляющих конструкции для работы с повторяющимися действиями: циклы while, repeat и for. Основные правила работы с этими циклами совпадают с языком программирования Turbo Pascal, а на некоторых особенностях мы остановимся в дальнейшем. Сейчас же вспомним некоторые нюансы использования циклов. Если начальное значение счётчика цикла for - to больше, чем конечное, то тело цикла выполняться не будет. Аналогично, если начальное значение счётчика цикла for - downto меньше, чем конечное, то тело цикла выполняться не будет. Не пытайтесь изменить величину переменной счётчика цикла for внутри цикла. Транслятор позволит Вам сделать это. Поскольку величина счётчика цикла автоматически увеличивается или уменьшается, изменение её в дополнение к этому может привести к трудно обнаруживаемым ошибкам. Обращайтесь с переменной счётчика цикла как с доступной только для чтения (read - only). Согласно правилам Object Pascal, значение переменной счётчика цикла после его окончания является неопределённым! Не надо в своей программе рассчитывать на определённое значение счётчика после выхода из цикла. После окончания работы цикла следует считать содержимое переменной счётчика неинициализированным. В цикле for Паскаля нет (к сожалению) параметра step, имеющегося в других языках программирования и позволяющего изменять величину инкремента или декремента счётчика цикла. В цикле for значение счётчика изменяется только на единицу. Если Вы хотите, чтобы счётчик цикла изменялся на величину, отличную от единицы, используйте не цикл for, а цикл while с явно заданным счётчиком, производя с этим счётчиком операции сложения или вычитания внутри тела цикла.
1 Пример программы просмотра файлов Создадим программу с использованием цикла while. Программа просмотра файлов способна прочесть текстовый файл и показать его содержимое в своём окне. Вы можете просматривать файл, используя линейки прокрутки. Содержимое файла отображается в окне списка, каждый элемент которого содержит одну строку файла. В отдельной строке указывается название файла. 1.1 Создание программы просмотра файлов Для создания программы просмотра файлов надо выполнить следующие шаги: 1. Создайте новый проект с пустой формой. 2. Сохраните проект под именем WHILE1.DPR.
4
3. Разместите в форме следующие компоненты: ListBox, OpenDialog и MainMenu. Законченная форма должна выглядеть так, как показано на рис.1.
Рис.1. Внешний вид основной формы программы просмотра файлов в окне Дизайнера форм. 4. Установите свойства формы и её компонентов в соответствии с таблицей номер 1. Таблица 1. Таблица свойств UNIT1.FRM - основной формы программы просмотра файлов WHILE1. Kомпонент Основная форма
Окно редактирования
Диалоговое окно
Основное меню
Свойство Name ActiveControl Caption Height Width Menu Name Align BorderStyle IntegralHeight Name Filter Name Items
Установка FrmWhile1 ListBox1 ‘File Browser’ 300 435 MainMenu1 ListBox1 alNone bsNone False OpenDialog1 ‘Pascal source (*.pas,*.dpr) |*.pas;*.dpr |Text (*.txt)|*.txt|All files (*.*)|*.* ‘ MainMenu1 &File &Open E&xit
5
Большинство свойств, описанных в таблице 1, Вы можете ввести непосредственно. Выберите подходящий компонент, щёлкнув на нём в Дизайнере форм, затем введите свойство в таблице Инспектора объектов. Основное меню в этом плане несколько отличается от других компонентов. Вам надо дважды щёлкнуть мышью на пиктограмме компонента основного меню в Дизайнере форм. При этом включится Дизайнер меню - редактор свойств компонентов MainMenu - в котором Вы сможете настроить этот компонент. Меню, которое Вам предстоит настраивать, изначально будет пустым. Введите значение свойства Caption для первого (и единственного в этом случае) выбора меню - &File, после чего нажмите Enter. Снова нажмите на Enter. При этом будет создано подменю, и курсор укажет на его первую пустую строку. Введите &Open... и нажмите Enter. Для введения разделяющей линии в подменю занесите в свойство Caption знак “минус”. Нажмите Enter. Щёлкните на появившейся снизу прямоугольник. Закончите создание подменю введением третьего поля с названием E&xit и закройте окно Дизайнера меню. В дополнение к пиктограмме основного меню, показываемой в процессе разработки формы, в Вашей форме появится также действующая модель только что созданного меню. Каждый раз, когда Вы будете выбирать определённую команду меню, в окне редактора кода (Code Editor) будет появляться заготовка соответствующего обработчика событий OnClick. 1.2 Ввод текста программы просмотра файлов Для ввода текста программы просмотра файлов выполните следующие шаги: 1. Создайте обработчик события OnClick для команды Exit своего меню, выбрав строку Exit в модели меню File в Дизайнере форм. Delphi ответит вызовом редактора кода с заготовкой для программы метода TFrmWhile1.Exit1Click . 2. Вставьте в метод Exit1Click строку Close; Назначение метода Close - закрыть окно основной формы и завершить работу программы. 3. Создайте обработчик события OnClick для команды Open своего меню, выбрав строку Open в модели меню File в Дизайнере форм. Delphi ответит вызовом редактора кода с заготовкой для подпрограммы метода TFrmWhile1.Open1Click. 4. Введите текст метода Open1Click, показанный в листинге 1. 5. Не забудьте сохранить проект перед испытанием программы. Листинг 1. Обработчик событий OnClick для пункта меню Open программы просмотра файлов WHILE1. ___________________________________________________________________________ 1: procedure TFrmWhile1.Open1Click(Sender: TObject); 2: var 3: AtextFile:System.Text; 4: TextLine:String; 5: begin 6: if OpenDialog1.Execute then begin 7: ListBox1.Clear; 8: Caption:='File Browser: ' + OpenDialog1.FileName; 9: System.Assign(ATextFile,OpenDialog1.FileName); 6
10: Reset(ATextFile); 11: while not Eof(ATextFile) do begin 12: Readln(ATextFile,TextLine); 13: ListBox1.Items.Add(TextLine); 14: end; 15: System.Close(ATextFile); 16: end; 17: end; ___________________________________________________________________________ В листинге 1 приведён текст обработчика событий OnClick, вызываемого при выборе команды Open в меню File. В этом обработчике событий заключено основное содержимое программы просмотра файлов. Сначала в строке 6 выполняется метод OpenDialog1.Execute. Здесь OpenDialog1 компонент, который Вы добавили в форму в Дизайнере форм, и который содержит в себе стандартное диалоговое окно Windows Open File. Работа этого компонента позволяет пользователю выбирать файл для просмотра. Имя выбранного файла, если такой есть, передаётся через свойство FileName компонента OpenDialog1. После того, как метод OpenDialog1.Execute выполнен, может случиться одна из двух вещей: или пользователь выберет файл и щёлкнет на кнопке ОК, либо он щёлкнет на кнопке Cancel в диалоговом окне Open File. Оператор if в строке 6 проверяет, какое событие из этих двух произошло. Если метод OpenDialog1.Execute вернул значение False, то есть если была нажата кнопка Cancel, программа не делает ничего. Управление просто передаётся на строку 17 с командой end, которая завершает работу обработчика событий OnClick. Если OpenDialog1.Execute в строке 6 вернул значение True, будут выполняться команды внутри блока begin - end в строках с 6 по 16. В строке 7 очищается содержимое окна списка. Изначально ни один файл в окно не загружен, так что при открытии первого файла оператор в строке 7 в действительности ничего не делает, но впоследствии, когда пользователь загрузит следующий файл, это окно должно быть предварительно очищено. Оператор ListBox1.Clear именно это и делает. Обычно в приложениях Windows принято показывать имя открытого в настоящее время файла. Команда в строке 8 добавляет надпись, содержащую имя выбранного файла. Имя файла берётся прямо из свойства FileName компонента OpenDialog1 и добавляется к надписи ‘File Browser: ’ . Строки с 9 по 15 содержат операторы, в которых Вы должны сразу узнать стандартный алгоритм чтения текстового файла. Команды Assign в строке 9 и Reset в строке 10 открывают внешний файл, заданный свойством FileName компонента OpenDialog1, связывая его с файловой переменной ATextFile. Переменная ATextFile определена в строке 3. Обратите внимание на особенность этого определения. Вместо обычного описания ATextFile: Text; к имени типа добавлен префикс System. Почему? Он включен сюда потому, что форма уже имеет свойство с названием Text. Поскольку обработчик OnClick является методом этой формы, возникает конфликт между именем этого свойства и объявленным ранее именем Text. Для разрешения этого конфликта имён Вы должны пояснить, что Вы имеете в виду, указав квалификатор System, то есть, написав System.Text;
7
Эта деталь кажется незначительной, но если Вы этого не сделаете, транслятор выдаст Вам своего рода подсказку, в которой будет выражено недовольство по поводу конфликта имён. Однако сообщение транслятора “Error in type” не такое информативное, как Вам хотелось бы. Следовательно, Вы всегда должны помнить о возможности конфликта при использовании стандартного файлового типа Text. При всяком использовании имени Text для чего - нибудь ещё (а это очень популярное имя), возникает угроза конфликта. Просто не забывайте всегда использовать квалификатор System перед указанием типа Text при описании текстового файла. Эти же правила применимы к оператору Close в строке 15. Заметим, что Вы уже ввели оператор Close в методе OnClick для команды меню Exit, где под Close подразумевается соответствующий метод формы. В этот раз Close должен относиться к файлу, а не к форме, и очень важно использовать в этом случае префикс System. В противном случае транслятор будет настаивать на удалении параметра, стоящего в вызове Close. Если Вы просто поставите Close, транслятор обратится к методу TForm.Close, у которого нет параметров. Если у Вас есть подозрения, что возможен конфликт имён, используйте в качестве префикса имя модуля, к которому относится вызывающее сомнения имя. Все встроенные имена расположены в модуле с именем System. Существует много различных модулей: SysUtils, Classes, Forms и другие. Вы можете использовать их в своих программах, ставя имя модуля в качестве префикса перед идентификатором из этого модуля. Файловая переменная, объявленная в строке 3 листинга 1, существует только в данной конкретной процедуре. Файл открывается, обрабатывается и закрывается внутри одного короткого метода. Этот подход к работе с файлами является наиболее предпочтительным в Windows - не держите файлы открытыми в течение длительного времени, закрывайте их, как только представится такая возможность. Строки с 11 по 14 содержат цикл while, выполняющий основную работу этой программы - чтение содержимого выбранного файла. В начале каждой итерации проверяется условие цикла - достижение конца файла. Если достигнут конец файла, то работа цикла прекращается. В противном случае очередная строка файла считывается в переменную TextLine. Переменная TextLine объявлена в строке 4 программы как переменная типа String. Строка 13 иллюстрирует динамическое добавление содержимого к окну списка. Вызвав метод Add свойства Items компонента ListBox, Вы визуально добавили в Дизайнере форм компонент ListBox1 к своей форме. Теперь Вы можете ссылаться на свойство Items компонента ListBox1, которое состоит из списка строк, содержащихся в данный момент в окне списка. Метод Add ожидает строку в качестве параметра, и TextLine каждый раз передаёт ему новую строку текста, прочитанную из файла. 1.3 Запуск программы просмотра файлов Для испытания программы проделайте следующие шаги: 1. Запустите программу WHILE1. 2. В меню File выберите команду Open. Появится стандартное диалоговое окно Open File... . После того, как Вы выбрали файл и щёлкнули мышью на ОК, файл загрузится и его содержимое будет показано в текстовом окне. 3. В меню File выберите команду Exit для завершения работы программы.
8
2 Развитие программы просмотра файлов Добавим в разрабатываемую программу WHILE1 возможность записи текстовых файлов с произвольным именем. Будет использован цикл for для работы с содержимым окна списка. Окно содержит строки текста, предназначенные для записи в файл. 2.1 Улучшение внешнего вида программы Для улучшения внешнего вида программы просмотра файлов выполните следующие операции: 1. Откройте созданный ранее файл проекта WHILE1.DPR. 2. Добавьте к форме компонент SaveDialog страницы Dialogs палитры компонентов Delphi. 3. Измените свойство Filter вновь добавленного диалогового окна SaveDialog1на такое же, как у OpenDialog1. Щёлкните на OpenDialog1 для выбора его, затем нажмите клавишу Shift и щёлкните на компоненте SaveDialog1. После этого щёлкните на свойстве Filter в инспекторе объектов и нажмите Enter. Теперь оба диалоговых окна должны иметь одинаковые свойства Filter. 4. Добавьте команду Save As... в меню File. Для этого сначала дважды щёлкните на компоненте MainMenu1 в Дизайнере формы для вызова редактора меню. В редакторе меню щелкните на разделительной линии между командами Open и Exit. Нажмите клавишу Insert. Введите Save &As... в свойство Caption нового пункта меню. Нажмите Enter. Закройте редактор меню. Теперь Вы можете проверить, что команда Save As... появилась в меню File, щёлкнув мышью на модели основного меню в Дизайнере форм. 5. Находясь в Дизайнере форм, щёлкните на строке Save As... меню File. Система Delphi создаст заготовку метода обработки событий OnClick и покажет её в окне редактора кода. 6. Введите метод TFrmWhile1.SaveAs1Click, как показано на листинге 2. Листинг 2. Обработчик события OnClick для команды меню Save As программы просмотра файлов While1. ___________________________________________________________________________ 1: procedure TFrmWhile1.SaveAs1Click(Sender: TObject); 2: var 3: LineNo:Integer; 4: ATextFile: System.Text; 5: TextLine: String; 6: begin 7: if SaveDialog1.Execute then begin 8: System.Assign(ATextFile,SaveDialog1.FileName); 9: Rewrite(ATextFile); 10: for LineNo :=0 to ListBox1.Items.Count-1 do 11: begin 12: TextLine:=ListBox1.Items[LineNo]; 13: WriteLn(ATextFile,TextLine); 14: end; 15: System.Close(ATextFile);
9
16: end; 17: end; ___________________________________________________________________________ В листинге 2 приведён текст обработчика событий OnClick, активизируемого при выборе команды Save As... меню File. Этот метод сходен по структуре с обработчиком пункта Open меню, разработанного ранее. Выражение SaveDialog1.Execute в строке 7 открывает стандартное диалоговое окно Windows Save As... . Если результат равен True, то есть, если пользователь щёлкнул мышью на кнопке ОК в диалоговом окне, то условие if удовлетворяется и команды внутри цикла if будут выполнены. В строках 8 и 9 файл открывается для записи. Если файла с указанным именем не существует, то оператор Rewrite создаст его. После открытия файла цикл for в строках с 10 по 14 записывает в него строки текста. Обратите внимание, что переменная счётчика цикла LineNo меняется от 0 до величины, на единицу меньше, чем число строк в текстовом окне. Использование стартового значения счётчика 0 необходимо, поскольку нумерация строк в текстовом окне начинается с нуля. В строке 12 TextLine:=ListBox1.Items[LineNo]; у компонента ListBox1 есть свойство Items, которое является массивом строк. Ранее Вы добавили эти строки, используя метод Add компонента ListBox1 при загрузке файла. Вы можете получить доступ к отдельному элементу этого массива, используя выражение для индекса массива, заключенное в квадратные скобки. В строке 12 переменной TextLine присваивается значение элемента массива Items с номером [LineNo]. Цикл в строке 10 совершает ровно столько итераций, сколько требуется для записи всех строк текстового окна в файл. Выражение ListBox1.Items.Count даёт действительное количество строк в текстовом окне и предоставляет конечное значение для счётчика цикла, что гарантирует окончание работы цикла после выполнения ListBox1.Items.Count-1 итераций. После окончания работы цикла вызывается подпрограмма System.Close, закрывающая файл и гарантирующая физическую запись данных на диск. 2.2 Запуск усовершенствованной программы просмотра файла После добавления метода SaveAs1Click, приведённого в предыдущем разделе, сделайте следующее: 1. Запустите программу. 2. Загрузите текстовый файл так, как Вы делали это раньше. 3. В меню File выберите Save As. Внутри появившегося диалогового окна задайте имя выходного файла, желательно не совпадающее с первоначальным. На рис.2 показан внешний вид усовершенствованной программы просмотра файлов.
10
Рис.2. Программа просмотра файлов с добавленной операцией Save As. 4. Щёлкните на кнопке ОК. Загруженный в программу файл будет записан под новым именем. Вы можете проверить это, загрузив в программу только что записанный файл. Он должен быть идентичен исходному файлу. 5. В меню File выберите Exit для выхода из программы.
3 Создание более сложных циклических конструкций В Object Pascal можно создавать циклы произвольной сложности и с характеристиками, не поддерживаемыми непосредственно стандартными конструкциями циклов while - do, repeat - until, for - to - do, for - downto - do. Трёх стандартных конструкций циклов оказывается достаточно в подавляющем большинстве случаев. Поэтому не используйте без нужды способ создания более сложных циклов, описанный в этом разделе. 3.1 Настраиваемые циклы Обычно условие цикла проверяется или в начале (циклы while и for) или в конце (цикл repeat) исполняемого блока. Однако есть возможность сконструировать цикл, условие которого будет проверяться в произвольном месте тела цикла. Если условие проверяется где - то в середине цикла, то часть тела цикла, стоящая до места проверки, гарантированно выполняется по меньшей мере один раз, а часть, стоящая после проверки, может не выполняться ни разу. В Object Pascal можно сконструировать настраиваемый цикл, создав сначала цикл с бесконечным числом итераций, а затем использовав встроенную процедуру Break для выхода из цикла в нужный момент. Этот метод не создаёт настоящий бесконечный цикл. Вашей задачей по - прежнему остаётся обеспечить завершение работы цикла. Этот метод только передаёт полномочия по проверке условия цикла и обеспечению выхода из него Вам, программисту. 3.2 Создание бесконечных циклов
11
Простейший путь создания бесконечного цикла, который Вы сможете использовать для конструирования настраиваемого цикла - использование стандартной циклической конструкции с таким условием, при котором цикл никогда не прекратит свою работу. Предупреждение. Не надо испытывать приведённые в этом разделе программные конструкции. Эти примеры создают действительно бесконечные циклы, результатом которых будет зависание компьютера. Прочтите этот раздел до конца перед тем, как пытаться запустить бесконечный цикл. Ниже приведены бесконечные циклы while и repeat (не пытайтесь их запускать Ваша машина зависнет!): while True do begin <Выполняемые операторы> end; repeat <Выполняемые операторы> until False; 3.3 Конструкция цикла с вызовом Break Только что показанные бесконечные циклы дают основу для создания гибких конструкций циклов с использованием процедуры Break. Приведём общий синтаксис создания произвольных настраиваемых циклов: while True do begin <Операторы до проверки условия> if УсловиеИстинно then Break; <Операторы после проверки условия> end; Пример: while True do begin GetNextClient; ComputeClientData; if Total>=Threshold then Break; ProcessClientData; PrintClientReport; end; Первые два оператора внутри приведённого выше цикла всегда выполняются как в цикле repeat. Последние же два оператора могут не выполниться ни разу - как в цикле while. Вы можете создать конструкцию цикла с Break, использовав бесконечные циклы while - do или repeat - until и введя в них проверку на завершение цикла. Если результат этой проверки равен True, то вызывается стандартная процедура Break, работа цикла оканчивается и управление передаётся первому оператору, стоящему после цикла. Условие выхода из цикла проверяется на каждой итерации. Операторы, стоящие перед проверкой условия выхода из цикла, обязательно выполнятся по меньшей мере один раз. Операторы, расположенные после проверки, могут не выполниться ни разу. 12
Таким образом, конструкция настраиваемого цикла совмещает в себе преимущества обоих циклов - и while - do, и repeat - until. 3.4 Пропуск итераций в цикле Object Pascal предоставляет ещё одно средство управления выполнением циклов - оператор Continue. Continue, как и Break - стандартная встроенная процедура. Внутри цикла можно разместить любое количество операторов Continue. При каждой встрече с оператором Continue программа пропускает все остальные операторы цикла, возвращается к началу цикла и, если соблюдается условие продолжения цикла, начинает следующую итерацию. Вызов оператора Continue обычно комбинируется с условным выражением if, проверяющим, надо ли пропускать остальные операторы цикла. Например, цикл while PageNumber‘Chicago’ then Continue; PrintClientReport; end; печатает сообщение о клиентах, проживающих в Чикаго, с помощью процедуры PrinClientReport, пропуская шаги по выводу информации о жителях других городов. Оператор Continue выполняется каждый раз, когда переменная ClientCity не равна ‘Chicago’. В каждом таком случае оператор PrintClientReport не выполняется.
4 Контрольные вопросы 1.Что неправильно в приведённом цикле? while (Total<Max) and (Sum<=Max)and(SumSum) do Statement2; 3. Какое минимальное число итераций может выполнить цикл while - do? 4. Какое минимальное число повторений может выполнить цикл repeat - until? 5. Какое максимальное число повторений может выполнить цикл for? 6. Может ли процедура Break применяться внутри обычного цикла (не бесконечного) ?
5 Дополнительные задания 1. Напишите в Delphi программу с основной формой, содержащей окно списка и кнопку Go. Когда пользователь щёлкнет на кнопке Go, программа должна заполнить 13
окно списка строками, состоящими из последовательных букв алфавита. Например, первые три строки должны быть ‘A’ , ‘B’, ‘C’. 2. Напишите на Delphi простую программу, считающую число строк в произвольном текстовом файле. 3. В программе просмотра файлов WHILE1 с обработчиком события OnClick для пункта меню Open (листинг 1) предусмотреть нумерацию выводимых строк, а строку с номером 2 не выводить, используя процедуру Continue. Ввод номера строки предусмотреть с главной формы. 4. В программе просмотра файлов WHILE1 с обработчиком события OnClick для команды меню Save As (листинг 2) предусмотреть выход из цикла for по процедуре Break в том случае, если очередная обрабатываемая строка начинается с символа ‘r’. Обеспечить ввод символа с главной формы программы.
7 Литература 1.Возневич Э. Delphi. Освой самостоятельно. - М.: Восточная Книжная Компания, 1996. - 736 с. 2. Рубенкинг Н. Программирование в Delphi для “чайников”. -К.: Диалектика, 1996. - 304 с. 3. Фаронов В. Delphi 6: учебный курс. – СПб.: Питер, 2002. – 512 с.
ИСПОЛЬЗОВАНИЕ ЦИКЛОВ В OBJECT PASCAL Методические указания Составитель Николай Михайлович Семёнов Подписано к печати Формат 60*84/16. Бумага писчая №2. Плоская печать. Усл. печ. л. . Уч. - изд. л. . Тираж экз. Заказ № . Бесплатно. Ротапринт ТПУ. 634034, Томск, пр. Ленина,30.
14