13130

Стандартные модули и модульная структура приложений в VB

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

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

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

Русский

2013-05-08

343.32 KB

35 чел.

Тема 5.1. Лабораторная работа

«Стандартные модули и модульная структура приложений в VB»

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

5.1.1. Задание

  1.  Выбрать вариант задания из таблицы 5.1-1 в соответствии с указанием преподавателя, а также  по указанию преподавателя студент выбирает варианты реализации проекта: со стандартным модулем и двумя формами и вводом с клавиатуры; со стандартным модулем и двумя формами и вводом из файла.

  1.  Провести формализацию задачи, для чего необходимо:
  2.  определить перечень исходных данных и предусмотреть для них проверку правильности ввода;
  3.  представить смысловые данные, которые будут использоваться в ходе решения задачи в виде переменных  и массивов, присвоив им соответствующие имена;  
  4.  определить размерности и типы используемых данных;
  5.  представить выходные данные в виде массивов;
  6.  привести геометрическую иллюстрацию решения задачи;
  7.  при необходимости привести расчетные формулы, которые будут использоваться для преобразования исходных данных в результаты.

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

  1.  Составить общую (укрупненную) схему  алгоритма решения задачи.

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

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

  1.  Подготовить тестовые наборы исходных данных, соответствующие смысловой направленности решаемой задачи как для ввода с клавиатуры, так и из текстового файла. Формат текстового файла должен быть задан преподавателем, см. примеры выполнения задания п.5.1.4, а сам текстовый файл с расширением *.txt должен быть подготовлен студентом  средствами MS Windows, например, в Блокноте (Notepad).

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

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


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

          Таблица 5.1-1

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)

26)

27)

28)

29)

30)

31)

32)

33)

34)

35)

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

В ГИБДД  имеется  информация  о  n  владельцах автомобилей.  О  каждом  автовладельце известно:  фамилия,  номер его машины,   год ее выпуска,  цвет, год  прохождения технического  осмотра.  Необходимо составить  алгоритм и программу, для каждой марки  определяют фамилию владельца самой старой машины и количество автомобилей, не  проходивших техосмотр  последние два года.

Каждое из n предприятий города (n - заданное число) выпускает 5 одинаковых наименований продукции (наименования предприятий и наименования продукции заданы). Для каждого из предприятий известны объем выпуска и стоимость единицы продукции каждого вида.  Необходимо для каждого предприятия города  определить процентную долю стоимости  производимой  им продукции  каждого вида.

Имеются сведения об n студентах (n - заданное число): фамилия, номер группы и 4 экзаменационные отметки. Составить алгоритм и программу, которые для каждой группы определяют количество двоечников и количество студентов, сдавших сессию на “4” и “5” и составляют список студентов группы с максимальным числом двоечников.    

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

Имеется список n команд, принимающих участие в чемпионате мира по футболу. Перед турниром проведен опрос k человек, каждый из которых назвал по 3 команды, которые с его точки зрения, займут 1-е, 2-е и 3-е место. Составить алгоритм и программу, которые по результату турнира определяют приз каждого из тех опрошенных, которые точно угадали последовательность победителей, и составляют их список, если общий призовой фонд - S.

Ремонтное предприятие выполняет 6 видов работ. Для каждого вида известно название и стоимость. К предприятию обратились n заказчиков с предложениями выполнить определенное количество работ каждого вида. Составить алгоритм и программу, которые для каждого заказчика определяют сумму договора с ремонтным предприятием, а также организуют формирование списка заказчиков в порядке убывания сумм договоров.

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

Даны итоги выборов в Думу города: по k округам известно число голосовавших за представителей m партий. Считая, что от каждого округа в Думу проходит по одному представителю, и, предполагая,  что все кандидаты набрали разное число голосов, составить алгоритм и программу, которые для каждой партии определяют число прошедших в Думу своих представителей, и название округа, в котором партия-победитель  набрала наибольшее число голосов

