четверг, 4 декабря 2014 г.

11А Одна задача на обработку строк

Пример задачи (C4 прошлых лет):

        В некотором вузе абитуриенты проходили предварительное тестирование, по результатам которого они могут быть допущены к сдаче вступительных экзаменов в первом потоке. Тестирование проводится по трём предметам, по каждому предмету абитуриент может набрать от 0 100 баллов. При этом к сдаче экзаменов в первом потоке допускаются абитуриенты,
набравшие по результатам тестирования не менее 30 баллов по каждому из трёх предметов, причём сумма баллов должна быть не менее 140. На вход программы подаются сведения о результатах предварительного тестирования. Известно, что общее количество участников тестирования не превосходит 500.
В первой строке вводится количество абитуриентов, принимавших участие в тестировании, N. Далее следуют N строк, имеющих следующий формат:
<Фамилия> <Имя> <Баллы>
Здесь <Фамилия> – строка, состоящая не более чем из 20 символов; <Имя> – строка, состоящая не более чем из 15 символов, <Баллы> – строка, содержащая два целых числа, разделенных пробелом – баллы, полученные на тестировании по каждому из трёх предметов. При этом <Фамилия> и <Имя>, <Имя> и <Баллы> разделены одним пробелом. Пример входной строки:
Романов Вельямин 48 39 55

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

Возможное решение:

Var
  List : array[1..500] of string;
  name, temp : string;
  i, j, N, ball1, ball2, ball3, count : integer;
Begin
  count:=0;    {счетчик допущенных к экзамену}
  readln(N);
  for i:=1 to N do begin
    readln(temp);
    {прочитать фамилию и имя}
    name:='';
    j:=pos(' ',temp);
    name:=name+Copy(temp,1,j);
    Delete(temp,1,j);
    j:=pos(' ',temp);
    name:=name+Copy(temp,1,j-1);
    Delete(temp,1,j);
    {прочитать баллы}
    j:=pos(' ',temp);
    ball1:=StrToInt(Copy(temp,1,j-1));
    Delete(temp,1,j);
    j:=pos(' ',temp);
    ball2:=StrToInt(Copy(temp,1,j-1));
    Delete(temp,1,j);
    ball3:=StrToInt(temp);
    {если допущен, то запомнить}
    if (ball1>=30) and (ball2>=30) and (ball3>=30) and (ball1+ball2+ball3>=140) then
      begin
        count:=count+1;
        List[count]:=name;
      end;
  end;
  {сортировка по алфавиту}
  for i:=1 to count-1 do
    for j:=1  to count-i do
      if List[j]> List[j+1] then
        begin
          temp:=List[j];
          List[j]:=List[j+1];
          List[j+1]:=temp;
        end;
  {вывод списка}
  for i:=1 to count do writeln(List[i]);
End.

Комментариев нет:

Отправить комментарий