Файл: Отображать номера групп в порядке убывания средней успеваемости их студентов - VB

Узнай цену своей работы

Формулировка задачи:

В файле данных содержится информация об итогах зимней сессии. О каждом студенте известны: <ФИО >, <номер группы >, <факультет >, <год поступления >, <оценка 1>, <оценка 2>, <оценка 3>. Разработать программу, которая позволяет: a) Создавать или пополнять файл данных; b) Отображать содержимое файла данных; c) Отображать номера групп в порядке убывания средней успеваемости их студентов; d) Печатать список отличников заданной группы.

Решение задачи: «Файл: Отображать номера групп в порядке убывания средней успеваемости их студентов»

textual
Листинг программы
Private Type Student    ' 72 байта
    FIO As String * 32
    Group As String * 8
    Faculty As String * 16
    Year As Long
    Score1 As Long
    Score2 As Long
    Score3 As Long
End Type
Private Type GroupReport
    Group As String
    Score As Double
    Total As Long
End Type
Dim Students() As Student, Init As Boolean
 
Private Function LoadData() As Boolean
    Dim fNum As Integer, I As Long
    On Error GoTo ErrorLoading
    fNum = FreeFile
    Open App.Path & "\Data.rdm" For Random As fNum Len = 72
    I = LOF(fNum) \ 72
    If I = 0 Then Close fNum: Exit Function
    ReDim Students(I - 1): Init = True
    I = 0
    For I = 0 To UBound(Students)
        Get fNum, , Students(I)
    Next
    Close fNum
    LoadData = True
    Exit Function
ErrorLoading:
    MsgBox "Ошибка", vbCritical
End Function
Private Sub StoreData()
    Dim fNum As Integer, I As Long
    On Error GoTo ErrorStore
    fNum = FreeFile
    If Not Dir$(App.Path & "\Data.rdm") = vbNullString Then Kill (App.Path & "\Data.rdm")
    If Not Init Then Exit Sub
    Open App.Path & "\Data.rdm" For Random As fNum Len = 72
    I = 0
    Do Until I > UBound(Students)
        Put fNum, , Students(I)
        I = I + 1
    Loop
    Close fNum
    Exit Sub
ErrorStore:
    MsgBox "Ошибка", vbCritical
End Sub
Private Sub RefreshList()
    Dim I As Long
    If Not Init Then Exit Sub
    lvwList.ListItems.Clear
    For I = 0 To UBound(Students)
        With lvwList.ListItems.Add(, , I + 1)
            .SubItems(1) = RTrim(Students(I).FIO)
            .SubItems(2) = RTrim(Students(I).Group)
            .SubItems(3) = RTrim(Students(I).Faculty)
        End With
    Next
End Sub
Private Sub cmdAdd_Click()
    Dim Index As Long
    If Not Init Then Index = 0: Init = True Else Index = UBound(Students) + 1
    ReDim Preserve Students(Index)
    Students(Index).FIO = txtFIO
    Students(Index).Group = txtGroup
    Students(Index).Faculty = txtFaculty
    Students(Index).Year = txtYear
    Students(Index).Score1 = txtScore(0)
    Students(Index).Score2 = txtScore(1)
    Students(Index).Score3 = txtScore(2)
    StoreData
    RefreshList
End Sub
 
Private Sub cmdBests_Click()
    Dim G As String, I As Long, R As String, T As Long
    If Not Init Then Exit Sub
    G = InputBox("Введите группу")
    If Len(G) = 0 Then Exit Sub
    For I = 0 To UBound(Students)
        If StrComp(Trim$(Students(I).Group), G, vbTextCompare) = 0 And _
           Students(I).Score1 >= 5 And Students(I).Score2 >= 5 And _
           Students(I).Score3 >= 5 Then
            R = R & RTrim$(Students(I).FIO) & " (" & RTrim$(Students(I).Faculty) & ")" & vbNewLine
            T = T + 1
        End If
    Next
    MsgBox "Отличники в группе " & G & " " & T & " человек" & vbNewLine & R
End Sub
 
Private Sub cmdGroup_Click()
    Dim Rep() As GroupReport, rInit As Boolean
    Dim I As Long
    If Not Init Then Exit Sub
    For I = 0 To UBound(Students)
        AddToGroup Rep, Students(I), rInit
    Next
    For I = 0 To UBound(Rep)
        Rep(I).Score = Rep(I).Score / Rep(I).Total / 3
    Next
    qSort Rep, 0, UBound(Rep)
    Load dlgReport
    For I = 0 To UBound(Rep)
        With dlgReport.lvlReport.ListItems.Add(, , I + 1)
            .SubItems(1) = Rep(I).Group
            .SubItems(2) = Round(Rep(I).Score, 3)
        End With
    Next
    dlgReport.Show 1
End Sub
Private Sub AddToGroup(Rep() As GroupReport, Value As Student, Optional ByRef rInit As Boolean)
    Dim I As Long, Z As Long
    If rInit Then
        I = GetGroup(Rep, Value.Group)
        If I = -1 Then
            I = UBound(Rep) + 1
            ReDim Preserve Rep(I)
            Rep(I).Group = Value.Group
        End If
        Rep(I).Total = Rep(I).Total + 1
        Rep(I).Score = Rep(I).Score + Value.Score1 + Value.Score2 + Value.Score3
    Else
        ReDim Rep(0)
        Rep(0).Group = Value.Group
        Rep(0).Score = Value.Score1 + Value.Score2 + Value.Score3
        Rep(0).Total = 1
        rInit = True
    End If
End Sub
Private Function GetGroup(Rep() As GroupReport, Name As String) As Long
    Dim I As Long
    GetGroup = -1
    For I = 0 To UBound(Rep)
        If StrComp(RTrim(Name), RTrim(Rep(I).Group), vbTextCompare) = 0 Then GetGroup = I
    Next
End Function
Private Sub qSort(Ar() As GroupReport, ByVal low As Long, ByVal high As Long)
    Dim I As Long, j As Long, m As Single, wsp As GroupReport
    I = low: j = high: m = Ar(CInt((I + j) / 2)).Score
    Do Until I > j: Do While Ar(I).Score > m: I = I + 1: Loop: Do While Ar(j).Score < m: j = j - 1: Loop
        If (I <= j) Then wsp = Ar(I): Ar(I) = Ar(j): Ar(j) = wsp: I = I + 1: j = j - 1
    Loop
    If low < j Then qSort Ar, low, j
    If I < high Then qSort Ar, I, high
End Sub
Private Sub Form_Load()
    LoadData
    RefreshList
End Sub
Private Sub lvwList_Click()
    If lvwList.SelectedItem Is Nothing Then Exit Sub
    txtFIO = RTrim$(Students(lvwList.SelectedItem.Index - 1).FIO)
    txtGroup = RTrim$(Students(lvwList.SelectedItem.Index - 1).Group)
    txtFaculty = RTrim$(Students(lvwList.SelectedItem.Index - 1).Faculty)
    txtYear = Students(lvwList.SelectedItem.Index - 1).Year
    txtScore(0) = Students(lvwList.SelectedItem.Index - 1).Score1
    txtScore(1) = Students(lvwList.SelectedItem.Index - 1).Score2
    txtScore(2) = Students(lvwList.SelectedItem.Index - 1).Score3
End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.333 из 5
Похожие ответы