В автохозяйстве имеются n автомашин (n -  заданное число). Для каждого  автомобиля заданы три характеристики: номер автомашины, марка автомашины, тип неисправности (или ее отсутствие). Составить алгоритм и программу, которые составляют сводные заявки на ремонт (по типу неисправностей) с указанием нуждающихся в этом типе ремонта количества автомашин и составляют общий список машин (с указанием марки и номера) для самого «популярного» ремонта.

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

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

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

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

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

Произвели опрос n студентов литературного института (n - заданное число),  каждый из которых назвал две фамилии своих любимых писателей. Составить алгоритм и программу, которые  определяют, сколько и какие писатели были названы, и сколько раз был назван каждый из них. Сформировать 2 списка писателей: по алфавиту и по убыванию количества упоминаний студентами.

Произведен опрос 1000 жителей Москвы. Каждый из них назвал фамилию самого любимого телеведущего. Составить алгоритм и программу  формирования двух списков фамилий первых десяти наиболее популярных ведущих, расположив фамилии в первом  списке в порядке уменьшения количества поданных за них голосов, а во втором – по алфавиту. Учесть, что общее число фамилий может быть меньше 10-ти.

Имеются сведения об урожаях зерна в  n регионах России за m лет. Составить алгоритм и программу, которые  определяют самый урожайный и самый неурожайный год и для каждого из найденных лет печатают список регионов в порядке убывания полученного в них урожая.

Известны названия m предприятий города, производящие поn наименований различных изделий, для которых известны  количества их выпуска в год. Составить алгоритм и программу, которые  по наименованию изделия определяют название предприятия, производящего максимальное количество этого изделия, а также  печатают список предприятий, на которых это изделие производится, располагая названия этих предприятий в порядке убывания объема  выпуска данного изделия.

Список n рабочих цеха (n – заданное число) содержит следующие сведения о каждом: фамилия, числовой номер бригады, зарплата. Список не имеет определенной упорядоченности. Составить алгоритм и программу, которые для каждой бригады  определяют  фамилии  самого низко- и самого высокооплачиваемого рабочего, а также находят значение средней зарплаты по этой бригаде и количество тех рабочих, чья зарплата больше средней зарплаты.

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

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

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

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

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

Известны наименования и количество 10-ти видов товаров, на каждой из 15-ти баз города, а также потребность города в товаре этого вида. Составить алгоритм и программу, которые  для каждого товара определяют номер базы с его максимальным запасом и  формируют список товаров, которые необходимо пополнить, чтобы удовлетворить потребности города.

В театральную кассу поступило n  заявок от школ города. Каждая заявка содержит название спектакля и необходимое количество билетов. Составить алгоритм и программу, которые  на основании этих данных определяют популярность каждого спектакля и печатают их названия в порядке убывания количества заказанных на них билетов.

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

Каждая из m библиотек района (m - задано) составила заявку на приобретение книг. Заявка содержит перечень книг, состоящий из 10-ти наименований. Каждая библиотека в каждой строке заявки указывает название книги, фамилию автора, а также количество экземпляров, причем названия книг для разных библиотек могут повторяться. Составить алгоритм и программу, позволяющие определить суммарный запрос на каждую заказанную книгу, и напечатать общий список книг в порядке убывания спроса.

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

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

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

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

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

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

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

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

функциональных задач;

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

   и  стандартных модулей.

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

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

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

  1.  Тема  лабораторной работы:

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

  1.  Задание на разработку проекта  и вариант задания:

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

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

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

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

3. Формализация задания:

Для решения всех вариантов задач необходимо:

  1.  определить входные данные:

n – количество студентов в одной группе  (As Integer);

m – количество экзаменов в одной группе  (As Integer);

fam(n-1) – одномерный массив фамилий студентов одной группы (As String);

oc(n-1,m) – двумерный массив оценок студентов одной группы  (As Integer);

  1.  определить выходные  данные:

средние баллы за сессию каждого из n студентов одной группы – одномерный массив so(n-1)(As Double);

общий средний балл группы  sr (As Double);

фамилии и средние баллы студентов, для которых  средняя оценка so(i)меньше средней по группе sr - одномерный массив f(k-1)(As String) и одномерный массив sb(k-1)(As Double), а также число таких студентов k;

  1.  вычислить:

