Подготовьте отчет о выполненной лабораторной работе. Он должен содержать титульный лист, алгоритм и текст написанной вами программы класса, а также алгоритм и текст программы, создающей объекты на основе созданного класса и демонстрирующей возможности работы с ними. Сформулируйте выводы, которые можно сделать по результатам выполненной работы. Дайте письменные ответы на контрольные вопросы. На компьютере представляются файлы с результатами работы, записанные в папку с номером вашей группы/ваша фамилия/№ лабораторной работы.
5. Контрольные вопросы
1. Какие проблемы возникают при практическом использовании функций или процедур?
2. В чем заключаются основные идеи метода структурного программирования?
3. В чем отличие автомата с памятью от автомата без памяти?
4. Каковы преимущества и недостатки использования глобальных переменных в тексте программы?
5. Чем объекты отличаются от обычных функций и процедур?
6. Чем класс отличается от объекта?
7. Каким образом на этапе выполнения программы можно получить доступ к переменным класса?
8. Чем метод класса отличается от свойства класса?
9. Что надо сделать для создания объекта класса?
10. Что такое событие?
Лабораторная работа №7. Базовые операторы ввода-вывода VBA и работа с файлами
Методические указания
Данные в памяти ЭВМ хранятся в виде двоичных чисел. Единственное, что может сделать процессор с данными – это извлечь содержимое некой ячейки памяти, выполнить над ним некоторое заранее оговоренное и выбранное из перечня возможных действие и занести число (результат) назад в память в ту же или другую ячейку. Вполне естественным является следующий вопрос: каким способом числа попали в ячейку памяти первоначально?
|
Существует всего четыре варианта ответа. Во-первых, это данные могли остаться в ячейке памяти от предыдущей программы или, если программа загружается в память сразу после включения машины, в ячейке памяти осталась случайная комбинация установок триггеров, возникшая после подачи напряжения на ОЗУ. Часто такие данные называют мусором. Во-вторых, данные могут быть размещены в ячейке вместе с программой, то есть сама программа при компиляции предусматривает некое начальное значение в конкретной ячейке памяти. В-третьих, число могло попасть в ячейку в результате выполнения команды процессора на запись данных в ОЗУ, например, при выполнении оператора присваивания. Наконец, в четвертых, число могло быть занесено в ячейку памяти в результате выполнения команды ввода.
На первый взгляд существенных различий между двумя последними вариантами нет. Тем не менее, следует принимать во внимание следующее обстоятельство: в третьем варианте заносимое число является результатом вполне конкретных действий над данными, которые при необходимости могут быть повторены. В то же время, в четвертом варианте занесенное число представляет собой результат реального физического воздействия на устройство ввода в данный момент времени, которое может быть уникальным и никогда более не повторяющимся.
Вполне естественным было бы ожидать то, что любой язык программирования высокого уровня содержит в своем составе команды или операторы ввода вывода. Поскольку на первом этапе развития вычислительной техники способы подключения устройств ввода-вывода к процессору существенно рознились, языки программирования предусматривали отдельные операторы для вывода на печать, вывода на дисплей, ввода с клавиатуры, файловой работы. В настоящее время произошла унификация подобного рода операторов. Так, в языке VBA сохранились несколько операторов, смысл которых представлен в табл. 7. Основным назначением базовых операторов ввода вывода VBA является работа с файлами. Файлпредставляет собой единицу хранения данных, имеющих конкретный смысл. Так, файл может быть программой (исполняемыми кодами), исходным текстом, документом, просто хранилищем записей. Физически файл хранится, как правило, на накопителях на магнитных дисках, хотя операционная система машины рассматривает любое внешнее устройство как приемник или источник файлов.
|
В VBA существует три способа организации данных в файле. Эти типы определяют и тип доступа к файлу. Различают:
- последовательные файлы, предназначенные для чтения и записи последовательных блоков символьных данных, представляющих собой последовательность кодов символов, включая служебные;
- файлы произвольного доступа, предназначенные для записи и чтения данных, структурированных как записи фиксированной длины;
- двоичные файлы, предназначенные для записи и чтения числовых данных произвольной длины и представляющие собой частный случай файла произвольного доступа с длиной записи 1 байт.
Перед началом работы программы с файлом он должен быть открыт инструкцией Open, которая задает имя открываемого файла (включая указание пути к нему). При открытии указывается номер открываемого канала системы. Дополнительно может быть задан тип файла (последовательного доступа, произвольного доступа, двоичный), ключ записи и состояние файла (для чтения, записи или добавления). Кроме этого для файла может быть указан его задаваемый размер в байтах. Номер свободного канала может быть определен предварительно с помощью инструкции FreeFile.
|
Пример 21. Открытие для чтения несуществующего файла. Выполнение этого фрагмента программы приведет к выдаче системой сообщения об ошибке “Файл не найден” и прекращению работы программы.
Open "test1. sss " For Input As #1
Close #1
Пример 22. Открытие для записи не существующего файла последовательного доступа. Выполнение этого фрагмента программы приведет к созданию в текущем каталоге нового файла test1.hhh. Поскольку вывод в файл не производился, размер созданного файла 0 байт.
Dim canal As Integer
'Определение номера свободного файлового канала ввода-вывода
canal = FreeFile()
Open "test1. sss " For Output As #canal
Close #canal
Если файл уже существует, то при открытии его в состоянии Output старый файл удалится, а новый запишется на его место. Если предполагается внесение изменений в уже существующий файл, он должен быть открыт в состоянии Append.
Пример 23. Программа записи файла исходных данных для начисления зарплаты в соответствии с рис. 1
Open "Зарплата.sss" For Output As #1
'Запись в файл
Print #1, "Иванов В.Н."
Print #1, 1234
Write #1, "Трофимова Л.А."
Write #1, 1234
Write #1, "Семенова Е.Г.", 1000, "Степанов А.Г.", 900
Close #1
Файлы с произвольным доступом позволяют обращаться к записи в файле по ее номеру. Такая возможность обеспечивается за счет создания регулярной структуры записей определенного формата, которую легко обеспечить, например, за счет типов данных, определяемых пользователем.
Пример 24. Предполагается, что создана структура (тип данных, определяемый пользователем) следующего вида:
Type Запись_файла
Фамилия_И_О As String
Начислено_Ведомость As Currency
End Type
Тогда программа работы с файлом произвольного доступа может содержать следующие операторы:
Dim record As Запись_файла
Dim nomber As Integer, j As Integer
Open "Зарплата1.rrr" For Random As #1
'Запись в файл произвольного доступа
record.Фамилия_И_О = "Иванов В.Н."
record.Начислено_Ведомость = 1234
Put #1, 1, record
'Чтение только что сделанной записи
Get #1, 1, record 'Считывается только что записанное значение из файла
record.Фамилия_И_О = "Трофимова Л.А."
'record.Начислено_Ведомость содержит считанное из файла число 1234
Put #1, 2, record
record.Фамилия_И_О = "Семенова Е.Г."
record.Начислено_Ведомость = 1000
'Запись в файл произвольного доступа по текущему номеру счетчика
Put #1,, record 'Действие с записью 3
j = Seek(1) 'Значение указателя записи равно 4
record.Фамилия_И_О = "Степанов А.Г."
record.Начислено_Ведомость = 900
Put #1, j, record
Close #1
Файл произвольного доступа открывается с указанием типа Random и по умолчанию доступен для чтения и записи. Явное указание режима только чтения или только записи обеспечивается за счет добавления ключевых слов Access Read или Access Write.
Для записи в файл произвольного доступа можно воспользоваться оператором Put. Его первый параметр есть номер канала, второй – номер записи в файле (может отсутствовать), третий – имя переменной, значение которой надо записать в файл. Чтение информации из файла может быть осуществлено оператором Get, параметры которого аналогичны.
В системе существует внутренний указатель текущего номера рабочей записи файла. Его начальное значение равно нулю. Каждый раз при выполнении операторов Put и Get значение указателя становится равным номеру записи, с которой выполнялся оператор, плюс единица. Если в операторах Put и Get номер записи явно не задан, то новое действие будет выполняться с записью, номер которой содержится в указателе. Текущее значение указателя номера рабочей записи может быть получено оператором Seek. Двоичные файлы представляют собой разновидность файлов с произвольным доступом с элементарными записями размером в один байт, в связи с чем указатель текущего номера рабочей записи двоичного файла имеет смысл счетчика байтов. Программирование действий с записями двоичных файлов проводится так же, как и в случае работы с файлами произвольного доступа.
В процессе работы с файлом изменение его содержимого происходит в буфере операционной системы, а не на диске. Это обстоятельство приходится принимать во внимание, например, при отладке программы. Если при работе с отладчиком интегрированной системы отладки выполнить команду Run, Reset, то изменения файла будут потеряны. Непосредственное завершение работы с файлом и запись данных на диск происходит в момент выполнения инструкции Close. Кроме этого, запись информации на диск (закрытие файла) происходит в момент завершения работы всей пользовательской программы. Для снижения вероятности ошибок программирования целесообразно всегда после завершения действий с файлом принудительно закрывать его инструкцией Close.
Таблица 7. Операторы ввода вывода VBA [3]
Действие | Ключевые слова |
Создать или редактировать файл | Open |
Закрыть файл | Close, Reset |
Управление форматами записи | Format, Print, Print #, Spc, Tab, Width # |
Копирование файлов | FileCopy |
Чтение свойств файлов | EOF, FileAttr, FileDateTime, FileLen, FreeFile, GetAttr, Loc, LOF, Seek |
Определение размера файла | FileLen |
Установка или чтение атрибутов файлов | FileAttr, GetAttr, SetAttr |
Управление свойствами файлов | Dir, Kill, Lock, Unlock, Name |
Чтение последовательных файлов | Input #, Line Input # |
Запись в последовательный файл | Print #, Write # |
Чтение файлов произвольного доступа или двоичных | Get |
Запись в файл произвольного доступа или двоичный | Put |
Задание номера записи файла произвольного доступа | Seek |
Задание
Используйте согласованный с преподавателем вариант задания (табл. 1), выполненную на его основе таблицу Excel, написанную программу вычислений в таблице и созданный на ее основе класс, позволяющий производить требуемое количество таблиц и обработку данных в них. Научитесь работать с последовательными файлами и файлами произвольного доступов. Напишите программу, позволяющую сохранять исходные данные вашей таблицы в виде файлов последовательного или произвольного доступов. Включите ее в состав методов класса. Используйте сохраненные файлы в следующем сеансе работы с таблицей для восстановления в ней исходных данных.