13134

Средства объектно-ориентированного программирования в VB

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторная работа по теме Тема 5.3. Средства объектноориентированного программирования в VB Цель данной лабораторной работы состоит в изучении средств приемов и получении практических навыков разработки написания и отладки проектов использующих объектноор

Русский

2013-05-08

571.5 KB

3 чел.

Лабораторная работа по теме

«Тема 5.3. Средства объектно-ориентированного программирования в VB»

Цель данной лабораторной работы состоит в изучении  средств, приемов и получении практических навыков разработки, написания и отладки проектов, использующих объектно-ориентированную технологию.

5.3.1. Задание

Данная лабораторная работа является продолжением предыдущей темы, в которой была построена объектная модель решаемой задачи и определена иерархия классов. Поэтому исходными данными для выполнения лабораторной работы является результат предыдущей лабораторной работы.

Разработать интерфейс пользователя с учетом формализации задания, проведенной в п.2 лабораторной работы 5.2:

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

разработать выходную форму, предназначенную для вывода результатов решения задачи.

Составить схемы алгоритмов решения функциональных задач с учетом того,  что они будут реализованы в виде методов, и работать с полями и свойствами.

Создать  программный код проекта, решающий поставленную задачу на базе построенной в предыдущей лабораторной работе объектной модели уровня реализации.

Привести диаграмму (иерархию) классов, получив ее по созданному программному коду решения задачи.

Подготовить тестовые наборы исходных данных, соответствующие смысловой направленности решаемой задачи  для ввода с клавиатуры и из текстового файла. Формат текстового файла должен быть задан преподавателем, сам текстовый файл с расширением *.txt должен быть подготовлен студентом  средствами MS  Windows. При создании текстового файла на русском языке с помощью БЛОКНОТА, файл следует сохранять в кодировке UTF-8.

Получить решение.

Обосновать правильность полученных результатов.

5.3.2.  Варианты задания

Данная лабораторная работа является продолжением предыдущей темы, в которой была построена объектная модель решаемой задачи и определена иерархия классов. Поэтому исходными данными для выполнения лабораторной работы является результат предыдущей.


5.3.3. Содержание отчета

  1.  Тема и название работы.
  2.  Задание на разработку проекта  и вариант задания.
  3.  Разработка (проекта) приложения:
  4.    графический интерфейс пользователя;
  5.    свойства объектов интерфейса пользователя;
  6.    функциональное наполнение классов и схемы алгоритмов функциональных

  задач;

  1.    программный код проекта с использованием методов и процедур  

 функциональных задач,   стандартных модулей и классов;

  1.   диаграмма (иерархия) классов.
  2.  Тестовые наборы исходных данных.
  3.  Результаты выполнения приложения.
  4.  Доказательство правильности работы программы.

5.3.4. Примеры выполнения задания

  1.  Тема и название работы:

Средства объектно-ориентированного программирования в VB –
Формирование списка фамилий студентов, которым по итогам сессии необходимо повысить успеваемость до фактического среднего уровня.

  1.  Задание:

Разработать программный проект решения задачи формирования списка студентов, которым по итогам сессии необходимо повысить успеваемость до фактического среднего уровня, при условии, что для каждого студента известны по m оценок, полученных им в сессию, а  всего в группе  n студентов. Формируемый список фамилий студентов должен быть представлен в двух видах: в порядке убывания среднего балла, полученного за сессию, а также по алфавиту (1 вариант), или только в порядке убывания среднего балла(2 вариант). Исходные списки студентов и результатов сессии могут находиться как в текстовом файле, так, и введены с клавиатуры (1 вариант) или только вводиться с клавиатуры (2 вариант)

Интерфейс разрабатываемого приложения для решения поставленной задачи должен содержать как  минимум две  формы (для ввода и отображения  на форме исходных данных, и для вывода результатов на другую форму).

В программном коде необходимо использовать две формы, базовые и производные классы.

1 вариант реализации проекта предполагает что:

исходные данные, которые могут, как вводиться с клавиатуры, так  и считываться из файла, отображаются на 1-ой форме;  результирующие списки выводятся на 2-й форме и по убыванию среднего балла, и по алфавиту; в программном коде проекта используются две формы и 4 класса, причем один класс с исходными данными – базовый, и три производных класса с результатами, в том числе один абстрактный класс.

  1.  Разработка проекта (приложения):
    1.  Графический интерфейс пользователя:

Разработанные формы интерфейса пользователя (рис.5.3-1 и рис. 5.3-2) используют текстовые поля (свойство MultiLine = True) и кнопки, причем на 1 форме сначала кнопка Button3  недоступна (свойство Enabled=False), т.к. показать решение возможно только после ввода исходных данных.

              Рис. 5.3-1

            

  Рис. 5.3-2

  1.    Свойства объектов управления интерфейсов пользователей.

Свойства объектов управления разработанных форм студенты устанавливают самостоятельно и отображают в таблице.

 

  1.    Функциональное наполнение классов схемы алгоритмов функциональных

 задач:

В соответствии с разработанной в предыдущей лабораторной работе объектной моделью для выполнения задания  1-го варианта и разработанного интерфейса пользователя, решение задачи можно разбить на следующие функциональные задачи:


Для базового класса
  Студенты:

  •  ввод исходных данных с клавиатуры и формирование массива фамилий Ffam() с помощью свойства fam и массива оценок Foc(,) c помощью свойства oc перегружаемая процедура без параметров vvod();
  •  ввод исходных данных из файла и формирование массива фамилий
    Ffam()с помощью свойства fam и массива оценок Foc(,) с помощью свойства oc – перегружаемая процедура vvod(), входными параметрами которой будут число строк  файла и массив, полученный из строк файла, выходным параметром – число экзаменов;
  •  нахождение средних оценок каждого студента и общего среднего балла в группе – процедура-подпрограмма sred();
  •  вывод одномерного строкового массива для фамилий студентов -  перегружаемая процедура VivodMas();
  •  вывод одномерного вещественного массива для средних оценок студентов -  перегружаемая процедура VivodMas();
  •  вывод целочисленной матрицы оценок, полученных студентами в сессию -  процедура  VivodMatr().

Для первой формыкласса  Form1:

  •  объявление глобальной переменной  G  типа базового класса Студенты с последующим созданием объекта этого класса в событийных процедурах Button1_Click(…) для кнопки ввода исходных данных с клавиатуры или Button2_Click(…) для кнопки ввода исходных данных из файла вызовом соответствующего конструктора G  =  New  Студенты (kolSt, ke) или
    G =  
    New Студенты (kolSt);
  •  чтение исходных данных из текстового файла одной строкой – vvodFile("путь1",  s);
  •  получение из этой строки массива подстрок  mas()  с помощью функции Split()  и определение количества строк в файле (количества студентов в группе)  –  kolSt - в событийной процедуре Button2_Click(…).

Для производного абстрактного класса  Результат:

  •  формирование списка студентов, имеющих средний балл ниже общего среднего балла группы (формирования полей класса)  из исходных данных, записанных в базовом классе – процедура  FormirSpisok();
  •  виртуальный метод  sort()  - процедура сортировки списка студентов.

Для производного класса  СписПоУбыв:

  •  переопределенный метод базового класса  sort()- процедура сортировки по убыванию массива средних баллов студентов, имеющих средний балл ниже общего среднего балла группы  с одновременной перестановкой их фамилий

  Для производного класса  СписПоАлф:

  •  переопределенный метод базового класса sort()- процедура сортировки по алфавиту массива фамилий студентов, имеющих средний балл ниже общего среднего балла группы  с одновременной перестановкой их средних баллов.

Для второй формы – класса  Form2:

  •  процедура  Result()  формирования результирующих полей для классов-наследников СписПоУбыв  и СписПоАлф  и для вывода их значений в элементы управления второй формы. Одним из формальных параметров этой процедуры является базовый класс, а фактический параметр при вызове из событийных процедур будет определять способ сортировки.
  •  в событийной процедуре Button1_Click(…)  для кнопки вывода результатов по убыванию создается объект SpAlf  = New  СписПоАлф, а в событийной процедуре Button2_Click(…)для кнопки кнопки вывода результатов по алфавиту создается объект SpUb = New  СписПоУбыв.

Cхемы алгоритмов отдельных функциональных задач (методов классов) студенты должны разработать самостоятельно. Подробная иерархическая схема пользовательских классов приведена в предыдущей лабораторной работе на рис. 5.2-4 и в этой лабораторной работе на рис. 5.3-4.

  1.   Программный код проекта.

 В программном коде проекта, представленном на рис. 5.3-3 присутствуют все

 классы, объекты и процедуры, разработанные при создании объектной модели

 решаемой задачи.

Option Strict On

Option Explicit On

Public Class Студенты

' ПОЛЯ

   Private Fn As Integer ' Количество студентов

   Private Fm As Integer ' Количество экзаменов

   Private Foc(,) As Integer  ' Оценки, полученные в сессию

   Private Ffam() As String   ' Фамилии студентов

   Private Fsr As Double      ' Общий средний балл  группы за сессию

   Private Fso() As Double    ' Средние баллы каждого студента

'КОНСТРУКТОРЫ

   ' Перегружаемый конструктор класса при вводе с клавиатуры

   Public Sub New(ByVal KolCt As Integer, ByVal ke As Integer)

       n = KolCt

       m = ke

       ReDim Foc(n - 1, m - 1), Ffam(n - 1), Fso(n - 1)

   End Sub

   ' Перегружаемый конструктор класса при чтении из файла

   'имеет только 1параметр-кол-во студентов(кол-во строк файла)

   'кол-во экзаменов станет известно только в процессе

   ' обработки прочитанного файла при вызове процедуры

   ' ввода из файла и создания массивов фамилий студентов и оценок

   Public Sub New(ByVal KolCt As Integer)

       ReDim Ffam(KolCt - 1), Fso(KolCt - 1)

   End Sub

 'пустой конструктор класса по умолчанию

   Public Sub New()

   End Sub

' СВОЙСТВА

   Public Property n() As Integer

       Get

           Return Fn

       End Get

       Set(ByVal value As Integer)

           If value > 0 Then

               Fn = value

           Else

               MsgBox("Ошибка при вводе кол-ва студентов")

               Fn = 20

           End If

       End Set

   End Property

   Public Property m() As Integer

       Get

           Return Fm

       End Get

       Set(ByVal value As Integer)

           If value > 0 Then

               Fm = value

           Else

               MsgBox("Ошибка при вводе кол-ва экзаменов")

               Fm = 4

           End If

       End Set

   End Property

   Public Property fam() As String()

       Get

           Return Ffam

       End Get

       Set(ByVal value() As String)

           Ffam = value

       End Set

   End Property

   Public Property oc() As Integer(,)

       Get

           Return Foc

       End Get

       Set(ByVal value(,) As Integer)

           Dim i, j As Integer

           For i = 0 To Fn - 1

               For j = 0 To Fm - 1

                   If value(i, j) > 0 And value(i, j) <= 5 Then

                       Foc(i, j) = value(i, j)

                   Else

                       MsgBox("Ошибка при вводе оценки!")

                       Foc(i, j) = 0

                   End If

               Next

           Next

       End Set

   End Property

   Public ReadOnly Property sr() As Double

       Get

           Return Fsr

       End Get

   End Property

   Public ReadOnly Property so() As Double()

       Get

           Return Fso

       End Get

   End Property