sr - средний балл за сессию студентов одной группы; для получения среднего балла следует  накопить сумму баллов, полученных n  студентами за  m экзаменов, а затем разделить эту сумму на количество оценок m*n (As Double);

so(n-1) - средний балл за сессию каждого из n студентов одной группы; для получения каждого  i-го элемента следует  накопить сумму баллов, полученных i-м студентом за m экзаменов, а затем разделить эту сумму на m
(As Double);

  1.  отсортировать:

баллы (массив sb(k-1)) и соответственно фамилии студентов (массив f(k-1)) в порядке убывания.

Геометрическая иллюстрация решения задачи  приведена на рис. 5.1-1.

Входные данные:

           Вводимые           Рассчитываемые

Массив фамилий

fam( )

 0

Шакин

Сосновиков

Кравченко

Загвоздкина

Минязов

n-1

Массив оценок

oc( , )

   0                           m-1

2

3

3

4

2

3

3

3

3

3

4

4

4

4

4

4

5

4

5

4

5

5

5

5

5

n-1

Средние оценки каждого студента so( )

        0

n-1

Общий средний балл всей группы

 sr


Выходные данные
:

Массив фамилий студентов с низким средним баллом

f ( )

 0

k-1

Средние баллы, которые ниже общего среднего

sb( )

             0

k-1

Рис. 5.1-1 

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

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

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

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

Формы интерфейса пользователя приведены на рис. 5.1-2 и  рис. 5.1-3.

 

 Рис. 5.1-2

    Рис. 5.1-3

  1.  Установка свойств объекта

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

  1.  Разработка схем алгоритмов

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

  1.  ввод количества студентов в группе – n;
  2.  ввод количества экзаменов в группе – m;
  3.  ввод  исходных данных с клавиатуры – vvod(n,m, fam, oc);
  4.  отображение массивов данных (вещественного и строкового) и матрицы с оценками в текстовом поле на форме – процедуры vivodMas(),vivodMasStr() и vivodMatr();
  5.  нахождение sr - общего среднего балла за сессию студентов одной группы и so(i)-среднего балла каждого студента – sred(n,m,oc,so, sr);
  6.  решение задачи: подсчет количества k и формирование списка фамилий студентов f(), для которых средняя оценка меньше  общей средней в группе, а также формирование массива sb()из их средних оценок  –   FormirSpisok(n,sr, so,fam, f, sb, k);
  7.  сортировка массива sb() в порядке убывания  с одновременной перестановкой фамилий студентов – sort(f ,sb);

Исходные данные n- количество студентов,m - количество экзаменов,
fam()-массив фамилий студентов,oc(,) – массив их оценок, и вычисленные из них значение общего среднего балла группы sr и массива средних оценок каждого студента so()должны быть доступны обеим формам проекта, поэтому эти данные объявляются как Public в стандартном модуле Module1. Там же в стандартном модуле Module1 описываются процедуры, которые могут вызываться из обеих форм проекта, а именно: процедуры вывода массивов и матрицы. Результирующие списки студентов, которым надо повысить успеваемость (т.е. количество таких студентов k, массивы их фамилий f()и средних баллов sb()) нужны только для второй формы, поэтому объявляются на ней в соответствующей событийной процедуре.

Так как решить задачу можно только после ввода исходных данных, на первой форме кнопку для перехода на вторую форму Button3 («Показать решение») сначала делаем недоступной (свойство Enable = False). После ввода данных и расчета средних оценок, в конце событийной процедуры кнопки Button1, изменяем для кнопки Button3 свойство Enable на True. Для отображения на форме исходных данных в процедурах vivodMas(),vivodMasStr()и vivodMatr()формируется строка z, содержащая элементы соответствующих массивов. Эта строка должна возвращаться из процедур и ее значение выводится в нужные текстовые поля. Аналогичным образом происходит и отображение  результатов на 2-ой форме.

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

  1.  
    Программный код:

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

Option Strict On

Option Explicit On

