Алгоритм решения «Задачи о зачислении»

Алгоритм решения «задачи о зачислении»

С.Е. Григорчук

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

Например, в 2013 году абитуриент мог подавать результаты ЕГЭ в Ростовский государственный строительный университет (РГСУ) на любые 3 направления подготовки (специальности) из 23 имеющихся, причем в предыдущие годы таких специальностей могло быть 5 или 9 из 48 доступных специальностей. Направления подготовки (специальности) делятся на группы вступительных испытаний по общеобразовательным предметам. Например, одним специальностям соответствует группа испытаний Русский язык, Математика, Физика (РМФ), другим - Русский язык, Математика, Обществознание (РМО), третьим - Русский язык, Математика, Информатика (РМИ), четвертым - Русский язык, Литература, Обществознание (РЛО), пятым - Русский язык, Математика, Профессиональный экзамен (РМП). Кроме того, надо учитывать право на прием без вступительных испытаний (победители или призеры олимпиад), на прием вне конкурса при условии успешного прохождения вступительных испытаний, свой конкурс на места целевого приема на специальность, причем не прошедшие целевой прием могут поступать на другие специальности.

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

Исходными данными программы является база данных (таблица Microsoft Excel) с полями фамилия, имя, отчество, баллами ЕГЭ по общеобразовательным предметам и профессиональному экзамену, полями признаков вне конкурса, целевой прием, оригиналы документов, а также полями приоритетов специальностей поступления, в которых указано сокращенное название специальности данного приоритета. Количество приоритетов специальностей как говорилось выше, может быть 3 или выше в зависимости от правил поступления. Приоритеты специальностей заполняются последовательно, начиная со специальности 1 приоритета и возможно до специальности с последним приоритетом. Кроме того, исходными данными программы являются контрольные цифры приема на направления подготовки (специальности), включая количество мест целевого приема, и минимальные проходные баллы по общеобразовательным предметам и профессиональному экзамену.

До запуска основного алгоритма программы в базе данных должны быть образованы поля суммарного балла для всех групп вступительных испытаний (например, РМФ, РМИ, РМО, РЛО, РМП). Для каждого абитуриента подсчитываются только суммарные баллы групп вступительных испытаний согласно специальностей приоритетов, причем такая сумма подсчитывается, если балл каждого вступительного испытания группы не меньше минимального проходного балла по этому испытанию.

Для формирования отчета о зачислении алгоритм программы должен заносить результаты обработки в поля базы: приоритет в таблице зачисления на специальность, №таблицы зачисления на специальность, №строки в

таблице зачисления, №таблицы зачисления и строки для кандидата на зачисление по приоритету в таблице зачисления по количеству возможных приоритетов.

В начале алгоритма применяется для отчета о зачислении цикл заполнения мест по специальностям вне конкурса и целевого набора. Затем идет цикл формирования рабочих листов для каждой специальности с полями «Фамилия», «Имя», «Отчество», «балл профильного предмета специальности», «Оригинал документов», «суммарный балл группы вступительных испытаний», поля приоритетов специальностей, включая приоритет данной специальности. Эти поля выбираются из базы с помощью автофильтров только для записей, имеющих в одном из полей приоритетов специальностей данную специальность, не пустой суммарный балл группы вступительных испытаний специальности, исключая зачисленных вне конкурса и по целевому набору. Результаты отбора помещаются на лист специальности и сортируются по суммарному баллу группы вступительных испытаний специальности по убыванию, затем по баллу профильного предмета специальности по убыванию и по фамилии по возрастанию. Также добавляются новые поля результатов работы алгоритма: «приоритет зачисления на специальность», «№строки в таблице зачисления на специальность», «приоритет кандидата зачисления на специальность». Следующий шаг алгоритма цикл зачисления на каждую специальность с 1 приоритетом, исключая последнее место.

