1432
.pdfОпрос элементов коллекции
Коллекция – это группа объектов. Одним из типов коллекций является массив. Для опроса элементов коллекции используется цикл For Each, формат которого представлен ниже.
For Each переменная As Тип in коллекция Инструкции
Next
Здесь тип и переменная определяют итерационную переменную, которая в процессе работы цикла For Each будет получать значения элементов из коллекции. Итерационную переменную можно использовать только для чтения. При опросе массива тип должен совпадать с базовым типом массива. Цикл последовательно опрашивает элементы массива в направлении от наименьшего индекса к наибольшему. Например, следующие строки кода суммируют элементы массива целых чисел a1.
‘ Пример 3.2
Dim S As Integer = 0
For Each n As Integer in a1 S = S + n
Next
Для преждевременного выхода из цикла до окончания опроса коллекции предназначена инструкция Exit For. Например, следующий пример определяет, есть ли среди элементов массива нуль.
‘ Пример 3.3
Dim F As Boolean = False For Each n As Integer in a1 If n=0 Then
F = True
Exit For
End If
Next
Пример программы
Впримере создается целочисленный массив a1 из 20 элементов.
Спомощью генератора случайных чисел в массив заносятся числа от
39
10 до 99. Затем массив сортируется. Создается вещественный массив a2, в который копируются данные из a1. Порядок элементов массива a2 меняется на обратный. По два состояния каждого массива выводятся в текстовый файл.
‘ Пример 3.4
Module Module1
Sub Main() Dim i As Integer
Dim fo As Integer
Dim a1(20) As Integer For i = 0 To a1.Length - 1 a1(i) = 10 + 90 * Rnd() Next
Try
fo = FreeFile()
FileOpen(fo, "a.txt", OpenMode.Output)
Catch E As IOException
Console.WriteLine(E.Message)
End Try
Try
WriteLine(fo, "Массив чисел типа int")
For Each n As Integer In a1
Write(fo, n)
Next
WriteLine(fo)
Array.Sort(a1)
WriteLine(fo, "Массив упорядочен")
For Each n As Integer In a1
Write(fo, n)
Next
WriteLine(fo)
Dim a2(20) As Double a1.CopyTo(a2, 0)
WriteLine(fo, "Массив чисел типа double")
40
For Each x As Double In a2
Write(fo, x)
Next
WriteLine(fo)
Array.Reverse(a2)
WriteLine(fo, "Порядок элементов обратный")
For Each x As Double In a2
Write(fo, x)
Next
Catch E As IOException
Console.WriteLine(E.Message)
End Try
FileClose(fo)
Console.WriteLine("Создан файл a.txt с 4 рядами чисел") Console.ReadLine()
End Sub
End Module
3.4. Задания на тему «Обработка массивов»
Сформировать массив. Вывести значения его элементов в текстовый файл. Сортировать массив и вывести результат в файл. Создать второй массив. Копировать все элементы первого массива во второй. Вывести значения элементов второго массива в файл. Изменить на обратный порядок элементов второго массива. Результат вывести в файл. В табл. 3.2 указаны типы данных, которые должны быть использованы в программе.
Таблица 3.2
Варианты задания на тему «Формирование массива»
Вариант |
Массив 1 |
Массив 2 |
1 |
byte |
integer |
2 |
byte |
long |
3 |
byte |
single |
4 |
byte |
double |
5 |
short |
integer |
Вариант |
Массив 1 |
Массив 2 |
6 |
short |
long |
7 |
short |
single |
8 |
short |
double |
9 |
integer |
single |
10 |
integer |
double |
41
Порядок выполнения лабораторной работы
Создать новый проект – консольное приложение.
Добавить необходимый программный код.
Компилировать программу.
Тестировать программу.
Создать документ с описанием работы программы.
42
4.БИНАРНЫЕ ФАЙЛЫ
4.1.Запись данных в бинарный файл
Данные в бинарный файл записываются не в символьном виде, а в том, в котором они хранятся в памяти. Для записи данных применяются методы Write, которые записывают данные всех встроенных Visual Basic-типов в их внутреннем формате. В частности, строка string записывается вместе со значением ее длины. Для создания бинарного файла используется класс BinaryWriter, который представляет собой оболочку для байтового потока, которая управляет записью двоичных данных. Пример создания файла:
Dim Fs As FileStream
Fs = New FileStream(F_Name, FileMode.CreateNew)
При этом, если файл с указанным именем существует, то произойдет ошибка. Если в первой строке использовать параметр FileMode.Create, то существующий файл будет удален и создан новый с тем же именем. Для записи данных в бинарный файл используются методы, представленные в табл. 4.1.
Таблица 4.1
Методы вывода данных класса BinaryWriter
Метод |
Описание |
||
Write(sbyte |
val) |
Записывает один байт со знаком |
|
|
|
|
|
Write(byte |
val) |
Записывает один байт без знака |
|
|
|
|
|
Write(byte[] |
buf) |
Записывает массив байтов |
|
|
|
|
|
Write(short |
|
val) |
Записывает целое число типа short |
|
|
|
|
Write(ushort |
val) |
Записывает целое число типа ushort (без знака) |
|
|
|
||
Write(int val) |
Записывает целое число типа int |
||
|
|
|
|
Write(uint |
val) |
Записывает целое число типа uint (без знака) |
|
|
|
|
|
Write(long |
val) |
Записывает целое число типа long (длинное целое) |
|
|
|
|
|
Write(ulong |
val) |
Записывает целое число типа ulong (без знака) |
|
Write(float |
val) |
Записывает вещественное число типа float |
|
|
|
||
Write(double val) |
Записывает вещественное число типа double |
||
|
|
|
|
Write(char |
val) |
Записывает символ |
|
|
|
|
|
Write(char[] |
val) |
Записывает массив символов |
|
|
|
|
|
Write(string |
val) |
Записывает строку типа string (включая ее длину) |
|
|
|
|
|
43
Перечисленные методы способны определять все встроенные типы данных. Если при выводе массива байтов или символов указывается только имя, то массив выводится целиком. Если требуется вывести часть массива, то после его имени указывается индекс первого выводимого элемента, а затем количество выводимых элементов. Для записи информации в поток данных создается экземпляр класса BinaryWriter:
Dim Fb As New BinaryWriter(Fs)
Водной из строк ниже выполняется запись всего массива байтов
вфайл, связанный с созданным экземпляром Fb класса BinaryWriter, а в другой – запись трех элементов, начиная с пятого (числа 5, 6, 7): Dim a As Byte = {0,1,2,3,4,5,6,7,8,9}
Fb.Write(a)
Fb.Write(a,5,3)
Классы определены в пространстве имен System.IO, доступ к которому возможен после добавления в начало программы строки Option System.IO. В случае неудачного исхода операции чтения генерируется исключение IOExcepion.
Закрытие файла выполняется с помощью метода Close, например: Fb.Close()
Fs.Close()
Пример программы
В программе создаются 2 массива. Значения элементов массивов b и c задаются в цикле. Это латинские символы и их однобайтовые коды. Массивы b и c выводятся в файл целиком. Ошибки открытия файла, а также ошибки записи данных генерируют исключение IOExcepion. Команда Return в первом Catch-блоке завершает программу в случае ошибки при открытии файла.
‘ Пример 4.1
Imports System.IO
Module Module1
Private Const FN As String = "b.bin" Sub Main()
Dim fs As FileStream Try
fs = New FileStream(FN, FileMode.Create)
44
Catch e As FileNotFoundException
Console.WriteLine(e.Message)
Return
End Try
Dim i As Integer
Dim b(26) As Byte
Dim c(26) As Char
For i = 0 To 25
b(i) = i + 65
Next i
For i = 0 To 25
c(i) = Chr(i + 65)
Next i
Dim w As New BinaryWriter(fs) Try
w.Write(b, 0, 26) w.Write(c, 0, 26) Catch e As Exception
Console.WriteLine(e.Message) End Try
w.Close()
fs.Close()
Console.WriteLine("Создан файл b.bin")
Console.ReadLine()
End Sub
End Module
Так как в качестве данных использованы символы и их коды, содержимое бинарного файла можно просмотреть с помощью программы Блокнот.
4.2. Задание на тему «Запись данных в бинарный файл»
Создать консольное приложение, создающее бинарный файл и записывающее в него данные из двух массивов. В табл. 4.2 указаны типы данных, которые должны быть использованы в программе.
45
Таблица 4.2
Варианты заданий на тему «Запись данных в бинарный файл»
Вариант |
Массив 1 |
Массив 2 |
1 |
char |
short |
2 |
char |
int |
3 |
char |
long |
4 |
char |
float |
5 |
char |
double |
Вариант |
Массив 1 |
Массив 2 |
6 |
byte |
short |
7 |
byte |
int |
8 |
byte |
long |
9 |
byte |
float |
10 |
Byte |
double |
Порядок выполнения лабораторной работы
Создать новый проект – консольное приложение.
Добавить необходимый программный код.
Компилировать программу.
Тестировать программу.
Создать документ с описанием работы программы.
4.3. Чтение данных из бинарного файла
Для чтения двоичных данных используется класс BinaryReader, представляющий собой оболочку для байтового потока, который управляет чтением двоичных данных. Открытие файла может быть выполнено следующей парой команд:
Dim fs As New FileStream
fs = New FileStream(F_Name, FileMode.Open, FileAccess.Read)
Для чтения строк из файла используется один из методов, представленных в табл. 4.3.
Таблица 4.3
Методы ввода данных класса BinaryReader
Метод |
Описание |
|
1 |
2 |
|
Read() |
Читает один байт |
|
Read(мас_byte, поз_мас, кол_байт) |
Читает указанное количество байтов в |
|
массив |
||
ReadBytes(количество) |
Читает символы и возвращает в виде |
|
массива |
||
|
||
Read(мас_char, поз_мас, кол_симв) |
Читает символы в массив |
|
ReadBoolean() |
Читает значение типа bool |
46
|
Окончание табл. 4.3 |
|
|
|
|
1 |
2 |
|
ReadByte() |
Читает значение типа byte |
|
ReadSByte() |
Читает значение типа sbyte |
|
ReadChar() |
Читает значение типа char |
|
ReadChars(количество) |
Читает символы и возвращает в виде |
|
массива |
||
|
||
ReadDouble() |
Читает значение типа double |
|
ReadSingle() |
Читает значение типа float |
|
ReadInt16() |
Читает значение типа short |
|
ReadInt32() |
Читает значение типа int |
|
ReadInt64() |
Читает значение типа long |
|
ReadString() |
Читает значение типа string |
Для получения данных из файла создается экземпляр класса
BinaryReader.
Dim fb As New BinaryReader(fs)
В следующих строках выполняется чтение из файла, связанного с описанным выше экземпляром класса BinaryReader: сначала 10 байтов в массив, начиная с элемента с индексом 0; затем одного вещественного числа типа single и одного целого числа типа long.
Dim a(26) Fb.Read(a, 0, 10)
Dim x As single = Fb.ReadSingle() Dim n As long = Fb.ReadToInt64()
Если потребуется прочитать несколько целых или вещественных чисел в массив, то необходимо использовать цикл, читая из файла данные в последовательные элементы с помощью методов из табл. 4.3.
Пример программы
В программе создаются 2 массива. С помощью одной команды читаютя 26 байтов в массив a, затем аналогично читаются данные в массив b. Прочитанные данные выводятся на экран, при этом байты, которые подразумеваются кодами символов, при выводе преобразуются в символы. Обрабатываются исключения
FileNotFoundException (файл не найден) и EndOfStreamException
(попытка чтения после конца потока).
47
‘ Пример 4.2
Imports System.IO
Module Module1
Private Const FN As String = "b.bin" Sub Main()
Dim fs As New FileStream Try
fs = New FileStream(FN, FileMode.Open, FileAccess.Read) Catch e As FileNotFoundException Console.WriteLine(e.Message)
Return
End Try
Dim r As New BinaryReader(fs)
Try
b = r.ReadBytes(26)
c = r.ReadChars(26)
Catch e As EndOfStreamException
Console.WriteLine(e.Message)
End Try
r.Close()
fs.Close()
For i = 0 To 25
Console.Write(Chr(b(i)))
Next i
Console.WriteLine()
For i = 0 To 25
Console.Write(c(i))
Next i
Console.ReadLine()
End Sub
End Module
48