Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2015, 16:52   #1
metanol
 
Регистрация: 11.05.2015
Сообщений: 6
По умолчанию

Почтальон разносит газеты по улице, состоящей из N домов. Четные и
нечетные номера расположены по разные стороны улицы. В здравом уме
почтальон не рискует лишний раз переходить её. Ваша программа должна
напечатать последовательность номеров, по которым будут разнесена почта, когда
почтальон начинает работу:
· с первого дома;
· со второго дома;
· с N-го (то есть последнего) дом

Первая.Только почему-то выводит числа больше, чем я ввел,например: 1 2 3 4 5 6 7-выводит 1 3 5 7 9 11 13 15 17
Код:
var i:integer;
    s:string;
begin
 write('Введите номера домов s:'); readln(s);
 for i:=1 to length(s) do begin
 if (s[1]='1') and (i mod 2<>0) then writeln(i);
 end;
 readln;
end.

Последний раз редактировалось Stilet; 06.08.2015 в 09:23.
metanol вне форума Ответить с цитированием
Старый 05.08.2015, 17:02   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

для начала, Вы банально неправильно поняли, что в данной задаче является ИСХОДНЫМИ данными.
на мой взгляд - вводится всего одно число N - сколько всего домов на улице.

программа должна напечатать (вывести на экран) три списка (три строки)
1-й список - с первого дома
2-й список - со второго дома;
3-й список - с последнего (N-го) дома
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.08.2015, 00:28   #3
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Тут что-то вроде этого нужно:

Код:
var N, i, tempValue:integer;
    NdivTwo:Boolean;
begin

  write('Input N: ');
  readln(N);
  if N <= 0 then exit;

  if (N mod 2) = 0 then NdivTwo := true
  else NdivTwo := false;

  writeln('------------ 1) First ------------');
  // 1, 3, 5...
  i:=1;

  while i<=N do
  begin
    write(i,' ');
    i:=i+2;
  end;

  // ...6, 4, 2
  if NdivTwo then i:=N
  else i:=N-1;

  while i>=1 do
  begin
    write(i,' ');
    i:=i-2;
  end;
  writeln;

  writeln('------------ 2) Second ------------');
  // 2, 4, 6...
  i:=2;

  while i<=N do
  begin
    write(i,' ');
    i:=i+2;
  end;

  // ...5, 3, 1
  if NdivTwo then i:=N-1
  else i:=N;

  while i>=1 do
  begin
    write(i,' ');
    i:=i-2;
  end;
  writeln;

  writeln('------------ 3) N ------------');
  // N...
  i:=N;
  while i>=1 do
  begin
    write(i,' ');
    i:=i-2;
  end;

  // ...N-1
  if NdivTwo then i:=1
  else i:=2;

  while i<=N do
  begin
    write(i,' ');
    i:=i+2;
  end;
  writeln;



  Readln;

end.
Только кода много вышло. Может можно что-то сократить?
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 06.08.2015, 01:39   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Нашел данную задачку в книжке "Песни о паскале" в теме процедуры и функции, поэтому вот такая моя реализация:
Код:
var
  N: integer;

procedure postman(k, m: integer);
var
  i: integer;
begin
  if k <= m div 2 then
  begin
    i := k;
    while i >= 1 do
    begin
      write(i, ' ');
      dec(i, 2);
    end;
    i := k + 2;
    while i <= m do
    begin
      write(i, ' ');
      inc(i, 2);
    end;
    i := m - (k + m + 1) mod 2;
    while i >= 1 do
    begin
      write(i, ' ');
      dec(i, 2);
    end;
  end
  else
  begin
    i := k;
    while i <= m do
    begin
      write(i, ' ');
      inc(i, 2);
    end;
    i := k - 2;
    while i >= 1 do
    begin
      write(i, ' ');
      dec(i, 2);
    end;
    i := 1 + k mod 2;
    while i <= m do
    begin
      write(i, ' ');
      inc(i, 2);
    end;
  end;
end;

begin
  write('Input N: ');
  readln(N);
  if N <= 0 then
    exit;
  writeln('------------ 1)  First ------------');
  postman(1, N);
  writeln;
  writeln('------------ 2) Second ------------');
  postman(2, N);
  writeln;
  writeln('------------ 3)   N    ------------');
  postman(N, N);
  writeln;
  readln;