Module Module1

   Public n As Integer ' Количество студентов

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

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

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

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

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

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

   ' и массива средних баллов каждого студента so(i)

   Public Sub sred(ByVal n As Integer, ByVal m As Integer, _

               ByRef oc(,) As Integer, ByRef so() As Double, _

               ByRef As Double)

       Dim i, j As Integer

       Dim s As Double

       sr = 0

       For i = 0 To n - 1

           s = 0

           For j = 0 To m - 1

               s = s + oc(i, j)

           Next j

           so(i) = s / m

           sr = sr + s

       Next i

       sr = sr / (m * n)

   End Sub

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

   Public Sub VivodMasStr(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 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 Module

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

Option Strict On

Public Class Form1

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

   Public Sub vvod(ByVal n As Integer, ByVal m As Integer, _

                   ByRef fam() As String, ByRef oc(,) As Integer)

       Dim i, j As Integer

       For i = 0 To n - 1

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

           For j = 0 To m - 1

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

           Next j

       Next i

   End Sub

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

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

                             ByVal e As System.EventArgs) _

                             Handles Button1.Click

       Dim s As String = ""

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

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

       ReDim fam(n - 1), oc(n - 1, m - 1)

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

       vvod(n, m, fam, oc)

       ReDim so(n - 1)

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

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

       sred(n, m, oc, so, sr)

       VivodMasStr(fam, s)

       TextBox1.Text = s

       vivodMatr(oc, n, m, s)

       TextBox2.Text = s

       VivodMas(so, s)

       TextBox3.Text = s

       TextBox4.Text = Format(sr, "0.0000")

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

       'средних баллов 

       Button3.Enabled = True

   End Sub

'Процедура для продолжения работы программы(перехода на 2-ю форму)

   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

End Class      

Public Class Form2

   ' Формирование массива f() фамилий студентов,

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

   ' и массива sb() средних баллов этих студентов

   Public Sub FormirSpisok(ByVal n As Integer,ByVal sr As Double, _

             ByVal so() As Double,ByVal fam() As String, _

      ByRef f() As String, ByRef sb() As Double,ByRef k As Integer)

       Dim i As Integer

       k = 0

       For i = 0 To n - 1

           If so(i) < sr Then

               f(k) = fam(i)

               sb(k) = so(i)

               k = k + 1

           End If

       Next

       ReDim Preserve f(k - 1), sb(k - 1)

   End Sub

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

   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

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

               ByVal e As System.EventArgs)Handles Button1.Click

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

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

       Dim f(n - 1) As String 'массив их фамилий

       Dim sb(n - 1) As Double 'массив их средних баллов

       FormirSpisok(n, sr, so, fam, f, sb, k)

       sort(f, sb)

       VivodMasStr(f, z)

       TextBox1.Text = z

       VivodMas(sb, z)

       TextBox2.Text = z

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

   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.1-4


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

     Результаты работы проекта (вариант 1) представлены на рис. 5.1-5 и рис. 5.1.6.

    

   Рис. 5.1-5

  

  

 Рис. 5.1-6

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

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


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

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

Формат исходного файла: каждая строка файла состоит из фамилии и 5 оценок, разделенных между собой одним или несколькими пробелами, например,  

 Фамилия 5  4   5  3 4.

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

Разработанная форма интерфейса приведена на рис. 5.1-7 и  рис. 5.1-8.

                Рис. 5.1-7

               

               Рис. 5.1-8

  1.  Установка свойств объектов

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

  1.  Разработка схемы алгоритма

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

  1.  построчное чтение исходных данных из текстового файла и определение количества студентов в группе – readfile(“путь1”, n);
  2.  определение кол-ва экзаменов и создание массива фамилий студентов fam()и массива оценок oc()из читаемого файла – vvod(“путь1”, n, m,fam, oc);
  3.  отображение массивов данных (вещественного и строкового) и матрицы с оценками в текстовом поле на форме – процедуры vivodMas(), vivodMasStr() и vivodMatr();
  4.  нахождение sr - общего среднего балла за сессию студентов одной группы и so(i)- среднего балла каждого студента – sred(n, m, oc, so, sr);
  5.  решение задачи: подсчет количества k и формирование списка фамилий студентов  f(), для которых средняя оценка меньше  общей средней в группе, а также формирование массива sb() из их средних оценок  –   
    FormirSpisok(n, sr, so, fam, f, sb, k);
  6.  сортировка массива sb() в порядке убывания  с одновременной перестановкой фамилий студентов – sort(f ,sb);
  7.  построчная запись результирующих массивов f(),и sb() в текстовый файл – writefile(“путь2”,f, sb).

