- •Информатика е.Н.Саладаев
- •1.Введение в информатикую. Информация.
- •1.1. Что такое инфоpматика
- •1.2. Информация
- •1.3. В каком виде существует информация
- •1.4. Как передаётся информация
- •1.5. Как измеряется количество информации
- •1.6. Что можно делать с информацией
- •1.7. Какими свойствами обладает информация
- •1.8. Что такое обработка информации
- •1.9. Информационные ресурсы и информационные технологии
- •1.10. Информатизация общества
- •2. Общие принципы организации и работы компьютеров
- •2.1. Что такое компьютер
- •2.2. Устройство компьютера
- •3. Принципы построения компьютеров
- •1. Принцип программного управления. Из него следует, что программа состоит из набора команд, которые выполняются процессором автоматически друг за другом в определенной последовательности.
- •2.4. Команды
- •2.5. Выполнение команд
- •2.6. Архитектура и структура компьютера
- •2.7. Центральный процессор
- •2.8. Устройства памяти
- •2.9. Уустройства внутренней памяти
- •1. Оперативная память
- •3. Специальная память
- •2.10. Устройства внешней памяти
- •Накопители на гибких магнитных дисках
- •2. Накопители на жестких магнитных дисках
- •3. Накопители на компакт-дисках
- •4. Записывающие оптические и магнитооптические накопители
- •Накопители на магнитной ленте (стримеры) и накопители на сменных дисках
- •2.11. Аудиоадаптер
- •2.12. Видеоадаптер и графический акселератор
- •2.13. Клавиатура
- •2.14. Видеосистема компьютера
- •1. Монитор на базе электронно-лучевой трубки
- •2. Жидкокристаллические мониторы
- •3. Сенсорный экран
- •2.15. Принтер, плоттер, сканер
- •2.16. Модемы и факс-модемы
- •2.17. Манипуляторы
- •2.18. Устройство компьютера
- •2.19. Основные блоки компьютера
- •2.20. Системная плата
- •2.21. Организация межкомпьютерных связей
- •2.22. Компьютерные сети
- •Наиболее распространенные виды топологий сетей:
- •2.23. Соединение между собой устройств сети
- •2.24. Классификация компьютерных сетей по степени географического распространения
- •2.26. Беспроводныесети
- •2.27. Сеть Интернет
- •Как можно связаться с Интернет
- •Как связываются между собой сети в Интернет
- •2.28. Основные возможности, предоставляемые сетью Интернет
- •World Wide Web — главный информационный сервис.
- •2. Электронная почта.
- •3. Cистема телеконференций Usenet (от Users Network).
- •4. Системы информационного поиска сети Интернет.
- •Системы, основанные на предметных каталогах.
- •Автоматические индексы.
- •5. Программа пересылки файлов Ftp.
- •6. Программа удалённого доступа Telnet.
- •2.29. Мультимедиа и мультимедиа-компьютер
- •3.Классификация компьютеров
- •3.1 Критерии классификации компьютеров
- •3.2. Классификация по поколениям
- •3.3. Краткая историческая справка
- •3.4 Компьютеры первого поколения
- •3.5. Компьютеры второго поколения
- •3.6. Особенности компьютеров третьего поколения
- •3.7. Характеристики эвм четвёртого поколения
- •3.8. Какими должны быть компьютеры пятого поколения
- •3.9. Классификация компьютеров по условиям эксплуатации
- •3.10. Классификация компьютеров по производительности и характеру использования
- •3.11. Типы портативных компьютеров
- •4.Представление чисел в компьютерах
- •4.1. Системы счисления
- •4.2. Представление целых чисел в позиционных системах счисления
- •4.3. Системы счисления используемые для общения с компьютером
- •4.4. Почему люди пользуются десятичной системой, а компьютеры — двоичной
- •4.5. Почему в компьютерах используются также восьмеричная и шестнадцатеричная системы счисления
- •4.6. Перевод целых числел из десятичной системы в любую другую позиционную систему счисления
- •4.7. Перевод пpавильной десятичной дpоби в любую другую позиционную систему счисления
- •4.8. Перевод чисел из двоичной (восьмеpичной, шестнадцатеpичной) системы в десятичную
- •4.9. Сводная таблица переводов целых чисел из одной системы счисления в другую
- •4.10. Арифметические операции в позиционных системах счисления
- •4.11. Представление в компьютере целых числел
- •.5.Выполнение арифметических операций в компьютерах
- •5.1. Выполнение арифметические действия над целыми числами Сложение и вычитание
- •4. А и в отрицательные.
- •Умножение и деление
- •5.2. Представление в компьютере вещественных чисел
- •Умножение
- •Деление
- •6.Программное обеспечение компьютеров
- •6.1. Что такое программное обеспечение
- •6.2. Классификация программного обеспечения
- •6.3. Прикладные программы
- •6.4. Роль и назначение системных программ
- •6.5. Что такое операционная система
- •6.6. Файловая система ос
- •6.7. Структура операционной системы ms dos
- •6.8. Программы-оболочки
- •6.9. Операционные системы Windows, Unix, Linux Операционные системы Windows
- •Операционная система Unix
- •6.10. Трансляторы, компиляторы, интерпретаторы
- •6.11. Системы программирования
- •6.12. Для чего нужны инструментальные программы
- •6.13. Текстовые редакторы
- •6.14. Графический редактор
- •6.15. Возможности систем деловой и научной графики
- •6.16. Табличный процессор
- •6.17. Системы управления базами данных
- •6.18. Библиотеки стандартных подпрограмм
- •6.19. Пакеты прикладных программ
- •6.20. Интегрированные пакеты программ
- •6.21. Органайзеры Органайзеры — это программы — электронные секретари
- •6.22. Сетевое программное обеспечение
- •Функции и характеристики сетевых операционных систем (ос)
- •7.Алгоритмы. Алгоритмизация. Алгоритмические языки
- •7.1. Понятие алгоритма
- •7.2. Исполнитель алгоритма
- •7.3. Свойства алгоpитма
- •7.4. Формы записи алгоритма
- •7.5. Словесный способ записи алгоритмов
- •7.6. Графический способ записи алгоритмов
- •7.7. Псевдокод
- •7.8. Запись алгоритма на учебном алгоритмическом языке Основные служебные слова
- •Команды учебного ая
- •Пример записи алгоритма на учебном ая
- •7.9. Базовые алгоритмические структуры
- •7.10. Итерационные циклы
- •7.11. Вложенные циклы
- •Пример вложенных циклов для
- •Пример вложенных циклов пока
- •7.12. Отличие программного способа записи алгоритмов от других
- •Основные этапы решения задач на эвм
- •7.13.Уровени языков программирования
- •7.14. Достоинства и недостатки машинных языков
- •7.15. Язык ассемблера
- •7.16. Преимущества алгоритмических языков перед машинными
- •7.17. Компоненты алгоритмического языка
- •7.18. Понятия алгоритмических языков
- •7.19. Стандартные функции
- •Вычисления часто употребляемых функций осуществляются посредством подпрограмм, называемых стандартными функциями, которые заранее запрограммированы и встроены в транслятор языка.
- •7.20. Арифметические выражения
- •Примеры записи арифметических выражений
- •7.21. Логические выражения
- •Примеры записи логических выражений, истинных при выполнении указанных условий.
- •8.Технология подготовки и решения задач с помощью компьютера
- •8.1. Этапы решения задач с помощью компьютера
- •8.2. Математические модели
- •8.3. Основные этапы процесса разработки программ
- •8.4. Как проконтролировать текст программы до выхода на компьютер
- •8.5. Отладка и тестирование
- •8.6. В чем заключается отладка
- •8.7. Тесты и тестирование
- •8.8. Какими должны быть тестовые данные
- •8.9. Этапы процесса тестирования
- •8.10. Характерные ошибки программирования
- •8.11. Является ли отсутствие синтаксических ошибок свидетельством правильности программы
- •8.12. Ошибки не обнаруживаемые транслятором
- •8.13. Сопровождение программы
- •9.Применение компьютерной техники
- •9.1. Использувание компьютеров в быту
- •9.2. Системы автоматизированного проектирования (сапр)
- •9.3. Автоматизированные системы научных исследований (асни)
- •9.4. Взаимосвязь между асни и сапр
- •9.5. Базы знаний и экспертные системы
- •9.6. Использование компьютеры в административном управлении
- •9.7. Роль компьютеров в обучении
- •9.8. Компьютеры в управлении технологическими процессами
- •9.9.Компьютеры в медицине
- •9.10. Компьютеры в торговле
- •9.11. Электронные деньги
- •9.12. Компьютеры в сельском хозяйстве
- •10.Программирование на алгоритмическом языке qBasic Общая характеристика языка
- •10.1.Элементы языка qbasic
- •1. Ключевые слова
- •2. Синтаксические соглашения
- •3. Комментарии
- •4. Арифметические выражения.
- •5. Строковые выражения
- •6. Типы данных
- •10.2.Константы и переменные
- •1. Константы
- •2. Переменные
- •3. Присвоение значений переменным
- •10.3. Ввод/вывод
- •1. Вывод на экран
- •2. Очистка экрана.
- •3. Ввод с клавиатуры
- •4. Форматированный вывод на экран
- •5. Позиционирование курсора
- •6. Вывод пробелов
- •7. Функция табуляции
- •8. Остановка программы
- •10.4.Управляющие операторы
- •1. Оператор безусловного перехода
- •2. Условия
- •3. Циклические структуры
- •4. Оператор выбора select case
- •10.5.Обработка строк
- •1. Определение длины строки
- •2. Получение символов кода ascii
- •4. Выделение левых крайних символов строки
- •6. Выбор подстроки
- •7. Получение строчных символов
- •10.6.Математические вычисления
- •1. Абсолютное значение числа
- •2. Тригонометрические функции
- •10.7.Массивы в qbasic
- •10.8.Функции и процедуры, определенные пользователем
- •1. Собственные функции
- •2. Собственные процедуры
- •10.9.Другие операторы
- •5. Установка цветов экрана
- •10.10.Работа с файлами
- •1. Введение и основные функции
- •2. Функция eof
- •3. Работа с адресами в справочнике.
- •10.11.Обработка ошибок
- •10.12. Графические возможности basic
- •1. Переход в графический режим экрана
- •2. Операторы, реализующие графику
- •Установка цветов в операторе color qBasic:
- •12.Введение в язык программирования Visual Basic
- •Основы. Как осуществляется программирование
- •Язык Visual Basic
- •Создание проекта
- •Для создания переменных и отображения их значений
- •Основные понятия
- •Подробное рассмотрение. Типы данных
- •Тип данных String
- •Практическое задание Объединение строк
- •Для хранения значений в массиве
- •Арифметические операции. Создание выражений с переменными и операторами
- •Сложение чисел
- •Сравнение выражений
- •Как заставить компьютер что-то делать. Написание первой процедуры
- •Создание процедур
- •Создание функции с параметрами
- •Повторение действий в программе: использование цикла For... Next
- •Для использования оператора For... Next
- •Программный выбор между двумя возможностями. Оператор If... Then
- •Для использования инструкции If... Then
- •Для использования предложения Else
- •Подробное рассмотрение. Повторения операций в цикле Do... While или Do... Until, пока не будет выполнено условие
- •Чтобы использовать оператор Do...While
- •Оператор Do...Until
- •Чтобы использовать оператор Do...Until
- •Обработка ошибок
- •Чтобы использовать блок Try...Catch
- •Взаимодействие с пользователями программы. Пользовательский интерфейс
- •Изменение свойств формы
- •Добавление элементов управления в форму
- •Взаимодействие с пользователем. Использование кнопок
- •Использование кнопок
- •Отображение и ввод текста. Использование надписей и текстовых полей
- •Создание пользовательского интерфейса с надписью и текстовым полем
- •Добавление кода и проверка программы
- •Взаимодействие программы с пользователем. Создание обработчика событий
- •Обработка событий Click
- •Обработка событий MouseEnter
- •Обработка событий MouseLeave
- •Получение выбора пользователя. Использование флажков и переключателей
- •Использование переключателей
- •Совместное использование обработчика событий
- •Для совместного использования обработчика событий
- •Программирование с применением объектов. Использование классов
- •13.Базы данных
- •13.1.Основная терминология
- •Дополнения к определениям
- •Пользователи
- •13.2.Основы проектирования бд
- •Модели бд Простая двумерная структура
- •Иерархическая структура
- •Реляционная модель данных
- •708 Тульский механический завод.
- •Главный ключ системы
- •13.3.Проблемы реляционного подхода Правила проектирования бд
- •Задача нормализации
- •Повторяющиеся группы
- •Общие поля в связанных таблицах
- •Поиск информации. Индексные файлы
- •Проблемы достоверности информации
- •Оперативные таблицы и справочники
- •Функции универсальной информационной системы
- •Основные функции ис
- •Вспомогательные функции ис
- •Документальные системы
- •Обзор субд
- •13.4.Основные сведения по интерфейсу Access.
- •Типы полей.
- •Свойства поля.
- •Теперь перейдем к другой вкладке- «Подстановка».
- •Определение связей между таблицами.
- •Просмотр существующих связей
- •Присоединенные таблицы
- •Ввод, изменение и просмотр данных
- •Создание простых форм
- •Элементы форм
- •Быстрый поиск
- •13.5.Запросы
- •Типы запросов.
- •Создание простых отчетов.
- •Структура ленточного отчета:
- •Структура отчета в столбец:
- •Анализ таблиц
- •Создание связей и объединений в запросах.
- •Ограничения в многотабличных запросах.
- •Редактирование полей справочников
- •Создание связей для запросов
- •Объединение в запросе двух копий одной таблицы (самообъединение).
- •Использование в запросе автоподстановки для автоматического ввода данных
- •Создание параметризованных запросов
- •Запросы, вносящие изменения.
- •Специфика:
- •Имя Покупателя : Customer Name Создание и использование подчиненных форм.
- •Создание главной и подчиненной форм с помощью мастера.
- •Вставка подчиненной формы в главную.
- •Связывание главной и подчиненной форм.
- •Создание итогов в подчиненных формах.
- •13.6.Язык sql
- •Команда select
- •Select name1, name2, … -список столбцов, представляемых в результате
- •Определение выборки – предложение where
- •Булевы операторы: and, or, not
- •Оператор in
- •Оператор between … and
- •Оператор like
- •Оператор is null
- •Применение функций агрегирования
- •Предложение group by
- •Предложение having
- •Ограничение на агрегированные функции
- •Форматирование результатов запросов
- •Упорядочение выходных полей
- •Использование множества таблиц в одном запросе
- •Вложение запросов (подзапросы).
- •Связанные подзапросы.
- •Объединение множества запросов в один Предложение union
- •Ввод, удаление и изменение значений полей.
- •Вставка результатов запроса
- •Обновление представлений
- •Групповые представления.
- •Представления и соединения
- •Представления и подзапросы.
- •Ограничения представлений.
- •Удаление представлений.
- •Изменение значений с помощью представлений.
- •13.7.Технология и модели “клиент - сервер”.
- •МодельFs.
- •Технологический недостаток модели-
- •Модель rda
- •Модель сервера бд (dbs).
- •Модель as- сервер приложений.
- •13.8.Эволюция серверов бд.
- •13.9.Активный (интеллектуальный) сервер.
- •Процедуры базы данных
10.12. Графические возможности basic
При программировании на BASICе вы можете задействовать графику. Это позволит наглядно смодулировать некоторые процессы (например движение). BASIC имеет обычные процедуры графического режима, присущие большинству языков программирования. Опишем их.
1. Переход в графический режим экрана
Для того, чтобы начать работать с графикой, сначала надо перейти в графический режим. Для этого существует оператор SCREEN, его синтаксис: SCREEN [mode] [,[apage]] [,[vpage]]
mode - Это режим в котором находитмя экран при выводе графики. Режим устанавливает разрешение экрана, его цветовую гамму.
apage, vpage- это номера страниц экрана, где apage - это активная в данный момент страница, а vpage - скрытая страница экрана.
Количество страниц в каждом графическом режиме различно и звисит от объема видеопамяти, поэтому следует сначала узнать количество страниц, а потом устанавливать значения переменных. Параметры некоторых режимов(для VGA мониторов) смотри в разделе SCREEN.
2. Операторы, реализующие графику
1. Оператор PSET организовывает прорисовку точки на экране.
Cинтаксис: PSET (x,y) [,color] (x,y) - координаты точкиcolor - цвет вывода
2. Оператор CIRCLE организовывает прорисовку окружности на экране.
Cинтаксис: CIRCLE (x,y),radius[,color][,[start]][,[end]][,[aspect]]
(x,y) - координаты центраradius - радиусcolor- цвет выводаstart,end-используются для прорисовки части окружности, задаётся начало и конец соответственноaspect-используются для прорисовки элипса
3. Оператор LINE организовывает прорисовку линии или закрашенного/незакрашенного прямоугольника на экране.
Cинтаксис: LINE (x1,y1)-(x2,y2),[,[color][,[B[F]] (x1,y1)- координаты начала линии(x2,y2)- координаты конца линииcolor - цвет выводаВ- используются для прорисовки незаполненного прямоугольникаBF - используются для прорисовки заполненного прямоугольника
4. Оператор PAINT заполняет какую-то область экрана заданным цветом
Cинтаксис: PAINT (x,y),[paint][,[bordercolor]][,[backgroung]]
(x,y) - координаты точки. Если точка поладает в область какого-нибудь изображения (окружности) то изображение заполняетсяbordercolor - цвет линии, ограничивающей областьbackgroung - цвет фона
5. Оператор POINT возвращает цвет точки по координатам
Cинтаксис: POINT (x,y) (x,y)-координаты точки.
Установка цветов в операторе color qBasic:
Число Цвет
0 Черный
1 Синий
2 Зеленый
3 Голубой
4 Красный
5 Фиолетовый
6 Коричневый
7 Серый
8 Темно-серый
9 Светло-синий
10 Светло-зеленый
11 Светло-голубой
12 Светло-красный
13 Светло-фиолетовый
14 Желтый
15 Белый
11.Технология структурного программирования
С момента появления первых ЭВМ возникла потребность написания большого количества программ, и эта потребность увеличивалась с каждым годом. Начали складываться методы и принципы создания программных продуктов, из которых постепенно сформировалась традиционная для 60-х – 70-х годов технология программирования «снизу-вверх», суть которой заключалась в следующем: сначала создавались программные модули нижнего уровня, из которых далее формировались модули более высоких уровней. На формирование этой технологии оказало влияние то, что в то время потребителем программы становился ограниченный круг лиц (часто сами разработчики), поэтому вопросы, связанные с дальнейшим сопровождением программы, не принимались во внимание при оценке качества программы. Зато основным критерием качества считалась её эффективность в смысле экономии ресурсов ЭВМ, поскольку тогда эти ресурсы были весьма ограничены. Программа должна была занимать минимум ОЗУ и выполняться за кратчайшее время. Тело программы было очень запутанным, и исправлять скрытые ошибки и вносить изменения в данные программы было очень трудно. При таком проектировании основные трудности концентрировались на заключительных этапах разработки больших проектов.
С развитием средств вычислительной техники ситуация кардинально изменилась: количество потребителей программ резко возросло, и узким местом стали не вычислительные, а человеческие ресурсы, необходимые при создании и сопровождении программ. При этом сопровождение программ стало стоить в несколько раз дороже. Неудовлетворенность традиционной технологией и осознание новых критериев заставило искать новые технологические принципы. Эти принципы были найдены и успешно внедрены в практику корпорацией IBM в начале 70-х годов. С тех пор начала прочно утверждаться технология структурного программирования.
Цели структурного программирования:
избавиться от плохой структуры программы;
создавать программы, которые можно было бы понимать, сопровождать и модифицировать без участия автора.
Технология структурного программирования состоит из двух частей:
нисходящая разработка;
структурное программирование.
Нисходящая разработка.
Нисходящую разработку можно рассматривать как процесс, состоящий из трех этапов:
проектирование;
планирование;
реализация.
Законы Мэрфи.
Все оказывается сложнее, чем кажется.
Все тянется дольше, чем можно ожидать.
Все оказывается дороже, чем планировалось.
Если что-то может испортиться, оно обязательно испортится.
Комментарий Каллагена: «Мэрфи был оптимистом».
Эти законы хорошо описывают проблемы традиционной восходящей технологии программирования.
Цели нисходящей разработки:
уменьшить сложность программ;
уменьшить время разработки;
позволить как можно раньше обнаружить ошибки.
Проектирование программы
Одним из принципов проектирования программ является модульность программ. Модуль – это программа, которую можно вызвать из любого другого модуля и можно отдельно откомпилировать.
Разбиение программ на модули характеризуется следующими преимуществами:
сокращение сроков написания программы, так как проектирование модулей можно поручить разным программистам;
можно создавать библиотеки наиболее часто употребляемых функций;
упрощается загрузка больших программ в ОЗУ – не требуется сегментация всей программы, так как это достигается естественным образом при разбиении на модули;
для руководства легче наблюдать за продвижением проекта;
облегчается тестирование;
проще проектирование и последующие изменения программы.
Наряду с этим имеются и недостатки:
может увеличиться время выполнения программы;
может возрасти размер памяти, требуемый программе;
может увеличиться время компиляции и загрузки;
при некорректном разбиении программ на модули могут возникнуть проблемы межмодульного взаимодействия (особенно при внесении изменений).
Для современной техники эти недостатки несущественны и окупаются за счет сокращения сроков разработки и сопровождения.
Разбиение программы на модули нужно производить по возможности так, чтобы модули имели следующие желательные свойства:
модуль должен иметь один вход и один выход и возвращать управление тому, кто его вызвал;
размер модуля должен быть небольшим (10-100 операндов), при этом его легче читать и тестировать;
модуль не должен сохранять историю своих вызовов для управления своим функционированием;
модуль должен по возможности реализовывать одну функцию преобразования исходных данных в результат, это позволяет выделять часто употребляемые модули и объединять их в библиотеки;
по возможности принятие решений в модулях нужно организовать так, чтобы эти решения прямо влияли только на выполнение вызываемых модулей;
модуль должен быть по возможности независимым от других модулей, для этого важно ослабить связи между модулями.
Модули могут быть связаны:
по содержимому, если один модуль ссылается на операторы другого модуля, используя абсолютное смещение, при этом даже перекомпиляция другим компилятором может привести к ошибке;
по общей памяти, если два модуля ссылаются на одинаковые абсолютные адреса, при этом изменение размера одного элемента общей области памяти может привести к ошибкам в других модулях. Глобальные данные затрудняют чтение программ, поэтому количество глобальных данных надо стремиться уменьшать;
по управлению – когда один модуль при вызове другого модуля может модифицировать его действия (это может возникнуть, если вызываемый модуль реализует несколько функций, при этом, если исправлять действие одной из функций, можно испортить и выполнение остальных);
по данным, нужно стремиться передавать меньше данных в модули.
Нисходящее проектирование программы основано на идее уровней абстракции.
Абстрагирование – это процесс обобщения, при котором внимание концентрируется на сходстве явлений и предметов и они объединяются в группы на основе этого сходства.
Уровни абстракции определяют уровни модулей в программе. На этапе проектирования строится схема иерархии, отображающая эти уровни, их функции и взаимодействие модулей разных уровней. От блок схемы она отличается тем, что не показывает логику принятия решений или точный порядок исполнения.
Разработка схемы иерархии.
Чтобы создать схему иерархии, то есть спроектировать модульную организацию системы, нужно начинать с вершины и продвигаться вниз.
Пример. Диалоговая информационная система, в которой обрабатываются запросы пользователя, приведена на рисунке 1.
Рис. 1
Линии связи показывают подчиненность модулей. Каждый модуль активизируется вышестоящим и, закончив работу, возвращается ему управление, то есть передача управления происходит только по вертикальным связям. Таким образом, схемы иерархии строятся с использованием принципа вертикального управления, который предполагает следующие правила:
модуль должен возвратить управление тому, кто его вызвал (исключение – аварийное завершение модуля);
модуль может вызвать другой модуль уровнем ниже, но не может вызвать модуль своего уровня или выше (но может рекурсивно вызвать сам себя). Это упрощает межмодульный обмен данными. Если нужно вызвать модуль, находящийся несколькими уровнями ниже, то в этом случае в схеме иерархии его нужно дополнительно поместить на следующий уровень и везде специально отметить. Это означает, что модуль пишется один раз, а используется на разных уровнях иерархии;
принятие основных решений нужно выносить на максимально высокий уровень (обычно в головной модуль, который является кратким конспектом всей программы);
модуль низшего уровня не должен принимать решения за модули высшего уровня, то есть модуль не должен производить действий, непосредственно изменяющих порядок работы программы.
Преимущества вертикального управления:
логика программы становится понятней;
программу проще изменять и дополнять, в ней нет перекрестных связей;
программирование и проверка вначале модулей высшего уровня, а затем низшего позволяет быстрее обнаруживать логические ошибки.
Модули низшего уровня детализируются только после написания всех модулей высших уровней. Рекомендации:
при разбиении на модули лучше чуть перестараться, чем недостаточно продвинуться, так как объединять модули легче;
нельзя рассредоточивать реализацию одной функции в разных модулях;
аргументы функции следует передавать явно, а не через общую память, количество аргументов нужно стремиться уменьшать.
Процесс разделения на функции заканчивается, когда все модули полностью спроектированы и дальнейшее деление может привести к рассредоточению функций. Задача разбиения на модули не имеет единственного решения.
При разбиении программы на модули нужно провести внешнее проектирование каждого модуля, то есть определить его внешние характеристики. Эта информация выражается в виде внешних спецификаций модуля, которые содержат описания всех сведений, необходимых вызывающим его модулям. Здесь не описывается логика работы модуля.
Внешние спецификации должны содержать следующие сведения:
имя модуля;
функция, выполняемая модулем;
список параметров – число и порядок передачи модулю параметров;
входные параметры – точное описание всех входных параметров (формат, размер, единицы измерений, диапазоны значений);
выходные параметры – точное описание данных, которые возвращает модуль, здесь же указывается функциональная связь между входными и выходными параметрами, а также выходные данные, которые получаются при неверных входных данных;
внешние эффекты – дается описание всех внешних событий, происходящих при работе модуля;
использование внешних областей памяти и глобальных объектов.
Внешние спецификации определяют межмодульные связи. Их изменение приводит, как правило, к изменению вызывающих модулей. Лучше всего эти спецификации помещать в виде начального комментария в тексте модуля.
Конец этапа проектирования характеризуется следующими условиями:
известно необходимое число модулей и их спецификации;
связи между модулями отображены схемой иерархии;
вся работа проверена пользователями на точность и полноту.
Планирование.
Планирование включает в себя две задачи: планирование порядка разработки модуля и планирование тестов. На этом этапе выбирается последовательность программирования и тестирования модулей.
Планирование порядка разработки модулей.
Существуют несколько подходов, но наиболее распространены иерархический и операционный подходы.
Иерархический подход.
При этом подходе порядок программирования и тестирования модулей определяется их расположением в схеме иерархии. Сначала программируются и тестируются все модули одного уровня, после чего происходит переход на уровень ниже. При тестировании вызовы модулей нижних уровней заменяются заглушками. Заглушка – это упрощенная схема будущего модуля, содержащая все необходимое для тестирования модуля более высокого уровня и эмулирующая для модуля высокого уровня поведение модуля низкого уровня.
Используя иерархический подход, не нужно забывать о двух вещах:
необходимость использовать в модуле данные, подготовленные или измененные другим модулем, то есть зависимость по данным, может затруднить программирование и тестирование при иерархическом подходе;
слепое следование поуровневому подходу приводит к реализации основной массы модулей в конце проекта.
Операционный подход.
При этом подходе модули разрабатываются в порядке их выполнения при запуске готовой программы. Так как порядок исполнения обычно меняется с изменением входных данных, то здесь также остается свобода для выбора порядка разработки. Преимущество операционного подхода в том, что минимизируются трудности, вызванные зависимостью по данным. Недостаток операционного подхода в том, что при такой последовательности разработчики модулей «выстраиваются в очередь», то есть нерационально используется рабочая сила.
Таким образом, в чистом виде ни иерархический, ни операционный подходы не дают приемлемого результата. Наилучший подход – комбинированный, где взвешиваются достоинства каждого подхода. При этом, чтобы не выйти за рамки нисходящей технологии, перед программированием каждого модуля нужно проверять следующие условия:
должен существовать путь управления к этому модулю, то есть такая цепочка уже разработанных модулей, через которую управление может быть передано новому модулю (критерий управления);
должны быть доступны значения всех данных, необходимых для работы модуля, которые выдаются либо уже разработанными модулями, либо заглушками (критерий доступности данных).
Кроме этого, при определении порядка разработки модулей следует учитывать следующие рекомендации:
обеспечить готовность вспомогательных модулей в первую очередь;
следует начинать проектирование со сложных модулей, так как они могут оказаться сложнее и потребовать для разработки больше времени, кроме того, ранее программирование обнаружит ошибки в определении режимов работы модулей;
обработка исключительных ситуаций, связанных с неправильными данными, должна программироваться в первую очередь.
На практике большинство этих принципов противоречат друг другу. Поэтому такое планирование требует времени и способностей. При поиске наилучшей последовательности лучше всего начинать с операционного подхода. При этом легко убедиться, что критерий управления и критерий доступности данных выполняются для каждого модуля. При этом часто нужно пытаться мысленно выполнить программу. Это может помочь выявить недостатки полученной модульной структуры и документации на модули (в документации должна быть указана зависимость модуля по данным).
Пример планирования для схемы на рисунке 1.
Последовательность разрабатываемых модулей.
«Обработать запрос» – головной модуль.
«Вывести ответ» – необходим при тестировании.
«Подготовить ответ», «Анализ», «Получение информации» – как наиболее сложные.
«Ввести запрос», «Признать», «Проверить» – как наиболее простые.
Планирование тестов.
Вместе с планированием порядка, в котором следует разрабатывать модули, нужно планировать разработку тестов для всего проекта. Тесты необходимо готовить до начала программирования в силу следующих причин:
устраняется возможность подгонки тестов к уже написанной программе (уменьшается возможность внесения одних и тех же ошибок в программу и тест);
лучше понимаются ограничения на входные данные (сопряжение модулей зависит от передаваемых данных);
при планировании и разработке тестов программист вынужден представить себе окончательный результат, получаемый программой, что позволяет на ранних этапах проектирования увидеть неточности спецификаций и вовремя принять решения;
при таком подходе обеспечивается непрерывность создания программ: тесты определяют входные данные, которые используются при разработке модуля и при его проверке.
В некоторых случаях для тестирования создаются специальные программы – генераторы тестов.
Тесты не должен готовить тот человек, который пишет программу, чтобы исключить взаимовлияние этих процессов. Тестер должен быть специалистом высокой квалификации, знакомый с областью применения программы. Нужно привлекать к процессу тестирования пользователя программы: он может указать различные ситуации, возникающие при эксплуатации, и помочь при определении ограничений на данные.
Реализация.
Этап реализации включает:
фактическую подготовку тестов;
программирование и тестирование модулей.
Модули нужно добавлять по одному, а все возникающие несоответствия стараться обнаружить и исправить до перехода на следующий уровень.
Структурное программирование.
Общепринятого точного определения структурного программирования нет. Как концепция оно привлекло внимание после того, как Корадо Бойман и Джузеппе Якопини в 1966г. было доказано, что программу для решения любой логической задачи можно составить только из трех структур: следование, ветвление и повторение (цикл). Далее было указано, что неограниченное использование оператора goto нарушает соответствие между текстом и логикой работы программы (то есть программа плохо читается).
Можно так определить структурное программирование: это программирование, ориентированное на общение с людьми, а не с машиной. Для этого программа должна удовлетворять следующим требованиям:
текст программы должен быть композицией трех основных элементов: следование, ветвление и цикл;
употребление goto следует избегать всюду, где это возможно. Наихудшее применение goto – переход на оператор, расположенный выше в тексте программы;
при написании программы желательно придерживаться следующих рекомендаций: используйте осмысленные имена для объектов; избегайте схожих имен; избегайте использования промежуточных переменных; во избежание неоднозначности употребляйте скобки в выражениях; по возможности избегайте специфических особенностей языка; не игнорируйте предупреждающие сообщения компилятора; игнорируйте все предложения по повышению эффективности, пока программа не будет правильной; используйте комментарии для записи спецификаций в начале модуля; комментируйте объявления переменных (для чего они предназначены); помните особенности внутреннего представления данных в ЭВМ и диапазоны значений типов переменных;
текст программы нужно структурировать, то есть писать так, чтобы можно было легко выделять блоки программы;
каждый модуль должен иметь один вход и один выход.
Защитное программирование (защита от дурака) – это контроль входных данных с целью обнаружения ошибок в них. Оно используется для следующих целей:
устойчивость программы в целом;
худшее, что может сделать модуль, – это получить неверные входные данные и выдать неверный, но правдоподобный результат.
Защитное программирование требует разумного подхода, так как, доведенное до крайности, оно может чрезвычайно усложнить программу.
Тестирование программного обеспечения.
Тестирование – это процесс выполнения программы с намерением найти ошибки. Если цель – показать отсутствие ошибок, то их будет найдено немного, если цель – показать наличие ошибок, то их будет найдено значительно больше. Отладка – это процесс установления точной природы уже найденной ошибки и ее исправление. Результат тестирования является исходными данными для отладки. Фундаментальные принципы тестирования отражены в следующих аксиомах тестирования.
Хорош тот тест, для которого высока вероятность обнаружить ошибку, а не тот, который демонстрирует правильную работу программы.
Одна из самых сложных проблем при тестировании – решить, когда надо закончить, то есть как выбрать минимум тестов, дающих максимальную отдачу.
Невозможно тестировать свою собственную программу. Тестирование должно быть разрушительным процессом.
Необходимая часть любого теста – описание ожидаемых выходных данных и результатов, то есть ожидаемые результаты тестирования нужно определять заранее, до написания программы.
Нужно избегать не воспроизводимых тестов, то есть не задавать в качестве входных воздействий заранее не спланированные значения, которые часто невозможно повторить при нахождении ошибок. Тесты следует документировать.
Нужно готовить тесты как для правильных, так и для неправильных входных данных.
Нужно детально изучать результаты каждого теста.
По мере роста числа ошибок, обнаруженных в программе, растет относительная вероятность существования в ней необнаруженных ошибок.
Тестирование нужно поручать самым способным программистам.
Никогда нельзя изменять программу с целью облегчения ее тестирования.
Существует два похода к тестированию.
Предполагает составлять тесты только на основе внешних спецификаций.
Предполагает составлять тесты, изучая только логику программы.
Проектирование тестов.
Руководствуясь внешними спецификациями, нужно подготовить тест для каждой ситуации, вызывающей внешние эффекты, для каждой границы областей допустимых значений входных и выходных данных, для всех недопустимых условий. Если входных параметров немного и они имеют мало различных значений, имеет смысл перебрать все входные комбинации. Если входные аргументы ограничены некоторым диапазоном значений, то проверяют работу на границах области допустимых значений и в нескольких внутренних точках. Многие программы имеют функциональные границы. (Например, модуль выполняет сортировку чисел. Функциональные границы: массив пуст или содержит один элемент, массив уже отсортирован, все элементы массива – одинаковые).
Нужно проверить текст программы и добавить тесты с целью охвата всех условных переходов.
Для каждого цикла необходимо составить тесты соответствующие однократному выполнению тела цикла, максимальному числу итераций, обходу тела цикла.
По тесту программы необходимо выявить чувствительность к особым значениям входных данных и добавить тесты.