Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 20.03.2012, 16:56   #1 (permalink)
Ильгиза
Member
 
Регистрация: 08.10.2011
Сообщений: 49
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Паскаль, проблема с файлами

Здравствуйте!
Помогите пожалуйста разобраться с задачей.
Дан текстовый файл, содержащий сведения о студентах:фамилия ,имя и три оценки; необходимо вычислить средний балл всей группы за сессию и средний балл каждого студента ,создать новый файл и записать туда информацию о студентах у которых средний балл выше среднего балла всей группы.

сделала так, но проблемы с циклом .(программа должна быть сделана именно по этому алгоритму)
program upr1;
const d=3;
var st:string;
t1,t2:text;
k,a:integer;
f,i,o1,o2,o3:string;
s,sb:real;
n1,n2,n3,code:integer;
begin
assign(t1,'file.txt');
reset(t1);
assign(t2,'file2.txt');
rewrite(t2);
k:=0;
sb:=0;
while not eof(t1) do begin
readln(t1,st);
a:=pos(' ',st);
f:=copy(st,1,a-1);
delete(st,1,a);
a:=pos(' ',st);
i:=copy(st,1,a-1);
delete(st,1,a);
o1:=st[1];
o2:=st[3];
o3:=st[5];
val(o1,n1,code);
val(o2,n2,code);
val(o3,n3,code);
s:=(n1+n2+n3)/d;
sb:=sb+s;
if s>sb/n then
begin
k:=k+1;
writeln(t2,k,'.',' ',f,' ',i,' ',o1,' ',o2,' ',o3);
end;
end;
close(t1);
close(t2);
reset(t2);
writeln('студенты , у котрорых средний балл выше среднего балла группы');
while not eof(t2) do begin
readln(t2,st);
writeln(st);
end;
writeln('количество таких студентов ',k);
close(t2);
end.

вот исходный файл.
Иванов Иван 5 5 5
Иванова Иарина 4 4 4
Сидоров Максим 3 2 4
Сидорова Ирина 4 5 4
Мишкина Мария 5 4 3


а также необходимо составить другую программу, по такому же исходному файлу , сформировать новый файл
, записав в него информацию о студентах, отсортированную в порядке уменьшения среднего балла за сессию. при этом средний балл каждого студента так же записать в текстовый файл. нужно использовать массив.


с алгоритмами сортировки знакома, но никак не пойму как связать программу с массивами.

Заранее благодарю!!!
Ильгиза вне форума   Ответить с цитированием

Старый 20.03.2012, 16:56
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

На форуме люди обсуждали что то схожее, посмотрите

Проблема с торрент- файлами
Паскаль. Задача с файлами, помогите пожалуйста
Паскаль, работа с файлами
Проблема с файлами
Проблема с файлами с расширением ЕХЕ

Старый 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
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 07:53.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.