Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_лекции_Саладаев.doc
Скачиваний:
55
Добавлен:
03.05.2015
Размер:
15.75 Mб
Скачать

2. Функция eof

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

 

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

INPUT #Номер_фаила, Поле_данных_1 [,Поле_данных_2]... [,Поле_данных_n] 'Работа с файлами 'Программа для последовательного чтения адресов 'Объявление полей данных DIM nachname$, vornameS, strasse$, plz$, ort$, telefon$,stichwort$ 'Открыть файл в режиме INPUT OPEN "adresse.asc FOR INPUT AS #1 CLS 'Читать файл до тех пор, пока функция 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

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

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

 

Программа управления адресами должна выполнять следующие действия:

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

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

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

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

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

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

 

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

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

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

'Ошибка нейтрализована DIM a! DO INPUT "Введите, пожалуйста, число ",а1 UNTIL a!<>0 PRINT 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 FehlerHandler PRINT "Вывод проведенных вычислений" 'строка-провокатор PRINT 1000/0 END 'здесь основная программа кончается 'Конец программы 'начало собственной программы обработки ошибок FehlerHandler: PRINT "Найдена ошибка" PRINT RESUME NEXT

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

  • ERDEVПоследний код ошибки устройства

  • ERDEV$Соответствующее имя устройства

  • ERRКод ошибки выполнения

Значение этих переменных можно анализировать в собственной программе обработки ошибок:

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

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

Код

Ошибка

11

Деление на нуль

24

Прерывание устройств по времени (Time out)

25

Общая ошибка устройства

27

Конец бумаги

52

Недопустимое имя или номер файла

53

Файл не найден

54

Ошибочный режим файла

55

Файл уже открыт

57

Ошибка устройства ввода/вывода

58

Файл уже существует

61

Переполнение диска

64

Недопустимое имя файла

68

Устройство недоступно

70

Доступ запрещен

71

Диск не готов

72

Ошибка носителя

75

Ошибка доступа

76

Путь не найден

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

  • RESUME

  • RESUME Метка_перехода

  • RESUME NEXT

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

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