Исходные данные n - количество студентов, m - количество экзаменов, fam()-массив фамилий студентов, oc(,) – массив их оценок, и вычисленные из них значение общего среднего балла группы sr и массива средних оценок каждого студента so()должны быть доступны обеим формам проекта, поэтому эти данные объявляются как Public в стандартном модуле Module1. Там же в стандартном модуле Module1 описываются процедуры, которые могут вызываться из обеих форм проекта, а именно: процедуры вывода массивов и матрицы. Результирующие списки студентов, которым надо повысить успеваемость (т.е. количество таких студентов k, массивы их фамилий f()и средних баллов sb()) нужны только для второй формы, но для двух кнопок (событийных процедур), поэтому объявляются на второй форме, как глобальные для нее (перед всеми остальными процедурами).

Так как решить задачу можно только после ввода исходных данных, на первой форме кнопку для перехода на вторую форму Button3 («Показать решение») сначала делаем недоступной (свойство Enable = False). После ввода данных и расчета средних оценок, в конце событийной процедуры для кнопки Button1, изменяем для кнопки Button3 свойство Enable на True.  Для отображения на форме массивов в процедурах vivodMas(), vivodMasStr() и vivodMatr() формируется строка z, содержащая элементы соответствующих массивов. Эта строка должна возвращаться из процедур и ее значение выводится в нужные текстовые поля.

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

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

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

Option Strict On

Option Explicit On

Module Module1

   Public n As Integer ' Количество студентов

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

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

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

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

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

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

   ' и массива средних баллов каждого студента so(i)

   Public Sub sred(ByVal n As Integer, ByVal m As Integer, _

               ByRef oc(,) As Integer, ByRef so() As Double, _

               ByRef sr As Double)

       Dim i, j As Integer

       Dim s As Double

       sr = 0

       For i = 0 To n - 1

           s = 0

           For j = 0 To m - 1

               s = s + oc(i, j)

           Next j

           so(i) = s / m

           sr = sr + s

       Next i

       sr = sr / (m * n)

   End Sub

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

   Public Sub VivodMasStr(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 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 Module

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

Option Strict On

Imports System.IO

Public Class Form1

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

   'для подсчета числа студентов 

   Sub readfile(ByVal filename As String, ByRef n As Integer)

       'создание потока для чтения из текстового файла

       Dim f = New StreamReader(filename)

       Dim line As String

       n = 0   'количество строк в файле

       Try

         Do While Not (f.EndOfStream)'пока не достигнут конец потока

               line = f.ReadLine() 'чтение строки из файла в line

               n = n + 1

         Loop

         f.Close() 'закрытие потока

       Catch ex As Exception

           MsgBox("Невозможно прочитать данные из файла")

       End Try

   End Sub

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

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

   Sub vvod(ByVal filename As String,ByVal n As Integer, _

            ByRef m As Integer, ByRef fam() As String, _

            ByRef oc(,) As Integer)

       Dim i, j As Integer

       Dim line As String

       Dim buf() As String

       'создание потока для чтения из текстового файла

       Dim f As New StreamReader(filename)

       Try

           i = 0 'номер читаемой строки в файле

           'пока не достигнут конец потока

           Do While Not (f.EndOfStream)

               line = f.ReadLine() 'чтение строки из файла в line

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

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

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

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

               Loop

               If line = "" Then

                   n = n - 1

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

                   Exit Sub

               Else

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

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

                   buf = Split(line, Space(1))

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

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

        ' кол-во экзаменов m и выделяем память массив оценок oc(,)

                   If i = 0 Then

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

                       m = buf.Length - 1

                       ReDim oc(n - 1, m - 1)

                   End If               '==================================================================

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

                   fam(i) = buf(0)

                   For j = 0 To m - 1

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

                   Next

               End If

               i = i + 1

           Loop

           f.Close()

       Catch ex As Exception

           MsgBox("Невозможно прочитать данные из файла")

       End Try

       n = i

   End Sub

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

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

                             ByVal e As System.EventArgs) _

                             Handles Button1.Click

       Dim s As String = ""

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

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

       readfile("myfile.txt", n)

       ReDim fam(n - 1)

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

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

       vvod("myfile.txt", n, m, fam, oc)

       ReDim so(n - 1)

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

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

       sred(n, m, oc, so, sr)

       'вывод данных на форму

       VivodMasStr(fam, s)

       TextBox1.Text = s

       vivodMatr(oc, n, m, s)

       TextBox2.Text = s

       VivodMas(so, s)

       TextBox3.Text = s

       TextBox4.Text = Format(sr, "0.0000")

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

       'и расчета  средних баллов

       Button3.Enabled = True

   End Sub

   'кнопка для перехода на 2-ю форму

   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