' МЕТОДЫ

   ' Определение  общего среднего балла группы  

   ' за сессию и средних баллов каждого студента

   Public Sub sred()

       Dim i, j As Integer

       Dim s As Double

       Fsr = 0

       For i = 0 To Fn - 1

           s = 0

           For j = 0 To Fm - 1

               Fsr = Fsr + oc(i, j)

               s = s + oc(i, j)

           Next j

           Fso(i) = s / Fm

       Next i

       Fsr = Fsr / (Fm * Fn)

   End Sub

   'Перегружаемая процедура ввода данных с клавиатуры

   Public Overloads Sub vvod()

       Dim i, j As Integer

       ' промежуточный массив  оценок для контроля

       'вводимых данных через свойство

       Dim a(n - 1, m - 1) As Integer

       For i = 0 To n - 1

           fam(i) = InputBox("Фамилия")

           For j = 0 To m - 1

               a(i, j) = CInt(InputBox("Оценка"))

           Next j

       Next i

       'присвоение введенного промежуточного массива

       ' полю класса Foc через его свойство

       oc = a

   End Sub

   'Перегружаемая процедура ввода данных из файла(создание массива 'фамилий студентов и массива оценок)

   Public Overloads Sub vvod(ByVal mas() As String, _

                       ByVal n As Integer, ByRef m As Integer)

       Dim i, j As Integer

       Dim line As String

       Dim buf() As String

       For i = 0 To n - 1

           line = mas(i)

           'Удаление из строки возможных лишних пробелов

           '(цикл замены двух пробелов одним)

           Do While line.IndexOf(Space(2)) >= 0

               line = line.Replace(Space(2), Space(1))

           Loop

           If mas(i) = "" Then

               n = n - 1

               MsgBox("В файле есть пустая строка")

               Exit For

           Else

               'Ф-ция Split разбивает строку line на массив подстрок

               ' buf()по символам пробела

               buf = Split(line, Space(1))

         '==================================================================

 ' При обработке первой строки файла(при i=0) 0)

        ' определяем кол-во экзаменов m и выделяем память

        'под поле класса Foc(,)

               If i = 0 Then

' кол-во экзаменов m определяется длина массива buf() - минус фамилия

                   m = buf.Length – 1  ' кол-во экзаменов

                   ReDim Foc(n - 1, m - 1)

               End If

               '================================================================

              'Первый элемент этого массива-фамилия,следующие-оценки

               fam(i) = buf(0)

               For j = 0 To m - 1

                   oc(i, j) = CInt(buf(j + 1))

               Next

           End If

       Next

   End Sub

   

   'Перегружаемая процедура вывода одномерного строкового массива

   Public Overloads Sub VivodMas(ByVal a() As String, _

                                 ByRef z As  String)

       Dim i As Integer

       z = ""

       For i = 0 To UBound(a)

           z = z + a(i) + vbNewLine

       Next

   End Sub

'Перегружаемая процедура вывода одномерного вещественного массива

   Public Overloads Sub VivodMas(ByVal a() As Double, _

                                ByRef z As String)

       Dim i As Integer

       z = ""

       For i = 0 To UBound(a)

           z = z + Format(a(i), "0.0000") + vbNewLine

       Next

   End Sub

   'Процедура  вывода двумерного массива

   '(собираем матрицу в одну строку)

   Sub vivodMatr(ByRef x(,) As Integer, ByVal n As Integer, _

                       ByVal m As Integer, ByRef z As String)

       Dim i, j As Integer

       z = ""

       For i = 0 To n - 1

           For j = 0 To m - 1

               z = z + CStr(x(i, j)) & Space(3)

           Next j

           z = z + vbNewLine

       Next i

   End Sub

End Class

'======================================================================

'абстрактный класс,производный от класса Студенты

Option Strict On

Public MustInherit Class Результат

   Inherits Студенты 'наследует класс Студенты

   'ПОЛЯ

   Private Fk As Integer 'кол-во студ,к-рым надо повысить успеваемость

   Private Ff() As String 'массив их фамилий

   Private Fsb() As Double 'массив их средних баллов

'КОНСТРУКТОРЫ (нужны, т.к. класс является наследником другого класса, хотя 'класс абстрактный и нельзя создавать его экземпляры)

   'пустой конструктор по умолчанию

   Public Sub New()

   End Sub

   'конструктор с параметрами

   Public Sub New(ByVal n As Integer, ByVal m As Integer)

       MyBase.New(n, m)

       ReDim Ff(n - 1), Fsb(n - 1)

   End Sub

  'СВОЙСТВА (все –только для чтения, т.к. поля класса получают свои

    'значения с помощью собственного метода FormirSpisok, и не могут

         'изменяться извне класса)

   Public ReadOnly Property k() As Integer

       Get

           Return Fk

       End Get

   End Property

   Public ReadOnly Property f() As String()

       Get

           Return Ff

       End Get

   End Property

   Public ReadOnly Property sb() As Double()

       Get

           Return Fsb

       End Get

   End Property

' МЕТОДЫ

   ' Формирование списка студентов,

   ' имеющих средний балл ниже общего среднего

   Public Sub FormirSpisok(ByRef gr As Студенты)

       Dim i As Integer

       Fk = 0

       For i = 0 To gr.n - 1

           If gr.so(i) < gr.sr Then

               Ff(Fk) = gr.fam(i)

               Fsb(Fk) = gr.so(i)

               Fk = Fk + 1

           End If

       Next

       ReDim Preserve Ff(Fk - 1), Fsb(Fk - 1)

   End Sub

  'виртуальный метод сортировки, к-рый д.б. переопределен в  'наследниках, именно из-за  наличия этого виртуального метода

   '(т.е. не определенного) класс абстрактный

   MustOverride Sub sort(ByRef s() As String, ByRef kol() As Double)

