Главная страница
Навигация по странице:

  • Open Путь For Режим [Access доступ] [Блокировка] As []Номер- файла [Len=длина] Путь −

  • Режим − ключевое слово, указывающее режим файла: Append, Binary, Input, Output или Random.

  • Доступ − ключевое слово, указывающее операции, разрешенные с откры- тым файлом: Read, Write или Read Write Блокировка −

  • Shared, Lock Read, Lock Write и Lock Read Write. НомерФайла −

  • FreeFile Длина −

  • Close Общий вид оператора Close : Close [списокНомеровФайлов

  • [[]номерФайла] [, []номерФайла] . . .

  • Write: Write номерФайла, [списокВывода] 74НомерФайла − любой допустимый номер файла. СписокВывода −

  • Input Синтаксис: Input номерФайла, списокПеременных НомерФайла − любой допустимый номер файла. СписокПеременных −

  • Ошибки этапа выполнения.

  • Edit/List Properties/Method

  • 7. Примеры решения простейших стандартных задач 7.1. Задачи на линейные алгоритмы

  • Программирование на visual basic


    Скачать 1.19 Mb.
    НазваниеПрограммирование на visual basic
    Анкорvb.pdf
    Дата05.06.2021
    Размер1.19 Mb.
    Формат файлаpdf
    Имя файлаvb.pdf
    ТипУчебное пособие
    #214287
    страница9 из 17
    1   ...   5   6   7   8   9   10   11   12   ...   17
    5.7. Операции ввода-вывода с файлами данных
    Иногда приходится производить операции ввода-вывода данных, нахо- дящихся в файлах организованных на внешних устройствах. В данной ра- боте ограничимся только простейшими сведениями об операторах работы с файлами на диске. Рассмотрим общий вид основных операторов работы с файлами: open, close, print и input.
    Для того чтобы начать работу с файлом, его необходимо открыть при помощи оператора open. Синтаксис оператора open:
    Open Путь For Режим [Access доступ] [Блокировка] As [#]Номер-
    файла [Len=длина]
    Путь

    строковое выражение, указывающее имя файла; может содержать имя каталога или папки и имя диска.

    73
    Режим

    ключевое слово, указывающее режим файла
    : Append, Binary,
    Input, Output
    или
    Random.
    По умолчанию файл открывается для доступа в режиме Random.
    Доступ −
    ключевое слово, указывающее операции, разрешенные с откры- тым файлом:
    Read, Write
    или
    Read Write
    Блокировка

    ключевое слово, указывающее операции, разрешенные с открытым файлом другим процессам:
    Shared, Lock Read, Lock 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

    81
    1   ...   5   6   7   8   9   10   11   12   ...   17


    написать администратору сайта