Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Введение и основные функции.

Поиск

Большинство программ работает с данными, которые можно вводить с клавиатуры и выводить на экран, или с данными, хранящимися в каких-либо файлах на дискетах или жестких дисках.

Рассмотрим некоторые основные понятия. Прежде всего следует выяснить, что собственно понимают под словом "файл". Это понятие можно определить так: файл — это область на носителе информации, где хранятся некоторые данные. Правда это определение слишком обобщенное, так как, следуя такому определению, файлами можно назвать и такие вещи как:

@ Телефонный справочник (носитель - бумага)

@ Ящик картотеки (носитель - бумага)

@ Сведения об адресах на жестком диске (носитель - жесткий диск).

Нас будут интересовать лишь такие файлы, хранящиеся на носителях, которые можно обрабатывать программами QBASIC. Вернемся к картотеке.

В картотечном ящике, как правило, находится некоторое количество карточек, в противном случае — картотека пуста. Если к картотеке применить понятие файла, то может возникнуть ситуация, когда файл окажется пустым. Однако файл существует, в нем только нет информации. Отдельные карточки картотеки называются записями. Так же, как карточки в ящике картотеки, записи в файле расположены последовательно: есть первая запись файла и последняя. На отдельной карточке картотеки или в отдельной записи может храниться всевозможная информация (например, фамилия, адрес, возраст,...). Эта информация называется полем данных. Объединение отдельных полей составляет логическое целое — запись или предложение файла. Прежде чем создавать или обрабатывать файлы в программе, следует позаботится о том, чтобы нужная информация запоминалась в предложении файла.

В этой главе попробуем создать небольшой адресный справочник, в котором будут следующие поля данных:

@ Имя (30 позиций)

@ Фамилия (30 позиций)

@ Улица (30 позиций)

@ Почтовый индекс (6 позиций)

@ Местность (30 позиций)

@ Телефон (16 позиций)

@ Заглавие (30 позиций)

Чтобы ввести данные в справочник, необходимо сначала открыть файл данных. Для этого используется оператор OPEN в следующем формате:
OPEN Имя_фаила FOR Режим_работы AS #Номер_файла
Имя_фаила - Имя файла с расширением и маршрутом
Режим_работы - Устанавливает разрешенный режим доступа к данным, хранящимся в файле:
APPEND: файл открывается для записи, причем новые предложения записываются в конец файла.
INPUT: файл открывается для чтения.
OUTPUT: файл открывается для записи, причем если файла не существует, то создается новый, а если существует, то ранее существовавшая там информация будет уничтожена, а новая будет записана в начало.
RANDOM: файл состоит из записей фиксированной длины и открыт как для записи, так и для чтения.
Номер_фаила: Целое число между 1 и 255. Обращение к файлу из программы происходит под этим номером.
После того как файл обработан, с помощью команды CLOSE его необходимо закрыть. В программе это выглядит так:
CLOSE #Номер_фаила
Доступ к файлу возможен между командами OPEN и CLOSE, например, командой
WRITE можно записать предложение в файл.
WRITE Номер_файла, Переменная [, Переменная]...
Следующая программа показывает, как можно вводить данные для файла адресов. В режиме APPEND каждое записываемое предложение помещается в конец файла. Таким образом, программу можно вызывать сколь угодно часто и дописывать данные в файл. Если же режим APPEND изменить на OUTPUT, данные будут каждый раз обновляться.

'*********************************'** Программа для ввода адресов **'*********************************'Объявление полей данныхDIM nachnameS, vorname$, strasseS, plz$, ort$, telefon$, stlchwort$DIM nocheinS 'Переключатель'Открыть файл в режиме APPENDOPEN "adresse.asc" FOR APPEND AS #1'Ввод данных будет продолжаться до тех пор, пока в поле nocheinS'будет вводиться "Y" или "у"DOCLS'Ввести поля данныхINPUT "Фамилия: ", nachnameSINPUT "Имя. ", vorname$INPUT "Улица: ", strasse$INPUT "Почт.индекс: ", plz$INPUT "Местность: ", ort$INPUT "Телефон: ", telefon$INPUT "Заглавие: ", stichwortS'Записать предложениеWRITE #1,nachname$,vorname$,strasse$,plz$,ort$,telefon$,stichwort$PRINT'Спросить, продолжить ли вводINPUT "Следующий адрес? (Y/N)", nocheln$ LOOP WHILE UCASE$(nochein$)-"Y" 'Закрыть файл CLOSE #1 'Конец программы

Далее необходимо вывести содержимое созданного файла на экран. Это значит, что данные последовательно читаются, и отдельные поля при необходимости появляются на экране. Для распознавания конца файла используется функция EOF.