Далее идет цикл зачисления на оставшиеся места специальностей. Перебор специальностей осуществляется до тех пор, пока есть места на специальности и претенденты на них. В этом цикле применяется процедура обработки специальности, код которой на языке VBA (Visual Basic for Applications) приведен ниже. Кандидатами к зачислению на специальность назовем абитуриентов с одинаковыми суммарными баллами группы вступительных испытаний специальности и одинаковыми баллами профильного предмета специальности, претендующие на последнее место

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

Public xlРезультаты As Excel.Workbook 'файл с результатами экзаменов

Public ОстМест^) As Integer 'кол-во оставшихся мест по специальностям

Public НачНомТаб^) As Integer 'номер строки таблицы специальностей (1-

N), с которой начинается добавление данных

Public КолЗач As Integer 'кол-во зачисленных

Dim КолСтрСп^) As Integer 'кол-во строк специальности

Dim ТекСтрСп^) As Integer 'текущая строка специальности

Dim КолПрет^) As Integer 'кол-во мест претендентов по специальности

Dim НеПонСпец^) As Integer 'пока не понятно на счет зачисления текущего

претендента - 1, не исследована - 0

Dim Проход As Integer

'обработка специальности по приоритету

Sub ОбрСпец

Dim i As Integer, j As Integer, k As Integer, num As Integer, РезПоиск As Integer,

№тр As Integer, СпецПр As String

Dim wf As Excel.Worksheet 'рабочий лист специальности Dim wr As Excel.Worksheet 'рабочий лист не зачисляемой специальности Dim Фам As String, Имя As String, Отч As String, Орг As String, z As String Dim ТекФам As String, ТекИмя As String, ТекОтч As String Set wf = xlРезультаты.Worksheets

If z = "" Then 'рассмотреть на зачисление

СпецПр = wf.Cells(i, pr + 5).Value 'чтение специальности приоритета If СпецПр = Спец Then 'зачислить на эту специальность If ОстМест^) > 1 Then 'больше 1 места

2: Фам=wf.CeUs(Ц): Имя=wf.Cells(i,2): Dra^CeUs^, 3): Ор^^^^) If Орг = "" Then КолПрет^) = КолПрет(n) + 1 'увеличение претендентов wf.Cells(i, 10).Value = pr: wf.Cells(i, 11).Value = НачНомТаб^) НачНомТаб(n) = НачНомТаб(n) + 1: НеПонСпец^) = 0 ОстМест(n) = ОстМест^) - 1 'на одно место меньше ТекСтрСп^) = ТекСтрСп^) + 1: КолЗач = КолЗач + 1 For j = pr + 1 To 3 СпецПр = wf.Cells(i, j + 5).Value If СпецПр = "" Then Exit For 'j

'исключаем из рассмотрения на другую специальность за ней num = NumSpec(СпецПр): НеПонСпец(num) = 0 Set wr = xlРезультаты.Worksheets(СпецПр) For k = 2 To КолСтрСп(num) ТекФам=wr.Cells(k,1):ТекИмя = wr.Cells(k,2):ТекОтч = wr.Cells(k,3) If ТекФам = Фам And ТекИмя = Имя And ТекОтч = Отч Then

wr.Cells(k, 10) = 0: wr.Cells(k, 12) = pr: Exit For 'k End If Next k Next j

Else 'последнее место Select Case ФормКанд(Спец, n) 'есть кандидаты на специальность Case 0 'не было кандидатов на специальность GoTo 2 'зачислять последнего Case 1 'кандидаты на специальность ниже последнего зачисляемого ОстМест^) = 0

ТекСтрСп^) = ТекСтрСп^) + 1

If pr < 3 Then pr = pr + 1 Else Exit Sub

СпецПр = wf.Cells(i, pr + 5).Value 'чтение специальности

'следующего приоритета

If СпецПр = "" Then Exit Sub

Спец = СпецПр: n = NumSpec

If ОстМест(num) = 0 Then 'нельзя зачислить - нет мест 3: If pr < 3 Then

pr = pr + 1: GoTo 1 End If 'pr