end.
Получилось длиннее, чем вариант Krasiosoft. Идея такова: находясь около k-го дома почтальон идет в такую сторону, чтобы пришлось возвращаться обратно на меньшее количество домов, затем посещает оставшиеся дома на этой стороне, а затем уже переходит на другую сторону и обходит их. За 100% верность реализации не ручаюсь.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 06.08.2015, 01:59   #5
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Изначально тоже так хотел сделать, но потом решил, что будет проще сразу выводить то, что нам нужно в задании. BDA, я так понимаю, что Ваш вариант решения универсальный, а мой заточен только под конкретную задачу.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 06.08.2015, 02:06   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Krasiosoft, если нигде не ошибся, то да, универсальный. Вот еще такой вариант процедуры (код короче, но менее понятен, и скорость работы, скорее всего, хуже):
Код:
procedure postman2(k, m: integer);
var
  i, iter, dir: integer;
  fl: boolean;
begin
  fl := k <= m div 2;
  dir := 2 - 4 * ord(fl);
  for iter := 0 to 2 do
  begin
    i := k + ord(iter = 1) * dir + ord(iter = 2) * (-k + ord(fl) * (m - (k + m + 1) mod 2) + ord(not fl) * (1 + k mod 2));
    while (1 <= i) and (i <= m) do
    begin
      write(i, ' ');
      inc(i, dir);
    end;
    dir := -dir;
  end;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 06.08.2015 в 02:10.
BDA на форуме Ответить с цитированием
Старый 06.08.2015, 02:18   #7
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код:
    i := k + ord(iter = 1) * dir + ord(iter = 2) * (-k + ord(fl) * (m - (k + m + 1) mod 2) + ord(not fl) * (1 + k mod 2));
Очень убедительная строка

Особенно, если преподаватель спросит: "А что это?"

Но я так понимаю, что тут автор темы делает для себя, а не для преподавателя.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 06.08.2015 в 02:20.
Krasiosoft вне форума Ответить с цитированием
Старый 06.08.2015, 13:40   #8
metanol
 
Регистрация: 11.05.2015
Сообщений: 6
По умолчанию

хм..а я подумал,что это три разные программы)ну хорошо,попробую)

да,для себя)

Пожалуйста, используйте кнопочку "Правка", а не пишите несколько сообщений подряд - Модератор

Последний раз редактировалось BDA; 06.08.2015 в 15:52.
metanol вне форума Ответить с цитированием
Старый 06.08.2015, 15:57   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Krasiosoft Посмотреть сообщение
Очень убедительная строка
Что есть, то есть
metanol, может быть и разные. Но предполагаю, что автор задачи подводит вас к идее, что удобнее написать одну процедуру и потом ее использовать, а не писать несколько раз практически один и тот же код.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 06.08.2015, 16:09   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

По условию мы всегда начинаем с краю (1(2)/N)
Значит проходим по СВОЕЙ стороне (odd(i) =odd(?) в нужную сторону (вперед/назад)
ПЕРЕХОДИМ улицу на несвою сторону (odd(i)<>odd(?) и идем в обратную сторону (назад/вперед)
Код:
Начинаем от дома 1
for i:=1 to n do if odd(i)=odd(1) then write(i); //идем туда
for i:=N downto 1 do if odd(i)<>odd(1) then write(i); //И идем обратно

Начинаем от дома 2 (всего лишь на другой стороне от 1)
for i:=1 to n do if odd(i)=odd(2) then write(i);//туда по четной стороне
for i:=N downto 1 do if odd(i)<>odd(2) then write(i); 

Начинаем от дома N
for i:=N downto 1 do if odd(i) =odd(N) then write(i); //идем ОТтуда
for i:=1 to N do if odd(i) <>odd(N) then write(i); // И идем ТУДА
Цитата:
Но предполагаю, что автор задачи подводит вас к идее, что удобнее написать одну процедуру
Код:
i:=???
while (i>0) and (i<N) do ?????
i:=????
while (i>0) and (i<N) do ?????
что вместо ??? пусть думает TC и любой кто хочет.
P.S. Впрочем возможно здесь уже были такие решения.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 06.08.2015 в 16:28.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана последовательность слов, между соседними словами запятая, за последним словом точка. Напечатать в алфавитном порядке все глас zirko_o Паскаль, Turbo Pascal, PascalABC.NET 11 23.03.2014 18:33
ФОРТРАН создать последовательность номеров в порядке возрастания елемента с номером vova_ Помощь студентам 0 09.12.2011 00:50
[C++] Напечатать последовательность слов, удалив повторно входящие слова rtpn Visual C++ 4 30.12.2010 11:24
Напечатать содержимое исходного файла и полученную заданным образом последовательность. Babur4iK Помощь студентам 3 17.04.2010 10:48
НАпечатать наибольшую последовательность состоящую gred Помощь студентам 6 23.03.2008 16:12