Функция EOF
Функция EOF (Номер_файла) применяется с аргументом Номер_файла и возвращает логическое значение "истина", если достигнут конец файла, и "ложь" — в противном случае.

Отдельные записи файла считываются одним из вариантов команды INPUT. Ранее было рассмотрено считывание данных с клавиатуры и запоминание полученной информации в переменных. Для того чтобы читать данные из файла, следует применять оператор INPUT в таком виде:
INPUT #Номер_фаила, Поле_данных_1 [,Поле_данных_2]... [,Поле_данных_n]

'Работа с файлами'Программа для последовательного чтения адресов'Объявление полей данныхDIM nachname$, vornameS, strasse$, plz$, ort$, telefon$,stichwort$'Открыть файл в режиме INPUTOPEN "adresse.asc FOR INPUT AS #1CLS'Читать файл до тех пор, пока функция EOF не примет'значение "ложь" (0)DO UNTIL EOF(1) '0 до тех пор, пока не достигнут конец файла'Читать записьINPUT #1,nachname$,vornamee$,strasse$,plz$,ort$,telefon$, stichworrtS'Вывести на экранPRINT nachname$," "; vorname$; " "; strasse$PRINT plz$; " "; ort$, " ", telefonS; " "; stichwort$PRINT LOOP'Закрыть файл CLOSE *1

Работа с адресами в справочнике.

В данном разделе работу с адресами в справочнике дополним несколькими важными функциями. Прежде всего должны быть разработаны удобные формы представления справочных данных на экране. Не следует обходить вниманием этот раздел, даже если Вас отпугнут несколько пространные примеры. Интенсивная проработка этого раздела несомненно даст Вам ценный материал для собственной практики программирования. У Вас появится возможность повторить основные операции QBASIC. Программа управления адресами должна выполнять следующие действия:

@ искать адрес

@ изменять адрес

В главной программе для выбора отдельных действий необходимо создать меню. Из меню программа разветвляется на отдельные процедуры, которые выполняют независимые задачи. Преимущество такой структуры программы в том, что, во-первых, можно достаточно быстро получить доступ к любому фрагменту рабочей программы, а также меню - очень удобный интерфейс любой программы. Для начала попробуем нарисовать некую рамку, в которой и будет находится наша программа. Пример программы представлен ниже.

Пример:CLSFOR i = 17 TO 64 COLOR 1 LOCATE 10, i PRINT "=" 'Прорисовка 1-й горизонтальной линии LOCATE 23, i PRINT "=" 'Прорисовка 2-й горизонтальной линииNEXT iFOR j = 11 TO 22 LOCATE j, 17 PRINT "" 'Прорисовка 1-й вертикальной линии LOCATE j, 65 PRINT "¦" 'Прорисовка 2-й вертикальной линииNEXT jLOCATE 10, 17 ' Прорисовка уголковPRINT "?" LOCATE 10, 65 PRINT "?" LOCATE 23, 17 PRINT "?" LOCATE 23, 64 PRINT "?"COLOR 2LOCATE 21, 39 PRINT "OK"

Ну что теперь мы имеем рамочку в центре экрана и внутри написано ОК. Далее... Во первых нам нужен обработчик клавиш для передвижения по меню, а во вторых требуется составить алгоритм прорисовки экрана после каждого нового перехода от одного пункта к другому. Попробуйте составить программу самостоятельно

Обработка ошибок.

Рассмотрим следующий пример:

'Программа, при выполнении которой возможна ошибкаDIM a!INPUT "Введите, пожалуйста, число ",а!PRINT 5000 / а!'Конец программы

Эта программа работает до тех пор, пока в качестве входной информации не будет введен нуль. При вводе "нуля" диагностируется ошибка (Run-time error), так как операция деления на нуль недопустима. Такая ситуация должна быть предупреждена программистом введением контроля над вводимым числом.

'Ошибка нейтрализованаDIM a!DOINPUT "Введите, пожалуйста, число ",а1 UNTIL a!<>0PRINT 5000 / а!'Конец программы

Однако имеется целый ряд ситуаций, приводящих к ошибкам, которые нельзя устранить, используя контроль вводимых данных. Рассмотрим следующий пример:

'Программа с возможной ошибкой принтераLPRINT "Druckausgabe 1" LPRINT "Druckausgabe 2"LPRINT "Druckausgabe 3"'Конец программы

Вызовите программу, не включив принтер. Вы получите сообщение об ошибке (Run- time error). To же самое произойдет, если Вы выключите принтер (или установите его в режим "OFFLINE") в то время, когда программа пытается передавать ему данные. Рассмотрим методы, которые позволяют программе реагировать на такие ошибки.
Оператор ON ERROR GOTO
Определяет подпрограмму обработки ошибок и имеет формат:
ON ERROR GOTO Метка
Если в процессе выполнения программы произошла ошибка, то оператор ON ERROR GOTO передаст управление на определенную метку. При этом стандартный метод обработки ошибок выполнения QBASIC блокируется. Подпрограмма обработки ошибок всегда должна завершаться оператором RESUME NEXT. Точное значение этого оператора будет объяснено ниже.

