Страница 1 из 1

Задача на типизированный файл

Добавлено: 08 май 2009, 15:19
Dimak123
Помогите довести до ума задачу в Delphi, Плиз!

Программа работает, но не создает типизированный файл..

Записать в типизированный файл данные о 16 сотрудниках фирмы: фамилия, возраст и отношение к воинской службе (военнообязанный или нет). Определить:
- Фамилию самого младшего по возрасту человека среди военнообязанных (считать, что такой есть и он единственный);
-Фамилию самых старших по возрасту людей среди военнообязанных и среди невоеннообязанных (считать, что такие есть и они единственные в своей группе).
program Project2;

Код: Выделить всё

{$APPTYPE CONSOLE}
const
    MAX_EMPLOYEE_COUNT = 16;
type
    Employee = record
        surname: string[30];
        age: integer;
        trooper: boolean;    trooper2: boolean;
    end;
var    f:file of Employee;
j:integer;
c:integer;
    employees: array[1..MAX_EMPLOYEE_COUNT] of Employee;
    empCount: integer;
procedure sozdat;
begin
rewrite(f);
close(f);
end;

 
procedure InitEmployee;
var
    i: integer;
    bool: integer;
begin

    Write('Enter employees count: '); readln(empCount);
    if empCount > MAX_EMPLOYEE_COUNT then begin
        WriteLn('Error max count ', MAX_EMPLOYEE_COUNT);
        ReadLn;
        Halt(1)
    end;
    for i := 1 to empCount do begin
        WriteLn(i,':');
        Write('Surname: ');               ReadLn(employees[i].surname);
        Write('Age: ');                   ReadLn(employees[i].age);
        Write('Trooper 1-true, 0-false'); ReadLn(bool);
        if bool = 1 then employees[i].trooper := true
        else employees[i].trooper := false;

         if bool = 1 then employees[i].trooper2 := false
        else employees[i].trooper2 :=true ;
    end;
    WriteLn('Input data success!');
    ReadLn;
end;

procedure FindMinAge;
var
    minAge: integer;
    i: integer;
begin
    for i := 1 to empCount do begin
        if employees[i].trooper then begin
            minAge:= i
           
        end;
    end;
    for i := 1 to empCount do begin
        if (employees[i].trooper) and (employees[i].age < employees[minAge].age) then begin
            minAge := i
        end;
    end;
    WriteLn(employees[minAge].surname,' ', employees[minAge].age,' ', employees[minAge].trooper);
    ReadLn;
end;
procedure FindMaxAge;

var
    maxAge: integer;
    i: integer;
begin
    for i := 1 to empCount do begin
        if employees[i].trooper then begin
            maxAge:= i

        end;
    end;
    for i := 1 to empCount do begin
        if (employees[i].trooper) and (employees[i].age > employees[maxAge].age) then begin
            maxAge := i
        end;
    end;
    WriteLn(employees[maxAge].surname,' ', employees[maxAge].age,' ', employees[maxAge].trooper);
    ReadLn;
end;
 procedure FindMaxAgeF;
var
    maxAgeF: integer;
    i: integer;
begin
    for i := 1 to empCount do begin
        if employees[i].trooper2 then begin
            maxAgeF:= i

        end;
    end;
    for i := 1 to empCount do begin
        if (employees[i].trooper2) and (employees[i].age > employees[maxAgeF].age) then begin
            maxAgeF := i
        end;
    end;
    WriteLn(employees[maxAgeF].surname,' ', employees[maxAgeF].age,' ', employees[maxAgeF].trooper2);

    ReadLn;
end;
begin
    InitEmployee;
    FindMinAge;
    FindMaxAge;
    FindMaxAgeF
end.

Re: Задача на типизированный файл

Добавлено: 11 май 2009, 10:26
dr.Jekill
Переделай процедуру sozdat. Надо сначала связать файловую переменную с файлом на диске через процедуру assign и не закрывай файл до того как не запишешь данные.

Re: Задача на типизированный файл

Добавлено: 11 май 2009, 22:52
Хыиуду
Программа очень неоптимальная.

Код: Выделить всё

    for i := 1 to empCount do begin
        if employees[i].trooper then begin
            maxAge:= i

        end;
Ну и зачем это? Найти последнего по списку военнообязанного? К тому же вы не находите самого молодого военнообязанного. А поле trooper2 вообще не нужно.
Все поиски можно провести в одном цикле

Код: Выделить всё

minagearmy:=1;
maxagearmy:=1;
maxagepacific:=1;
for i := 1 to empCount do begin
  if ((employees[i].trooper) and (employees[i].age > employees[maxagearmy].age)) or (employees[i].trooper>employees[maxagearmy].trooper)
     them maxagearmy:=i;
  if ((employees[i].trooper) and (employees[i].age < employees[minagearmy].age)) or (employees[i].trooper>employees[minagearmy].trooper)
     then minagearmy:=i;
  if ((not employees[i].trooper) and (employees[i].age > employees[maxagepacific].age)) or (employees[i].trooper<employees[maxagepacific].trooper)
    then maxagepacific:=i;
end;

Re: Задача на типизированный файл

Добавлено: 12 май 2009, 17:08
Dimak123
Спасибо. Теперь у меня не добавляется информация о сотрудниках в типизированный файл (Не распознается переменная с массивом (employees) в операторе READ(f,employees).).

Подскажите как это исправить?

Re: Задача на типизированный файл

Добавлено: 15 май 2009, 02:49
dr.Jekill
Выложи код