При расчёте статистики по результатам ЕГЭ в регионе у нас в ОРЦОКО пришлось кое-что дописывать, т.к. федеральное ПО ужасное и не считает всё, что нужно.
Нужно посчитать количество выпускников, сдававших, соответственно, 1, 2, 3... экзамена.
Программист сортирует экспортированные из системы результаты экзаменов в Excel по полю "номер паспорта" и дальше сохраняет в CSV одну только эту колонку. Т.е. имеется последовательность строк с номерами паспортов, где каждый номер повторяется (рядом) столько раз, сколько человек сдавал экзаменов.
Программист сейчас ваяет на ББ процедурку, которая посчитает статистику.
Я тоже тут накидал алгоритм. Не напрягая мозги, получился сразу цикл Дейкстры. Тестировать не тестировал, написал на бумажке.
Правда, программист не хочет его брать, говорит, что не понимает Колдует уже час над вложенными циклами, пытаясь, к тому же, это сделать прямо над TextMappers.Scanner.
(жирным шрифтом выделено мной).
В который раз одно и то же на оберонкоре... задачу ставить/понимать не хотим, но сразу предлагаем решение "не напрягая мозги" и получаем... цикл Дейкстры... с ошибками и без тестирования...
"Всё это было бы смешно, когда бы не было, так грустно"...
1. И не смущает, что нет постановки задачи, просто декларируется:
"Нужно посчитать количество выпускников, сдававших, соответственно, 1, 2, 3... экзамена"... Кому это нужно?.. Для чего это нужно?.. Какая статистика вообще востребована?.. Ну, вот, Илье потребовалось "это", а кому-то "это" и ещё "вот это"... а кому-то... важен средний балл по математике... или биологии, или средний балл по всем предметам тех, кто сдавал математику и биологию.
2. И не смущает, что при такой постановке задачи "софт" получается "ужасным и не полным"... Он реально не может быть другим... потому что, придёт ещё один "илья" со своим видением и допишет ещё 20-40 строк с ужасным циклом Дейкстры, который в очередной раз никто не поймёт...
3. И не смущает, что писать этот самый цикл Дейкстры берутся... "не напрягая мозги"... А мозгам, вообще говоря, полезно, когда их напрягают... примерно также, как мышцам... Мышцы напрягают, когда работают физически, а мозг - когда умственно... Собственно, мозг - это некая "интеллектуальная мышца"...
И вот если мозги напрячь, то... получим несколько простых, но полезных идей...
- Не надо полагаться на то, что данные из внешнего источника будут представлены в нужной последовательности или группировке, или отфильтрованы так, как требуется для данной задачи (не ленитесь преобразовывать... но не сами данные, а текущее представление о данных). Применительно к данной задаче, надо отсортировать список (массив) ссылок на данные паспорта. Внешнее окружение переменчиво...
- Не надо запутывать логику обработки данных, чем проще логические конструкции, тем проще в них разобраться, тем эффективнее код. Применительно к данному случаю, оптимальным будет вариант с вложенными циклами:
i := 0;
while (i < cntItems) do begin
cur_pass := pass[i];
k := 0;
while (i < cntItems) and (cur_pass = pass[i]) do begin
inc(k); // k - количество сданных экзаменов учащимся с данным паспортом
inc(i);
end;
inc(stat[k]); // stat[k] массив, где хранятся количества сдавших k-ое количество экзаменов (размерность от 0 до Количество экзаменов, размеры элементов массива (положительное целое) должны вмещать количество сдававших)
end;
А что реально смущает, так это то... что они ещё и учат...