Помощь - Поиск - Пользователи - Календарь
Полная версия: Файлы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Guest
Помогите!!! переделать задачу.

Вот условия:
Составить программу назначения степендиии студентам по результатам сессии
используя следующие правила.

1) Если все оценки 5 назначается повышенная степендия
2) Если все оценки 4 и 5 назначается обычная степендия
3) Еслиоцени 3 стипендия не назначается

В результате работы программы должен быть напечатат список с оценкой
и средним баллом каждого студента
Во втором списке фамилии (назначенные на повышенную и обычную стипендию)



program stude;
uses crt;
type
 student=record
         kod:byte;
         fam:string[20];
         im:string[10];
         ot:string[15];
         gr:string[6];
         kurs:byte;
         m:array[1..5] of byte;
  end;
var
m:array[1..5] of byte;
ysp:integer;
i:byte;
fstud:file of student;
rab:student;
flag:boolean;
fio:string[25];
key:0..4;
procedure vvod; {Ввод данных с клавиатуры}
begin
clrscr;
with rab do
begin
 write('Фамилия:     ');
 readln(fam);
 if fam='9999' then exit;
 write('Имя:         ');
 readln(im);
 write('Отчество:   ');
 readln(ot);
 write('Группа:      ');
 readln(gr);
 write('Курс:        ');
 readln(kurs);
 write('Успеваемость: ');
 readln(m[1],m[2],m[3],m[4],m[5]);
 kod:=i;
 end  {with}
 end; {vvod}
 procedure vivod; {Ввывод на экран­}
 begin
 with rab do
  begin
   fio:=fam+' '+im[1]+' '+ot[1]+' ';
   write(kod:4,fio:18);
   writeln(gr:8,kurs:8,m[1]:8,m[2]:2,m[3]:2,m[4]:2,m[5]:2);
   end
  end;
  procedure form; {формировать массив}
  begin
  rewrite(fstud);
  i:=1;
  vvod;
  while rab.fam<>'9999' do
  begin
  write(fstud,rab);
  i:=i+1;
  vvod
  end;
  close(fstud)
  end;
  procedure print; {Печать}
  begin
  reset(fstud);
  writeln('-----------------------------------------------------------------------------------');
  writeln('I  №  I      Фио      I  Группа   I  Курс  I  Успеваемость  I   Степендия I Ср. бал');
  writeln('-----------------------------------------------------------------------------------');
  while not eof (fstud) do
  begin
  read(fstud,rab);
  vivod
   end ;
  writeln('-----------------------------------------------------------------------------------');
  readkey;
  close(fstud)
  end;
   procedure print2; {Печать}
  begin
  reset(fstud);
  writeln('------------------------------------------------------------');
  writeln('I  Повышенная степендия         I         Обычная степендия ');
  writeln('------------------------------------------------------------');
  while not eof (fstud) do
  begin
  read(fstud,rab);
  with rab do
   if (m[1]=2)or(m[2]=2)or(m[3]=2)or(m[4]=2)or(m[5]=2)then vivod;
   end ;
  writeln('------------------------------------------------------------');
  readkey;
  close(fstud)
  end;
  begin
  flag:=false;
  assign(fstud,'Студенты');
   repeat
  clrscr;
  writeln('Выберите пункт меню');
  writeln;
  writeln('1-Формировать массив');
  writeln('2-Печать всего массива');
  writeln('3-Печать на повышен. и обычн. степендию');
  writeln('0-выход');
  readln(key);
   case key of
    1:form;
    2:print;
    3:print2;
    0:flag:=true
    end;
  until flag;
  end.

klem4
А что конкретно не работает ?
Guest
Этот код который я дал записывает такие данные

Фамилия
Имя
Отчество
Группа
Курс
Успеваемость

Затем Выводит всех студентов и Всех доишников

Мне нужно чтобы она еще
находила среднюю оценку и какая будет степендия
Затем выводила всех студентов и студентов с повышенной и обычной степендией.
klem4
один из вариантов :

в запись добавляешь например такую штуку
Level : 0..3;

потом, когда начинаешь вводить данные по дефолту ставь всем

students[i].Level:=3;


