
- •Министерство образования Российской Федерации
- •Содержание
- •1. Специальная часть 6
- •2. Технологическая часть. Особенности разработки программ на скриптовом языке Perl с использованием интерфейса cgi 60
- •3. Организационно-экономическая часть. Особенности сегментации рынка программного продукта 76
- •4. Производственная и экологическая безопасность. Организация рабочего места программиста и пользователя эвм 88
- •Введение
- •1. Специальная часть
- •2002 Г. Введение
- •1.1. Анализ системы орокс
- •1.1.1. Организация обучения на базе системы орокс
- •1.1.2. Состав индивидуального учебного плана пользователя
- •1.1.3. Процесс взаимодействия обучаемого с учебным заведением
- •1.1.4. Анализ существующих функций администрирования процесса обучения
- •1.1.5. Постановка задачи
- •1.1.5.1. Требования к информационной и программной совместимости
- •1.1.5.2. Основные элементы интерфейса, предоставляемые технологией www
- •1.2. Проектирование подсистемы статистического учёта успеваемости студентов
- •1.2.1. Язык моделирования, используемый при проектировании подсистемы
- •1.2.2. Разработка общей структурной схемы подсистемы.
- •1.2.3. Структура данных, используемых подсистемой
- •1.2.4. Проектирование и реализация компонентов подсистемы
- •1.2.4.1. Учебная карточка студента
- •1.2.4.2. Передача работ преподавателю
- •1.2.4.3. Текущая успеваемость
- •1.2.4.4. Статистика по студентам
- •1.3. Особенности реализации подсистемы
- •1.3.1. Взаимодействие с базой данных
- •1.3.2. Передача значений между формами
- •1.3.3. Особенности, связанные с подготовкой отчётов для печати
- •1.3.4. Сортировка массивов
- •1.4. Методика испытаний
- •2. Технологическая часть. Особенности разработки программ на скриптовом языкеPerlс использованием интерфейсаCgi
- •2.1.2. CommonGatewayInterfaceкак средство расширения возможностейWorldWideWebтехнологии
- •2.2. Особенности языка Perl
- •2.2.1. История создания языка
- •2.2.2. Синтаксис языка
- •2.3. Особенности отладки cgi-программ
- •2.2.1. Ошибки в Perl-программе
- •2.2.2. Отладка шаблонов
- •2.2.3. Использование ModPerl
- •2.2.4. Ошибки при настройке www-сервера
- •2.2.5. Ошибки при выполнении sql-выражений
- •2.4. Диаграммы uml, используемые при проектировании подсистемы
- •2.4.1. Введение
- •2.4.2. Диаграммы вариантов использования
- •2.4.3. Диаграммы деятельности
- •2.4.4. Диаграммы последовательностей
- •3. Организационно-экономическая часть. Особенности сегментации рынка программного продукта
- •2002 Г. Введение
- •3.1. Принципы сегментации с учётом специфики продукта
- •3.2. Методика расчёта сегментации рынка
- •3.3. Поиск сегментов рынка для подсистемы статистического учёта успеваемости студентов
- •3.5. Оценка затрат на создание программного продукта и определение точки безубыточности
- •3.6. Вывод
- •4. Производственная и экологическая безопасность. Организация рабочего места программиста и пользователя эвм
- •2002 Г. Введение
- •4.1. Вредные факторы на рабочем месте программиста и пользователя эвм
- •4.1.1. Излучения экрана монитора
- •4.1.2. Микроклимат помещения
- •4.1.3. Требования к уровням шума
- •4.1.4. Психофизиологические факторы
- •4.1.4.1. Физические перегрузки (статические)
- •4.1.4.2. Монотонность труда
- •4.1.4.3. Описание зрительной работы оператора
- •Заключение
- •Список литературы
- •Приложения Фрагмент текста программы
Приложения Фрагмент текста программы
# Передача работ преподавателю
sub Operation_1
{
if (!VerifyRights(0)) {NoOper()}; # or any other rights...
$FORM{'screen'}='oper1'; SetPlugin_sID(2);
if ((($FORM{'sort'} eq "")||($FORM{'group'} ne $FORM{'old_group'}))||((!$FORM{'filter_p'})&&($FORM{'sort'} eq "mark"))) {$FORM{'sort'} = 'student';} # Сортировка по умолчанию
#if ((!$FORM{'filter_p'})&&($FORM{'sort'} eq "mark"))
form_up(600,0,'Формирование акта передачи работ преподавателю');
# View limitation reset
nav_reset();
# Set sorting modes
@Sorts=(1,1,1,1,1,1,1);
if ($FORM{'s_student.x'}) {$FORM{'sort'}='student'}
elsif($FORM{'s_group.x'}) {$FORM{'sort'}='group'}
elsif($FORM{'s_test.x'}) {$FORM{'sort'}='test'}
elsif($FORM{'s_mark.x'}) {$FORM{'sort'}='mark'}
elsif($FORM{'s_rs_date.x'}) {$FORM{'sort'}='rs_date'}
elsif($FORM{'s_rt_date.x'}) {$FORM{'sort'}='rt_date'}
;
if ($FORM{'sort'} eq 'student') {$Sorts[0]=2;}
elsif ($FORM{'sort'} eq 'group') {$Sorts[1]=2;}
elsif ($FORM{'sort'} eq 'test') {$Sorts[2]=2;}
elsif ($FORM{'sort'} eq 'mark') {$Sorts[3]=2;}
elsif ($FORM{'sort'} eq 'rs_date') {$Sorts[4]=2;}
else {$Sorts[5]=2;}
$Hidden{'sort'}=$FORM{'sort'}; # Сохраняем сортировку
my (@t_IDs, @t_fams, @t_names)=((),(),());
# 1. Выбор преподавателей из TUTORS
$sql="SELECT DISTINCT tutors.prep_ID, users.ufam, users.uname, uname2 FROM tutors, users WHERE tutors.prep_ID=users.ID order by users.ufam";
$sth=ExecSQL($sql);
Assign2list($sth, \@t_IDs, \@t_fams, \@t_names, \@t_names2);
# Main FORM
t_print qq(<form method="POST" name="uform" action="$CGIname"><b>Преподаватель: </b>);
if ($FORM{'tutor'} eq "") {$FORM{'tutor'}=$t_IDs[0];} # Выбор группы по умолчанию
t_print qq(<select name="tutor" OnChange="document.uform.discip.value=''; document.uform.submit()">);
for (my $i=0; $i<scalar(@t_IDs); $i++)
{
$chk="";
if ($FORM{'tutor'} eq "$t_IDs[$i]") {$chk="selected";}
t_print "<option $chk value='$t_IDs[$i]'>$t_fams[$i] $t_names[$i] $t_names2[$i]";
}
t_print "</select>";
my (@dis_titles, @dis_ids)=((),()); # Названия+ID в формате ID_плана-№_дисциплины в плане;ID_плана-№_дисциплины в плане...
if ($FORM{'tutor'} ne "")
{
# 2. Выбор дисциплин, их названий из TUTORS для выбранного преподавателя
$sql="SELECT DISTINCT tutors.plan_ID, tutors.disnum, disciplines.title FROM tutors, disciplines
WHERE tutors.prep_ID=$FORM{tutor} and disciplines.owner_id=tutors.plan_ID and disciplines.num=tutors.disnum ORDER by tutors.plan_ID, tutors.disnum";
$sth=ExecSQL($sql);
Assign2list($sth, \@plans_IDs, \@disnums, \@titles);
for (my $i=0; $i<scalar(@plans_IDs); $i++)
{
if (inlist("$titles[$i]", @dis_titles))
{
for ($j=0; $j<scalar(@dis_titles); $j++)
{
if ($titles[$i] eq @dis_titles[$j])
{
@dis_ids[$j].=";$plans_IDs[$i]-$disnums[$i]";
}
}
}
else
{
push @dis_titles, $titles[$i];
push @dis_ids, "$plans_IDs[$i]-$disnums[$i]";
}
}
}
t_print " <b>Дисциплина: </b>";
if ($FORM{'discip'} eq "") {$FORM{'discip'}=$dis_ids[0];} # Выбор дисциплины по умолчанию
t_print qq(<select name="discip" OnChange="document.uform.submit()">);
for (my $i=0; $i<scalar(@dis_ids); $i++)
{
$chk="";
if ($FORM{'discip'} eq "$dis_ids[$i]") {$chk="selected"}
t_print "<option $chk value='$dis_ids[$i]'>$dis_titles[$i]";
}
t_print "</select>";
# Чекбокс для отбора проверенных к.р.
if ($FORM{'filter_p'}) {$chk="checked";} else {$chk="";}
t_print "<br><input type=\"checkbox\" $chk name=\"filter_p\" value=\"yes\" OnClick=\"document.uform.submit()\"><b>Показывать проверенные контрольные работы</b>";
# 3. Выбор контрольных мероприятий, которые должен проверять (или проверил) выбранный преподаватель по выбранной дисциплине (1 дисциплина может быть в нескольких планах %-()
my @stud_IDs=();
my (@plans_dis)=split(';',$FORM{'discip'}); # Массив ПЛАН-ДИСЦИПЛИНА для выбранной дисциплины (их несколько может быть)
my (@plans, @discs)=((),());
foreach(@plans_dis)
{
my ($p, $d)=split('-',$_); # P = plans.ID; D = номер дисциплины
push (@plans, $p);
push (@discs, $d);
}
#а) Выбираем работы, доставленные в институт (kinfo.received!="0000-00-00"), которые предназначаются выбранному преподавателю
$Hidden{'old_tutor'}=$FORM{'tutor'}; # Сохраняем для того, чтобы при смене преподавателя и дисциплины сбрасывать выделенные записи в таблице
$Hidden{'old_discip'}=$FORM{'discip'};
if ($FORM{'tutor'})
{
$sql="SELECT DISTINCT results.userID FROM kinfo, results
WHERE kinfo.tutor_ID=$FORM{tutor} and results.kinfo_ID=kinfo.ID and kinfo.received!='0000-00-00'";
$sth=ExecSQL($sql);
Assign2list($sth, \@stud_IDs);
}
my (@studs, @groups, @lessons, @kinfo_ids, @marks, @rs_dates, @rt_dates)=((),(),(),(),(),(),(),(),());
my @all_discips;
for (my $i=0; $i<scalar(@stud_IDs); $i++)
{
$sql = qq(
SELECT assigned_plans.id, plan_location, plan_ID, TO_DAYS(plan_start), target_type FROM assigned_plans, users
WHERE active=1 AND plan_type=1
AND ((target_type='USER' AND target_ID='$stud_IDs[$i]' AND users.ID='$stud_IDs[$i]')
OR (target_type='GROUP' AND target_ID=users.ugroup AND users.id='$stud_IDs[$i]')
OR (target_type='CATEG' AND target_ID=users.uflags AND users.id='$stud_IDs[$i]'))
ORDER BY target_type ASC
);
$sth = ExecSQL($sql);
Assign2list($sth, \@ids, \@pls, \@pids, \@pstarts);
if (scalar(@ids)>0)
{
my $flag="-1";
my $dis=0;
if ($pls[0] eq "plans") # Если план базовый..
{
for (my $j=0; $j<scalar(@plans); $j++)
{
if ($pids[0] eq @plans[$j])
{
$flag=$j;
$dis=$discs[$j];
last;
}
}
}
else # Если производный, то надо узнать на каком базовом он основан
{
$sql="SELECT base_ID from dplans where id=$pids[0]";
$sth = ExecSQL($sql);
Assign2var($sth, $base_id);
for (my $j=0; $j<scalar(@plans); $j++)
{
if ($base_id eq @plans[$j])
{
$flag=$j;
$sql="SELECT disciplines FROM dplans WHERE ID=$pids[0]";
$sth=ExecSQL($sql);
Assign2var ($sth, $dis);
my @_dis=split(',',$dis);
$dis=@_dis[$discs[$j]-1];
last;
}
}
}
if ($flag ne "-1")
{
# если сюда попали, значит студент обучается по выбранному плану
my $filter_p="";
if (!$FORM{'filter_p'}) {$filter="and results.stage='**?**'";}
$sql = qq (
select results.kinfo_ID, results.lesson, results.stage, kinfo.received, kinfo.handed_out, kinfo.handed_in, kinfo.max_duration
from results, kinfo
where results.userID=$stud_IDs[$i] and results.aplan_ID=$ids[0] and results.discipline=$dis and kinfo.id=results.kinfo_ID
and kinfo.tutor_ID=$FORM{tutor} $filter
);
$sth = ExecSQL($sql);
Assign2list($sth, \@k_ids, \@l_title, \@r_stages, \@k_rs, \@k_hos, \@k_his, \@k_durs);
if (scalar(@k_ids)>0)
{
# Выбор фамилии и имя студента
$sql="select ufam, uname, uname2, ugroup from users where id=$stud_IDs[$i]";
$sth = ExecSQL($sql);
Assign2var($sth, $fam, $name, $name2, $group);
$name =~ s/^(.).*/$1\./g;
$name2 =~ s/^(.).*/$1\./g;
for (my $k=0; $k<scalar(@k_ids); $k++)
{
my $descr="";
$sql="SELECT lessons.title FROM disciplines, lessons WHERE lessons.owner_id=disciplines.id and disciplines.owner_id=$plans[$flag] and disciplines.num=$dis and lessons.num=$l_title[$k]";
$sth=ExecSQL($sql);
Assign2var ($sth, $descr);
push @studs, "$fam $name $name2";
push @groups, $group;
push @lessons, $descr;
push @kinfo_ids, $k_ids[$k];
dec_mark($r_stages[$k]);
push @marks, $r_stages[$k];
if (!inlist("$group", @all_groups)) {push @all_groups, "$group"}
if ($k_hos[$k] eq "0000-00-00") {push @rs_dates, "-";} else {push @rs_dates, date_to_str($k_hos[$k],'.');};
if ($FORM{'filter_p'})
{
if ($k_his[$k] eq "0000-00-00") {push @rt_dates, "-";}
else {push @rt_dates, date_to_str($k_his[$k],'.');}
}
else
{
if ($k_hos[$k] eq "0000-00-00") {push @rt_dates, '-';}
else {push @rt_dates, date_to_str(days_to_date(date_to_days($k_hos[$k])+$k_durs[$k]),'.');}
}
}
}
}
}
}
push @all_groups, "Все";
# Выбор группы
t_print "<br><b>Группа: </b>";
if ($FORM{'group'} eq "") {$FORM{'group'}=$all_groups[0];} # Выбор группы по умолчанию
t_print qq(<select name="group" OnChange="document.uform.submit()">);
foreach (@all_groups)
{
$chk="";
if ($FORM{'group'} eq "$_") {$chk="selected"}
t_print "<option $chk value='$_'>$_";
}
t_print "</select> <input type=\"submit\" value=\"Выделить все\" name=\"select_all\"> <input type=\"submit\" value=\"Снять выделение\" name=\"deselect\">";
$Hidden{'old_group'}=$FORM{'group'};
if ($FORM{'group'} ne "Все")
{
for (my $i=0; $i<scalar(@studs); $i++)
{
if (@groups[$i] ne $FORM{'group'})
{
splice (@studs, $i, 1);
splice (@groups, $i, 1);
splice (@lessons, $i, 1);
splice (@kinfo_ids, $i, 1);
splice (@marks, $i, 1);
splice (@rs_dates, $i, 1);
splice (@rt_dates, $i, 1);
splice (@k_ids, $i, 1);
$i--;
}
}
}
$numrec=scalar(@studs);
# Теперь надо отсортировать массивы в соответствии с выбранным столбцом...
my @ind=();
for ($i=0; $i<scalar(@studs); $i++)
{
push(@ind,$i);
}
if ($FORM{'sort'} eq 'student') # Если сортируем по Студентам
{
@ind=sort{$studs[$a] cmp $studs[$b]}@ind;
}
elsif ($FORM{'sort'} eq 'group') # Если сортируем по Группе
{
@ind=sort{$groups[$a] cmp $groups[$b]}@ind;
}
elsif ($FORM{'sort'} eq 'test') # Если сортируем по наименованию контрольного мероприятия
{
@ind=sort{$lessons[$a] cmp $lessons[$b]}@ind;
}
elsif ($FORM{'sort'} eq 'mark') # Если сортируем по оценке
{
@ind=sort{$marks[$b] cmp $marks[$a]}@ind;
}
elsif ($FORM{'sort'} eq 'rs_date') # Если сортируем по Дате выдачи на проверку
{
@ind=sort
{
cmp_dates(str_to_date($rs_dates[$b]), str_to_date($rs_dates[$a]))
}@ind;
}
elsif ($FORM{'sort'} eq 'rt_date') # Если сортируем по Дате приёма в деканат
{
@ind=sort
{
cmp_dates(str_to_date($rt_dates[$b]), str_to_date($rt_dates[$a]))
}@ind;
}
nav_set();
$Hidden{'offset'}=$recoff;
t_print qq(
<table border="1" bordercolorlight="$TableBG" bordercolordark="$TableBG" bgcolor="$CellBG" cellspacing="0">
<tr align="center"><td nowrap>*</td>
<td nowrap><input type="image" name="s_student" src="$CONFIG{'WebImages'}/sort$Sorts[0].gif" width="11" height="8" title="" border="0"><b>Студент</b></td>
);
if ($FORM{'group'} eq "Все") { t_print qq(<td nowrap><input type="image" name="s_group" src="$CONFIG{'WebImages'}/sort$Sorts[1].gif" width="11" height="8" title="" border="0"><b>Группа</b></td>);}
t_print qq(<td nowrap><input type="image" name="s_test" src="$CONFIG{'WebImages'}/sort$Sorts[2].gif" width="11" height="8" title="" border="0"><b>Контрольное мероприятие</b></td>);
if ($FORM{'filter_p'}) {t_print qq(<td nowrap><input type="image" name="s_mark" src="$CONFIG{'WebImages'}/sort$Sorts[3].gif" width="11" height="8" title="" border="0"><b>Оценка</b></td>);}
if ($FORM{'filter_p'}) {$chk="Дата<br>приёма в деканат"}
else {$chk="Дата<br>планируемого возврата"};
t_print qq(
<td nowrap><input type="image" name="s_rs_date" src="$CONFIG{'WebImages'}/sort$Sorts[4].gif" width="11" height="8" title="" border="0"><b>Дата<br>выдачи на проверку</b></td>
<td nowrap><input type="image" name="s_rt_date" src="$CONFIG{'WebImages'}/sort$Sorts[5].gif" width="11" height="8" title="" border="0"><b>$chk</b></td></tr>);
my $temp=0; # Печать таблицы ===================================
my @list=();
for ($i=0; $i<scalar(@studs); $i++)
{
next if ($i < $recoff);
last if ($i >= $recend);
my $chk="";
my $name = "chk-$kinfo_ids[$ind[$i]]";
push @list, $kinfo_ids[$ind[$i]];
if (($FORM{'select_all'})||inlist("$name", keys %FORM)&&(!$FORM{'deselect'})&&(($FORM{'old_tutor'} eq $FORM{'tutor'})&&($FORM{'old_discip'} eq $FORM{'discip'})))
{
$chk="checked";
$FORM{$name}="checked";
}
else
{
$FORM{$name}="no";
}
t_print qq(
<tr height="24">
<td align="center"><input type="checkbox" name="$name" $chk value="$FORM{$name}"></td>
<td nowrap> $studs[$ind[$i]]</td>
);
if ($FORM{'group'} eq "Все") { t_print qq(<td nowrap> $groups[$ind[$i]]</td>);}
t_print qq(<td nowrap> $lessons[$ind[$i]]</td>);
if ($FORM{'filter_p'}) {t_print qq(<td nowrap align="center">$marks[$ind[$i]]</td>);}
t_print qq(<td nowrap align="center">$rs_dates[$ind[$i]]</td><td nowrap align="center">);
if ((!$FORM{'filter_p'} &&($rt_dates[$ind[$i]] ne "-"))&&(cmp_dates(str_to_date($rt_dates[$ind[$i]]),$curdate) == -1))
{
t_print '<font color=red>'.$rt_dates[$ind[$i]].'</font>';
}
else {t_print qq($rt_dates[$ind[$i]]</td></tr>)}
$temp++;
}
my $numcol=7;
if ($FORM{'group'} ne "Все") {$numcol--;}
if (!$FORM{'filter_p'}) {$numcol--;}
for (my $i=0; $i<$drec-$temp; $i++)
{
t_print "<tr height=\"24\">";
for (my $j=0; $j<$numcol; $j++) {t_print "<td> </td>";}
t_print "</tr>";
}
# Сохраняем выделенные элементы при перелистывании
my $num_of_hiddens=0;
if ($FORM{'select_all'})
{
for ($i=0; $i<scalar(@studs); $i++)
{
if (!inlist("$kinfo_ids[$ind[$i]]", @list)) {$Hidden{'chk-'.$kinfo_ids[$ind[$i]]}="checked"; $num_of_hiddens++;}
}
}
elsif (!($FORM{'old_group'} ne $FORM{'group'})&&(!$FORM{'deselect'})&&($FORM{'filter_p'}))
{
foreach (keys %FORM)
{
if ($_ =~ m/^chk-(.+)$/)
{
if ($FORM{$_} eq "no") {$FORM{$_}="checked";}
if (!inlist("$1", @list)) {$Hidden{$_}="checked"; $num_of_hiddens++;}
}
}
}
if ($num_of_hiddens!=0) {$num_of_hiddens=", не показано выбранных записей: $num_of_hiddens";}else {$num_of_hiddens=""}
nav_bars(7, "<b>$viewed$num_of_hiddens</b>"); # set number of columns! # Панель навигации
t_print "</table>";
if ($FORM{'max_duration'} eq "") {$FORM{'max_duration'}=7};
t_print "<b>Число дней, отведённое на проверку: </b><input name='max_duration' type='text' value='$FORM{max_duration}' size='2'>";
CodeHiddens();
t_print qq(
<br>
<input type="hidden" name="hidden" value="$hidden">
<input type="submit" name="view" value="Создать документ">
);
if (!$FORM{'filter_p'}) {t_print qq(<input type="submit" name="clear" value="Очистить дату выдачи"> );}
t_print qq(
<input type="submit" name="return" value="Назад">
</form>
);
form_bottom();
add_log("Передача работ преподавателю.");
}