Консультация № 169286
11.06.2009, 12:22
0.00 руб.
0 9 0
Уважаемые експерты, пожалуйста помогите исправить ошибку в задаче на типизированный файл. Условие такое: начислить студентам группы Х на стипендию: студент который полочил оценки "5" за пять екзаменов, и активно участвовал в общественной работе( признак участия 0/1) зачисляется на повышенную стипендию, тоесть Стипенд*1,5, а если не участвовал в общественной работе, но получил все "5" то тогда Стипендия*1,25, СТУДЕНТЫ КОТОРЫЕ ПОЛУЧИЛИ "4" И "5" НАЧИСЛЯЕТСЯ ОБЫЧНАЯ СТЕПЕНДИЯ, СТУДЕНТ КОТОРЫЙ ПОЛУЧИЛ ОДНУ ОЦЕНКУ "3" НО АКТИВНО УЧАСТВОВАЛ В ОБЩЕСТВ. РАБОТЕ ТОЖЕ ЗАЧИСЛЯЕТСЯ НА ОБЫЧНУЮ СТИПЕНДИЮ, В ПРОТИВНОМ СЛУЧАЕ ЗАЧИСЛЕНИЕ НЕ ПРОИСХОДИТ.
ВОПРОС: в моем решении получилось что если он получил все тройки и участвовал в работе тогда зачсиляется, а как написать что если одну из пяти но не по всем , просто он мог получить оценку три по первому экзамену или с таким же успехом по второму или по третьему и т.д. вот как это указать?
И точно так же как указать что он получил "4" и "5", но он не мог получить все пятерки иначе был бы отличником , но у него может быть оценка 5 по первому екзамену а по всем остальн. 4, или по двум экзаменам 5 а по остальным четыре или т. д. ПОМОГИТЕ ПОЖАЛУЙСТА!!!

Приложение:
Procedure Poisk;
var t:Student;
n:String;
Stip:Real;
k:word;
Begin
Write('введите имя файла : ');
Readln(n);
Assign(F,n);
Reset(F);
k:=0;
Writeln('Стипендию могут получать следующие студенты: ');
while Not(Eof(f)) do
Begin
Read(f,t);
if (t.ispit1=5) and (t.ispit2=5) and (t.ispit3=5) and
(t.ispit4=5) and (t.ispit5=5) and (t.uchast=1) then
begin
Stip:=Razm_stip*1.5;
Writeln(t.index_gr:4, ' ', t.fio:30, ' ', stip:5:2);
end;
if (t.ispit1=5) and (t.ispit2=5) and (t.ispit3=5) and
(t.ispit4=5) and (t.ispit5=5) and (t.uchast=0) then
begin
Stip:=Razm_stip*1.25;
Writeln(t.index_gr:4, ' ', t.fio:30, ' ', stip:5:2);
end;
if ((t.ispit1=5) or (t.ispit1=4)) and ((t.ispit2=5) or (t.ispit2=4)) and
((t.ispit3=5) or (t.ispit3=4)) and ((t.ispit4=5) or (t.ispit4=4)) and
((t.ispit5=5) or (t.ispit5=4)) and ((t.uchast=1) or (t.uchast=0)) then
begin
Stip:=Razm_stip;
Writeln(t.index_gr:4, ' ', t.fio:30, ' ', stip:5:2);
end;
if ((t.ispit1=3) or (t.ispit2=3) or (t.ispit3=3) or (t.ispit4=3) or
(t.ispit5=3)) and (t.uchast=1) then
begin
Stip:=Razm_stip;
Writeln(t.index_gr:4, ' ', t.fio:30, ' ', stip:5:2);
end;
End;
Close(f);
End;

Обсуждение

давно
Профессор
401888
1232
11.06.2009, 13:27
общий
Ваша главная ошибка то, что Вы каждую оценку описали как поле записи и вынудили себя заниматься ненужным перебором.
Оценки должны быть объявлены как массив оценок, т.е. типа
ispit:array[1..5] of byte;
Тогда поиск нужного варианта будет легко осуществить, например
ПОЛУЧИЛ ОДНУ ОЦЕНКУ "3" НО АКТИВНО УЧАСТВОВАЛ В ОБЩЕСТВ. РАБОТЕ ТОЖЕ ЗАЧИСЛЯЕТСЯ НА ОБЫЧНУЮ СТИПЕНДИЮ.
k:=0;
for j:=1 to 5 do
if t.ispit[j]=3 then k:=k+1;
if (k=1) and(t.uchst=1)then.....
Неизвестный
11.06.2009, 16:48
общий
Пробовал переделать из этого варианта в Ваш но к сожалению не вышло... Выдает какую то ошибку вроде Type mistach
давно
Профессор
401888
1232
11.06.2009, 16:51
общий
Вместо этого
Код:
ispit1:Byte;
ispit2:Byte;
ispit3:Byte;
ispit4:Byte;
ispit5:Byte;
Всего одна строка
ispit:array[1..5] of byte;
давно
Профессор
401888
1232
11.06.2009, 17:23
общий
Код:
Writeln('Введите  5 оценок: ');
for j:=1 to 5 do
begin
write('Оценка ',j,'=');
readln(t.isp[j]);
end;
Неизвестный
11.06.2009, 18:28
общий
Спасибо первую часть исправил , работает
Код:
type Student=Record
index_gr:String;
fio:String;
ispit:array[1..5] of byte;
uchast:Byte;
j:byte;
End;
Const razm_stip=400;

