- •Тема 5.1. Лабораторная работа «Стандартные модули и модульная структура приложений в vb»
- •5.1.1. Задание
- •5.1.2. Варианты задания
- •5.1.3. Содержание отчета
- •1 Вариант реализации проекта:
- •Разработка проекта:
- •Ввод количества студентов в группе – n;
- •Выполнение приложения и получение результатов:
- •Выполнение приложения и получение результатов:
- •Доказательство правильности работы программ.
- •3 Вариант реализации проекта:
- •Разработка проекта:
- •Выполнение приложения и получение результатов:
Выполнение приложения и получение результатов:
Результаты работы проекта (вариант 1) представлены на рис. 5.1-6 и рис. 5.1.7.
Рис. 5.1-6 Рис. 5.1-7
Доказательство правильности работы программы
2 вариант реализации проекта:
Одна группа студентов; в программном коде проекта используется стандартный модуль и две формы; исходные данные вводятся из текстового файла чтением построчно и отображаются на первой форме; результаты вычислений отображаются на второй форме и построчно записываются в другой текстовый файл.
Формат исходного файла: каждая строка файла состоит из фамилии и 5 оценок, разделенных между собой одним пробелом, например, Фамилия 5 4 5 3 4.
Разработка проекта:
Разработка графического интерфейса пользователя
Разработанная форма интерфейса приведена на рис. 5.1-8 и рис. 5.1-9.
Рис. 5.1-8 Рис. 5.1-9
Установка свойств объектов
Свойства объектов управления разработанной формы студенты устанавливают самостоятельно и отображают в таблице.
Разработка схемы алгоритма
В соответствии с заданием 2-го варианта реализации проекта, решение задачи можно разбить на следующие функциональные задачи:
ввод исходных данных из текстового файла и определение количества студентов в группе – readfile(“путь1”, n, p);
отображение данных в текстовое поле на форме - vivod(p, TextBox);
создание массива фамилий студентов fam( ) и массива оценок oc( ) из читаемого файла – sozdmas(“путь1”, n, fam, oc);
нахождение общего среднего балла за сессию студентов одной группы – sr и средних баллов студентов – sred(oc, n, so, sr) ;
сортировка массива so( ) и fam( ) в порядке убывания – sort(so, fam, n);
решение задачи: определение студентов, для которых средняя оценка меньше общей средней в группе и формирование двух строк-списков из их фамилий и средних оценок – Reshenie(sr, fam, so, n, p1, p2);
запись результатов в текстовый файл – writefile(“путь2”,fam, so, n, sr).
Общая (укрупненная) схема алгоритма решения задачи представлена на рис. 5.1-10.
Рис. 5.1-10
Схемы алгоритмов отдельных функциональных задач студенты должны разработать самостоятельно, в соответствии с функциональной схемой.
Написание программного кода с использованием модуля и процедур
Программный код, решаемой задачи, реализованный с использованием процедур, стандартного модуля и двух форм, представлен на рис. 5.1-11.
-
Option Strict On
Option Explicit On
Imports System.IO
Module Module1
Public n As Integer ' Количество студентов
Public oc(,) As Integer ' Оценки, полученные в сессию
Public fam() As String ' Фамилии студентов
Public sr As Single ' Средний балл за сессию
Public so() As Single ' Средние баллы, полученные за сессию
'Процедура вывода строки в Textbox
Sub vivod(ByVal z As String, ByVal T As TextBox)
T.Text = z
End Sub
'Процедура сортировки массива средних оценок по убыванию
'методом пузырька с одновременной перестановкой фамилий
Sub sort(ByRef so() As Single, ByRef f() As String, _
ByVal n As Integer)
Dim i, j As Integer
Dim m As Single
Dim c As String
For i = n - 1 To 1 Step -1
For j = 1 To i
If so(j) > so(j - 1) Then
m = so(j) : so(j) = so(j - 1) : so(j - 1) = m
c = f(j) : f(j) = f(j - 1) : f(j - 1) = c
End If
Next
Next
End Sub
'Процедура определения общего среднего балла за сессию
' и средних баллов каждого студента
Sub sred(ByVal oc(,) As Integer , ByVal n As Integer, _
ByRef so() As Single, ByRef sr As Single)
Dim i, j As Integer
ReDim so(n - 1)
sr = 0
For i = 0 To n - 1
For j = 0 To 4
sr = sr + oc(i, j)
so(i) = so(i) + oc(i, j)
Next j
so(i) = so(i) / 5
Next i
sr = sr / (5 * n)
End Sub
'Процедура построчного чтения сведений о студентах из тек. файла,
'подсчета числа студентов и формирования строки для вывода данных
Sub readfile(ByVal filename As String, ByRef n As Integer, _
ByRef p As String)
'создание потока для чтения из текстового файла
Dim f = New StreamReader(filename)
Dim line As String
p = "" 'строка с исходными данными
n = 0 'количество строк в файле
Try
Do While Not f.endOfStream 'пока не достигнут конец потока
line = f.ReadLine() 'чтение строки из файла в line
n = n + 1
p = p & line & vbNewLine
Loop
f.close() 'закрытие потока
Catch ex As Exception
MsgBox("Невозможно прочитать данные из файла")
End Try
End Sub
' Процедура построчной записи в текстовый файл отсортированного
' массива студентов,имеющих средний балл ниже общего среднего
Sub writefile(ByVal filename As String, ByVal fam() As String, _
ByVal so() As Single , ByVal n As Integer, _
ByVal sr As Single)
'создание нового текст. файла и потока wf для записи в файл
Dim wf As StreamWriter = File.CreateText(filename)
Dim s As String
For i As Integer = 0 To n - 1
If so(i) < sr Then
s = fam(i) + " " + CStr(so(i))
'запись сведений об одном студенте в текстовый файл
wf.WriteLine(s)
End If
Next
wf.Flush() : wf.Close() 'очистка и закрытие потока
End Sub
' Процедура формирования списка студентов
' имеющих средний балл ниже общего среднего
Sub Reshenie(ByVal sr As Single, ByVal fam() As String, _
ByVal so() As Single , ByVal n As Integer, _
ByRef p1 As String, ByRef p2 As String)
Dim i As Integer
p1 = "" 'формируемая строка из фамилий
p2 = "" 'формируемая строка средних баллов ниже общ. средн.
For i = 0 To n - 1
If so(i) < sr Then
p1 = p1 & fam(i) & vbNewLine
p2 = p2 & CStr(so(i)) & vbNewLine
End If
Next i
End Sub
'Процедура построчного считывания сведений о студентах из файла
'и создание массива фамилий студентов и массива оценок
Sub sozdmas(ByVal filename As String , ByVal n As Integer, _
ByRef fam() As String, ByRef oc(,) As Integer)
Dim p, i, j As Integer
ReDim fam(n - 1), oc(n - 1, 4)
Dim line, ball As String
'создание потока для чтения из текстового файла
Dim f As New StreamReader(filename)
Try
i = 0
Do While Not f.EndOfStream 'пока не достигнут конец потока
line = f.ReadLine() 'чтение строки из файла в line
line = line + " " 'добавляем пробел в конец строки
p = line.IndexOf(" ") 'p-позиция первого пробела
'в переменной line подстрока до первого пробела-это
'фамилия
fam(i) = line.Substring(0, p)
'удаление из строки line фамилии с пробелом
line = line.Remove(0, p + 1)
For j = 0 To 4
p = line.IndexOf(" ")
'p-позиция 1-го пробела в строке
'теперь в line подстрока до 1-го пробела-это оценка
ball = line.Substring(0, p)
oc(i, j) = CInt(ball)
'удаление из строки line оценки с пробелом
line = line.Remove(0, p + 1)
Next
i = i + 1
Loop
f.Close()
Catch ex As Exception
MsgBox("Невозможно прочитать данные из файла")
End Try
End Sub
End Module
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
Dim p As String
readfile("d:\myfile2.txt", n, p)’вызов проц. чтения из файла
vivod(p, TextBox1)
sozdmas("d:\myfile2.txt", n, fam, oc)'вызов проц.
'созд.массивов из файла
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button2.Click
Form2.Show() 'показ 2 формы для продолжения решения
End Sub
'Процедура для окончания работы программы
Private Sub Button3_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button3.Click
End
End Sub
End Class
Public Class Form2
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
Dim p1 As String = ""
Dim p2 As String = ""
'Расчет средних баллов
sred(oc, n, so, sr)
vivod(CStr(sr), TextBox1)
'Вызов процедуры сортировки по убыванию средних оценок
sort(so, fam, n)
' Вызов процедуры вывода списка студентов,
' имеющих средний балл ниже общего среднего
Reshenie(sr, fam, so, n, p1, p2)
vivod(p1, TextBox2) : vivod(p2, TextBox3)
End Sub
' Запись в текстовый файл студентов,
' имеющих средний балл ниже общего среднего
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button2.Click
writefile("d:\myfile13.txt", fam, so, sr)
End Sub
'Процедура для окончания работы программы
Private Sub Button3_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button3.Click
End
End Sub
End Class.
Рис. 5.1-11.