Жанр: Учеба
Техника программирования на турбо-С
...и
технологии имеют одну общую цель: они обеспечивают средства для
передачи пользователю предназначенной для него информации и для
ввода информации им.
Одна из наиболее простых проблем, с которой вы могли
сталкиваться в своей практике, заключается в организации ввода и
вывода алфавитно-цифровой информации. Вы можете использовать для
этой цели функции printf и scanf и этим ограничиться. Если ЭВМ
включает в свой состав консольный терминал с клавиатурой типа
пишущей машинки, то при этих условиях почти любое программное
обеспечение может считаться обеспеченным пользовательским
интерфейсом. Эта технология была применима по той причине, что
ЭВМ работали под управлением операторов, а пользователями
считались те, кто записывал данные на программных бланках, а
затем читал распечатки. Теперь же ПЭВМ стоит на столе
пользователя, поэтому для их эффективного взаимодействия
пользовательский интерфейс должен быть более сложным, чем ранее.
Поскольку сегодняшний пользователь ЭВМ обычно имеет
профессиональные интересы, выходящие за рамки программирования,
то пользовательский интерфейс должен стимулировать эти интересы,
а не сдерживать их.
В интерактивной системе в определенные моменты времени
программа выводит пользователю необходимую ему информацию и
запрашивает информацию у пользователя путем выдачи
соответствующей подсказки. Затем программа должна находиться в
состоянии ожидания, пока пользователь не введет всю необходимую
информацию. Если программа способна проверять на достоверность
введенную информацию, то после ввода данных пользователем она
может либо продолжить свое выполнение, либо выдать сообщение об
ошибке и ожидать ввода новых значений данных. Если пользователь
не понимает, что от него требуется, то он может запросить у
программы справочную информацию. Умная программа располагает
множеством полезных сообщений, которые выдаются пользователю,
если он запрашивает справочную информацию, и разъясняют ему, что
от него требуется.
Форматы ввода данных могут быть различными, поскольку
существует много различных классов данных. Эти классы данных
могут быть в общем случае разбиты на две категории: команды и
значения данных.
Команда может быть простой, как, например, нажатие одной из
функциональных клавиш, которая в системах текстовой обработки
обозначает переход к новому параграфу. Команда может быть
сложной, как, например, загадочный набор букв, цифр и символов,
что характерно для многих команд MS-DOS. Некоторые команды
запрашиваются программой, как, например, ввод ответов "Y" и
"N", когда ПЭВМ переспрашивает, действительно ли вы хотите
того, что вы от нее требуете. Другие команды вводятся по
инициативе пользователя, когда, например, вы просите систему
текстовой обработки сохранить документ в дисковом файле.
Программа на ПЭВМ не ожидает ввода именно этой команды, но,
тем не менее, принимает ее и выполняет то, что от нее требуется.
Иногда программа может выводить перечень допустимых команд, из
которого вы можете выбрать любую. Этот перечень называется меню.
Значения данных в свою очередь можно разделить на элементы
данных и текстовую информацию. Элементами данных являются данные
определенного формата и назначения. Это, например, значения даты,
имена, адреса, числовые значения, размер одежды, оттенки цвета.
Проверка достоверности вводимых данных для определенного элемента
данных может быть произведена по соответствию их формата, длины и
значения этому элементу данных. В противоположность этому
текстовая информация не имеет определенного формата, длины и
значения. Системы баз данных обычно манипулируют элементами
данных, а системы обработки текстовой информации -
соответственно текстовой информацией.
Интерактивная система должна обладать пользовательским
интерфейсом, который облегчает использование клавиатуры и экрана
для ввода данных различного типа, которые затем обрабатываются
программой. IBM PC имеет такую архитектуру видеосистемы и
клавиатуры, которая обеспечивает возможности для создания
пользовательских интерфейсов различного типа, что уже реализовано
во многих пакетах программ для IBM PC.
Есть различные способы отображения меню, выдачи
информационных сообщений, сообщений об ошибках и запросов на ввод
данных. Также существуют различные способы ввода текстовой
информации и значений данных, поступающих от пользователя. При
разработке языка взаимодействия с пользователем программист может
выбирать из существующего разнообразия способов. Выбор
инструментальных программных средств будет оказывать влияние на
конечный программный продукт. Использование инструментальных
программных средств, обеспечивающих эффективный ввод и
отображение данных, позволяет создавать эффективные программные
системы.
Одним из наиболее популярных в настоящее время способов
организации взаимодействия с пользователем является работа с
окнами. Окном называется, как правило, прямоугольная область на
экране дисплея с видимой границей, изображение в которой
формируется независимо от остальной части экрана. Окна
используются для всех типов взаимодействия с пользователем: для
отображения меню, в качестве областей для ввода значений данных
или текстовой информации, для вывода сообщений и справочной
информации по требованию пользователя.
Другим важным свойством интерактивных систем, существенно
определяющим их качество, является обеспечение для пользователя
возможности быстро переходить от одной задачи к другой без
утомительных выходов в операционную систему. В интегрированной
программной системе такого рода переходы зачастую обеспечиваются
операционной средой, в которой исполняется программа. Однако,
при увеличении числа независимых задач, для которых необходимо
обеспечить в асинхронном режиме быстрый переход от одной
задачи к другой, возможности однозадачной операционной системы
DOS для IBM PC могут быть превышены. Для обеспечения возможности
переключениязадач в этом случае должны использоваться
резидентные в памятипрограммы. Эти программы не обеспечивают
настоящего мультизадачного режима, но позволяют установить
удобный для пользователя режим использования некоторых утилит в
командной среде DOS.
Программы из этой книги образуют библиотеку программных
инструментальных средств, использующих окна для ввода текстовых и
числовых данных, выдачи справочной информации пользователю и
организации меню. Эти программы могут быть сделаны резидентными.
Программные модули библиотеки написаны для компилятора Турбо Си и
предназначены для использования программами, также написанными
для Турбо Си. Для того чтобы использовать программы из этой
книги, вы должны иметь общее представление о DOS и о тех
средствах, которые она предоставляет программисту. В книге
разбираются вопросы внутренней организации DOS, а также некоторые
из ее функций, обеспечивающие резидентность программ и по которым
нет документации. Отличным справочным руководством по программным
средствам DOS и ROM-BIOS является книга "Advanced MS-DOS" Рэя
Дункана (Microsoft Press, 1986). Данная же книга содержит только
сведения, необходимые для изложения вопросов, касающихся
предлагаемой программистам библиотеки. Дункан с иронией
представляет свою книгу, как нечто облегченное, но вы должны
отнестись к ней со всей серьезностью.
Программное обеспечение из этой книги может быть
представлено в виде шести уровней, как на рисунке 1.1. Уровни на
диаграмме располагаются сверху вниз, но изложение материала будет
соответствовать движению от нижних уровней к верхним.
--------------------¬
¦ ¦
Уровень 1 ¦ TSR - драйвер ¦
¦ ¦
L---------T----------
¦
¦
----------+----------¬
Уровень 2 ¦ ¦
¦ Загрузочный ¦
¦ модуль ¦
¦ ¦
L---------T-----------
¦
Уровень 3 ¦
---------------T---T-+-T---T----T---¬
¦ ¦ ¦ ¦ ¦ ¦ ¦
--+------------¬ ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ NOTEPAD ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ -----------+-+-¬ ¦ ¦ ¦ ¦ ¦
L-T-+ ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ TEST MOVE ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ -----------+-+-¬ ¦ ¦ ¦ ¦
¦ L-T-+ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ PROMOTE ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ -----------+-+-¬ ¦ ¦ ¦
¦ ¦ L-T-+ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ FAST TEST ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ -----------+-+-¬ ¦ ¦
¦ ¦ ¦ L-T-+ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ SAYINGS ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ -----------+--+¬ ¦
¦ ¦ ¦ ¦ L-T-+ ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ POETRY ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ -----------+--+-¬
¦ ¦ ¦ ¦ ¦ L-T-+ ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ORDENT ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦ L-------------T--
L---+---+---+---+---+------T---------
¦
Уровень 4 ---------------T------+------T--------------¬
-----+------¬ ------+-----¬ ------+------¬ ------+----¬
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ Справочник¦ ¦ Редактор ¦ ¦ Меню ¦ ¦ Ввод ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
L----T------- L-----T------ L------T------ L-----T-----
L--------------+---T----------+--------------
¦
-------------+------------¬
Уровень 5 ¦ ¦
¦ Функции управления ¦
¦ окнами ¦
¦ ¦
L------------T-------------
¦
-------------+-------------¬
Уровень 6 ¦ Функции управления ¦
¦ аппаратурой ¦
¦ IBM PC ¦
L---------------------------
Рисунок 1.1. Уровни программного обеспечения.
Уровень 6 представляет библиотеку функций нижнего уровня,
которые управляют определенными действиями IBM PC.
Уровень 5 представляет библиотеку функций для работы с
окнами, которые управляют размещением, отображением на экране и
сохранением в памяти экранных окон.
Уровень 4 объединяет функции, которые используют окна для
конкретных применений. Эти функции управляют
контекстно-чувствительными окнами со справочной информацией,
окнами редактирования текста, системами меню и окнами для ввода
данных по формату.
Уровень 3 соответствует прикладным программам и представлен
здесь примерами программ, иллюстрирующих применение библиотек
нижнего уровня.
Уровень 2 представляет собой управляющую программу, которая
связывает прикладные программы предыдущего уровня в единую
программу, управляемую с помощью меню. Эта программа может
работать как автономно, так и в качестве резидентной утилиты на
последующем уровне программного обеспечения.
Уровень 1 представляет драйвер TSR, который строит из
транзитных модулей программы, остающиеся резидентными после
завершения выполнения. В данном примере он используется для
объединения программ предыдущих уровней в единую резидентную
утилиту.
Перед тем как погрузиться в глубины программирования
модулей, резидентных в памяти и работающих с окнами, возможно,
вам захочется почитать что-нибудь по языку Си. Вы можете найти
интересующие вас сведения в данной книге. Раздел 2 содержит
краткое изложение истории языка Си и попытку объяснения, почему
же программисты так любят этот язык. Раздел 3 продолжает
рассмотрение компилятора Турбо Си, выбранного для изучения в
данной книге.
ГЛАВА 2
--------
Язык Си
-----------------------------------------------------------------
Любая книга по Си превозносит этот язык и рассказывает
историю его создания. Настоящий раздел следует этой традиции: в
нем приводится краткая хронология создания Си, описываются
фундаментальные особенности языка, рассказывается о достоинствах
Си как инструмента программирования, а также предпринимается
попытка объяснить, почему же он завоевал такое широкое признание
среди программистов. В конце раздела содержится список справочных
материалов для изучения языка Си.
Краткая история языка Си
-----------------------------------------------------------------
Язык Си был создан в начале 70-х годов Дэннисом Ритчи,
который работал в компании Bell Telephone Laboratories.
Родословная языка Си берет свое начало от языка Алгол и включает
в себя Паскаль и ПЛ/I.
Си был разработан как язык для программирования в новой по
тем временам операционной системе Unix. ОС Unix была написана на
языке ассемблера для ЭВМ PDP-7 и перенесена затем на PDP-11. На
язык Си оказал значительное влияние его предшественник, язык Би,
созданный Кэном Томпсоном, который в свою очередь является
последователем языка BCPL. Язык ВСРL был создан в 1969 г.
Мартином Ричардсом в рамках проекта "Комбинированный язык
программирования" в Кэмбриджском университете в Лондоне. Вскоре
Unix была переписана на языке Си, и в 1974 - 75 годах OC
Unix фирмы Bell Laboratories стала первым коммерческим
продуктом, реализующим идею о том, что операционная система
может быть успешно написана на языке высокого уровня, если этот
язык является достаточно мощным и гибким.
В 1978 г. Брайан Керниган и Дэннис Ритчи написали книгу
"Язык программирования Си" (издательство Prentice-Наll). Эта
работа, которая в своем кругу называлась "белой книгой" и "K & R"
в остальном мире, стала стандартом описания языка Си. На момент
создания "K & R" существовали компиляторы языка Си для ЭВМ
PDP-11, Interdata 8/32, Honeywell 6000 и IBM 370. В дальнейшем
этот список был продолжен.
В конце 70-х начали появляться трансляторы Си для микроЭВМ
на процессорах 8080 и Z80 с операционной системой СР/M. Скотт
Газери и Джим Гибсон разработали и пустили в продажу Тiny-C
("Крошечный Си") - интерпретатор, основанный на подмножестве
языка Си. Его интерактивная среда программирования очень похожа
на ту, что имеет чрезвычайно популярный транслятор Basic фирмы
Microsoft. В 1980 г. Рон Кэйн создал свой компилятор Small-C
("Малый Си") для ОС СР/М и микропроцессора 8080. Компилятор
Small-C, основанный на подмножестве языка Си, был написан на
самом Small-C. Проблема курицы и яйца была решена, когда Кэйн
создал первую версию компилятора на основе интерпретатора Тiny-C.
Затем Small-C методом раскрутки создал самого себя, когда Кэйн
вместе с другими, используя ранние версии компилятора, сделал
более совершенный компилятор. Small-C компилирует исходный модуль
на языке Си в модуль на языке ассемблера процессора 8080.
Следует отметить, что Кэйн предоставил свой компилятор и его
исходный текст в общественную собственность.
Примерно в это же время Лео Золман представил свой
компилятор BDS-C для СР/М, также основанный на подмножестве языка
Си. Достоинствами этого компилятора были высокая скорость и
возможность совместной компоновки перемещаемых объектных модулей
в загрузочном модуле.
Вскоре после BDS-C были созданы компиляторы, предназначенные
для СР/М и основанные на полном множестве языка Си. Это дало
импульс развитию программирования на Си для микроЭВМ. В 1981
г., в связи с созданием IBM PC, в мире микроЭВМ был сделан
значительный скачок вперед.
После появления IBM PC стали появляться и компиляторы Си для
этой ПЭВМ. Некоторые компиляторы были получены путем
преобразования соответствующих компиляторов для процессора 8080,
другие были разработаны специально для IBM PC. В настоящее
время на рынке представлены по меньшей мере семнадцать
компиляторов языка Си для IBM PC.
В 1983 г. Американский Институт Стандартов (ANSI)
сформировал Технический Комитет X3J11, устав которого
предусматривает создание стандарта языка Си. Стандартизация будет
распространяться не только на язык, но и на программную среду
компилятора, а также на библиотеку стандартных функций. В работе
комитета участвуют представители основных фирм - поставщиков
компиляторов Си, в том числе и для IBM PC, а также многие другие
светила из мира программирования на языке Си. Усилия комитета
X3J11 привлекли внимание средств массовой информации.
Предлагаемый стандарт был опубликован, для того чтобы все
заинтересованные стороны могли ознакомиться с ним и внести свои
предложения. (Сомнительно, что выдающийся программист
заинтересуется языком, который создан комитетом, но, видимо,
комитет делает хорошее дело, совершенствуя язык, созданный
выдающимся программистом).
Поскольку большинство поставщиков компиляторов для IBM PC
участвуют в работе комитета X3J11, то разрабатываемые ими новые
версии компиляторов будут в рамках этого стандарта. (Турбо Си,
один из последних компиляторов для IBM PC, подчиняется
большинству требований стандарта на язык и библиотеку).
Особенности языка Си
-----------------------------------------------------------------
В данной книге не ставится цель научить вас программировать
на языке Си, но она может быть полезной для понимания тех
особенностей Си, которые заставляют столь многих программистов
остановить свой выбор именно на этом языке.
Си является языком функций, типов данных, операторов
присваивания и управления последовательностью вычислений.
Программируя на Си, вы осуществляете обращение к функциям, и
большинство функций возвращают некоторые значения. Значение,
возвращаемое функцией, будь то значение переменной или константа,
может использоваться в операторе присваивания, который изменяет
значение другой переменной. Дополненный операторами управления
последовательностью вычислений (while, for, do, switch), Си
превращается в язык высокого уровня, способствующий хорошему
стилю программирования.
Си имеет небольшой набор типов данных: целые числа, числа с
плавающей запятой, битовые поля и перечислимый тип. В языке Си вы
можете описать переменную типа указатель, который связывается с
объектом, принадлежащим к любому типу данных. Адресная арифметика
языка Си является чувствительной к типу данных того объекта, с
которым связан используемый указатель. Разрешены также указатели
к функциям. Вы можете расширить список типов данных путем
создания структур с иерархической зависимостью входящих в него
типов данных. Каждый тип данных может принадлежать либо к
основному типу, либо к ранее описанному структурному типу.
Объединения напоминают структуры, но определяют различные виды
иерархических зависимостей, в которых данные разных типов
располагаются в памяти.
Допустимо описание массивов данных различных типов, включая
структуры и объединения. Массивы могут быть многомерными.
Функции Си являются рекурсивными по умолчанию. Вы можете,
правда, создать функцию, которая не будет рекурсивной, но сам
язык по своей природе стремится поддерживать рекурсивность и
требует минимальных усилий при программировании рекурсий.
Программа функции на языке Си разбивается на блоки, в каждом
из которых могут быть определены свои собственные локальные
переменные. Блоки могут выбираться для исполнения по результату
выполнения оператора управления последовательностью
вычислений. Блоки могут быть вложенными друг в друга.
Переменные и функции могут быть глобальными для программы,
глобальными для исходного модуля или локальными для блока, в
котором они описаны. Локальные переменные могут быть описаны
таким образом, что они будут сохранять свои значения при всех
обращениях внутри данного блока (статические переменные) или
же будут восприниматься как новые объекты при каждом обращении
(автоматические переменные).
Си позволяет создавать программу в виде нескольких исходных
модулей, которые будут транслироваться независимо. Перемещаемые
объектные модули, соответствующие исходным модулям, компонуются в
единый загрузочный модуль. Эта особенность позволяет компилятору
поддерживать объектные библиотеки многократно используемых
функций и создавать большие программы из множества небольших
исходных модулей.
В языке Си нет операторов ввода/вывода, весь ввод/вывод
выполняется с помощью функций. Вследствие этой особенности языка
Си разработана стандартная библиотека функций. Существование
этого стандарта и составляет главную привлекательность языка Си,
ибо делает программы на Си переносимыми.
Достоинства языка Си
-----------------------------------------------------------------
Переносимость программ, написанных на Си, является наиболее
разрекламированным преимуществом этого языка. Если вы пишете
программу на Си и избегаете при этом использовать расширения
библиотеки, зависящие от конкретного компилятора, или
машинно-зависимые операции, то вы получаете неплохие шансы
(значительно большие, чем при любом другом языке) на успешный
перенос вашей программы в другую программно-аппаратную среду,
включая смену компилятора, операционной системы и ЭВМ.
Приведенные в данной книге программы не претендуют на
переносимость. Библиотека функций для работы с окнами привязана к
архитектуре видеопамяти IBM PC, а функции резидентных в памяти
утилит используют систему прерываний IBM PC, специфические
особенности DOS и библиотеку расширений компилятора Турбо Си,
которая облегчает разработку программ обработки прерываний.
Некоторые функции включают небольшие фрагменты на языке
ассемблера.
Расширяемость языков программирования означает существование
потенциальной возможности внести добавления в язык. Си рассчитан
на расширение по своему замыслу, поскольку содержит очень
небольшое число операторов. Следует помнить, что сам язык
позволяет немногим более, чем изменять значения переменных и
управлять последовательностью выполнения программы. Самое важное
в программах на Си заключено в функциях, а язык сам по себе не
имеет другие внутренние функции, кроме основной функции (функции
main). Первая группа расширений языка Си размещается в
стандартной библиотеке, другие нестандартные расширения
поддерживает конкретный компилятор и, наконец, третья группа
расширений содержится в дополнительных библиотеках функций Си
(как это описано в данной книге). Последняя группа расширений
разрабатывается самим программистом, который создает программы
для многократного использования.
Кроме своей функциональной расширяемости, Си позволяет
расширять стандартный набор типов данных путем определения
структур, объединений и использования операторов typedef.
Программистам особенно нравится краткость выражений,
которыми в Си кодируются алгоритмы. Большинство операторов, будь
то операторы присваивания, условные операторы, обращения к
функциям или выражения, кроме операторов управления
последовательностью выполнения программы, возвращают некоторые
значения. Использование этой особенности языка позволяет
представлять выражения в краткой форме.
Си обеспечивает формирование эффективного машинного кода
программы, что достигается привязкой языков программирования к
структуре памяти и регистровой архитектуре ЭВМ, для которых они
создаются. Си часто характеризуется как переносимый язык
ассемблера высокого уровня. Сама природа языка позволяет
компилятору генерировать эффективный оптимизированный машинный
код.
Одобрение языка Си
----------------------------------------------------------------
Не должно оставаться сомнений по поводу преимуществ языка Си
по сравнению с другими языками программирования. Программисты
любят Си по причинам, указанным выше. Компании по разработке
программного обеспечения любят его за то, что он позволяет
писать программы, не зависящие от конкретной аппаратуры и
операционной системы. Современные менеджеры, многие из которых в
прошлом программисты, учитывают оба этих преимущества. Си
является языком, на котором написано большинство наиболее
популярных в мире пакетов программ.
Рекомендуемая литература по Си
-----------------------------------------------------------------
Ниже приводится список литературы по Си, которая может
помочь больше узнать о языке и способах его использования:
Брайан В., Керниган, Ритчи Деннис М.. Язык программирования
Си. - Prentiсе-Hall, 1978.
Плам Томас. Стандарты и руководящие принципы
программирования на Си. - Plum-Hall, 1982.
Плам Томас. Изучение программирования на Си. - Pluм Hall,
1983.
Кочан Стефен Г. Программирование на Си. - Hayden Book
Сомраny, 1983.
Пардам Джек. Руководство по программированию на Си. - Que
Corporation, 1983.
Харбисон Самюэл, Сти
...Поділитися у соцмережах