End Class 

'Программный код 2 формы

Option Strict On

Imports System.IO

Public Class Form2

   'Объекты k,f(n-1)и sb(n-1)объяввляем глобальными для 2-й формы,

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

   '(для кнопок "Решить задачу" и "Записать в файл")

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

   Dim f(n - 1) As String 'массив их фамилий

   Dim sb(n - 1) As Double 'массив их средних баллов

   ' Формирование массива f() фамилий студентов,

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

   ' и массива sb() средних баллов этих студентов

   Public Sub FormirSpisok(ByVal n As Integer, ByVal sr As Double, _

                      ByVal so() As Double, ByVal fam() As String, _

                      ByRef f() As String, ByRef sb() As Double, _

                      ByRef k As Integer)

       Dim i As Integer

       k = 0

       For i = 0 To n - 1

           If so(i) < sr Then

               f(k) = fam(i)

               sb(k) = so(i)

               k = k + 1

           End If

       Next

       ReDim Preserve f(k - 1), sb(k - 1)

   End Sub

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

   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

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

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

   Sub writefile(ByVal filename As String, ByVal f() As String, _

                   ByVal sb() As Double)

       'создание нового текст. файла и потока wf для записи в файл

       Dim wf As StreamWriter = File.CreateText(filename)

       Dim s As String 'строка для записи в файл

       Dim i, k As Integer

       k = f.Length - 1

       For i = 0 To k

           s = fam(i) + " " + CStr(sb(i))

           'запись сведений об одном студенте в текстовый файл

           wf.WriteLine(s)

       Next

       wf.Flush() : wf.Close() 'очистка и закрытие потока

   End Sub

   'кнопка "Решить задачу"

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

                             ByVal e As System.EventArgs) _

                             Handles Button1.Click

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

       FormirSpisok(n, sr, so, fam, f, sb, k)

       sort(f, sb)

       VivodMasStr(f, z)

       TextBox1.Text = z

       VivodMas(sb, z)

       TextBox2.Text = z

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

   End Sub

   'кнопка "Записать в файл"

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

                             ByVal e As System.EventArgs)_

                             Handles Button2.Click

       writefile("file2.txt", f, sb)

   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.1-9.

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

Результаты работы проекта Проект-5-1-Лаб-2 (вариант 2) представлены на                             рис. 5.1-10 и рис. 5.1.11.

            Рис. 5.1-10

 

 Рис. 5.1-11

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

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


3 вариант реализации проекта:

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

Формат исходного файла: допускается разделение данных в строке несколькими пробелами, т.е. может иметь формат вида: фамилия 5    4  5  3   4.

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

Разработанная форма интерфейса приведена на рис. 5.1-12 и  рис. 5.1-13.

                 Рис. 5.1-12

