
1432
.pdfМетоды WriteLine и Write могут выводить значения простых переменных так и целиком всего массива типа char, например:
Dim n As Integer = 1
Dim c() As Char = {“A”, “B”, “C”, “D”, “E”} fo.Write(n)
fo.Write(c)
Закрытие файла выполняется с помощью метода Close(), например:
fo.Close()
fs.Close()
Если при записи строк на русском языке возникает проблема распознавания символов, то она решается путем указания соответствующей кодовой страницы при создании файла.
Dim w As New StreamWriter(fs, _ System.Text.Encoding.GetEncoding(1251))
Аналогично упомянутая проблема решается при чтении текста на русском языке.
Dim w As New StreamReader(fs, _ System.Text.Encoding.GetEncoding(1251))
Пример программы
В программе используются строковая переменная s, целочисленная переменная i, a также fo – член класса StreamWriter. Ошибки при создании файла, а также при записи в него информации генерируют исключение IOException. Массив типа char выводится посимвольно fo.Write(c(i)), а затем весь сразу одной командой fo.WriteLine(c).
‘Пример 2.1
Imports System.IO
Module Module1
Private Const FN As String = "a.txt" Sub Main()
Dim fs As FileStream Try
fs = New FileStream(FN, FileMode.Create) Catch e As IOException Console.WriteLine(e.Message)
29
Return
End Try
Dim s As String = "Вывод в текстовый файл" Dim i As Integer
Dim c(26) As Char
For i = 0 To 25 c(i) = Chr(i + 65) Next i
Dim fo As New StreamWriter(fs) Try
fo.WriteLine(s) For i = 0 To 26 fo.Write(c(i)) Next fo.WriteLine() fo.WriteLine(c)
fo.WriteLine("Конец")
Catch e As IOException Console.WriteLine(e.Message) End Try
fo.Close()
fs.Close()
Console.WriteLine("Создан файл a.txt")
Console.ReadLine()
End Sub
End Module
2.2. Задание на тему «Создание текстового файла»
Создать консольное приложение, создающее текстовый файл и записывающее в него не менее 15 символьных строк.
Порядок выполнения лабораторной работы
Создать новый проект – консольное приложение.
30
Добавить необходимый программный код.
Компилировать программу.
Тестировать программу.
Создать документ с описанием работы программы.
2.3. Чтение информации из текстового файла
Открытие текствого файла может быть выполнено командами: Dim fs As FileStream
fs = New FileStream(“a.txt”, FileMode.Open)
Для чтения символьной информации из текстового файла можно использовать методы Read и ReadLine класса StreamReader. Метод Read позволяет считывать из файла по одному символу.
Dim fi As New StreamReader(fs) Dim s As String = fi.ReadLine()
Метод ReadLine читает из файла текущую строку целиком. Если достигнут конец файла, то метод возвращает null.
Dim s As String = fi.ReadLine()
Можно загрузить текстовый файл целиком в одну строковую переменную с помощью метода ReadToEnd.
Dim s As String = fi.ReadToEnd
Метод ReadBlock позволяет прочитать определенное количество символов, размещая их в массиве, начиная с указанного номера элемента:
Dim c1(26) As Char fi.ReadBlock(c1, 0, 26)
Закрытие файла выполняется с помощью метода Close(), например:
fi.Close()
Цикл с предусловием
При вводе из файла набора данных обычно используется цикл. Так как заранее неизвестно, сколько строк (или символов) в файле, оправдано применить не цикл со счетчиком, а цикл с предусловием While. Он имеет слующую форму:
While условие
31
Группа операторов
End While
Группа операторов в теле цикла выполняется до тех пор, пока условие имеет значение true. Например, следующий фрагмент кода вычисляет произведение элементов числовой последовательности до тех пор, пока оно не превысит 1000.
Dim n As Integer = 1
Dim p As Integer = 1 While p<1000
n = n +1 p = p * n End While
Пример программы
Программа читает информацию из текстового файла, созданного в примере из предыдущей темы. Используются массив с типа char, строковая переменная s, целочисленная переменная i, a также fi – член класса StreamReader. Обрабатываются исключения
FileNotFoundException (файл не найден) и EndOfStreamException
(попытка чтения после конца потока).
‘ Пример 2.2
Imports System.IO
Module Module1
Private Const FN As String = "a.txt" Sub Main()
‘ Открыть файл для чтения
Dim fs As FileStream Try
fs = New FileStream(FN, FileMode.Open) Catch e As FileNotFoundException Console.WriteLine(e.Message)
Return
End Try
Dim s As String
32
Dim i As Integer
Dim c(26) As Char
Dim fi As New StreamReader(fs)
Try
‘ Читать одну строку s = fi.ReadLine() Console.WriteLine(s) For i = 0 To 26
‘ Читать очередной символ (код символа) c(i) = Chr(fi.Read())
Console.Write(c(i)) Next Console.WriteLine()
‘Читать два кода 13 и 10, означающих конец строки
Console.WriteLine(fi.Read().ToString()) Console.WriteLine(fi.Read().ToString())
‘Читать блок символов в массив
Dim c1(26) As Char fi.ReadBlock(c1, 0, 26) Console.WriteLine(c1)
Catch e As EndOfStreamException
Console.WriteLine(e.Message)
End Try
‘ Закрыть файл fi.Close() fs.Close()
Console.WriteLine("Прочитан файл a.txt") Console.ReadLine()
End Sub
End Module
33
2.4. Задание на тему «Чтение информации из текстового файла»
Задание для студентов: cоздать на языке Visual Basic консольное приложение, читающее строки из текстового файла и отображающее их на экране.
Порядок выполнения лабораторной работы
Создать новый проект – консольное приложение.
Добавить необходимый программный код.
Компилировать программу.
Создать текстовый файл с исходными данными.
Тестировать программу.
- Создать документ с описанием работы программы.
34
3. ОБРАБОТКА ДАННЫХ
3.1. Формирование массива
При достаточно сложной обработке информации невозможно обойтись без структурных типов данных (один из них – строковый – уже был несколько раз использован в примерах из предыдущих глав). Массив – это таблица элементов, имеющих одно имя, но отличающихся значением индекса – номера элемента. Одномерный массив объявляется с помощью записи следующей формы:
Dim имя_массива(макс_индекс) As тип
Здесь тип – это базовый тип данных каждого элемента массива. Целая величина макс_индекс определяет максимальный номер элемента массива. Минимальный номер равен 0. В следующей строке объявляется массив целых чисел, состоящий из 11 элементов. Первый элемент имеет индекс 0, а последний – 10.
Dim a(10) As Integer
Сэлементами массива можно выполнять все те же действия, что
ис простыми переменными указанного типа. Существенное отличие заключается в том, что номер элемента может указываться с помощью числовой переменной, а также с помощью арифметического выражения. Это позволяет строить сложные алгоритмы обработки данных.
Dim a(10) As Integer Dim n As Integer A(0) = 10
A(1) = 7 n = 2
a(n) = a(0)+a(n-1)
Значения элементов массива могут быть заданы с помощью оператора присваивания, операцией ввода данных с клавиатуры или из файла, а также инициализацией в момент создания, например, массива вещественных чисел:
Dim b() As Double = {0.0,1.0,2.0,3.0,4.0}
Количество элементов здесь не указывается явно, а определяется по количеству чисел, заданных при инициализации. Допускается другая, несколько избыточная форма объявления массива:
35
Dim b2() As Double = New Double() {0.1, 1.3, 2.5, 3.7, 4.9}
В еще одном варианте объявления массив создается в одной строке, а инициализируется в другой:
Dim b3() As Double
b3 = New Double() {0.01, 1.02, 2.03, 3.04, 4.05}
Пример программы
В примере создается один целочисленный и 3 вещественных массива из 5 элементов. В целочисленный массив заносятся случайные числа от 10 до 99. Вещественные массивы инициируются непосредственно при объявлении. Затем значения элементов массива выводятся на экран.
‘ Пример 3.1
Module Module1 Sub Main()
Dim A(4) As Integer
Dim b() As Double = {0.02, 1.04, 2.06, 3.08, 4.1}
Dim b2() As Double = New Double() {0.1, 1.3, 2.5, 3.7, 4.9} Dim b3() As Double
b3 = New Double() {0.01, 1.02, 2.03, 3.04, 4.05} For I As Integer = 0 To 4
A(I) = 10 + Int(90*Rnd) Next I
For i As Integer = 0 To 4
Console.Write(A(i))
Console.Write(" " & b(i).ToString("00.00")) Console.Write(" ") Console.Write("{0:R2}", b2(i)) Console.Write(" ") Console.Write("{0:F2}", b3(i)) Console.WriteLine()
Next Console.ReadLine() End Sub
End Module
При выводе чисел использовано 3 способа форматирования. Первый – b(i).ToString("00.00") означает, что число выводится с
36
обязательными 2 знаками до запятой и 2 знаками после запятой. Второй и третий форматы похожи – они означают, что число выводится с обязательными 2 знаками после запятой. Числа отделяются друг от друга пробелами.
3.2. Задания на тему «Формирование массива»
Сформировать два массива и записать их содержимое в текстовый файл. В табл. 3.1 указаны типы данных, которые должны быть использованы в программе.
Таблица 3.1
Варианты задания на тему «Формирование массива»
Вариант |
Массив 1 |
Массив 2 |
1 |
char |
integer |
2 |
char |
long |
3 |
char |
single |
4 |
char |
double |
5 |
char |
short |
6 |
byte |
integer |
7 |
byte |
long |
8 |
byte |
single |
Вариант |
Массив 1 |
Массив 2 |
9 |
byte |
double |
10 |
single |
integer |
11 |
single |
long |
12 |
single |
short |
13 |
double |
integer |
14 |
double |
long |
15 |
double |
short |
|
|
|
Порядок выполнения лабораторной работы
Создать новый проект – консольное приложение.
Добавить необходимый программный код.
Компилировать программу.
Тестировать программу.
Создать документ с описанием работы программы.
3.3. Обработка массивов
Процедуры, которые применяются для обработки и анализа больших массивов данных, – это сортировка, фильтр, поиск. Мы не будем рассматривать традиционные алгоритмы. Для обработки данных воспользуемся методами класса System.Array. Рассмотрим массив целых чисел a1.
Dim a1() As Integer = {2,4,3,7,1,8,6,9,0,5}
37
В данной строке длина массива не указана явно. Ее можно определить с помощью метода Length.
Dim n As Integer = a1.Length
Сортировка массива a1 выполняется с помощью метода Sort: Array.Sort(a1)
Переставить элементы местами a1 так, чтобы первый стал последним, второй предпоследним и т.д., можно, применив метод
Reverse: Array.Reverse(a1)
Копирование элементов одного массива в другой реализуем с помощью метода Copy, указав для первого массива индекс элемента, с которого начинается копирование, для второго – индекс элемента, с которого начинается вставка. Последний параметр – это количество копируемых элементов.
Dim a2(9) As Integer
Array.Copy(a1,0,a2,0,10)
Команда копирования может преобразовать тип числовых данных, при условии, что данные совместимы. Например, можно копировать данные из массива типа int в массив типа double.
Dim a3(9) As Double a1.CopyTo(a3, 0)
Поиск позиции элемента, равного указанному значению, выполняет метод IndexOf. В том случае, если элемент не найден, метод возвращает значение -1.
Dim n As Integer = Array.IndexOf(a1,9)
Для отсортированного массива аналогичное действие выполняет метод BinarySearch.
Dim n As Integer = Array.BinarySearch(a1,9)
Позицию последнего элемента, имеющего указанное значение, определяет метод LastIndexOf.
Dim n As Integer = Array.LastIndexOf(a1,9)
Для того чтобы очистить часть массива, то есть заполнить элементы нулями, требуется метод Clear. Например, следующая строка обнуляет 4 элемента массива, начиная с элемента, имеющего номер 6.
Array.Clear(a1, 6, 4)
38