End Class

'=====Первый класс – наследник абстракного класса Результат =========

 Public Class СписПоУбыв

   Inherits Результат 'наследует класс Результат

'Собственных полей и свойств нет, используются наследуемые поля 'и свойства класса Результат

КОНСТРУКТОРЫ

   'пустой конструктор по умолчанию

   Public Sub New()

   End Sub

   Public Sub New(ByVal n As Integer, ByVal m As Integer)

       MyBase.New(n, m)

   End Sub

'МЕТОДЫ

' переопределенный метод базового класса в классе-наследнике

   'сортировка по убыванию среднего балла студента

   Public Overrides Sub sort(ByRef s()As String,ByRef kol() As Double)

       Dim i, j, k As Integer, temp As String, t As Double

       k = s.Length - 1

       For i = 0 To k - 1

           For j = i + 1 To k

               If kol(i) < kol(j) Then

                   t = kol(i) : kol(i) = kol(j) : kol(j) = t

                   temp = s(i) : s(i) = s(j) : s(j) = temp

               End If

           Next

       Next

   End Sub

End Class

'=====Второй класс – наследник абстракного класса Результат ==========

Public Class СписПоАлф

   Inherits Результат

   'пустой конструктор по умолчанию

   Public Sub New()

   End Sub

   Public Sub New(ByVal n As Integer, ByVal m As Integer)

       MyBase.New(n, m)

   End Sub

   'переопределенная проц в классе-наследнике

   'сортировка студентов по алфавиту

   Public Overrides Sub sort(ByRef s()As String,ByRef kol() As Double)

       Dim i, j, k As Integer, temp As String, t As Double

       k = s.Length - 1

       For i = 0 To k - 1

           For j = i + 1 To k

               If s(i) > s(j) Then

                   temp = s(i) : s(i) = s(j) : s(j) = temp

                   t = kol(i) : kol(i) = kol(j) : kol(j) = t

               End If

           Next

       Next

   End Sub

End Class

'======================================================================

'на первой форме вводятся и выводятся исходные данные о студентах

Option Strict On

Public Class Form1

   Public G As Студенты 'объявление переменной(не экземпляра!) класса

   'Процедура чтения сведений о студентах из текстового файла

   'в одну строку

   Sub vvodFile(ByVal filename As String, ByRef S As String)

       ' Открываем существующий файл и загружаем его текстовое

       'содержимое целиком в одну строку Str3.

       Try

           S = My.Computer.FileSystem.ReadAllText(filename)

       Catch ex As Exception

           MsgBox("ошибка при чтении файла")

       End Try

   End Sub

   'кнопка для ввода с клавиатуры

   Private Sub Button1_Click(ByVal sender As System.Object, _

             ByVal e As System.EventArgs) Handles Button1.Click

       'если выбрана кнопка для ввода данных с клавиатуры,

       'делаем недоступной 2-ю кнопку для ввода из файла

       Button2.Enabled = False

       Dim kolSt, ke As Integer

       Dim s As String = ""

       kolSt = CInt(InputBox("Введите количество студентов"))

       ke = CInt(InputBox("Введите количество экзаменов"))

       'создание экземпляра класса через 1-й конструктор

       G = New Студенты(kolSt, ke)

       'вызов метода ввода группы с клавиатуры

       G.vvod()

       'вызов метода вычисления среднего балла каждого студента

       'и общего среднего балла группы

       G.sred()

       G.VivodMas(G.fam, s)

       TextBox1.Text = s

       G.vivodMatr(G.oc, G.n, G.m, s)

       TextBox2.Text = s

       G.VivodMas(G.so, s)

       TextBox3.Text = s

       TextBox4.Text = CStr(G.sr)

       'Кн3 делаем доступной после ввода дан-х и расчета ср. баллов

       Button3.Enabled = True

   End Sub

   'кнопка для ввода из файла

   Private Sub Button2_Click(ByVal sender As System.Object, _

                   ByVal e As System.EventArgs) Handles Button2.Click

       'если выбрана кнопка для ввода данных из файла,

       'делаем недоступной 1-ю кнопку для ввода с клавиатуры

       Button1.Enabled = False

       Dim s As String = ""

       Dim kolSt, ke As Integer

       'Вызов проц-ры чтения сведений о студентах из текстового файла

       'целиком в одну строку s

       vvodFile("myfile.txt", s)

       Dim mas() As String

       'Ф-ция Split разбивает строку s на массив подстрок mas()

       'по символам конца строки vbNewLine

       mas = Split(s, vbNewLine)

       kolSt = mas.Length'кол-воэл-тов получ.массива(кол-во тудентов)

       'создание экземпляра класса через 2-й конструктор

       G = New Студенты(kolSt)

       'вызов процедуры ввода группы из файла(создание массивов

       'фамилий студентов и массива оценок)

       G.vvod(mas, kolSt, ke)

       G.n = kolSt'присваивание значения полю Fn через свойство

       G.m = ke

       'вызов метода вычисления среднего балла каждого студента

       'и общего среднего балла группы

       G.sred()

       G.VivodMas(G.fam, s)

       TextBox1.Text = s

       G.vivodMatr(G.oc, G.n, G.m, s)

       TextBox2.Text = s

       G.VivodMas(G.so, s)

       TextBox3.Text = s

       TextBox4.Text = CStr(G.sr)

       Button3.Enabled = True

   End Sub