Рис. 5.1-13

  1.  Установка свойств объектов

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

  1.  
    Разработка схемы алгоритма

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

  1.  ввод исходных данных из текстового файла одной строкой – vvodFile(“путь1”, s);
  2.  получение из этой строки массива подстрок mas() с помощью функции Split()и определение количества студентов  n;
  3.  определение кол-ва экзаменов и создание массива фамилий студентов fam()и массива оценок oc()из полученного массива mas() подстрок файла – vvod(mas, n, m,fam, oc);
  4.  отображение массивов данных (вещественного и строкового) и матрицы с оценками в текстовом поле на форме – процедуры vivodMas(), vivodMasStr() и vivodMatr();
  5.  нахождение sr -общего среднего балла за сессию студентов одной группы и so(i)- среднего балла каждого студента – sred(n, m, oc, so, sr);
  6.  решение задачи: подсчет количества k и формирование списка фамилий студентов f(), для которых средняя оценка меньше  общей средней в группе, а также формирование массива sb() из их средних оценок  –   FormirSpisok(n, sr, so, fam, f, sb, k);
  7.  сортировка массива sb() в порядке убывания  с одновременной перестановкой фамилий студентов – sort(f ,sb);
  8.  формирование строки S из результирующих массивов f()и sb()функция
    res(f, sb, k);
  9.  запись строки результата в текстовый файл – vivod("путь2", S)

Исходные данные n - количество студентов,m - количество экзаменов,fam()-массив фамилий студентов,oc(,) – массив их оценок, и вычисленные из них значение общего среднего балла группы sr и массива средних оценок каждого студента so()должны быть доступны обеим формам проекта, поэтому эти данные объявляются как Public в стандартном модуле Module1. Там же в стандартном модуле Module1 описываются процедуры, которые могут вызываться из обеих форм проекта, а именно: процедуры вывода массивов и матрицы. Результирующие списки студентов, которым надо повысить успеваемость (т.е. количество таких студентов k, массивы их фамилий f()и средних баллов sb()) нужны только для второй формы, но для двух кнопок (событийных процедур), поэтому объявляются на второй форме, как глобальные для нее (перед всеми остальными процедурами).

Так как решить задачу можно только после ввода исходных данных, на первой форме кнопку для перехода на вторую форму Button3 («Показать решение») сначала делаем недоступной (свойство Enable = False). После ввода данных и расчета средних оценок, в конце событийной процедуры для кнопки Button1, изменяем для кнопки Button3 свойство Enable на  True.  Для отображения на форме массивов в процедурах vivodMas(), vivodMasStr() и vivodMatr() формируется строка z, содержащая элементы соответствующих массивов. Эта строка должна возвращаться из процедур и ее значение выводится в нужные текстовые поля.

Общую схему алгоритма решения задачи и схемы алгоритмов отдельных функциональных задач студенты должны разработать самостоятельно.

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

Программный код проекта, представлен на рис. 5.1-14.

Option Strict On

Option Explicit On

