ПЕРСПЕКТИВНЫЕ ИССЛЕДОВАНИЯ В ОБЛАСТИ КОМПЬЮТЕРНОГО ОБУЧЕНИЯ
Современные исследования в области применения компьютеров в обучении развиваются, в основном, в рамках нескольких основных направлений, которые можно обозначить следующим образом:
1) интеллектуальные обучающие системы;
2) учебные мультимедиа и гипермедиа;
3) учебные среды, микромиры и моделирование;
4) использование компьютерных сетей в образовании;
5) новые технологии для обучения конкретным дисциплинам.
Остановимся на некоторых из этих направлений подробнее
Интеллектуальные обучающие системы. Наиболее перспективным направлением развития систем компьютерного обучения является технология искусственного интеллекта (ИИ). Системы, использующие методику ИИ, называют интеллектуальными обучающими системами (ИОС). ИОС реализует адаптивное и двухстороннее взаимодействие, направленное на эффективную передачу знаний Под адаптивностью понимается то, что система дает пояснения, подходящие каждому обучаемому, с помощью динамического управления, зависящего от процесса обучения Двустороннее взаимодействие - это взаимодействие со смешанной инициативой, при которой обучаемый может задать вопросы или просить систему решить задачу. ИОС отличаются друг от друга прежде всего методологиями представлений знаний о предметной области, об обучаемом и о процессе обучения.
Наиболее перспективным путем развития ИОС является, по-видимому, путь создания самообучающихся систем, приобретающих знания в диалоге с человеком. Общая архитектура системы совместного обучения человека и компьютера может определяться следующими компонентами;
• микромир;
• учащийся-человек;
• учащийся-компьютер;
• интерфейс между двумя учащимися и микромиром;
• интерфейс между двумя учащимися.
В основе разработки компьютерного «соученика» в центре внимания должно быть соотношение между управлением и коммуникацией Прототипом такого рода системы можно считать MEMOLAB - обучающую среду с искусственным интеллектом по методологии экспериментальной психологии и человеческой памяти.
Другое направление развития систем искусственного интеллекта - распределенные системы, связывающие два и более компьютеров так, что ученики могут обучаться, сотрудничая или соревнуясь, каждый на своем компьютере В этом случае возникает некое подобие «классного» обучения, но на совершенно ином уровне.
Эксперименты и оценки показывают, что такое обучение оказывается более эффективным и интересным, чем обучение в одиночку.
Недостатком многих существующих ИОС является ориентация на специальные знания в рамках определенного предмета, так что в них не предусмотрена возможность простой адаптации к другой предметной области. Более общий подход состоит в развитии интеллектуального окружения (оболочки), из которого затем можно получить много ИОС путем наполнения различным содержанием, как баз знаний. Пример такой системы - EEPS, обучающая среда для решения задач, обеспечивающая обучение решению задач в качественных областях науки.
Система реализует модель преподавания, основанную на трех режимах:
• режим вопросов (обучаемый расспрашивает компьютер, с целью получения ответов на задачи и их объяснений);
• режим исследования (решения задачи совместными усилиями обучаемого с компьютером, обучаемый поставляет требуемую информацию для решения задачи);
• режим решения (обучаемый решает задачу самостоятельно, получая минимальную помощь и советы компьютера).
Система диагностики представляет стратегию решения задач студентом в виде одного из следующих стилей:
• дефектный стиль (студент, зная материал, допускает одну или более концептуальных ошибок);
• стиль «вокруг да около» (студент пытается найти решение многими неверными путями, задает много не относящихся к делу вопросов);
• рефлексивный стиль (когда студент знает материал, но решает задачу постепенно, иногда проходя через множество промежуточных этапов);
• импульсивный стиль (когда студент спешит прийти к заключению без достаточных оснований);
• смешанный стиль - комбинация двух или более перечисленных выше стилей.
Основанные на знаниях модели обучаемых могут быть построены с использованием различных видов дифференциального анализа, когнитивной диагностики.
В современных интеллектуальных обучающих системах, в основном, используются знания о качественных (количественных) аспектах процесса обучения. Однако, необходимо учитывать и мотивашюнную сторону обучения.
Мотивационные аспекты обучения можно классифицировать в соответствии с такими явлениями, как соревновательность, заинтересованность, самоконтроль, уверенность и удовлетворение.
Обучающая система должна
• определять мотивацнонное состояние обучаемого;
• реагировать с целью мотивации рассеянных, менее уверенных или недовольных учеников или поддержки уже мотивированных учеников. Примеры мотивационной тактики:
•если менее вверенный ученик правильно решает задачу, система может предложить ему подобную задачу для закрепления;
• внимание рассеянных или неактивных обучаемых может быть привлечено неожиданными эффектами или вводными комментариями;
• интерес может быть повышен головоломками, вопросами или знакомством с новыми темами.
Учебная мультимедиа и гипермедиа представляет собой развитие технологии программированного обучения, хотя упор делается не на адаптивность обучения и его методическое обоснование, а на внешнюю иллюстративно-наглядную сторону. Современные графические и звуковые возможности компьютера, а также возможность комплексирования его в качестве управляющего устройства с системами учебного телевидения, обусловили появление средств гипер- и мультимедиа. Научные исследования в данной области связаны с разработкой технологий создания учебных курсов большего размера на основе возможностей мульти- и гипермедиа. Под управлением компьютера система мультисред может производить в едином представлении объединение текста, графики, звуков, видео-образов и мультипликации. Технология мультимедиа в последнее время широко применяется для создания электронных книг (и учебников).
Развитием идей мультимедиа являются технологии компьютерной виртуальной реальности. В этом случае с помощью специальных экранов, датчиков, шлемов, перчаток и т.п. полностью моделируется управление, например, самолетом, так что у обучаемого возникает полная иллюзия того, что он находится в кабине самолета и им управляет.
Таковы основные направления исследований в области компьютерного обучения и основные подходы в компьютерном обучении.
Ситуация, сложившаяся в области компьютерного обучения, является парадоксальной: несмотря на активно и в различных направлениях ведущиеся поиски, обилие результатов, зреет ощущение необходимости кардинальных изменений концепции обучения, глубинного изменения подхода к компьютерному обучению. В первую очередь, требуется разработка адекватной теории компьютерного обучения, новых методов представлений знаний и моделирования процесса обучения и поведения обучаемого.
Компьютерное обучение остается очень интересной и перспективной областью исследований, привлекающей передовых ученых, педагогов и методистов всего мира. С внедрением компьютерного обучения стали меняться стили и устоявшиеся подходы к обучению, стала быстро меняться сама эта традиционная сфера человеческой деятельности. Трудно переоценить значение и влияние этих изменений на судьбы человеческой цивилизации в целом.
Контрольные вопросы и задания
1. Разработайте модель знания по школьному разделу «действия с дробями», используя модульный принцип.
2. Разработайте тест на знание таблицы умножения чисел от 0 до 100.
3. Используя какую-либо инструментальную тестовую оболочку, разработайте компьютерный тест по тестовым заданиям курса информатики, описанным в настоящей главе.
Дополнительная литература к главе 6
1. Балыко Г. Г., Пугач В. И., Фиишан Л. И. Управление школой и базы данных. -Самара: СГПИ, 1992.
2. Берещанский Д. Г. Практическое программирование на dBASE. - М.: Финансы
и статистика.1989.
3.Герман О. В.
Введение в теорию экспертных систем и обработку знаний: -Минск: «Дизайн-ПРО», 1995.
3. Глушков В М. Основы безбумажной информатики / Изд. 2-е. - М.: Наука, 1987.
4. А.Каратыгин С., Тихонов А , Долголаптев В. Базы данных: простейшие средства обработки информации, электронные таблицы, системы управления базами данных. В 2-х томах. - М.: ABF.1995.
5. Коновалова Н. В., Капралов Е.Г. Введение в ГИС. - Петрозаводск: Петрозаводский госуниверситет, 1995.
6. Крамм Р.
Системы управления базами данных dBASE II и dBASE III для персональных компьютеров. - М.: Финансы и статистика, 1988.
7. САПР. Системы автоматизированного проектирования / Под ред. И.П.Норенкова. - Минск: Высшая школа, 1987.
8. Свириденко С. С.
Современные информационные технологии. - М.: Радио и связь, 1989.
9. Советов Б Я.
АСУ. Введение в специальность. - М.: Высшая школа, 1989.
10. Советов Б.Я.
Информационная технология. - М.: Высшая школа, 1992.
11. Фурунжиев P.M., Гугля В. А. САПР, или как ЭВМ помогает конструктору. -Минск: Высшая школа, 1987.
12. Электронная почта в системе MS-DOS. Официальное руководство компании Редком.-М., 1995.
13. Журнал «Информатика и образование», с 1992 г.
14. Журнал «Педагогическая информатика», с 1994 г.
ПОДПРОГРАММЫ
В Бейсике предусмотрена работа с подпрограммами, если необходимо использовать многократно сходные действия, или для блочно-структ\рпрованного построения программы. Для организации подпрограмм используют две команды: GOSUB <номер строки> - перейти на подпрограмм: RETURN - возврат.
Во многих версиях Бейсика предусмотрен переключатель подпрограмм ON k GOSUB 100,200,300. Здесь k может принимать значения 1.2.3, что соответствует обращению к одной из трех подпрограмм, начинающихся с номеров 100. 200, 300.
Начнем с примера, аналогичного одному из тех, которые сопровождали рассказ о процедурах Паскаля выше.
Программа 72 (см. программу 17).
10 ' ****** квадратные корни и логарифмы*********************
15 CLS / 20 " а » 35: с$ = "-"
30 GOSUB 1000 40 PRINT : PRINT "Таблица квадратных корней"
50 GOSUB 1000
55 PRINT
60 FOR x = 1 TO 10
70 PRINT USING "x = ##» sqr(x) = t».#»#<"; x; SQR(x) :
80 NEXT x
90 GOSUB 1000
100 PRINT : PRINT "Таблица логарифмов" ;
110 GOSUB 1000 120 PRINT
130 FOR x = 1 TO 5 140 PRINT USING "x = ««» log(x) = »».»»»»"; X; LOG(x)
150 NEXT x
:60 с$ = "*" 170 GOSUB 1000 180 END
1000 FOR i = 1 TO a : PRINT c$ : NEXT i
1010 RETURN
Обратим внимание на существенно иной механизм передачи параметров в подпрограмму на Бейсике, нежели в паскалевскую процедуру. Формирование входных параметров производится с помощью присваиваний до обращения к процедуре. Это гораздо менее удобно, чем использование формальных и фактических параметров в Паскале.
Приведем еще несколько примеров работы с подпрограммами.
Программа 73
'*********** меню графиков функций ***********
10 CLS : PRINT : PRINT
20 PRINT " ГРАФИКИ ФУНКЦИЙ"
30 PRINT
40 PRINT ". Синус"
50 PRINT ". Косинус"
60 PRINT ". Тангенс"
70 PRINT : PRINT
80 INPUT "введи номер"; j
90 SCREEN 2
100 LINE (200, 0) - -(200, 200) : LINE (0, 100) - (400, 100)
110 PSET (0, 0), 4
120 FOR x = - 4 TO 4 STEP 1/32
130 ON j GOSUB 500, 600, 700
140 PSET (200 + 32 * x, 100 - 32 * у)
150 NEXT x
160 r$ = INPUT$(1)
170 IF r$ = "К" OR r$ = "к" THEN END ELSE SCREEN 0: GOTO 10
500 у = SIN(x) : RETURN
600 у = COS(x) : RETURN
700 у = TAN(x) : RETURN
Подпрограммы, к которым обращаются по GOSUB, сильно уступают истинным процедурам Паскаля, поскольку у них отсутствуют возможности локализации переменных, нет формальных параметров, которые можно замещать при обращении фактическими. Однако, в более поздних версиях (например в Qbasic) предусмотрены подпрограммные единицы SUB - подпрограммы-процедуры и FUNCTION - подпрограммы-функции. В следующем примере использована подпрограмма решения квадратного уравнения SUB kvur(a,b,c) со списком входных данных. В основной программе можно объявить подпрограмму оператором DECLARE, а вызвать ее с помощью команды CALL.
Программа 74
5 ' ********** пример работу с подпрограммой ********
10 DECLARE SUB kvur (а!, Ь!, с!)
20 INPUT "введи а, Ь, с"; а, Ь, с 30 CALL kvur (a, Ь, с)
40 END SUB kvur (a, b, c)
1000 d.=b*b-4*a*c
1010 IF d < 0 THEN PRINT "корней нет": GOTO 1050
1020 xl = (- b + SQR(d)) / 2 / a
1030 x2 = (- b - SQR(d)) / 2 / a
1040 PRINT ="; xl, ="; x2
1050 END SUB
ПОКОЛЕНИЯ ЭВМ
В истории вычислительной техники существует своеобразная периодизация ЭВМ по поколениям. В ее основу первоначально был положен физико-технологический принцип: машину относят к тому или иному поколению в зависимости от используемых в ней физических элементов или технологии их изготовления. Границы поколений во времени размыты, так как в одно и то же время выпускались машины совершенно разного уровня. Когда приводят даты, относящиеся к поколениям, то скорее всего имеют в виду период промышленного производства; проектирование велось существенно раньше, а встретить в эксплуатации весьма экзотические устройства можно и сегодня.
В настоящее время физико-технологический принцип не является единственным при определении принадлежности той или иной ЭВМ к поколению. Следует считаться и с уровнем программного обеспечения, с быстродействием, другими факторами, основные из которых сведены в прилагаемую табл. 4.1.
Следует понимать, что разделение ЭВМ по поколениям весьма относительно. Первые ЭВМ, выпускавшиеся до начала 50-х годов, были «штучными» изделиями, на которых отрабатывались основные принципы; нет особых оснований относить их к какому-либо поколению. Нет единодушия и при определении признаков пятого поколения. В середине 80-х годов считалось, что основной признак этого (будущего) поколения - полновесная реализация принципов искусственного интеллекта. Эта задача оказалась значительно сложнее, чем виделось в то время, и ряд специалистов снижают планку требований к этому этапу (и даже утверждают, что он уже состоялся). В истории науки есть аналоги этого явления: так, после успешного запуска первых атомных электростанций в середине 50-х годов ученые объявили, что запуск многократно более мощных, дающих дешевую энергию, экологически безопасных термоядерных станций, вот-вот произойдет; однако, они недооценили гигантские трудности на этом пути,
так как термоядерных электростанций нет и по сей день.
В то же время среди машин четвертого поколения разница чрезвычайно велика, и поэтому в табл. 4.1 соответствующая колонка разделена на на две: А и Б.
Указанные в верхней строчке даты соответствуют первым годам выпуска ЭВМ. Многие понятия, отраженные в таблице, будут обсуждаться в последующих разделах учебника; здесь ограничимся кратким комментарием.
Чем младше поколение, тем отчетливее классификационные признаки. ЭВМ первого, второго и третьего поколений сегодня, в конце 90-х годов - в лучшем случае музейные экспонаты. Машина первого поколения - десятки стоек, каждая размером с большой книжный шкаф, наполненных электронными лампами, лентопротяжными устройствами, громоздкие печатающие агрегаты, и все это на площади сотни квадратных метров, со специальными системами охлаждения, источниками питания, постоянно гудящее и вибрирующее (почти как в цехе машиностроительного завода). Обслуживание - ежечасное. Часто выходящие из строя узлы, перегорающие лампы, и вместе с тем невиданные, волшебные возможности для тех, кто, например, занят математическим моделированием. Быстродействие до 1000 оп/с и память на 1000 чисел делало доступным решение задач, к которым раньше нельзя было и подступиться.
Приход полупроводниковой техники (первый транзистор был создан в 1948 г., а первая ЭВМ с их использованием - в 1956 г.) резко изменил вид машинного зала -более нормальный температурный режим, меньший гул (лишь от внешних устройств) и, самое главное, возросшие возможности для пользователя. Впрочем, непосредственного пользователя к машинам первых трех поколений почти никогда
Таблица 4.
Поколения ЭВМ
Показатель |
Поколения ЭВМ |
|||||
Первое 1951-1954 |
Второе 1958-I960 |
Третье 1965-1966 |
Четвертое |
Пятое ? |
||
А 1976-1979 |
Б 1985-? |
|||||
Элементная база процессора |
Электронные лампы |
Транзисторы |
Интграль-ные схемы (ИС) |
Большие ИС (БИС) |
СвербольшиеИС (СБИС) |
+Оптоэлек-троника +Криоэлек-троника |
Элементная база ОЗУ |
Электронно-лучевые трубки |
Феррито-вые сердечники |
Ферритовые сердечники |
БИС |
СБИС |
СБИС |
Максмальная емкость ОЗУ, байт |
102 |
101 |
104 |
105 |
107 |
108 (?) |
Максимальное быстродействие процессора (оп/с) |
104 |
106 |
107 |
108 |
109 +Многопро-цессорность |
1012 , +Многопро-цессорность |
Языки программирования |
Машинный код |
+ Ассемблер |
+ Процедурные языки высокого уровня (ЯВУ) |
+ Новые процедурные ЯВУ |
+Непроце-дурные ЯВУ |
+ Новые непрцедур-ные ЯВУ |
Средства связи пользователя с ЭВМ |
Пульт управления и перфокарты |
Перфокарты и перфоленты |
Алфавитно- цифровой терминал |
Монохром- ный графиче- ский дисплей, клавиатура |
Цветной + графический дисплей, клавиатура, «мышь» и др. |
Устройства голосовой связи с ЭВМ |
не подпускали - около них колдовали инженеры, системные программисты и операторы, а пользователь чаще всего передавал в узкое окошечко или клал на стеллаж в соседнем помещении рулон перфоленты или колоду перфокарт, на которых была его программа и входные данные задачи. Доминировал для машин первого и второго поколении монопольный режим пользования машиной и/или режим пакетной обработки; в третьем поколении добавился более выгодный экономически и более удобный для пользователей удаленный доступ - работа через выносные терминалы в режиме разделения времени.
Уже начиная со второго поколения, машины стали делиться на большие, средние и малые по признакам размеров, стоимости, вычислительных возможностей. Так, небольшие отечественные машины второго поколения («Наири», «Раздан», «Мир» и др.) с производительностью порядка 104
оп/с были в конце 60-х годов вполне доступны каждому вузу, в то время как упомянутая выше БЭСМ-6 имела профессиональные показатели (и стоимость) на 2 - 3 порядка выше.
В начале 70-х годов, с появлением интегральных технологий в электронике, были созданы микроэлектронные устройства, содержащие несколько десятков транзисторов и резисторов на одной небольшой (площадью порядка 1 см2 ) кремниевой подложке. Без пайки и других привычных тогда в радиотехнике действий на них «выращивались» электронные схемы, выполняющие функции основных логических узлов ЭВМ (триггеры, сумматоры, дешифраторы, счетчики и т.д.). Это позволило перейти к третьему поколению ЭВМ. техническая база которого - интегральные схемы.
При продвижении от первого к третьему поколению радикально изменились возможности программирования. Написание программ в машинном коде для машин первого поколения (и чуть более простое на Ассемблере) для большей части машин второго поколения является занятием, с которым подавляющее большинство современных программистов знакомятся при обучении в вузе, а потом забывают. Появление процедурных языков высокого уровня и трансляторов с них было первым шагом на пути радикального расширения круга программистов.
Научные работники и инженеры сами стали писать программы для решения своих задач.
Уже в третьем поколении появились крупные унифицированные серии ЭВМ. Для больших и средних машин в США это прежде всею семейство IBM 360/370. В СССР 70-е и 80-е годы были временем создания унифицированных серии: ЕС (единая система) ЭВМ (крупные и средние машины), СМ (система малых) ЭВМ и «Электроника» (серия микро-ЭВМ). В их основу были положены американские прототипы фирм IBM и DEC (Digital Equipment Corporation). Были созданы и выпущены десятки моделей ЭВМ, различающиеся назначением и производительностью. Их выпуск был практически прекращен в начале 90-х годов, но многие из них еще используются в самых разных сферах деятельности, включая образование (например, компьютеры ДВК, БК, а также УКНЦ - аналоги мини-ЭВМ типа PDP-11 фирмы DEC).
Рис. 4.6. ЭВМ третьего поколения
ПОНЯТИЕ АЛГОРИТМИЧЕСКОГО ЯЗЫКА
Достаточно распространенным способом представления алгоритма является его запись на алгоритмическом языке, представляющем в общем случае систему обозначений и правил для единообразной и точной записи алгоритмов и исполнения их. Отметим, что между понятиями «алгоритмический язык» и «языки программирования» есть различие; прежде всего, под исполнителем в алгоритмическом языке может подразумеваться не только компьютер, но и устройство для работы «в обстановке». Программа, записанная на алгоритмическом языке, не обязательно предназначена компьютеру. Практическая же реализация алгоритмического языка -отдельный вопрос в каждом конкретном случае.
Как и каждый язык, алгоритмический язык имеет свой словарь. Основу этого словаря составляют слова, употребляемые для записи команд, входящих в систему команд исполнителя того или иного алгоритма. Такие команды называют простыми командами. В алгоритмическом языке используют слова, смысл и способ употребления которых задан раз и навсегда. Эти слова называют служебными. Использование служебных слов делает запись алгоритма более наглядной, а форму представления различных алгоритмов - единообразной.
Алгоритм, записанный на алгоритмическом языке, должен иметь название. Название желательно выбирать так, чтобы было ясно, решение какой задачи описывает данный алгоритм. Для выделения названия алгоритма перед ним записывают служебное слово АЛГ (АЛГоритм). За названием алгоритма (обычно с новой строки) записывают его команды. Для указания начала и конца алгоритма его команды заключают в пару служебных слов НАЧ (НАЧало) и КОН (КОНец). Команды записывают последовательно.
Последовательность записи алгоритма:
АЛГ название алгоритма
НАЧ
серия команд алгоритма
КОН
Например, алгоритм, определяющий движение исполнителя-робота, может иметь вид:
АЛГ в_склад
НАЧ
вперед
поворот на 90° направо
вперед
КОН
При построении новых алгоритмов могут использоваться алгоритмы, составленные ранее.
Алгоритмы, целиком используемые в составе других алгоритмов, называют вспомогательными алгоритмами. Вспомогательным может оказаться любой алгоритм из числа ранее составленных. Не исключается также, что вспомогательным в определенной ситуации может оказаться алгоритм, сам содержащий ссылку на вспомогательные алгоритмы.
Очень часто при составлении алгоритмов возникает необходимость использования в качестве вспомогательного одного и того же алгоритма, который к тому же может быть весьма сложным и громоздким. Было бы нерационально, начиная работу, каждый раз заново составлять и запоминать такой алгоритм для его последующего использования. Поэтому в практике широко используют, так называемые, встроенные (или стандартные) вспомогательные алгоритмы, т.е. такие алгоритмы, которые постоянно имеются в распоряжении исполнителя. Обращение к таким алгоритмам осуществляется так же, как и к «обычным» вспомогательным алгоритмам. У исполнителя-робота встроенным вспомогательным алгоритмом может быть перемещение в склад из любой точки рабочего поля; у исполнителя-язык программирования Бейсик это, например, встроенный алгоритм «SIN».
Алгоритм может содержать обращение к самому себе как вспомогательному и в этом случае его называют
рекурсивным. Если команда обращения алгоритма к самому себе находится в самом алгоритме, то такую рекурсию называют прямой. Возможны случаи, когда рекурсивный вызов данного алгоритма происходит из вспомогательного алгоритма, к которому в данном алгоритме имеется обращение. Такая рекурсия называется косвенной. Пример прямой рекурсии:
АЛГ движение
НАЧ
вперед
вперед
вправо
движение
КОН
Алгоритмы, при исполнении которых порядок следования команд определяется в зависимости от результатов проверки некоторых условий, называют разветвляющимися. Для их описания в алгоритмическом языке используют специальную составную команду - команда ветвления. Она соответствует блок-схеме «альтернатива» и также может иметь полную или сокращенную форму.
Применительно к исполнителю- роботу условием может быть проверка нахождения робота у края рабочего поля (край/не_край); проверка наличия объекта в текущей клетке (есть/нет) и некоторые другие:
ЕСЛИ условие ЕСЛИ условие ЕСЛИ край
ТО серия 1 ТО серия ТО вправо
ИНАЧЕ серия2 ВСЕ ИНАЧЕ вперед
ВСЕ ВСЕ
Ниже приводится запись на алгоритмическом языке команды выбора (см. рис. 1.14, б), являющейся развитием команды ветвления:
ВЫБОР
ПРИ условие 1: серия 1
ПРИ условие 2: серия 2
…
ПРИ условие N: серия N
ИНАЧЕ серия N+1
ВСЕ
Алгоритмы, при исполнении которых отдельные команды или серии команд выполняются неоднократно, называют циклическими. Для организации циклических алгоритмов в алгоритмическом языке используют специальную составную команду цикла. Она соответствует блок-схемам типа «итерация» и может принимать следующий вид:
ПОКА условие НЦ
НЦ серия
Серия ДО условие
КЦ КЦ
В случае составления алгоритмов работы с величинами можно рассмотреть и другие возможные алгоритмические конструкции, например, цикл с параметром или выбор. Подробно эти конструкции будут рассматриваться при знакомстве с реальными языками программирования.
В заключение данного параграфа приведем алгоритм, составленный для исполнителя-робота, по которому робот переносит все объекты со склада в левый нижний угол рабочего поля (поле может иметь произвольные размеры):
АЛГ перенос АЛГ в_угол3 АЛГ до_края
НАЧ НАЧ НАЧ
в_угол3 до_края ПОКА не_край
ЕСЛИ есть вправо НЦ
ТО до_края вперед
взять вправо КЦ
в_угол3 КОН КОН
установить
перенос
ИНАЧЕ
в_угол3
ВСЕ
КОН
ПОНЯТИЕ ФАЙЛОВОЙ СИСТЕМЫ
При наличии большого числа программ и данных необходим строгий их учет и систематизация. Операционным системам приходится работать с различными потоками данных, разными аппаратными и периферийными устройствами компьютера. Организовать упорядоченное управление всеми этими объектами позволяет файловая система.
На операционные системы персональных компьютеров наложила глубокий отпечаток концепция файловой системы, лежащей в основе операционной системы UNIX. В ОС UNIX подсистема ввода-вывода унифицирует способ доступа как к файлам, так и к периферийным устройствам. Под файлом при этом понимают набор данных на диске, терминале или каком-либо другом устройстве. Таким образом, файловая система - это система управления данными.
Файловые системы операционных систем создают для пользователей некоторое виртуальное представление внешних запоминающих устройств ЭВМ, позволяя работать с ними не на низком уровне команд управления физическими устройствами (например, обращаться к диску с учетом особенностей его адресации), а на высоком уровне наборов и структур данных. Файловая система скрывает от программистов картину реального расположения информации во внешней памяти, обеспечивает независимость программ от особенностей конкретной конфигурации ЭВМ, или, как еще говорят, логический уровень работы с файлами. Файловая система также обеспечивает стандартные реакции на ошибки, возникающие при обмене данными. Пользователь, работая в контексте определенного языка программирования, обычно использует файлы как поименованные совокупности данных, хранимые во внешней памяти и имеющие определенную структуру. При работе с файлами пользователю предоставляются средства для создания новых файлов, операции по считыванию и записи информации и т.д., не затрагивающие конкретные вопросы программирования работы канала по пересылке данных, по управлению внешними устройствами.
Наиболее распространенным видом файлов, внутренняя структура которых обеспечивается файловыми системами различных ОС, являются файлы с последовательной структурой.
Такого рода файлы можно рассматривать как набор составных элементов, называемых логическими записями (или блоками), длина которых может быть как фиксированной, так и переменной, и доступ к которым - последовательный, т.е. для обработки (считывания или записи) i-й записи должна быть обработана предыдущая (i-1)-я запись.
В ряде файловых систем предусматривается использование более сложных логических структур файлов, чем последовательная. Например, записи в файле могут образовывать древовидные структуры, может использоваться индексно-последовательная организация файлов (с упорядочением записей по значению некоторых полей) или, так называемая, библиотечная структура файлов, использующая уровень учетной информации (каталога), облегчающей поиск и доступ к отдельным компонентам файлов. На физическом уровне блоки файла (обычно размером 256 или 512 байт) могут размещаться в памяти непрерывной областью или храниться несмежно. Первый способ хранения файлов, реализованный, например, в ОС РАФОС, приводит к затруднениям при изменении размеров файлов (т.е. к необходимости перезаписи файлов, если их длина увеличивается, или хранения «дыр», если длина уменьшается).
Наиболее развитый механизм несмежного распределения блоков файлов реализован в операционной системе UNIX, в которой размеры файлов могут динамически изменяться в пределах 1 Гбайта. Каждый файл в системе имеет дескриптор, в составе которого хранится список, содержащий 13 номеров блоков на диске и используемый для адресации к тем блокам, которые входят в состав файла. Первые десять элементов списка непосредственно указывают на десять блоков, в которых размещаются данные файла. В одиннадцатом элементе списка указан номер блока, хранящий список из 128 номеров блоков данных, которые принадлежат файлу (это первый уровень косвенной адресации). Двенадцатый элемент ссылается на блок, который содержит список из 128 номеров блоков первого уровня косвенной адресации (это второй уровень косвенной адресации). С помощью тринадцатого элемента указывается ссылка на блок, содержащий список из 128 номеров блоков второго уровня косвенной адресации.
Роль учетного механизма, позволяющего обслуживать десятки и сотни файлов, в файловой системе очень важна. Общим приемом является сведение учетной информации о расположении файлов на магнитном диске в одно место - его каталог (директорий). Каталог представляет собой список элементов, каждый из которых описывает характеристики конкретного файла, используемые для организации доступа к этому файлу - имя файла, его тип, местоположение на диске и длину файла. В простых операционных системах (например ОС РАФОС) местоположение единственного каталога на магнитном диске (дискете) и его размер фиксированы. В более сложных системах каталог может находиться в любом месте диска, но на него должна иметься ссылка в, так называемой, метке тома, находящейся в фиксированном месте и формируемой при инициализации диска. Более того, каталогов может быть большое число и они могут быть логически связаны в какие-либо информационные структуры. Так, наиболее развитая многоуровневая файловая система UNIX поддерживает иерархическую (древовидную) систему каталогов (рис.2.2). Каждый пользователь может работать в составе этой структуры со своей системой каталогов (со своим поддеревом). Полное имя файла в данной структуре задает путь переходов между каталогами в логической структуре каталогов.
Рис. 2.2. Иерархическая система каталогов
Файл обладает уникальным идентификатором (именем), обеспечивающим доступ к файлу. Идентификатор включает в себя собственно имя - буквенно-цифровое обозначение файла, которое может содержать специальные символы (подчеркивание, дефис, ! и т.д.), и расширение имени файла (обычно отделяемое от имени файла точкой). Если имена создаваемых файлов пользователь может задавать произвольно, то в использовании расширений следует придерживаться традиции, согласно которой расширение указывает на тип файла, характер его содержимого. Например, в операционной системе MS-DOS файлы с расширениями
.com |
- исполняемые |
.ехе |
|
.bat |
|
.txt |
- текстовые |
.doc |
|
.pas .bas .с |
- тексты программ на известных языках программирования: Паскаль, Бейсик, Си, Фортран, соответственно |
.for |
- файл базы данных. |
.dbf |
Известны десятки стандартных расширений, используемых при работе с различными программными системами.
В различных ОС существуют определенные ограничения на длину имени и расширения имени файла. Так, в MS-DOS длина имени файла не должна превышать восьми символов, а расширение - трех. В ОС UNIX ограничения значительно менее жесткие.
Имена директорией, начиная от корневого, образующие путь к файлу, отделяемые при записи друг от друга косой чертой (\ в DOS, / в UNIX), также как и обозначение диска, относятся к идентификатору файла. Например, в MS-DOS
d:\lang\pascal\work\example.pas
есть файл с именем example и расширением pas, указывающем на то, что это текст программы на Паскале, полный путь к которому:
d:- диск d;
\lang\pascal\work - это структура вложенных директорией, в самом внутреннем
из которых находится необходимый файл example.pas.
Каждый каталог рассматривается как файл, имеет собственное имя. Продвижение по дереву при поиске некоторого каталога или файла возможно как вниз по дереву от текущего узла, так и вверх в направлении к корню. В каждом каталоге хранится список имен файлов, а также ссылки на дескрипторы файлов. В дескрипторах сосредоточена подробная информация о файле (список номеров блоков, занимаемых файлом, метод доступа к файлу, дата создания файла, идентификатор владельца, тип файла). В процессе работы могут создаваться новые каталоги и вписываться в требуемое место иерархии.
Файловая система ОС обеспечивает основные операции над файлами: их открытие (что сопровождается копированием учетной информации о файле, обеспечивающей быстрый доступ к нему, в некоторую структуру данных, расположенную в оперативной памяти, подготовкой буферов и каналов для передачи информации), копирование, перемещение, объединение, удаление, закрытие. Вторую группу представляют операции чтения и записи составных элементов файла. Особая группа операций обеспечивает печать содержимого каталогов или файлов, управление правами доступа к файлам, поиска файлов и т.д.
Развитые многопользовательские файловые системы обеспечивают также защиту и разделение данных, хранящихся в файлах, при работе с ними разных пользователей. Так, например, после входа в систему UNIX (который производится по паролю) пользователь получает доступ к ряду системных, групповых и личных каталогов и файлов. Каждый файл и каталог имеет владельца. Обычно это пользователь, создавший их. Владелец может затем назначить тип защиты файла от трех категорий пользователей:
• владельца (самого себя);
• представителей той же группы пользователей, что и владелец (понятие группы полезно при совместной работе над какими-либо проектами);
• всех остальных пользователей системы.
Каждый файл (каталог) имеет три вида разрешения на доступ:
• чтение (г - read) - можно просматривать содержимое файла (каталога);
•запись (w - write) - можно менять содержимое файла (создавать или удалять файлы в каталоге);
• выполнение (х - execute) - можно использовать файл как команду UNIX.
Комбинация видов доступа к файлу записывается последовательностью 9 символов:
Отсутствие права доступа обозначается минусом. Например: rwxr-x--x - файл может быть просмотрен, изменен и запущен на выполнение владельцем, просмотрен и выполнен членами группы, к которой относится владелец, и выполнен всеми остальными пользователями системы.
ПОНЯТИЕ ИНФОРМАЦИОННОЙ СИСТЕМЫ
Базы данных - важнейшая составная часть информационных систем. Здесь мы ограничимся лишь кратчайшими общими сведениями об информационных системах, сосредоточив внимание на базах данных как таковых.
Информационные системы предназначены для хранения и обработки больших объемов информации. Изначально такие системы существовали в письменном виде. Для этого использовались различные картотеки, папки, журналы, библиотечные каталоги и т.д. Любая информационная система должна выполнять три основные функции: ввод данных, запросы по данным, составление отчетов.
Ввод данных.
Система должна предоставлять возможность накапливания и упорядочивания данных. Необходимо обеспечить просмотр этих данных, внесение в них изменений и дополнений с тем, чтобы поддерживать актуальность информации.
Запросы по данным.
В системе должна существовать возможность находить и просматривать отдельные части накопленной информации.
Составление отчетов. Время от времени возникает необходимость обобщать и анализировать большую группу данных (или даже все данные) информационной системы, представляя ее в виде документа.
Обслуживание информационных систем, реализованных в письменном (бумажном) виде, сопряжено со многими трудностями: чем больше информационная система, тем больше бумаги (карточек) и места требуется для их хранения (в этом можно убедиться на примере библиотеки); много времени тратится на поиск нужной информации. Сложности возникают при обновлении, анализе и обработке данных.
Предположим мы хотим собрать информацию про альбомы музыкальных групп. Пусть имеется информация о некоторых альбомах: 1965, Led Zeppelin 4, Lp, Help!, Atlantic, 1971. Lp(England), EMI. 1970, Flash Gordon, Parlophone, 1980, Led Zeppelin 3, Soundtrack, Lp, Atlantic. Этот список мало о чем говорит. Извлечь какую-либо информацию из этого набора данных практически невозможно.
Представим данные в виде табл. 2.2.
Таблица 2.2 Информация об альбомах музыкальных групп
Название альбома | Год выпуска | Тип | Фирма альбома | ||||
Help! | 1965 | Lp (England) | Parlophone | ||||
Led Zeppelin 4 | 1971 | Lp | Atlantic | ||||
Led Zeppelin 3 | 1970 | Lp | Atlantic | ||||
Flash Gordon | 1980 | Soundtrack | EMI |
Теперь воспринимать и использовать информацию стало гораздо удобнее. Представленная таблица является информационной моделью. Объектами, отраженными в этой модели, являются музыкальные альбомы (групп), причем все данные взаимосвязаны.
ПОНЯТИЕ ИСПОЛНИТЕЛЯ АЛГОРИТМА
Понятие исполнителя невозможно определить с помощью какой-либо формализации. Исполнителем может быть человек, группа людей, робот, станок, компьютер, язык программирования и т.д. Важнейшим свойством, характеризующим любого из этих исполнителей, является то, что исполнитель умеет выполнять некоторые команды. Так, исполнитель-человек умеет выполнять такие команды как «встать», «сесть», «включить компьютер» и т.д., а исполнитель-язык программирования Бейсик - команды PRINT, END, LIST и другие аналогичные. Вся совокупность команд, которые данный исполнитель умеет выполнять, называется системой команд исполнителя (СКИ).
В качестве примера (рис. 1.11) рассмотрим исполнителя-робота, работа которого состоит в собственном перемещении по рабочему полю (квадрату произвольного размера, разделенному на клетки) и перемещении объектов, в начальный момент времени находящихся на «складе» (правая верхняя клетка).
Рис. 1.11. Исполнитель-робот
Одно из принципиальных обстоятельств состоит в том, что исполнитель не вникает в смысл того, что он делает, но получает необходимый результат. В таком случае говорят, что исполнитель действует формально, т. е. отвлекается от содержания поставленной задачи и только строго выполняет некоторые правила, инструкции.
Это - важная особенность алгоритмов. Наличие алгоритма формализует процесс решения задачи, исключает рассуждение исполнителя. Использование алгоритма дает возможность решать задачу формально, механически исполняя команды алгоритма в указанной последовательности. Целесообразность предусматриваемых алгоритмом действий обеспечивается точным анализом со стороны того, кто составляет этот алгоритм.
Введение в рассмотрение понятия «исполнитель» позволяет определить алгоритм как понятное и точное предписание исполнителю совершить последовательность действий, направленных на достижение поставленной цели. В случае исполнителя-робота мы имеем пример алгоритма «в обстановке», характеризующегося отсутствием каких-либо величин. Наиболее же распространенными и привычными являются алгоритмы работы с величинами - числовыми, символьными, логическими и т.д.
ПОНЯТИЕ О ЯЗЫКАХ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ
Языки программирования - это формальные языки специально созданные для общения человека с компьютером. Каждый язык программирования, равно как и «естественный» язык (русский, английский и т.д.), имеет алфавит, словарный запас, свои грамматику и синтаксис, а также семантику.
Алфавит - фиксированный для данного языка набор основных символов, допускаемых для составления текста программы на этом языке.
Синтаксис - система правил, определяющих допустимые конструкции языка программирования из букв алфавита.
Семантика - система правил однозначного толкования отдельных языковых конструкций, позволяющих воспроизвести процесс обработки данных.
При описании языка и его применении используют понятия языка. Понятие подразумевает некоторую синтаксическую конструкцию и определяемые ею свойства программных объектов или процесса обработки данных.
Взаимодействие синтаксических и семантических правил определяют те или иные понятия языка, например, операторы, идентификаторы, переменные, функции и процедуры, модули и т.д. В отличие от естественных языков правила грамматики и семантики для языков программирования, как и для всех формальных языков, должны быть явно, однозначно и четко сформулированы.
Языки программирования, имитирующие естественные языки, обладающие укрупненными командами, ориентированными на решение прикладных содержательных задач, называют языками «высокого уровня». В настоящее время насчитывается несколько сотен таких языков, а если считать и их диалекты, то это число возрастет до нескольких тысяч. Языки программирования высокого уровня существенно отличаются от машинно-ориентированных (низкого уровня) языков. Во-первых, машинная программа в конечном счете записывается с помощью лишь двух символов 0 и 1. Во-вторых, каждая ЭВМ имеет ограниченный набор машинных операций, ориентированных на структуру процессора. Как правило, этот набор состоит из сравнительно небольшого числа простейших операций, типа: переслать число в ячейку; считать число из ячейки; увеличить содержимое ячейки на +1 и т.п.
Команда на машинном языке содержит очень ограниченный объем информации, поэтому она обычно определяет простейший обмен содержимого ячеек памяти, элементарные арифметические и логические операции. Команда содержит код и адреса ячеек, с содержимым которой выполняется закодированное действие.
Языки программирования высокого уровня имеют следующие достоинства:
• алфавит языка значительно шире машинного, что делает его гораздо более выразительным и существенно повышает наглядность и понятность текста;
• набор операций, допустимых для использования, не зависит от набора машинных операций, а выбирается из соображений удобства формулирования алгоритмов решения задач определенного класса;
• конструкции команд (операторов) отражают содержательные виды обработки данных и задаются в удобном для человека виде;
• используется аппарат переменных и действия с ними;
• поддерживается широкий набор типов данных.
Таким образом, языки программирования высокого уровня являются машинно-независимыми и требуют использования соответствующих программ-переводчиков (трансляторов) для представления программы на языке машины, на которой она будет исполняться.
ПОНЯТИЕ О ТЕОРЕМАХ ШЕННОНА
Ранее отмечалось, что при передаче сообщений по каналам связи могут возникать помехи, способные привести к искажению принимаемых знаков. Так, например, если вы попытаетесь в ветреную погоду передать речевое сообщению человеку, находящемуся от вас на значительном расстоянии, то оно может быть сильно искажено такой помехой, как ветер. Вообще, передача сообщений при наличии помех является серьезной теоретической и практической задачей. Ее значимость возрастает в связи с повсеместным внедрением компьютерных телекоммуникаций, в которых помехи неизбежны. При работе с кодированной информацией, искажаемой помехами, можно выделить следующие основные проблемы: установления самого факта того, что произошло искажение информации; выяснения того, в каком конкретно месте передаваемого текста это произошло; исправления ошибки, хотя бы с некоторой степенью достоверности.
Помехи в передачи информации - вполне обычное дело во всех сферах профессиональной деятельности и в быту. Один из примеров был приведен выше, другие примеры - разговор по телефону, в трубке которого «трещит», вождение автомобиля в тумане и т.д. Чаще всего человек вполне справляется с каждой из указанных выше задач, хотя и не всегда отдает себе отчет, как он это делает (т.е. неалгоритмически, а исходя из каких-то ассоциативных связей). Известно, что естественный язык обладает большой избыточностью (в европейских языках - до 7%), чем объясняется большая помехоустойчивость сообщений, составленных из знаков алфавитов таких языков. Примером, иллюстрирующим устойчивость русского языка к помехам, может служить предложение «в словох всо глосноо зомононо боквой о». Здесь 26% символов «поражены», однако это не приводит к потере смысла. Таким образом, в данном случае избыточность является полезным свойством.
Избыточность могла бы быть использована и при передаче кодированных сообщений в технических системах. Например, каждый фрагмент текста («предложение») передается трижды, и верным считается та пара фрагментов, которая полностью совпала.
Однако, большая избыточность приводит к большим временным затратам при передаче информации и требует большого объема памяти при ее хранении. Впервые теоретическое исследование эффективного кодирования предпринял К.Шеннон.
Первая теорема
Шеннона декларирует возможность создания системы эффективного кодирования дискретных сообщений, у которой среднее число двоичных символов на один символ сообщения асимптотически стремится к энтропии источника сообщений (в отсутствии помех).
Задача эффективного кодирования описывается триадой:
Х = {X 4i} - кодирующее устройство - В.
Здесь X, В -
соответственно входной и выходной алфавит. Под множеством хi можно понимать любые знаки (буквы, слова, предложения). В -
множество, число элементов которого в случае кодирования знаков числами определяется основанием системы счисления (например, т = 2). Кодирующее устройство сопоставляет каждому сообщению хi из Х кодовую комбинацию, составленную из пi символов множества В. Ограничением данной задачи является отсутствие помех. Требуется оценить минимальную среднюю длину кодовой комбинации.
Для решения данной задачи должна быть известна вероятность Рi
появления сообщения хi,
которому соответствует определенное количество символов пi алфавита В. Тогда математическое ожидание количества символов из В определится следующим образом:
n cр = пiРi (средняя величина).
Этому среднему числу символов алфавита В соответствует максимальная энтропия Нтаx = nср
log т. Для обеспечения передачи информации, содержащейся в сообщениях Х
кодовыми комбинациями из В,
должно выполняться условие H4mах ? Н(х), или пcр
log т ? - Рi log Рi.
В этом случае закодированное сообщение имеет избыточность пcр ? H(x) / log т, nmin = H(x) / log т.
Коэффициент избыточности
Кu = (Hmax – H(x)) / Hmax = (ncp – nmin) / ncp
Выпишем эти значения в виде табл. 1.8. Имеем:
Nmin = H(x) / log2
= 2,85, Ku = (2,92 - 2,85) / 2,92 = 0,024,
ПОСТАНОВКА ПРОБЛЕМЫ
Понятие алгоритма, введенное в предыдущем параграфе, можно назвать понятием алгоритма в интуитивном смысле. Оно имеет нечеткий, неформальный характер, ссылается на некоторые точно не определенные, но интуитивно понятные вещи. Например, при определении и обсуждении свойств алгоритма мы исходили из возможностей некоторого исполнителя алгоритма. Его наличие предполагалось, но ничего определенного о нем не было известно. Говоря языком математики, ни аксиоматического, ни исчерпывающего конструктивного определения исполнителя мы так и не дали.
Установленные в предыдущем параграфе свойства алгоритмов следует называть эмпирическими. Они выявлены на основе обобщения свойств алгоритмов различной природы и имеют прикладной характер. Этих свойств достаточно для практического программирования, для создания обширного круга программ для компьютеров, станков с ЧПУ, промышленных роботов и т.д. Однако, как фундаментальное научное понятие алгоритм требует более обстоятельного изучения. Оно невозможно без уточнения понятия «алгоритм», более строгого его описания или, как еще говорят, без его формализации.
Известно несколько подходов к формализации понятия «алгоритм»:
• теория конечных и бесконечных автоматов;
• теория вычислимых (рекурсивных) функций;
• ?-исчисление Черча.
Все эти возникшие исторически независимо друг от друга подходы оказались впоследствии эквивалентными. Главная цель формализации понятия алгоритма такова: подойти к решению проблемы алгоритмической разрешимости различных математических задач, т.е. ответить на вопрос, может ли быть построен алгоритм, приводящий к решению задачи. Мы рассмотрим постановку этой проблемы и некоторые результаты теории алгоритмической разрешимости задач, но вначале обсудим формализацию понятия алгоритма в теории автоматов на примере машин Поста, Тьюринга, а также нормальных алгоритмов Маркова, а затем - основы теории рекурсивных функций. Идеи ?-исчислений Черча реализованы в языке программирования LISP (глава 3).
Вместе с тем, формально определенный любым из известных способов алгоритм не может в практическом программировании заменить то, что мы называли алгоритмами в предыдущем параграфе. Основная причина состоит в том, что формальное определение резко сужает круг рассматриваемых задач, делая многие практически важные задачи недоступными для рассмотрения.
ПОЗИЦИОННЫЕ СИСТЕМЫ СЧИСЛЕНИЯ
Система счисления - принятый способ записи чисел и сопоставления этим записям реальных значений. Все системы счисления можно разделить на два класса: позиционные и непозиционные. Для записи чисел в различных системах счисления используется некоторое количество отличных друг от друга знаков. Число таких знаков в позиционной системе счисления называется основанием системы счисления. Ниже приведена табл. 1.4, содержащая наименования некоторых позиционных систем счисления и перечень знаков (цифр), из которых образуются в них числа.
Таблица 1.4. Некоторые системы счисления
Основание | Система счисления | Знаки | |||
2 | Двоичная | 0,1 | |||
3 | Троичная | 0,1.2 | |||
4 | Четвертичная | 0,1,2,3 | |||
5 | Пятиричная | 0,1,2,3,4 | |||
8 | Восьмиричная | 0,1,2,3,4,5,6,7 | |||
10 | Десятичная | 0,1,2,3,4,5,6,7,8,9 | |||
12 | Двенадцатиричная | 0,1,2,3,4,5,б,7,8,9,А,В | |||
16 | Шестнадцатиричная | 0,1,2,3,4,5,6,7,8,9,A.B,D,E,F |
В позиционной системе счисления число может быть представлено в виде суммы произведений коэффициентов на степени основания системы счисления:
AnAn-1An-2
… A1,A0,A-1,A-2 =
АnВn
+ An-1Bn-1 + ... + A1B1
+ А0В0 + A-1B-1 + А-2В-2 + ...
(знак «точка» отделяет целую часть числа от дробной; знак «звездочка» здесь и ниже используется для обозначения операции умножения). Таким образом, значение каждого знака в числе зависит от позиции, которую занимает знак в записи числа. Именно поэтому такие системы счисления называют позиционными. Примеры (десятичный индекс внизу указывает основание системы счисления):
23,43(10) = 2*101 + З*10° + 4*10-1 + З*10-2
(в данном примере знак «З» в одном случае означает число единиц, а в другом - число сотых долей единицы);
692(10) = 6* 102 + 9*101 + 2.
(«Шестьсот девяносто два» с формальной точки зрения представляется в виде «шесть умножить на десять в степени два, плюс девять умножить на десять в степени один, плюс два»).
1101(2)= 1*23 + 1*22+0*21+ 1*2°;
112(3) = l*32+ 1*31 +2*3°;
341,5(8) =3*82+ 4*81 +1*8° +5*8-1;
A1F4(16) = A*162 + 1*161 + F*16° + 4*16-1.
При работе с компьютерами приходится параллельно использовать несколько позиционных систем счисления (чаще всего двоичную, десятичную и шестнадцатиричную), поэтому большое практическое значение имеют процедуры перевода чисел из одной системы счисления в другую. Заметим,
что во всех приведенных выше примерах результат является десятичным числом, и, таким образом, способ перевода чисел из любой позиционной системы счисления в десятичную уже продемонстрирован.
Чтобы перевести целую часть числа из десятичной системы в систему с основанием В,
необходимо разделить ее на В.
Остаток даст младший разряд числа. Полученное при этом частное необходимо вновь разделить на В - остаток даст следующий разряд числа и т.д. Для перевода дробной части ее необходимо умножить на В. Целая часть полученного произведения будет первым (после запятой, отделяющей целую часть от дробной) знаком. Дробную же часть произведения необходимо вновь умножить на В. Целая часть полученного числа будет следующим знаком и т.д.
Отметим, что кроме рассмотренных выше позиционных систем счисления существуют такие, в которых значение знака не зависит от того места, которое он занимает в числе. Такие системы счисления называются непозиционными. Наиболее известным примером непозиционной системы является римская. В этой системе используется 7 знаков (I, V, X, L, С, D, М), которые соответствуют следующим величинам:
1(1) V(5) X(10) L(50) С (100) D(500) M(1000)
Примеры: III (три), LIX (пятьдесят девять), DLV (пятьсот пятьдесят пять).
Недостатком непозиционных систем, из-за которых они представляют лишь исторический интерес, является отсутствие формальных правил записи чисел и, соответственно, арифметических действий над ними (хотя по традиции римскими числами часто пользуются при нумерации глав в книгах, веков в истории и др.).
ПРАВОВЫЕ АСПЕКТЫ ИНФОРМАТИКИ
Деятельность программистов и других специалистов, работающих в сфере информатики, все чаще выступает в качестве объекта правового регулирования. Некоторые действия при этом могут быть квалифицированы как правонарушения (преступления).
Правовое сознание в целом, а в области информатики особенно, в нашем обществе находится на низком уровне. Все ли знают ответы на следующие вопросы:
• можно ли, не копируя купленную программу, предоставить возможность пользоваться ею другому лицу;
• кому принадлежит авторское право на программу, созданную студентом в ходе выполнения дипломной работы;
• можно ли скопировать купленную программу для себя самого, чтобы иметь резервную копию;
• можно ли декомпилировать программу, чтобы разобраться в ее деталях или исправить ошибки;
• в чем состоит разница между авторским и имущественным правом.
Вопросов, подобных этим, возникает множество. Есть, конечно, такие, ответы на которые очевидны: нельзя создавать вирусы, нельзя хулиганить в сетях, нельзя в некоммерческих телеконференциях запускать коммерческую информацию, нельзя вскрывать и искажать защищенную информацию в чужих базах данных и т.д., т.е. совершать поступки, которые могут быть объектом уголовного преследования. Но на многие вопросы ответы отнюдь не очевидны, а иногда казуистически запутаны, причем не только в нашей стране. Остановимся на правовом регулировании в области информатики в России более подробно.
Необходимо отметить, что регулирование в сфере, связанной с защитой информации, программированием и т.д., является для российского законодательства принципиально новым, еще слабо разработанным направлением. К 1992 году был принят Закон Российской Федерации «О ПРАВОВОЙ ОХРАНЕ ПРОГРАММ ДЛЯ ЭЛЕКТРОННЫХ ВЫЧИСЛИТЕЛЬНЫХ МАШИН И БАЗ ДАННЫХ», содержащий обширный план приведения российского законодательства в сфере информатики в соответствие с мировой практикой. Действие этого Закона распространяется на отношения, связанные с созданием и использованием программ для ЭВМ и баз данных.
Также предусматривалось внести изменения и дополнения в Гражданский кодекс РФ, в Уголовный кодекс РФ, другие законодательные акты, связанные с вопросами правовой охраны программ для электронных вычислительных машин и баз данных, привести решения Правительства РФ в соответствие с Законом, обеспечить пересмотр и отмену государственными ведомствами и другими организациями РФ их нормативных актов, противоречащих указанному Закону, обеспечить принятие нормативных актов в соответствии с указанным Законом и т.д.
Главное содержание данного Закона - юридическое определение понятий, связанных с авторством и распространением компьютерных программ и баз данных, таких как Авторство, Адаптация, База данных, Воспроизведение, Декомпилирование. Использование, Модификация и т.д., а также установление прав, возникающих при создании программ и баз данных - авторских, имущественных, на передачу, защиту, регистрацию, неприкосновенность и т.д.
Авторское право
распространяется на любые программы для ЭВМ и базы данных (как выпущенные, так и не выпущенные в свет), представленные в объективной форме, независимо от их материального носителя, назначения и достоинства. Авторское право распространяется на программы для ЭВМ и базы данных, являющиеся результатом творческой деятельности автора. Творческий характер деятельности автора предполагается до тех пор, пока не доказано обратное.
Предоставляемая настоящим Законом правовая охрана распространяется на все виды программ для ЭВМ (в том числе на операционные системы и программные комплексы), которые могут быть выражены на любом языке и в любой форме, и на базы данных, представляющие собой результат творческого труда по подбору и организации данных. Предоставляемая правовая охрана не распространяется на идеи и принципы, лежащие в основе программы для ЭВМ и базы данных или какого-либо их элемента, в том числе идеи и принципы организации интерфейса и алгоритма, а также языки программирования.
Авторское право на программы для ЭВМ и базы данных возникает в силу их создания.
Для признания у.
осуществления авторского права на программы для ЭВМ и базы данных не требуется опубликования, регистрации или соблюдения иных формальностей. Авторское право на базу данных признается при условии соблюдения авторского права на каждое из произведений, включенных в базу данных.
Автором программы для ЭВМ и базы данных признается физическое лицо, в результате творческой деятельности которого они созданы.
Если программа для ЭВМ и база данных созданы совместной творческой деятельностью двух и более физических лиц, то, независимо от того, состоит ли программа для ЭВМ или база данных из частей, каждая из которых имеет самостоятельное значение, или является неделимой, каждое из этих лиц признается автором такой программы для ЭВМ и базы данных.
Автору программы для ЭВМ или базы данных или иному правообладателю принадлежит исключительное право осуществлять и (или) разрешать осуществление следующих действий:
• выпуск в свет программы для ЭВМ и базы данных;
• воспроизведение программы для ЭВМ и базы данных (полное или частичное) в любой форме, любыми способами;
• распространение программы для ЭВМ и баз данных;
• модификацию программы для ЭВМ и базы данных, в том числе перевод программы для ЭВМ и базы данных с одного языка на другой;
• иное использование программы для ЭВМ и базы данных.
Однако,
имущественные права на программы для ЭВМ и базы данных, созданные в порядке выполнения служебных обязанностей или по заданию работодателя, принадлежат работодателю, если в договоре между ним и автором не предусмотрено иное. Таким образом, имущественное право на программу, созданную в ходе дипломного проектирования, принадлежит не автору, а вузу - по крайней мере, пока между ними не будет заключено специальное соглашение.
Имущественные права на программу для ЭВМ и базу данных могут быть переданы полностью или частично другим физическим или юридическим лицам по договору. Договор заключается в письменной форме и должен устанавливать следующие существенные условия: объем и способы использования программы для ЭВМ или базы данных, порядок выплаты и размер вознаграждения, срок действия договора.
Лицо, правомерно владеющее экземпляром программы для ЭВМ или базы данных, вправе без получения дополнительного разрешения правообладателя осуществлять любые действия, связанные с функционированием программы для ЭВМ или базы данных в соответствии с их назначением, в том числе запись и хранение в памяти ЭВМ, а также исправление явных ошибок. Запись и хранение в памяти ЭВМ допускаются в отношении одной ЭВМ или одного пользователя в сети, если иное не предусмотрено договором с правообладателем. Также допускается без согласия правообладателя и без выплаты ему дополнительного вознаграждения осуществлять следующие действия:
• адаптацию программы для ЭВМ или базы данных;
• изготавливать или поручать изготовление копии программы для ЭВМ или базы данных при условии, что эт а копия предназначена только для архивных целей и при необходимости (в случае, когда оригинал программы для ЭВМ или базы данных утерян, уничтожен или стал непригодным для использования) для замены правомерно приобретенного экземпляра.
Лицо, правомерно владеющее экземпляром программы для ЭВМ, вправе без согласия правообладателя и без выплаты дополнительного вознаграждения выполнять декомпплирование
программы для ЭВМ с тем, чтобы изучить кодирование и структуру этой программы при следующих условиях:
•информация, необходимая для взаимодействия независимо разработанной данным лицом программы для ЭВМ с другими программами, недоступна из других источников;
• информация, полученная в результате этого декомпилирования, может использоваться лишь для организации взаимодействия независимо разработанной данным лицом программы для ЭВМ с другими программами, а не для составления новой программы для ЭВМ, по своему виду существенно схожей с декомпилируемой программой.
Свободная перепродажа
экземпляра программы для ЭВМ и базы данных допускается без согласия правообладателя и без выплаты ему дополнительного вознаграждения после первой продажи или другой передачи права собственности на этот экземпляр.
Выпуск под своим именем чужой программы для ЭВМ или базы данных, а также незаконное воспроизведение или распространение таких произведений влечет за собой уголовную ответственность.
В настоящее время уголовное законодательство РФ не в полной мере учитывает все возможные компьютерные преступления. Вообще же, в законодательной практике многих стран отмечены различные виды компьютерных преступлений и разработаны методы борьбы с ними.
Компьютерные преступления условно можно разделить на две большие категории:
1) преступления, связанные с вмешательством в работу компьютеров;
2) преступления, использующие компьютеры как необходимые технические средства.
Можно выделить следующие виды компьютерной преступности 1-го вида:
• несанкционированный доступ в компьютерные сети и системы, банки данных с целью шпионажа или диверсии (военного, промышленного, экономического), с целью, так называемого, компьютерного хищения или из хулиганских побуждений; ,
• ввод в программное обеспечение, так называемых, «логических бомб», срабатывающих при определенных условиях (логические бомбы, угрожающие уничтожением данных, могут использоваться для шантажа владельцев информационных систем или выполнять новые, не планировавшиеся владельцем программы, функции при сохранении работоспособности системы; известны случаи, когда программисты вводили в программы финансового учета команды, переводящие на счета этих программистов денежные суммы или скрывающие денежные суммы от учета, что позволяло незаконно получать их);
• разработку и распространение компьютерных вирусов;
• преступную небрежность в разработке, изготовлении и эксплуатации программно-вычислительных комплексов, приведшую к тяжким последствиям;
• подделку компьютерной информации (продукции) и сдачу заказчикам неработоспособных программ, подделку результатов выборов, референдумов;
•хищение компьютерной информации (нарушение авторского права и права владения программными средствами и базами данных).
Среди компьютерных преступлений 2-го вида, т.е. использующих компьютер как средство преступления, следует отметить преступления, спланированные на основе компьютерных моделей, например, в сфере бухгалтерского учета.
Для современного состояния правового регулирования сферы, связанной с информатикой, в России в настоящее время наиболее актуальными являются вопросы, связанные с нарушением авторских прав.Большая часть программного обеспечения, использующегося отдельными программистами и пользователями и целыми организациями, приобретена в результате незаконного копирования, т.е. хищения. Назрела потребность узаконить способы борьбы с этой порочной практикой, поскольку она мешает, прежде всего, развитию самой информатики.
ПРЕДИКАТ ОТСЕЧЕНИЯ И УПРАВЛЕНИЕ ЛОГИЧЕСКИМ ВЫВОДОМ В ПРОГРАММАХ
Управление процессом просмотра предложений является важным аспектом программирования на Прологе. Это осуществляется с помощью специальной встроенной функции «резать», обозначаемой символом "!".
Данная встроенная функция может быть использована для достижения следующих трех целей:
1) исключения бесконечной петли при выполнении программы;
2) программирования взаимоисключающих утверждений;
3) блокирования просмотра целей.
Продемонстрируем все три случая на примерах.
Пример 1.
Устранение бесконечных циклов. Обратимся к утверждениям, определяющим последовательность Фибоначчи (числовая последовательность 1, 1, 2, 3, 5, 8,..., в которой каждое число, начиная с третьего есть сумма двух предыдущих).
Программа 118
fib (0,_,1).
fib (1,1,1).
fib (N,G,H) : - fib ( N-l ,F,G), H is F+G.
На запрос
?- fib (0_ ,F).
получим F = 1, и Пролог сделает попытку сопоставить с запросом второй факт и потерпит неудачу. Однако сопоставление головы третьего утверждения с запросом происходит успешно и осуществляется попытка доказать цель fib(-l,FO,Fl), что, в свою очередь, приводит к цели fib(-2, .., ..) и так далее, т.е. образуется бесконечный цикл.
Однако мы можем устранить такие ситуации, используя отсечение и тем самым указывая Прологу, что не существует других решении в случае успешного согласования граничного условия.
Программа 119
fib
(0,_,1) : - !.
fib
(1,1,1) : - !.
fib (N,G,H) : - fib ( N-l ,F,G), H is F+G.
Учитывая данное определение fib и задавая вопрос
?- fib(0_ ,F).
получаем F=l. Других решений нет.
Пример 2.
Программирование взаимоисключающих утверждений. Процедуру нахождения наибольшего из двух чисел можно записать в виде отношения
max(X, Y, М).
Здесь М=Х, если X>=Y, и M=Y, если X<Y. Соответствующие правила таковы:
max(X,Y,X):-X>=Y.
max(X, Y, Y) : - X<Y.
Эти правила являются взаимоисключающими. Возможна более экономная формулировка, использующая понятие «иначе»:
если X>=Y то М=Х иначе M=Y.
На Прологе это записывается при помощи отсечения:
max(X,Y,X):-X>=Y,!
max(X, Y, Y).
Пример 3. Блокирование просмотра целей.
Программа 120
В.
D
А:
- В, С. (1)
С:
-D, !, Е. (2)
Е:
-F, G, H. (З)
?А.
Говорят, что дизъюнкт (1) «порождает» дизъюнкт (2), так как в правой части (1) есть литера С и эта же литера - в левой части (2). Аналогично дизъюнкт (2) «порождает» дизъюнкт (3). Если (3) неудачен, то в (2) выполнится отсечение: дизъюнкт (2) также считается неудачным, восстанавливается «родительская среда» (1), делается попытка найти альтернативное решение для В. Если бы (2) имело вид С: -D, Е. , то при неудаче в (3) была бы сделана попытка найти альтернативное решение для D.
В других случаях может быть необходимым продолжение поиска дополнительных решений, даже если целевое утверждение уже согласовано. В этих случаях можно использовать встроенный предикат fail.
Встроенный предикат fail не имеет аргументов. Он считается всегда ложным.
Пример: перебор всевозможных решений.
Программа 121
oc(cpm).
ос(msdos).
ос(unix).
печать-всех:-ос(X), write(X), fail.
?-печать-всех.
в качестве учебной дисциплины программирование
Около трех с половиной десятилетии минуло с тех пор, как в педвузах введено в качестве учебной дисциплины программирование для ЭВМ.
За все это время педвузовские кафедры программирования и вычислительной математики, как и образованные позднее на их основе кафедры информатики и вычислительной техники, не были избалованы своевременным появлением специальных учебных изданий. При колоссальной скорости изменений в самом предмете, всегда существенно превышавшей скорость центральных издательских механизмов, специально ориентированные на программы педвузов книги выходили не чаще, чем раз в десятилетие - едва ли не соразмерно скорости смены поколений ЭВМ. Если к этому добавить непреходящую особенность книг о компьютерах и программах к ним устаревать еще в типографии, то можно с грустью утверждать, что нормальных учебников по Computer Science для педвузов пока - увы! - так и не было. И можно ли считать утешением тот безрадостный факт, что уровень компьютерного обеспечения большинства педвузов обычно с трудом «дотягивал» до содержания полуотсталых учебных пособий?
В наши дни многое изменилось. Во-первых, на месте узкого учебного курса программирования в учебных планах педвузов давно уже обосновался куда более обширный и многоаспектный учебный предмет «Информатика». Да и положение с источниками, конечно, стало другим - полки книжных торговцев сегодня ломятся от изданий по информатике.
Однако преподавателю (а более всего студенту) специальная учебная книга, содержание и направленность которой отвечают заданному учебному плану и программе (или, как сейчас говорят, стандарту образования), все-таки очень нужна. Сделать такую книгу непросто: с одной стороны - пугающая широта и вечная необустроенность предмета информатики, а с другой - динамичность, неуспокоенность самих стандартов педобразования, равно как и школьных стандартов, которые тоже именно сейчас находятся в состоянии активного переосмысления. Эти взаимосвязанные предпосылки достаточно долгое время оставляли мало надежд на то, что найдутся отважные авторы (преисполненные профессионального долга, а вовсе не амбициозного желания прославиться), которые возьмутся за такую работу и сделают ее. Те, кто держит в руках эту книгу, могут убедиться, что за дело взялись наиболее авторитетные и хорошо известные в кругу педагогов-информатиков ученые. Мне же приятно осознавать, что с этими замечательными людьми и специалистами нас не один год связывало Учебно-методическое объединение педагогических учебных заведений России по информатизации образования, в котором и родилась инициатива написания этого учебного пособия.
М. П. Лапчик, Действительный член
Академии информатизации
образования, профессор
ПРЕДМЕТ КИБЕРНЕТИКИ
Слово «кибернетика» происходит от греческого слова, означающего в переводе «кормчий». Его современное значение связано с научной областью, начало которой положила книга американского ученого Норберта Винера «Кибернетика или управление и связь в животном и машине», вышедшая в 1948 г. Вскоре предметом новой науки стали не только биологические и технические системы, но и системы любой природы, способные воспринимать, хранить и перерабатывать информацию и использовать ее для управления и регулирования. В изданной в 1947 г. «Энциклопедии кибернетики» говорится, что это «... наука об общих законах получения, хранения, передачи и преобразования информации в сложных управляющих системах. При этом под управляющими системами здесь понимаются не только технические, а и любые биологические, административные и социальные системы». Таким образом, кибернетика и информатика являются, скорее всего, единой наукой. Сегодня кибернетику все чаще считают частью информатики, ее «высшим» разделом, в какой-то степени аналогичным по положению «высшей математике» по отношению ко всей математике вообще (примерно в таком же положении по отношению к информатике находится и наука «Искусственный интеллект»). Информатика в целом шире кибернетики, так как в информатике имеются аспекты, связанные с архитектурой и программированием ЭВМ, которые непосредственно к кибернетике отнести нельзя.
Кибернетические разделы информатики богаты подходами и моделями в исследовании разнообразных систем и используют в качестве аппарата многие разделы фундаментальной и прикладной математики.
Классическим и до известной степени самостоятельным разделом кибернетики считают исследование операций. Под этим термином понимают применение математических методов для обоснования решений в различных областях целенаправленной человеческой деятельности.
Поясним, что понимается под «решением». Пусть предпринимается некоторое мероприятие (в производственной, экономической или социальной сфере), направленное на достижение определенной цели - такое мероприятие называется «операцией».
У лица (или группы лиц), ответственного за проведение этого мероприятия, имеется возможность выбора, как его организовать. Например, можно выбрать виды продукции, которые будут выпускаться, оборудование, которое при этом будет применяться, так или иначе распределить имеющиеся средства и т.д. «Операция» есть управляемое мероприятие.
Решение есть выбор из ряда возможностей, имеющихся у ответственного лица. Решения могут быть удачными и неудачными, разумными и неразумными. Оптимальными называют решения, по тем или другим принципам более предпочтитель-ные, чем другие. Цель исследования операций - математическое (количественное) обоснование оптимальных решений.
Исследование операций включает в себя следующие разделы:
1) математическое программирование
(обоснование планов, программ хозяйственной деятельности); оно включает в себя относительно самостоятельные разделы: линейное программирование, нелинейное программирование, динамическое программирование
(во всех этих названиях термин «программирование» возник исторически и не имеет отношения к программированию ЭВМ);
2) теорию массового обслуживания,
опирающуюся на теорию случайных процессов;
3) теорию игр,
позволяющую обосновывать решения, принимаемые в условиях неполноты информации.
Отметим, что эти разделы не связаны непосредственно с ЭВМ и техническими системами. Иным, быстро развивавшимся в 70-х-80-х годах, разделом кибернетики были системы автоматического (автоматизированного) регулирования. Этот раздел имест замкнутый, автономный характер, исторически сложившийся самостоятельно. Он тесно связан с разработкой технических систем автоматизированного регулирования и управления технологическими и производственными процессами.
Еще одним классическим разделом кибернетики является распознавание образов, возникшее из задачи моделирования в технических системах восприятия человеком знаков, предметов и речи, а также формирования у человека понятий (обучение в простейшем, техническом смысле). Этот раздел в значительной мере возник из технических потребностей
робототехники. Например, требуется, чтобы робот-сборщик распознавал нужные детали. При автоматической сортировке (или отбраковке) деталей необходима способность распознавания.
Вершиной кибернетики (и всей информатики в целом) является раздел, посвященный проблемам
искусственного интеллекта. Большинство современных систем управления обладают свойством принятия решений - свойством интеллектуальности, т.е. в них смоделирована интеллектуальная деятельность человека при принятии решений.
ПРЕДСТАВЛЕНИЕ ГРАФОВ
Важным вопросом, особенно для приложений теории графов, является определение возможных способов представления графов. Самый простой способ - полное перечисление множеств V
и Е. Однако, очевидно, что в этом случае выявление у графа различных характеристик и свойств будет крайне затруднительным. Граф можно представить в виде некоторого графического изображения и визуально определить некоторые свойства и характеристики заданного графа. Однако, при наличии в графе'большого числа ребер и вершин этот способ также мало пригоден. Рассматривая различные возможные способы представления графов, мы должны иметь в виду потребность ввода соответствующей информации в компьютер. В этой связи ввод информации в числовом виде предпочтителен, хотя современные технические средства допускают ввод и графической информации (таблиц, текста, графиков, рисунков и т.д.), после чего может производиться обработка такой информации.
Матрица смежности.
Если вершины графа G помечены метками v1, v2,..., vn, то элементы матрицы смежности A(G) размера V, xV определяются следующим образом: A(i.j) = 1, если vi
смежна с vj; A(ij) = 0 в противном случае (рис. 1.9, а).
Матрица инцидентности.
Если вершины графа G помечены метками v1, v2,..., vm, а ребра - метками е1, е2,..., еп, то элементы матрицы инцидентности I(G) размера М х N определяются правилом: B(ij) = 1, если vi инцидентна ej; B(iJ) = 0 в противном случае (см. рис. 1.9, б).
Рис. 1.9, а. Матрица смежности Рис. 1.9, б. Матрица инцидентности
Для ориентированного графа G, имеющего N вершин можно рассмотреть матрицу достижимости
C(G) размера N х N, элементы которой определяются так: С(I, J) = 1, если вершина vj достижима из vi; C(I, J) = 0 в противном случае. Ниже приведен пример ориентированного графа и его матрицы достижимости, рис. 1.10.
Рис. 1.10. Матрица достижимости ориентированного графа
Контрольные вопросы
1. Каким образом определяется граф?
2. Что является путем в графе?
3. Как определяется такой вид графа, как дерево?
4. Какими способами можно задать граф?
ПРЕДСТАВЛЕНИЕ ОБ ЯЗЫКАХ УПРАВЛЕНИЯ РЕЛЯЦИОННЫМИ БАЗАМИ ДАННЫХ ТИПА dBASE
2.3.1. Основные элементы СУБД типа dBASE
Напомним некоторые термины, используемые в теории реляционных баз данных. Будем представлять информацию, составляющую базу данных, в виде совокупности прямоугольных таблиц.
Поле - наименьший поименованный элемент информации, хранящейся в БД и рассматриваемой как единое целое (рис. 6.7).
Поле может быть представлено числом, буквами или их сочетанием (текстом). Например, в телефонном справочнике полями являются фамилия и инициалы, адрес, номер телефона, т.е. три поля, причем все текстовые (номер телефона также рассматривается как некоторый текст).
Рис. 6.7. Представление информации в реляционной БД
Запись -
совокупность полей, соответствующих одному объекту. Так, абоненту телефонной сети соответствует запись, состоящая из трех полей.
Файл - совокупность связанных по какому-либо признаку записей (т.е. отношение, таблица). Таким образом, в простом случае база данных есть файл.
Все данные в БД разделены по типам. Говоря точнее, вся информация полей, принадлежащих одному столбцу (домену), имеет один и тот же тип. Такой подход позволяет ЭВМ организовать контроль вводимой информации.
При определении полей БД каждое поле может быть отнесено к одному из следующих типов:
• символьный тип,
обозначение С (character);
• числовой тип,
обозначение N (numeric);
• логический тип,
обозначение L (logical);
• тип даты,
обозначение Data;
• примечаний,
обозначение Memo.
Каждый тип служит для хранения специфической информации. В поле типа С можно помещать любые имеющиеся на клавиатуре символы: буквы, цифры, знаки препинания и т.д. Символьное поле хранится как текст, выровненный по левому краю. Над символьными полями нельзя выполнять каких-либо вычислений.
В числовом поле могут быть только цифры, знаки «плюс» и «минус», десятичная точка. Числа выровнены по правому краю. Над числовыми полями можно выполнять вычисления.
Поле логического типа содержит величины, которые могут принимать только одно из двух значений: истинно или ложно.
Поле типа даты может содержать реальные даты в представлении, принятом в США (месяц/день/год) или в европейских странах.
Описание всех имен, типов и размеров полей составляют структуру базы данных, которая хранится в памяти вместе с данными. Эту структуру всегда можно просмотреть и при необходимости исправить. Следует различать структуру файла и информацию, содержащуюся в нем. Основное различие между структурой и информацией состоит в том, что структура остается неизменной, а информация меняется
при каждом редактировании или вводе.
Семейство СУБД dBASE. Среди СУБД для ПК наиболее распространенным в мире является семейство dBASE фирмы «Ashton-Tate». Такая популярность объясняется отчасти исторически, так как эта СУБД появилась одной из первых на рынке программных продуктов данного профиля; не в меньшей степени этому способствовала удачность заложенных основ конструкции СУБД и командного языка. Одна из наиболее широко используемых (в настоящее время устаревших) версий этого семейства - dBASE III+.
В новой версии dBASE IV концепция СУБД и командный язык получили значительное развитие, позволившее устранить недостатки предыдущей версии, а также существенно обогатить палитру средств обработки данных и улучшить интерфейс пользователя.
К числу СУБД реляционного типа, предназначенных для ПК, относятся семейство dBASE (dBASE II, III, III+ и IV),
Clipper, Foxbase, R:BASE, Paradox и др. В этих СУБД записи и, соответственно, поля имеют обычно фиксированную длину (чаще всего длина такой записи достигает 4000...5000 байт). Исключение составляют поля типа Memo, используемые, например, в СУБД семейства dBASE. Число полей в перечисленных СУБД варьируется от 128 до 1024.
Длина поля зависит от типа поля и может составлять от 255 до 4000 байт для текстовых полей, до 20 байт для числовых полей и имеет фиксированные значения для полей типа даты (8 байт) и логических полей (1 байт). Поле типа Memo служит для хранения больших массивов текстовой информации и хранится в отдельном файле БД, но воспринимается как поле в составе основного файла БД.
Это поле имеет плавающую длину, определяемую объемом введенной текстовой информации, и может достигать 32767 байт.
Большинство СУБД реляционного типа для ПК позволяют создавать файлы с числом записей до 1 млрд. и объемом до 2 Гбайт. Обычно ограничением на число и объем записей, в первую очередь, выступает емкость внешней памяти ПК на магнитных дисках.
В состав многих СУБД, предназначенных для работы на ПК, входят три основных компонента: командный язык, интерпретирующая система или компилятор для преобразования команд к выполнимому виду и средства взаимодействия пользователя с СУБД (интерфейс пользователя).
Командный язык
служит для выполнения и обеспечения требуемых операций с данными - позволяет создавать структуры файлов БД и манипулировать данными, создавать прикладные программы, экранные формы ввода и вывода информации и т.д. Структура и возможности языка в значительной степени определяют облик конкретной СУБД, ее возможности. В состав командного языка ПК также обычно входят специальные команды по установке параметров и состояний системы (SET-команды), а также функции, предназначенные для различных видов обработки данных и выполнения вспомогательных действии.
В СУБД команды можно выполнять по одной (после набора с клавиатуры) или группами команд в автоматическом режиме, предварительно записанных в специальный (программный) файл. Команды языка СУБД записываются в текстовой форме, близкой к обычному языку. Для того чтобы ПК могла выполнять такую команду, ее надо преобразовать в вид исполнимых машинных команд.
Существует два принципиально различных способа такого преобразования. В первом способе используется интерпретирующая система, которая преобразует поочередно команды в исполнимый вид перед их непосредственным выполнением. Во втором способе сначала вся исходная программа преобразуется
(компилируется) в программу из исполнимых машиной команд и затем эта программа выполняется.
Первый способ выполнения команд СУБД имеет то преимущество, что исходная программа занимает сравнительно немного места и памяти.
Кроме того, этот способ позволяет выполнять команды по одной в режиме ввода с клавиатуры или в режиме, управляемом с помощью меню. Однако выполнение исходной программы посредством интерпретации команд происходит достаточно медленно. Второй способ в отличие от первого позволяет выполнять программу значительно быстрее, но программа, составленная из машинных команд, занимает значительно больше оперативной памяти.
Взаимодействие пользователя с СУБД, в которой используется интерпретирующая система, обычно может осуществляться в режиме, управляемом с помощью меню, и реже, ввода команд с клавиатуры. Первый режим дает возможность пользователям работать с пакетом СУБД, не зная командного языка. Содержание выполняемых команд записывается в позициях меню на естественном языке. Пользователь выбирает нужную позицию меню и нажимает клавишу исполнения команды. Обычно в меню включают достаточно широкий круг команд языка СУБД, позволяющих выполнять многие операции по обработке данных, однако далеко не все. При использовании режима ввода команд с клавиатуры требуется знать их синтаксис и способы применения. Этот режим применяется уже более подготовленными пользователями. Признаком данного режима СУБД служит какой-либо знак (например, точка в левом нижнем углу экрана), который служит приглашением для набора команды. В дальнейшем для простоты будем называть этот режим просто командным.
Последние версии таких СУБД, как dBASE, RBASE и др., содержат генераторы прикладных программ, позволяющие пользователям без знания командного языка создавать программы средней степени сложности. Эти средства могут применяться как неподготовленными пользователями, так и профессиональными программистами для уменьшения трудозатрат при разработке прикладных программ.
Как уже отмечалось, первой созданной в этом классе программой была dBASE II, созданная Уэйном Рэтлиффом (США) в 1981г. Варианты этой системы до сих пор используются для целей обучения на учебных ЭВМ. Вскоре эта система была усовершенствована, а ее возможности расширены.
Появились СУБД dBASE III и dBASE III+, ставшие на долгое время стандартом систем управления базами данных для персональных компьютеров. Позже получили распространение системы FoxBase, FoxPro и Clipper - все имеющие набор команд, похожий на СУБД семейства dBASE, и использующие ту же организацию данных в файлах с типичным расширением .dbf (Data Base File - файл базы данных), СУБД dBASE IV. Языки этих систем послужили основой для создания огромного числа прикладных информационно-поисковых систем, автоматизированных рабочих мест (АРМ) в различных предметных областях.
Система управления базами данных dBASE IV значительно усилена по сравнению с dBASE III+ по многим параметрам (ниже в скобках указаны данные для dBASE III+). В частности, можно создавать двумерные массивы переменных общим объемом до 1170 элементов, может быть открыто до 99 (16) файлов, увеличено максимальное число переменных - 15000 (265), число полей в файлах БД - 255 (128), число открытых индексных файлов -10 (7) и т.д. Как уже отмечалось выше, командный язык dBASE IV значительно расширен и улучшен по сравнению с командным языком dBASE III+.
Включение в язык dBASE IV новых команд позволило существенно улучшить следующие функции пакета СУБД семейства dBASE:
· разработку иерархических систем меню прикладных задач;
· разработку экранных форм ввода и вывода данных;
· организацию ввода и вывода информации в отдельные окна на экране;
· вывод данных на печать;
· возможности по поиску и обработке данных в файлах БД;
· обеспечение работы в среде ЛВС и др.
Команды типичной СУБД для персональных компьютеров предназначены для выполнения следующих функций:
• описания БД;
• наполнения БД;
• редактирования БД;
• поиска информации в БД;
• формирования и вывода на экран или принтер информации в виде отчетов.
Представление о возможностях пакета dBASE IV можно получить при знакомстве с управляющим центром (УЦ). реализующим интерфейс пользователя, управляемый меню. В состав УЦ входят шесть меню:
• меню Data («Данные») для создания, изменения структуры файлов БД, ввода, обновления и отображения данных на экране;
• меню Queries («Запросы») для формирования и выполнения запросов на выборку и обновление данных;
• меню Forms («Формы») для разработки экранных форм ввода и вывода информации;
• меню Reports («Отчеты») для разработки форм отчетов и вывода их на печать;
• меню Labels («Марки») для разработки форм марок и вывода их на печать;
• меню Applications («Прикладные программы») - генератор разработки прикладных программ.
Функции УЦ и расположение меню на экране отражают последовательность работы пользователя при разработке прикладной информационной задачи. Работа обычно начинается с создания структуры файлов БД, которые требуются для ее решения. Возможные типы файлов приведены в табл. 6.1.
После создания структур файлов БД прикладной задачи требуется ввести в них данные.
Ввод и обновление данных в меню «Данные» выполняется на экране в стандартных формах. Эти формы не всегда вполне удобны для пользователя. В УЦ предусмотрено меню «Формы», позволяющее разрабатывать собственные экранные формы для ввода и вывода информации.
Таблица 6.1
Типы файлов и их расширения
Файл |
Окно УЦ |
Файл разработки |
Файл кодов |
Исполнимый файл |
БД |
Data |
.dbf |
- |
- |
Запрос на выборку |
Queries |
.qbe |
- |
.qbo |
Запрос на обновление |
» |
.upd |
- |
.upo |
Выборка dBASE III+ |
» |
.vue |
- |
- |
Экранная форма |
Forms |
.sqr |
.fmt |
.fmo |
Отчет |
Reports |
.frm |
.frg |
.fro |
Марка |
Labels |
.lbl |
.lbg |
.lbo |
Прикладная программа |
Applications |
- |
.prq |
.dbo |
SQL-про грамма |
» |
- |
.prs |
.dbo |
Програма, созданная генератором прикладных программ |
» |
.app |
.prg |
.dbo |
Отбор информации из одного или нескольких файлов БД можно выполнить с помощью меню «Запросы». Отобранные данные можно выводить на экран в разработанных ранее формах или на печать.
Меню «Запросы» позволяет также связывать между собой несколько файлов БД, что дает возможность при разработке структуры файлов БД прикладной задачи избежать дублирования информации.
Завершающий этап процесса обработки информации - вывод полученных данных на экран, принтер или внешние носители. Для генерации форм выходных документов предназначено меню «Отчеты».
Таким образом, меню УЦ позволяет выполнять все этапы процесса обработки информации, начиная от ее записи на носители и завершая выдачей необходимых выходных документов.
Панель УЦ состоит из шести окон. Окно Data содержит имена файлов БД. Окно Queries показывает имена файлов запросов на выборку и обновление данных. В окно Forms высвечиваются имена файлов экранных форм ввода и вывода информации. Окно Reports содержит имена файлов форм отчетов, а окно Labels - имена файлов форм марок.
Крайнее справа окно Applications высвечивает имена программ или любых текстовых файлов.
Для создания файлов соответствующих типов в окнах панели УЦ имеется позиция <Create> (создать). После выбора этой позиции высвечиваются экраны, предназначенные для выполнения операций по созданию файла соответствующего типа. Эти же экраны раскрываются и при выборе имени файла в окне.
Помимо основных функций работы с файлами различных типов управляющий центр обычно имеет широкий набор сервисных функций, позволяющих работать с каталогами, определять макропоследовательности клавиш, выполнять экспорт и импорт данных в файлы других систем, защищать данные, устанавливать параметры системы, копировать, переименовывать, удалять файлы, запускать DOS-программы и т.д.
2.3.2. Создание структуры файлов базы данных
Рассмотрим теперь, как создать структуру файла БД с помощью УЦ. Для этого надо выбрать позицию <Create> окна Data на панели УЦ.
На экране появится таблица, состоящая из шести колонок с именами: порядковый номер поля (Num), имя поля (Field Name), тип поля (Field Type), ширина поля (Width), количество дробных десятичных знаков числа (Dec), признак индексирования поля (Index). Каждая строка этой таблицы содержит информацию об одном поле записи файла БД. Имя поля может включать до 10 буквенно-цифровых символов, но должно начинаться обязательно с буквы. Тип поля (символьный - Character, числовой с фиксированной точкой - Numeric, числовой с плавающей точкой - Float, текстовый - Memo, логический - Logical и типа даты - Date) можно выбрать клавишей ПРОБЕЛ или набрать непосредственно с клавиатуры.
После того как введено описание для всех полей файла БД, созданную структуру следует сохранить на диске. Для этого надо сначала клавишей F10 вызвать меню экрана создания/модификации структуры БД и затем выбрать позицию <Save this database file structure> (сохранить структуру файла БД) меню Layout.
Ввод новых и обновление существующих записей выполняется в одних и тех же стандартных экранных формах Browse и Edit. Предварительно надо файл БД открыть. Факт открытия файла отмечается на панели УЦ тем, что его имя перемещается выше черты под слово <Create>. Находясь на экране разработки структуры файла БД, после ее окончания можно сразу перейти к вводу данных посредством выбора позиции <Enter records from keyboard> меню Append.
Кроме того, ввод данных в стандартные экранные формы можно выполнить из УЦ. Для этого после установки курсора на имя файла в окне Data надо нажать клавишу ENTER и затем выбрать позицию <Display data>. После этого высветится одна из стандартных экранных форм: Browse или Edit.
В форме Browse данные высвечиваются в табличном виде (строка таблицы - запись файла), при этом не все поля могут одновременно разместиться на экране.
В форме Edit поля одной записи размещаются одно под другим на одной или нескольких страницах экрана (в зависимости от количества полей). Раскрытие последующих страниц выполняется клавишей PgDn.
После того как создана структура файла БД и введена информация, обычно требуется отбирать и выводить на экран или на печать те данные, которые отвечают поставленной задаче. Для этого формируются запросы на отбор необходимых данных.
Запросы можно создавать с помощью шаблона файла (запросы по образцу) и в специальном окне, которое размещается в окне Queries панели УЦ.
Формирование шаблона вывода целесообразно выполнять в два этапа: сначала вводить сразу все поля файла и затем удалять ненужные.
Кроме обычных полей в шаблон вывода можно помещать вычисляемые поля.
В пустую графу шаблона вычисляемых полей вводится с клавиатуры вычисляемое выражение, которое включает одно или несколько имен полей файла БД, и операторы выполнения действий с ним. В число этих операторов входят арифметические и логические операторы, а также функции dBASE.
Имеется возможность разрабатывать собственные формы ввода и вывода данных на экран. В этих формах поля файлов БД можно размещать в любом месте экрана, сопровождая их пояснительными надписями, обводить в рамки и вводить другие оформительские элементы.
Разработанные формы представляют собой программные файлы, которые можно записать на диск и затем использовать многократно для просмотра и обновления информации на экране в удобном для пользователя виде.
Разработка экранной формы начинается с выбора позиции <Create> окна Forms панели УЦ. После этого высвечивается горизонтальное меню, включающее позиции <Layout>, <Fields>, <Words>, <Goto>. Выбор этих позиций приводит к открытию различных меню, позволяющих выполнять определенный круг действий по созданию экранной формы.
Так, меню Layout предназначено для общего оформления экранной формы, реализации короткого способа ввода всех полей на экран и назначения файла БД, если он не был открыт ранее.
Добавление полей в экранную форму по одному осуществляется с помощью позиции <Add field> меню Fields.
Разработка отчетов является завершающим этапом технологии обработки информации.
При выдаче отчетов могут использоваться выборки данных, полученные в результате выполнения запросов, и исходные файлы БД.
Разработка отчетов выполняется в окне Reports УЦ. Форма отчетов создается на экране. В нее можно включать следующие элементы: поля из текущего файла БД или выборки, вычисляемые поля, которые создаются специально для отчетов, текстовый материал, рамки и линии. Текст длинных символьных полей можно размещать и разворачивать в колонках заданной ширины.
В число стандартных частей отчета входят: заголовок страницы, введение (заголовок) отчета, собственно отчет (тело отчета), итоги (заключение) отчета и подножие страницы.
Описанный УЦ позволяет выполнять многие операции без знания командного языка dBASE IV с помощью режима управляемого меню, однако основной режим работы СУБД основан на использовании командного языка.
2.3.3. Командный язык СУБД
Операции СУБД реализованы в виде команд, которые, как правило, можно использовать независимо, вводя их с помощью клавиатуры - это, так называемый, командный режим СУБД. Из этих команд можно составлять прикладные программы, создавая таким образом системы «под ключ», ориентированные на неподготовленного пользователя. Это, так называемый, программный (пакетный) режим работы в СУБД.
В состав элементов командного языка входят команды, SET-команды, функции, переменные и массивы.
Команда
записывается в виде строки слов, в которую входит глагол - основное слово, определяющее содержание операции, выполняемой командой, список выражений и ключевые слова с аргументами. Структура командной строки называется синтаксисом команды. Многие команды обработки файлов строятся по следующей форме:
<глагол> [<список выражений:»] [<границы>]
[FOR<условие>] [WHILE<\условие>]
[ТО FILE <имя файла> /TO PRINTER
/TО ARRAY <имя массива>
/ТО <переменные>
[ALL [LIKE/EXCEPT <шаблон>]] [IN <алиас>]
Квадратные скобки означают использование заключенных в них элементов синтаксиса по выбору.
В угловых скобках, следующих после ключевого слова, записываются его аргументы. Косая черта, наклоненная влево (/), обозначает, что может быть записано только одно из разделенных этим знаком ключевых слов. Угловые, квадратные скобки и косая черта в записи команды для ее выполнения не указываются и служат только для пояснения синтаксиса.
<Список выражений> представляет собой комбинацию имен полей файлов БД, переменных, элементов массивов, констант, функций, системных переменных и операторов. Все данные в выражении должны быть одного типа. Если в выражении требуется использовать данные разных типов, их надо преобразовать в один тип специальными функциями. Выражения в списке могут быть различного типа.
Операторы в выражениях обозначают операции с данными и обозначаются специальными символами. В dBASE используются четыре типа операторов: математические, операторы отношений, логические и строковые.
Границы в приведенном выше синтаксисе команды указывают те записи файла БД, которые будут доступны при его обработке. В качестве ключевых слов границ могут быть: RECORD <n> - доступна только одна запись с заданным номером; NEXT <n> - доступны все записи, начиная с номера n; ALL - доступны все записи файла БД; REST - доступны записи, начиная с текущей до конца файла.
Опции FOR и WHILE определяют условия отбора записей для обработки. Эти опции имеют приоритет перед границами при определении доступа к записям. Опция FOR определяет доступ к обработке, начиная с первой записи и до конца файла БД, a WHILE - начиная с текущей записи и до тех пор, пока условие имеет логическое значение «Истина» (True или .Т.).
Опция ТО управляет выводом информации, обработанной командой. В ряде команд выходной поток можно направить в файл на диске, на принтер, в массив (или переменную).
Опция ALL LIKE позволяет отобрать или, наоборот, исключить среди имен файлов, полей файлов БД и переменных те, которые соответствуют заданному шаблону.
Особой разновидностью команд являются SET-команды, устанавливающие параметры среды, в которой выполняются обычные команды.
Применяются две формы этих команд:
SET <параметр> ТО <выражение> и
SET <параметр> ON/OFF
Первая форма устанавливает значение параметра, а вторая включает (ON) или выключает (OFF) его действие, т.е. устанавливает состояние. Эти команды можно выполнять в программах, в командном режиме, можно также занести их в специальный файл с именем Config.db, определяющий параметры среды на весь сеанс работы с пакетом dBASE.
Создание файла БД осуществляется командой CREATE <имя файла>. Для модификации созданной структуры файла используется команда MODIFY STRUCTURE.
Для открытия файла БД используется команда
USE [<имя файла БД>/?] [IN <номер рабочей области>]
[INDEX <список .ndx и .mdx файлов>]
[ORDER [TAG] <имя .ndx файла>/<указатель .mdx файла>
[OF <имя .mdx файла>]]
[ALIAS<aлиac>] [EXCLUSIVE] [NOUPDATE],
которая открывает существующий файл БД и связанные с ним файлы .mdx и .ndx в текущей рабочей области.
Для создания индексных файлов типа .ndx и .mdx используется команда
INDEX ON <индексное выражение>
ТО <имя .ndx файла>/
TAG <имя указателя индекса .mdx файла>
[OF <имя .mdx файла>] [UNIQUE] [DESCENDING]
Для открытия индексных файлов используется команда
SET INDEX TO [/?<список имен файлов>
[ORDER [TAG] <нмя .ndx файла>/
<имя указателя индекса>
[OF <имя .mdx файла>]]]
Помимо широкого набора команд типичный язык СУБД типа dBASE персонального компьютера включает несколько десятков или даже сотен встроенных функций.
Функции могут использоваться на месте переменных и констант в командах. После указания имени функции обязательно идут круглые скобки, даже если функция не требует никаких параметров. В табл. 6.2 приведены некоторые функции, часто используемые при разработке программ.
Таблица 6.2
Некоторые функции СУБД типа dBASE
Функция |
Назначение |
RECNO() BOF() EOF() RECCOUNT() FOUND() LIКЕ(<образец>, <выр.С>) UPPER (<выр.С>) INKEY( ) ERROR() CHR(<выр.N>) DATE() ROW() СОL() |
Возвращает номер текущей записи открытого файла БД Возвращают логический признак начала и конца открытого файла БД Возвращает число записей в открытом файле БД Возвращает логический признак успешности поиска в БД командой SEEK Сравнивает строку <образец> с символьным выражением <выр.С> Преобразует символьную строку в верхний регистр Возвращает код нажатой клавиши Возвращает номер ошибки Возвращает букву по коду Возвращает текущую дату Возвращает номер текущей строки и столбца экрана |
В языке dBASE IV используются также функции, которые (наряду с командами) позволяют обрабатывать данные (в том числе, выполнять вычисления), а также определять состояния, например, находится ли указатель записей в конце файла: ?EOF(). После имени функции обычно стоят круглые скобки, в которых могут помещаться аргументы Функции нельзя использовать самостоятельно, а только вместе с какой-либо командой.
Кроме системных функций в dBASE IV можно использовать функции, созданные самим пользователем.
В языке dBASE используются переменные, тип которых автоматически определяется первым в данной программе присвоением им значения. Возможные типы: символьный, логический, числовой, дата.
Кроме простых переменных, в программах и процедурах можно использовать одно- или двумерные массивы.
Каждый элемент массива представляет собой обычную переменную. Представление переменных в виде массива позволяет значительно расширить диапазон применения переменных, а также, в ряде случаев, облегчить реализацию функций, присущих переменным. Перед использованием массивов сначала их надо объявить командой
DECLARE <имя массива 1>
[{<количество строк>,} {<количество колонок>}]
{,<имя массива 2>
[{<количество строк>,} {<количество колонок>}]...]
В синтаксисе этой команды опции указываются фигурными скобками вместо обычно принятых квадратных. При записи команды в программе в квадратные скобки заключаются параметры (размерность) массива - число строк и столбцов. Если указано одно число, то массив одномерный. Формально двумерный массив с одним из параметров, равным единице, фактически является одномерным: DECLARE [12,1] или DECLARE [1,25].
Примеры.
DECLARE Mas [8,4] && Двумерный массив
DECLARE Masi [10] && Одномерный массив
STORE {15/10/89} TODatI [4,4].]
Для ввода данных в переменную или элементы массива в программе используется команда
STORE <выражение> ТО <список переменных>/<список элементов массива> или альтернативная форма
<переменная>/<элемент массива> = <выражение>.
2.3.4. Ввод данных в базу и редактирование
После того как создана структура файла БД, можно вводить данные. Существуют две стандартные экранные формы ввода (и вывода) информации в файлы БД: BROWSE и EDIT. Первая форма вызывается командой
BROWSE [NOINIT] [NOFOLLOW] [NOAPPEND] [NOMENU]
[NOEDIT] [NODELETE] [NOCLEAR] [COMPRESS]
[FORMAT] [LOCK <Bыp.N>] [WIDTH <выр.N>]
[FREEZE <имя поля>] [WINDOW <имя окна>]
[FIELDS <имя поля 1> [/R] [/<ширина колонки>]
/<вычисл. имя поля 1> = <выражение 1>
[ ,<имя поля 2> [/R] [/<ширина колонки>]
/<вычисл. имя поля 2> = <выражение 2>]...]
В команде имеется ряд опций, позволяющих устанавливать различные режимы ее использования. В число этих опций входит группа опций, позволяющих назначить режимы работы с полями, и группа опций по размещению полей на экране. В состав первой группы входят следующие опции: NOEDIT , позволяющая установить режим только чтения для всех полей, NOAPPEND, не разрешающая добавлять новые записи, и NODELETE, не разрешающая помечать записи для удаления. Опция FREEZE назначает для обновления только одно указанное поле. Другие поля высвечиваются, но остаются недоступными для редактирования. Если для указанного в опции FREEZE поля командой PROTECT открыто только чтение, то обновление не разрешается. Опция FREEZE без имени поля отменяет ранее назначенную установку.
Поля высвечиваются в том порядке, который определен структурой файла БД или указан в команде опцией FIELDS, входящей в состав второй группы. Эта опция позволяет выбрать поле и определить порядок его расположения в таблице Browse.
Опция WIDTH устанавливает верхний предел ширины колонки для всех полей в таблице BROWSE. Эта ширина перекрывает ширину поля, назначенную при создании файла БД. Если опции WIDTH и <ширина колонки> используются одновременно, то принимается наименьшее значение.
Данная опция, как и предыдущая, не применяется для полей типа Memo и логических полей. Значения числовых полей и полей даты не будут высвечиваться, если значение опции WIDTH меньше ширины этих полей, назначенных при определении структуры файла БД. Опция FORMAT позволяет разместить поля в таблице BROWSE в очередности, определенной экранной формой, которая установлена командой SET FORMAT TO.
Альтернативой команды BROWSE является команда EDIT
EDIT [NOINIT] [NOFOLLOW] [NOAPPEND] [NOMENU]
[NOEDIT] [NODELETE] [NOCLEAR] [<номер записи>]
[FIELDS <спнсок полей>] [<диапазон>]
[FOR <условие>] [WHILE <условие>]
Эта команда выводит на экран по одной записи файла БД, поля которой размещаются по вертикали.
Если требуется обновить содержимое полей файла БД без привлечения данных из другого файла, например умножить содержимое числового поля на заданную 'величину, соединить содержимое двух символьных полей и т.д., можно использовать команду
REPLACE [<границы>] <поле> WITH <выражение>
[, <поле> WITH <выражение...]
[WHILE <условие>] [FOR <условие>] [ADDITIVE]
которая изменяет (замещает) значения заданных полей (включая поля Memo) текущей записи или группы записей, определенных границами и опциями WHILE, FOR.
После ввода данных в файл БД нередко требуется быстро их просмотреть. Для этого служат команды
LIST/DISPLAY [<границы>] [[FIELDS] <список выражений>]
[OFF] [<диапазон>] [FOR <условие>]
[WHILE <условие>] [ТО PRINTER/
ТО FILE <имя файла>]
Эти команды выводят все поля файла БД, если их список не определен опцией FIELDS. В начале каждой записи, если не указана опция OFF, выводится ее номер, опции <диапазон>, FOR и WHILE определяют диапазон выводимых записей. Команды LIST и DISPLAY идентичны с той разницей, что первая выводит записи непрерывно, а вторая делает остановку после вывода одной страницы экрана.
Кроме выводов файлов БД команды LIST и DISPLAY позволяют также высвечивать данные о файлах в директориях, содержимое буфера HISTORY (хранилище выполненных с клавиатуры команд), данные об используемых переменных и массивах, информацию о текущем сеансе работы с dBASE, структуру указанного файла БД и имена рабочих станций, работающих в среде ЛВС.
2.3.5. Дополнительные операции
Нередко возникает необходимость просмотреть структуру файла и вывести ее на печать. Для этого служит команда
LIST/DISPLAY STRUCTURE [IN <алиас>] [ТО PRINTER/TO FILE <имя файла>]
которая выводит информацию о файле БД.
Существуют специальные команды перемещения по файлу, добавления новых записей и пометки записей для их последующего удаления.
Для перемещения по файлу используется команда
GO/GOTO BOTTOM/TOP [IN <алиас>]
или
GO/GOTO [RECORD] <номер записи> [IN <алиас>]
или
<номер записи>
Эти команды осуществляют переход на указанную запись в активном файле БД.
В программах часто требуется перемещать указатель записи не на конкретную запись, а на следующую после текущей. Эту операцию выполняет команда
SKIP [<Bыp.N>] [IN <алиас>]
После того как указатель записи перемещен на нужную запись, которая становится текущей, можно выполнить требуемую операцию, например ввести запись до или после текущей. Для этого используется команда
INSERT [BEFORE] [BLANK]
которая позволяет ввести новую запись (или пустую запись, если указана опция BLANK) после текущей или перед ней (если задана опция BEFORE). Пометить одну или несколько записей для их последующего удаления можно командой
DELETE [<диапазон>] [FOR <условие>] [WHILE <условие>]
Опции <диапазон>, FOR и WHILE позволяют помечать записи, отобранные в соответствии с заданным диапазоном и условиями.
Для того чтобы уничтожить пометки на удаление записей используется команда
RECALL [<диапазон>] [FOR <условие>] [WHILE <условие>]
Физическое удаление помеченных записей активного файла БД выполняет команда PACK. Команда
APPEND [BLANK]
позволяет добавлять записи, введенные с клавиатуры в конец активного файла БД.
В ряде случаев требуется создать физически упорядоченный файл. Для этого используется команда
SORT TO <имя файла> ON <поле 1 > [/А] [/С] [/D]
[ ,<поле 2> [/А] [/С] [/D]...] [ASCENDING]/[DESCENDING]
[<границы>] [WHILE <условие>] [FOR <условие>]
которая создает новый файл БД с записями, отсортированными в алфавитном, хронологическом или числовом порядке по заданным полям. Сортировка выполняется в порядке возрастания (/А) или убывания (ID) значений полей. Допускается сортировка максимум по десяти полям. Опция /С определяет сортировку независимо от прописных и строчных букв. Команда
• COPY FILE <имя файла 1> ТО <имя файла 2>
делает копию файла
любого типа.
После копирования или в других случаях нередко требуется переименовать файл.
Для этого используется команда
RENAME <имя файла> ТО <новое имя файла>
Нередко требуется найти запись не по ее положению в файле БД, а по содержанию полей. Такой вид поиска предусмотрен, например, в меню команды BROWSE. Способ поиска по содержанию полей зависит от того, созданы ли индексные файлы по этим полям или по их комбинациям. Для поиска по неиндексированным полям используется команда
LOCATE [FOR] <условие> [<диапазон>] [WHILE <условие>]
Эта команда выполняет в активном файле БД поиск первой записи, удовлетворяющей условию, заданному опцией FOR. Опции <диапазон> и WHILE определяют диапазон и условие начала и конца просмотра записей.
Для поиска по индексированным полям используются команды
SEEK и FIND.
Команда
SEEK <выражение>
выполняет поиск первой записи файла БД с заданным значением индексированного поля. При этом соответствующий индекс должен быть установлен в качестве главного (управляющего) индекса. Команда
FIND <литеральная строка>
аналогична команде SEEK и также выполняет поиск первой записи в индексированном файле БД с заданным значением индекса при установленном соответствующем главном индексе.
Отличие состоит в том, что в качестве поискового значения в команде FIND используется не выражение, а литеральная строка.
Основной командой, предназначенной для создания нестандартных экранных форм ввода и вывода
информации, является
@<строка>,<колонка>
[SAY <выр.>
[PICTURE <выр.С>]
[FUNCTION <список функций>]]
[GET <переменная>
[[OPEN] WINDOW <имя окна>] [PICTURE <выр.С>]
[FUNCTION <список функций>]
[RANGE [<нижний>] [<верхний>]]
[VALID <условие> [ERROR <выр.С>]]
[WHEN <условие>] [DEFAULT <выражение>]
[MESSAGE <выр.С>]]
[COLOR [<стандартная область экрана>] [<нестандартная область
экрана>]]
Эта команда позволяет выводить или вводить информацию в заданном формате в указанные места экрана. Кроме того, с помощью опций SAY этой команды можно выводить данные на принтер или в файл на диске. Для того чтобы установить вывод информации с помощью данной команды на экран, принтер или в текстовый файл DOS, используется команда
SET DEVICE TO SCREEN/printer/file <имя
файла>
Опция GET выводит и позволяет обновлять и редактировать данные, содержащиеся в полях, переменных или массивах.
Собственно обновление данных в переменных GET (здесь и ниже под словом «переменная» подразумеваются также поля файла БД и элементы массива) выполняется командой READ. которую следует поместить после данной команды. Эта команда активизирует переменные и выводит в них значения, находящиеся на экране.
Для приостановления процесса последовательного выполнения программы используется команда
WAIT [<сообщение>] [ТО <переменная>]
которая вызывает паузу до нажатия любой клавиши и высвечивает в нижней строке экрана сообщение. После нажатия клавиши выполнение программы продолжается, а в переменную заносится код ASCII этой клавиши.
С целью улучшения восприятия информации на экране можно использовать команду
@ <строка 1>,<колонка 1> ТО <строка 2>,<колонка 2> [DOUBLE/PANEL/<cимволы определения рамки>]
[COLOR <код цвета>]
которая рисует на экране прямоугольную рамку, определяемую координатами верхнего левого - <строка 1>,<колонка 1> - и правого нижнего - <строка 2>, <колонка 2> - углов рамки Опция DOUBLE позволяет рисовать двойную линию рамки (по умолчанию рисуется одинарная линия), опция PANEL - рамку в виде сплошной полосы. Кроме того, имеется возможность рисовать линию рамки заданными символами. Для этого задается список символов для определения рамки. Можно задать различные символы для сторон и углов рамки. В этом случае символы разделяются запятыми и располагаются в следующем порядке: f, b, 1, r, fl, fr, bl, br, где f - верх; b - низ; 1 - левая сторона; г - правая сторона; fl -левый верхний угол; fr - правый верхний угол; bl - левый нижний угол; br -правый нижний угол.
Пример.
@ 5,13 ТО 10,40 DOUBLE COLOR R/BG Д
Для полной очистки всего экрана используется команда
CLEAR [ALL/FIELDS/GETS/MEMORY/MENUS/
POPUPS/TYPEAHEAD/WINDOWS]
Она очищает экран, устанавливает курсор в левый нижний угол экрана и освобождает все незаконченные опции GET команды @... SAY. ..GET. Различные опции этой команды также закрывают файлы БД, очищают переменные, списки полей, окна, горизонтальные и вертикальные меню и буфер клавиатуры.
Команда @... SAY. ..GET является универсальной для организации ввода и вывода информации на экране. В программах нередко требуется вводить с клавиатуры данные для обеспечения процесса обработки информации, например имя файла БД, данные для ветвления программы, поисковые значения и т.д. Для этого предусмотрена специальная команда
ACCEPT [<сообщение>] ТО <переменная>
которая позволяет вводить с клавиатуры данные символьного типа в переменную. Перед полем переменной можно высветить сообщение, например, о характере вводимых данных.
Кроме этой команды для ввода данных с клавиатуры можно использовать команду
INPUT [<сообщение>] ТО <переменная>
которая выполняет аналогичные функции, но позволяет вводить в переменную с клавиатуры данные не только символьного, но и других типов, а также в виде заданного выражения, что не допускается в команде ACCEPT.
Тип выражения определяет тип переменной, в которую вводится значение. После набора выражения с клавиатуры для ввода его в переменную надо нажать клавишу Enter.
Кроме универсальной команды SAY существует команда, специально предназначенная для вывода данных на экран и принтер:
?/?? [<выр.1> [PICTURE <выр.С>]
[FUNCTION <список
функций>] [AT <выр.N>]
[STYLE <номер шрифта>]] [,<выр.2>...] [,]
которая выводит значение одного или более заданных символьных выражений. Если установлено состояние SET PRINT ON. то выполняется вывод на принтер, если SET PRINT OFF, то на экран. Эта команда в форме ? выводит каждое выражение на следующей строке, а в форме ?? все выражения на одной строке.
Для печати отчета
используется команда
REPORT FORM <имя файла отчета>/?
[<границы>] [WHILE <условие>]
[FOR <условие>] [PLAIN]
[HEADING <выр
С>] [NOEJECT]
[ТО PRINTER/TO FILE <имя файла>] [SUMMARY]
которая запускает программу печати отчета (файл отчета), созданную командой CREATE/MODIFY REPORT.
Для создания исходных программных файлов используются обычные текстовые редакторы, например встроенный редактор dBASE, который вызывается командой
MODIFY COMMAND/FILE <имя файла> [WINDOW <имя окна>]
Прикладная программа обычно состоит из главной процедуры и вызываемых из нее процедур, например:
<команды> && Начало главной процедуры
DO Proс1
DO Proc2
DO Ргос3
RETURN && Конец главной процедуры
PROCEDURE Proс1 && Начало Proс1
<команды>
RETURN && Конец Proс1
PROCEDURE Proс2 && Начало Proc2
<команды>
RETURN && Конец Proc2
PROCEDURE Ргос3 && Начало Ргос3
<команды>
RETURN && Конец Рrос3
Процедура
представляет собой программный модуль, который выполняет определенную задачу. После ее выполнения управление передается в вызвавшую или главную процедуру. Процедура так же, как и программа, вызывается и выполняется командой
DO <имя программы>/<имя процедуры> [WITH <список параметров>]
Опция WITH передает в вызываемую процедуру параметры (до 64).
Каждая процедура, размещаемая в файле процедур или в программном файле, должна начинаться с команды
PROCEDURE <имя процедуры>
и завершаться командой
RETURN [<выражение>/ТО MASTER/TO <имя процедуры>]
Команда RETURN удаляет все переменные, которые были определены в процедуре как PRIVATE (переменные, определенные как PUBLIC, остаются без изменения).
Командой DO в процедуру можно передавать из вызывающей программы и обратно параметры, которые в самой процедуре определяются командой
PARAMETERS <список параметров>
которая должна быть первой исполняемой командой в теле процедуры. В качестве параметра в списке может быть любое допустимое выражение, определяющее переменную, в которую передаются данные из соответствующего параметра вызывающей программы. Если эта переменная не объявлена глобальной (PUBLIC), то автоматически она имеет статус локальной (PRIVATE).
Определение переменных как локальных выполняется командой
PRIVATE <список переменных> / [ALL [LIKE/EXCEPT <шаблон>]]
Глобальные переменные можно использовать повсюду а программе и в вызываемых ею процедурах. Для объявления переменных и элементов массива глобальными используется команда
PUBLIC <список переменных>/ [ARRAY <список элементов массива>]
2.3.6. Организация системы меню
Чтобы организовать в dBASE систему меню, сначала надо определить его
отдельные компоненты - меню вертикального и горизонтального типа. Для этого используются специальные команды, начинающиеся словом DEFINE - определить. Определение горизонтального меню выполняется командой
DEFINE MENU <имя меню> [MESSAGE <выр.С>]
Эта команда еще не создает горизонтальное меню, а только назначает ему имя и, если требуется, сообщение, которое будет высвечиваться в нижней строке экрана (строке сообщений). Для определения позиций горизонтального меню используется команда
DEFINE PAD <имя позиции>
OF <имя меню> PROMPT <выр.С>
[AT <строка>,<колонка>] [MESSAGE <выр.С>]
которая определяет одну позицию горизонтального меню. Для задания нескольких позиций данная команда повторяется соответствующее число раз. Вертикальное меню определяется командой
DEFINE POPUP <имя меню>
FROM <строка 1>,<колонка 1>
[ТО <строка 2>,<колонка 2>]
[PROMPT FIELD <имя поля>]
/PROMPT FILES [LIKE <шаблон>]
/PROMPT STRUCTURE]
[MESSAGE <выр.С>]
которая устанавливает его имя (записывается по тем же правилам, что и для горизонтального меню) и координаты окна меню на экране. Опции FROM и ТО определяют координаты левого верхнего и правого нижнего углов окна меню.
Назначение текста и других атрибутов одной позиции ранее определенного вертикального меню осуществляется командой
DEFINE BAR <номер строки> OF <имя меню>
PROMPT <выр.С>
[MESSAGE <выр.С>]
[SKIP [FOR <условие>]]
Чтобы определить нескольких позиций, надо эту команду повторить соответствующее число раз.
После того как определены позиции меню, обычно требуется назначить им определенные действия, которые будут выполняться при их выборе. Эти действия для позиций горизонтального меню назначаются командой
ON SELECTION PAD <имя позиции горизонтального меню>
OF <имя горизонтального меню> [<команда>]
которая выполняет заданную команду при выборе указанной позиции горизонтального меню. В качестве команды может быть любая команда dBASE IV, в том числе команда вызова программ и процедур.
Для назначения действий позициям вертикального меню используется команда
ON SELECTION POPUP <имя позиции вертикального меню>/ALL [<команда>]
которая выполняет заданную команду или процедуру при выборе позиции вертикального меню.
Обычно для назначения позициям меню каких-либо действий используется выход на процедуру, в которой помещаются команды для выполнения этих действий. В такой процедуре чаще всего применяется команда
DO CASE
CASE <условие>
<команды>
[CASE <условие>]
<команды>
[OTHERWISE]
<команды>
ENDCASE
Можно формировать вложенные структуры этой команды, т.е. внутри команды после ключевого слова CASE помещать другую команду DO CASE, а также любые другие команды ветвления и выполнения циклов, например IF...ENDIF, DO WHILE...ENDDO и др.
Пример.
DO CASE
CASEVal> 1000
<команды>
CASEVal> 100
<команды>
CASEVal>10
<команды>
OTHERWISE
<команды>
ENDCASE
Если требуется разветвить процесс только на два направления, можно использовать команду
IF <условие> <команды> [ELSE] <команды> ENDIF
При реализации операций, назначаемых позициям меню, нередко требуется организовать циклы повторяющихся действий, например организовать обработку файла БД и др. Это можно сделать с помощью ряда команд и их комбинаций. Одной из таких является команда
DO WHILE <условие>
<команды>
[EXIT]
<команды>
[LOOP]
<команды>
ENDDO
которая обеспечивает повторение последовательности команд, заключенной между словами DO WHILE и ENDDO до тех пор, пока заданное условие истинно. Если встречается слово LOOP, то управление передается в начало цикла команд, а при встрече слова EXIT осуществляется выход из команды и управление передается на первую команду после слова ENDDO, завершающего данную команду.
Предыдущие команды позволяют определить меню и атрибуты их позиций. Для того чтобы активизировать горизонтальное и вертикальное меню (а также списки), используются команды
ACTIVATE MENU <имя меню> [PAD <имя позиции>]
и
ACTIVATE POPUP <имя меню>
которые вызывают на экран предварительно определенные меню.
2.3.7. Пример создания информационной системы с помощью СУБД типа dBASE
Рассмотрим пример создания информационной системы обработки школьной информации «Всеобуч» с помощью СУБД типа dBASE. Проследим основные этапы работы.
1. Постановочная часть.
1. 1. Цель функционирования ИС.
1.2. Структурирование общей задачи.
1.3. Анализ входной информации.
1.4. Анализ переработки информации.
1.5. Анализ выходной информации (структура БД, формат экрана для выходных данных, выходные формы информации, стандартные запросы, командные файлы и т.д.)
2. Создание БД.
2.1. Проектирование структуры БД.
2.2. Создание файла БД.
2.3. Заполнение файла БД записями.
3. Создание комплекса вспомогательных сервисных файлов.
3.1. Файл формата экрана.
3.2. Файлы выходных форм документов.
3.3. Индексированные файлы.
3.4. Файлы стандартных запросов.
3.5. Комплекс командных файлов.
4. Эксплуатация созданной ИС.
4.1. Поддержка информации в БД.
4.2. Получение необходимой информации через файлы запросов.
Согласно этим этапам разработаем прикладную программу, которая иллюстрирует возможности СУБД в автоматизации управления школой.
Постановка задачи.
Цель разработки этого программного средства - автоматизация работы завуча средней школы по одной из форм отчета всеобуча.
Предполагается получение информации в виде табл. 6.3 и табл. 6.4.
Таблица 6.3
Информация для отчета завуча школы
Класс |
Сохранение контингента |
Неуспевающие |
Второгодники, их успеваем. |
Пропуски |
Работа с трудными учащимися и их семьями |
|||
Конец года |
Четверти 1 2 3 4 |
Четверти 1 2 3 4 |
Четверти 1 2 3 4 |
Без ув. причин |
По болезни |
Состоящ. на учете |
Трудные семьи |
|
Класс |
Многодетные семьи и опекаемые дети |
Горячее питание |
Медицинское обслуживание |
Учебники, дидактические материалы |
ГПД |
УПК |
||||
семьи |
опекаемые дети |
фонд всеобуча |
б/п молоко |
1 2 п. п. |
количество осмотров |
хронические заболев. |
||||
Входной информацией в БД выступают следующие данные по каждому классу: число учеников на конец прошлого года и по четвертям; число неуспевающих в классе по четвертям; число пропусков в классе на текущий момент (по болезни и без уважительной причины. Учитывается работа с трудными семьями, медицинское обслуживание. Собирается информация о сохранности учебников и наглядно-дидактических материалов; о группах продленного дня и посещении УПК.
Требования к переработке информации:
• ввод данных и автоматическая сортировка по классам;
• добавление записей;
• внесение изменений в записи по запросу на номер класса;
• удаление записей посредством пометки знаком «*» в режиме просмотра данных. Выходная информация:
• просмотр данных в виде табл. 6.3 или табл. 6.4, а также просмотр данных по одному из столбцов таблиц, например, только пропуски уроков;
• вывод на принтер табл. 6.3 или табл. 6.4, а также печать только определенных столбцов.
Ввод данных удобно осуществлять с использованием экранных форм, повторяющих на экране таблицы. Так как эти таблицы не помещаются на экране одновременно и содержат неповторяющуюся информацию, целесообразно разделить ввод данных на две части. Обработку информации также удобнее проводить по двум таблицам по отдельности. Выбор осуществим по меню:
1. Часть 1. 2. Часть 2. 3. Конец работы.
Создадим две БД и проиндексируем их с тем. чтобы при вводе данных они автоматически сортировались по классам и чтобы в дальнейшем ускорить поиск требуемой информации. Над каждой из двух таблиц организуем проведение следующих операций:
1) заполнение новой базы;
2) добавление записей;
3)корректировку;
4)удаление записей;
5) печать документов;
6)выход.
Рассмотрим характеристики программ по каждому из представленных пунктов меню.
1) Этот пункт предполагает, что все записи БД уничтожаются и предварительно появляется предупреждение:
«При создании новой БД все данные уничтожаются. Вы действительно хотите создать новую БД? (д/н)».
При нажатии клавиши «д» пользователю предоставляется пустая экранная форма, соответствующая выбранной таблице из главного меню.
2) При добавлении записей на экране высветим пустую экранную форму. Пользователь может вносить информацию, передвигаясь по столбцам. При этом курсор автоматически по заполнении столбца переходит в следующий. После заполнения каждой строки в нижней части экрана высвечивается сообщение:
«Продолжить добавление записей? (д/н) :: »
При ответе «н» происходит возврат в меню, а записи сортируются по классам.
3) Для корректировки также высветим экранную форму, но с уже заполненными столбцами. Здесь необходимо предусмотреть тот случай, когда изменения должны вноситься только в отдельные классы. В этой связи требуется создание подменю.
4) При удалении записей, необходимо, как и в режиме корректировки, предусмотреть подменю с запросами по классам. Пользователю необходимо поставить знак «звездочка» (*) в столбце «классы», о чем в нижней части экрана организуем подсказку:
«Для удаления записи, на которой стоит курсор, пометьте ее звездочкой (* )»
По завершении работы все помеченные записи уничтожаются, а оставшиеся автоматически сортируются по классам.
5) Этот раздел служит для получения выходной информации. При его выборе создадим еще одно меню:
(Часть 1)
1) Полный отчет 2) Сохранение контингента 3) Неуспевающие
4) Успеваемость второгодников 5) Пропуски 6) Трудные учащиеся
(Часть 2)
1) Полный отчет 2) Многодетные семьи и опекаемые дети
3) Горячее питание 4) Медицинское обслуживание
5) Сохранность учебников 6) ГПД 7) УПК
Здесь по требованию пользователя должна выводиться информация либо о всех классах сразу, либо только о тех, которые укажет пользователь в ответе на запрос В этом же запросе сразу определим, на какое устройство осуществляется вывод.
Вид запроса:
«Какие классы Печать (д/н)»
Полный отчет (первый пункт меню) выводится в соответствии с экранными формами табл. 6.3 и табл. 6.4. Для всех остальных пунктов создадим форматные файлы, которые выводят информацию по одному из столбцов экранных форм.
Таблица 6.5
Отчет по «Медицинскому обслуживанию»
Медицинское обслуживание |
|||
Класс |
Количество осмотров |
Хронические заболевания |
Специальные медицинские группы |
1а |
30 |
3 |
1 |
1б |
26 |
2 |
0 |
1в |
30 |
0 |
0 |
2а |
29 |
1 |
1 |
… |
… |
… |
… |
** итог ** |
820 |
21 |
14 |
Создадим две БД со структурами, изображенными в табл. 6.6. Поле «класс» содержит информацию о номере класса. По полю «класс1» различаются параллельные классы.
Для быстрого поиска информации в базе, а также для автоматической сортировки записей после внесения изменений, проиндексируем их по полю «класс» и «класс1». При этом создаются индексные файлы KL.NDX и KL1.NDX.
Таблица 6.6
Структуры создаваемых баз данных
Поле |
Имя |
Тип |
Длина |
001 |
класс |
N |
002 |
002 |
Класс1 |
С |
002 |
003 |
пр:год |
N |
005 |
004 |
четв:1 |
N |
002 |
005 |
четв:2 |
N |
002 |
006 |
четв:3 |
N |
002 |
007 |
четв:4 |
N |
002 |
008 |
неусп:ч1 |
N |
002 |
009 |
неусп:ч2 |
N |
002 |
010 |
неусп:ч3 |
N |
002 |
011 |
неусп:ч4 |
N |
002 |
012 |
втгод:ч1 |
N |
002 |
013 |
втгод:ч2 |
N |
002 |
014 |
втгод:ч3 |
N |
002 |
015 |
втгод:ч4 |
N |
002 |
016 |
проп.без у/п |
N |
004 |
017 |
по:болезни |
N |
004 |
018 |
на:учете |
N |
005 |
019 |
тр.семья |
N |
005 |
Поле |
Имя |
Тип |
Длина |
001 |
класс |
N |
002 |
002 |
класс1 |
С |
002 |
003 |
семьи |
N |
005 |
004 |
дети |
N |
005 |
005 |
фонд |
N |
005 |
006 |
молоко |
N |
004 |
007 |
пол1 |
N |
003 |
008 |
пол2 |
N |
003 |
009 |
осмотр |
N |
005 |
010 |
хрон |
N |
005 |
011 |
спрг |
N |
004 |
012 |
учебн |
С |
010 |
013 |
гпд |
С |
003 |
014 |
упк |
С |
005 |
Создадим форматные файлы отчетов для вывода информации по одному из столбцов таблиц: PROP FRM (пропуски), TRUD.FRM (трудные учащиеся), UPK.FRM (УПК), SOHR.FRM (сохранение контингента), WTORG.FRM (успеваемость второгодников). NEUSP.FRM (неуспевающие), SEM.FRM (многодетные семьи и опекаемые), PIT.FRM (горячее питание), MED.FRM (медицинское обслуживание), UBN.FRM (сохранность учебников), GRD.FRM (группы продленного дня).
Ниже представлены тексты некоторых программ, поддерживающие рассматриваемую информационную систему (автор -Т.П. Глазко).
Программа 140
____________ модуль MAIN. PRG _________________
erase
set colon on
set talk off
store ' ' to rl,dd,d3
do while d3<>'3'
erase
do while dd<>'l' .and. dd <>'2' .and. dd<>'3'
@ 5,12 say ' 1). Часть 1 '
@ 6,12 say ' 2). Часть 2
@ 7,12 say ' 3). Конец работы '
@ 8,12 say ' Введите цифру ' get dd
read
loop
enddo
If dd<>'3'
do case
case dd= '1'
use newws Index kl
case dd= '2'
use newwsl Index kll
endcase
do menu
else
store '3' to d3
endif store ' ' to dd
loop
enddo
cancel
_______ МОДУЛЬ MENU.PRG ____________________
MENU.PRG поддерживает меню операций и в зависимости от выбранного пункта передает управление модулям: SERVIS2.PRG (корректировка), APPN PRG (добавление), NEWBD.PRG (создание новой БД), SERVIS3.PRG (удаление), DOC.PRG (документы). Прежде чем будет вызвана программа SERVIS2.PRG, выполняется еще одна программа - DOP.PRG, которая к этому меню добавляет запрос на классы.
Программа 141
set format to screen
store 0 to dl, d2
do while d2<>8
goto top
erase
store 0 to dl
text
МЕНЮ
1) Заполнение новой базы 4) Удаление записей
2) Добавление записей 5) Документы
3) Корректировка 6) Выход
endtext
do while d1<>l .and. dl<>2 .and. dl<>3 .and. dl<>4; .and. dl<>5 .and.
dl<>6
@ 9,1 say ' Введите цифру' get dl picture '9'
read
loop
enddo
do case
case dl=3
do DOP
do SERVIS2
case dl=2
do APPN
case dl=l
do NEWBD
case dl=4
do SERVIS3
case dl=5
do DOC
case dl=6
store 8 to d2
endcase
loop
enddo
return
_____________ модуль DOP.PRG ______________
DOP. PRG осуществляет запрос на классы, по результатам ввода формирует логическую переменную kkk. используемую в некоторых других модулях для контроля за номерами классов, kkk принимает значение «истина», если поле «класс» соответствует введенным номерам, и «ложь» - в противоположном случае.
Программа 142
store 0 to kl
store to kl
store Т to pp
*** запрос на классы
@ 10,1 say 'Какие классы*
do while pp
@ 10,13 get kl picture '99-99'
read
if val($(kl,l,2))<12 .and. val($(kl,4,2))<l2
store F to pp
endif
loop
enddo
*** Формирование логической переменной kkk
if val ($(kl,4,2))=0
store 12 to kl
else
store val($(kl,4,2))+l to kl
endif
store 'Kлacc>val ($ (kl, 1,2))—1 .and. Knacc<kl' to kkk
return
____________ модуль
SERV1S2.PRG _________________
Этот модуль позволяет внести изменения в записи БД. Классы, в которых будет производиться корректировка, пользователь указывает, отвечая на запрос до вызова настоящей программы.
Программа 143
erase
set colon off
set talk off
goto top
if val(dd)=l
do shapka
else do shapkal
endif
store 1 to numl ,num2
store Т to log
store ' ' to rl
store 0 to pointer, num
store 't' to dl
count to num
do while num1<num .and. num2<num .and. log
store 10 to line
store 't' to dl
@ 21,25 say 'Нажмите«к>> для перехода к другим записям
@ 22,25 say "или ВВОД для внесения изменений'
if val(dd)=l
do newws2
else
do newws21
endif
skip - line + 10
store 10 to line
do i zm2
store pointer+1 to pointer
loop
if num1<num
skip
endif
enddo
_____________ модуль SHAPKA.PRG _____________
Программа 144
erase
text
таблица 1
Класс |
Сохранение контингента |
Неуспевающие |
Второгодники, их успеваем. |
Пропуски |
Работа с трудными учащимися и их семьями |
|||
Конец года |
Четверти 1 2 3 4 |
Четверти 1 2 3 4 |
Четверти 1 2 3 4 |
Без ув. причин |
По болезни |
Состоящ. на учете |
Трудные семьи |
|
endtext
return .
____________ модуль SHAPKA1.PRG ____________
Программа 145
erase
text
таблица 2
Класс |
Многодетные семьи и опекаемые дети |
Горячее питание |
Медицинское обслуживание |
Учебники, дидактические материалы |
ГПД |
УПК |
|||||
семьи |
опекаемые дети |
фонд всеобуча |
б/п молоко |
1 п. |
2 п. |
Количество осмотров |
Хронические заболевания |
||||
1. Как сформировалось понятие «база данных»? Какое место базы данных занимают в структуре информационных систем?
2. В чем состоит концепция ANSI/SPARC трехуровневого представления данных?
3. Что означает «концептуальное представление данных»?
4. Из каких этапов слагается проектирование баз данных?
5. Какие принципы системного анализа используются при проектировании баз данных?
6. Охарактеризуйте основные параметры СУБД типа dBASE.
7. Каковы основные компоненты СУБД dBASE IV?
8. Каковы назначение и основные функции управляющего центра?
9. Файлы каких типов используются в системе dBASE?
10. Как происходит создание файла БД?
11. Охарактеризуйте возможности ввода информации в файл БД.
12. Как формируются запросы к БД?
13. Как формируются экранные формы?
14. Как происходит разработка отчетов?
15. Каков синтаксис команд командного языка dBASE?
16. Запишите команды и поясните назначение опций:
а) создания файла БД;
б) открытия файла БД;
в) создания индексного файла;
г) открытия индексного файла;
д) вызова экранных форм, редактирования и ввода данных;
е) просмотра информации;
ж) перемещения по файлу;
з) вставки и удаления записей;
и)сортировки и поиска;
к) создания экранных форм ввода-вывода;
л) оформления экранного интерфейса.
17. Запишите дополнительные команды ввода-вывода.
18. Какие команды используются для создания форм отчетов и печати отчетов?
19. Какие команды используются при создании программных файлов dBASE?
20. Как оформляются и вызываются программные процедуры?
21. Какие возможности описания и начального присвоения переменных имеются в языке dBASE?
22. Какие команды позволяют организовать диалоговые меню программ?
23. Какой вид имеют управляющие конструкции ветвления, выбора и цикла в языке dBASE?
§ ПРЕДСТАВЛЕНИЕ ОБ ОПЕРАЦИОННОЙ СИСТЕМЕ UNIX
ОС UNIX - одно из высших достижений в мире системного программного обеспечения. Многие специалисты считают, что по сравнению с ней MS DOS является гораздо менее профессиональной системой.
Хотя в специальных руководствах по UNIX подчеркивается ее простота и ясность, это не та простота, которая легко усваивается. Здесь мы познакомимся лишь с одним аспектом UNIX - управлением большой компьютерной сетью. Кроме того, эта ОС и тесно связанный с ней язык программирования Си являются основой для разработки сложных профессиональных программных продуктов самого разного назначения - как системных, так и прикладных.
Для глобальных сетей UNIX и UNIX-подобные системы (например, LINUX) являются основными. Здесь важно подчеркнуть, что UNIX прозрачным образом поддерживает не только работу с удаленного терминала (даже по телефонной линии), но и электронную почту, и набор протоколов TCP/IP. При этом детали обмена данными между компьютерами от пользователя системы скрыты, и он может, работая за любым компьютером сети или за удаленным терминалом, выполнять разнообразные операции и даже запускать процессы, не зная, где физически находится исполняющий компьютер.
Рассмотрим основные команды операционной системы UNIX. Сеанс работы с операционной системой UNIX начинается с ввода идентификатора пользователя и его пароля, присвоенных ему администратором сети при регистрации. Приглашением по вводу идентификатора является слово login.
Пароль при вводе не отображается. По желанию пользователя он может быть заменен по команде passwd.
Командная строка - это последовательность слов, разделенных пробелами. Первое слово командной строки и есть команда, остальные - параметры.
Типы параметров:
• имя файла - идентификатор (использует символы а - z, А - Z, 0 - 9, _,.,-);
• опция (ключ) уточняет смысл команды (обычно начинается со знака «минус»);
например, опция -al (может быть со знаком + или без него); смысл опции зависит от команды;
• выражение описывает обычно строку символов или является строкой.
Порядок параметров в команде:
1 2 3 4
command options expression filename(s)
Система содержит подробное справочное руководство (UNIX Reference Manual), состоящее из восьми секций:
1) commands (команды);
2) system class (системные вызовы);
3) subroutines (подпрограммы);
4) special files (спецфайлы);
5) file format and convension (формат файлов и соглашения);
6) games (игры);
7) macro packages and language conventions (макропакеты
и языковые соглашения);
8) administrator commands and procedures (команды
и процедуры администратора).
В любой момент руководство может быть выведено на экран и принтер.
Описание команды состоит из следующих разделов:
NAME (имя и функция);
SYNOPSIS (синопсис);
DESCRIPTION (описание функции);
FILE (используемые файлы);
SEE ALSO (смежные команды);
DIAGNOSTIC (реакция на ошибки);
BUGS (замеченные некорректности),
$ man i <имя> (i - номер секции, например "$ man grep"; если i опущено, подразумевается i=l).
Запуск программы (командного файла) из текущего каталога осуществляется при вводе имени содержащего ее файла в командной строке. Система обладает набором текстовых редакторов (например, VI и ЕХ), интерпретатором команд shell и другими встроенными утилитами.
Узнать имя текущего каталога можно следующим образом:
$ pwd (print working directory)
Для печати (вывода на экран) содержимого каталога используется команда ls.
Примеры.
$ Is - печать текущего каталога;
$ Is-al - a (all) - все файлы и подкаталоги;
-1 (long) - полную информацию;
S Is / - печать каталога root,
$ Is -1 / - печать каталога root
полная;
S Is -I /bin - часто используемые команды;
S Is /dev - драйверы устройств;
$ Is /users - каталоги пользователей.
Изменение рабочего каталога производится командой cd (change directory).
$ cd /etc $ Is -1 - печать команд администратора;
$ cd /usr $ Is -1 bin - редко используемые команды;
$ cd - без параметров - возврат к собственному (fioine) каталогу.
Команда cat (от concatenate) позволяет объединить несколько (два или более) файлов и направить результат на стандартный вывод (Standart Output), обычно - на экран дисплея, например:
$ cat /etc/motd посмотреть файл (message of today)
Создать нижележащие каталоги можно командой mkdir (make directory). Копирование файлов осуществляется командой ср.
Например, если текущим каталогом является progs/c, то ввод команды
$ cp /etc/motd message
приводит к созданию в текущем каталоге progs/c файла progs/c/mtssage. Его можно было бы скопировать в текущий или в другой каталог, не меняя имени:
$ cp /etc/motd progs/c
(при этом будет создан файл progs/c/motd). Если progs/c
- текущий каталог, того же эффекта достигает команда
$ cp /etc/motd
(с точкой в качестве параметра). Если второй аргумент команды cp - каталог, то в качестве первого можно указывать несколько файлов, например:
$ cp /etc/motd /usr/include/stdio.h progs/c
Перенос и переименование файлов осуществляется командой тv. Эта команда перемещает файл или каталог из одного места файловой системы в другое. Побочный эффект - переименование файла.
Пример.
$ mv message mesg
$ls
mesg....
Отличие от копирования состоит в том, что исходный файл будет уничтожен. Удаление (уничтожение) файлов производится с помощью команды rm.
Пример:
$ cd progs/c
$ rm motd
S Is message (нет motd)
Одной командой rm можно удалить несколько файлов.
Ключ -i позволяет использовать интерактивный вариант исполнения команды, требующий подтверждения на удаление каждого файла:
$ rm-i filel file2
filel : n (no-нет)
file2: у (yes-да)
Можно форсировать уничтожение ключом -f, даже если файл защищен по записи, например:
$ rm-fstdio.h
Этими средствами нельзя уничтожить каталог, пока не уничтожены все файлы, входящие в его состав.
Для удаления нескольких каталогов используется ключ рекурсивного уничтожения -r
(уничтожить все поддиректории). Пустой каталог удаляется посредством команды rmdir (remove directory):
$ rmdir progs
Метасимволы служат для подстановки любых строк и символов в именах файлов и в командах языка задании Shell:
* - представляет произвольную строку (возможно пустую);
? - любой одиночный знак;
[Cl С2] - любая литера из диапазона Cl- C2 (в стандарте ASCII).
Примеры:
1) $ Is с?
с1 с2 сЗ cs cz
2) $ Is с*
с1 с12 с2 с23 сЗ cs csl cxy cz
3)$ls?l*
с1с12
Для перенаправления вывода используется знак ">".
Пример.
$ Is -1 - вывод
на экран = standard output;
$ Is -1 > dirconts - вывод в файл dirconts;
$ cat dirconts - вывод на экран.
Пробелы вокруг символа «>» необязательны. Возможно перенаправление вывода с добавлением (с дописыванием в файл), которое обозначается «>>».
Пример.
$ pwd >> dirconts - добавить в файл имя текущего каталога.
Для перенаправления стандартного ввода используется знак «<».
Пример.
$ mail - ввод сообщения с экрана;
$ mail < message - ввод сообщения из файла message.
Эта возможность используется реже, чем перенаправление вывода.
Конвейером называется группа команд, объединенных программными каналами. Программный канал образуется назначением стандартного вывода одной команды стандартным вводом следующей команды. Для формирования программного канала используется знак «|» («вертикальная черта»).
Система UNIX располагает развитыми средствами связи пользователей между собой. К ним относятся команды:
• who - позволяющая выяснить, кто работает в данный момент с системой;
• write - для непосредственной посылки сообщения прямо на экран терминала другому пользователю;
• mail - реализующая электронную почту, использующую электронные почтовые ящики.
Команда write посылает сообщение указанному пользователю в момент исполнения этой команды:
write <пользователь адресат><сообщение>
Сообщение заканчивается выводом знака конца файла control-D. Если ожидается ответ и предполагается диалог можно не вводить знак конца файла до конца диалога. Электронная почта позволяет пользователям обмениваться сообщениями. которые попадают в почтовые ящики, реализованные внутри системы. При входе пользователя в систему появляется извещение о наличии для него почты, например:
login: password:... you have mail $
В отличии от команды write, в системе mail о приходе почты пользователя известят, когда он закончит текущую работу. Пост;» пит сообщение:
you have mail (для вас есть почта).
Для получения почты необходимо ввести команду
mail без параметров:
Подсказка (?) означает, что система mail ждет оказания о том, что делать с почтой: печатать, сохранить, уничтожить или выйти из команды mail. Ввод знака вопроса приводит к меню возможных действий:
q quit -закончить;
х exit without changing mail - выйти без изменения почты;
р print - печать;
s [file] save - сохранить в файле;
w [file] same without header - то же без заголовка;
- print previous - печатать предыдущее;
d delete - уничтожить;
+ next (no delete) - следующее (не уничтожать);
m user mail to user - переправить другому пользователю;
!cmd execute cmd - выполнить команду;
?
Для посылки почты следует ввести команду mail с параметром-именем пользователя и текст письма, заканчивая его знаком конца файла (control-D). Для выхода из системы mail нужно нажать q, например:
? q you have mail $
Существуют и более развитые средства работы с электронной почтой, например утилита bmail.
Чрезвычайно важно, что те же средства позволяют обмениваться электронной почтой не только в рамках локальной сети. но и глобально, в рамках Internet.
Для этого необходимо лишь указывать идентификатор адресата с интернетовским адресом его локальной сети. Сама передача сообщений по каналам связи ведется в этом случае с помощью средства под названием UUCP (Unix to Unix copy).
Помимо перечисленных команд UNIX имеет развитые средства обработки текстов, встроенные компиляторы с языков программирования Си, Фортран77, Паскаль и др, а также средства разработки программ.
Следующий уровень взаимодействия пользователей в сетях достигается на основе совместного использования распределенных по сети файлов. Прозрачными использование таких файлов делают сетевая файловая система NFS (Network File System) и сетевая информационная служба NIS (Network Information Service). NFS использует модель клиент/сервер, в которой сервер экспортирует доступные для совместного использования каталоги, а клиент монтирует эти каталоги, чтобы обращаться к хранящимся в них файлах До сих пор мы рассматривали команды UNIX, выполняемые из командной строки. Для обеспечения выполнения части из них, таких как перемещение по каталогам и их создание, копирование файлов и запуск программ, служит оболочка UNIX под названием Demos Commander,
в основных чертах аналогичная Norton Commander. Аналогом графической среды Windows в UNIX является графическая оболочка X Windows.
Контрольные вопросы и задания
1. Охарактеризуйте основные особенности и команды ОС UNIX.
2. Опишите основные команды ОС UNIX.
3. Какова роль операционной системы UNIX в обеспечении сервиса Internet?
ПРЕДСТАВЛЕНИЕ ЗНАНИЙ В СИСТЕМАХ ИСКУССТВЕННОГО ИНТЕЛЛЕКТА
Основной особенностью интеллектуальных систем является то, что они основаны на знаниях, а вернее, на некотором их представлении. Знания здесь понимаются как хранимая (с помощью ЭВМ) информация, формализованная в соответствии с некоторыми правилами, которую ЭВМ может использовать при логическом выводе по определенным алгоритмам. Наиболее фундаментальной и важной проблемой является описание смыслового содержания проблем самого широкого диапазона, т.е. должна использоваться такая форма описания знаний, которая гарантировала бы правильную обработку их содержимого по некоторым формальным правилам. Эта проблема называется проблемой представления знаний.
В настоящее время наиболее известны три подхода к представлению знаний в обсуждаемых системах:
• продукционная и логическая модели;
• семантические сети;
• фреймы.
Продукционные правила
- наиболее простой способ, представления знаний. Он основан на представлении знаний в форме правил, структурированных в соответствии с образцом «ЕСЛИ - ТО». Часть правила «ЕСЛИ» называется посылкой, а «ТО» - выводом или действием. Правило в общем виде записывается так:
ЕСЛИ A1, A2, ...,An, ТО В.
Такая запись означает, что «если все условия от A1 до Аn являются истинными, то В также истинно» или «когда все условия от А1 до Аn выполняются, то следует выполнить действие В».
Рассмотрим правило
ЕСЛИ (1) у является отцом х
(2) z является братом у
ТО z является дядей х
В данном случае число условий п = 2.
В случае п
= 0 продукция описывает знание, состоящее только из вывода, т.е. факт. Примером такого знания является факт «атомная масса железа 55,847 а.е.м».
Переменные х, у
и г показывают, что правило содержит некое универсальное, общее знание, абстрагированное от конкретных значений переменных. Одна и та же переменная, использованная в выводе и различных посылках, может получать различные конкретные значения.
Знания, представленные в интеллектуальной системе, образуют базу знаний. В интеллектуальную систему входит также механизм выводов,
который позволяет на основе знаний, имеющихся в базе знаний, получать новые знания.
Проиллюстрируем сказанное. Положим, что в базе знаний вместе с описанным выше правилом содержатся и такие знания:
ЕСЛИ (1) z является отцом х
(2) z является отцом у
(3) х и у не являются одним и тем же человеком
ТО х
и у являются братьями
Иван является отцом Сергея
Иван является отцом Павла
Сергей является отцом Николая
Из представленных знаний можно формально вывести заключение, что Павел является дядей Николая. При этом считается, что одинаковые переменные, входящие в разные правила, независимы; объекты, имена которых эти переменные могут получать, никак не связаны между собой. Формализованная процедура, использующая сопоставление (при котором устанавливается, совпадают ли между собой две формы представления, включая подстановку возможных значений переменных), поиск в базе знаний, возврат к исходному состоянию при неудачной попытке решения, представляет собой механизм выводов.
Простота и наглядность представления знаний с помощью продукций обусловила его применение во многих системах, которые называются продукционными.
Семантическая сеть
- иной подход к представлению знаний, который основан на изображении понятий (сущностей) с помощью точек (узлов) и отношений между ними с помощью дуг на плоскости. Семантические сети способны отображать структуру знаний во всей сложности их взаимосвязей, увязать в единое целое объекты и их свойства. В качестве примера может быть приведена часть семантической сети, относящейся к понятию «фрукты» (рис. 1.47).
Рис. 1.47. Пример семантической сети
Фреймовая система
имеет все свойства, присущие языку представления знаний, и одновременно являет собой новый способ обработки информации. Слово «фрейм» в переводе с английского языка означает «рамка». Фрейм является единицей представления знаний об объекте, которую можно описать некоторой совокупностью понятий и сущностей.
Фрейм имеет определенную внутреннюю структуру, состоящую из множества элементов, называемых слотами. Каждый слот, в своюо-чередь, представляется определенной структурой данных, процедурой, или может быть связан с другим фреймом.
Фрейм: человек |
||
Класс |
: |
Животное |
Структурный элемент |
: |
Голова, шея, руки, ноги,... |
Рост |
: |
30-220 см |
Масса |
: |
1 - 200 кг |
Хвост |
: |
Нет |
Фрейм аналогии |
: |
Обезьяна |
Перечислим главные особенности машинного представления данных.
1. Внутренняя интерпретируемость. Обеспечивается наличием у каждой информационной единицы своего уникального имени, по которому система находит ее для ответа на запросы, в которых это имя упомянуто.
2. Структурированность. Информационные единицы должны обладать гибкой структурой, для них должен выполняться «принцип матрешки», т.е. вложенности одних информационных единиц в другие, должна существовать возможность установления соотношений типа «часть - целое», «род - вид», «элемент - класс» между отдельными информационными единицами.
3. Связность. Должна быть предусмотрена возможность установления связей различного типа между информационными единицами, которые бы характеризовали отношения между информационными единицами. Эти отношения могут быть как декларативными (описательными), так и процедурными (функциональными).
4. Семантическая метрика. Позволяет устанавливать ситуационную близость информационных единиц, т.е. величину ассоциативной связи между ними. Такая близость позволяет выделять в знаниях некоторые типовые ситуации, строить аналогии.
5. Активность. Выполнение действий в интеллектуальной системе должно инициироваться не какими-либо внешними причинами, а текущим состоянием представленных в системе знаний. Появление новых фактов или описание событий, установление связей должны стать источником активности системы.
ПРИМЕР ЭЛЕКТРОННОЙ РЕАЛИЗАЦИИ ЛОГИЧЕСКОГО ЭЛЕМЕНТА
Наконец, приведем обещанную выше электронную схему одного из элементарных логических устройств. Эта схема реализует логическую операцию И-НЕ.
Основа схемы - два nрn-транзистора. Для ее понимания достаточно вспомнить, как работают транзисторы. Через такой транзистор может протекать ток от коллектора к эмиттеру (на рис. 4.26 это соответствует «от плюса к минусу») при наличии положительного напряжения на базе (т.е. в точках А и В). Отсутствие напряжения на базе запирает этот ток.
Схема 4.26 имеет два входа А и В, через которые подается информация в виде электрического напряжения: есть напряжение - логическое «да», нет его - «нет». Выход - точка Y, наличие разности потенциалов между которой и точкой Z рассматривается как «да», отсутствие - как «нет». Питающее напряжение для схемы подается на левые входы («+» и «-»). Резистор R, при наличии тока, создает падение напряжения.
Puc. 4.26. Электронная реализация логического элемента И-НЕ (схема на nрn-транзисторах)
Допустим, на входах А и В нет напряжения («нет» и «нет»). В последней колонке табл. 4.6 этому соответствует А = 0, В = 0. Тогда оба транзистора «заперты», ток по цепи не протекает и между точками Y и Z есть разность потенциалов - т.е. результат операции «да», что в логических обозначениях соответствует 1 (именно как в табл. 4.6). Если заперт один из транзисторов, то результат все равно такой же (сравните с табл. 4.6). Лишь если оба транзистора открыты, ток в цепи идет и между точками Y и Z разности потенциалов нет (падение напряжения на самих транзисторах ничтожно мало по сравнению с его падением на резисторе).
За более подробными сведениями на эту тему следует обратиться к рекомендованным ниже книгам.
ПРИМЕР ПРОГРАММИРОВАНИЯ НА ЛИСПЕ
Рассмотрим в качестве примера программирования на Лиспе менее элементарную классическую задачу, носящую название игры в «ханойские башни».
Игра состоит в следующем. Используются три вертикальных стержня А, В, С и набор N дисков разного диаметра с отверстием посередине (так что их можно надевать на стержни). В начальном положении все диски надеты на стержень А по порядку убывания диаметров: внизу самый большой, над ним - поменьше и т.д., а наверху - самый маленький. Целью является перенос всех дисков со стержня А на стержень В по следующим правилам:
1) за один раз можно перенести только один диск;
2) больший по размеру диск нельзя положить на меньший;
3) третий стержень С можно использовать как вспомогательный. Алгоритм решения задачи можно представить в виде трех следующих рекурсивных подзадач:
1) перенести со стержня А N-1 дисков на вспомогательный стержень С;
5) перенести нижний диск со стержня А на стержень В;
6) перенести со стержня С N-1 дисков на стержень В.
Программа состоит из трех последовательно определяемых функций «ханойские-башни», «перенос», «выведи» и имеет вид:
Программа 130
(defun ханойские-башни (высота)
(рrоgn (перенос "а "Ь "с высота) "готово))
ХАНОЙСКИЕ-БАШНИ
(defun перенос (из в вспомогательный n)
(cond
((= п 1) ; ветвь 2
(выведи из в) (t (перенос из ; ветвь1 вспомогательный
в
(- n 1))
(выведи из в)
(перенос вспомогательный ; ветвь 3
в
из
(- п 1)))))
ПЕРЕНОС
(defun выведи (из в)
(format t "~S -> ~S~%"из в))
ВЫВЕДИ
Вызов функции «ханойские башни» дает такое решение:
(ханойские-башни 3)
А->В
А->С
В->C
А->В
С->А
С->В
А->В
ГОТОВО
Можно убедиться, что определенная нами функция дает правильное решение для произвольного числа дисков, однако время решения задачи с увеличением числа дисков быстро возрастает.
СИСТЕМА КОМАНД ПРОЦЕССОРОВ СЕМЕЙСТВА PDP
В качестве примера реально существующего процессора, удобного для более детального изучения, возьмем процессор серии машин, созданных фирмой DEC (США) и известных под названием PDP-11 (в нашей стране аналогичные процессоры использовались в семействах 16-разрядных мини- и микро-ЭВМ «Электроника», ДВК, БК, а также в школьном компьютерном классе УКНЦ; всего таких машин было выпущено в СССР до 1,3 млн. штук и примерно столько же в США). Это семейство мини- и микро-компьютеров - одно из самых долгоживущих: первая машина этой серии была выпущена в 1970 г., а прекращение выпуска было запланировано фирмой DEC на 1997 г.
Причина выбора процессора PDP для иллюстрации обсуждаемого вопроса состоит в том, что система команд этого процессора построена на простых и наглядных принципах, изучив и запомнив которые уже можно составлять несложные программы. В то же время система команд других процессоров, например, широко распространенных представителей семейства «Intel», устроена значительно сложнее, требует запоминания большого количества справочных данных. В качестве подтверждения сказанного достаточно указать, что в команде процессора PDP может быть использован любой из имеющихся внутренних регистров, тогда как многие команды процессоров «Intel» оперируют с фиксированными регистрами, не допуская альтернативного расположения данных и результатов.
Процессор машин серии PDP и его отечественные аналоги (при дальнейшем изложении будем все это обширное семейство для краткости называть «процессор PDP») с точки зрения программиста устроен довольно просто. Он состоит из восьми регистров общего назначения (РОН) и особого регистра, в котором отображается текущее состояние процессора (в иностранной литературе его принято обозначать PSW - Processor Status Word). Любой из регистров общего назначения может быть использован в командах на равных основаниях. Вместе с тем имеются два выделенных регистра, содержимое которых процессор использует для собственных нужд. Прежде всего следует назвать регистр R7, выполняющий роль счетчика команд, в котором хранится адрес следующей инструкции программы.
Другим выделенным регистром является указатель стека R6, используемый при запоминании информации в момент вызова подпрограмм и при переходе к обработке прерывания.
Остальные 6 регистров, обозначаемые RO, Rl. R2, R3, R4, R5, программист может полностью использовать по своему усмотрению. Имеется только одно (непринципиальное) исключение: в обширной системе команд PDP существует лишь единственная, и то достаточно экзотическая, команда (MARK), работающая с регистром R5.
Следует отметить, что и выделенные регистры процессора R6 и R7 могут быть использованы в любой команде наряду с обычными РОН RO-R5. Например, допускается переписать информацию из R7 в R3 и тем самым сообщить программе адрес памяти, в котором находится следующая команда программы. Такой прием очень часто используется программистами для автоматической «самонастройки» на те адреса ОЗУ, в которых оказалась загруженной программа. Интересно, что такого простого доступа к содержимому программного счетчика многие процессоры не имеют.
Рис. 4.14. Схема регистра состояния процессора PDP
Регистр состояния процессора PSW, как и все РОН, является 16-битным. Его особенностью является то, что каждый его бит имеет самостоятельное значение и может использоваться процессором отдельно от других. В управляющих битах регистра постоянно отображается информация о выполняемых результатах (отрицательность, равенство нулю и т.п.), а также о состоянии процессора в данный момент (например, один из битов позволяет разрешать или запрещать обработку прерывании). Из всех используемых битов (не все 16 бит регистра состояния задействованы!) наиболее используемы два; их принято обозначать N и Z. Управляющий признак N (Negative) отражает знак результата операций: если число отрицательное, то N = 1, неотрицательное - N = 0. Бит Z (Zero) говорит о равенстве или неравенстве нулю результата: в первом случае Z = 1, во втором - Z = 0. Путем несложных рассуждений можно убедиться в том, что из шести известных математических соотношений
=, < , > , ? , ? , ?
четыре могут быть проанализированы по одному из признаков, а два оставшихся требуют совместного анализа битов N и Z.
Другие управляющие биты, изображенные на рисунке, используются следующим образом. Бит Р - задание маскировки прерываний от внешних устройств (Р = 0 -прерывание состоится. Р = 1 - замаскировано). Бит Т - «признак ловушки»; при Т = 1 после прерывания запускается специальная системная программа, позволяющая на этапе отладки текущей программы осуществлять режим трассировки. Бит V -признак переполнения разрядной сетки при арифметической операции (если это произошло, устанавливается V = 1); бит С - аналогично при переполнении разрядной сетки при логической операции, сопровождаемой сдвигом кода. Описанные управляющие признаки широко используются для реализации разветвлений программы в зависимости от полученных результатов, анализа причин прерываний и других действий.
Процессор PDP имеет достаточно удобный и широкий набор команд. Основная их часть является двухадресными и одноадресными, т.е. они обрабатывают два или один операнд, соответственно. Для выполнения некоторых управляющих команд данные не требуются (например, команда остановки программы) - такие команды не содержат ссылок на операнды. Форматы одно- и двухадресных команд изображены ниже на рис. 4.15.
КОП |
КМА |
N POH |
||
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 |
||||
КОП |
KMA1 |
N POH1 |
KMA2 |
N POH2 |
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 |
||||
Рис.4.15. Формат одноадресной команды (вверху) и двухадресной (внизу). КОП - код операции. КМА - код метода адресации, N РОН - номер регистра общего назначения (код адреса)
Примеры некоторых наиболее важных операций приведены в табл. 4.2. Действия, выполняемые по простейшим арифметическим операциям, понятны из пояснений.
В некоторых дополнительных пояснениях нуждаются только команды переходов.
Во-первых, переходы
бывают абсолютные (на заданный адрес) и относительные (на определенное число команд относительно данной). Переходы первого типа более наглядны и могут быть реализованы на любой адрес ОЗУ. Относительные переходы требуют вычисления адреса перехода, зато они не привязаны к конкретным адресам ОЗУ: программа, использующая относительные переходы, может работать в любом месте памяти. Относительные переходы занимают меньше места в памяти, чем абсолютные; вследствие этого диапазон относительных переходов ограничен (в процессоре PDP только на 127 слов вперед и 128 - назад).
Таблица 4.2
Наиболее важные команды процессора PDP
Мнемоника команды |
Содержание команды |
Пояснения |
HLT |
Остановка |
Выполнение программы прекращается |
CLR А |
Очистить А |
А:=0 (в операнд А засылается 0) |
INC А |
Увеличить А на 1 |
А:=А+ 1 (значение А увеличивается на 1) |
DEC A |
Уменьшить А на 1 |
А:=А-1 (значение А уменьшается на 1) |
MOV А,В |
Переписать А в В |
В:=А (В принимает значение А) |
ADD A,B |
Сложить А в В |
В:=А + В (сумма помещается в В) |
SUB A,B |
Вычесть А из В |
В:=В-А (разность помещается в В) |
СМР А,В |
Сравнить А с В |
По знаку разности А-В устанавливаются |
Управляющие биты; А и В сохраняются |
||
JMP А |
Безусловный переход к А |
Безусловный переход по адресу А |
BR К |
Безусловный переход на К. слов |
Безусловный переход через К команд |
BEQ К |
Переход по = 0 |
Переход на К слов, если результат = 0 |
BNE К |
Переход по ? 0 |
Переход на К слов, если результат ? 0 |
BPL К |
Переход по ? 0 |
Переход на К слов, если результат ? 0 |
ВМ1 К |
Переход по < 0 |
Переход на К. слов, если результат < 0 |
JSR А |
Вызов подпрограммы по адресу А |
Переход на адрес А с запоминанием адреса возврата для команды RET |
RET |
Возврат из подпрограммы |
Возврат на команду, следующую за вызовом подпрограммы |
Во-вторых, переходы делятся на безусловные и условные. Безусловные, как. следует из названия, происходят всегда. При выполнении условного перехода анализируются управляющие биты. Переход происходит только в том случае, когда признаки имеют требуемые значения; в противном случае переход игнорируется и выполняется следующая за ним команда. Чаще всего условному переходу предшествует команда сравнения, «подготавливающая» управляющие признаки для анализа. Отметим, что команды BEQ и BNE проверяют значение признака Z, a BPL и BMI -признака N.
В таблице у команд перехода для наглядности указаны адреса или величина смещения в словах. Именно таким образом и кодируются команды в памяти ЭВМ. Однако при записи текстов программ дело обычно обстоит несколько проще: в требуемых местах программы ставятся метки, а расчет конкретных адресов и смещений машина производит самостоятельно (см. приводимые ниже примеры).
В приведенных в таблице командах в качестве операндов фигурируют условные обозначения А и В. Расшифруем их. Система команд процессора PDP построена достаточно логично и закономерно, поэтому любой операнд- и первый, и второй - в любой операции задается совершенно одинаково. В PDP существует 8 различных способов задать местонахождение информации, требующейся для выполнения операции. Их принято называть методами адресации, и все они связаны с различным использованием РОН. Наличие развитой системы методов адресации делает программирование для процессора PDP очень гибким и мощным.
Опишем коротко организацию основной памяти, контролируемой обсуждаемым микропроцессором. Основная адресация - байтовая; каждый байт имеет уникальный адрес. Так как процессор является 16-разрядным, то объем контролируемого им номинально адресного пространства 64 кбайта; на деле программисту для размещения программы и данных доступно меньшее пространство, так как 8 кбайт памяти зарезервировано для общения с внешними устройсгвами. Реально, однако, с помощью специальных механизмов преобразования исполнительных адресов емкость ОЗУ, доступную пользователю, делают значительно большей (детали рассматривать не будем).
Байт может быть операндом для некоторых команд. Однако, большая часть команд обрабатывает операнды длиной 2 байта - «слово». Слово состоит из двух соседних байтов; адресом слова считается адрес младшего входящего в него байта.
Таблица 4.3
Некоторые способы указания операндов в командах
Название |
Мнемоника |
Пояснение |
Регистровая Косвенно-регистровая Автоинрементная Автодекрементная |
Rn (Rn) (Rn)+ -(Rn) |
Операнд в регистре Rn Операнд в ячейке ОЗУ, адрес которой в Rn То же, но после чтения Rn увеличивается на 1 То же, но перед чтением Rn уменьшается на 1 |
В качестве иллюстрации разберем выполнение команды MOV(R1)+,RO
По этой команде сначала считывается информация из памяти по адресу, находящемуся в R1. После чтения значение R1 автоматически увеличивается, так что при последующем выполнении данной команды будет обрабатываться следующая ячейка. Операция завершается записью считанной из ОЗУ информации в регистр R0.
Из разобранного примера отчетливо видно, что имеющиеся у процессора PDP способы адресации позволяют удобно работать не только с одиночными данными, но и с массивами последовательно хранящейся в памяти информации. Кроме того, некоторые приемы использования счетчика команд R7 в качестве РОН могут давать еще более интересные эффекты. Пусть, например, в некоторой программе встречается команда
MOV (R7) + , R2
и в следующем за ней слове хранится число 6. Учитывая, что после извлечения команды из ОЗУ счетчик R7 немедленно увеличивается, в момент выполнения команды его содержимое уже показывает на слово памяти, где хранится число 6. Следовательно, в качестве операнда (R7) будет считано именно оно, и, кроме того, R7 автоматически «передвинется» на следующую за константой ячейку благодаря автоинкрементному способу адресация. Таким образом, описанный прием позволяет использовать в качестве операнда константу, хранящуюся непосредственно в команде. Завершая обсуждения основных принципов программирования процессора PDP.
приведем примеры линейного, разветвляющегося и циклического фрагмента программы.
Пример I.
Программа вычисления по формулам R1:=R2+R3; R4:=R3-R2.
Программа 131
MOV R2, Rl ; сразу складывать нельзя, так как сумма заменяет
;второй операнд
ADD R3, Rl
MOV R3, R4
SUB R2, R4
HLT
Пример 2. В Rl и R2 хранятся некоторые числа. Поместить большее из них в R5, а меньшее-в RO.
Программа 132
СМР Rl, R2 ;сравнить Rl и R2
BPL L1 ;переход при R1?R2, если R2>R1
MOV Rl, R0
MOV R2, R5
BR L2
;если R1>R2
LI: MOV Rl, R5
MOV R2, R0
L2: HLT
Примечание. В тексте программы указаны переходы на метки, но в результате трансляции они будут автоматически преобразованы в переходы через заданное число слов.
Пример 3. Пусть в Rl задан начальный адрес массива ОЗУ, а в R2 - число ячеек в нем. Вычислить сумму элементов массива.
Программа 133
CLR R0 ;очистка суммы
LI: ADD (Rl) + , R0 ;добавить к сумме очередной элемент
DEC R2 ;уменьшить на единицу число оставшихся элементов
BNE L1 ;цикл, пока не останется 0 элементов
HLT
Примечание. В программе используется тот факт, что команда DEC автоматически сравнивает результат с нулем, что делает ненужной специальную команду сравнения СМР.
ПРИМЕР ТЕСТА ПО ШКОЛЬНОМУ КУРСУ ИНФОРМАТИКИ
В 1996 г. Республиканский центр тестирования использовал тесты по некоторым школьным предметам, в частности по информатике. Ниже приводится один из его вариантов (разработчики: Н.Г.Граве, И.А.Елисеев. Г.В.Тюрникова). Тесты построены на основе канонического принципа: вопрос и варианты ответа.
Разработчиками выбрана следующая модель знаний школьного курса информатики:
N Модуль 1. Введение
1. Измерение информации ,
2. Свойство информации
3. Измерение информации
4. Предмет информации. Фундаментальные понятия
5. История развития вычислительной техники
Модуль 2. Устройство и работа ЭВМ
6. Состав информационно-измерительного комплекса
7. Поколения ЭВМ
8. Арифметические основы ЭВМ
9. Состав информационно-измерительного комплекса
10. Арифметические основы ЭВМ
11. Физические основы ЭВМ
12. Состав информационно-измерительного комплекса
Модуль 3.
Алгоритмизация
13. Величины, тип, имя, значения, вид
14. Величины, тип, имя, значения, вид
15. Величины, тип, имя, значения, вид
16. Типы алгоритма
17. Способы описания
18. Способы описания
19. Алгоритм, свойства
20-24. Остальные вопросы как единый подраздел
Модуль 4. Информационные технологии
25-28. Операционные системы
29-30. Текстовый, графический, музыкальный редакторы
31-32. Базы данных
33. Электронные таблицы
Модуль 5. Заключение
34-36. Перспективы развития
РОССИЙСКИЙ ТЕСТ ПО ИНФОРМАТИКЕ №01
01. Килобайт - это
1) 1000 символов; 2) 1024 байт; 3) 8 бит; 4) 1000 байт.
02. Достоверность - это свойство
1) алгоритма; 2) компьютера; 3) информации; 4) языка программирования.
03. Наибольший объем памяти требуется для хранения
1)"10";2) 10; 3) "десять"; 4) (10).
04. Носителем информации является
1) провода; 2) принтер; 3) классный журнал; 4) телефон.
05. Первая машина, автоматически выполняющая все 10 команд, была
1) машина С.А.Лебедева; 2) машина Ч.Бэббиджа; 3) абак; 4) Pentium.
06. Минимально необходимый набор устройств для работы компьютера содержит
21. При составлении алгоритма для вычисления функции y=a*sin(x) аргументами являются 1) sin; 2) а, х; 3) х; 4) х, у.
22. Сколько раз выполнится цикл
i-1;
а:=10;
n:=2;
нц пока а>0
а:= a-n*i
кц
1)0; 2) 10; 3)5; 4) 4.
23. В качестве имени переменной может быть
1) 1996;2)а1996;3) 1996а;4)-1996.
24. Для описания циклического алгоритма используется конструкция
1) ПОКА; 2) ЕСЛИ; 3) ВЫБОР; 4) ПРОЦЕДУРА.
25. Какая программа является интерпретатором команд MS DOS?
1) AUTOEXEC.BAT; 2) MSDOS.SYS; 3) CONFIG.SYS; 4)COMMAND.COM
26. Минимально необходимый набор файлов для работы компьютера в MSDOS
1)IO.SYS, MSDOS.SYS; 2) IO.SYS. MSDOS.SYS, COMMAND.COM;
3)IO.SYS, MSDOS.SYS. COMMAND.COM, CONFIG.SYS;
4) IO.SYS, MSDOS.SYS, COMMAND.COM, AUTOEXEC.BAT.
27. Сколько символов в своем полном имени может содержать директория?
1)11; 2) 8; 3)7; 4) 12.
28. Неверным будет утверждение
1) файл с расширением .ТХТ может быть не текстовым;
2) системный диск может не содержать файл CONFIG.SYS;
3) файл AUTOEXEC.BAT может не содержать ни одной строки
(ни одного байта);
4) файл должен содержать в расширении не менее трех букв.
29. Текстовый редактор Лексикон - это
1) прикладная программа; 2) базовое программное обеспечение;
3) сервисная программа; 4) редактор шрифтов?
30. Под термином «интерфейс» понимается
1) внешний вид программной среды, служащий для обеспечения диалога с пользователем;
2) связь текстового редактора с устройством печати;
3) совокупность файлов, содержащихся в одном каталоге;
4) устройство хранения графической информации.
31. База данных - это 1) текстовый редактор; 2) совокупность связанных между собой сведений; 3) операционная оболочка; 4) утилиты NC?
32. Графический редактор нужен для
1) нормальной работы баз данных; 2) быстрого поиска информации;
3) проигрывания звуковых файлов; 4) создания рисунков.
33. В отличие от бумажных табличных документов, электронные таблицы обычно
1) имеют большую размерность; 2) позволяют быстрее производить расчеты;
3) обладают всеми свойствами, перечисленными в пунктах 1 -2;
4) стоят дороже.
34. Что делает невозможным подключение компьютера к глобальной сети?
1) тип компьютера; 2) состав периферийных устройств;
3) отсутствие винчестера; 4) отсутствие телефона.
35. Дан E-mail: artem@wremech.msk.ru. Слово msk означает
1) город назначения; 2) тип компьютера; 3) каталог; 4) имя пользователя.
36. Первый PHOTO CD был произведен фирмой
1) IBM; 2) APPLE; 3) KODAK; 4) POLAROID.
Ответы на тестовые задания
01 - 2); 02 - 3); 03 - 3); 04 - 3); 05 - 2); 06 - 2); 07 - 3); 08 - 4); 09 - 2); 10 -4); 11 - 4);
12 - 2); 13 - 4); 14 - 1); 15 - 3); 16-3); 17 - 4); 18 - 3); 19 - 2); 20 - 1); 21 - 3); 22 - 3); 23 - 2); 24 - 1); 25 - 4); 26 - 2); 27 - 2); 28 - 4); 29 - 1); 30 - 1); 31- 2); 32 - 4); 33 - 3); 34 -4); 35-1); 36-1).
Контрольные вопросы и задания
1. Разработайте модель знания по школьному разделу «действия с дробями», используя модульный принцип.
2. Разработайте тест на знание таблицы умножения чисел от 0 до 100.
3. Используя какую-либо инструментальную тестовую оболочку, разработайте тест по тестовым заданиям курса информатики, описанным в этой главе.
ПРИМЕРЫ ПРОГРАММ
Пример 1.
Вычислить полную поверхность параллелепипеда со сторонами А, В и С. Считать, что исходные значения находятся в ячейках ОЗУ. Результат также поместить в ячейку памяти.
Решение. Полная поверхность параллелепипеда вычисляется по формуле
S=2*(A*B+A*C+B*C)
Для упрощения программы выражение удобно представить в виде S = 2 * [А * (В + С) + В * С]
Программа 134
0000 01ЕО (22) => R0 В => R0
0002 0022
0004 0101 R0 => Rl В => Rl
0006 02Е0 R0 + (24) => R0 В + С
0008 0024
000А 05Е0 R0 * (20) => R0 A * (В + С)
000С 0020
000Е 05Е1 Rl * (24) => Rl В * С
0010 0024
0012 0210 R0 + Rl => R0 A * (В + С) + В * С
0014 0200 R0 + R0 => R0 2 * [A * (В + С) + В * С]
0016 010Е R0 => (26) результат => S
0018 0026
001A 0F00 останов
……….
0020 0002 А
0022 0003 В
0024 0004 С
0026 0034 S
Примечание. Не забывайте, что ответ 34 в памяти ЭВМ представлен в шестнадцатеричной системе. В десятичной, как и положено, получится 52.
Пример 2.
Организовать ввод латинских букв таким образом: программа принимает латинскую букву и обрабатывает ее так, чтобы она всегда была заглавной.
Решение. Главная «хитрость» решения состоит в том, чтобы понять, чем отличаются заглавные буквы от строчных. Для этого из таблицы ASCII, приведенной в главе 1, выберем наугад одну из букв и выпишем в двоичном виде коды заглавного и строчного символов. Например, для буквы R получим
R 0101 0010
r 0111 0010
Повторив аналогичные действия еще для нескольких букв, сделаем вывод, что коды заглавных ч строчных букв отличаются единственным битом - пятым,
если считать младший бит за нулевой. Запомним этот факт, поскольку он справедлив для любого современного компьютера.
Итак, для нашей задачи требуется сохранить все биты, кроме пятого, значит потребуется выполнить логическую операцию И с константой
1101 1111 =DF,
после чего любой код «потеряет» ненужный нам бит, сохраняя все остальные.
Еще одной особенностью решения является активное использование подпрограмм из ПЗУ. Поскольку при вызове подпрограмм обязательно используется стековая память, то должен быть корректно определен указатель стека SP; программа начинает работу с установки указателя стека.
Программа 135
0000 0E6D 26 => SP установка указателя стека
0002 0026
0004 9C0D вызов п/п 40FE ввод символа (без эхо-печати!)
0006 40FE
0008 0101 R0 => Rl сохранить введенный символ
000A 07D0 DF and R0 => R0 сделать букву заглавной
000C 00DF
000E 9C0D вызов п/п 4088 вывести результат
0010 4088
0012 0F00 останов
Пример 3. Найти максимум из трех чисел, находящихся в регистрах Rl, R2 и R3. Переписать наибольшее из них в R0.
Решение. Сначала максимальное из чисел в Rl и R2 занесем в R0. После этого, если R3 окажется больше R0, «исправим положение», переписав в качестве ответа R3.
Программа 136
0000 0412 сравнить R2 с Rl
0002 3D04 если < 0, то РС=РС+4 к записи Rl (к 0008)
0004 0120 R2 => R0 запомнить R2
0006 1D02 РС=РС+2 обход второй ветви (к 000A)
0008 0110 Rl => R0 запомнить Rl
000A 0403 сравнить R3 с R0
000C 3D02 если < 0, то РC=РС+2 к выходу (к 0010)
000E 0130 R3 => R0 запомнить R3
0010 0F00 останов
Пример 4. Найти сумму первых 100 натуральных чисел.
Говорят, такую задачу некогда решил в уме юный Гаусс, когда учился в школе. Мы будем решать задачу «в лоб», т.е. честно суммировть с помощью компьютера. Решение.
Поместим в R3 обрабатываемое в данный момент число N (меняется от 1 до 100), а в R0 - результирующую сумму S. Зададим им начальные значения и будем циклически добавлять к S текущее значение N. Признаком окончания цикла будет ситуация, когда N > 100.
Программа 137
0000 2113 1 => R3 1 => N
0002 2100 0 => R0 0 => S
0С04 0230 R0 + R3 => R0 S = S + N
0006 2213 R3 + 1 => R3 N=N+1
0008 04D3 сравнить R3 с 100 сравнить N и 100
000A 0064
000C 6DF6 если ?0, то PC=PC+F6 если N?100,
к повторению (000E + FFF6 = 0004)
000E 0F00 останов
Пример 5. Вывести на экран весь латинский алфавит от А до Z. Решение. Разместим в RO выводимый латинский символ, первоначальное значение которого будет «А» (код 65 = 41h). Вывод будем осуществлять обращением к соответствующей подпрограмме ПЗУ. Для перехода к следующему символу алфавита достаточно прибавить 1 к коду текущего символа (очень похоже на переход к следующему числу в предыдущем примере). Остается только проверить, не выходит ли вновь полученный символ за латинский алфавит, т.е.
не превышает ли его код 5Ah («Z»), и, если ответ будет «да» (превышает), то закончить процедуру.
Программа 138
0000 0E6D 26 => SP установка указателя стека
0002 0026
0004 01D0 41 => R0 код первого символа
0006 0041 («А»)
0008 9C0D вызов п/п 4088 вывод символа
000А 4088
000С 2210 R0 + 1 => R0 следующий символ
000Е 04D0 сравнить R0 с 5А его код ? «Z»?
0010 005А («Z»)
0012 6DF4 если ?0, то PC=PC+F4 к повторению (0008)
0014 0F00 останов
Пример 6. В памяти, начиная с адреса 001А, хранится некоторый текст, длина которого равна 15 (Fh) байтам Определить номер первого, совпадающего с образцом, символа в тексте. При отсутствии требуемого символа результат равен 0 (это практически полный аналог функции POS в Паскале).
Решение Поместим в R1 счетчик символов, в R2 - адрес текущего символа. Затем будем сравнивать каждый символ текста с образцом в R0 и в случае совпадения прервем выполнение цикла. При несовпадении будем продолжать цикл до теx пор, пока счетчик не превысит Fh, т.е. не станет равным 10h Если цикл завершится по выполнении этого условия, то символ-образец найти не удалось и в качестве ответа в R1 следует занести 0.
Программа 139
0000 2111 1 => R1 номер символа
0002 01D2 1А => R2 адрес начала текста
0004 001А
0006 С460 сравнить R0b с (R2)b сравнить символ с образцом
0008 5D0C если = 0, то РC=РС+2 выход при совпадении (к 0016)
000А 2211 R1 + 1 => R1 увеличить номер символа
000С 2212 R2 + 1 => R2 вычислить следующий адрес
000Е 04D1 сравнить R1 с 10 текст не закончился?
0010 0010
0012 4DF2 если ? 0, то PC=PC+F4 нет - к повторению (к 0006)
0014 2101 0 => R1 при отсутствии символа - 0
0016 0F00 останов
0018 0000
001А 4854 «ТН» текст
001С 5349 «IS» «THIS IS MY TEXT»
001E 4920 «I»
0020 2053 «S »
0022 594D «MY»
0024 5420 «Т»
0026 5845 «EX»
0028 0054 «Т»
4.6. НЕКОТОРЫЕ СПРАВОЧНЫЕ ДАННЫЕ ПО Е-97
А. Система команд процессора
МОД |
коп |
ОП1 |
ОП 2 |
Пояснения |
х |
0 |
X |
X |
Нет операции |
х |
1 |
X |
X |
оп l => oп 2 |
х |
2 |
X |
X |
oп 2 + oп 1 => oп 2 |
х |
3 |
X |
X |
oп 2 – oп l =>oп 2 |
х |
4 |
X |
X |
oп 2 + oп 1 (сравнить) |
х |
5 |
X |
X |
oп 2 * oп l => oп 2 |
х |
6 |
X |
X |
oп 2/oп l => oп 2 |
X |
7 |
х |
х |
оп 2 AND oп 1 => oп 2 |
X |
8 |
х |
х |
oп 2 OR oп l => оп 2 |
X |
9 |
х |
х |
oп 2 XOR oп l => oп 2 |
X |
А |
х |
х |
порт! => oп 2 |
X |
В |
х |
х |
oп 1 => порт 2 |
X |
С |
х |
х |
Переход по адресу |
X |
D |
X |
х |
Переход по смещению |
X |
Е |
* |
х |
(Одноадресные операции) |
X |
F |
X |
х |
Останов |
МОД |
коп |
ОП1 |
Пояснения |
х |
Е1 |
х |
NOT oп l |
х |
Е2 |
х |
оп 1 => стек |
х |
ЕЗ |
х |
стек => oп l |
х |
Е4 |
х |
SP + oп l => SP |
х |
Е5 |
х |
SP – oп 1 => SP |
х |
Е6 |
х |
Oп 1 => SP |
х |
Е7 |
х |
SP => oп l |
х |
Е8 |
0 |
PS => стек |
х |
Е9 |
0 |
стек => РS |
х |
ЕА |
X |
Сдвиг влево oп l |
х |
ЕВ |
X |
Сдвиг вправо oп l |
х |
ЕС |
X |
Арифметический сдвиг вправо oп l |
Б. Двоичные коды модификатора МОД для переходов
0000 - возврат из подпрограммы
0001 - безусловный переход
0010 - N=0 (>=0)
0011 - N=l (<0)
0100 - Z=0 (<>0)
0101 - Z=l (=0)
0110 - N=1 or Z=l (<=0)
0111 - N=0 and Z=0 (>0)
1001 - вызов подпрограммы.
В. Важные кочанды с «короткой константой»
XX 10 0001 0000 ХХХХ - очистить oп l
ХХ 10 0010 0001 ХХХХ - +1 в оп 1
XX 11 0010 0001 ХХХХ - ****
или
ХХ 10 0011 0001 ХХХХ - -1 из oп l
XX 10 0100 0000 ХХХХ - сравнить 0 с oп 1
XX 11 0101 0001 ХХХХ - *(-1) оп1
ХХ 10 0111 0001 ХХХХ - oп l MOD 2 = => oп l
Г. Кодирование операндов
0 |
0000 |
R0 |
1000 |
резерв |
|
1 |
01 |
R1 |
01 |
резерв |
|
2 |
10 |
R2 |
10 |
резерв |
|
3 |
11 |
R3 |
11 |
резерв |
|
4 |
0100 |
(R0) |
1100 |
резерв |
|
5 |
01 |
(R1) |
01 |
константа |
|
6 |
10 |
(R2) |
10 |
адрес ОЗУ |
|
7 |
11 |
(R3) |
11 |
резерв |
ПРИМЕРЫ СИСТЕМ УПРАВЛЕНИЯ БАЗАМИ ДАННЫХ
СУБД DBASE
СУБД типа DBASE позволяют работать с реляционными базами данных (БД), структура которых состоит из трех элементов:
• число полей БД;
• характеристика каждого поля;
• число записей в БД.
Каждое поле имеет следующие характеристики:
Field name Type Width Dec
(имя поля) (тип) (ширина) (дес.знаки).
Field name - может состоять из набора символов, но без пробелов.
Type - в системах типа DBASE имеется 5 типов полей:
С (Character) - символьный (текстовый) тип;
N (Numerical) - числовой тип;
L (Logical) - логический тип;
D (Date) - поле дат, содержит даты в виде dd/mm/yy;
М (Memo) - поле памяти, содержит большой текст (файл).
Width - обозначает допустимую ширину поля.
Dec - используется для числовых полей и определяет точность
задаваемых чисел.
DBASE создает следующие типы файлов:
.dbf - файлы с записями БД;
.prg - файлы с текстами программ;
.frm - файлы структуры форматных отчетов;
.ndx - индексные файлы, сортирующие записи по определенному ключу;
.mem - файлы данных переменной Mem.
Запуск СУБД осуществляется из операционной системы ехе-файлом (db.exe, foxdb и т.п.), выход-командой .Quit.
Теперь опишем кратко основные команды СУБД.
Создание БД осуществляется командой Create.
Create (например, «Абитуриент»)
После ввода этой команды на экране появится форма:
Field name
(имя поля) .001 | Type
(тип) | Width
(ширина) | Dec
(дес.знаки). |
.001
В соответствии с этой формой создадим структуру таблицы:
001 ФИО, С, 18
002 год_рожд, С, 7
003 район. С, 13
004 адрес. С, 100
005 группа, С, 3
006 оценка 1,N,3
007 оценка2,N, 3
008 оценкаЗ,N, 3
Теперь можно начать заполнение таблицы записями.
В случае заполнения записями уже существующей базы данных, необходимо предварительно эту базу командой Use сделать активной:
.Use Абитуриент (use - использовать),
.Append (добавить)
Данные вводят в карточки, имеющие следующую форму:
Запись #00001
ФИО:
год_рожд:
район :
адрес:
группа:
оценка1:
оценка2:
оценка3:
Например,
Запись #00005
ФИО: Семенов Сергей Викторович
год_рожд: 1980
район: Туруханский
адрес: ул. Декабристов, д. 12, кв.23
группа: И2
оценка!: 5
оценка2: 4
оценкаЗ: 4
Запись можно ввести в определенное место БД, введя одну из команд:
.Insert (вставить)
или
.Insert before .
Перемещение по таблице и просмотр записей БД осуществляется командами:
Go
top - (идти наверх) установка указателя на первую запись,
Go
bottom - (идти вниз) установка указателя на последнюю запись;
List - (список) просмотр всех записей БД;
Display - (отобразить) просмотр записи, на которой находится указатель,
Browse - (просмотреть) помимо просмотра позволяет редактировать
записи БД.
Редактирование записей позволяют проводить следующие команды:
Edit N - редактирование записи с номером N;
Change - (поменять) изменения только в некоторых полях или записях,
удовлетворяющих заданным условиям;
Delete - (удалить) стирание ненужных записей;
Copy -(копировать) копирование записей.
Изменить структуру БД можно командой Modify. Ниже предложен перечень команд, осуществляющих обработку данных:
Report form
- (отчет, форма) создание отчетов;
Sort - (сортировка) упорядочение БД по какому-либо ключу;
Index - (индекс) индексирование БД;
Find - (найти) поиск в БД.
Работу с несколькими БД помогают вести команды:
Select - (выбор) сделать активной какую-либо БД;
Update - (расширить) передача данных из одной БД в другую;
Join to - (присоединить) соединение целых БД.
Для осуществления интерактивности БД используют команды ввода и вывода:
Wait - (ожидание) пауза, приостановка;
Input - (вход) ввод данных;
Say - (сказать) вывод информации;
Read - (читать) ввод данных.
СУБД Microsoft Access
Access - в переводе с английского означает «доступ». MS Access - это функционально полная реляционная СУБД. Кроме того, MS Access одна из самых мощных, гибких и простых в использовании СУБД. В ней можно создавать большинство приложений, не написав ни единой строки программы, но если нужно создать нечто очень сложное, то на этот случай MS Access предоставляет мощный язык программирования - Visual Basic Aplication.
Популярность СУБД Microsoft Access обусловлена следующими причинами:
• Access является одной из самых легкодоступных и понятных систем как для профессионалов, так и для начинающих пользователей, позволяющая быстро освоить основные принципы работы с базами данных;
• система имеет полностью русифицированную версию;
• полная интегрированность с пакетами Microsoft Office: Word, Excel, Power Point, Mail;
• идеология Windows позволяет представлять информацию красочно и наглядно;
• возможность использования OLE технологии, что позволяет установить связь с объектами другого приложения или внедрить какие-либо объекты в базу данных Access;
• технология WYSIWIG позволяет пользователю постоянно видеть все результаты своих действий;
• широко и наглядно представлена справочная система;
• существует набор «мастеров» по разработке объектов, облегчающий создание таблиц, форм и отчетов.
Запустить систему Access можно несколькими способами:
• запуск с помощью главного меню в WINDOWS 95;
• запуск с помощью ярлыка на панели инструментов.
После запуска системы появится главное окно Access, рис. 2.24. Здесь можно открывать другие окна, каждое из которых по-своему представляет обрабатываемые данные. Ниже приведены основные элементы главного окна Access, о которых необходимо иметь представление.
Рис.2.24. Экран СУБД Access
В строке заголовка отображается имя активной в данный момент программы. Строка заголовка главного окна Access всегда отображает имя программы MICROSOFT Access.
Пиктограмма системного меню - условная кнопка в верхнем левом углу главного окна практически любого приложения. После щелчка на этой пиктограмме появляется меню, ко.торое позволяет перемещать, разворачивать, сворачивать или закрывать окно текущего приложения и изменять его размеры. При двойном щелчке на пиктограмме системного меню работа приложения завершается.
Полоса меню
содержит названия нескольких подменю. Когда активизируется любое из этих названий, на экране появляется соответствующее подменю. Перечень подменю на полосе Access и их содержание изменяются в зависимости от режима работы системы.
Панель инструментов
- это группа пиктограмм, расположенных непосредственно под полосой меню. Главное ее назначение - ускоренный вызов команд меню.
Кнопки панели инструментов тоже могут изменяться в зависимости от выполняемых операций. Можно изменять размер панели инструментов и передвигать ее по экрану. Также можно отобразить, спрятать, создать новую панель инструментов или настроить любую панель инструментов.
В левой части строки состояния отображается информация о том, что вы делаете в настоящее время.
Окно базы данных
появляется при открытой базе данных. В нем сосредоточены все «рычат управления» базой данных. Окно базы данных используется для открытия объектов, содержащихся в базе данных, таких как таблицы, запросы, отчеты, формы, макросы и модули. Кроме того, в строке заголовка окна базы данных всегда отображается имя открытой базы данных.
С помощью вкладки
объектов можно выбрать тип нужного объекта (таблицу, запрос, отчет, форму, макрос, модуль). Необходимо сказать, что при открытии окна базы данных всегда активизируется вкладка-таблица и выводится список доступных таблиц базы данных. Для выбора вкладки других объектов базы данных нужно щелкнуть по ней мышью.
Условные кнопки, расположенные вдоль правого края окна базы данных, используются для работы с текущим объектом базы данных. Они позволяют создавать, открывать или изменять объекты базы данных.
К основным объектам Access относятся таблицы, запросы, формы, отчеты, макросы и модули.
Таблица - это объект, который определяется и используется для хранения данных. Каждая таблица включает информацию об объекте определенного типа. Как уже известно, таблица содержит поля (столбцы) и записи (строки). Работать с таблицей можно в двух основных режимах: в режиме конструктора и в режиме таблицы.
В режиме конструктора задается структура таблицы, т.е. определяются типы, свойства полей, их число и названия (заголовки столбцов). Он используется, если нужно изменить структуру таблицы, а не хранящиеся в ней данные. В этом режиме каждая строка верхней панели окна соответствует одному из полей определяемой таблицы.
Режим таблицы используется для просмотра, добавления, изменения, простейшей сортировки или удаления данных.
Чтобы перейти в режим таблицы, надо дважды щелкнуть мышью по имени нужной таблицы в окне базы данных (или, выделив в окне БД имя нужной таблицы, воспользоваться кнопкой открытого окна БД).
Из режима конструктора перейти в режим таблицы можно, щелкнув по кнопке таблицы на панели инструментов.
В режиме конструктора и в режиме таблицы перемещение между полями осуществляется с помощью клавиши ТАВ, а также вверх или вниз по записям с помощью клавиш, но в большинстве случаев пользоваться мышью гораздо удобнее.
Вследствие того, что в таблицах, как правило, содержится большое количество записей, размещение всех их на экране невозможно. Поэтом) для перемещения по таблице используют полосы прокрутки, расположенные в нижней и правой части окна. Левее нижней полосы прокрутки выводится номер текущей записи и общее число записей таблицы. Для перехода к записям с нужным номером необходимо активизировать поле Номера записи, щелкнув по нему, или нажать клавишу F5, после чего набрать на клавиатуре новый номер записи и затем нажать клавишу <Enter>.
Запрос - это объект, который позволяет пользователю получить нужные данные из одной или нескольких таблиц. Можно создать запросы на выбор, обновление, удаление или на добавление данных. С помощью запросов можно создавать новые таблицы, используя данные уже существующих одной или нескольких таблиц.
По сути дела, запрос - это вопрос, который пользователь задает Access о хранящейся в базе данных информации. Работать с запросами можно в двух основных
режимах: в режиме конструктора и в режиме таблицы.
Здесь надо вспомнить о том, что ответы на запросы получаются путем «разрезания» и «склеивания» таблиц по строкам и столбцам, и что ответы будут также иметь форму таблиц. В режиме конструктора формируется вопрос к базе данных.
Форма - это объект, в основном, предназначенный для удобного ввода отображения данных. Надо отметить, что в отличие от таблиц, з формах не содержится информации баз данных (как это может показаться на первый взгляд).
Форма - это всего лишь формат (бланк) показа данных на экране компьютера. Формы могут строиться только на основе таблиц или запросов. Построение форм на основе запросов позволяет представлять в них информацию из нескольких таблиц.
В форму могут быть внедрены рисунки, диаграммы, аудио (звук) и видео (изображение).
Режимы работы с формой:
•режим формы
используется для просмотра и редактирования данных; предоставляет дружественную среду для работы с данными и удобный дизайн их представления на экране;
•режим конструктора форм
необходим, если необходимо изменить определение
формы (структуру или шаблон формы, а не представленные в ней данные), надо открыть форму в режиме конструктора;
•режим таблицы
позволяет увидеть таблицу, включающую все поля формы; чтобы переключиться в этот режим при работе с формой, надо нажать кнопку таблицы на панели инструментов.
Отчет - это объект, предназначенный для создания документа, который впоследствии может быть распечатан или включен в документ другого приложения. Отчеты, как и формы, могут создаваться на основе запросов и таблиц, но не позволяют вводить данные.
Режимы работы с отчетом:
Режим предварительного просмотра
позволяет увидеть отчет таким, каким он будет воплощен при печати. Для того чтобы открыть отчет в режиме предварительного просмотра,надо
• щелкнуть по вкладке Отчеты,
• кнопкой выбрать необходимый отчет в окне базы данных;
• щелкнуть по кнопке Просмотра.
Режим конструктора
предназначен для изменения шаблона (структуры отчета).
Макрос - это объект, представляющий собой структурированное описание одного или нескольких действий, которые должен выполнить Access в ответ на определенное событие. Например, можно определить макрос, который в ответ на выбор некоторого элемента в основной форме открывает другую форму. С помощью другого макроса можно осуществлять проверку значения некоторого поля при изменении его содержания. В макрос можно включить дополнительные условия для выполнения или невыполнения тех или иных включенных в него действии.
Возможно также из одного макроса запустить другой макрос или функцию модуля.
Работа с формами и отчетами существенно облегчается за счет использования макрокоманд. В MS Access имеется свыше 40 макрокоманд, которые можно включать в макросы. Макрокоманды выполняют такие действия, как открытие таблиц и форм, выполнение запросов, запуск других макросов, выбор опций из меню, изменение размеров открытых окон и т.п. Макрокоманды позволяют нажатием одной (или нескольких одновременно) кнопки выполнять комплекс действий, который часто приходится выполнять в течение работы. С их помощью можно даже осуществлять запуск приложений, поддерживающих динамический обмен данных (DDE), например MS Excel, и производить обмен данными между вашей базой данных и этими приложениями. Один макрос может содержать несколько макрокоманд. Можно также задать условия выполнения отдельных макрокоманд или их набора.
Модуль - объект, содержащий программы на MS Access Basic, которые позволяют разбить процесс на более мелкие действия и обнаружить те ошибки, которые невозможно было бы найти с использованием макросов.
Завершив работу с Access (или с ее приложением), надо корректно закончить сеанс. Простое выключение компьютера - плохой метод, который может привести к возникновению проблем. При работе WINDOWS приложения используют множество файлов, о существовании которых пользователь может даже не подозревать. После выключения машины эти файлы останутся открытыми, что в будущем может сказаться на надежности файловой системы жесткого диска.
Безопасно выйти из Access можно несколькими способами:
• двойным щелчком мыши на пиктограмме системного меню в строке заголовка главного окна Access;
• из меню Access выбором пункта Файл Выход,
• нажатием комбинации клавиш Alt + F4.
ПРИНЦИПЫ ФОРМИРОВАНИЯ ИЗОБРАЖЕНИЙ НА ЭКРАНЕ
Существует два способа реализации построения изображений на экране дисплея -векторный
(функциональный) и растровый. В первом случае электронный луч поочередно рисует на экране различные знаки - элементы изображения. На современных персональных компьютерах чаще используется растровый способ изображения графической информации, в котором изображение представлено прямоугольной матрицей точек (пикселов), имеющих свой цвет из заданного набора цветов (палитры). Графический режим осуществляет видеоадаптер, управляющий работой электронной трубки и видеопамятью, в которой запоминается текущее изображение. Адаптер обеспечивает регулярное отображение видеопамяти на экране монитора.
Растровое изображение
- это совокупность разноцветных точек. Координаты точек определяются декартовой (прямоугольной) системой с началом координат, как правило, в левом верхнем углу экрана. Абсцисса х точки увеличивается слева направо, ордината у
- сверху вниз. Таким образом, любая графическая операция сводится к работе с отдельными точками экрана монитора - пикселами. Существуют специальные графические библиотеки программ, которые предназначены для изображения более сложных объектов, являющихся объединением группы пикселов: наиболее употребимые линии, геометрические фигуры, шрифты и т.п.
Большинство языков программирования имеют свои стандартные графические библиотеки. Так, у Бейсика графические команды являются встроенными; системы программирования Турбо-Паскаль содержат графическую библиотеку (модуль Graph, tpu), имеющую в своем составе процедуры и функции обработки простейших графических образов. Тем не менее, многие программисты и разработчики программ предпочитают создавать свои библиотеки графических подпрограмм в соответствии со спецификой своей работы.
В последние годы возрос интерес со стороны пользователей к специальным инструментальным программам машинной графики: графическим редакторам, издательским системам и т.п. В них предоставляется удобный интерфейс для пользователей, автоматизируется большое количество разнообразных действий с графической информацией - от построения простейших рисунков до создания мультипликационных (анимационных) роликов.
Вывод изображения на экран дисплея и разнообразные действия с ним требуют геометрической грамотности, интуиции. Моделирование образной информации на экране дисплея развивает наблюдательность, пространственное воображение, геометрическую интуицию, конструкторские и изобретательские навыки.
ПРИНЦИПЫ ПОСТРОЕНИЯ ИНТЕГРИРОВАННЫХ ПРОГРАММНЫХ СИСТЕМ
Программные средства, подробно описанные в предыдущих разделах - системы подготовки текстов и машинной графики, базы данных и электронные таблицы -зачастую не могут удовлетворить запросов пользователей в силу того, что бывает необходимо использовать возможности каждого из них одновременно, в комплексе.
Типичной является ситуация, когда данные, полученные из базы данных, необходимо обработать средствами табличного процессора, представить графически, в виде диаграммы того или иного вида, а затем вставить в текст. Для выполнения работ такого типа существуют, так называемые, интегрированные пакеты - программные средства, совмещающие возможности, характерные в отдельности для текстовых редакторов, графических систем, электронных таблиц, баз данных (и других программных средств). Конечно, такое совмещение возможностей достигается за счет компромисса. Некоторые возможности оказываются в интегрированных пакетах ограниченными или реализованными не в полной мере. Это касается, в первую очередь, богатства команд обработки базы данных и электронной таблицы, их размеров, макроязыков. Однако преимущества, создаваемые единым интерфейсом объединенных в интегрированном пакете программных средств, неоспоримы. Многие ведущие мировые фирмы, выпускающие программное обеспечение, создали и продолжают развивать свои интегрированные пакеты. Так, фирма «Microsoft» развивает интегрированный пакет Works, известны пакеты Open Access фирмы «Open Access», FrameWork фирмы «Ashton-Tate», Lotus 1-2-3 и Symphony фирмы «Lotus Development Corporation».
Системы Symphony, KnowledgeMan позволяют рассматривать элементы записей в БД, тексты и ячейки электронной таблицы как единое целое: сохраняя на экране одни и те же данные, можно просто как бы менять на них точку зрения, переходя из электронной таблицы в редактор и т.п. В системах предусмотрен многооконный интерфейс: при работе пользователь, переходя из одного окна в другое, меняет «среду», выполняет операции поиска в БД, использует редактор текста и т.д.
Необычно построение системы FrameWork. Все компоненты системы рассматриваются как фреймы - упорядоченные наборы информации, причем пользователь может дробить фреймы на набор фреймов более низкого порядка и т.п. Например, в поле текста можно вставить метку, указывающую на то, что в этом месте должен располагаться участок данных из электронной таблицы, график и пр. Эти фреймы можно будет описать позже, а затем «собрать» все фреймы в единый документ. В системе имеется свой язык программирования Fred.
В интегрированную систему «Мастер» отечественной разработки включены текстовый процессор «Лексикон», процессор электронных таблиц, БД. графический процессор. Кроме того, есть возможность писать программы на языке «Мастер». В этот язык включены функции работы с ячейками электронных таблиц, окнами экрана (рамками), функциями, определенными внутри подсистем. Таким образом, с помощью системы «Мастер» существует возможность сформировать свою версию интегрированной системы, поддерживающую необходимые в данном конкретном приложении функции. Система «Мастер» является примером разумно построенной интегрированной системы, работа с ней естественна и удобна. С помощью этой системы ведется разработка различных информационных систем.
Ограничимся рассмотрением одной из популярных в настоящее время интегрированных систем - Works. По мнению специалистов, этот пакет обладает наиболее наглядным и простым в освоении интерфейсом, полно реализующим основные функции обработки текстов, таблиц и баз данных, а также телекоммуникации по коммутируемым каналам.
ПРОЦЕДУРЫ И ФУНКЦИИ
Описание и вызов. В Паскале подпрограммы называются процедурами и функциями и описываются в разделе с тем же названием.
Процедура имеет такую же структуру, как и программа, но с двумя отличиями:
• заголовок процедуры имеет другой синтаксис и включает служебное слово procedure;
• описание процедуры заканчивается точкой с запятой (а не точкой). Все имена, описанные в программе до процедуры, действуют во всей программе и в любой ее подпрограмме (если они там не описаны заново). Они называются глобальными, в отличие от локальных имен, описанных в процедуре и действующих лишь в ней.
Данные для обработки могут передаваться процедуре через глобальные имена или через аргументы процедуры. В процедуре каждый аргумент имеет свое имя -формальный параметр, описываемый в заголовке процедуры по схеме
procedure <имя> (<список описаний формальных параметров>) Описание формальных параметров может иметь вид
<список имен>: <тип> или var <список имен>: <тип>
В первом случае говорят о параметрах-значениях, во втором - о параметрах-переменных. В простейшем случае заголовок процедуры может содержать только имя процедуры.
Оператор вызова процедуры имеет вид
<имя процедуры> (<список выражений>);
Указанные выражения называют фактическими параметрами. Их список должен точно соответствовать списку описаний формальных параметров процедуры. Во время вызова процедуры каждому параметру-значению присваивается значение соответствующего фактического параметра и поэтому их обычно используют для передачи входных данных.
Параметры-переменные следует использовать для представления результатов процедуры.
Пример: составим программу, которая с помощью строки символов разделит экран на части, где напечатает таблицу квадратных корней для чисел 1, 2,..., 10 и таблицу натуральных логарифмов для чисел 1, 2,..., 5.
Печать строки символов оформим как процедуру. Так как никакую информацию передавать из процедуры в программу не надо, то аргументы процедуры (вид и количество символов) будут описаны как параметры-значения.
Заметим, что процедура в программе выполняется пять раз.
Программа 18
program section;
var x:integer;
procedure line(a:integer;c:char) ;
var j:integer;
begin
for j:=l to a do write (c);
writeln
end;
begin
line(35,'-'); writeln('таблица квадратных корней');
line(35,'-');
for x:=l to 10 do writeln(x:8,sqrt(x):8,4);
line (35,'-'); writein('таблица натуральных логарифмов');
line(35,'-');
for x:=l to 5 do writein(x:8,In(x):8:4);
line(35,'*')
end.
Функция - это подпрограмма, определяющая единственное скалярное, вещественное или строковое значение. Отличия подпрограммы-функции от процедуры:
• заголовок функции начинается со служебного слова function и заканчивается указанием типа значения функции:
function <имя> (список описаний формальных параметров): <тип>;
•раздел операторов функции должен содержать хотя бы один оператор присваивания имени функции;
• обращение к функции - не оператор, а выражение вида
<имя функции> (<список фактических параметров>).
Функции (и процедуры) могут использовать свое имя в собственном описании, т.е. могут быть рекурсивными.
Пример: составим программу, которая для заданных четырех натуральных чисел а, b, с, d напечатает наибольшие общие делители первой и второй пар чисел и сравнит их по величине.
В программе определим рекурсивную функцию nod(x,y) по формулам
|
x, если у = 0
nod(x,y) = | nod(y.x). если х < у
| nod(x mod у,у), если х > у
Применяя эти формулы к числам 21 и 15, последовательно находим nod(21,15) = nod(6,15) = nod(15,6) = nod(3,6) = nod(6,3) = nod(0,3) = nod(3,0) = 3.
Программа 19
program four;
var a,b,c,d,m,n:integer;
function nod(x,у:integer):integer;
var h:integer;
begin
if y=0 then h:=x
else if x<y then h:=nod(y,x)
else h:=nod(x mod у, у);
nod: =h end;
begin
writeln('введите 4 натуральных числа');
read(а,Ь,с,d); writeln;
m:=nod(a,b); n:=nod(c,d);
writeln('нод(',а,',',b,')=',m);
writeln('нод(',c,',',d,')=',n);
if m>n then writeln('первый > второго')
else if m<n then writeln ('первый < второго')
else writeln('нод пар равны') end.
Внешние библиотеки.
Как известно, подпрограммы (процедуры и функции) используются в программах с целью их структурирования, а также при многократных повторениях некоторых частей программы. Процедуры и функции описываются в программных единицах в разделе описания подпрограмм. Они являются внутренними для этих программных единиц.
Бывают случаи, когда одни и те же подпрограммы могут использоваться в различных программах одного и даже нескольких пользователей. В подобных ситуациях целесообразно создавать внешние подпрограммы, которые можно в необходимый момент подключать в любые программы. Как правило, внешние подпрограммы объединяют в отдельные пакеты, так называемые, библиотеки внешних подпрограмм. Могут создаваться личные библиотеки, специализированные библиотеки коллективного пользования и др. С одной из таких библиотек - встроенной библиотекой стандартных подпрограмм - пользователи имеют дело практически всегда. В состав этой библиотеки входят процедуры и функции вычисления значений ряда элементарных функций: синуса, косинуса, экспоненты и т.д., процедуры и функции обработки символьных величин, процедуры ввода-вывода и др. (список их приведен в конце § 3). Встроенная библиотека подключается к любой программе автоматически при компиляции. Поэтому откомпилированный файл с расширением .corn (иногда называемый «комовским»), как правило, занимает в 8 -10 раз больше места в памяти, чем исходный текст.
Внешние подпрограммы создаются обычным образом в виде отдельного файла или файлов. Для подключения внешних подпрограмм в программе пользователя в разделе описания ставится директива $I имя файла. С этого момента все процедуры и функции внешнего файла становятся внутренними для программы, и на все входящие в него процедуры и функции распространяется правило локальных и глобальных переменных. В этой связи, директива подключения внешнего файла должна размещаться после описания всех ею используемых глобальных параметров, процедур и функций.
Пример. Создадим внешнюю библиотеку из двух процедур и одной функции. Первая процедура программы 20 очищает экран, выдает приветствие, затем после нажатия клавиши <Пробел> снова очищает экран. Вторая процедура возводит число а в степень b. Третья подпрограмма-функция вычисляет значение экспоненты с некоторым грубым приближением на основе ряда Тейлора.
Программа 20
procedure PRIVET;
var a: char;
begin
cirscr; gotoxy(20,10) ;
write('здравствуйте , желаю успехов !') ;
repeat (цикл позволяет)
gotoxy(35,50);write('пробел'); (сменить экран}
read(kbd,а); (по нажатию клавиши)
until а=' '; (* 'пробел' )
cirscr;
end;
procedure STEPEN(a,b:real;var y:real);
begin
y:=exp(b*ln(a)) ;
end;
function MEXP(x:real):real;
begin
mexp:=l+x+x*x/2+x*x*x/6+x*x*x*x/24;
end;
Пусть представленные три подпрограммы записаны в файл с именем lab.pas. А теперь составим программу, использующую созданную внешнюю библиотеку.
Программа 21
program primeri;
($i lab) (директива подключения библиотеки} var a,b : real;
begin
PRIVET;
STEPEN(2,4,a); writeln('2 в степени 4 =',a); b:=MEXP(l);
write('машинная exp(1)=',EXP(1):6:4,' моя
exp(1)=',b:6:4);
end.
В программе используется стандартная функция - экспонента ЕХР(1) и наша подпрограмма МЕХР(1).
Модули используют в более поздних версиях Паскаля для создания библиотек и разделения больших программ на логически связанные независимые друг от друга составные части. В состав модуля входят следующие разделы: заголовок, интерфейс, реализация, инициализация. Заголовок необходим для ссылок на модуль. Интерфейс содержит объявления, включая процедуры и функции, представленные списком заголовков и доступные пользователям в теле основной программы. Раздел «реализация» содержит тела процедур и функций, перечисленных в интерфейсной части модуля. Раздел «инициализация» содержит операторы, необходимые для инициализации модуля. Таким образом модуль - это набор констант, типов данных, переменных, процедур и функций.
Каждый модуль компилируется отдельно; результат компилляции - файл с расширением .tpu (Turbo Pascal Unit). Каждый элемент модуля можно использовать в программе пользователя без дополнительного объявления, для чего достаточно записать имя используемого модуля в директиве Uses в начале программы после его заголовка.
В Турбо-Паскале версии 5.0 и выше применяют стандартные модули CRT, GRAPH и др. В этих модулях содержатся сервисные процедуры и функции по работе с экраном дисплея, с клавиатурой, графическими примитивами и т.п. Модули подключаются к программе путем специальной команды, размещаемой сразу после заголовка:
uses <имя модуля>
Программист может сам создать модуль. Ниже приведен пример с соответствующими комментариями.
Пример. Создать модуль, дополняющий математические возможности Паскаля арифметическими действиями над комплексными числами.
Будем представлять комплексные числа парами действительных: (а, b). Как известно, действия над ними выполняются по правилам
(a,b) + (c.d) = (a+c,b+d),
(a,b)-(c,d)=(a-^,b-d),
(a,b) * (c,d) = (a*c-b*d , a*d+b*c),
(a,b) / (c,d) = ( (a*c+b*d)/(c*c+d*d), (b*c-a*d)/(c*c+d*d)).
Создаваемый модуль будет включать четыре процедуры: Sum - сумма, Raz -разность, Proiz - произведение, Chastn - частное.
Этот модуль может быть отдельно откомпилирован. После этого любая программа, написанная на Паскале, может получить доступ к интерфейсным объектам (в данном случае - процедурам) этого модуля с помощью директивы Uses CompChisla.
Обратим внимание, что в интерфейсной части модуля от процедур присутствуют лишь заголовки, а в части «реализация» от заголовков процедур остаются лишь их имена.
Программа 22
unit CompChisla;
interface
procedure Sum(a,b,c,d: real; var x,y: real);
procedure Raz(a,b,c,d: real; var x,y: real);
procedure Proiz (a,b,c,d: real; var x,y:
real);
procedure Chstn(a,b,c,d: real; var x,y:
real);
implementation
procedure Sum;
begin x:=a+c;
y:=b+d end;
procedure Raz;
begin x:=a-c; y:=b-d end;
procedure Proiz;
begin x:=a*c-b*d; y:=a*d+b*c
end;
procedure Razn;
var z:real;
begin z:= c*c+d*d; x:=(a*c+b*d)/z; y:=(b*c-a*d)/z end;
end.
Контрольные вопросы
1. Какова структура процедуры? функции?
2. Какие параметры называют формальными и какие - фактическими?
3. В чем различие между локальными и глобальными переменными?
4. В чем сходство и различие между процедурой и модулем?
ПРОЕКТИРОВАНИЕ БАЗ ДАННЫХ
Рассмотрим вопрос о проектировании баз данных. К любой базе данных возможен подход на каждом из следующих трех уровней (рис. 6.6):
• на уровне представлений данных конечного пользователя или прикладного программиста (внешнего представления);
• на уровне концептуального представления данных (представления администратора);
• на уровне внутреннего представления данных (с позиции системного программиста) или представления реализации.
Под представлением данных понимаются правила организации и кодирования данных.
Представление данных конечного пользователя (внешнее представление) является совокупностью требований к данным со стороны некоторой конкретной задачи или программы.
Для конечного пользователя внешнее представление является совокупностью спецификаций и реальных форматов данных, отражающих конкретные информационные потребности при решении некоторой задачи (проблемы). Представление прикладного программиста отображает элементы данных и их взаимосвязи так, что из данных, хранящихся в базе, может извлекаться скрытая в них информация (например, возраст человека по дате рождения и текущей дате).
Рис. 6.6. Трехуровневое представление данных в концепции ANSI/SPARC '
Так как с данными обычно работают многие пользователи и прикладные программисты, имеется множество частично перекрывающихся внешних представлений данных.
Концептуальное представление данных является интегрированным определением данных на основе объединения внешних представлений данных для всей совокупности приложений, т.е. достаточно полной моделью предметной области. Структура данных на концептуальном уровне называется концептуальной схемой и описывает семантику данных.
Внутреннее (физическое) представление, или представление реализации, выражает представление данных системными программистами и связано с организацией хранения данных на физических носителях информации (запоминающих устройствах) и их обработкой. Основными понятиями внутреннего представления являются физические блоки, хранимые записи, указатели и т.д.
Внутреннее представление обеспечивает доступ к данным на логическом уровне и скрывает от прикладных программистов и пользователей многие технические детали манипулирования данными и методов доступа к ним.
Наибольший интерес для нас представляет концептуальное представление данных, связанное с развитой в 70-80-е годы теорией баз и банков данных и направленное на унификацию данных и уменьшение избыточности при интегрировании внешних представлений в концептуальное.
Концептуальное представление основано на определенной модели данных. Этот термин, впервые введенный в 70-х годах основоположником теории баз данных Дж.Коддом, в современной трактовке отображает совокупность правил порождения структур данных в базах данных, последовательности их изменения. Различают три основные типа модели данных: иерархический, сетевой и реляционный, рассмотренные ранее в гл. 2.
Модель данных предопределяет множество выводимых допустимых типов данных и отношений между ними и является основой для построения модели конкретной базы данных.
Модель базы данных является средством интерпретации содержимого базы данных и реализации операции по обработке и управлению данными.
Проектирование баз данных представляет собой длительный, трудоемкий и слабоформализованный процесс, от которого зависит жизнеспособность и эффективность проектируемой базы данных, ее способность к развитию. Важную роль при проектировании базы данных играет методология построения концептуальных моделей предметной области, включающая методы и средства, позволяющие спроектировать базу данных, удовлетворяющую заданным целям и требованиям пользователей и прикладных программистов.
Такими средствами моделирования являются системный анализ, методы экспертных оценок, с помощью которых в концептуальной модели совмещаются концептуальное представление объективно существующей предметной области и концептуальное представление субъективных информационных требований к данным со стороны пользователей и прикладных программистов.
В недавнем прошлом процесс проектирования баз данных был ориентирован, в основном, на требования пользователей и прикладных программистов (ПП-информация) и учитывал текущие или предвидимые приложения.
В этом случае база данных создавалась сравнительно легко и быстро. Однако такие базы данных оказывались неприспособленными к обработке неформализованных, изменяющихся, не предвиденных ранее запросов и приложений, не имели стимулов к дальнейшему развитию. Поэтому важную роль при проектировании стала играть информация о предметной области (ПО-информация), не зависящая напрямую от существующих приложений и обеспечивающая гибкость, адаптивность и универсальность данных, пригодность всей системы к развитию и использованию для незапланированных будущих приложений.
Современная методология проектирования баз данных и построения концептуальных моделей основывается на одновременном учете ПО- и ПП-информаций. ПО-информация в этом случае используется для построения первоначальной информационной структуры данных, а ПП-информация - для совершенствования последней с целью повышения эффективности обработки данных.
Процесс построения концептуальной модели разделяется на следующие этапы:
1) сбор и содержательный анализ априорной информации о предметной области и прикладных задачах пользователей;
2) концептуальный анализ данных и синтез концептуальной модели.
На этапе сбора данных проводятся наблюдения и измерения, собираются отчеты и различные документы, интервьюируются специалисты в данной предметной области, выявляется перечень задач организации и ее структурных подразделений. Сбор информации начинается с определения сферы применения базы данных. Сфера применения базы данных должна определяться независимо от прикладных задач и охватывать все функциональные подразделения организации. Для этого проводятся собеседования с руководством организации с целью выявления отделов данной организации и внешних организаций, связанных с информационным обеспечением текущих и планируемых прикладных задач, а также возможных в будущем изменений в деятельности организации. Далее проводятся дополнительные собеседования в подразделениях организации с целью выявления совместно используемых данных.
На этом же этапе собранные данные анализируются на предмет устранения дублирования и противоречивости данных, неоднозначности их определений и описаний, выявляются и формулируются правила обработки информации и принятия решений.
Составляется список данных, требуемых для выполнения каждой из производственных или управленческих функций, а также формулируются явные и неявные правила, определяющие, как и когда выполняется каждая функция.
Результатом данного этапа являются
1) список всех создаваемых и используемых элементов данных;
2) перечень прикладных задач, их характеристик и используемых в них данных;
3) список принимаемых решений в управлении организацией или процессами, а также условий и правил их принятия;
4) список возможных будущих изменений в деятельности и их влияний на принятие решений.
На этапе концептуализации собранной информации выявляются элементы предметной области, их свойства и взаимосвязи, затем синтезируется структура концептуальной модели базы данных. Наиболее известными подходами концептуализации являются анализ сущностей и представление знаний.
Так как собранная на предыдущем этапе информация является плохо структурированной, для ее концептуального анализа необходимо использовать методы системного и классификационного анализа, являющиеся универсальными инструментами организации неформализованного знания.
На первом шаге анализа ПО-информацин предметная область разбивается на несколько относительно слабо связанных между собой подобластей. Связи между элементами внутри каждой подобласти являются сильными и реализуют логические отношения типа «род - вид», «целое - часть».
Следующим шагом анализа является декомпозиция каждой подобласти, вычленение компонент (подсистем, частей) и видов (подклассов), связанных такими же отношениями с объектами соседних уровней иерархии.
Декомпозиция должна
• быть направлена на выделение элементов предметной области, существенных с точки зрения прикладных задач базы данных;
• приводить к вычленению элементов, свойства которых могут быть описаны с помощью собранных на первом этапе элементов данных;
• прекращаться при достижении уровня иерархии, исчерпывающего собранную априорную информацию об элементах данных.
Следующим шагом концептуального анализа ПО является анализ существенных свойств и взаимосвязей элементов, выделенных на стадии декомпозиции, а также формулирование и наполнение этих свойств с помощью выявленных ранее элементов данных. При этом собственные свойства элементов рассматриваются как атрибуты, а взаимосвязи между элементами - как k-арные отношения.
Синтез информационной структуры концептуальной модели проводится как композиция (сборка) структуры с учетом связей между частями.
В последние годы мощным инструментом организации плохо структурированных знаний и построения концептуальных моделей сложных предметных областей стал, так называемый, системный анализ. В основе системного анализа лежат принципы системного подхода, являющиеся методологией современного социально-научного познания и социальной практики, составляющие трактовку любого рассматриваемого объекта как системы. Системой называется совокупность элементов, находящихся в существенных отношениях и связях друг с другом. Существенность связей означает, что совместно элементы системы приобретают новое свойство (или функцию), которым не обладает ни один из элементов сислемы в отдельности. Этим система отличается от сети - совокупности элементов, несущественно связанных между собой, свойства или функции любого элемента сети не зависят от других ее элементов. Появление нового свойства системы, не сводимого к свойствам ее элементов, выражается понятием эмерджентности (целостности).
В качестве основных принципов системного подхода при построении моделей используются
• рассмотрения объекта с различных точек зрения, выявления аспектов изучаемого объекта с учетом их взаимосвязи;
• расчленения объекта на более простые подсистемы (основанием для введения подсистем является то, что связи между подсистемами много слабее, чем между элементами внутри подсистемы, а каждая подсистема много проще, чем вся система в целом);
• выделения иерархических отношений типа «целое - часть» между компонентами системы разных уровней и отношений эквивалентности между компонентами одного уровня.
Системный анализ - это применение системного подхода при обработке конкретной информации и принятию решений. Рассмотренные принципы системного подхода являются и принципами системного анализа.
Их дополняют следующие специфические принципы:
• анализ любого процесса принятия решения должен начинаться с выявления и четкой формулировки целей (желаемых результатов деятельности), которые часто определяются на основе рассмотрения системы более высокого уровня;
• необходимо рассматривать лишь те цели, вероятность достижения которых р>р0
за время l<t0,где p0 и t0 - пороги осуществимости цели.
Данные специальные принципы предполагают некую системную стратегию анализа, требующую рассмотрения не только самой системы, но и внешней по отношению к ней среды (надсистемы или метасистемы), и определение границы между ними.
Перспективой развития документальных информационно-поисковых систем и баз данных являются банки знаний, новая концепция информационной системы, использующая результаты исследований и разработок в области искусственного интеллекта.
ПРОЕКТИРОВАНИЕ ПРОГРАММ
В предыдущем разделе, посвященном языку Паскаль, приведено немало примеров программ. Однако, при анализе готовой программы чаще всего не ясно, как разработчики к ней пришли. В этом разделе рассказывается об общих моментах в технологии программирования. Конечно, при разработке небольших учебных программ не все элементы этой технологии следует отрабатывать (да это и не всегда возможно по-существу), однако само ее существование должно быть осознано.
Современный подход к проектированию программ основан на декомпозиции задачи, которая в свою очередь основана на использовании абстракций. Целью при декомпозиции является создание модулей, которые представляют собой небольшие, относительно самостоятельные программы, взаимодействующие друг с другом по хорошо определенным и простым правилам. Если эта цель достигнута, то разработка отдельных модулей может осуществляться различными людьми независимо друг от друга, при этом объединенная программа будет функционировать правильно.
Различают абстракцию через параметризацию и через спецификацию. Смысл абстракции через параметризацию в том, что одним алгоритмом можно решать задачи, отличающихся различными исходными данными, задаваемыми как параметры. Смысл абстракции через спецификацию в том, что разными алгоритмами можно получить один и тот же искомый результат. При этом описываются результаты работы программы, смысл обращения к программе становится ясным через анализ ее спецификации, а не самого текста программы.
Разработка любой программы или программной системы начинается с определения требований к ней для конкретного набора пользователей и заканчиваете," эксплуатацией системы этими пользователями.
Существуют различные подходы и технологии разработки алгоритмов и программ. Хотя программирование в значительной степени искусство, тем не менее. можно систематизировать и обобщить накопленный профессиональный опыт. По современным взглядам проектирование и разработку программ целесообразнс разбить на ряд последовательных этапов:
1)постановка задачи;
2) проектирование программы;
3) построение модели;
4) разработка алгоритма;
5) реализация алгоритма;
6) анализ алгоритма и его сложности;
7) тестирование программы;
8)документирование.
Кратко остановимся на каждом из этих этапов.
При постановке задачи для крупных компьютерных программ необходимо провести следующие работы:
• выработать требования (свойства, качества и возможности), необходимые для решения проблемы или достижения цели (как правило, эта деятельность носит экспертный характер);
• разработать спецификации, включающие:
• цель программы;
• граничные условия;
• описание функций системы;
• спецификации входных и выходных данных;
• верификационные требования (установление тестовых случаев);
• тип и количество документов.
В ходе этой работы выявляются свойства, которыми должна обладать система в конечном виде (замысел), описываются функции системы, характеристики интерфейса.
Чтобы приступить к решению задачи необходимо точно ее сформулировать. В первую очередь, это означает определение исходных и выходных данных, т.е. ответы на вопросы: а) что дано; б) что нужно найти. Дальнейшая детализация постановки задачи представляет собой ответы на серию вопросов такого рода:
• как определить решение;
• каких данных не хватает и все ли они нужны;
• какие сделаны допущения и т.п.
Проектирование программы.
Сначала производится проектирование архитектуры программной системы. Это предполагает первичную (общую) стадию проектирования и заканчивается декомпозицией спецификаций в структуру системы. Обычно на модульном уровне по каждому модулю разрабатывается спецификация модуля:
• имя/цель - дается имя модулю и предложение о функции модуля с формальными параметрами;
• неформальное описание - обзор действий модуля;
• ссылки - какие модули ссылаются на него и на какие модули ссылается данный модуль;
• вход/выход - формальные и фактические параметры, глобальные, локальные и связанные (общие для ряда модулей) переменные;
• примечания - полезные комментарии общего характера по модулю.
Следующим шагом является детальное проектирование. На этом этапе происходит процедурное описание программы, выбор и оценка алгоритма для реализации каждого модуля. Входной информацией для проектирования являются требования и спецификации системы.
Для проектирования программ существуют различные подходы и методы. Современный подход к проектированию основан на декомпозиции, которая, в свою очередь, основана на использовании абстракции. Целью при декомпозиции является создание модулей, которые взаимодействуют друг с другом по определенным и простым правилам. Декомпозиция используется для разбиения программы на компоненты, которые затем могут быть объединены.
Методы проектирования архитектуры делятся на две группы:
1) ориентированные на обработку и
2) ориентированные на данные.
Методы, ориентированные на обработку,
включают следующие общие идеи.
а) Модульное программирование. Основные концепции:
• каждый модуль реализует единственную независимую функцию;
• имеет единственную точку входа/выхода;
• размер модуля минимизируется;
• каждый модуль разрабатывается независимо от других модулей;
• система в целом построена из модулей. Исходя из этих принципов каждый модуль тестируется отдельно, затем после кодирования и тестирования происходит их интеграция и тестируется вся система.
б) Функциональная декомпозиция.
Подобна стратегии «разделяй и управляй». Практически является декомпозицией в форме пошаговой детализации и концепции скрытия информации. Каждый модуль характеризуется субъективным решением проектировщика, связь осуществляется с помощью хорошо организованных интерфейсов.
в) Проектирование с использованием потока данных.
Использует поток данных как генеральную линию проектирования программы. Содержит элементы структурного проектирования сверху-вниз с пошаговой детализацией:
• экспертиза потоков данных и отображение графа потока данных;
• анализ входных, центральных и выходных преобразующих поток данных элементов;
• формирование иерархической структуры программы;
• детализация и оптимизация структуры программы.
г) Технология структурного анализа проекта.
Основана на структурном анализе с использованием специальных графических средств построения иерархических функциональных связей между объектами системы. Эффективна на ранних стадиях создания системы, когда диаграммы просты и читаемы.
Методы проектирования, основанные на использовании структур данных,
описаны ниже.
а) Методология Джексона.
Здесь структура данных - ключевой элемент в построении проекта. Структура программы определяется структурой данных, подлежащих обработке. Программа представляется как механизм, с помощью которого входные данные преобразуются в выходные. В методе предусматривается:
• разработка и изображение структуры входных и выходных данных;
• изображение структуры программы путем соединения изображений этих структурных элементов:
• определение дискретных операций над структурами данных;
• построение алгоритмов обработки структур данных.
б) Методология Уорнера.
Подобна предыдущей, но процедура проектирования более детализирована. Используются следующие виды представления проекта:
• диаграммы организации данных (описывают входные и выходные данные);
• диаграммы логического следования (логический поток этих данных);
• список инструкций (команды, используемые в проекте);
• псевдокод (описание проекта);
• определение входных данных системы;
• организация входных данных в иерархическую структуру;
• детальное определение формата элементов входного файла;
• то же самое для выходных данных;
•спецификация программы: чтение, ветвление, вычисление, выходы, вызови подпрограмм;
• составление диаграммы (по типу блок-схем) указывающие логическую последовательность инструкций.
в) Метод иерархических диаграмм.
В этом методе определяется связь между входными, выходными данными и процессом обработки с помощью иерархической декомпозиции системы (без детализации). По сути используются три элемента: вход, обработка, выход.
Алгоритм проектирования по этому методу заключается в следующих шагах:
• начать с наивысшего уровня абстракции, определив вход, выход, обработку;
• соединить каждый элемент входа и выхода с соответствующей обработкой;
• документировать каждый элемент системы, используя диаграммы;
• детализировать диаграммы, используя шаги 1 - 3.
г) Объектно-ориентированная методология проектирования.
Основана на концепции упрятывания информации и абстрактных типов данных. Рассматриваются данные, модули и системы в качестве объектов. Каждый объект содержит некоторую структуру данных с набором процедур, знающих как работать с этими данными. По этой методологии создаются абстракции по заданной проблемной области:
·
определение проблемы;
· развитие неформальной стратегии, удовлетворяющей требованиям к системе;
· формализация стратегии;
· создание объектов и их атрибутов;
· определение операций над объектами;
· установка интерфейсов;
· реализация операций.
Построение модели в большинстве случаев является непростой задачей. Чтобы приобрести опыт в моделировании, необходимо изучить как можно больше известных и удачных моделей.
При построении моделей, как правило, используют два принципа: дедуктивный (от общего к частному) и индуктивный (от частного к общему).
Рис. 3.3. Схема построения модели при дедуктивном способе
При дедуктивном подходе (рис.3.3) рассматривается частный случай общеизвестной фундаментальной модели. Здесь при заданных предположениях известная модель приспосабливается к условиям моделируемого объекта. Например, можно построить модель свободно падающего тела на основе известного закона Ньютона та = mg - Fcoпp и в качестве допустимого приближения принять модель равноускоренного движения для малого промежутка времени.
Рис. 3.4. Схема построения модели при индуктивном способе
Индуктивный способ (рис.3.4) предполагает выдвижение гипотез, декомпозицию сложного объекта, анализ, затем синтез. Здесь широко используется подобие, аналогичное моделирование, умозаключение с целью формирования каких-либо закономерностей в виде предположений о поведении системы.
Технология построения модели при индуктивном способе:
1) эмпирический этап
• умозаключение;
• интуиция;
• предположение;
• гипотеза.
2) постановка задачи для моделирования;
3) оценки; количественное и качественное описание;
4) построение модели.
Разработка алгоритма - самый сложный и трудоемкий процесс, но и самый интересный в творческом отношении. Выбор метода разработки зависит от постановки задачи, ее модели. (О некоторых приемах и методах разработки алгоритмов говорилось ранее в гл. 1 и будет сказано в следующих разделах данной главы.) На этом этапе необходимо провести анализ правильности алгоритма, что очень непросто и трудоемко. Наиболее распространенная процедура доказательства правильности алгоритма - это прогон его на множестве различных тестов. Однако, это не гарантирует того. что не может существовать случая, в котором программа «не сработает». В общей методике доказательства правильности алгоритма предполагают, что алгоритм описан в виде последовательности шагов. Для каждого шага предлагается некое обоснование его правильности для всех подходящих входных (условиях до данного шага) и выходных данных (условиях после этого шага). Затем предлагается доказательство конечности алгоритма с окончательными исходными входными и выходными данными.
На этапе реализации алгоритма происходит конструирование и реализация алгоритма, включая:
• кодирование;
• интеграцию;
• тестирование (сертификацию).
По сути проводится перевод проекта в форму программы для конкретного компьютера, сборка системы и ее прогон при тестовых и нормальных условиях для подтверждения ее работы в соответствии со спецификациями системы. Этот этап зависит от того, какой язык программирования выбран, на каком компьютере алгоритм будет реализован.
С этим связаны выбор типов данных, вводимых структур данных, связь с окружающей средой и т.п. Важно осознавать интерактивность, вид транслятора (компилятор или интерпретатор), наличие библиотек подпрограмм, модулей и объектов.
Анализ алгоритма и его сложности необходим для оценки ресурсов компьютеров, на которых он будет работать, времени обработки конкретных данных, приспособления в работе в локальных сетях и телекоммуникациях. Хотелось бы также иметь для данной задачи количественный критерий для сравнения нескольких алгоритмов с целью выбора более простого и эффективного среди них.
Перед началом эксплуатации программы необходим этап ее отладки и тестирования.
Тестирование - это процесс исполнения программ с целью выявления (обнаружения) ошибок. Тестирование - процесс деструктивный, поэтому считается, чти тест удачный, если обнаружена ошибка. Хорошим считается тест, который имеет большую вероятность обнаружения еще не выявленной ошибки. Удачным считается тест, который обнаруживает еще не выявленную ошибку.
Существуют различные способы тестирования программ.
Тестирование программы как «черного ящика» (стратегия «черного ящика» определяет тестирование с анализом входных данных и результатов работы программы). Критерием исчерпывающего входного тестирования является использование всех возможных наборов входных данных.
Тестирование программы как «белого ящика» заключается в стратегии управления логикой программы, позволяет использовать ее внутреннюю структуру. Критерием выступает исчерпывающее тестирование всех маршрутов и управляющих структур программы.
Разумная и реальная стратегия тестирования - сочетание моделей «черного» и «белого ящиков».
Принципы тестирования:
• описание предполагаемых значении выходных данных или результатов должно быть необходимой частью тестового набора;
• тесты для неправильных и непредусмотренных входных данных следует разрабатывать так же тщательно, как для правильных и предусмотренных;
• необходимо проверять не только делает ли программа то, для чего она предназначена, но и не делает ли она то, что не должна делать;
• нельзя планировать тестирование в предположении, что ошибки не будут обнаружены;
• вероятность наличия необнаруженных ошибок в части программы пропорциональна числу ошибок, уже обнаруженных в этой части;
• тестирование - процесс творческий.
При разработке программ очень полезным бывает метод «ручного тестирования» без компьютера на основе инспекции и сквозного просмотра (тестирование «всухую»).
Инспекция и сквозной просмотр - это набор процедур и приемов обнаружения ошибок при чтении текста.
Основные типы ошибок, встречающихся при программировании:
• обращения к переменным, значения которым не присвоены или не инициализированы;
• выход индексов за границы массивов;
• несоответствие типов или атрибутов переменных величин;
• явные или неявные проблемы адресации памяти;
• ошибочные передачи управления;
• логические ошибки.
При проектировании процедуры тестирования предусматривают серии тестов, имеющих наивысшую вероятность обнаружения большинства ошибок. Для целей исчерпывающего тестирования создают эквивалентные разбиения входных параметров. причем предусмативают два класса: правильные входные данные и неправильные (ошибочные входные значения). Для каждого класса эквивалентности строят свой тест. Классом эквивалентности тестов можно назвать такое множество тестов, что выполнение алгоритма на одном из них гарантирует аналогичный результат прогона для других.
Особое внимание необходимо уделять тестам на граничных условиях. Граничные условия - это ситуации, возникающие непосредственно на, выше или ниже границ входных и выходных классов эквивалентности (т.е. вблизи границ эквивалентных разбиений). В частности, примерами классов эквивалентных тестов для алгоритма решения квадратного уравнения могут служить следующие классы: множество действительных, отличных от нуля, чисел а, b, с, таких, что b•b - 4•а•с < 0; множество чисел а = 0, b и с не равны нулю; b = 0, а
и с не равны нулю, и т.п.
Сам процесс тестирования может быть пошаговым и/или монолитным.В том и в другом случае используют стратегии нисходящего тестирования, - начиная с верхнего, головного модуля, и затем подключая последовательно другие модули (аппарат заглушек), и восходящего тестирования, начиная с тестирования отдельных модулей.
В процессе отладки программы используют метод грубой силы - использование выводов промежуточных данных по всей программе (трассировка) или использование автоматических средств. Например, в Турбо-Паскале имеется в наличии мощный аппарат автоматической отладки программ (режим DEBUG).
Есть золотое правило программистов - оформляй свои программы в том виде, в каком бы ты хотел видеть программы, написанные другими. К каждому конечному программному продукту необходимо документированное сопровождение в виде помощи (help), файлового текста (readme.txt).
ПРОГРАММНЫЕ СРЕДСТВА ПРОФЕССИОНАЛЬНОГО УРОВНЯ
Каждая прикладная программа этой группы ориентируются на достаточно узкую предметную область, но проникает в нее максимально глубоко. Так функционируют АСНИ - автоматизированные системы научных исследований, каждая из которых «привязана» к определенной области науки, САПР - системы автоматизированного проектирования, каждая из которых также работает в узкой области, АСУ - автоматизированные системы управления (которых в 60 - 70 годах были разработаны тысячи).
Наконец, еще раз подчеркнем не только условность предложенной выше классификации, но и наличие пересечений. Так, каждую конкретную экспертную систему вполне можно отнести к ППО профессионального уровня; принцип гипертекста реализован в ряде авторских систем и т.д.
ПРОСТЫЕ (НЕСТРУКТУРИРОВАННЫЕ) ТИПЫ ДАННЫХ
В математике принято классифицировать величины в соответствии с их характеристиками. Различают целые, вещественные, комплексные и логические величины, величины, представляющие собой отдельные значения, множества значений или множества множеств. Аналогично этому в информатике любая константа, переменная, выражение или функция относится к некоторому типу. Фактически тип характеризует множество значений, которые может принимать константа, переменная, выражение или функция. Широко используется правило, по которому тип явно указывается в описании константы, переменной или функции. К данным каждого типа применимы определенные операции и их поведение подчиняется некоторым аксиомам.
Так, над целыми числами могут выполняться операции сложения (+), вычитания (-) и умножения (*). Существуют две различные операции, связанные с делением и не выводящие за границы множества целых чисел: 1) определение целой части от деления одного числа на другое; 2) определение остатка от деления одного числа на другое.
Целые числа, используемые компьютером, имеют те же свойства (подчиняются тем же аксиомам), что и целые числа в арифметике. Все вычисления с ними выполняются абсолютно точно (не приближенно). Имеется только одно отличие в свойствах компьютерных целых чисел от тех, которыми оперирует абстрактная математика, а именно ограниченность диапазона: для каждой компьютерной системы имеется самое большое допустимое в ней целое число М+? (и самое малое, отрицательное М-?). Обычно выполняется соотношение
М+? + 1 = М-? (М-? - 1 = М+?),
т. е. прибавив единицу к самому большому допустимому положительному числу, мы получим модуль самого малого допустимого отрицательного. Это свойство компьютерных чисел связано с особенностями их кодирования в ячейках памяти компьютера.
Над действительными (или вещественными) числами могут быть выполнены операции сложения (+), вычитания (-), умножения (*) и деления (/), так же, как и над математическими действительными числами. Однако, все операции над действительными числами выполняются с точностью, не превосходящей некоторого фиксированного значения, вследствие того, что представления чисел в памяти компьютера имеют ограниченную длину (зависящую от конкретного компьютера и используемой системы программирования).
Так, например, в машинной арифметике может быть 1/3 = 0,33333333, тогда как математически точное десятичное представление дроби 1/3 - бесконечно длинное число.
Главным свойством литерных (символьных) данных является их упорядоченность, т.е. свойство быть сравнимыми. Обычным признаком значения символьной или текстовой величины являются кавычки, и справедливо 'а' < 'b', 'b' < 'с', 'с' < 'd' и т.д. Каждый символ имеет определенный числовой код (например, код символа латинской буквы "А" в большинстве кодировок 63) и упорядочение происходит в соответствии с этими числовыми кодами. Как правило, имеются функции, позволяющие получить по символу его код и символ по коду.
Для строчных величин единственной выполнимой операцией является конкатенация («сложение») строк. Например, 'abcd'
+ 'efg' = 'abcdefg'. В конкретных системах обычно определены функции, определяющие длину строк, вхождение в них тех или иных подстрок, вырезающие из строк некоторые фрагменты.
К логическим данным, способным принимать значения «истина» («true») или «ложь» («false»), применимы основные операции логики высказываний: конъюнкция (логическое «и» - «and»), дизъюнкция (логическое «или» - «or»), отрицание (логическое «не» - «not»). Иногда можно использовать операции импликации («если»), эквиваленции («если и только если») и т.п. Эти логические операции определяются таблицей истинности, табл. 1.9.
Таблица 1.9 Таблица истинности для логических операций
А |
В |
«и» |
«или» |
«не» |
(A and В) |
(A and В) |
(not А) |
||
И |
И |
И |
И |
Л |
И |
Л |
Л |
И |
Л |
Л |
И |
Л |
И |
И |
Л |
Л |
И |
Л |
И |
РАБОТА МИКРОПРОЦЕССОРА С ПАМЯТЬЮ. МЕТОДЫ АДРЕСАЦИИ
Адресное пространство МП состоит из множества ячеек памяти ОЗУ, из которых он может брать информацию или засылать ее. Как говорилось выше, начиная с 4-го поколения доминирует байтовая организация памяти, и минимально адресуемой единицей является байт. Например, для ОЗУ емкостью 1024 кбайта адреса байтов таковы:
00000 00001 ... FFFFF
(как принято, записываем их в шестнадцатеричнои системе; адрес последнего байта есть 1024*1024 -1=1 048 576 - 1 = FFFFF). Длина же ячейки («машинного слова») может быть как один, так и несколько байтов в зависимости от типа процессора и команды, обрабатывающей соответствующую информацию.
При обмене информацией с памятью процессор обращается к ячейкам ОЗУ по их номерам (адресам). Способы задания требуемых адресов в командах ЭВМ принято называть методами адресации.
От видов и разнообразия методов адресации существенно зависит эффективность работы программы с данными, особенно если последние организованы в определенную структуру.
Для того, чтобы процессор мог извлечь данные из ячейки ОЗУ или поместить их туда, необходимо где-то задать требуемый адрес. Если адрес находится в самой команде, то мы имеем дело с прямой адресацией. Поскольку при подобном способе слишком сильно возрастает длина команды, то, чтобы избежать этого неприятного эффекта, при обращении к ОЗУ процессор использует метод косвенной адресации. Идея состоит в том, что адрес памяти предварительно заносится в один из регистров МП, а в команде содержится лишь ссылка на этот регистр. Если учесть, что при хранении адреса в регистре его еще очень удобно модифицировать (скажем, циклически увеличивая на заданную величину), становится понятным, почему косвенная адресация нашла такое широкое применение.
Приведем описание наиболее распространенных вариантов ссылок на исходную информацию (учитывая, что терминология для разных МП может различаться, названия методов адресации не приводятся):
1) данные находятся в одном из регистров МП;
2) данные входят непосредственно в состав команды, т.е.
размещаются после кода операции (операции с константой);
3) данные находятся в ячейке ОЗУ, адрес которой содержится в одном из регистров МП;
4) данные находятся в ячейке ОЗУ, адрес которой вычисляется по формуле
адрес = базовый адрес + смещение.
Базовый адрес хранится в одном из регистров МП и является начальной точкой массива данных. Смещение может быть как некоторой константой, так и содержимым другого регистра. Часто такой способ доступа к ОЗУ называют индексным, так как это похоже на нахождение элемента в одномерном массиве по его индексу.
Следует подчеркнуть, что здесь описаны лишь наиболее общие методы адресации. У конкретных моделей МП существуют некоторые особенности адресации ОЗУ. Кроме того, имеющиеся методы адресации могут быть комбинированными. Так, например, в процессорах семейства PDP возможна двойная косвенная адресация: данные хранятся в ячейке ОЗУ, адрес которой хранится в ячейке, адрес которой находится в указанном регистре (как тут не вспомнить детский стишок о синице, которая ворует пшеницу, которая в темном чулане хранится, в доме, который построил Джек?).
Методы адресации могут быть и более экзотическими. Рассмотрим, например, широко распространенный сегментный
способ, принятый в процессорах фирмы «Intel». Известный американский программист Питер Нортон метко назвал эют способ словом «клудж» (от английского «kludge» - приспособление для временного устранения проблемы). Сегментный метод адресации был предложен для первого 16-разрядного МП 8086 для того. чтобы, используя 16-разрядные регистры, можно было получить 20-разрядный адрес и тем самым расширить максимально возможный объем ОЗУ с 64 кбайт до 1 Мбайта. Суть метода состоит в том, что адрес ОЗУ вычисляется как сумма двух чисел (сегмента и смещения), причем одно из них сдвинуто влево на 4 двоичных разряда, т.е. умножено на 16. Пусть, например, сегмент в шестнадцатеричном виде равен АООО, а смещение - 1000. Общепринятая запись такого адреса имеет вид АООО: 1000. Итоговый адрес равен
А000()
+ 1000
А1000
« Такой способ адресации более 64 кбайт памяти кажется довольно странным, однако он работает», - не без некоторой иронии замечает по этому поводу Питер Нортон.
Добавим, что, помимо всего прочего, при сегментной адресации один и тот же адрес ОЗУ может быть представлен несколькими комбинациями чисел (в самом деле, одну и ту же сумму можно получить разными способами)
Поскольку современные интелловские процессоры, начиная с 80386, стали 32-разрядными, их регистров хватает, чтобы адресовать до 4 Гбайт памяти Сегментный способ при этом становится излишним, хотя и сохраняется как вариант ради обеспечения программной совместимости с предыдущими моделями.
Нам осталось рассмотреть еще один очень специфический, но интересный и часто используемый на практике способ адресации данных в ОЗУ. Речь пойдет о работе со стеком. Сам термин происходит от английского слова «stack», имеющего множество значений, причем ни одно из них не подходит достаточно точно. Чаще всего в литературе упоминается магазин револьвера, который по очереди обеспечивает доступ к каждому патрону. Даже если не учитывать ненужную «милитаризацию» терминологии, такой перевод явно не подходит к современной реализации стека. Во-первых, стек не является круговым, а во-вторых, информация в стеке микрокомпьютера не смещается (для точности аналогии пришлось бы признать, что магазин покоится, а вращается револьвер!). Поэтому возьмем термин «стек» как есть, без перевода, и перейдем к определению.
Стек - это неявный способ адресации, при котором информация записывается и считывается только последовательным образом с использованием, так называемого, указателя стека.
Обратимся к примеру. Пусть требуется на время сохранить значения трех целочисленных переменных N1, N2 и N3, а затем их все сразу восстановить. Попробуем воспользоваться для этого стековой памятью. Прежде всего запомним, что стек всегда имеет единственный вход и выход информации - для .хранения его адреса и нужен указатель стека. Пусть для определенности он сейчас содержит адрес 2006 (рис. 4.13, а).
Тогда по команде «записать в стек N1» (обратите внимание, что в команде не фигурирует явно ни адрес ОЗУ, ни регистр МП!) процессор проделает следующее:
1) уменьшит указатель стека на 2 (целое число занимает в памяти 2 байта);
2) запишет N1 по полученному адресу 2004 (рис. 4.13, б).
Аналогично при выполнении команд «записать в стек N2» и «записать в стек N3» значения этих переменных попадут в ячейки 2002 и 2000, причем указатель стека станет равным 2000 (рис. 4.13, в).
Рис. 4.13. Пример для изучения принципа работы стека
Теперь займемся извлечением информации. Как видно из рис. 4.13, в, указатель сейчас «направлен» на значение переменной N3, а значит считывать придется, начиная с него. Выполним команду «прочитать из стека N3». При этом процессор
1) считает в N3 значение из стека;
2) увеличит указатель на 2 (рис. 4.13, г).
Аналогично прочитаем N2 и N1, после чего стек опустеет и вернется к начальному состоянию, изображенному на рис. 4.13, а.
Примечание.
Обратим внимание на то, что значение в стеке после считывания, конечно же, не исчезает, как это условно показано на рис. 4.13, г, но есть причины полагать, что мы его там можем больше не увидеть. Дело в том, что процессор имеет право иногда временно использовать стек для своих «внутренних» нужд. При этом некоторые ячейки, адреса которых меньше текущего указателя стека, естественно, изменятся. Следовательно, во избежание неприятностей лучше всегда считать, что после считывания информации в стековой памяти она пропадает.
Подводя итоги рассмотрения примера, обратим внимание на следующее. Та информация, которая заносится в стек первой, извлекается последней и наоборот. Обычно об организации стека говорят: «первым пришел - последним ушел». Удобно представить себе аналогию с детской пирамидкой, нижнее кольцо которой невозможно снять до тех пор, пока не будут сняты все остальные.
Еще раз подчеркнем, что в командах работы со стеком адрес ОЗУ не фигурирует в явном виде. Но при этом молчаливо предполагается, что указатель стека уже задан.
Как правило, инициализацию указателя стека компьютер делает сам, но не мешает поинтересоваться, так ли это в вашем конкретном случае и достаточно ли памяти под стек имеется при этом. Если указатель стека определен неправильно, то запись в стек может разрушить полезную информацию в ОЗУ и вызвать непредсказуемые последствия.
Интересно, что со стековым способом организации мы имеем дело в жизни гораздо чаще, чем это может показаться на первый взгляд. Во-первых, дисциплине «первым пришел - последним ушел» подчиняются скобки в арифметических выражениях: первой всегда закрывается «самая внутренняя», т.е. как раз последняя скобка. Если вы знакомы с программированием на любом алгоритмическом языке, то без труда найдете и еще два примера: вложенные циклы и подпрограммы.
Итак, мы подробно рассмотрели общие принципы записи информации в стек. Остается сказать, что стековый способ организации ОЗУ используется в вычислительной технике очень широко. На аппаратном уровне процессор «обучен» сохранять в стеке текущий адрес программы при выполнении команды перехода с возвратом, т.е. при вызове подпрограммы. Часто программа предварительно заносит в тот же самый стек необходимые для подпрограммы параметры: так реализуется, например, вызов процедур и функций с параметрами в языке «Паскаль». Кроме того. стек часто используется для временного сохранения значений тех или иных внутренних регистров процессора. Наконец, процессор активно использует стек при реализации прерываний от внешних устройств (об этом будет рассказано в следующем параграфе).
РАБОТА МИКРОПРОЦЕССОРА С ВНЕШНИМИ УСТРОЙСТВАМИ
Выше было описано, как процессор обменивается информацией с ее наиболее важным и оперативным источником - памятью. Рассмотрим теперь, как МП может принять данные или передать их внешним устройствам. Способ решения этой задачи в зависимости от конструкции ЭВМ (подчеркнем: не от конструкции МП, а от конструкции всей ЭВМ!) может быть одним из двух указанных ниже:
1) устройства ввода-вывода включаются в общее адресное пространство;
2) устройства ввода-вывода имеют собственное адресное пространство.
В первом случае при обращении к определенным адресам памяти вместо обмена с ОЗУ происходит аппаратное подключение того или иного внешнего устройства. При этом для «общения» с внешними устройствами и с памятью используются одни и те же команды МП, хотя, конечно, обмен с внешним устройством протекает по более сложному протоколу, чем с памятью.
Во втором случае внешние устройства образуют отдельное адресное пространство, обычно значительно меньшее, чем у ОЗУ. Каждая ячейка этого дополнительного адресного пространства называется портом. Каждому внешнему устройству обычно соответствует несколько портов с последовательными адресами. Обмен процессора с организованными подобным образом устройствами осуществляется специальными командами ввода-вывода.
На самом деле, с точки зрения схемной организации оба описанных способа имеют очень много общего. При любом обмене, будь то обращение к ОЗУ, ПЗУ или внешнему устройству, процессор выставляет адрес информации на единую адресную шину, а данные передает или принимает по общей шине данных. Выбор же требуемого адресата - ячейки памяти или порта - осуществляется подачей специального управляющего сигнала.
В одном и том же компьютере могут встречаться оба способа адресации устройств ввода-вывода одновременно. Так, в ПЭВМ «Ямаха» накопитель на магнитных дисках включен в общее адресное пространство памяти, а печатающее устройство оформлено в виде нескольких портов. Некоторые порты этого компьютера служат для подключения к небольшому 64-килобайтному адресному пространству 128 кбайт ОЗУ и многочисленных ПЗУ.
При этом все ресурсы памяти разбиваются на отдельные страницы по 16 кбайт каждая, и «активными» в каждый момент времени могут быть только четыре из них.
Рассказ о работе с периферийными устройствами был бы неполным без описания того диалога, который ведет с ними МП. Рассмотрим этот диалог на примере простейших устройств ввода-вывода - например, печатающего устройства.
Обмен с подключенным к ЭВМ печатающим устройством производится через два основных порта - порт состояния и порт данных. В первом хранится информация о состоянии устройства в данный момент времени, а во второй МП помещает данные для вывода на бумагу. Каждый бит порча состояния хранит ответ на вполне определенный вопрос: заправлена ли бумага, готов ли принтер принять данные от компьютера и т.д. Все это для МП - входные сигналы. Но есть и выходные, которые через порт передаются от МП к печатающему устройству. Наиболее важным из них является бит, свидетельствующий о готовности информации в порту данных к передаче. Этот управляющий сигнал часто называют стробом.
В наиболее простом случае обмен информацией между процессором и принтером может протекать следующим образом. Пусть МП должен вывести на печать какой-нибудь символ. Он считывает порт состояния принтера и анализирует содержимое его бита готовности. Если результат положительный, т.е. печатающее устройство готово принять информацию, обмен продолжается, в противном случае МП снова считывает порт состояния и повторяет анализ. Когда процессор получит от принтера сигнал о готовности к обмену, он заносит требуемый символ в порт данных и установкой стробирующего сигнала сообщает об этом принтеру. Затем МП снова периодически считывает порт состояния, но следит уже за другим битом (через этот бит принтер сообщит процессору о том, что данные приняты, т.е. скопированы в собственное ОЗУ принтера). После этого МП убирает стробирующий потенциал и продолжает работу по программе.
Конечно, реальный диалог современного компьютера с печатающим устройством сложнее. Вот пример.
РАБОТА С ФАЙЛАМИ
Файл (последовательность) - это одна из наиболее фундаментальных структур данных. Программная организация компьютеров, их связь с внешними устройствами основаны на файловой структуре.
Файлы позволяют решить две проблемы:
1) возможность формирования и сохранения значений для последующего использования другими программами (например, в программах многократной обработки информационных систем, таких как платежные ведомости, различные АСУ, базы данных, необходимость длительного хранения информации очевидна);
2) взаимодействие программ с внешними устройствами ввода-вывода: дисплеем, принтером, АСП и т.п.
В Паскале эти проблемы снимаются с помощью структурированных данных файлового типа.
Файловый тип данных в программе задается следующем образом:
type <имя файлового типа> = file of <тип компонентов>
В качестве типа компонентов файла разрешается использовать любой тип данных, кроме файлового. Например:
type
intfile = file of integer;
refile = file of real;
chfile = file of char;
ran = 1 .. 10;
st = set of ran;
vector = array[ran] of real;
comp = record
re,im : integer;
end;
setfile=file of st;
vecfile = file of vector;
compfile= file ofcompt;
Описание файловой переменной задается обычным способом в разделе описаний. Например:
var f: intfile; или var f: file of integer;
Файловая переменная является буфером между Паскаль-программой и внешним устройством и должна быть логически с ним связана. Связь осуществляется оператором языка Паскаль:
assign (<имя файловой переменной>,'<имя устройства>')
Как правило, файлы для хранения данных связаны с устройством внешней памяти на магнитных носителях (дисковод) и носят название внешние файлы. Если, например, файл с именем primer, dat логически связан с дисководом А:, то все данные, помещаемые в файл, будут храниться на этом дисковом накопителе, a установка «окна» между программой и файлом будет определяться через файловую переменную f оператором
assign (f, 'primer.dat')
Если внешним устройством является принтер, то связь осуществляется оператором assign(f, '1st:'). Здесь 1st - логическое имя печатающего устройства. Ниже приведены логические имена внешних устройств ввода-вывода:
con - консоль; trm - терминал; kbd - клавиатура; 1st - принтер; aux - буфер сети;
usr-драйвер пользователя.
После осуществления связи файловая переменная f отождествляется с соответствующим файлом.
Для работы с файлом его необходимо открыть, а по окончании работы — закрыть Файл открывается для чтения оператором reset(f), для записи - оператором rewrite(f).
Чтение и запись данных осуществляется известными командами read/write, только в начале списка помещается имя файловой переменной:
read (f, <список ввода>); readln (f, <список ввода>);
write(f, <список вывода>); writeln(f, <список вывода>).
Закрытие файла осуществляется командой close(f).
условно файл можно представить в виде ленты, у которой есть начало, а конец не фиксируется. Компоненты файла записываются на эту ленту последовательно, друг за другом:
Здесь т.м. - текущий маркер, указывающий на рабочую позицию (окно) файла; м.к. (маркер конца файла) - специальный код, автоматически формируемый вслед за последним элементом файла.
Такого рода файлы называются файлами последовательного доступа. В исходной версии Паскаля файлов прямого доступа, для которых можно непосредственно «достать» любую компоненту, не предусмотрено; однако, в Турбо-Паскале элементы прямого доступа есть (например, через функцию seek, см. ниже).
Команда rewrite(f) - открыть файл для записи - устанавливает файл в начальное состояние режима записи; текущий маркер устанавливается на маркер конца файла. Если в файле f до этого была информация, то она уничтожается.
В открытом для чтения командой reset(f) файле текущий маркер устанавливается на нулевое состояние, однако содержимое файла не утрачивается.
Команда закрытия файла close (Q обязательна, поскольку эта команда формирует маркер конца файла, что в большинстве случаев является необходимым нaпpимep, для работы с функцией eof(f), см ниже).
В системе Турбо- Паскаль предусмотрены встроенные функции по работе с файлами:
filesize(f) - текущее количество компонент открытого файла;
filepos(f) -номер текущей позиции маркера;
геnamе (f,имя) - переименование файла, связанного с f;
erase(f) -уничтожение файла;
execute(f) - выполнение СОМ-файла;
chain(f) -выполнение CHN-файла;
seek(f,N) - устанавливает маркер на позицию N;
eof(f) - возвращает TRUE, если найден конец файла;
ealn(f) - возвращает TRUE, если найден конец строки.
На практике широко используются текстовые файлы, которые состоят из литерных (логических) строк. Поэтому в языке Паскаль предусмотрен стандартный файловый тип TEXT (он не является file of char, скорее всего, это - file of string[n]). Логические строки бывают разной длины, в том числе и нулевой. В конец каждой строки помещается специальный символ «конец строки» (eoln - «end of line»). В качестве печатного символа конца строки используют литеру #. Текстовый файл (text) является строго последовательным, к нему не применимы некоторые встроенные функции, в частности, seek. В отличие от типизированных файлов, с текстовым файлом нельзя одновременно проводить операции чтения (read) и записи (write). Однако, допустимы операторы writein и readln. Числовые данные, целые и вещественные, в текстовом файле должны записываться через пробел.
Ниже приведены несколько примеров, иллюстрирующих работу с файлами. Пример 1. Вывод данных на печатающее устройство - принтер (1st:).
Программа 23
program print;
var
fal :text; x :real; name :string[25];
begin
assign (fal, ' 1st:'); rewrite (fal); x:2.5; name:"'Слава';
writeln(fal,x:8:2) ;
writeln(fal,'Привет, '.name); close(fal) :
end. (Здесь файловая переменная fal связывается с принтером 1st:, и запись в файл fal практически означает вывод на печать)
Пример 2. Создание и сохранение в файле «xxx.dat» последовательности целых чисел от 10 до 20.
Программа 24
program zapis;
var
f: file of integer; i: integer;
begin
assign(f,'xxx.dat'); rewrite(f);
for i:=10 to 20 do write(f,i); close (f);
end. ( После выполнения программы формируется внешний файл xxx.dat)
Пример 3.
Считывание первых пяти компонент из существующего файла «xxx.dat» и вывод на дисплей квадратов этих значений.
Программа 25
program read;
var ff: file of integer; j,i : integer;
begin
assign(ff,'xxx.dat'); reset(ff) ;
for j:=l to 5 do begin read(ff.i); writeln(i*i);
end;
close(ff);
end.
Пример 4. В текстовом файле (text) «slov.txt» содержится русский текст. Определить сколько гласных букв в тексте.
Программа 26
program text;
var
ft : text; n : integer; ch : char; st : set of chart begin
assign (ft,'slov.txt'); reset(ft);
st := ['A'.'E','И','О','У,'Ы','Э','Ю','Я'];
st := st+['a','e','и','о','у','ы','э','ю','я'];
n: =0;
while not eof(ft) do begin
read(ft, ch); if ch in st then n:=n+l;
end;
close(ft);
writeln; write('кол-во гласных букв =',n);
end.
Поскольку длина текста (файла) неизвестна, то в цикле «пока» используется логическая функция eof(f), которая возвращает значение TRUE, если найден конец файла.
Пример 5.
Шифрование и дешифрование текста.
Программа шифрования заданного текста (sekret) использует следующее правило шифровки: каждая буква в тексте заменяется на букву, расположенную на n позиций вправо от искомой в русском алфавите. Причем последним символом алфавита является пробел '', а далее алфавит продолжается циклически.
Значение смещения n находится во внешнем файле 'n.key', который формируется программой key. Зашифрованный текст выводится во внешний файл с именем «шифр.eхe» , а также на дисплей.
Программа дешифровки (retsek) считывает шифрованный текст из файла «шифр.tхt» и выводит на экран дисплея искомый текст.
Программа 27 (а)
program key;
var
n : integer; f : file of integer;
begin , .
assign (f,'n.key'); rewrite(f); write\('Bвeди ключ(смещение): ');
readln(n);
write(f,n); close(f);
end.
Программа 27 (б)
program sekret;
var
| slovo,anslovo: string[100];
alfavit : string[33];
n, i, k, p : integer;
fkl : file of integer;
fs : text;
begin
alfavit:='абвгдежзийклмнопрстуфхцчшщъыьэюя ';
assign(fkl,'n.key'); reset(fkl); read(fkl,n); close(fkl);
writeln; write('введи
текст: ');
readln(slovo); anslovo:='';
for k:=l to length(slovo) do begin for i:=l to 33 do
if slovo[k]=alfavit[i] then begin p:=i+n;
if p >33 then p:=p mod 33;
anslovo:=anslovo+alfavit[p];
end;
end;
assign(fs,'шифр.txt'); rewrite(fs); write(fs,anslovo);close(fs);
writeln; write(ansiovo) ;
end.
Программа 27 (в)
program retsek;
var slovo, anslovo : string[100];
alfavit : string[33];
n, i, k, p : integer;
fi : file of integer;
f : text;
begin alfavit:='абвгдежзийклмнопрстуфхцчшщъыьэюя ';
assign(fi,'n.key'); reset(fi); read(fi.n); close(fi);
assign(f,'шифр.txt'); reset(f); read(f,anslovo); close(f)
slovo:='' ;
for k:=l to length(anslovo) do
begin for i:=l to 33 do
if anslovo[k]=alfavit[i] then
begin p:=i-n; if p < 1 then p:=33-p mod 33;
slovo:=slovo+alfavit[p];
end;
end;
writeln; write('TeKCT шифровки: ',slovo);
end.
Контрольные вопросы и задания
1. Какие проблемы решаются при использовании файлов?
2. Какие операции и функции используются при работе с файлами?
3. Найдите площадь выпуклого четырехугольника со сторонами х, у, z, t и одной
из диагоналей d.
4. Заданы три комплексных числа. Найдите их сумму,
5. Имеется внешний файл записей «lab.zap», содержащий сведения об ученика.' школы. Файл формируется приведенной ниже программой.
Составьте программу, в которой необходимо сделать следующее:
а) упорядочить файл по признаку «class» в порядке возрастания;
б) упорядочить файл по признаку «god» в порядке убывания;
в) упорядочить файл в алфавитном порядке.
program lab;
type shcoo 1= record
fiо : string[20], class : 1 .. 11; god : integer; pol: char;
end;
var x:array[1..100] ofshcool; n,i:integer; f:file of school;
begin
write ('введите кол-во учеников:'); readln(n); assign(f,'lab.zap'); rewnte(f);
for i:=l to n do with x[i] do
begin \write('введи Ф.И.О.',1,'-ого ученика:'); readln(fio);
write('клacc:'); readln(class);
write('гoд рождения:-'); readln(god); write('пол(M/Ж):-');
readln(pol); write(f,x[i])…;
end; close(f);
end.
6. Задание рассчитано на двух студентов, использующих «электронную почту» на одном компьютере. Первый студент составляет программу, в которой формирует внешний файл «письмо». Второй студент должен «прочитать» файл и сформировать «ответ».
ПИСЬМО ОТВЕТ
а) последовательность целых чисел до 100 | квадраты этих чисел;
б) простые числа в интервале от 1 до 200 | сумма этих чисел
РАБОТА С ГРАФИКОЙ
Машинная (компьютерная) графика - одно из важных направлений в современной прикладной информатике. В отличие от базового Паскаля, современные версии содержат мощные средства разработки графических программ. Рассмотрим часть соответствующих возможностей Турбо-Паскаля, в котором они реализованы с помощью стандартного модуля Graph.
Модуль представляет собой мощную библиотеку графических подпрограмм универсального назначения, рассчитанную на работу с наиболее распространенными графическими адаптерами CGA, EGA, VGA, SVGA IBM-совместимых персональных компьютеров.
Подключение модуля Graph, tpu к программе выполняется директивой
uses graph;
Инициализация графического экрана осуществляется с помощью процедуры Initgraph. Драйвер поддерживает тот или иной режим экрана, табл. 3.1.
Таблица 3.1
Некоторые сведения о драйверах н определяемых ими режимах
Адаптер | Драйвер | Режим (Номер, имя) | Разрешимость | Число страниц | |||||
EGA | EGA | OEgalo | 640х200 | 4 | |||||
1 Egahi | 640х350 | 2 | |||||||
VGA | VGA | OVgalo | 640х200 | 4 | |||||
IVgalo | 640х350 | 2 | |||||||
2Vgalo | 640х480 | 1 |
Процедура инициализации в Турбо-Паскале имеет три аргумента:
Initgraph(<драйвep>, <режим>, '<путь к драйверу>').
Она может быть выполнена так:
uses graph;
var gd, gm: integer; {переменные gd и gm определяют драйвер и режим}
begin
gd:=vga; gm:=vgahi;
initgraph(gd,gm.'d:\tp551);
Первые две команды можно заменить одной:
gd:=detect
Целая константа detect=0 в модуле Graph автоматически распознает драйвер и устанавливает режим максимального разрешения для данной машины.
Процедура closegraph освобождает память от драйвера и устанавливает режим работы экрана, который был до инициализации графики.
Для обнаружения ошибок в графике применяются функции graphresult и grapherrormsg (код ошибки).
Последняя выдает строку сообщения о характере ошибки, соответствующей коду. Инициализация графического режима с проверкой ошибок может быть выполнена в программе следующим образом:
uses graph; var gd, gm, errorcod: integer;
begin
gd:=detect; initgraph(gd,gm,");
errorcod'=graphresult;
if errorcod <>grok then
begin
writeln('ошибка графики');
writeln(grapherrormsg(errorcod));
halt
end;
Процедура Halt останавливает выполнение программы и возвращает управление операционной системе.
Для формирования палитры используется система смешения красного, зеленого и синего цветов и изменения яркости луча. Цвет задается номером из списка цветов палитры в интервале 0 .. 15.
Процедуры sе1со1ог(<цвет>) и setbkcolor(<цвет>) устанавливают текущий цвет рисунка и цвет фона. При инициализации графики по умолчанию устанавливается черный фон и белый цвет рисунка.
В табл. 3.2 указаны основные процедуры для модуля Graph, применяющиеся для построения простейших геометрических примитивов.
Координаты точек воспринимаются в «экранной» системе координат, в которой начало - верхний левый угол экрана, ось «х» направлена вниз, ось «у» -направо. Максимальные значения координат определяются разрешимостью экрана (см. табл. 3.1).
Первый аргумент процедуры setlinestyle(a,b,t) а - стиль линии второй параметр b -«образец» - имеет значение 4, если а=4, в остальных случаях b=0; третий параметр t -толщина линии - может иметь значение 1 (нормальная толщина) или 3 (жирная линия).
Таблица 3.2
Основные процедуры модуля Graph
Заголовок процедуры |
Геометрический смысл |
putpixel(x,y,c) |
Построить точку (х,у) цветом с |
setlinestyle(a,b,t) |
Установить стиль, образей и толщину линий |
line(xl,yl,x2,y2) |
Соединить две точки отрезком |
rectangle(xl,yl.x2.y2) |
Построить прямоугольник с заданными концами диагонали и |
сторонами, параллельными осям координат |
|
circle(x,y,r) |
Построить окружность с центром (х,у) и радиусом г |
arc(x,y,a,b,r) |
Построить дугу окружности: a,b - начальный и конечный угол в |
Градусах |
|
ellipse(x,y,a,b,rx,ry) |
Построить эллиптическую дугу: rx, rу - полуоси эллипса |
setfillstyle(t,c) |
Установить стиль закраски и ее цвет |
fillellipse(x,y,rx,ry) |
Построить закрашенный эллипс, используя цвет рисунка |
floodfill(x,y,cg) |
Закрасить фигуру до границы с цветом cg; (x,y) - внутренняя |
точка фигуры |
|
bar(xl,yl,x2,y2) |
Построить столбец, используя тип и цвет закраски |
pieslice(x,y,a,b.r) |
Построить и закрасить сектор круга |
sector(x,y.a,b,rx,ry) |
Построить и закрасить эллиптический сектор |
settextsiyle(f,n,d) |
Установить шрифт, направление вывода и размер символа текста ' |
outtextxy(x,y,st) |
Вывести строку st, начиная с точки (х,у) |
outtext(st) |
Вывести строку, начиная с точки расположения текущего указателя |
Первый аргумент процедуры setfillstyle(t,c) - тип закраски t - принимает значения из интервала 0..12. Наиболее употребителен тип t = 1 - заполнение фигуры текущим цветом.
Для вывода текста на графический экран сначала выполняется процедура settextstyle(f,n,d), устанавливающая шрифт f, направление вывода п и размер символов (параметр d). При f = 0 используется стандартный точечный шрифт, встроенный в систему Турбо-Паскаль. С использованием других шрифтов познакомимся ниже. Направление вывода п принимает значения 0 (горизонтальный вывод) и 1 (вертикальный вывод).
Размер букв определяется параметром d, принимающим значения из интервала 1..10. Если d = 1 и f = 0, то каждый символ занимает квадрат 8*8 точек, при d > 1 сторона квадрата умножается на d.
Далее, с помощью процедуры outtextxy(x,y,st) строка st выводится на экран, начиная с точки (х,у).
Например:
settextstyle(0,0,2); оuttехtху(100,200,'горизонтальная строка');
оuttехtху(100,230,'размер увеличен вдвое');
Примеры графических программ
Пример 1:
программа рисует звездное небо с 400 «звездами», вспыхивающими постепенно, и полную желтую луну.
Програлша 29
program sky;
uses crt,graph;
var k,gd,gm:integer;
begin gd:=detect;
initgraph (gd, gm, ' '); randomize;
for k:=l to 400 do
begin putpixel(random(640),random(480),random(15)+1); delay(10);
end;
setfillstyle(l,14); setcolor(14);
circle(550,80,30) ; floodfill(550,80,14) ;
repeat until keypressed; closegraph
end.
Пример 2. Узор. Используя простейшие геометрические образы строят замечательные графические изображения. Ниже приведена программа изображения муарового узора, полученного пересечением двух семейств расходящихся отрезков прямых. Качество и изображение получаемого узора зависит в основном от трех параметров: kl, k2 - расстояний между отрезками слева и справа ; h - смещения вниз (вверх) всего семейства.
Программа 30
program uzor;
uses crt, graph;
var gd,gm,errCode,i,kl,k2,h; integer;
begin
kl:=8; k2:=3; h:=110; gd:=Detect; InitGraph(gd,gm.'') ;
errCode:=GraphResult ;
if errCode = grOk then begin
setcolor(green); *
for i:=l to (420 div kl) do
begin line(0,i*kl,640,i*k2+h); line(0,i*k2+h,640,i*kl);
end;
repeat until keypressed; CloseGraph;
end else writeln('errCode=',errCode)
end.
Процедуры построения прямоугольных фигур удобно использовать, в частности, при построении схем, диаграмм.
Пример 3:
программа 31 строит столбчатую диаграмму, наглядно отражающую числовую информацию о населении 6 крупных городов мира: Токио, Гамбурга, Москвы, Бангкока, Мехико и Парижа.
Программа 31
program colon;
uses crt,graph;
const m:array[l..6] of real=(11500,2300,9700.5100,12400,8200) ;
name:array[I..6] of
string =('Токио','Гамбург','Москва','Бангкок','Мехико','Париж');.
var gd,gm,k,n,s:integer; st:string[6];
begin
gd:=detect;
initgraph(gd,gm,' ');
setcolor(15);
setlinestyle(0,0,1);
line(60,400,620,400);
line(60,400,60,100) ;
settextstyle(0,0,1);
for k:=l to 12 do begin n:=1000*k; str(n.st);
outtextxy(10,400-20*k-4,st);
line(60,400-k*20,65,400-k*20)
end;
setcolor(14); settextstyle(0,0,2);
outtextxy(120,20, 'Население городов (тысяч)'); settextstyle(0,0,1);
for k:=l to 6 do begin setfillstyle(1,k+2);
bar(100+(k-l)*70,400,100+k*70,round(400-m[k]/1000*20)) ;
outtextxy(100+(k-l)*70+4,450,name[k]) ;
end;
repeat until keypressed;
closegraph
end.
Процедура bar3d(xl,yl,x2,y2,d,top) рисует трехмерный столбец, глубина которого определяется параметром d. Последний параметр процедуры top - логического типа. Если top=true, рисуется верхнее основание столбика, в противном случае оно не изображается, что позволяет рисовать столбики один над другим. Диаграммы с трехмерными столбиками красивы, но их труднее создавать.
Построение графиков функций. Построение графиков функции - неотъемлемая часть большинства программ, предназначенных для обучения математике, физике. Ниже представлен пример программы построения графика функции y=x*x*sin(l/x). на произвольном отрезке [а, b]. Количество точек графика (параметр п) также задается произвольно (точка х=0 исключается, так как в ней функция не определена).
В программе также определяются величины tl=(xl-x0)/(b-a) и t2=(yl-y0)/(2m), которые означают масштабы по осям Х и Y соответственно.
График рассматриваемой функции представлен на двух отрезках [а, b] и [-0.1,0.1]. Чтобы построить график другой функции, достаточно задать ее аналитический вид в описании функции (function f).
Программа 32
program grafik;
uses crt, graph;
var gd,gm, errCode : integer; a,b : real; n : integer;
function f(x:real):real;
begin if x<>0
then f:=x*x*sin(l/x);
end;
procedure grafun(xO,xl,yO,yl,n :word;a,b;real);
var h,m,x, tl,t2 : real; i, u,v,xv,yv : word;
begin
h:=(b-a)/n; (поиск максимума f(x)} m:=abs(f (a));
for i:=l to n do if m<abs(f(a+i*h)) then m:=abs(f(a+i*h)) ;
tl:=(xl-x0)/(b-a);
t2:=(yl-y0)/(2*m); (построение координатных осей)
setfillstyle(l,15); bar(x0-5,y0-5,xl+5,yl+5) ;
xv:=round(x0-a*tl); yv:=round((yO+yl)/2) ;
setcolor(l); line(xv,y0,xv,yl);
line(xO,yv,xl.yv) ;
Moveto(xO,yv-round(f(a) *t2)); (установка курсора в начало графика}
setcolor(3); (построение
графика) for i:=l to n do begin x:=a+i*h; u:=x0+round((x-a)*tl);
v:=yv-round(f(x)*t2); lineto(u,v);
end;
end; (конец
процедуры
} begin
clrscr; write ('введи a,b и
n : '); readln(a,b,n); gd^Detect;
InitGraph (gd,gm, ' ' ) ;
errCode:=GraphResult ;
if errCode = grOk then begin
grafun(100,500,50,300,n,a,b);
grafun(550,620,10,100,200,-0.1,0.1);
repeat until keypressed; CloseGraph;
end else writeln( "ezzCode=' ,errCode)
end.
Для изображения поверхностей, определяемых функцией двух переменных z=f(x,y), можно использовать разные способы. Одним из них является метод построения семейства одномерных графиков функции z=f(x.y) от одной переменной х или у различных фиксированных значениях другой. Это может быть хорошей тренировкой для самостоятельной работы по освоению графики.
Построение движущихся изображений.
Особую ценность в графике представляет организация движения фрагментов рисунка. Наиболее просто это сделать по следующему плану:
• нарисовать фрагмент
в нужном месте экрана;
• стереть фрагмент, рисуя его цветом фона или используя процедуру cleardevice;
• снова нарисовать фрагмент в другом месте экрана.
Такой способ осуществлен в программе billiard, где два шарика радиусом 5 пикселей разных цветов двигаются с одинаковой скоростью внутри зеленого прямоугольника, построенного с помощью процедуры bar.
Процедура blou измеряет смещение центра шарика от сторон прямоугольника по каждой оси и, если это смещение на следующем шаге цикла станет меньше радиуса, изменяет направление движения, моделируя поведение упругого шара при ударе о стенку.
В программе также рассмотрена ситуация соприкосновения шариков во время их движения. Она решается примитивно просто: каждый шарик меняет направление своего движения на противоположное.
Программа 33
program billiard;
uses crt,graph;
var х,y,dx,dy,gd,gm:integer; xl,yl,dxl,dyl:integer;
procedure blow(a,b:integer; var c,d:integer);
begin if (a<107) or (a>523) then c:=-c;
if (b<107) or (b>363) then d:=-d;
end;
begin
gd:=detect; initgraph(gd,gm,''); setcolor(14);
setlinestyle(0,0,1); rectangle(99,99,531,371) ;
setfillstyle(l,3); bar(100,100,530,370) ;
x:=320; y:=240; dx:=2; dy:°2;
xl:=320; yl:=200; dxl:=-2; dyl:=-2;
repeat circle(x,y,5); setcolor(4); circle(xl,yl,5);
blow(x,y,dx,dy); blow(xl,yl,dxl,dyl); delay(10);
if (abs(x-xl)<=10) and (abs(y-yl)<=10) then begin
dx:—dx; dy:=-dy; dxl:=-dxl; dyl:=-dyl; delay(300)
end;
setcolor(3); circle(х,у,5);
x:=x+dx; y:=y+dy;
setcolor(3); circle(xl,yl,5) ;
xl:=xl+dxl; yl:=yl+dyl; setcolor(14)
until keypressed;
closegraph
end.
Еще один способ организации движения на экране, широко применяющийся в компьютерных играх, связан с использованием нескольких экранных страниц. В режиме Vgamed их две, а в режиме Vgalo - четыре. Страницы имеют номера: 0,1,... В любой момент времени одну из страниц можно сделать видимой и посмотреть ее содержимое на экране с помощью процедуры setvisualpage(номep).
Визуальная страница обычно пассивна, т.е. на ней нельзя выполнять графические процедуры. Другую страницу можно объявить активной с помощью процедуры setactivepage(номep). Активная страница невидима для пользователя. На ней можно подготовить другой рисунок. В следующий момент можно поменять роли страниц, т.е. визуальную сделать активной и невидимой и на ней рисовать следующий кадр, а бывшую активную сделать визуальной и показать объект в новом месте экрана.
В программе helicopter с помощью страниц моделируется вращение винтов вертолета. Две процедуры verti и vert2 подготавливают рисунки вертолета с разным положением винтов. Изображения выводятся на разные страницы, которые потом по очереди становятся то видимыми, то активными.
В программе организовано также движение вертолета по эллиптической орбите. Центр орбиты - точка (х0,у0) - располагается в центре экрана, числа а=250 и b=130 -горизонтальная и вертикальная полуоси эллипса. Положение вертолета на орбите 'вычисляется по формулам
u=x0+round(a*cosp), t=y0+round(b*sinp),
где р - чекущии угол, образованный радиус-вектором точки эллипса с осью абсцисс.
Программа 34
program helicopter;
uses crt,graph;
const step=0.01;
var gd,gm,u,t,z,k,xO,yorc,ac,vi:integer; p,a,b:real;
procedure vertl(x,у:integer) ;
begin
cleardevice; setcolor(14);
setlinestyle (0,0,1); setfillstyle(1,3) ;
line(x+12,y,x+36,y);line(x+24,y,x+24,y+8) ;
fillellipse(x+24,y+14,12,7); moveto(x+18,y+20);
lineto(x,y+20); lineto(x,y+14);
line(x+18.y+28,x+30,y+28); line(x+24,y+27,x+24,y+21) ;
end;
procedure vert2(x,у:integer);
begin
cleardevice; setcolor(14);
setlinestyle(0.0,1); setfillstyle(1,3) ;
line(x+22,y,x+26,y); line(x+24,у,x+24,y+8) ;
fillellipse(x+24,y+14,12,7); moveto(x+18,y+20) ;
lineto(x,y+20); lineto(x,y+14) ;
line(x-3,y+14,x+3,y+14); line(x+24,y+27,x+24,y+21) ;
line(x+18,y+28.x+30,y+28);
end;
begin
gd:=vga; gm:=vgamed; initgraph(gd,gm,' ');
x0:=getmaxx div 2; y0:=getmaxy div 2;
z:=l; p:=pi; a:=250; b:=130; ac:=0; vi:=l;
for k:=l to 800 do
begin u:=x0+round(a*cos(р)); t:=y0-round(b*sin(p));
• setactivepage(ac); setvisualpage(vi);
if z=l then vertl(u,t) else vert2(u,t); z:=-z;
delay(50); p:=p+step; c:=ac; ac:=vi; vi:=c:
end; closegraph
end.
РАБОТА С ВНЕШНИМИ УСТРОЙСТВАМИ
Как уже говорилось ранее, модель «Е97» отражает наиболее простые методы обмена с внешними устройствами из тех, что свойственны современным компьютерам.
Как и в реальных микропроцессорах, «общение» с периферийными устройствами осуществляется через порты ввода-вывода. Для учебной ЭВМ принята наиболее простая модель, когда каждому из имеющихся внешних устройств соответству ет два порта - порт данных и порт состояния. Можно считать, что каждый порт представляет собой 16-разрядный регистр, находящийся в контроллере. Через порт данных происходит обмен информацией. Порты состояния позволяют управлять процессом обмена данными, так как предоставляют процессору сведения о текущем состоянии внешнего устройства. Реальная синхронизация ввода-вывода является достаточно сложной проблемой и существенно зависит от типа периферийного устройства. Поэтому в «Е97» регистр состояния устроен максимально просто: в нем имеется единственный используемый бит - бит готовности. В обсуждаемом учебном компьютере бит готовности помещается в седьмом разряде регистра состояния.
Все порты являются 16-разрядными, но реальная информация всегда располагается в их младшем байте. Содержимое битов с 8-го по 15-й в выходные порты формально заносится, но никакого влияния на устройство вывода не оказывает.
Каждому порту соответствует свой номер (адрес). В «Е97» из шестнадцати возможных используются следующие порты:
0 - порт состояния клавиатуры (только чтение);
1 - порт данных клавиатуры (только чтение);
2 - порт состояния дисплея (только чтение);
3 - порт данных дисплея (только запись).
Стандартный алгоритм обмена с использованием портов ввода-вывода выглядит следующим образом. Считывается порт состояния и проверяется значение знакового бита
его младшего банта. Эта операция повторяется до тех пор, пока бит готовности не будет установлен внешним устройством в единицу, что является сигналом процессору к началу обмена. Только после него процессор может записать информацию в порт данных, если речь идет об устройстве вывода, или считать их из порта, если это порт ввода.
Вот как может выглядеть правильная программа вывода одиночного символа из R0 на дисплей (именно так она реализована в ПЗУ «Е97»):
0А21 порт2=>R1
Е401 сравнить с 0 R1b
2DFA если ? 0, PC - 6 (к повторению проверки)
0В03 R0 => порт 3
Первые три команды считывают и проверяют бит готовности в порту 2, а последняя команда обеспечивает собственно вывод требуемого символа на дисплей.
Обратите внимание на команду с «короткой константой» 0, которая обязательно должна проверять знаковый разряд младшего байта, а не всего слова в целом.
Мы подробно рассмотрели программирование процедуры вывода символа; ввод осуществляется совершенно аналогично.
РАЗЛИЧНЫЕ ПОДХОДЫ К ПОНЯТИЮ «АЛГОРИТМ»
Понятие алгоритма - одно из фундаментальных понятий информатики. Алгоритмизация наряду с моделированием выступает в качестве общего метода информатики. К реализации определенных алгоритмов сводятся процессы управления в различных системах, что делает понятие алгоритма близким и кибернетике.
Алгоритмы являются объектом систематического исследования пограничной между математикой и информатикой научной дисциплины, примыкающей к математической логике - теории алгоритмов.
Особенность положения состоит в том, что при решении практических задач, предполагающих разработку алгоритмов для реализации на ЭВМ, и тем более при использовании на практике информационных технологий, можно, как правило, не опираться на высокую формализацию данного понятия. Поэтому представляется целесообразным познакомиться с алгоритмами и алгоритмизацией на основе содержательного толкования сущности понятия алгоритма и рассмотрения основных его свойств. При таком подходе алгоритмизация более выступает как набор определенных практических приемов, особых специфических навыков рационального мышления в рамках заданных языковых средств. Можно провести аналогию между этим обстоятельством и рассмотренным выше подходом к измерению информации: тонкие математические построения при «кибернетическом» подходе не очень нужны при использовании гораздо более простого «объемного» подхода при практической работе с компьютером.
Само слово «алгоритм» происходит от algorithmi - латинской формы написания имени великого математика IX века аль-Хорезми, который сформулировал правила выполнения арифметических действий. Первоначально под алгоритмами и понимали только правила выполнения четырех арифметических действий над многозначными числами.
РАЗЛИЧНЫЕ ПРИМЕРЫ МОДЕЛИРОВАНИЯ СЛУЧАЙНЫХ ПРОЦЕССОВ
Метод статистического моделирования имеет множество приложений. Чаще всего он заключается в том, что для решения математической задачи строится некоторая случайная величина ?, такая, что математическое ожидание этой случайной величины E(?) является значением искомого решения. Проводя достаточное количество раз эксперимент со случайной величиной ?, можно найти приближенное решение как среднее значение результатов эксперимента.
1. Вычисление площадей.
Найти площадь фигуры G,
вписанной в прямоугольник с размерами сторон а
и b. С помощью датчика равновероятно распределенных случайных чисел многократно генерируются координаты точки, принадлежащей прямоугольнику. Очевидно, что при большом числе испытаний площадь фигуры G
приближенно равна отношению числа точек, попавших в область G, к числу всех разыгранных точек. В качестве примера приведем программу вычисления числа ?, находя указанным методом площадь круга, вписанного в квадрат, по 100000 испытаний. Оценку точности полученного результата оставляем читателям.
Программа 154.
Вычисление числа ? методом Монте-Карло
Program Chislo_Pi;
Uses Crt; Var I, N : Longint; X, Y : Real;
Begin
Randomize; N := 0;
For I := 1 To 100000 Do
Begin
X := Random; Y := Random;
If Sqr(X - 0.5) + Sqr(Y - 0.5) < 0.25 Then N := N + 1
End;
WriteLn ('pi=', (N / 100000 / Sqr(0.5)) : 8 : 5) ;
Repeat Until KeyPressed End.
2. Задача Бюффона.
На поле, разграфленное параллельными прямыми, расстояние между которыми L, бросается наугад игла длиной l (рис. 7.60). Какова вероятность того, что игла, упав, пересечег хотя бы одну прямую?
Рис. 7.60. К. задаче Бюффона
Ж.Бюффон (XVIII в.) подсчитал: р =
. Таким образом, если L = 2l, то р=
. Кроме того, р=
,где N - число бросаний, N1 - число пересечений иглы с линиями.
Относительная доля случаев, когда игла пересечет хотя бы одну из параллельных прямых равно р =
. Это был один из старинных способов опредения числа ?.Имитационное моделирование проведем следующим образом.
Примем L
= 1 и l =
• генерация координат точек А(х1, y1), B(x2, у2);
• определение координат точки В1(х1
+ ?(х2 – х1), у1
+ ?(у2 – у1)),
где
Поскольку расстояние между горизонтальными линиями взято равным единице, а сами линии имеют целочисленные координаты по у, то определить, пересекает ли игла прямую, очень просто - да, если целые части ординат тoчeк A и В1
различны.
Программа 155
Решение задачи Бюффона.
Program Buffon;
Uses Crt; Var I, J, K, M, N : Integer; XI, X2, Y1, Y2, Al : Real;
Begin
Randomize; M := 30000; N := 1;
For I := 1 To M Do
Begin
X1 := Random * 20; Yl := Random * 20; X2 := Random * 20;
Y2 := Random * 20;
A1 := 0.5 / Sqrt(Sqr(X2 – X1) + Sqr(Y2 - Yl) ) ;
J := Round(Yl); К
:= Round(Yl + A1 * (Y2 – Y1));
If J <> К
Then N := H + 1
End;
WriteLn('pi=', W / N) : 8 : 5); Repeat Until KeyPressed
End.
Создание демонстрационной программы, которая выводит на экран несколько параллельных прямых из общего набора и имеющие к ним отношение «иглы», предоставляем читателю.
Рекомендуем провести с предложенной программой несколько экспериментов. Понятно, что чем больше значение т, тем, по-видимому, точнее результат. Однако. почему он постоянно слегка занижен? Все ли учтено на краях той зоны, в которой разыгрываются броски иглы? Чтобы почувствовать проблему, следует увеличить число параллельных прямых, что в данной программе очень легко сделать. Почему результат становится лучше? Отметим, что проблема краевых условий, когда события должны по условиям задачи разыгрываться на бесконечном поле, а при имитационном моделировании фактически разыгрываются на конечном (и даже не очень большом), возникает часто и решение ее нетривиально.
3. Нефтяное месторождение.
Дано нефтяное месторождение, в котором область залегания нефти G ограничивается кривой С. Дебит скважины, т.е. количество получаемой из нее нефти в единицу времени, зависит от пластового давления нефти U в точке скважины. Поэтом) для прогнозирования нефтедобычи важно знать распределение пластового давления на всем месторождении при условии, что оно экспериментально измерено лишь на его границе. В математическом плане функция U(r) удовлетворяет уравнению Лапласа = 0; задача нахождения его решения внутри области при заданном значении U(r) на границе - так называемая, краевая задача Дирихле; в данной задаче это решение, которое часто совсем не просто найти аналитически, позволило бы правильно определить точку для скважины.
Рис. 7.61. Наложение сетки на заданную область
Покроем область G
мелкой сеткой. Отметим узлы, наиболее близкие к границе С, и будем считать, что значения функции U в этих узлах приблизительно равны значениям этой функции в ближайших к ним точках границы. Будем искать значение функции U(A) в некотором внутреннем узле A (рис. 7.61).
Поместим в точке А
блуждающую частицу, которая может перемещаться по области в последовательные моменты времени, переходя из одного угла в соседний. Направления перемещений случайны, равновероятны и не зависят от ее положения и предыстории блуждания. Случайный эксперимент состоит в наблюдении факта выхода блуждающей частицы в некоторый граничный узел. Когда блуждание прекращается, запоминается значение функции f(сi) в этой точке, и так далее, N раз. Замечательный факт состоит в том, что решение в точке
Другими словами, среднее значение приближенно равно решению задачи Дирихле в точке А.
4. Модель «пьяницы» (модель случайного блуждания). Зададим блуждание точки (объекта) по горизонтальной линии по правилу: если случайное число из интервала [0, 1] меньше 0,5, то точка делает шаг вправо x = х + h, в противном случае x = х - h.
Программа 156.
Модель случайного блуждания
Program Tochka;
Uses Crt, Graph; Var I, J : Integer; Z, P, X, H, Y : Integer;
Begin
X := 320; Y := 240; H := 10; P := 4; DetectGraph(I, J) ;
InitGraphd, J, ");
SetColor(15); Line(10, 312, 630, 312); Randomize;
Repeat
Z := Random(8); If Z >= P Then X := X + H Else X := X - H;
SetColor(Green); Circle(X, Y, 10); Delay(200);
SetColor(0); Circle(X, Y, 10)
Until KeyPressed Or (X >= 640) Or (X <= 0); CloseGraph
End.
В программе шаг является постоянным, но никто не мешает нам сделать его переменным, выбирая из интервала [0, hmax] случайным образом. Для этого зададим максимально возможный шаг НМах и в цикле определим H := Random(HMax).
Если задать аналогичным образом вероятности движения точки вверх – вниз, вправо - влево (0 < рх < 1, 0 < рy < 1), получим хаотическое блуждание точки на плоскости. Для моделирования блуждания точки в замкнутом прямоугольном объеме примем абсолютно упругое (зеркальное) отражение от стенок.
Программа 157.
Хаотическое блуждание точки
Program Broun;
Uses Crt, Graph;
Var I, J, X, Y, HxMax, HyMax, Hx, Ну : Integer; PI, P2, Z1, Z2 : Real;
Begin
X := 320; Y :== 240; HxMax := 30; PI := 0.5; P2 := 0.5; HyMax := 30;
DetectGraph (I, J) ; InitGraph (1, J, ''); SetColor(15);
Randomize; RectAngle(100, 100, 540, 380);
SetColor(Green); Circle(X, Y, 10); Delay(200); SetColor(0);
Circle(X, У, 10);
Repeat
Zl := Random; Z2 := Random; Hx := Random(HxMax);
Ну := Random(HyMax) ;
If (Zl < PI) Then X := X + Hx Else X := X - Hx;
If
(Z2 < P2) Then Y := Y + Ну Else Y :" У - Ну;
If X <= 110 Then X := X + 2 * (110 - X) ;
If X >= 530 Then X := X - 2 * (-530 + X) ;
If Y <= 110 Then Y := Y + 2 * (110 - Y) ;
If Y >= 370 Then Y := Y - 2 * (Y - 370);
SetColor(Green); Circle(X, Y, 10); Delay(100);
SetColor(0); Circle(X, Y, 10)
Until Keypressed; CloseGraph
End.
Подобным (хотя и более сложным) образом происходит броуновское движение, хорошо известное из курса физики. Если след точки не стирать, то можно будет наблюдать на экране траекторию такого движения.
Нет большого труда перейти к случаю п
частиц. Для этого необходимо завести два массива координат точек и аналогично предыдущему примеру организовать их движение.
Программа 158.
Броуновское движение
Program Gaz;
Uses Crt, Graph;
Var I, J, HxMax, HyMax, Hx, Ну, N, I : Integer;
X, Y : Array[0..500] Of Integer; PI, P2, Z1, Z2 : Real;
Begin N := 100;
For I := 1 To N Do Begin X[I] := 320; Y[I] := 240 End;
HxMax := 10; PI := 0.5; P2 := 0.5; HyMax := 10;
DetectGraph (1, J) ; InitGraphd, J, ' '); SetColor(15);
Randomize; RectAngle(100, 100, 540, 380);
For I := 1 To N Do PutPixel(X[I], Y[I], White); Delay(200);
For I := 1 To N Do PutPixel(X(I], Y[I], 0) ;
Repeat
For I := 1 To N Do
Begin
Zl := Random; Z2 := Random;
Hx := Random(HxMax); Ну := Random(HyMax);
If Zl < PI Then X[I] := X[I] + Hx Else X[I] := X[I]— Hx;
If Z2 < P2 Then Y[I] := Y[I] + Ну Else Y[I] := Y[I] - Ну;
If X[I] <= 110 Then X[I] := X[I] + 2 * (110 - X[I]);
If X(I] >= 530 Then X[I] := X[I] - 2 * (-530 + Х[I];
If Y[I] <= 110 Then Y(I] := Y[I] + 2 * (110 - Y[I]);
If Y[I] >= 370 Then Y[I] := Y[I] - 2 * (Y[I] - 370);
PutPixel (X[I], Y[I], 15)
End; Delay(100);
For I := 1 To N Do PutPixel(X[I], Y[I], 0)
Until KeyPressed; CloseGraph
End.
Построенная компьютерная модель в первом приближении может позволить моделировать многие явления и процессы, происходящие в газах: рассеивание облака, диффузия газов. С ее помощью можно получить многие зависимости параметров газа друг от друга. В частности, давление (число соударений частиц на стенки) от длины свободного пробега (величин HxMax и
HyMax) или от числа частиц.
Представляет значительный интерес имитационное моделирование явлений в сплошных средах, удовлетворяющих законам идеального газа, таких, как истечение газа в вакуум, ударная волна, волны разрежения и т.п. Для модернизации модели можно ввести в алгоритм упругое столкновение частиц друг с другом, возникновение кластерных ансамблей и многое другое.
При вероятностном моделировании используют различные методы, которые позволяют решать задачи из различных областей.
Ниже перечислены сферы применения вероятностных методов.
Метод статистического моделирования: решение краевых задач математической физики, решение систем линейных алгебраических уравнений, обращение матриц и сводящиеся к ним сеточные методы решения систем дифференциальных уравнений, вычисление кратных интегралов, решение интегральных и интегродифференциальных уравнений, задач ядерной физики, газовой динамики, фильтрации, теплотехники.
Метод имитационного моделирования: моделирование систем массового обслуживания, задачи АСУ, АСУП и АСУТП, задачи защиты информации, моделирование сложных игровых ситуаций и динамических систем.
Метод стохастической аппроксимации: рекуррентные алгоритмы решения задач статистического оценивания.
Метод случайного поиска: решение задач оптимизации систем, зависящих от большого числа параметров, нахождение экстремумов функции большого числа переменных.
Другие методы: вероятностные методы распознавания образов, модели адаптации, обучения и самообучения.
РАЗЛИЧНЫЕ УРОВНИ ПРЕДСТАВЛЕНИЙ ОБ ИНФОРМАЦИИ
Ранее мы неоднократно употребляли термин «информация», никак его при этом не раскрывая.
Понятие информация
является одним из фундаментальных в современной науке вообще и базовым для изучаемой нами информатики. Информацию наряду с веществом и энергией рассматривают в качестве важнейшей сущности мира, в котором мы живем. Однако, если задаться целью формально определить понятие «информация», то сделать это будет чрезвычайно сложно. Аналогичными «неопределяемыми» понятиями, например, в математике является «точка» или «прямая». Так, можно сделать некоторые утверждения, связанные с этими математическими понятиями, но сами они не могут быть определены с помощью более элементарных понятий.
В простейшем бытовом понимании с термином «информация» обычно ассоциируются некоторые сведения, данные, знания и т.п. Информация передается в виде сообщений,
определяющих форму и представление передаваемой информации. Примерами сообщений являются музыкальное произведение; телепередача; команды регулировщика на перекрестке; текст, распечатанный на принтере; данные, полученные в результате работы составленной вами программы и т.д. При этом предполагается, что имеются «источник информации» и «получатель информации».
Сообщение от источника к получателю передается посредством какой-нибудь среды, являющейся в таком случае «каналом связи» (рис. 1.3). Так, при передаче речевого сообщения в качестве такого канала связи можно рассматривать воздух, в котором распространяются звуковые волны, а в случае передачи письменного сообщения (например, текста, распечатанного на принтере) каналом сообщения можно считать лист бумаги, на котором напечатан текст.
Рис. 1.3. Схема передачи информации
Человеку свойственно субъективное восприятие информации через некоторый набор ее свойств: важность, достоверность, своевременность, доступность и т.д. В этом смысле одно и то же сообщение, передаваемое от источника к получателю, может передавать информацию в разной степени. Так, например, вы хотите сообщить о неисправности компьютера.
Для инженера из группы технического обслуживания сообщение «компьютер сломался» явно содержит больше информации, чем для вахтера. Но, в свою очередь, для инженера сообщение «не включается дисплей» содержит информации больше, чем первое, поскольку в большей степени снимает неопределенность, связанную с причиной неисправности компьютера. Как видно, одно и то же сообщение для различных пользователей несет различную информацию.
Использование терминов «больше информации» или «меньше информации» подразумевает некую возможность ее
измерения (или хотя бы количественного соотнесения). При субъективном восприятии измерение информации возможно лишь в виде установления некоторой порядковой шкалы для оценки «больше» -«меньше», да и то субъективной, поскольку на свете немало людей, для которых, например, оба сообщения, использованных выше в качестве примера, вообще не несут никакой информации. Такое становится невозможным при введении объективных характеристик, из которых для информации важнейшей является количество. Однако, при объективном измерении количества информации следует заведомо отрешиться от восприятия ее с точки зрения субъективных свойств, примеры которых перечислены выше. Более того, не исключено, что не всякая информация будет иметь объективно измеряемое количество - все зависит от того, как будут введены единицы измерения. Не исключено и то, что при разных способах введения единиц измерения информация, содержащаяся в двух допускающих измерение сообщениях, будет по разному соотноситься.
РАЗНОВИДНОСТИ КОМПЬЮТЕРНЫХ ВИРУСОВ
Рассмотрим подробнее основные особенности компьютерных вирусов, характеристики антивирусных программ и меры зашиты программ и данных от компьютерных вирусов в наиболее распространенной операционной системе MS DOS.
По приближенным оценкам к 1997 г. существовало около 7000 различных вирусов. Подсчет их осложняется тем, что многие вирусы мало отличаются друг от друга, являются вариантами одного и того же вируса и, наоборот, один и тот же вирус может менять свой облик, кодировать сам себя. На самом деле основных принципиальных идей, лежащих в основе вирусов, не очень много (несколько десятков).
Среди всего разнообразия вирусов следует выделить следующие группы:
•загрузочные (boot) вирусы
заражают программу начальной загрузки компьютера, хранящуюся в загрузочном секторе дискеты или винчестера, и запускающиеся при загрузке компьютера;
• файловые вирусы в простейшем случае заражают пополняемые файлы, но могут распространяться и через файлы документов (системы Word for Windows) и даже вообще не модифицировать файлы, а лишь иметь к ним какое-то отношение;
• загрузочно-файловые вирусы
имеют признаки как загрузочных, так и файловых вирусов;
• драйверные вирусы
заражают драйверы устройств компьютера или запускают себя путем включения в файл конфигурации дополнительной строки.
Из вирусов, функционирующих не на персональных компьютерах под операционной системой MS DOS, следует упомянуть сетевые вирусы, распространяющиеся в сетях, объединяющих многие десятки и сотни тысяч компьютеров.
Рассмотрим принципы функционирования загрузочных вирусов. На каждой дискете или винчестере имеются служебные сектора, используемые операционной системой для собственных нужд, в том числе сектор начальной загрузки. В нем помимо информации о дискете (число дорожек, число секторов и пр.) хранится небольшая программа начальной загрузки, о которой уже рассказывалось в настоящей главе.
Простейшие загрузочные вирусы, резидентно находясь в памяти зараженного компьютера, обнаруживают в дисководе незараженную дискету и производят следующие действия:
• выделяют некоторую область дискеты и делают ее недоступной операционной системе (помечая, например, как сбойную - bad);
• замещают программу начальной загрузки в загрузочном секторе дискеты, копируя корректную программу загрузки, а также свой код, в выделенную область дискеты;
• организуют передачу управления так, чтобы вначале выполнялся бы код вируса и лишь затем - программа начальной загрузки.
Магнитные диски компьютеров винчестерского типа обычно бывают разбиты на несколько логических разделов. Программы начальной загрузки при этом имеются в MBR (Master Boot Record - главная загрузочная запись) и в загрузочном разделе винчестера, заражение которых может происходить аналогично заражению загрузочного сектора дискеты. Однако, программа начальной загрузки в MBR использует при переходе к программе загрузки загрузочного раздела винчестера, так называемую таблицу разбиения (Partition table), содержащую информацию о положении загрузочного раздела на диске. Вирус может исказить информацию Partition table и таким образом передать управление своему коду, записанному на диск, формально не меняя загрузочной программы.
Теперь рассмотрим принципы функционирования файловых вирусов. Файловый вирус не обязательно является резидентным, он может, например, внедриться в код исполняемого файла. При запуске зараженного файла вирус получает управление, выполняет некоторые действия и возвращает управление коду, в который он был внедрен. Действия, которые выполняет вирус, включают поиск подходящего для заражения файла, внедрение в него так, чтобы получить управление при запуске файла, произведение некоторого эффекта, например, звукового или графического. Если файловый вирус резидентный, то он устанавливается в памяти и получает возможность заражать файлы и проявляться независимо от первоначального зараженного файла.
Заражая файл, вирус всегда изменит его код, но далеко не всегда производит другие изменения. В частности, может не изменяться начало файла и его длина (что раньше считалось признаком заражения).Например, вирусы могут искажать информацию о файлах, хранящуюся в служебной области магнитных дисков -таблице размещения файлов (FAT - file allocation table), - и делать таким образом невозможной любую работу с файлами. Так ведут себя вирусы семейства «Dir».
Загрузочно-файловые вирусы
используют принципы как загрузочных, так и файловых вирусов, и являются наиболее опасными.
РЕКУРСИЯ
Существует целый класс задач, в которых отношения между объектами можно определить, только пользуясь самими определяемыми соотношениями. Получающиеся при этом правила называются рекурсивными.
Пример:
рекурсивное определение натурального числа:
1) 1- натуральное число;
2) число, на 1 большее натурального числа, также натуральное.
В системах логического программирования рекурсия служит также для описания циклов, повторений и является важнейшим методом программирования.
Рассмотрим простой пример: вычисление факториала натурального числа n (n!) . Определение n! рекурсивно:
1)1!=1,
2)n!=(n-l)!*n.
Для описания отношения «факториал» между n и n! будем использовать двухарный предикат
факт(N,М). Тогда база знаний, соединенная с запросом, приобретает вид (программа 115);
Программа 115
факт(1,1).
факт(N,Х): - факт( N-1 ,V), Х is Y*N.
?- факт(3,А);
В данной программе правило «факт» вызывает само себя - это и есть рекурсия. Запись is Y*N представляет собой обращение к встроенному предикату «is» («есть») для описания арифметического действия.
Процесс работы программы можно изобразить следующим образом:
?факт(3,A0).
ОТВЕТ: А=6
?факт(1,A2).
Х1= 2*3 = 6
факт(1,1)
Х2=1*2=2
Здесь стрелочка вниз означает сопоставление и резолюцию, а стрелочка вверх - возврат и завершение отложенного вычисления.
Правило «факт» вызывает само себя - происходит углубление рекурсии (прямой ход). При этом в памяти ЭВМ выделяется место для переменных А,АО,А1,А2 и N,NO,N1,N2, образующих стеки. При согласовании вопроса с предикатом факт(1,1) рекурсия прекращается и начинается возврат из рекурсии (обратный ход) - выполнение отложенных на прямом ходе согласований. Предикат факт(1,1) играет очень важную роль - это ограничитель рекурсии, условие ее завершения.
Отметим, что Пролог стремится найти все решения поставленной задачи, а значит, после появления ответа А=6 происходит возврат к вопросу ?факт(1,А2) и попытке согласовать его с правилом «факт». Это приводит к бесконечному процессу рекурсии с отрицательными аргументами в «факт», которая завершается при исчерпании глубины зарезервированных интерпретатором Пролога стеков.
Ускорить выход из рекурсии можно, добавив к предикату «факт(1,1)» отсечение !:
факт(1,1):-!.
Однако, использование отсечения требует более подробного рассмотрения. В общем случае последовательность предложений в базе знаний не имеет значения. Однако это не так для рекурсивно-определенных отношений. Например:
родитель(Х):- родитель(Y),отец(Y,Z).
родитель(коля).
отец(коля,петя).
родитель(петя).
В этом случае в первом предложении голова имеет ту же функцию, что и одна из целей - «родитель». В процессе поиска ответа в этой базе знаний будет применено правило: предложение, стоящее первым, будет применено первым - известное как принцип поиска в глубину.
Это приведет к тому, что система будет обращаться только к первому предложению базы знаний и ответ на вопрос не будет найден никогда (образуется бесконечная петля вывода). Однако небольшое изменение базы знаний - перестановка двух предложений местами - приведет к удачному поиску решения.
Программа 116
родитель(коля).
родитель(X):- родитель(Y), отец(Y,Х).
отец(коля,петя).
? - родитель(петя).
Неограннчено-повторное обращение к предложению может быть и более замаскированным так, как это получается в программе 117.
Программа 117
выше(А,В): - ниже(В,А).
ниже(В,А): - выше(А, В).
выше(коля,петя).
?- ниже(петя,коля).
Однако если третье предложение стоит на первом месте, то повторного обращения не произойдет и ответ будет найден.
В общем виде рекурсия на Прологе выглядит так:
Р(1,...).
P(n,...) -Q1,..., Qn, P(n-l,...), R1,... Rm.
Правило Р обращается само к себе, при этом происходит углубление рекурсии. Предикаты Q1, .... Qn выполняются на прямом ходе рекурсии, а R1,..., Rm - на обратном; n - это некоторый условный параметр, входящий в условие продолжения рекурсии, а Р(1,...)- факт, завершающий процесс рекурсии.
Особенно простым случаем рекурсии является простое циклическое повторение. Один из способов организации повторения связан с наличием в базе знаний процедуры вида repeat, repeat: - repeat.
Использование repeat в качестве подцели некоторого правила приводит к многократному повторению остальных подцелей этого правила.
РЕКУРСИЯ И ЦИКЛ В ПРОГРАММАХ НА ЛИСПЕ
В «чистом» функциональном программировании организация повторяющихся вычислений должна происходить лишь с помощью условных предложений и определения рекурсивных, вызывающих самих себя, функций. Рассмотрим в качестве примера функцию, просто определяемую через рекурсию, - факториал n!=1*2 * 3 *...* (n-1) * n =
(n-1)! т n (0! = 1 по определению):
(defun ! (n) (if(= п 0) 1 (* п (! (. п 1))))) .
Имя функции - "!", ее аргументом является переменная n. Лямбда-выражение, определяющее функцию, представляет собой условную if-форму, которая в случае n=0 возвращает 1, а в противном случае вычисляет произведение n и результата вызова этой же функции ! для аргумента n-1.
Пример вызова этой функции:
(!5)
Результат: 120.
В случае повторяющихся вычислений в Лиспе могут быть использованы не только рекурсивные функции, но и известные по процедурным языкам циклы. Самым общим циклическим предложением в Лиспе является DO, имеющее следующую форму:
(DO ((nepi знач! шаг1) (пер2 знач2 шаг 2) ...)
(условие-окончания форма11 форма12 ...)
форма21 форма22 ...)
Вычисление предложения DO начинается с присваивания переменным пep1, пер2, ... начальных значений знач1, знач2, . . . соответственно; потом вычисляется условие окончания и, если оно истинно, последовательно вычисляются формы форма1i, и значение последней возвращается как результат DO-предложения. В противном случае вычисляются формы форма2i из тела предложения DO, затем значения переменных пep1, пер2, . . . изменяются на величину шага шаг1, шаг2, ... и все повторяется.
Для примера с помощью предложения DO определим функцию expt, вычисляющую n-ю степень числа х (n - целое положительное):
(defun expt (х n)
(do ((результат 1)) ; начальное значение
((= n 0 ) результат ) ; условие окончания
(setq результат (* результат х))
(setqn(^nl))))
Результат задания функции: EXPT.
Пример вызова:
(expt 2 3)
Результат: 8.
Итеративные (циклические) и рекурсивные программы теоретически одинаковы по своим вычислительным возможностям, однако свойства итеративных и рекурсивных вариантов программ могут существенно различаться. Рекурсивные программы более короткие и содержательные. Особенно полезно использовать рекурсию в тех случаях, когда решаемая задача и обрабатываемые данные по своей сути рекурсивны, например, при обработке списков, так как списки могут рекурсивно содержать подсписки, при работе с другими динамическими структурами, которые заранее не полностью известны. Рекурсивные процедуры играют важнейшую роль почти во всех программах, связанных с искусственным интеллектом.
РЕКУРСИВНЫЕ АЛГОРИТМЫ
Изучая в предыдыщем разделе язык Паскаль, мы уже использовали понятие рекурсии. Однако, оно столь важно и принципиально, что с ним следует познакомиться детальнее.
Рекурсией называют метод определения или вычисления функции, процедуры или решения задачи посредством тон же функции, процедуры и т.д. Рекурсивные алгоритмы широко используют методы частных целей, подъема и отрабатывания назад. На эвристическом уровне рекурсия позволяет эффективно использовать метод проб и ошибок.
Продолжим рассмотрение примера задачи тура шахматного коня из предыдущего раздела. Приведенный там алгоритм строил возможный путь коня по простой стратегии очередного хода на свободное место по принципу часовой стрелки. Однако, он не позволял гарантированно найти полный тур коня. Применим простую эвристическую модель решения задачи - в случае отсутствия возможности очередного хода осуществляется возврат коня на предыдущее поле и возобновление поиска дальнейшего маршрута по другому пути. Подобный процесс называют возвратом (или откатом). Его можно осуществлять по универсальной схеме:
procedure RETR;
begin
инициализация начального хода repeat выбор очередного хода
if подходит then его запись;
if решение не полное then RETR;
if неудача then стирание хода и возврат на предыдущий until удача or нет хода
end.
Подобная рекурсивная процедура и уже известный алгоритм, рассмотренный выше, позволяют построить нужную программу. Ниже представлена программа тура коня для произвольного поля NxN, позоляющая отыскивать полный тур с любого начального положения. Для наглядной иллюстрации процесса поиска в глубину и в ширину с возвратами в программе в комментарные скобки обозначены команды вывода промежуточных результатов.
Программа 39
program tur;
var i, j, ii, jj, n, nn: integer; q: boolean;
dx, dy:array[1..8] of integer; h:array[1..8,1..8] of integer;
(*рекурсивная процедура - попытка сделать ход*)
procedure try(i,x,у:integer; var q:boolean);
var k, u, v: integer; ql: boolean;
begin
k:=0; repeat k:=k+l; ql:=false; u:=x+dx[k]; v:=y+dy(k];
if ( (1<=u) and(u<=n) and (1<=v) and (v<=n) ) and(h[u,v]=0)
then begin h[u,v]:=i;
(*для отладки и наблюдения процесса поиска с возвратом*')
for ii:=l to n do begin for jj:= 1 to n do
write(h[ii,jj]:5); writeln;
end;
readin;
if i<nn then begin try(i+l,u,v,ql);
if not(ql) then h[u,v]:=0
else ql:=truer;
end
else ql:=true
end;
until (ql) or (k=8);
q:=ql
end; (* конец процедуры*)
begin
dx[l] =2: dx[2]:=l; dx[3]:=-l; dx[4]:=-2; dx[5]:=-2;
dx[6] =-1: dx[7]:=l; dx[8]:=2; dy[l]:=l; dy[2]:=2;
dy[3] =2: dy[4]:=l; dy[5]:=-l; dy[6]:=-2;
dy[7] =-2: dy[8]:=-1;
write ('введи n: '); readln(n);
for i =1 to n do for j:=1 to n do h[i,j]:=0;
write; ('введи i,j : '); readln(i,j); nn:=n*n;
h[i,j]:=l; try(2,i,j,q);
if q then begin
for i:=l to n do begin
for j:= 1 to n do write(h[i,j]:5);
writeln;
end;
end ' else writeln( 'нет маршрута');
readln
end.
Для n = 5 и n = 6 алгоритм быстро находит искомые туры коня. Для n = 8 время решения может возрасти в несколько десятков раз.
Рассмотрим еще два замечательных рекурсивных алгоритма, позволяющих строить регулярные образы, в конечном счете образующие красивые узоры на экране дисплея. Узор образуется из серии выстраиваемого определенным образом заданного мотива. '
Ниже представлена программа, использующая при построении узора кривые Серпинского, рис. 3.13.
Рис. 3.13. Примеры кривых Серпинского
На рисунке изображены кривые Серпинского S1 и S2 первого и второго порядков. Кривую Серпинского Si можно разбить на 4 части: Ai, Bi, Ci, Di, которые соединяются четырьмя отрезками Эти четыре части кривой представляют одну и ту же ломаную, поворачивающуюся каждый раз на 90 градусов. Нетрудно увидеть рекурсивные схемы, по которым ломаные Ai, Bi. Ci, Di получаются из кривых A(i-l). B(i-l), C(i-l), D(i-l), размеры которых при этом сокращаются вдвое:
Ai: A(i-l) Bi: B(i-l) Ci: C(i-l) Di: D(i-l) |
B(i-l) – C(i-l) | D(i-l) – A(i-l) | |
D(i-l) A(i-l) B(i-l) C(i-l) |
A(i-l) B(i-l) C(i-l) D(i-l) |
Векторы, соединяющие отдельные элементы кривых, образуют с осью абсцисс углы, кратные pi/4; средние векторы во всех схемах имеют длину, в два раза большую, чем крайние. Для построения вектора длины U под углом T*pi/4 к оси абсцисс в программе описана процедура linep(T,U:integer):
Программа 40
program serpinsk;
uses crt,graph;
const sq=512;
var i, xO, yO, x, y, t, u, gd, gm: integer; ch:chart;
procedure linep(t,u:integer);
var xl, yl:integer;
begin x:=x+round(u*cos(t*pi/4)) ;
y:=y-round(u*sin(t*pi/4)); lineto(x,y) ;
end;
procedure b(i:integer); forward;
procedure с(i:integer); forward;
procedure d(i:integer); forward;
procedure a(i:integer);
begin
if i>0 then begin a(i-l); linep(7,u); b(i-l); linep(0,2*u);
d(i-l); linep(l,u); a(i-l)
end end; •
procedure b;
begin
if i>0 then begin b(i-l); linep(5,u); c(i-l); linep(6,2*u);
a(i-l); linep(7,u); b(i-l)
end end;
procedure c;
begin
if i>0 then begin c(i-l); linep(3,u); d(i-l); linep(4,2*u) ;
b(i-l); linep(5,u);C(i-l)
end end;
procedure d;
begin
if i>0 then begin d(i-l); linep(l,u); a(i-l); linep(2,2*u);
c(i-l); linep(3,u); d(i-l) end. end;
begin gd:=0; initgraph(gd, gm, ' ' );
u:=sq div 4; x0:=320; y0:=128; i:=0;
repeat
i:=i+l; x0:=x0-u; u:=u div 2; y0:=y0-u;
x:=x0; y:=y0; setcolor(2*i);
moveto(x,y); a(i); linep(7,u); b(i);
linep(5,u); c(i); linep(3,u);
d(i); linep(l,u); delay(2000) until i=5;
settextstyle(0,0,1) ;
outtextxy(200, 470, 'КРИВЫЕ
СЕРПИНСКОГО
S1 - S5');
readln; closegraph
end.
В 1891 г. Д. Гильберт открыл серию рекурсивных кривых, которые получили название кривых Гильберта. Кривая Гильберта Hi, подобно кривым Серпинского, может быть получена из четырех экземпляров кривой H(i-l) вдвое меньшего размера, повернутых должным образом и соединенных отрезками. Ниже приводится программа, рисующая узор из шести кривых Гильберта.
Программа 41
program hilbert;
uses crt,graph;
const sq=448;
var i,x0,y0,x,y,t,u,gd,gm:integer; ch:char;
procedure linep(t,u:integer);
var xl,yl:integer;
begin x:=x+round(u*cos(t*pi/4)); y:=y-round(u*sin(t*pi/4)) ;
lineto (x,y) ;
end;
procedure b(i:integer); forward;
procedure с(i:integer); forward;
procedure d(i:integer); forward;
procedure a(i:integer);
begin
if i> 0 then begin d(i-l); linep(4,u); a(i-l); linep(6,u);
a(i-l); linep(0,u); b(i-l)
end end;
procedure b;
begin
if i>0 then begin c(i-l); linep(2,u); b(i-l); linep(0,u);
b(i-l); linep(6,u); a(i-l)
end end;
procedure c;
begin
if i>0 then begin b(i-l); linep(0,u); c(i-l); linep(2,u);
c(i-l); linep(4,u); d(i-l)
end end;
procedure d;
begin
if i>0 then begin a(i-l); linep(6,u); d(i-l); linep(4,u);
d(i-l); linep(2,u); c(i-l)
end end;
begin gd:=0; initgraph(gd, gm, ' '); x0:=320; y0:=240; u:=sq; i:=0;
repeat
i:=i+l; u:=u div 2;
x0:=x0+(u div 2); y0:=y0-(u div 2) ;
x:=x0; y:=y0; setcolor(2*i);
moveto(x,y); a(i); delay(2000) until i=6;
settextstyle(0,0,1) ;
outtextxy(220,470, 'КРИВЫЕ ГИЛЬБЕРТА HI - Н6');
readin; closegraph
end.
РЕКУРСИВНЫЕ ФУНКЦИИ
Еще одним подходом к проблеме формализации понятия алгоритма являются, так называемые, рекурсивные функции. Исторически этот подход возник первым, поэтому в математических исследованиях, посвященных алгоритмам, он имеет наибольшее распространение.
Рекурсией называется способ задания функции, при котором значение функции при определенном значении аргументов выражается через уже заданные значения функции при других значениях аргументов. Применение рекурсивных функций в теории алгоритмов основано на идее нумерации слов в произвольном алфавите последовательными натуральными числами. Таким образом любой алгоритм можно свести к вычислению значений некоторой целочисленной функции при целочисленных значениях аргументов.
Введем несколько основных понятий. Пусть X, Y - два множества. Частичной функцией (или отображением) из Х в Y будем называть пару <D(f), f>, состоящую из подмножества D(f) Ì X
(называемого областью определения f)
и отображения f: D(f)
® Y. Если D(f)
пусто, то f нигде не определена. Будем считать, что существует единственная нигде не определенная частичная функция.
Через N
будем обозначать множество натуральных чисел. Через (N)n
(при п ³ 1) будем обозначать n-кратное декартово произведение N на себя, т.е. множество упорядоченных n-ок (х1 ..., xn), хi Ì N. Основным объектом дальнейших построений будут частичные функции из (N)m в (N)n для различных т и п.
Частичная функция f из (N)m
в (N)n называется вычислимой, если можно указать такой алгоритм («программу»), который для входного набора х Ì (N)m дает на выходе f(x), если х Ì D(f) и нуль, если х Ë
D(f). В этом определении неформальное понятие алгоритма (программы) оказывается связанным (отождествленным) с понятием вычислимости функции. Вместо алгоритмов далее будут изучаться свойства вычислимых функций. Вместо вычислимых функций оказывается необходимым использовать более широкий класс функций (и более слабое определение) - полувычислимые функции.
Частичная функция из (N)" в (N)" полувычислима, если можно указать такой алгоритм (программу), который для входного набора х с (N)" дает на выходе х е D(f),
или алгоритм работает неопределенно долго, если х е D(f). Очевидно, что вычислимые функции полувычислимы, а всюду определенные полувычислимые функции вычислимы.
Частичная функция f называется невычислимой, если она не является ни вычислимой, ни полувычислимой.
Из вновь введенных понятий основным является полувычислимость, так как вычислимость сводится к нему. Существуют как невычислимые функции, так и функции, являющиеся полувычислимыми, но не вычислимые. Пример такой функции:
Можно показать, что существует такой многочлен с целыми коэффициентами P(t, x1,...,xn), что g(t) - невычислима. Однако, легко видеть, что g(t) - полувычислима.
Фундаментальным открытием теории вычислимости явился, так называемый, тезис Черча, который в слабейшей форме имеет следующий вид: можно явно указать а) семейство простейших полувычислимых функций; б) семейство элементарных операций, которые позволяют строить по одним полувычислимым функциям другие полувычислимые функции с тем свойством, что любая полувычислимая функция получается за конечное число шагов, каждый из которых состоит в применении одной из элементарных операций к ранее построенным или к простейшим функциям.
Простейшие функции:
suc: N ® N; suc(x) = x+1 - определение следующего за х
числа;
l(n): (N)n ®
N; l(n) (x1,..., хn) = 1, п ³ 0 - определение «размерности» области определения функции;
рr: (N)n®
N; pr(x1,..., хn) = хi, х ³
1 - «проекция» области определения на одну из переменных.
Элементарные операции над частичными функциями:
а) композиция
(или подстановка) ставит в соответствие паре функций f из (N)m в (N)n и g из (N)n
в (N)p функцию h = gof из (N)m в (N)p , которая определяется как
б) соединение
ставит в соответствие частичным функциям fi из (N)ni, i = 1, ..., k функцию (fi, ..., fk) из (N)m в (N)n1
х... х (N)nk, которая определяется как
в) рекурсия
ставит в соответствие паре функций f из (N)n в N и g
из (N)n+2 в N функцию h
из (N)n+2 в N, которая определяется рекурсией по последнему аргументу
h(x1,... , хn, 1) = f (x1,... ,xп) (начальное условие),
h (x1,... ,хn, k+1) = g(x1,... ,xn, k, h(x1,... ,хn, k)) при k ³ 1 (рекурсивный шаг).
Область определения D(h) описывается также рекурсивно:
г) операция т,
которая ставит в соответствие частичной функции f из (N)n+1 в N частичную функцию h из (N)n в N, которая определяется как
Операция т
позволяет вводить в вычисления перебор объектов для отыскания нужного в бесконечном семействе.
Теперь, когда введены простейшие функции и элементарные операции, можно дать следующие основные определения:
а) последовательность частичных функций fi, . . . ,fN называют частично рекурсивным (соответственно примитивно рекурсивным) описанием функции fN = f, если fi - одна из простейших функций; fi
для всех i ³ 2 либо является простейшей функцией, либо получается применением одной из элементарных операций к некоторым из функций fi,..., fi-1 (соответственно одной из элементарных операций, кроме т);
б) функция f называется частично рекурсивной (соответственно примитивно рекурсивной), если она допускает частично рекурсивное (соответственно примитивно рекурсивное) описание.
Теперь можно привести тезис Черча в обычной форме:
а) функция f полувычислима, если и только если она частично рекурсивна;
б) функция f вычислима, если и только если рекурсивны f и характеристическая функция XD(f).
Характеристическая функция подмножества Х в Y(X Ì Y) есть такая функция, что
Тезис Черча может использоваться как определение алгоритмической неразрешимости.
Пусть имеется счетная последовательность «задач» P1, P2, ..., которые имеют ответ «да» или «нет». Такая последовательность носит название «массовой проблемы». Свяжем с ней функцию f из N в N:
Массовая проблема Р
называется алгоритмически разрешимой, если функции f и XD(f) частично рекурсивны. В противном случае Р называется алгоритмически неразрешимой.
РЕШЕНИЕ ЛОГИЧЕСКИХ ЗАДАЧ НА ПРОЛОГЕ
Целью всего предшествующего изложения была подготовка к данному разделу -решению содержательных логических задач на Прологе, т.е. задач невычислительного характера, в которых особенности Пролога и дескриптивной парадигмы программирования проявляются наиболее ярко.
Рассмотрим пример: нарисовать конверт, не отрывая карандаша от бумаги и не проводя два раза по одной и той же линии.
Введем обозначения, как показано на рис. 3.17. Ребра графа обозначены буквами а, б, в ... (литерные константы), вершины - цифрами 1, 2, 3 ... Опишем структуру графа предикатом вида «ребро (S, А, В)», что означает, что от вершины А к вершине В идет ребро S. Так как граф неориентированный, помимо предикатов вида «ребро (S, А, В)» нужны и предикаты «ребро (S, В, А)». Знания о структуре графа можно представить так, как это записано рядом с рис. 3.17.
Рис. 3.17. Задача «конверт»
Решением задачи должен явиться список пройденных ребер графа, причем длина его должна быть равна 8 и в нем не должно быть повторяющихся ребер, что можно описать так:
путь(Т,П) : - длина(П,8), write_list(П),!. (1)
путь(Т,П) : - ребро(Р,Т,Н),не_принад(Р,П),путь(Н,[Р|П]). (2)
Переменная Т обозначает текущую вершину графа, а П - список пройденных ребер Правило 1 означает, что если длина списка П пройденных вершин становится равной 8, список П выводится на печать. Это правило ограничивает рекурсивный перебор вершин и ребер, проводимый правилом 2. Правило 2 является генератором перебора, оно перебирает предикаты «ребро()»и находит такое ребро Р из текущей вершины Т в новую Н, чтобы оно не принадлежало списку П, затем это ребро добавляется в качестве головы к списку П, и поиск дальнейшего пути производится уже из новой вершины Н.
Нам потребуется программа, определяющая длину списка,
длина ([],()).
длина ([А | В], N) :- длина (В, М), N is M+1.
а также программа вывода элементов списка на экран
write_list([]).
write_list([H | T]):-write(H),write_list(T).
Задание
?-путь(4,[]).
- искать путь, начиная с вершины 4 и пустого списка пройденных ребер.
Ответ: з, ж, в, а, б, д, г, е.
На вопрос ?-путь(1,[]) ответ-«НЕТ».
Аналогично решаются другие задачи, связанные с поиском пути в графе, удовлетворяющего каким-то дополнительным условиям, например задача о коммивояжере. Программа будет состоять
1) из базы знаний о структуре графа - вершинах и связывающих их ребрах (каждому ребру может сопоставляться набор весов);
2) из правил, выражающих дополнительные условия и ограничения на решения задачи и часто связанных с обработкой списков.
3) из рекурсивного правила - генератора перебора ребер и вершин с некоторым ограничивающим предложением, целевым условием;
4) из дополнительных процедур и промежуточных определений.
Интересно, что большинство задач, которые считаются логическими, сводятся к задаче поиска пути в некотором графе - графе состояний задачи. К этому типу задач можно отнести и разнообразные игры. Характерными особенностями многих задач являются следующие:
1) наличие неких дискретных состояний, число которых конечно, и одно из них принимается за начальное, а другое (или несколько других) за конечное (искомое);
2) определены правила перехода между состояниями;
3) для каждого состояния заданы определенные условия допустимости (оценки) этого состояния.
При анализе предметной области задачи эти состояния, правила перехода и условия допустимости должны быть выявлены, получены соответствующие обозначения и затем записаны с помощью фраз Хорна.
Рассмотрим задачу: имеются два сосуда - на 3 и на 5 литров. Как отмерить с их помощью 4 литра воды ?
В этой задаче состояния связаны с определенным количеством воды V в первом сосуде и W во втором. Начальным состоянием является V=0, \V=0, а конечным V=0, W=4. Переходы между состояниями можно записать в виде правил:
сосуды(V1, W1):- сосуды(V2, W2).
Например, правило
сосуды(0, W) :- сосуды(V, W).
означает, что вся вода из первого сосуда вылита. Обратим внимание на слово «вода» в условии задачи. Для предметной области, связанной с водой, характерно то, что воду можно просто выливать, и данное правило перехода между состояниями допустимо. Если бы задача решалась для молока, то его выливать было бы нельзя, и такое правило было бы недопустимым !
Правило
сосуды(3, W) :- сосуды(V, W). означает, что первый сосуд заполнен полностью.
Не разливая, жидкость можно перелить из одного сосуда в другой только так, что один станет пустым, а другой наполнится. Это можно записать в виде правил
сосуды(3,W):- сосуды(V,W-V+3).
сосуды(V,0):- cocyды(V-W,W).
сосуды(V,5): - cocуды(V-W+5,W).
сосуды(0,W):- сосуды(V,W-V).
При решении данной задачи необходимо также избежать повторения одних и тех же состояний - «переливания из пустого в порожнее». Для этого в предикат «сосуды ( )» следует добавить 3-й аргумент - список пройденных состояний П. Элементы в него будут добавляться парами:
сосуды(V1,W1,[V1,W1|П]):- не_принад(V1,W1,П), сосуды(V2,W2,П).
Условие, ограничивающее рекурсию, должно иметь вид:
сосуды(_,4,П) :- write_list(П).
РУКОВОДСТВО ПОЛЬЗОВАТЕЛЮ ТУРБО-ПАСКАЛЯ
СТАНДАРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
Принятые обозначения:
type -любой тип;
string - любой строковый тип;
file -любой файловый тип;
scalar - любой простой тип;
pointer -любой ссылочный тип.
Замечание: если в списке параметров не указан спецификатор типа, то в качестве данного параметра процедура допускает параметр любого типа; в некоторых процедурах допускаются несколько вариантов заголовков процедур.
ПРОЦЕДУРЫ ВВОДА-ВЫВОДА
Процедура Read
•
Read(var F:file of type; var v:type);
Read(var F:text; var I':intnger);
Read(var F:text; var R:real);
Read(var F:text; var C:char);
Read(var F:text; var S:string);
где F - имя переменной файлового типа, a var I,R,C,S - одна или несколько переменных, совпадающих по типу с типом элементов файла.
Процедура Readln
Readln(var F:text; var varl,var2,...varN);
Readln(var varl ,var2,...varN);
Readln(var F:text);
Readln;
где F - имя переменной типа text, a varl...varN - переменные типа Char. Если опущено имя файла, то по умолчанию принимается имя типа INPUT. Если опущея список переменных, то происходит переход на другую строку.
Процедура Write
Write(var F:file of type; var v:type);
Write(var F:text; var I:integer);
Write(var F:text; var B:boolean);
Write(var F:text; var C:char);
Write(var F:text; var S:string).
Процедура Writeln
Writeln(var F:text; var varl ,var2,... varN);
Writeln(var var varl ,var2,... varN);
Writeln(var F:text);
Writeln.
СТАНДАРТНЫЕ ФУНКЦИИ
Функции арифметические
Abs(x); Arctan (x); Cos (x); Exp (x); Ln (x); Sin (x); Sqr (x); Sqrt (x)
имеют стандартный смысл. Функция
fruc(R:Real):Real;fruc(I:Integer):Real
возвращает значение дробной части своего аргумента.
Функция
int (R:real):real; int (I:integer):real;
возвращает значение целой части своего аргумента.
Функции скалярные
Odd(x); Pred(x); Succ(x)
имеют стандартный смысл.
Функции преобразования
Chr (x); Ord (x); Round (x); Trunc (x) имеют стандартный смысл.
СТРОКОВЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
Процедура Delete(var S:Strina;Pos, Len: Integer) убирает из строки S Len символов, начиная с Pos. Если Len больше длины S, то ничего не происходит. Если Pos+Len больше длины строки, то удаляются все символы до конца строки.
Процедура Insert(S:String; var D:String;Pos:Integer) вставляет строку S в строку D перед символом с номером Pos. Если Pos больше длины D, то S и D соединяются. Если длина результата при этом больше максимальной длины D, то в D записываются только самые левые символы.
Процедура Str(I:Integer; var S: String); Str(R:Real; var S:String) преобразует I или R из числа в строку и записывает эту строку в S, причем R и I могут записываться формально, т.е. как в процедурах Write и Writeln.
Процедура Val(S:String; var R:Real; var P:Integer); Val(S:String; var I,P:Integer) преобразует строковую переменную S в число (тип зависит от типа переменной I или R соответственно). Если в строке S ошибок нет. то Р равно 0, иначе значение R (или I) не определено, а Р присваивается номер первого ошибочного символа.
Функция Concat(Sl,S2,....Sn:string):String возвращает строку, полученную конкатенацией строк Sl,...,Sn. Если длина результата больше 255, то возникает ошибка времени выполнения.
Функция Copy(S:String; Pos,Len:Integer):String возвращает строку, полученную из Len символов строки S, начиная с позиции Pos. Если Pos больше, чем длина строки S, то возвращается пустая строка. Если Pos+Len больше, чем длина строки S, то возвращаются только символы, принадлежащие строке S.
Функция Length(S:Strina):Integer возвращает длину строки S.
Функция Pos(Pattern,Sourse:String):Integer возвращает номер символа, начиная с которого Pattern входит в Sourse. Если вхождения нет, то возвращается 0.
ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ФАЙЛАМИ
Процедура Assign(var F:File: Name:String); Name - имя файла на диске, F – имя файловой переменной. После выполнения этой процедуры Name и F отождествляются. Assign не должна применяться к файлу, находящемуся в употреблении.
Процедура BlockRead(var F:File; var Dest:Type; Num:Integer)
F -нетипизируемый файл, Dest -переменная,
Num - количество 128- баитных записей, которые должны быть перенесены из дискового файла в переменную.
Процедура BlocKWrite(var F:File; var Dest:Type; Num:Integer) I Num - количество 128-баитных записей, которые должны быть перенесены из переменной в дисковый файл.
Процедура Chain(var F:File) активизирует CHN-файл, с которым предварительной процедурой Assign было отождествлено имя F.
Процедура Close(var F:File); дисковый файл, отождествленный с переменной F, закрывается и в директорию диска вносятся необходимые изменения.
Процедура Erase(var F:File); дисковый файл, отождествленный с переменной F, уничтожается.
Процедура Execute(var F:File) загружает и выполняет файл с диска, с которым предварительно процедурой Assign было отождествлено имя F.
Процедура Rename(var F:File; Name:String); дисковому файлу, отождествленному с переменной F, присваивается новое имя Name. Rename не должна применяться к уже открытому файлу.
Процедура Reset(var F:File) открывает файл F для чтения и ставит указатель на начало файла.
Процедура Rewrite(var F:File) открывает файл F для записи, чистит его и ставит указатель на начало файла.
Процедура Seek(var F:File of type; Pos:Integer) устанавливает указатель файла F на Pos элемент файла.
Процедура Flush(var F:File) очищает буфер дискового файла, отождествленного с переменной F. Гарантирует, что следующая операция чтения будет произведена непосредственно с диска. Должна применяться к уже закрытым файлам.
Функция Eof(var F;File):boolean возвращает TRUE, если найден конец файла.
Функция Eoln(var F:Text):boolean возвращает TRUE, если найден конец строки или конец файла F.
Функция Filepos(var: F: File of Type):Integer; Filepos(var: F:File):Integer возвращает текущую позицию указателя файла.
Функция Filesize(var: F: File ofType):Integer; Filesize(var: F:File):Integer возвращает текущее количество элементов файла.
ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ СО ССЫЛОЧНЫМИ СТРУКТУРАМИ
Процедура Getmem(var P:Pointer; I:Integer) отводит под область памяти, на которую будет ссылаться переменная Р, 1 байт памяти.
Процедура Mark(var P:Pointer) запоминает текущий указатель «кучи» в переменной Р.
Процедура New(var P:Pointer) отводит место в памяти под переменную того типа, на который указывает Р.
Процедура Release(var P.Pointer) ставит указатель «кучи» на значение переменной Р. Переменная Р должна быть предварительно обработана процедурой Mark. Уничтожаются все динамические переменные, расположенные в памяти после последнего вызова процедуры Mark.
Функция MemAvai:Integer возвращает размер доступной для динамических переменных памяти.
Функция Ord(P:Pointer):Integer возвращает адрес переменной ссылочного типа Р.
Функция Ptr(I:Integer):Rointer возвращает ссылку на адрес памяти I.
ПРОЦЕДУРЫ ДЛЯ РАБОТЫ С ТЕКСТОВЫМ ЭКРАНОМ
Процедура CrtExit - выдача на экран строки сброса экрана, определенной в инсталляторе.
Процедура Crtlnit - выдача на экран строки инициализации экрана, определенной в инсталляторе.
Процедура CIrEol уничтожает символы строки от курсора до крайнего правого символа без перемещения курсора.
Процедура CIrScr очищает экран.
Процедура DelLine - удаление строки, на которой находится курсор, и сдвиг всех строк, находящихся ниже этой строки, на одну вверх.
Процедура GotoXY (X,Y:Integer) - позиционирование курсора по координатам XnY.
Процедура InsLine - вставка пустой строки на место курсора и сдвиг всех строк, находящихся под этой строкой на одну вниз.
ПРОЧИЕ ПРОЦЕДУРЫ И ФУНКЦИИ
Процедура Bdos(func,param:Integer) - вызов функции Bdos с номером func, которая заносится в регистр С, и параметром param, который заносится в регистровую пару DE.
Процедура bios (func,param:Integer) - вызов функции Bios с номером func и параметром param. который заносится в регистровую пару ВС.
Процедура Delay (Ms:Integer) - задержка программы на Ms миллисекунд.
Процедура FillChar(var dest; length:Integer;data:Char); FillChar(var
dest;
length:Integer;data:Byte) - заполнение length байт памяти величиной data. Начало участка памяти - адрес переменной dest.
Процедура Halt - аварийный выход из программы.
Процедура Move(var sourse.dest:length:Integer) - пересылка length байт, расположенных в памяти, начиная с первого байта переменной sourse, в участок памяти длины length, начинающийся с первого байта переменной dest.
Процедура Randomise- инициализация генератора случайных чисел.
Функция Addr(var variable):Integer; Addr(<function identifier>):Integer;
Addr(<procedure identifier>):Integer возвращает
адрес первого байта своего аргумента.
Функция Bdos(funk,param:Integer):Byte аналогична соответствующей процедуре. Возвращает значение регистра А.
Функция BdosHL(funk,param:Integer):Integer аналогична функции Bdos. Возвращает значение регистровой пары HL.
Функция Bios(funk, param :Integer):Byte аналогична соответствующей процедуре. Возвращает значение регистра А.
Функция BiosHL(func.param:Integer):Integer аналогична функции Bios. Возвращает значение регистровой пары HL.
Функция Hi(I:Integer):Integer возвращает число, младший байт которого содержит старший байт параметра. Старший байт результата равен 0.
Функция IOresult:Integer работает после директивы компилятору $1-. Значение 0 соответствует отсутствию любой ошибки ввода-вывода. В противном случае возвращается произвольное ненулевое число.
Функция KeyPresscd:Boolean возвращает TRUE, если нажата любая клавиша на клавиатуре, и FALSE в противном случае.
Функция Lo(I:Integer):Integer возвращает число, младший байт которого содержит младший байт параметра. Старший байт результата равен 0.
Функция Random(I:Integer):Integer; Random:Real возвращает случайное число. Для первого варианта вызова это число лежит в интервале от 0 до 1, для второго -от 0 до 1.
Функция Size0f(var variable):Integer; Size0f(<type identifier>):Integer возвращает размер (в байтах) своего аргумента.
Функция Swap(I:Integer):Integer возвращает число, у которого по сравнению с аргументом поменялись местами первый и второй байты.
Функция UpCase(Ch:Char):Char возвращает верхний регистр данного символа. Если такового нет, то возвращается аргумент.
Функция ParamCount:Integer; возвращает число параметров в строке вызова СОМ-файла.
Функция ParamStr(n:Integer):String[14]; возвращает n-параметр из строки вызова СОМ-файла.
Процедура Exit - выполнение этой процедуры эквивалентно передачи управления на последний END процедуры, функции или основной программы, где выполнена процедура Exit.