'Кнопка перехода на вторую форму

   Private Sub Button3_Click(ByVal sender As System.Object, _

                  ByVal e As System.EventArgs) Handles Button3.Click

       Form2.Show()

   End Sub

End Class

'======================================================================

Public Class Form2

   'проц. формирования результирующих полей для классов-наследников

   'формальный пар-р этой проц-ры -базовый класс, а фактич. пар-р при 'вызове будет определять способ сортировки(полиморфизм)

   

   Sub Result(ByRef v As Результат, ByRef T1 As TextBox, _

                                    ByRef T2 As TextBox)

       Dim z As String = ""

       v.FormirSpisok(Form1.G)

       v.sort(v.f, v.sb)

       v.VivodMas(v.f, z)

       T1.Text = z

       v.VivodMas(v.sb, z)

       T2.Text = z

   End Sub

   ' кнопка для сортировки списка студентов по убыванию сред. балла

   Private Sub Button1_Click(ByVal sender As System.Object, _

            ByVal e As System.EventArgs) Handles Button1.Click

       'объявление переменной(не экземпляра!)абстрактного класса

       'нужно, чтобы под этим именем создать экземпляр

       'класса-наследника,тогда при вызове проц. Rezult

       'не будет обратных сужающих преобразований и оператор

       ' Option Strict On не дает ошибки

       Dim SpUb As Результат

       'создание экземпляра класса через конструктор

       SpUb = New СписПоУбыв(Form1.G.n, Form1.G.m)

       'вызов проц. формирования результирующих полей для 1класса

       'фактич. пар-р этой проц-ры определяет способ сортировки(полиморфизм)

       Result(SpUb, TextBox1, TextBox2)

   End Sub

  

 ' кнопка для сортировки списка студентов по алфавиту

   Private Sub Button2_Click(ByVal sender As System.Object, _

                             ByVal e As System.EventArgs) _

                             Handles Button2.Click

       'объявление переменной(не экземпляра!)абстрактного класса

       'нужно, чтобы под этим именем создать экземпляр

       'класса-наследника,тогда при вызове проц. Rezult

       'не будет обратных сужающих преобразований и оператор

       ' Option Strict On не дает ошибки

       Dim SpAlf As Результат

       'создание экземпляра класса через конструктор

       SpAlf = New СписПоАлф(Form1.G.n, Form1.G.m)

       'вызов проц. формирования результирующих полей для 2класса

       'фактич. пар-р этой проц-ры определяет способ

      'сортировки(полиморфизм)

       Result(SpAlf, TextBox3, TextBox4)

   End Sub

  ' кнопка для окончания работы

  Private Sub Button3_Click(ByVal sender As System.Object, _

                             ByVal e As System.EventArgs) _

                             Handles Button3.Click

       End

   End Sub

' кнопка для повторения (возврат на 1форму, очистка ее текстовых полей)

   Private Sub Button4_Click(ByVal sender As System.Object, _

                ByVal e As System.EventArgs) Handles Button4.Click

       Me.Close()

       Form1.TextBox1.Text = ""

       Form1.TextBox2.Text = ""

       Form1.TextBox3.Text = ""

       Form1.TextBox4.Text = ""

       Form1.Button1.Enabled = True

       Form1.Button2.Enabled = True

       Form1.Button3.Enabled = False

       Form1.Show()

   End Sub

End Class

     Рис. 5.3-3


  1.   Диаграмма (иерархия) классов:

               Рис. 5.3-4

4. Результаты выполнение приложения.

    Результаты работы проекта представлены на рис. 5.3-5 и рис. 5.3.6.

    

    Рис. 5.3-5

    

    Рис. 5.3-6

5. Доказательство правильности работы программы:

В результате работы проекта по выбору пользователя введены исходные данные (массив фамилий студентов и матрица полученных в сессию оценок), которые использованы для подсчета средней оценки каждого студента и среднего балла всей группы и выведены на 1 форму. На второй форме представлены 2 сформированных списка фамилий тех студентов, которым надо повысить успеваемость до фактического среднего уровня (у которых средняя оценка ниже общего среднего балла всей группы),  отсортированные по убыванию среднего балла и по алфавиту.

2 вариант реализации проекта предполагает что:

исходные данные, которые вводятся с клавиатуры, отображаются на 1-ой форме;  результирующие списки выводятся на 2-й форме по убыванию среднего балла; в программном коде проекта используются две формы и два класса (базовый с исходными данными и производный – с результатами).

3. Разработка проекта:

  1.  Разработка графического интерфейса пользователя:

    Разработанные формы интерфейса пользователя приведены на рис. 5.3-7 и

    рис. 5.3-8.

    

     Рис. 5.3-7

        

        Рис. 5.3-8

  1.   Свойства объектов управления интерфейсов пользователей.

 Свойства объектов управления разработанных форм студенты устанавливают

 самостоятельно и отображают в таблице.

 

  1.    Функциональное наполнение классов схемы алгоритмов функциональных

  задач:

В соответствии с разработанной в предыдущей лабораторной работе объектной моделью для выполнения задания  2-го варианта и разработанного интерфейса пользователя, решение задачи можно разбить на следующие функциональные задачи:

  Для базового класса   Студенты:

  •  ввод исходных данных с клавиатуры и формирование массива фамилий Ffam()с помощью свойства fam и массива оценок Foc(,)c помощью свойства oc процедура без параметров vvod();
  •  нахождение средних оценок каждого студента и общего среднего балла в группе – процедура – подпрограмма sred();
  •  вывод одномерного строкового массива для фамилий студентов -  перегружаемая процедура VivodMas();
  •  вывод одномерного вещественного массива для средних оценок студентов -  перегружаемая процедура VivodMas();
  •  вывод целочисленной матрицы оценок, полученных студентами в сессию -  процедура VivodMatr().

