Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Задача. Записи+Файлы


Автор: GreMail 13.9.2009, 19:31
Собственно задача:
Известнф фамилии и оценки по трем предметам каждого ученика класса (в классе 10 учеников). Данные записаны в файл в виде: Ivanov 532...
Вычислить сумму баллов и вывести фамилии людей с максимальным суммой баллов.
начало программы:
Код

type
 rec=record
 fio:string[15]; 
 b1,b2,b3,b0:byte;
 end;
var
 F:text;
 a,b,c:rec;
 i,n:integer;
 name: string;
 M: array [1..10] of rec;
begin
 read(name);
 assign(F,name);
 reset(F);


И дальше ступор... как сделать так, чтобы он читал fio как тот же Ivanov а b1,b2,b3 - 5 3 и 2 соответственно, а не Fio первого ученика как весь файл целиком?

Автор: ФедосеевПавел 13.9.2009, 22:56
Я так полагаю, что исходные данные по ученикам находятся в текстовом файле. Т.к. специально не оговаривается, то можно сделать допущение, что данные на каждого ученика находятся на отдельной строке, на фамилии отводится фиксированное количество символов, а далее идут символы оценок без пробелов.
Код

Ivanov    543
Petrov    234
Sidorov   443
Malvina   554
Booratino 333
Pierro    344

Тогда читать данных можно так
Код

PROGRAM TextBase;
CONST
  FileName = 'Scoolers.txt';
  LenFIO   = 10;        {длина поля fFIO}
TYPE
  TRec = RECORD         {тип формата одной строки в файле с данными}
    fFIO : String[LenFIO];
    fB1  : Char;
    fB2  : Char;
    fB3  : Char;
  END;
VAR
  f      : Text;        {файловая переменная}
  Scooler: TRec;        {данные об одном ученике (ФИО, оценки)}
  SumB   : Integer;     {сумма оценок ученика}
  SumMax : Integer;     {максимальная сумма оценок среди учеников}
  B      : Integer;     {вспомогательная переменная для процедуры Val}
  Code   : Integer;     {вспомогательная переменная для процедуры Val}
BEGIN
  SumMax:=0;
  Assign(f, FileName);
  Reset(f);
  while NOT(eof(f)) do begin
    ReadLn(f, Scooler.fFIO, Scooler.fB1, Scooler.fB2, Scooler.fB3);
    Val(Scooler.fB1, B, Code);
    SumB:=B;
    Val(Scooler.fB2, B, Code);
    SumB:=SumB+B;
    Val(Scooler.fB3, B, Code);
    SumB:=SumB+B;
    WriteLn(Scooler.fFIO, Scooler.fB1, Scooler.fB2, Scooler.fB3, ' ', SumB);
    if SumMax<SumB
    then begin
      SumMax:=SumB;
    end;
  end;
  Close(f);
  WriteLn('Максимальная сумма оценок - ', SumMax);
END.

Если бы оценки разделялись пробелом, то можно было бы упростить
Код

.....................
TYPE
  TRec = RECORD         {тип формата одной строки в файле с данными}
    fFIO : String[LenFIO];
    fB1  : Integer;
    fB2  : Integer;
    fB3  : Integer;
  END;
.......................
  while NOT(eof(f)) do begin
    ReadLn(f, Scooler.fFIO, Scooler.fB1, Scooler.fB2, Scooler.fB3);
    with Scooler do
      SumB:=fB1+fB2+fB3;
    WriteLn(Scooler.fFIO, Scooler.fB1, Scooler.fB2, Scooler.fB3, ' ', SumB);
    if SumMax<SumB
    then begin
      SumMax:=SumB;
    end;
  end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)