Программирование на visual basic
Скачать 1.19 Mb.
|
5.7. Операции ввода-вывода с файлами данных Иногда приходится производить операции ввода-вывода данных, нахо- дящихся в файлах организованных на внешних устройствах. В данной ра- боте ограничимся только простейшими сведениями об операторах работы с файлами на диске. Рассмотрим общий вид основных операторов работы с файлами: open, close, print и input. Для того чтобы начать работу с файлом, его необходимо открыть при помощи оператора open. Синтаксис оператора open: Open Путь For Режим [Access доступ] [Блокировка] As [#]Номер- файла [Len=длина] Путь − строковое выражение, указывающее имя файла; может содержать имя каталога или папки и имя диска. 73 Режим − ключевое слово, указывающее режим файла : Append, Binary, Input, Output или Random. По умолчанию файл открывается для доступа в режиме Random. Доступ − ключевое слово, указывающее операции, разрешенные с откры- тым файлом: Read, Write или Read Write Блокировка − ключевое слово, указывающее операции, разрешенные с открытым файлом другим процессам: и Lock Read Write. НомерФайла − допустимый номер файла в интервале от 1 до 511 включи- тельно. Для определения следующего свободного номера файла можно использовать функцию FreeFile Длина − число, меньшее либо равное 32767 (байт). Для файлов, открытых в режиме Random, это значение является длиной записи. Для файлов с по- следовательным доступом это значение является числом буферизуемых символов. Чтобы получить возможность выполнить любую операцию вво- да/вывода, файл необходимо открыть. Инструкция Open резервирует бу- фер ввода/вывода для файла и определяет режим использования этого бу- фера. Если аргумент путь описывает несуществующий файл, такой файл бу- дет создан при открытии в режиме Append, Binary, Output или Random. Если файл уже открыт другим процессом и указанный режим доступа не разрешен, инструкция Open не будет выполнена и возникнет ошибка. Если аргумент режим имеет значение Binary, то предложение Len иг- норируется. Внимание ! В режимах Binary, Input и Random можно еще раз открыть уже открытый файл под другим номером, не закрывая его. В режиме Append и Output необходимо закрыть файл, чтобы получить возможность открыть его еще раз под другим номером. После работы с файлом его необходимо закрыть оператором Close Общий вид оператора Close : Close [списокНомеровФайлов ] Необязательный аргумент списокНомеровФайлов может представлять один или несколько номеров файлов. При этом используется следующий синтаксис, где номерФайла представляет любой допустимый номер файла: [[#]номерФайла] [, [#]номерФайла] . . . Если аргумент списокНомеровФайлов опущен, закрываются все актив- ные файлы, открытые с помощью инструкции Open. При закрытии файла, открытого в режиме Output или Append, в него добавляется содержимое последнего буфера вывода. Все буферы, связан- ные с закрытым файлом, освобождаются. Запись данных в файл производиться операторами Write или Print. Синтаксис оператора Write: Write #номерФайла, [списокВывода] 74 Н омерФайла − любой допустимый номер файла. СписокВывода − одно или несколько разделяемых запятыми числовых вы- ражений или строковых выражений, которые следует записать в файл. Данные, записанные с помощью инструкции Write #, обычно считыва- ются из файла с помощью инструкции Input #. Если аргумент списокВывода опущен, а после аргумента номерФайла идет только разделитель списка, в файл будет напечатана пустая строка. Для разделения выражений можно использовать пробелы, точки с запятой или запятые, которые в данной ситуации полностью эквивалентны. Ниже приведены правила, которые используются при записи данных в файл с помощью инструкции Write #. Записанные данные могут быть кор- ректно прочитаны с помощью инструкции Input # при наличии любой национальной настройки: • в качестве десятичного разделителя при записи числовых данных всегда используется точка; • при выводе логических данных (тип Boolean) в файл записываются ключевые слова #TRUE# или #FALSE#. Ключевые слова True и False не переводятся; • при выводе в файл данных типа Date используется универсальный фор- мат даты. Если компонент, соответствующий дате или времени, отсут- ствует или равен нулю, в файл записывается только имеющийся в нали- чии компонент; • если аргумент списокВывода имеет значение Empty, в файл ничего не записывается; • если списокВывода имеет значение Null, в файл записывается #NULL#; • данные типа Error записываются в файл как #ERROR кодОшибки#. Ключевое слово Error не переводится. В отличие от инструкции Print #, инструкция Write # вставляет запятые между элементами и заключает строки в кавычки по мере записи их в файл. Разработчику не требуется включать разделители в список явным образом. Write # вставляет символ новой строки, т.е. комбинацию симво- лов возврата каретки и перевода строки (Chr(13) + Chr(10)), после записи в файл последнего символа, включенного в списокВывода. Для ввода данных с файла используется оператор Input Синтаксис: Input #номерФайла, списокПеременных НомерФайла − любой допустимый номер файла. СписокПеременных − разделяемый запятыми список переменных, ко- торым следует присвоить значения, считанные из файла. Нельзя использо- вать массивы или объектные переменные. Однако допускается использо- вание переменных, описывающих элементы массива или определяемого пользователем типа. 75 Данные, считываемые с помощью инструкции Input #, обычно записываются в файл с помощью инструкции Write #. Эта инструкция применима только к файлам, открытым в режиме Input или Binary. Пример. Открыть файл на запись. Записать в него первые 100 членов натурального ряда. Закрыть файл. Открыть его на чтение, прочитать запи- санные в файл данные и найти их сумму. Sub РаботаСФайлами() Dim a As Long, s As Long, i As Long ' Открыть файл на чтение и присвоить ему отсылочное число 1 Open "TESTFILE" For Output As #1 ' Записать в файл первые 100 членов натурального ряда For i = 1 To 100 Write #1, i Next i Close #1 ' Закрыть файл Open "TESTFILE" For Input As #1 ' Открыть файл на чтение ' Прочитать 100 чисел из файла и подсчитать их сумму For i = 1 To 100 Input #1, a s = s + a Next i ' Вывести для контроля полученную сумму MsgBox ("Сумма = " + Str(s)) Close #1 ' Закрыть файл End Sub Можете посмотреть в папке МОИ ДОКУМЕНТЫ содержимое этого файла. Файлы можно использовать для хранения промежуточных данных больших объемов. 76 6. Отладка программ Написанную программу необходимо выполнить и обработать результа- ты. При введении и выполнении программы возможно возникновение ошибок. Полученные результаты также могут содержать неверные значе- ния. Поэтому программу необходимо отладить. При отладке и выполнении программ могут возникать ошибки трех типов: • Синтаксические. Ошибки, возникающие на этапе ввода кода программ, связанные с неправильным написанием ключевых слов, операторов, математических, логических и текстовых вы- ражений. Эти ошибки обнаруживаются редактором программы сразу же после ввода текущей строки. При этом возникает окно, определяющее тип ошибки и подробное описание ошибки. Оши- бочная строка выделяется красным цветом. Строка Программист сразу же может исправить такую ошибку и продолжить вводить программу. • Ошибки этапа выполнения. Во время выполнения программы могут возникать ошибки связанные с неправильным описанием типов переменных в различных программных единицах проекта, неправильными именами функций, арифметическими ошибками и так далее. • Логические ошибки. Ошибки, при которых программа выпол- няется полностью, но полученные результаты неправильны. Ис- правления таких ошибок является достаточно трудоемкой и сложной операцией. В Visual Basic встроены средства, которые после ввода имени функции или подпрограммы, отображают список формальных параметров. При описании типов переменных возникает контекстное меню со списком ти- пов объектов. Программист может при помощи мышки или клавиатуры выбрать необходимый тип данных. В процессе ввода имени данных, кон- текстное меню автоматически по алфавиту перемещается к нужному эле- менту. Набрав первые символы элемента, и убедившись, что необходимый элемент выделен, можно нажатием клавиши Tab ввести имя элемента в код программы. Для ввода данного элемента из списка и перехода на следую- щую строку используется клавиша Enter. Список типов данных, имен, свойств и методов объектов можно вы- звать при помощи комбинации клавиш Ctrl+J или команды меню Edit/List Properties/Method При использовании длинных имен удобно использовать метод допол- нения слова. После ввода начальных символов слова, можно нажать ком- бинацию клавиш Ctrl+Пробел. В возникшем списке будет отмечен элемент имеющий начальное имя совпадающее с введенным. Нажатие клавиши Tab или Enter автоматически дописывает имя. 77 Если на этапе выполнения программы происходит ошибка, то данная ошибка перехватывается стандартным обработчиком ошибок. При этом появляется окно, в котором дается краткая информация о возникшей ошибке. Окно имеет командные кнопки: End, Debug, Help. При нажатии на кнопку End, программа завершает работу. При нажатии на кнопку De- bug, программа переходит в режим отладки. В этом режиме можно подвес- ти курсор мыши к любой переменной и через некоторый момент внизу показывается значение данной переменной. Проанализировав возникшую ситуацию можно исправить программу и запустить ее заново или продо- лить с данной точки. В режим отладки можно войти при помощи расстановки точек преры- вания. В модуле программ слева от первого символа имеется узкая выде- ленная прямоугольная область, являющаяся полем отладчика. Если пере- местить курсор в это поле напротив любого оператора и нажать левую кнопку мышки, то оператор, находящийся в данной строке, выделяется и в поле отладки ставится точка. В процессе выполнения программы происхо- дит остановка на каждом отмеченном операторе. При этом программист может посмотреть значения всех переменных величин в момент остановки программы. В любой момент программист может убрать точки останова программы или добавить новые. Удалить точки останова можно при по- мощи повторного нажатия мышкой на точке прерывания. Кроме того, на любом этапе отладки программы можно изменить любые операторы про- граммы и, нажав на кнопку сброс (черный прямоугольник на панели инст- рументов Visual Basic), заново начать выполнять программу. Такой метод отладки сложных программ существенно уменьшает время отладки. При запуске программ при помощи команды F8, включается пошаго- вый режим выполнения программы. В этом режиме после выполнения очередного оператора происходит останов программы. После анализа со- стояния переменных можно выполнить очередную строку, нажав еще раз клавишу F8. Для выхода из пошагового режима необходимо нажать ком- бинацию клавиш Ctrl+Shift+F8. 7. Примеры решения простейших стандартных задач 7.1. Задачи на линейные алгоритмы 7.1.1. Написать программу, которая переводит длину, заданную в дюй- мах, в сантиметры. Решение. Описываем переменную вещественного типа L, в которую вводим значение длины в дюймах. Умножая L на 2,54 см, получаем значе- ние длины в сантиметрах. 78 Sub ПереводДюймыВСантиметры() Dim L As Double L = CDbl(InputBox("Введите длину объекта в дюймах")) L = L * 2.54 ' Пересчет сантиметров в дюймы MsgBox ("Длина объекта в сантиметрах=" + Str(L)) End Sub 7.1.2. Найти площадь треугольника по трем заданным сторонам. Решение. Если известны все три стороны треугольника, то площадь его вычисляется по формуле Герона: Вычислительную программу разобьем на две части: основную про- грамму и функцию, реализующую формулу Герона. В основной программе мы введем исходные данные a, b и c и вызовем функцию с именем SqGeron , в которой подсчитывается площадь треугольника. В функции вычисляется подкоренное выражение формулы Герона и запоминается в переменной D. Sub ПлощадьТреугольникаПоТремСторонам() Dim a As Double, b As Double, c As Double 'ввести длину трех сторон a = CDbl(InputBox("Введите длину первой стороны треугольника")) b = CDbl(InputBox("Введите длину второй стороны треугольника")) c = CDbl(InputBox("Введите длину третьей стороны треугольника")) MsgBox ("Площадь треугольника= " + Str(SqGeron(a, b, c))) End Sub Function SqGeron(a As Double, b As Double, c As Double) As Double Dim p As Double, D As Double p = (a + b + c) / 2 ' Полупериметр треугольника ' Площадь треугольника по формуле Герона D = p * (p - a) * (p - b) * (p - c) ' Если D>0, то a, b, c образуют треугольник и возвращается его ' площадь, иначе возвращается отрицательное число -1 If D >= 0 Then SqGeron = Sqr(D) Else SqGeron = -1 End Function 7.1.3. Найти радиусы описанной и вписанной окружности треугольника по трем заданным сторонам. Решение. Если известны все три стороны треугольника, то радиусы вписанной r и описанной R окружностей вычисляются по формулам: Для решения этой задачи используем функцию SqGeron предыдущего примера. В VB большие и маленькие буквы в идентификаторах перемен- 2 , ; , , , ) )( )( ( c b a p ка треугольни тр полупериме p ка треугольни стороны c b a где c p b p a p p S + + = − − − − − = ; , 4 , ка треугольни тр полупериме p площадь S где S abc R p S r − Δ − = = 79 ных считаются одинаковыми, поэтому для переменной r выбран иденти- фикатор rOp, а для R - Rvp. Sub РадиусыОкружностейВписаннойИОписаннойПо3Сторонам() Dim a As Double, b As Double, c As Double, p As Double, S As Double Dim rOp As Double, Rvp As Double 'Ввести длину трех сторон a = CDbl(InputBox("Введите длину первой стороны треугольника")) b = CDbl(InputBox("Введите длину второй стороны треугольника")) c = CDbl(InputBox("Введите длину третьей стороны треугольника")) p = (a + b + c) / 2 ‘ Полупериметр треугольника S = SqGeron(a, b, c) ‘ Площадь треугольника rOp = S / p ‘ Радиус вписанной окружности Rvp = a * b * c / (4 * S) ‘ Радиус описанной окружности MsgBox ("Радиус вписанной окружности = " & rOp & _ " Радиус описанной окружности = " & Rvp) End Sub 7.1.4. Написать программу для вычисления значения следующей функ- ции: 4 5 1 1 1 ) ( 4 5 4 3 ⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛ + + + + = x x x F Значение аргумента функции ввести с ячейки рабочего листа. Sub ФункцияДляАлгебраическогоВыражения1() Dim x As Double, F As Double ' Считать значение аргумента с ячейки A1 x = Sheets("Лист1").Cells(1, 1) ' Вычислить значение функции F = ((1 + (x + 1) ^ (1 / 3)) / (1 + (5 * x ^ 4 + 1) ^ (1 / 5))) ^ 4 'В ячейку B2 вывести значение функции Sheets("Лист1").Cells(1, 2) = F End Sub 7.1.5. Написать программу для вычисления значения следующей функ- ции: Аргумент функции ввести с клавиатуры, а значение функции вывести в окно отладки. Sub ФункцияДляАлгебраическогоВыражения1() Dim X As Double, F As Double X = CDbl(InputBox("Введите аргумент функции")) F = (2 ^ Sin(X) ^ 3 + Log10(Atn(X))) / Cos(X) Debug.Print "Значение функции= "; F End Sub ‘ Функция вычисления lgx через функцию lnx cos ) lg( 2 ) ( 3 sin x arctgx x F x + = 80 Function Log10(X As Double) As Double Log10 = Log(X) / Log(10) End Function 7.1.6. Написать программу для вычисления значения следующей функ- ции: Аргумент функции ввести с клавиатуры, а значение функции вывести в окно отладки. Sub ФункцияДляАлгебраическогоВыражения2() Dim X As Double, F As Double, x1 As Double X = CDbl(InputBox("Введите аргумент функции")) x1 = 3 - X ^ 2 / (5 - X ^ 2 / 7) F = X / (1 - X ^ 2 / x1) - Tan(X) Debug.Print "Значение функции= "; F End Sub 7.1.7. Написать программу для решения системы линейных алгебраиче- ских уравнений a, b, c, d ,e и f ввести с рабочего листа. Предполагается, что система имеет единственное решение. Кроме того, все коэффициенты не равны ну- лю. Решение. Решаем методом исключения неизвестных. Из первого урав- нения получаем x=(c-by)/a. Подставляем это выражение во второе уравне- ние системы. Получаем: y=(af-dc)/(ae-db). Sub РешениеСистемыДвухЛинейныхУравнений() Dim a As Double, b As Double, c As Double, d As Double Dim e As Double, f As Double, x As Double, y As Double Sheets("Лист1").Select ' Перейти на рабочий лист с именем Лист1 a = Cells(1, 1): b = Cells(1, 2): c = Cells(1, 3) d = Cells(2, 1): e = Cells(2, 2): f = Cells(2, 3) y = (a * f - d * c) / (a * e - d * b) x = (c - b * y) / a Debug.Print "x= "; x; " y= "; y Debug.Print "ax+by= "; a * x + b * y; " dx+ey= "; d * x + e * y End Sub 7 5 3 1 ) ( 2 2 2 tgx x x x x x F − − − − = ⎩⎨ ⎧ = + = + f ey dx c by ax |