Module Module1

   Public n As Integer ' Количество студентов

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

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

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

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

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

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

   ' и массива средних баллов каждого студента so(i)

   Public Sub sred(ByVal n As Integer, ByVal m As Integer, _

               ByRef oc(,) As Integer, ByRef so() As Double, _

               ByRef sr As Double)

       Dim i, j As Integer

       Dim s As Double

       sr = 0

       For i = 0 To n - 1

           s = 0

           For j = 0 To m - 1

               s = s + oc(i, j)

           Next j

           so(i) = s / m

           sr = sr + s

       Next i

       sr = sr / (m * n)

   End Sub

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

   Public Sub VivodMasStr(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 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 Module

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

Option Strict On

Public Class Form1

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

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

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

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

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

       Try

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

       Catch ex As Exception

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

       End Try

   End Sub

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

   Public Sub vvod(ByVal mas() As String, ByVal n As Integer, _

                   ByRef m As Integer, ByRef fam() As String, _

                   ByRef oc(,) 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)определяем

        ' кол-во экзаменов m и выделяем память массив оценок oc(,)

               If i = 0 Then

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

                   m = buf.Length - 1

                   ReDim oc(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

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

   'создания массивов исходных данных

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

                             ByVal e As System.EventArgs) _

                             Handles Button1.Click

       Dim s As String = ""

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

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

       vvodFile("myfile.txt", s)

       Dim mas() As String

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

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

       mas = Split(s, vbNewLine)

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

       'По полученному количеству студентов n 

       'переопределяем размер массивов

       ReDim fam(n - 1), so(n - 1)

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

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

       vvod(mas, n, m, fam, oc)

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

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

       sred(n, m, oc, so, sr)

       'Вывод полученных массивов на форму

       VivodMasStr(fam, s)

       TextBox1.Text = s

       vivodMatr(oc, n, m, s)

       TextBox2.Text = s

       VivodMas(so, s)

       TextBox3.Text = s

       TextBox4.Text = Format(sr, "0.0000")

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

       ' и расчета средних баллов

       Button3.Enabled = True

   End Sub

   'кнопка для перехода на 2-ю форму

   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

End Class

'Программный код 2 формы

Option Strict On

Public Class Form2

   'Объекты k,f(n-1)и sb(n-1)объявляем глобальными для 2-й формы,

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

   '(для кнопок "Решить задачу" и "Записать в файл")

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

   Dim f(n - 1) As String 'массив их фамилий

   Dim sb(n - 1) As Double 'массив их средних баллов

   ' Формирование массива f() фамилий студентов,

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

   ' и массива sb() средних баллов этих студентов

   Public Sub FormirSpisok(ByVal n As Integer, ByVal sr As Double, _

                      ByVal so() As Double, ByVal fam() As String, _

                       ByRef f() As String, ByRef sb() As Double, _

                           ByRef k As Integer)

       Dim i As Integer

       k = 0

       For i = 0 To n - 1

           If so(i) < sr Then

               f(k) = fam(i)

               sb(k) = so(i)

               k = k + 1

           End If

       Next

       ReDim Preserve f(k - 1), sb(k - 1)

   End Sub

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

   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

   ' Функция формирования одной строки из отсортированного массива

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

   Function res(ByVal f() As String, ByVal sb() As Double, _

                   ByVal k As Integer) As String

  'Создание объекта result типа StringBuilder(результирующей строки)  

   'для очень быстрой и эффективной обработки строковых данных

       Dim result As New System.Text.StringBuilder

       For i As Integer = 0 To k - 1

           result.Append(f(i)) 'добавление фамилии в объект result

           result.Append(Space(1)) 'добавление пробела

           result.Append(sb(i).ToString) 'добавление среднего балла

           result.Append(vbNewLine)'добавление признака конца строки

       Next i

       Return result.ToString

   End Function

   ' Процедура записи результата в текстовый файл

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

       'Запись строки-результата S в текстовый файл;значение False

       'третьего параметра задает,что файл будет перезаписан.

       Try

           My.Computer.FileSystem.WriteAllText(filename, S, False)

       Catch ex As Exception

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

       End Try

   End Sub

   'кнопка "Решить задачу"

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

                               ByVal e As System.EventArgs) _

                               Handles Button1.Click

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

       FormirSpisok(n, sr, so, fam, f, sb, k)

       sort(f, sb)

       VivodMasStr(f, z)

       TextBox1.Text = z

       VivodMas(sb, z)

       TextBox2.Text = z

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

   End Sub

   'кнопка "Записать в файл"

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

                             ByVal e As System.EventArgs) _

                             Handles Button2.Click

       Dim S As String = ""

       'Вызов функции формирования одной строки из отсортированного

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

       S = res(f, sb, k)

       'Вызов процедуры записи результата в текстовый файл

       vivodFile("file2.txt", S)

   End Sub

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

                               ByVal e As System.EventArgs) _

                               Handles Button3.Click

       End

   End Sub

   'кнопка "Повторить"

   Private Sub Button4_Click_1(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.1-14

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

Результаты работы проекта Проект-5-1-Лаб-3 (вариант 3) представлены на                             рис. 5.1-15 и рис. 5.1.16

             Рис. 5.1-15

         Рис. 5.1-16

 

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

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


5.1.5. Контрольные вопросы по теме «Стандартные модули и  модульная структура приложений в VB»

  1.  Какие архитектурные компоненты платформы .NET известны?
  2.  Какую роль (какие задачи) выполняет среда CLR?
  3.  Что представляет из FCL?
  4.  Из каких этапов состоит компиляция  .NET-приложения?
  5.  Какова структура Windows-приложения?
  6.  Что представляет стандартный модуль?
  7.  Каковы сходства и различия стандартного модуля, модуля формы и модуля класса?
  8.  Что необходимо для создания проекта с несколькими формами и организации взаимодействия между ними?