Практикум по программированию на языке DELPHI. Часть 1. Структурное программирование
Покупка
Новинка
Тематика:
Программирование в среде Delphi
Автор:
Осипов Валерий Павлович
Год издания: 2010
Кол-во страниц: 112
Дополнительно
Рассмотрены вопросы разработки программ на языке DELPHI для основных разделов процедурного программирования. Особое внимание уделено технологии разработки. По каждой теме практикума дана краткая справка об используемых языковых средствах, подробно описаны этапы разработки программ и приведены варианты индивидуальных заданий.
Для студентов младших курсов, а также для всех приступающих к изучению языка DELPHI.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 02.03.02: Фундаментальная информатика и информационные технологии
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Московский государственный технический университет имени Н.Э. Баумана В.П. Осипов ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ НА ЯЗЫКЕ DELPHI В двух частях Часть 1 Структурное программирование Рекомендовано Научно-методическим советом МГТУ им. Н.Э Баумана в качестве учебного пособия по курсам «Информатика» и «Практикум на ЭВМ» М о с к в а Издательство МГТУ им. Н.Э. Баумана 2 0 1 0
УДК 681.3.06(075.8) ББК 32.937-018.2 О-74 Рецензенты: С.Д. Панин, Ю.И. Терентьев О-74 Осипов В.П. Практикум по программированию на языке DELPHI : в 2 ч. Ч. 1 : Структурное программирование : учеб. пособие / В.П. Осипов. — М.: Изд-во МГТУ им. Н.Э. Баумана, 2010. — 111, [1] c. : ил. Рассмотрены вопросы разработки программ на языке DELPHI для основных разделов процедурного программирования. Особое внимание уделено технологии разработки. По каждой теме практикума дана краткая справка об используемых языковых средствах, подробно описаны этапы разработки программ и приведены варианты индивидуальных заданий. Для студентов младших курсов, а также для всех приступающих к изучению языка DELPHI. УДК 681.3.06(075.8) ББК 32.937-018.2 Учебное издание Осипов Валерий Павлович ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ НА ЯЗЫКЕ DELPHI Часть 1 Структурное программирование Редактор С.А. Серебрякова Корректор Е.В. Авалова Компьютерная верстка С.А. Серебряковой Подписано в печать 06.07.2010. Формат 60×84/16. Бумага офсетная. Усл. печ. л. 6,51. Изд. № 160. Тираж 50 экз. Заказ . Издательство МГТУ им. Н.Э. Баумана. Типография МГТУ им. Н.Э. Баумана. 105005, Москва, 2-я Бауманская ул., 5. © МГТУ им. Н.Э. Баумана, 2010 2
ПРЕДИСЛОВИЕ Практикум по программированию предназначен для изучения языка DELPHI на семинарах, лабораторных работах и для его самостоятельного освоения. Он является дополнением теоретического курса информатики, читаемого студентам 1-го курса специальности ИУ-10 МГТУ им. Н.Э. Баумана. Практикум состоит из двух частей: «Структурное программирование» и «Объектно-ориентированное программирование». В первой части практикума рассмотрены решения задач в рамках структурной технологии* разработки программ. В ней приведены сведения о базовых конструкциях языка, предопределенных типах, процедурах и функциях. Она состоит из 11 практикумов, каждый из которых посвящен определенной теме. Каждый практикум предваряется краткой справкой по теме, где в сжатой форме повторяются теоретические сведения лекционного материала. Продолжительность выполнения практикума примерно соответствует длительности лабораторной работы: двум академическим часам по 45 мин каждый. Задания первой части практикума выполняются в консольном режиме. Во второй части практикума будут рассмотрены алгоритмы обработки файлов и методы создания объектно-ориентированных программ на основе классов DELPHI. * В последнее время вместо слова «технология» все чаще употребляют термин «парадигма», подчеркивая тем самым сущность образца или примера, положенного в основу программы. 3
Практикум 1. ДВОИЧНОЕ ПРЕДСТАВЛЕНИЕ ЦЕЛЫХ ТИПОВ. МОЩНОСТЬ ТИПА. ФУНКЦИЯ ДВОИЧНОГО ПРЕДСТАВЛЕНИЯ БАЙТА Этот практикум является вводным. Его задача — подготовить студентов к эффективному освоению последующего материала. Элементарным носителем информации, ее «элементарной частицей», является бит — двоичный разряд. Бит может содержать только два значения, которые записываются как 0 или 1. Минимальной адресуемой, а потому и неделимой частицей информации, ее «атомом», является совокупность из восьми двоичных разрядов, которая и получила название байт. Следует еще раз подчеркнуть, что байт — «договорная» единица информации, зависящая от архитектуры компьютера, в то время как понятие «бит» отражает бинарную сущность нашего представления о реальном физическом мире. В памяти компьютера все данные хранятся в двоичном виде как последовательность битов, сгруппированных в байты. Данные каждого типа занимают вполне определенное число байтов, которое называется мощностью типа. Мощность типа не является фиксированной величиной, и зависит от операционной системы и архитектуры компьютера*. Например, данные типа longword занимают четыре байта, или 32 бита. Поскольку восприятие человеком последовательности из 32 нулей и единиц довольно затруднительно, вместо двоичной системы счисления используют шестнадцатеричную систему, которая упаковывает четыре двоичных разряда в одну шестнадцатеричную цифру. Эти четыре двоичных разряда, содержащиеся в одной шестнадцатеричной цифре, называют тетрадой. * Для обозначения совокупности архитектуры компьютера и операционной системы используется обобщающий термин «платформа». 4
Таким образом, в одном байте имеются две тетрады, которые можно представить двумя шестнадцатеричными цифрами. Чтобы показать месторасположение тетрады в байте, используются термины «младшая тетрада» и «старшая тетрада» для обозначения соответственно четырех младших и четырех старших битов. Ниже приведена таблица соответствия десятичных, двоичных чисел в пределах одного байта. Данные этой таблицы будут использоваться в последующих практикумах. Соответствие десятичных, двоичных и шестнадцатеричных чисел в пределах одного байта Десятичная форма Двоичная форма Шестнадцатеричная форма 0 0000 0 1 0001 1 2 0010 2 3 0011 3 4 0100 4 5 0101 5 6 0110 6 7 0111 7 8 1000 8 9 1001 9 10 1010 A 11 1011 B 12 1100 C 13 1101 D 14 1110 E 15 1111 F Существует довольно значительный круг задач, когда вывод двоичного представления данных просто необходим. Помимо чисто учебных задач, которые составляют предмет нашего рассмотрения, к ним относятся практически все задачи шифрования и передачи данных. Однако стандартная среда и язык DELPHI не имеют средств такого вывода. 5
Решением этой проблемы является создание функции двоичного вывода. Следует отметить, что эта функция в контексте темы практикума играет роль вспомогательного инструмента. Поскольку данный практикум является вводным, рекомендуется пользоваться готовым исходным кодом функции, который приведен ниже. Желающим самостоятельно разобраться с работой функции необходимо уяснить некоторые особенности ее алгоритма. Он основан на последовательном выполнении всего лишь двух операций: • логической операции поразрядного умножения and данного байта с константой, которая называется маской; • поразрядного сдвига вправо/влево shr/shl. Результат работы формируется как строка из восьми символов ‘0’ или ‘1’. Одинарные кавычки здесь являются средством языка и подчеркивают отличие символа числа от самого числа. Следует иметь в виду, что символы в строке нумеруются начиная с единицы слева направо, а биты в байте нумеруются от нуля справа налево, поэтому символ, соответствующий самому старшему биту, будет иметь номер 1. В приведенном ниже примере для простоты рассмотрена только половина байта, т. е. четыре бита. Например, для b = 1310 = 11012 обработку каждого бита можно записать «в столбик» из четырех операций поразрядного умножения с последующим анализом результата, при равенстве которого нулю соответствующий символ устанавливается в ‘0’, иначе — в ‘1’: 1101 and 0001 = 0001 не равно 0 → символ № 4 равен ‘1’ 1101 and 0010 = 0000 равно 0 → символ № 3 равен ‘0’ 1101 and 0100 = 0100 не равно 0 → символ № 2 равен ‘1’ 1101 and 1000 = 1000 не равно 0 → символ № 1 равен ‘1’ Выходная строка равна = ‘1101’ Второй операнд операции and и есть маска. Через маску мы «видим» только те биты b = 11012, которые в маске не равны нулю. Первая маска 0001 «видит» первый бит справа, вторая маска 0010 — второй бит справа и т. д. Возникает вопрос: как записывать маски, если непосредственно двоичное представление по правилам языка использовать нельзя? Можно, конечно, привести маску к десятичному числу, например 00102 = 210, но попробуйте для интереса вручную, без кальку 6
лятора, выполнить преобразование к десятичному числу двоичной константы 0110100101111010. Выходом из подобной ситуации является возможность использования шестнадцатеричных констант, которые легко получаются из двоичных, если вспомнить таблицу соответствия десятичных и шестнадцатеричных чисел хотя бы в пределах первых 15 чисел. Целочисленные переменные имеют мощность 1…8 байт. Следовательно, маска тоже будет иметь мощность до 8 байт и может быть записана с помощью 16 шестнадцатеричных цифр. По правилам языка DELPHI перед таким шестнадцатеричным представлением должен быть записан символ $. Например, константное выражение байта 01111010 в программе будет выглядеть как $7А. Далее приведены два варианта функции двоичного представления произвольного байта: первая — в простейшем виде, вторая — в компактном, завершенном виде. Простейший вариант с «поштучной» обработкой разрядов Function Binary(b : Byte) : string; Begin result:='12345678'; if (b and $01) <> 0 then result[8]:='1' else result[8]:='0'; if (b and $02) <> 0 then result[7]:='1' else result[7]:='0'; if (b and $04) <> 0 then result[6]:='1' else result[6]:='0'; if (b and $08) <> 0 then result[5]:='1' else result[5]:='0'; if (b and $10) <> 0 then result[4]:='1' else result[4]:='0'; if (b and $20) <> 0 then result[3]:='1' else result[3]:='0'; if (b and $40) <> 0 then result[2]:='1' else result[2]:='0'; if (b and $80) <> 0 then result[1]:='1' else result[1]:='0'; End; Прим ечани е. Строка result:='12345678'; лишь резервирует восемь символов под результат, а ее содержимое в данном случае выбрано из удобства. 7
Окончательный вариант с использованием цикла Function Binary(b : Byte) : string; Var i : integer; Begin result:='12345678'; for i:=1 to 8 do begin if (b and $80) <> 0 then result[i]:='1' else result[i]:='0'; b:=b shl 1; end; End; Прим ечани е. При сдвиге на один разряд влево операцией b:=b shl 1; входной байт будет «портиться» (теряется смысл информации, хранящейся в этом байте), но, поскольку перед формальным параметром b:Byte отсутствует модификатор Var, этот «испорченный» байт не попадет в вызывающую программу. Ниже в качестве примера рассмотрено решение типовой задачи практикума и приведено задание для самостоятельной работы. Поскольку этот практикум является вводным, этапы процесса разработки программы описаны максимально подробно. Задача 1.1 Определить мощность целочисленной переменной типа integer. Значение переменной задать с клавиатуры. Вывести значение переменной в десятичной и в двоичной формах. Найти эмпирическим путем максимальное значение переменной данного типа, не вызывающей переполнения разрядной сетки. Указание. Признаком переполнения является нарушение тождества введенного и выведенного значений или сообщение об ошибке ввода. Порядок выполнения Этап 1. Вызвать консольное приложение языка DELPHI и сохранить пустой проект в папке с осмысленным именем практикума, например Pract1. Имя файла проекта (по умолчанию Project1) и имя файла модуля (по умолчанию Unit1) при сохранении можно изменить, если в этом есть необходимость, на более осмысленные имена. В стартовой заготовке можно удалить только 8
пустые строки и строку приглашения ввода кода { TODO -oUser -cConsole Main : Insert code here }. Изменять заголовок программы и удалять остальные строки нельзя!!! В самом начале обучения программированию наибольшее число ошибок связано с нарушением структуры программы. Начинающим программистам настоятельно рекомендуется переписать названия операторов begin и end главного программного блока заглавными буквами BEGIN и END и далее их не менять. Наконец, в блоке программы необходимо разместить оператор readln, вызывающий задержку экрана, после чего проект следует сохранить и выполнить для проверки наличия ошибок. Если все сделано правильно, на экране монитора появится черное окно исполнения. При нажатии клавиши ввода это окно исчезнет и снова появится окно редактирования. Ниже показана стартовая заготовка с указанием (в виде комментариев к программному коду) мест, где должны располагаться раздел описаний процедур и функций и раздел описания переменных. Точно так же в дальнейшем будет показано месторасположение и других разделов описаний в структуре программы. Листинг 1.1. Стартовая заготовка program Project1; {$APPTYPE CONSOLE} uses SysUtils; { Здесь размещается раздел описания процедур и функций (для краткости P&F), в этой задаче исходный код Binary } { Здесь размещается раздел описания глобальных переменных программы (для краткости Var) } BEGIN readln; END. Этап 2. Задать код функции Binary. Код функции вводится в раздел описания процедур и функций полностью. После ввода следует сохранить проект и выполнить программу. При необходимости исправить ошибки. 9
Этап 3. Объявить глобальные переменные в разделе описания переменных. В данной программе используется всего одна глобальная переменная Var w : integer; Этап 4. Оформление ввода-вывода. Программа при запуске сначала выводит приглашение, после которого следует ввести значение и нажать клавишу ввода. Результатом работы программы являются мощность переменной типа integer и значение переменной в десятичной системе счисления, которое совпадает с введенным числом при отсутствии переполнения разрядной сетки. Признаками переполнения служит сообщение об ошибке ввода или нарушение тождества между значениями введенного и выведенного числа. В последнем случае сообщение не выдается, а само переполнение никак не обрабатывается и не контролируется. Листинг 1.2. Оформление ввода и десятичного вывода (с целью экономии места в листинге заголовок программы и разделы описаний, кроме Var, ниже не приводятся) Var w : integer; BEGIN write(' w='); readln(w); writeln(' size of integer=', sizeof(w), ' w=', w); readln; END. Прим ечани е. В процедурах вывода write/writeln текст, содержащийся в апострофах, выводится «как есть» и служит для пояснения. В процедуре ввода readln этого делать нельзя. Функция sizeof(w) возвращает число байтов (мощность типа), занимаемых переменной данного типа. В результате можно, например, узнать, что переменные типа integer занимают четыре байта. Этап 5. Вывод в двоичном виде четырехбайтовой переменной. Функция двоичного представления функции Binary обрабатывает за одно обращение только один байт, в то время как переменная типа integer состоит из четырех байтов, поэтому требуется четыре обращения, чтобы обработать все байты. При передаче фактического параметра большей мощности, чем мощность формального параметра, происходит выравнивание разрядов по правой границе разрядной сетки и двоичные разряды, не поместившиеся в разрядную 10