Алгоритм решения «задачи о зачислении»
Аннотация
Дата поступления статьи: 05.12.2013Рассматривается алгоритм задачи о зачислении в высшее учебное заведение по результатам Единого Государственного Экзамена с учетом различных групп вступительных испытаний, приоритетов поступления на специальность, минимальных проходных баллов по предметам групп вступительных испытаний и контрольным цифрам приема в вуз. Алгоритм реализован на основе базы данных Mirosoft Excel и языка программирования Visual Basic for Applications.
Ключевые слова: группа вступительных испытаний, кандидат зачисления на специальность, претендент зачисления на специальность
05.13.18 - Математическое моделирование, численные методы и комплексы программ
Постановка задачи о «зачислении» возникла в связи с проблемой зачисления абитуриентов в высшее учебное заведение (ВУЗ) на основании результатов единого государственного экзамена (ЕГЭ) по общеобразовательным предметам на различные направления подготовки (специальности). Согласно правилам приема в ВУЗ абитуриент имеет право подавать результаты ЕГЭ на несколько направлений подготовки (специальностей), причем направлениям подготовки (специальностям) могут соответствовать различные группы вступительных испытаний (ГВИ) и разное количество бюджетных мест, ограниченных контрольными цифрами приема.
Например, в 2013 году абитуриент мог подавать результаты ЕГЭ в Ростовский государственный строительный университет (РГСУ) на любые 3 направления подготовки (специальности) из 23 имеющихся, причем в предыдущие годы таких специальностей могло быть 5 или 9 из 48 доступных специальностей. Направления подготовки (специальности) делятся на группы вступительных испытаний по общеобразовательным предметам. Например, одним специальностям соответствует группа испытаний Русский язык, Математика, Физика (РМФ), другим – Русский язык, Математика, Обществознание (РМО), третьим – Русский язык, Математика, Информатика (РМИ), четвертым – Русский язык, Литература, Обществознание (РЛО), пятым – Русский язык, Математика, Профессиональный экзамен (РМП).
Кроме того, надо учитывать право на прием без вступительных испытаний (победители или призеры олимпиад), на прием вне конкурса при условии успешного прохождения вступительных испытаний, свой конкурс на места целевого приема на специальность, причем не прошедшие целевой прием могут поступать на другие специальности.
При формировании суммарного балла для каждой группы вступительных испытаний учитывается, что количество баллов по общеобразовательному предмету или дополнительному вступительному испытанию (профессиональный экзамен) не может быть меньше минимального количества баллов, установленных ВУЗом или Федеральной службой по надзору в сфере образования и науки.
Исходными данными программы является база данных (таблица Microsoft Excel) с полями фамилия, имя, отчество, баллами ЕГЭ по общеобразовательным предметам и профессиональному экзамену, полями признаков вне конкурса, целевой прием, оригиналы документов, а также полями приоритетов специальностей поступления, в которых указано сокращенное название специальности данного приоритета. Количество приоритетов специальностей как говорилось выше, может быть 3 или выше в зависимости от правил поступления. Приоритеты специальностей заполняются последовательно, начиная со специальности 1 приоритета и возможно до специальности с последним приоритетом. Кроме того, исходными данными программы являются контрольные цифры приема на направления подготовки (специальности), включая количество мест целевого приема, и минимальные проходные баллы по общеобразовательным предметам и профессиональному экзамену.
До запуска основного алгоритма программы в базе данных должны быть образованы поля суммарного балла для всех групп вступительных испытаний (например, РМФ, РМИ, РМО, РЛО, РМП). Для каждого абитуриента подсчитываются только суммарные баллы групп вступительных испытаний согласно специальностей приоритетов, причем такая сумма подсчитывается, если балл каждого вступительного испытания группы не меньше минимального проходного балла по этому испытанию.
Для формирования отчета о зачислении алгоритм программы должен заносить результаты обработки в поля базы: приоритет в таблице зачисления на специальность, №таблицы зачисления на специальность, №строки в таблице зачисления, №таблицы зачисления и строки для кандидата на зачисление по приоритету в таблице зачисления по количеству возможных приоритетов.
В начале алгоритма применяется для отчета о зачислении цикл заполнения мест по специальностям вне конкурса и целевого набора.
Затем идет цикл формирования рабочих листов для каждой специальности с полями «Фамилия», «Имя», «Отчество», «балл профильного предмета специальности», «Оригинал документов», «суммарный балл группы вступительных испытаний», поля приоритетов специальностей, включая приоритет данной специальности. Эти поля выбираются из базы с помощью автофильтров только для записей, имеющих в одном из полей приоритетов специальностей данную специальность, не пустой суммарный балл группы вступительных испытаний специальности, исключая зачисленных вне конкурса и по целевому набору. Результаты отбора помещаются на лист специальности и сортируются по суммарному баллу группы вступительных испытаний специальности по убыванию, затем по баллу профильного предмета специальности по убыванию и по фамилии по возрастанию. Также добавляются новые поля результатов работы алгоритма: «приоритет зачисления на специальность», «№строки в таблице зачисления на специальность», «приоритет кандидата зачисления на специальность».
Следующий шаг алгоритма цикл зачисления на каждую специальность с 1 приоритетом, исключая последнее место.
Далее идет цикл зачисления на оставшиеся места специальностей. Перебор специальностей осуществляется до тех пор, пока есть места на специальности и претенденты на них. В этом цикле применяется процедура обработки специальности, код которой на языке VBA (Visual Basic for Applications) приведен ниже. Кандидатами к зачислению на специальность назовем абитуриентов с одинаковыми суммарными баллами группы вступительных испытаний специальности и одинаковыми баллами профильного предмета специальности, претендующие на последнее место или места специальности. Претендентами к зачислению на специальность назовем абитуриентов, претендующих на места специальности вместо зачисляемых без оригиналов документов.
Public xlРезультаты As Excel.Workbook 'файл с результатами экзаменов
Public ОстМест(N) As Integer 'кол-во оставшихся мест по специальностям
Public НачНомТаб(N) As Integer 'номер строки таблицы специальностей (1-N), с которой начинается добавление данных
Public КолЗач As Integer 'кол-во зачисленных
Dim КолСтрСп(N) As Integer 'кол-во строк специальности
Dim ТекСтрСп(N) As Integer 'текущая строка специальности
Dim КолПрет(N) As Integer 'кол-во мест претендентов по специальности
Dim НеПонСпец(N) As Integer 'пока не понятно на счет зачисления текущего претендента - 1, не исследована - 0 (1-N)
Dim Проход As Integer
'обработка специальности по приоритету
Sub ОбрСпец(Спец As String, n As Integer, ByVal pr As Integer)
Dim i As Integer, j As Integer, k As Integer, num As Integer, РезПоиск As Integer, Nстр 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(Спец)
For i = ТекСтрСп(n) To КолСтрСп(n) 'есть претенденты
1: If ОстМест(n) = 0 Then Exit Sub
z = wf.Cells(i, 10)
If z = "" Then 'рассмотреть на зачисление
СпецПр = wf.Cells(i, pr + 5).Value 'чтение специальности приоритета
If СпецПр = Спец Then 'зачислить на эту специальность
If ОстМест(n) > 1 Then 'больше 1 места
2: Фам=wf.Cells(i,1): Имя=wf.Cells(i,2): Отч=wf.Cells(i, 3): Орг=wf.Cells(i,5)
If Орг = "" Then КолПрет(n) = КолПрет(n) + 1 'увеличение претендентов
wf.Cells(i, 10).Value = pr: wf.Cells(i, 11).Value = НачНомТаб(n)
НачНомТаб(n) = НачНомТаб(n) + 1: НеПонСпец(n) = 0
ОстМест(n) = ОстМест(n) - 1 'на одно место меньше
ТекСтрСп(n) = ТекСтрСп(n) + 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 'кандидаты на специальность ниже последнего зачисляемого
ОстМест(n) = 0
ТекСтрСп(n) = ТекСтрСп(n) + 1
If pr < 3 Then pr = pr + 1 Else Exit Sub
СпецПр = wf.Cells(i, pr + 5).Value 'чтение специальности
'следующего приоритета
If СпецПр = "" Then Exit Sub
Спец = СпецПр: n = NumSpec(СпецПр): НеПонСпец(n) = 0: Exit Sub
Case 2 'кандидаты на специальность выше последнего зачисляемого
ОстМест(n) = 0: ТекСтрСп(n) = ТекСтрСп(n) + 1
If Спец = "" Then Exit Sub: n = NumSpec(Спец): Exit Sub
Case 3 'возможны кандидаты на специальность
If n<23 Then n=n + 1 Else n=1 'переход на следующую специальность
Спец = ИмяСпец(n): НеПонСпец(n) = 0: Exit Sub
End Select
End If 'конец последнего места
Else 'другая специальность
num = 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, Фам, Имя, Отч, Nстр)
Select Case РезПоиск
Case 0 'не найден на специальности или не может быть зачислен на
'другую специальность
Проход = 0: GoTo 3
Case 1 'на текущую специальность не зачислять
НеПонСпец(n) = 0
For j = pr + 1 To 3
СпецПр = wf.Cells(i, j + 5).Value
If СпецПр = "" Then Exit For 'j
'исключаем из рассмотрения на другую специальность за ней
num = NumSpec(СпецПр)
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
ТекСтрСп(n) = ТекСтрСп(n) + 1: Проход = 0
Case 2 'пока не попадает
НеПонСпец(n) = 1: Проход = 0
ТекСтрСп(n) = i: Спец = СпецПр: n = NumSpec(СпецПр)
Exit For 'i
Case 3 'до зачислить
If Проход = 0 Then 'до зачислить на специальность
ДоЗачис СпецПр, num, Nстр - 1
GoTo 4
End If
НеПонСпец(n) = 1: Проход = 0: Exit Sub
End Select
End If
End If
pr = 1
Else '0 – не зачислять, 1-3 - зачислен с приоритетом 1-3
ТекСтрСп(n) = ТекСтрСп(n) + 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 Nстр As Integer) As Integer возвращает 0 - не может быть зачислен, 1 - будет зачислен на эту специальность, 2 - не понятно,3 -пока неизвестно может ли быть зачислен на эту специальность (могут отпасть выше его по списку).
Литература:
- Вирт Н. Алгоритмы и структуры данных [Текст] // М.: Мир, 1989. – 360 с.
- Уокенбах, Джон. Excel 2010: профессиональное программирование на VBA.: [Текст] // М.: ООО “И.Д. Вильямс”, 2012. — 944 с.
- Кашаев С.М. Программирование в Microsoft Excel на примерах. [Текст] // СПб.: БХВ-Петербург, 2007. – 320 с.
- Чернов А.В., Паращенко И.Г. Классификация моделей надежности программного обеспечения [Электронный ресурс] //«Инженерный вестник Дона», 2012, №4. – Режим доступа: http://www.ivdon.ru/magazine/archive/n4p2y2012/1319 (доступ свободный) – Загл. с экрана. – Яз. рус.
- Ильичева О.А. Технология логического моделирования и анализа сложных систем [Электронный ресурс] //«Инженерный вестник Дона», 2012, №4. – Режим доступа: http://www.ivdon.ru/magazine/archive/n4p2y2012/1234 (доступ свободный) – Загл. с экрана. – Яз. рус.
- 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
- М. Холл Комбинаторика [Текст] // М.: Мир, 1970. – 419 с.
- Shooman M.L. Operational Testing and Software Reliability Estimation During Program Developments - IEEE Computer Society, 1973.
- Мартин Р. Чистый код: создание, анализ и рефакторинг. [Текст] //Библиотека программиста. – СПб: Питер, 2010. – 464 с.
- Levitin A. Introduction to The Design & Analysis of Algorithms [Текст] // Addison-Wesley, 2003. – p. 576.