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


 

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

29197. Классификация следов транспортных средств 55.5 KB
  Следы может оставлять любая часть транспортного средства: как ходовая часть колёса так и выступающие части автомобиля. Следы транспортных средств в широком смысле этого слова – это 1 отделившиеся части транспортного средства деталь целиком либо её осколки обломки 2 пролившиеся жидкости тормозная жидкость масло топливо 3 части перевозимых грузов. Некоторые криминалисты к следам транспортных средств относят также следы водителя оставленные вблизи транспортного средства.
29198. Освидетельствование 27 KB
  Для обнаружения на теле человека особых примет следов преступления телесных повреждений выявления состояния опьянения или иных свойств и признаков имеющих значение для уголовного дела если для этого не требуется производство судебной экспертизы может быть произведено освидетельствование подозреваемого обвиняемого потерпевшего а также свидетеля с его согласия за исключением случаев когда освидетельствование необходимо для оценки достоверности его показаний. В случаях не терпящих отлагательства освидетельствование может быть...
29199. Очная ставка 32 KB
  Приступая к допросу на очной ставке следователь спрашивает ее участников знают ли они друг друга и каковы их взаимоотношения это играет существенную роль для оценки показаний полученных на очной ставке. Участники очной ставки с разрешения следователя могут задавать вопросы друг другу. Тактика очной ставки зависит от характера расследуемого дела процессуального положения и нравственнопсихологических свойств допрашиваемых их взаимоотношений и других факторов. Они могут быть результатом добросовестного заблуждения либо заведомой лжи...
29200. РАБОЧИЙ ЭТАП (исследовательский) осмотра места происшествия 29 KB
  ОБЩИЙ осмотр начинается с осмотра места происшествия в целях: ориентировки; решения вопроса об исходной точке и способе осмотра; выбора позиции для производства ориентирующей и обзорной фотосъемки и осуществления ее до внесения изменений в обстановку места происшествия. При ФРОНТАЛЬНОМ способе осмотр ведется в виде линейного осмотра площадей от одной их границы до другой. Осмотр открытой местности целесообразно вести от центра к периферии эксцентрическим методом так как иногда затруднительно в начале осмотра определить границы места...
29201. Допрос несовершеннолетних свидетелей и потерпевших 41 KB
  Специфика допроса несовершеннолетних обусловливается: меньшим чем у взрослых объемом знаний и жизненного опыта; слабой способностью к сосредоточенному вниманию; повышенной внушаемостью; меньшим развитием аналитических навыков при восприятии и оценке воспринятого; тенденцией к смешению реально воспринятого и воображаемого; эмоциональностью суждений и действий. При подготовке к допросу несовершеннолетнего следователь должен выполнить комплекс мероприятий направленных на обеспечение оптимальных условий производства допроса: 1 Решить...
29202. Осмотр — следственное действие 34.5 KB
  Осмотр играет большое значение при расследовании так как именно во время осмотра обнаруживается фиксируется изучается значительная часть следов преступления. Результаты осмотра дают возможность выдвигать следственные версии определять направление расследования. Успех расследования напрямую зависит от качества осмотра. Виды осмотра: осмотр места происшествия местности жилища иного помещения предметов документов ст.
29203. Процессуальный порядок, основные тактические приемы предъявления для опознания 26 KB
  Следователь может предъявить для опознания лицо или предмет свидетелю потерпевшему подозреваемому или обвиняемому. Для опознания может быть предъявлен и труп. Опознающие предварительно допрашиваются об обстоятельствах при которых они видели предъявленные для опознания лицо или предмет а также о приметах и особенностях по которым они могут его опознать.
29204. Обыск — следственное действие 26.5 KB
  Поскольку обыск связан с принудительным вторжением в жилище гражданина и неизбежным вмешательством в его личные интересы для этого требуется санкция прокурора. Лишь в случаях не терпящих отлагательств обыск может быть произведен без такой санкции но следователь обязан в течение суток уведомить прокурора о произведенном обыске. В ходе обыска могут и должны решаться следующие задачи: отыскание и изъятие орудий преступления предметов и ценностей добытых преступным путем а также других предметов и документов которые могут иметь значение...
29205. Тактика следственного эксперимента 30.5 KB
  СЭ могут быть нескольких видов: эксперимент по установлению возможности восприятия какого либо факта или явления по установлению возможности совершения какого либо действия эксперимент по установлению возможности существования какого – либо явления эксперимент по установлению отдельных элементов механизма события. эксперимент по установлению механизма образования отдельных следов события общий порядок производства СЭ предусмотрен ст.