Для производного класса Результат:

  •  формирование списка студентов, имеющих средний балл ниже общего среднего балла группы (формирования полей класса) из исходных данных, записанных в базовом классе – процедура FormirSpisok();
  •  сортировка списка студентов по убыванию среднего балла – процедура  sort().

Для первой формыкласса Form1:

  •  объявление глобальной переменной  G  типа базового класса Студенты с последующим созданием объекта этого класса в событийной процедуре Button1_Click(…) для кнопки ввода исходных данных с клавиатуры после ввода количества студентов  kolSt  и количества экзаменов  ke вызовом соответствующего конструктора  G  = New Студенты(kolSt, ke).

Для второй формы – класса  Form2:

  •  в событийной процедуре Button1_Click(…)  соответствующим конструктором  создается объект  v  производного класса  Результат  с использованием полей  Fn  и  Fm  базового класса Студенты через их свойства  n  и  m:  v  =  New  Результат(Form1.G.n, Form1.G.m).Затем вызываются методы производного класса для заполнения его полей - процедура FormirSpisok() и сортировки их по убыванию среднего балла - процедура  sort().

Схемы алгоритмов отдельных функциональных задач (методов классов) студенты должны разработать самостоятельно. Подробная иерархическая схема пользовательских классов приведена в предыдущей лабораторной работе на рис. 5.2-7 и в этой лабораторной работе на рис. 5.3-10.

  1.   Программный код проекта представлен на рис. 5.3-9.

Option Strict On

Option Explicit On

Public Class Студенты

' ПОЛЯ

   Private Fn As Integer ' Количество студентов

   Private Fm As Integer ' Количество экзаменов

   Private Foc(,) As Integer    ' Оценки, полученные в сессию

   Private Ffam() As String     ' Фамилии студентов

   Private Fsr As Double    ' Общий средний балл  группы за сессию

   Private Fso() As Double   ' Средние баллы каждого студента

' КОНСТРУКТОРЫ

  ' конструктор класса при вводе с клавиатуры

   Public Sub New(ByVal KolCt As Integer, ByVal ke As Integer)

       n = KolCt

       m = ke

       ReDim Foc(n - 1, m - 1), Ffam(n - 1), Fso(n - 1)

   End Sub

'пустой конструктор класса по умолчанию

   Public Sub New()

   End Sub

  ' СВОЙСТВА

     Public Property n() As Integer

       Get

           Return Fn

       End Get

       Set(ByVal value As Integer)

           If value > 0 Then

               Fn = value

           Else

               MsgBox("Ошибка при вводе кол-ва студентов")

               Fn = 20

           End If

       End Set

   End Property

   Public Property m() As Integer

       Get

           Return Fm

       End Get

       Set(ByVal value As Integer)

           If value > 0 Then

               Fm = value

           Else

               MsgBox("Ошибка при вводе кол-ва экзаменов")

               Fm = 4

           End If

       End Set

   End Property

   Public Property fam() As String()

       Get

           Return Ffam

       End Get

       Set(ByVal value() As String)

           Ffam = value

       End Set

   End Property

   Public Property oc() As Integer(,)

       Get

           Return Foc

       End Get

       Set(ByVal value(,) As Integer)

           Dim i, j As Integer

           For i = 0 To Fn - 1

               For j = 0 To Fm - 1

                   If value(i, j) > 0 And value(i, j) <= 5 Then

                       Foc(i, j) = value(i, j)

                   Else

                       MsgBox("Ошибка при вводе оценки!")

                       Foc(i, j) = 0

                   End If

               Next

           Next

       End Set

   End Property

   Public ReadOnly Property sr() As Double

       Get

           Return Fsr

       End Get

   End Property

   Public ReadOnly Property so() As Double()

       Get

           Return Fso

       End Get

   End Property

' МЕТОДЫ

   ' Определение  общего среднего балла группы  

   ' за сессию и средних баллов каждого студента

   Public Sub sred()

       Dim i, j As Integer

       Dim s As Double

       Fsr = 0

       For i = 0 To Fn - 1

           s = 0

           For j = 0 To Fm - 1

               Fsr = Fsr + oc(i, j)

               s = s + oc(i, j)

           Next j

           Fso(i) = s / Fm

       Next i

       Fsr = Fsr / (Fm * Fn)

   End Sub

   'Процедура ввода данных с клавиатуры

   Public Overloads Sub vvod()

       Dim i, j As Integer

       ' промежуточный массив  оценок для контроля

       'вводимых данных через свойство

       Dim a(n - 1, m - 1) As Integer

       For i = 0 To n - 1

           fam(i) = InputBox("Фамилия")

           For j = 0 To m - 1

               a(i, j) = CInt(InputBox("Оценка"))

           Next j

       Next i

       'присвоение введенного промежуточного массива

       ' полю класса Foc через его свойство

       oc = a

   End Sub

   'Перегружаемые процедуры вывода данных

   Public Overloads Sub VivodMas(ByVal a() As String, _

                                    ByRef z As String)

       Dim i As Integer

       z = ""

       For i = 0 To UBound(a)

           z = z + a(i) + vbNewLine

       Next

   End Sub

   

   Public Overloads Sub VivodMas(ByVal a() As Double, _

                                 ByRef z As String)

       Dim i As Integer

       z = ""

       For i = 0 To UBound(a)

           z = z + Format(a(i), "0.0000") + vbNewLine

       Next

   End Sub

   'Процедура  вывода двумерного массива

   '(собираем матрицу в одну строку)

   Sub vivodMatr(ByRef x(,) As Integer, ByVal n As Integer, _

                       ByVal m As Integer, ByRef z As String)

       Dim i, j As Integer

       z = ""

       For i = 0 To n - 1

           For j = 0 To m - 1

               z = z + CStr(x(i, j)) & Space(3)

           Next j

           z = z + vbNewLine

       Next i

   End Sub