Else 'есть места на другую специальность Фам = wf.Cells(i, 1): Имя = wf.Cells(i, 2): Отч = wf.Cells(i, 3) 'попадает ли в область зачисления 4: РезПоиск = ПоискМестаСпец(СпецПр, num, Фам, Имя, Отч, №тр) Select Case РезПоиск

Case 0 'не найден на специальности или не может быть зачислен на 'другую специальность Проход = 0: GoTo 3 Case 1 'на текущую специальность не зачислять НеПонСпец^) = 0 For j = pr + 1 To 3 СпецПр = wf.Cells(i, j + 5).Value If СпецПр = "" Then Exit For 'j

'исключаем из рассмотрения на другую специальность за ней num = NumSpec

Set wr = xlРезультаты.Worksheets

ТекФам=wr.Cells(k,1): ТекИмя=wr.Cells(k,2): ТекОтч=wr.Cells(k,3) If ТекФам = Фам And ТекИмя = Имя And ТекОтч = Отч Then

wr.Cells(k, 10) = 0: wr.Cells(k, 12) = pr: Exit For 'k End If Next k Next j

ТекСтрСп^) = ТекСтрСп(n) + 1: Проход = 0 Case 2 'пока не попадает

НеПонСпец^) = 1: Проход = 0

ТекСтрСп^) = i: Спец = СпецПр: n = NumSpec(СпецПр) Exit For 'i Case 3 'до зачислить If Проход = 0 Then 'до зачислить на специальность ДоЗачис СпецПр, num, №тр - 1 GoTo 4 End If

НеПонСпец^) = 1: Проход = 0: Exit Sub End Select End If End If pr = 1

Else '0 - не зачислять, 1-3 - зачислен с приоритетом 1-3

ТекСтрСп^) = ТекСтрСп^) + 1 End If Next i End Sub

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

Function ФормКанд(Спец As String, n As Integer) As Integer возвращает 0 -нет кандидатов, 1 - есть ниже последнего зачисляемого, 2 - есть выше последнего зачисляемого, 3 - все кандидаты ниже под вопросом Function ПоискМестаСпец(Спец As String, n As Integer, Фам As String, Имя As String, Отч As String, ByRef №тр As Integer) As Integer возвращает 0 - не может быть зачислен, 1 - будет зачислен на эту специальность, 2 - не понятно,3 -пока неизвестно может ли быть зачислен на эту специальность (могут отпасть выше его по списку).

Литература:

1. Вирт Н. Алгоритмы и структуры данных [Текст] // М.: Мир, 1989. - 360 с.

2. Уокенбах, Джон. Excel 2010: профессиональное программирование на VBA.: [Текст] // М.: ООО "И.Д. Вильямс", 2012. — 944 с.

3. Кашаев С.М. Программирование в Microsoft Excel на примерах. [Текст] // СПб.: БХВ-Петербург, 2007. - 320 с.

4. Чернов А.В., Паращенко И.Г. Классификация моделей надежности программного обеспечения [Электронный ресурс] //«Инженерный вестник Дона», 2012, №4. - Режим доступа: http://www.ivdon.ru/magazine/archive/n4p2y2012/1319

- Загл. с экрана. - Яз. рус.

5. Ильичева О.А. Технология логического моделирования и анализа сложных систем [Электронный ресурс] //«Инженерный вестник Дона», 2012, №4. - Режим доступа:

http://www.ivdon.ru/magazine/archive/n4p2y2012/1234

- Загл. с экрана. - Яз. рус.

6. Good I.J., Crook J.F. The enumeration of arrays and a generalization related to contingency tables. [Текст] // Discrete Math.-1977-v.19, № 1.-P.23-45

7. М. Холл Комбинаторика [Текст] // М.: Мир, 1970. - 419 с.

8. Shooman M.L. Operational Testing and Software Reliability Estimation During Program Developments - IEEE Computer Society, 1973.

9. Мартин Р. Чистый код: создание, анализ и рефакторинг. [Текст] //Библиотека программиста. - СПб: Питер, 2010. - 464 с.

10. Levitin A. Introduction to The Design & Analysis of Algorithms [Текст] // Addison-Wesley, 2003. - p. 576.