Показать сообщение отдельно
Старый 20.03.2012, 20:57   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Ильгиза, во-первых, подобных задач на нашем форуме рассмотрено море, и все они решаются через массивы, но не простые, а массивы записей. Могли бы и поискать самостоятельно. Во-вторых, Ваша программа... ну, неряшливая, что ли. Ведь для чего вводятся константы? А для того, чтобы при необходимости их значение можно было бы заменить, и при этом программа работала бы по-прежнему. А у Вас? Задаете число предметов в виде константы (d=3) и тут же в теле программы используете это количество в явном виде. Ну что это такое:
s:=(n1+n2+n3)/d;
А если я поменяю значение d на, например, 5 - что будет? Ответ: ахинея. Отвыкайте от подобных подходов, для программиста они недопустимы.
Вот работающий код. Обе задачи там "в одном флаконе":
Код:
Const
 d=3;
Type
 stud=record
       FIO:string;
       Mark:Array[1..d] of Byte;
       Mark_med:real;
      end;
Var
 st:Array[1..20] of stud;
 stdm:stud;
 t1,t2,t3:text;
 i,j,Nst,Nbest,n,code:integer;
 Ch:Char;
 Mark_med_gr:real;
Begin
 assign(t1,'file.txt');
 reset(t1);
 assign(t2,'file2.txt');
 rewrite(t2);
 assign(t3,'file3.txt');
 rewrite(t3);
 Nst:=0;
 Mark_med_gr:=0;
 while not eof(t1) do
  begin
   Inc(Nst);
   with st[Nst] do
    begin
     FIO:='';
     repeat
      read(t1,Ch);
      val(Ch,n,code);
      If code<>0 then FIO:=FIO+Ch else Mark[1]:=n;
     until code=0;
     for i:=2 to d do read(t1,Mark[i]);
     readln(t1);
     Mark_med:=0;
     for i:=1 to d do
      begin
       Mark_med:=Mark_med+Mark[i]/d;
       Mark_med_gr:=Mark_med_gr+Mark[i];
      end;
    end;
  end;
 Close(t1);
 Mark_med_gr:=Mark_med_gr/(Nst*d);
 Writeln('Group medium mark: ',Mark_med_gr:4:2);
 Writeln('Students whose medium mark is higher then group one:');
 Nbest:=0;
 For i:=1 to Nst do
  with St[i] do
   If Mark_med>Mark_med_gr then
    begin
     Inc(Nbest);
     write(t2,FIO);
     for j:=1 to d do
      write(t2,Mark[j]:2);
     writeln(t2,Mark_med:5:2);
     write(FIO);
     for j:=1 to d do
      write(Mark[j]:2);
     writeln(Mark_med:5:2);
    end;
 Close(t2);
 Writeln('Number of such students ',Nbest);
 Writeln;
 Writeln('Sorted list of sudents:');
 For i:=1 to Nst do
  For j:=1 to Nst-i do
   If St[j].Mark_med<St[j+1].Mark_med then
    begin
     Stdm:=St[j];
     St[j]:=St[j+1];
     St[j+1]:=Stdm;
    end;
 For i:=1 to Nst do
  with St[i] do
   begin
    write(t3,FIO);
    for j:=1 to d do
     write(t3,Mark[j]:2);
    writeln(t3,Mark_med:5:2);
    write(FIO);
    for j:=1 to d do
     write(Mark[j]:2);
    writeln(Mark_med:5:2);
   end;
 Close(t3);
 Readln
End.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070