End Class

'======================================================================

'Результирующий класс

Option Strict On

Public Class Результат

   Inherits Студенты 'наследует класс Студенты

   'ПОЛЯ

   Private Fk As Integer 'кол-во студ, к-рым надо повысить успеваемость

   Private Ff() As String 'массив их фамилий

   Private Fsb() As Double 'массив их средних баллов

  'КОНСТРУКТОРЫ

      'конструктор с параметрами

   Public Sub New(ByVal n As Integer, ByVal m As Integer)

       MyBase.New(n, m)

       ReDim Ff(n - 1), Fsb(n - 1)

   End Sub

   'пустой конструктор по умолчанию

   Public Sub New()

   End Sub

 'СВОЙСТВА (все –только для чтения, т.к. поля класса получают свои

     'значения с помощью собственного метода FormirSpisok, и не могут

    'изменяться извне класса)

   Public ReadOnly Property k() As Integer

       Get

           Return Fk

       End Get

   End Property

   Public ReadOnly Property f() As String()

       Get

           Return Ff

       End Get

   End Property

   Public ReadOnly Property sb() As Double()

       Get

           Return Fsb

       End Get

   End Property

'МЕТОДЫ

   ' Формирование списка студентов,

   ' имеющих средний балл ниже общего среднего

   Public Sub FormirSpisok(ByRef gr As Студенты)

       Dim i As Integer

       Fk = 0

       For i = 0 To gr.n - 1

           If gr.so(i) < gr.sr Then

               Ff(Fk) = gr.fam(i)

               Fsb(Fk) = gr.so(i)

               Fk = Fk + 1

           End If

       Next

       ReDim Preserve Ff(Fk - 1), Fsb(Fk - 1)

   End Sub

   'сортировка полей класса по убыванию среднего балла студента

   'здесь используется значение поля кол-ва "нерадивых"

   'студентов Fk через его свойство k

   'но т.к. нумерация элементов в массиве начинается от 0,

   'а кол-во студентов считается от единицы,

   'то 1-й цикл выполнается от 0 до k - 2, а 2-й цикл идет до k - 1

   Sub sort()

       Dim i, j As Integer, temp As String, t As Double

       For i = 0 To 

           For j = i + 1 To k - 1

               If sb(i) < sb(j) Then

                   t = sb(i) : sb(i) = sb(j) : sb(j) = t

                   temp = f(i) : f(i) = f(j) : f(j) = temp

               End If

           Next

       Next

   End Sub

End Class

'=======================================================================

'на первой форме вводятся и выводятся исходные данные о студентах

Option Strict On

Public Class Form1

   'объявление переменной(не экземпляра!) базового класса

   Public G As Студенты

  'Процедура для перехода на вторую форму

   Private Sub Button3_Click(ByVal sender As System.Object, _

                ByVal e As System.EventArgs) Handles Button3.Click

       Form2.Show()

   End Sub

   'Процедура для окончания работы программы

   Private Sub Button2_Click(ByVal sender As System.Object, _

                  ByVal e As System.EventArgs) Handles Button2.Click

       End

   End Sub

   'кнопка для ввода с клавиатуры

   Private Sub Button1_Click(ByVal sender As System.Object, _

                             ByVal e As System.EventArgs) _

                             Handles Button1.Click

       Dim kolSt, ke As Integer

       Dim s As String = ""

       kolSt = CInt(InputBox("Введите количество студентов"))

       ke = CInt(InputBox("Введите количество экзаменов"))

       'создание экземпляра класса через 1-й конструктор

       G = New Студенты(kolSt, ke)

       'вызов метода ввода группы с клавиатуры

       G.vvod()

       'вызов метода вычисления среднего балла каждого студента

       'и общего среднего балла группы

       G.sred()

       G.VivodMas(G.fam, s)

       TextBox1.Text = s

       G.vivodMatr(G.oc, G.n, G.m, s)

       TextBox2.Text = s

       G.VivodMas(G.so, s)

       TextBox3.Text = s

       TextBox4.Text = CStr(G.sr)

  'Кнопку3 делаем доступной после ввода данных и расчета средних баллов

       Button3.Enabled = True

   End Sub  

End Class

'=======================================================================

'вторая форма для результатов

Option Strict On

Public Class Form2

   Private Sub Button1_Click(ByVal sender As System.Object, _

                   ByVal e As System.EventArgs) Handles Button1.Click

       Dim z As String = "" 'строка для вывода массивов

       Dim v As Результат

       'создание экземпляра класса-наследника через конструктор

       v = New Результат(Form1.G.n, Form1.G.m)

       'вызов метода формирования списка класса-наследника

       v.FormirSpisok(Form1.G)

       'вызов метода сортировки списка класса-наследника

       v.sort()

       v.VivodMas(v.f, z)

       TextBox1.Text = z

       v.VivodMas(v.sb, z)

       TextBox2.Text = z

       'для вывода на экран общего среднего балла группы Fsr

       ' через его свойство sr используем объект G базового класса

       ' т.к. класс-наследник хоть и "видит" это свойство, но при

       ' создании своего экземпляра v его поля по умолчанию пустые

       TextBox3.Text = Format(Form1.G.sr, "0.0000")

   End Sub

   Private Sub Button3_Click(ByVal sender As System.Object, _

             ByVal e As System.EventArgs) Handles Button3.Click

       End

   End Sub

   ' Кнопка для повторения

   Private Sub Button4_Click(ByVal sender As System.Object, _

               ByVal e As System.EventArgs) Handles Button4.Click

       Me.Close()

       Form1.TextBox1.Text = ""

       Form1.TextBox2.Text = ""

       Form1.TextBox3.Text = ""

       Form1.TextBox4.Text = ""

       Form1.Button1.Enabled = True

       Form1.Button2.Enabled = True

       Form1.Button3.Enabled = False

       Form1.Show()

   End Sub