после того, как ввел оценки делаешь так :

i:=1;
while(i<=5) do
 with ...[i] do begin
     if m[i]=4 then level:=2
       else if m[i]=3 then
         level:=1
       else
        if m[i]=2 then level:=0;
     if level=0 then break
      else inc(i);
 end;


ну а потом уже когда будешь выводить можешь вибирать у кого лавел=3 тот отличник, у кого 2 хорошист и у кого 1 - троечник, у кого 0 - отчислен.
volvo
klem4 blink.gif
function min(a, b: integer): integer;
begin 
  min := b; if a < b then min := a;
end;

...
with rab do
  for i := 1 to 5 do
    level := min(level, m[i] - 2);

Далее - по твоему тексту... Не проще?
Guest

program stude;
uses crt;
type
student=record
kod:byte;
fam:string[20];
im:string[10];
ot:string[15];
gr:string[6];
kurs:byte;
m:array[1..5] of byte;
end;
var
m:array[1..5] of byte;
ysp:integer;
i:byte;
fstud:file of student;
rab:student;
flag:boolean;
fio:string[25];
key:0..4;,
Level : 0..3;
procedure vvod; {Ввод данных с клавиатуры}
begin
clrscr;
with rab do
begin
write('Фамилия:     ');
students[i].Level:=3;
readln(fam);
if fam='9999' then exit;
write('Имя:         ');
students[i].Level:=3;
readln(im);
write('Отчество:   ');
students[i].Level:=3;
readln(ot);
write('Группа:      ');
students[i].Level:=3;
readln(gr);
write('Курс:        ');
students[i].Level:=3;
readln(kurs);
write('Успеваемость: ');
students[i].Level:=3;
readln(m[1],m[2],m[3],m[4],m[5]);

i:=1;
while(i<=5) do
with ...[i] do begin
if m[i]=4 then level:=2
else if m[i]=3 then
level:=1
else
if m[i]=2 then level:=0;
if level=0 then break
else inc(i);
 end;

 kod:=i;
 end  {with}
 end; {vvod}
 procedure vivod; {Ввывод на экран}
 begin
 with rab do
  begin
   fio:=fam+' '+im[1]+' '+ot[1]+' ';
   write(kod:4,fio:18);
   writeln(gr:8,kurs:8,m[1]:8,m[2]:2,m[3]:2,m[4]:2,m[5]:2);
   end
  end;
  procedure form; {формировать массив}
  begin
  rewrite(fstud);
  i:=1;
  vvod;
  while rab.fam<>'9999' do
  begin
  write(fstud,rab);
  i:=i+1;
  vvod
  end;
  close(fstud)
  end;
  procedure print; {Печать}
  begin
  reset(fstud);
  writeln('-----------------------------------------------------------------------------------');
  writeln('I  №  I      Фио      I  Группа   I  Курс  I  Успеваемость  I   Степендия I Ср. бал');
  writeln('-----------------------------------------------------------------------------------');
  while not eof (fstud) do
  begin
  read(fstud,rab);
  vivod
   end ;
  writeln('-----------------------------------------------------------------------------------');
  readkey;
  close(fstud)
  end;
   procedure print2; {Печать}
  begin
  reset(fstud);
  writeln('------------------------------------------------------------');
  writeln('I  Повышенная степендия         I         Обычная степендия ');
  writeln('------------------------------------------------------------');
  while not eof (fstud) do
  begin
  read(fstud,rab);
  with rab do
   if (m[1]=2)or(m[2]=2)or(m[3]=2)or(m[4]=2)or(m[5]=2)then vivod;
   end ;
  writeln('------------------------------------------------------------');
  readkey;
  close(fstud)
  end;
  begin
  flag:=false;
  assign(fstud,'Студенты');
   repeat
  clrscr;
  writeln('Выберите пункт меню');
  writeln;
  writeln('1-Формировать массив');
  writeln('2-Печать всего массива');
  writeln('3-Печать на повышен. и обычн. степендию');
  writeln('0-выход');
  readln(key);
   case key of
    1:form;
    2:print;
    3:print2;
    0:flag:=true
    end;
  until flag;
  end.


Так? че-то не прет...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.