'Программа с ошибкой деленияON ERROR GOTO FehlerHandlerPRINT "Вывод проведенных вычислений"'строка-провокаторPRINT 1000/0END 'здесь основная программа кончается'Конец программы'начало собственной программы обработки ошибокFehlerHandler:PRINT "Найдена ошибка"PRINT RESUME NEXT

При обнаружении ошибки выполнение основной программы не прекращается и программа выполняется до конца, в отличие от стандартного метода обработки ошибок. Обходится только строка, в которой была обнаружена некорректность. Более эффективно обработать ошибку можно, если знать причину ее появления. Необходимая информация об ошибке хранится в следующих переменных:
ERDEV Последний код ошибки устройства
ERDEV$ Соответствующее имя устройства
ERR Код ошибки выполнения
Значение этих переменных можно анализировать в собственной программе обработки ошибок:

'Программа с ошибкой деленияON ERROR GOTO FehlerHandlerPRINT "Вывод проведенных вычислений"'строка с возможной ошибкойPRINT 1000/0END 'здесь кончается основная программа'Конец программы'начало собственной программы обработки ошибокFehlerHandlerPRINTPRINT" ———————————————"PRINT "Найдена ошибка PRINT "код ошибки устройства:"; ERDEV PRINT "устройство ", ERDEV$ PRINT "Код ошибки выполнения:"; ERR PRINT "———————————————"PRINT RESUME NEXT

В справочно-информационной системе (Help) QBASICa имеется список всех возможных ошибок выполнения (Run-time error). В приведенной ниже таблице собраны наиболее часто встречающиеся сообщения об ошибках и их коды:

Код Ошибка
  Деление на нуль
  Прерывание устройств по времени (Time out)
  Общая ошибка устройства
  Конец бумаги
  Недопустимое имя или номер файла
  Файл не найден
  Ошибочный режим файла
  Файл уже открыт
  Ошибка устройства ввода/вывода
  Файл уже существует
  Переполнение диска
  Недопустимое имя файла
  Устройство недоступно
  Доступ запрещен
  Диск не готов
  Ошибка носителя
  Ошибка доступа
  Путь не найден

Прежде чем заняться дальнейшим усовершенствованием программы обработки ошибок, рассмотрим оператор RESUME. Его можно применять в следующих вариантах:
*) RESUME
*) RESUME Метка_перехода
*) RESUME NEXT
RESUME NEXT
продолжает программу со строки, следующей за предложением, в котором обнаружена ошибка. С помощью оператора RESUME Метка_перехода можно перейти в любую точку программы, a RESUME без дополнений вызывает повторное выполнение ошибочного фрагмента. Для оценки кода ошибки выполнения лучше всего использовать оператор SELECT...CASE.

'обработка ошибокON ERROR GOTO FehlerHandlerPRINT "Вывод вычислений"PRINT 1000 / О"LPRINT "Вывод на печать"OPEN "GIBTESNI.CHT" FOR INPUT AS #1END 'здесь основная программа кончается''начало собственной программы обработки ошибокFehlerHandler:PRINT"—————————————"PRINT "Найдена ошибка " SELECT CASE ERR CASE ERR=11 'деление на нольPRINT "при программировании можно усложнитьRESUME NEXT CASE ERR=27 'конец бумагиPRINT "Вставьте бумагу"PRINT "Нажмите любую клавишу"DO WHILE INKKEY$=""LOOPRESUME CASEERR=25 AND MID$(ERDEV$,1,3)-"LPT"'ошибка принтераPRINT "Подготовьте принтер"PRINT "Нажмите любую клавишу"DO WHILE INKEY$=""LOOPRESUME CASE ELSECLSPRINT "Код ошибки:"; errPRINT "Придется прервать программу"END SELECT

Приведенная подпрограмма реагирует на ошибку, вызванную делением на нуль, обходом ошибочной строки (RESUME NEXT). При этом выдается сообщение об ошибке. Если обнаружена ошибка принтера, выдается рекомендация по ее устранению. Если прозойдет ошибка, код которой не анализируется ветвями CASE ERR, то становится активной ветвь CASE ELSE, программа выводит код ошибки и прерывает работу. В предложенном примере это произойдет при попытке открыть несуществующий файл "GIBTESNI.CHT".



Поделиться:


Последнее изменение этой страницы: 2016-09-20; просмотров: 164; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.213.240 (0.011 с.)