Задача по егэ (паскаль)
Готовясь к экзамену по информатике (егэ). Мне попалась такая задача:
На вход программе подаются сведения о сотрудниках некоторой организации. В первой строке сообщается количество сотрудников N, которое не меньше 5, но не превосходит 1000, каждая из следующих N строк имеет следующий формат:
<Фамилия> <Должность> <Стаж> <Оклад> <Премия>,где:
<Фамилия> - строка, состоящая не более чем из 20 символов;
<Должность> - строка, состоящая не более чем из 15 символов;
<Стаж> <Оклад> <Премия> - целые числа.Под стажем понимается количество полных лет, отработанных сотрудником в данной организации. Оклад и премия - целые числа, не превышающие 1 000 000. Эти элементы входной строки отделены друг от друга одним пробелом. Пример входной строки:
Иванов механик 15 25500 5000
Требуется написать программу, которая будет выводить на экран фамилии, должности и стаж трёх сотрудников с наибольшей зарплатой. Если среди остальных есть сотрудники, с такой же зарплатой, что и один из этих трёх, то следует также вывести и их фамилии, должности и стаж. Зарплата сотрудника равна сумме его оклада и премии.
Решаю задачу на Паскале (других языков не знаю). Работаю по следующему принципу: считываю строки в цикле от 1 до N. Затем в процедуре Disturb разбиваю эти строки на соответствующие ячейки массивов. Процедура работает - проверял. Когда n равно 1, 2 всё нормально. Когда n=3 и больше программа прекращает своё выполнение с ошибкой №201. К чему я не так обращаюсь? Просьба не переделывать мой ход решения.
Var
data, name, dol: Array[1..1000] of String;
sta, zar: Array[1..1000] of Integer;
n, i, j, max1, max2, max3, index: Integer;
Procedure Disturb;
Var
t: string;
t1, t2: Integer;
Begin
index := pos(' ', data[i]);
name[i] := copy(data[i], 1, index-1);
Delete(data[i], 1, index);
index := pos(' ', data[i]);
dol[i] := copy(data[i], 1, index-1);
Delete(data[i], 1, index);
index := pos(' ', data[i]);
t := copy(data[i], 1, index-1);
Val(t, sta[i]);
Delete(data[i], 1, index);
index := pos(' ', data[i]);
t := copy(data[i], 1, index-1);
Val(t, t1);
Delete(data[i], 1, index);
t := copy(data[i], 1, Length(data[i]));
Val(t, t2);
zar[i] := t1+t2;
End;
Begin
Readln(n);
For i := 1 to n do
Readln(data[i]);
For i := 1 to n do
Begin
Disturb;
End;
max1 := 0;
max2 := 0;
max3 := 0;
End.
Почему ошибку выдает? Где я обращаюсь не несуществующей ячейке или что не так?
доделал программу. вот финальный вариант:
Var
data, name, dol: Array[1..1000] of String;
sta, zar: Array[1..1000] of LongInt;
n, i, j, max1, max2, max3, index: LongInt;
Procedure Disturb;
Var
t: string;
t1, t2, err: LongInt;
Begin
index := pos(' ', data[i]);
name[i] := copy(data[i], 1, index-1);
Delete(data[i], 1, index);
index := pos(' ', data[i]);
dol[i] := copy(data[i], 1, index-1);
Delete(data[i], 1, index);
index := pos(' ', data[i]);
t := copy(data[i], 1, index-1);
Val(t, sta[i], err);
Delete(data[i], 1, index);
index := pos(' ', data[i]);
t := copy(data[i], 1, index-1);
Val(t, t1, err);
Delete(data[i], 1, index);
t := copy(data[i], 1, Length(data[i]));
Val(t, t2, err);
zar[i] := t1+t2;
End;
Begin
Readln(n);
For i := 1 to n do
Readln(data[i]);
For i := 1 to n do
Disturb;
max1 := 0;
max2 := 0;
max3 := 0;
for i := 1 to n do
if (max1 < zar[i]) then
max1:=zar[i];
for i := 1 to n do
if ((max2 < zar[i]) and (zar[i] < max1)) then
max2 := zar[i];
for i := 1 to n do
if ((max3 <zar[i]) and (zar[i] < max2)) then
max3 := zar[i];
for i := 1 to n do
if (zar[i] = max1) then
writeln(name[i], ' ', dol[i], ' ', sta[i]);
for i := 1 to n do
if (zar[i] = max2) then
writeln(name[i], ' ', dol[i], ' ', sta[i]);
for i := 1 to n do
if (zar[i] = max3) then
writeln(name[i], ' ', dol[i], ' ', sta[i]);
Readln;
End.
ответьте пожалуйста: правильное решение?