Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Pascal] Программа "Театр"


Автор: Прога 27.10.2006, 17:45
Значит условие таково:
В театре N мест.Некоторые зрители опоздали, поэтому те зрители, которые сидели на неудобных местах пресели на места опоздавших.Затем пришли опоздавшие, и сели на на свободные места.На антракте 1 зритель решил пересесьть на своё место, если его место было занято, то тот кто там сидел пересаживался на своё и тд. Необходимо подсчитать сколько людей в результате были вынужденны поменять своё место, включая человека, инициировающего процесс.
Входные данные:
N-кол-во мест в зале(например:10).
Последовательность N целых чисел, если место свободно, то в последовательности записывается число 0(Например:0253400000).
Номер билета у человека которые первый решил занять свое место(например:4).
Выходные данные:
КОЛ-ВО ЧЕЛОВЕК, ПОМЕНЯВШИХ СВОИ МЕСТА(Например:3)
Подскажите как решить?ПОЖАЛУЙСТА!!!.

Автор: Snowy 27.10.2006, 17:55
Модератор: Перенесено из паскаля!
Просьба свои задачи размещать в Центре помощи!

Автор: darkart 27.10.2006, 21:32
Простейший случай, известна вместимость зала(не более MAX_SIZE):
Код

program Theatre;
const
  MAX_SIZE=100;{вместимость зала}
type
  TArr=array[1..MAX_SIZE] of integer;{массив мест}
procedure InputArray(var Arr:TArr;n:integer);{процедура ввода информации о занятых местах}
var
  i:integer;{i - счетчик}
begin
  for i:=1 to n-1 do
    read(Arr[i]);{читаем очередной элемент массива}
  readln(Arr[n]);{читаем последний элемент и переводим курсор на новую стороку}
end;
procedure PrintArray(var Arr:TArr;n:integer);{процедура печати информации о занятых местах}
var
  i:integer;
begin
  for i:=1 to n-1 do
    write(Arr[i], ' ');{печать очередного элемента}
   writeln(Arr[n]);{печать последнего элемента с переводом курсора на новую строку}
end;
function GetResult(var Arr:TArr;Ticket:integer):integer;{рекурсивная функция получения результата - кол-во пересаживаний}
var
  tmp:integer;{вспомогательная переменная}
begin
  if Arr[Ticket]=Ticket then{если зритель с билетом сидит на своем месте}
    GetResult:=0
  else
    if Arr[Ticket]=0 then{если место зрителя не занято}
      GetResult:=1
    else
    begin
      tmp:=Arr[Ticket];{запоминаем сидящего на месте зрителя с билетом Ticket}
      Arr[Ticket]:=Ticket;{сажаем зрителя на его место}
      GetResult:=1+GetResult(Arr,tmp);{выполняем процесс для нового зрителя}
    end;
end;
var
  n,Ticket:integer;{n - кол-во мест в зале, Ticket - номер билета зрителя, захотевшего пересесть}
  Arr:TArr;{массив информации о заполнении мест}
begin
  writeln('Please enter N:');
  readln(n);{ввод n}
  writeln('Please enter a numbers of tickets:');
  InputArray(Arr,n);{ввод данных}
  writeln('Source array:');
  PrintArray(Arr,n);{печать исходных данных}
  writeln('Please enter a ticket number:');
  readln(Ticket);{читаем номер билета "беспокойного" зрителя}
  writeln('Result=',GetResult(Arr,Ticket));{печать результата}
  readln;
end.

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