End Class

         Рис. 5.3-9

  1.   Схема (иерархия) классов;

          

          Рис. 5.3-10  

  1.  Выполнение приложения и получение  результатов:

Результаты работы проекта (вариант 2) представлены на рис. 5.3-11 и рис. 5.3-12.

 Рис. 5.3-11

 

   

   Рис. 5.3-12

5. Доказательство правильности работы программы

В результате работы проекта с клавиатуры введены исходные данные (массив фамилий студентов и матрица полученных в сессию  оценок),которые использованы для подсчета средней оценки каждого студента и среднего балла всей группы и выведены на 1 форму. На второй форме представлен сформированный и отсортированный по убыванию среднего балла список фамилий тех студентов, которым надо повысить успеваемость до фактического среднего уровня (у которых средняя оценка ниже общего среднего балла всей группы)


5.3.5. Контрольные вопросы по теме
«Введение в объектно-ориентированное программирование»

  1.  Что означает объектно-ориентированный подход в программировании?
  2.  Что является классом в ООП?
  3.  Что является объектом в ООП?
  4.  Какие основополагающие свойства ООП известны?
  5.  Что лежит в основе ООП?
  6.  Что такое инкапсуляция?
  7.  Что такое наследование?
  8.  Что такое полиморфизм?
  9.  Из каких элементов состоит класс?
  10.  Какие модификаторы доступа известны?
  11.  Что такое модификаторы, устанавливающие принадлежность к классу или  к экземпляру класса?
  12.  Как описывается класс?
  13.  Что может быть членом класса?
  14.  Какие правила обращения к переменным и процедурам?
  15.  Какие области видимости известны?
  16.  Каким образом можно изменять состояние объекта,
  17.  Какие средства описания свойств класса известны?
  18.  Что такое конструкторы и для чего они используются?
  19.  Какие члены класса называются разделяемыми (статическими)?
  20.  Какие члены класса называются экземплярными?
  21.  В чем сходство и различие стандартных модулей, форм и классов?
  22.  Что такое поле класса?
  23.  Что такое свойство класса?
  24.  Что такое конструктор класса?
  25.  Для чего нужен конструктор класса?

Р по теме «Тема 5.3. Средства ООП в VB»                                                                                             Страница 69


 

А также другие работы, которые могут Вас заинтересовать

67225. Роздрібний товарооборот. Аналіз та планування роздрібного товарообороту 21.03 KB
  Аналіз та планування роздрібного товарообороту Аналіз обсягу та структури Методи планування роздрібного товарообороту. Аналіз обсягу та структури Плановий обсяг та структура товарообороту підприємства є вихідними для планування та прогнозування всіх інших показників господарської...
67227. КУЛЬТУРА СРЕДНИХ ВЕКОВ 46.5 KB
  Основной очаг народной культуры – деревня. Любой слой культуры в чистом виде не существует. Фольклор даже в пределах одной национальной культуры представлен широким многообразием форм. Это объясняется: зависимостью народной культуры от особенностей природной среды и стойких местных традиций...
67228. Туберкулез. Заболеваемость и смертность. Этиология и патогенез 184.5 KB
  Цель лекции: Познакомить студентов с этиологией патогенезом классическими формами туберкулеза и их морфологической характеристикой. Развернутый план лекции: Основные вопросы темы: Туберкулез. Клинико-морфологические формы туберкулеза.
67229. Задачи и особенности объектно-ориентированного проектирования программных средств 177.5 KB
  Объектно-ориентированное проектирование ООП предназначено организовывать программные системы с большими базами данных на основе описаний объектов реального мира важных для пользователей. Объектно-ориентированное проектирование представляет собой стратегию в рамках которой...
67230. ПРАВОВЫЕ СИСТЕМЫ И ПРАВОВЫЕ СЕМЬИ 123 KB
  Для обозначения связи этих факторов развития общества с правовым регулированием в его исторической перспективе необходим раздел правоведения занимающийся изучением не только и не столько внутренней структуры системы права сколько выяснением закономерного места последнего в общем контексте...
67231. ВЫВИХИ 84.5 KB
  Знать: механизм диагностику принципы лечения вывихов Уметь: оказать помощь при вывихах на догоспитальном этапе Иметь представление о способах вправления вывихов и последующей реабилитации больных Учебная комната перевязочная операционный блок. Определение и классификация вывихов...
67232. Розвиток культури України в умовах державної незалежності 211.5 KB
  Значно ускладнилася в ці роки ситуація на міжнародній арені, особливо після знищення радянським винищувачем південнокорейського пасажирського літака "Боїнг-747". Негативні явища в економіці СРСР і в його зовнішній політиці протягом 20 років (1965-1985 pp.) політичного консерватизму...
67233. Организация деятельности маркетинговых служб 177 KB
  Организация деятельности маркетинговых служб Процесс управления маркетингом состоит из: анализа рыночных возможностей; отбора целевых рынков; разработки комплекса маркетинга; претворения в жизнь маркетинговых мероприятий. Сегмент рынка состоит из потребителей одинаково реагирующих...