Var ch:Byte;
f:File of Student;

Procedure Sozdanie;
Var t:Student;
n:String;
c:Char;
j:byte;
Begin
Write('Введите имя файла: ');
Readln(n);
Assign(F,n);
Rewrite(F);
Repeat
Write('Введите индекс группы: ');
Readln(t.index_gr);
Write('Введите ФИО студента: ');
Readln(t.fio);
Write('Введите 5 оценок: ');
for j:=1 to 5 do
begin
write('Оценка ',j,'=');
readln(t.ispit[j]);
end;
Write('Введите признак участия (1/0): ');
Readln(t.uchast);
Write(f,t);
Write('Вводить следующего студента (у/n)?: ');
Readln(c);
Until c='n';
Close(f);
End;

Procedure Prosmotr;
var t:Student;
n:String;
j:byte;
Begin
Write('Введите имя файла: ');
Readln(n);
Assign(F,n);
Reset(F);
While Not(Eof(f)) do
Begin
Read(f,t);
Writeln('Индекс группы: ', t.index_gr:4, ' ');
Writeln('ФИО студента: ', t.fio:30,' ');
for j:=1 to 5 do
begin
write('Оценка ',j,'=', t.ispit[j]:3,' ');
end;
Writeln('Участие: ', t.uchast:1,' ');
End;
Close(f);
End;

давно
Профессор
401888
1232
11.06.2009, 18:38
общий
if (t.ispit[j]=5) then k:=k+1;
if (k=1) and (t.uchast=1) then
begin
Ну а откуда у Вас j возмется? Если это массив, то и читать его надо как массив, я же Вам уже писал еще в самом начале.
k:=0;
for j:=1 to 5 do
if (t.ispit[j]=5) then k:=k+1;
if (k=1) and (t.uchast=1) then
begin
Неизвестный
11.06.2009, 19:42
общий
В этой части когда вводишь что студент получил все 5 и участвовал в работе, получается оно ему начисляет обычную степендию , я так понимаю неправильно написан пункт, там где должно быть , если получил 4 и 5, оно воспринимает это как будто все пятерки:
begin
Read(f,t);
k:=0;
for j:=1 to 5 do
if (t.ispit[j]=5) then k:=k+1;
if (k=1) and (t.uchast=1) then
begin
Stip:=Razm_stip*1.5;
Writeln(t.index_gr:4, ' ', t.fio:30, ' ', stip:5:2);
end;
k:=0;
if (t.ispit[j]=5) then k:=k+1;
if (k=1) and (t.uchast=0) then
begin
Stip:=Razm_stip*1.25;
Writeln(t.index_gr:4, ' ', t.fio:30, ' ', stip:5:2);
end;
k:=0;
if ((t.ispit[j]=5) and (t.ispit[j]=4)) then k:=k+2;
if (k=2) and ((t.uchast=1) or (t.uchast=0)) then
begin
Stip:=Razm_stip;
Writeln(t.index_gr:4, ' ', t.fio:30, ' ', stip:5:2);
end;
k:=0;
if (t.ispit[j]=3) then k:=k+3;
if (k=3) and (t.uchast=1) then
begin
Stip:=Razm_stip;
Writeln(t.index_gr:4, ' ', t.fio:30, ' ', stip:5:2);
end;
End;
давно
Профессор
401888
1232
11.06.2009, 19:46
общий
if (k=1) and (t.uchast=1) then
Везде что ли к=1? Если все пятеркиЮ то условие if k=5
Мозг на 5 минут включите. Это не платный вопрос, чтоб я с Вами весь день беседовал.
Неизвестный
11.06.2009, 20:49
общий
Спасибо Вам огромное, извините что провозились со мной целый день.
Форма ответа