i,j,k,l,kol_dvoek,v,kgr,n:integer;
md:mo; ch:char;
predmet:string; kst:array[1..6] of byte;
procedure rea_ocenki(fio:string;Var oc:mo);
Var i:integer;
begin
for i:=1 to 5 do
Begin
case i of
1:predmet:='основы информатики';
2:predmet:='высшей математике';
3:predmet:='философии';
4:predmet:='архитектуре ЭВМ';
5:predmet:='истории Украины'; end;
writeln('введите оценку студента ',fio,' no ',predmet);
M1: readln(oc[i,1]);
if (oc[i,1]<2) or (oc[i,1]>5) then
Begin writeln('введите правильно оценку'); goto M1; end;
if oc[i,1]>2 then Begin oc[i,2]:=0; oc[i,3]:=0; goto M4; end else
M2: writeln('введите вторую оценку студента ',fio,' по ',predmet);
readln(oc[i,2]);
if (oc[i,2]<2) or (oc[i,2]>5) then
Begin writeln('введите правильно оценку'); goto M2; end;
if oc[i,2]>2 then begin oc[i,3]:=0; goto M4; end else
M3: Writeln('введите третью оценку студента ',fio,' по ',predmet);
readln(oc[i,3]);
if (oc[i,3]<2) or (oc[i,3]>5) then
begin writeln('введите правильно оценку'); goto M3; end;
M4: end; end;
BEGIN { начало блока ввода оценок студентов}
writeln('при вводе оценки набираются: 5, если экзамен');
writeln('сдан на 5 и, если были пересдачи, то 2,2,3 ');
z: writeln('до первой положительной оценки');
writeln('задайте количество групп, не более 6 ');
readln(kgr);
for i:=1 to kgr do { установка индекса группы }
begin case i of { определяем группу по i }
1:n:=610;
2:n:=611;
3:n:=612;
4:n:=613;
5:n:=614;
6:n:=615;
else writeln('неправильно задано количество групп'); goto 2; end; end;
writeln('задайте количество студентов в группе ',n);
readln(kst[i]);
for j:=1 to kst[i] do { установка номера студента i в группе }
begin with gr[i,j] do { работать без составных имен }
begin namb:=n; writeln('введите фамилию ',j,' студента гр. ',namb);
readln(fio);
for k:=1 to 5 do { обнуляем массив оценок }
for l:=1 to 3 do
o[k,l]:=0;
writeln('введите оценки студентов ',fio);
rea_ocenki(fio,o); end;end;end;
{ конец ввода оценок студентов }
{ отображение на экране введения оценок }
for i:=1 to kgr do
for j:=1 to kst[i] do
Begin with gr[i,j] do
Begin for k:=1 to 5 do
write(o[k,1],o[k,2],o[k,3],' '); writeln; end; end;
{ конец вывода на экран оценок }
{ начало блока анализа успеваемости студентов }
for i:=1 to kgr do { индекс группы }
for j:=1 to kst[i] do { номер студента }
Begin kol_dvoek:=0; v:=0; { работать без составных имен }
with gr[i,j] do
for k:=1 to 5 do { номер предмета }
{ итак, анализируем состояние успеваемости студента, информация }
{ о котором хранится в записи gr[i,j]; так как мы работаем под уп-}
{равлением оператора with gr[i,j], то можно пользоваться не }
{ составными именами полей }
case k of { определить название предмета j }
2:predmet:='высшая математика ';
3:predmet:='философия';
4:predmet:='архитектура ЭВМ';
5:predmet:='история Украины'; end;
if o[k,1]=2 then if o[k,2]=2 then if o[k,3]=2 then begin
writeln('студент ',fio,' группы ', namb,' подлежит отчислению так как');
writeln('имеет три двойки по предмету ',predmet);
v:=1; readln; goto w; end { на новый предмет }
else Begin kol_dvoek:=kol_dvoek+2; goto w; end
else Begin kol_dvoek:=kol_dvoek+1; goto w; end;
w: end;
if v=1 then goto u { к новому студенту }
else if kol_dvoek=0 then goto u
else Begin
writeln('студент ',fio,' группы ',namb,' является разгильдяем так как');
writeln('имеет в зимнюю сессию ',kol_dvoek,' двоек и является');
writeln('кандидатом на отчисление в весеннем семестре');
readln; end; end;
u: end; END.
Программа снабжена комментариями, поэтому при внимательном рассмотрении читается легко. Трудности могут возникнуть при разборе блока анализа результатов, поэтому мы приведем блок-схему логической части этого блока (рис. 9.1).
9.1. Комплексные данные
При работе с комплексными данными удобно пользоваться записями с двумя полями, первое содержит информацию о действительной части данного, а второе – о мнимой части данного.
Program Prim45;
Type complex=record
deistv:real; mnim:real;
end;
Var a,b,c:complex;
BEGIN
a.deistv:=6.3;
a.mnim:=1.9; END.
Рис. 9.1
9.2. Запись с вариантами
Записи, описанные выше, имеют строго определенную структуру. однако есть возможность создавать записи, имеющие несколько вариантов одного и того же поля. Вариантные поля записываются после описания безвариантных полей с помощью оператора Case.
ТУРЕ
zap=record
описание безвариантных полей;
Case имя поля: тип имени поля of
список констант выбора: (поле,... тип); ...
список констант выбора: (поле,... тип);
Пример:
Туре zap=record
Nomer: byte; {фиксированные поля}
Articul: integer;
Case Flag: boolean of {вариантные поля}
TRUE: (cena l: integer);
FALSE: (cena 2; real);
Var P, Si Zap;
поле Cena l доступно только тогда, когда Flag=TRUE
поле Cena 2 доступно только тогда, когда Flag=FALSE
При использовании записей с вариантами необходимо придерживаться следующих правил:
- все имена полей должны отличаться друг от друга, даже если они встречаются в различных вариантах;
- запись может иметь только одну вариантную часть, причем вариантная часть должна размещаться в конце её;
Страницы: 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