Задача по егэ (паскаль)

Рейтинг: -1Ответов: 1Опубликовано: 04.05.2011

Готовясь к экзамену по информатике (егэ). Мне попалась такая задача:

На вход программе подаются сведения о сотрудниках некоторой организации. В первой строке сообщается количество сотрудников 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.

ответьте пожалуйста: правильное решение?

Ответы

▲ 2Принят

Начнем с того, почему у вас функция val имеет только два параметра, когда их там три?

Преобразовывает строковое значение в его числовое представление.

Объявление: Procedure Val(S; Var V; Var Code : Integer); Где: S - переменная со строковым типом. Должна представлять последовательность символов, формирующих знаковое целое число. V - переменная типа Real или Integer Code - переменная типа Integer

Режим: Windows, Protected, Real

Замечания: Преобразовывает строковое значение (S) в его числовое представление, как это происходит при чтении из текстового файла с помощью Read. Code - позиция, в которой произошла ошибка при преобразовании, или нуль, если ошибки не было.

Во-вторых типа Integer (в 16-ти битной системе это всего лишь 2^16-1 = 32767) не достаточно для вашей задачи, используйте для зарплаты тип Longint.

Проверил программу, работает замечательно. Хотя, вы должны понимать, если структура файла будет ложная, тогда у вас будут ошибки.