IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

3 страниц V  1 2 3 >  
 Ответить  Открыть новую тему 
> Парикмахерская, программа
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской

Репутация: -  0  +


Парикмахерская. Для каждого посетителя парикмахерской (с одним мастером) известны следующие величины: t – момент его прихода и τ – продолжительность его обслуживания. Сколько клиентов обслужит мастер за смену продолжительностью Т? Сколько рабочего времени он потратит на обслуживание?
Момент прихода и продолжительность обслуживания вводятся пользователем..
Помогите,плизз,если кто может..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Задачи на моделирование встречаются не очень часто, так что я не мог отказать себе в написании программы. Но сначала обсудим алгоритм.. smile.gif

По сути, весь алгоритм - это один цикл по клиентам.
Засовываем все данные о клиентах в массив записей, которые содержат время прихода и необходимое время обслуживания. Я считаю, что этот массив уже при задании отсортирован по времени прихода. Если нет - надо отсортировать. Если есть одинаковые времена прихода - пусть сами разбираются, кому идти первым - то есть как расположились в массиве, так и будет. Далее, если необходимое время обслуживания превышает остаток времени до конца рабочего дня, то такому клиенту в обслуживании отказывается. Это не оговорено в условии, так что нужно уточнить с преподавателем. Возможна ситуация, когда есть "grace period", на время которого мастер может задержаться на работе, но это несколько усложнит прогу.

Итак..
1. обнуляем счетчик клиентов и рабочее время;
2. в текущее время кладем время открытия;
3. делаем цикл "for" по клиентам;
4. берем максимум из текущего времени и времени прихода следующего клиента;
5. вычисляем время окончания сеанса;
6. если время окончания за пределами рабочего дня - отказываем в сервисе (переходим к следующему);
7. если укладываемся - стрижем (увеличиваем счетчик клиентов и рабочее время);
8. обновляем текущее время концом сеанса.

Вот, примерно так. Попробуй написать по этому алгоритму программу и показывай, что получилось smile.gif.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской

Репутация: -  0  +


Цитата
Вот, примерно так. Попробуй написать по этому алгоритму программу и показывай, что получилось


Я в паскале очень слаб...он у нас идет первый год,преподы постоянно менялись,вообщем ничему нас не учили...давали на самостоятельное изучение...
Вообщем я сегодня-завтра сбегаю за учебником по паскалю и начну штудировать.может быть подскажите автора?
А за алгоритм большое спасибо!!!!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Дон @ 21.11.2006 14:46) *
сегодня-завтра сбегаю за учебником по паскалю и начну штудировать.может быть подскажите автора?

Рекомендую начать в Фаронова. Я имею в виду его книгу по Turbo Pascal, которая давно стала классикой.
И, если хочешь, параллельно могу давать тут по кусочку программы с объяснениями. Только учти: если ты не будешь одновременно читать учебник - ты обманешь больше себя, чем меня..
Говори, что тебе уже известно, а что не понятно.

Начинаем со структуры основных данных. Поскольку у нас много клиентов, то их описывать должен массив - в каждой ячейке данные очередного клиента. Но данных на каждого клиента больше одного (время прихода и время сервиса) - как быть? На этот случай есть форма данных, называемая record (запись). Она может содержать несколько величин, при этом они могут быть различного типа (в нашем случае обе величины одного типа - real). Такие вот записи мы объединим в массив. Размер массива можно задать прямо при его определении, но удобнее (для дальнейшего развития программы) задавать сначала константу, чтобы потом использовать ее при задании границ массива.
const
M=100; {максимално возможное число клиентов (размер массива)}

type
tCust=record
TIn,TServ:real {время прихода и необходимое время обслуживания клиента}
end;

var
Line:array[1..M]of tCust;

begin
end.

В этом фрагменте есть все основные разделы задания данных:

const - константы. В данном случае используется просто как число, то есть везде, где компилятор встретит M, он подстаавит 100. Попытка изменения М будет трактоваться ошибкой.

type - тип. Подготавливает только структуру данных. Не саму память, а способ расположения в ней данных. Название типа (tCust, я образовал от английского Customer - заказчик, покупатель, клиент -, а буква t означает, что это тип) должно быть использовано при определении переменных. Здесь мы определяем запись, в которой должно быть два действительных числа: время прихода клиента (TIn) и время, необходимое для его обслуживания (TServ).

var - переменные. Тут задаются реальные данные. У нас организуется в памяти блок данных, содержащий 100 записей, пронумерованных от 1 до 100, каждая из которых содержит два действительных числа.

Каждый раздел может содержать много определений (констант, типов, переменных). Конечно, тут еще не все данные пока.

О названиях.
Названия для констант, типов, переменных ты выбираешь сам. Желательно иметь для себя некоторые правила, чтоб не путаться. Например, переменные можно называть по смыслу словами (без пробелов, если несколько слов), начиная каждое слово с большой буквы: ProcessTime, PointEnergy, DlinaVolny ... Простые переменные (обычно одно-двухбуквенные) могут быть маленькими: i, n, r0, c1 ... Названия типов можно образовывать по тому же правилу, но добавлять маленькую t в начале. Константы обычно не нужно отличать от переменных в этом смысле.

О регистре.
Большие и маленькие буквы в Паскале не различаются, то есть переменные start, Start, START - это все одно и то же. То же самое в словах языка.

Приведенный фрагмент представляет собой полную программу. Хотя это программа ничего не делает, она будет компилироваться (попробуй обязательно!). Видишь внизу begin и end? Между ними мы будем вставлять операторы. Кроме того, мы добавим и данных. Программа заканчивается точкой.

Еще раз повторяю: это минимум объяснений, которого явно недостаточно. Посмотри учебник по этому поводу и задавай вопросы.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Дон, я понял, что надо не так резко.
Начнем с самого простого и постараемся подобраться к программе, о которой шла речь.
Разбери в деталях вот эту прогу. Обязательно запускай все, что изучаешь! Старайся, чтоб не оставалось ничего непонятного. Читай, спрашивай, возвращайся к предыдущим постам...
var
TOpen,TClose:real;

begin
TOpen:=9; {время открытия парикмахерской}
TClose:=17; {время закрытия}
WriteLn;
WriteLn('The Barber''s shop is open ',tOpen:4:2,' through ',tClose:4:2);
ReadLn
end.

Успехов! Все зависит от твоего отношения.. smile.gif

PS
Я использую английский для печати в программе, так как правильный вывод русского - отдельная проблема. Если тебя это напрягает - можно перейти на русский латиницей. Комментарии можно писать по-русски, но будь все же аккуратен при копировании файлов..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской

Репутация: -  0  +


Цитата
var
TOpen,TClose:real;


Это мы обьявляем две переменные.Время открытия и закрытия.Real-это вещественный тип данных(хоть что-то в институте обьяснили).
Потом мы взяли эти переменные и присвоили им значения:9 и 17.
Writeln,насколько мне помнится,пишет с новой строки.Не понял только что значат цифры 4:2?
Может быть это число знаков до и после запятой?

Цитата
Если тебя это напрягает - можно перейти на русский латиницей.

Ага,если можно...
А то Promt перевел так:Парикмахерская открывается *** через ***
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


> Потом мы взяли эти переменные и присвоили им значения:9 и 17.
Верно. Надеюсь, понятно, что это есть время открытия и закрытия заведения.. Формат чисел действительный, да.

> Writeln,насколько мне помнится,пишет с новой строки.
Нет, наоброт: начинает с того места, где курсор, а вот после окончания переводит его на следующую строку. Если вывод происходит на последнюю строку экрана, то добавляется строка, а все остальное скроллится вверх.

> Не понял только что значат цифры 4:2?
> Может быть это число знаков до и после запятой?
Только не 4:2, а 4.gif2 - двоеточие существенно, и оно есть принадлежность четверки (и двойки соответственно).
Первое число - длина всего поля вывода, второе - сколько знаков после точки. Это формат вывода. Его можно не писать (попробуй)).

> Ага,если можно...
Упускаешь хорошую возможность параллельно взяться за английский.. подумай еще раз.

> А то Promt перевел так:Парикмахерская открывается *** через ***
Почти верно. "Парикмахерская открыта с *** до *** "
Конечно, по-настоящему надо писать не 17, а 5 pm (5 часов после полудня, то есть 5 вечера). Кроме того, желательно десятичную часть часов переводить в минуты... Но это мы сделаем потом, если у тебя хватит пороху smile.gif.
Эту строку я вывожу, чтоб было понятно, какие данные вводить по клиентам дальше.

Ты еще не упомянул самый последний оператор, ReadLn. Зачем он?
Совет: попробуй его убрать (или заключить в фигурные скобки {} ).

Теперь идем дальше..
1. Рассмотри, чем отличается новый вариант.
2. Почему для вывода запроса на ввод количества клиентов я использую Write, а не WriteLn?
3. Обрати внимание на комментарии. Это важная часть программы. Кстати, тут, на Форуме, их не очень-то любят. Постарайся привыкать к ним.
{ for Don, BarberShop, ver.02, 23/11/06 }
{ by Lapp }

var
TOpen,TClose:real;
n:integer; {общее число клиентов}

begin
TOpen:=9; {время открытия парикмахерской}
TClose:=17; {время закрытия}
WriteLn;
WriteLn('The Barber''s shop is open ',TOpen:4:2,' through ',TClose:4:2);
Write('Vvedite obshee chislo clientov: ');
ReadLn(n); {ввод числа клиентов}
ReadLn
end.


Еще вопрос: в чем ты работаешь? в TP? FPC?...
Успехов! smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской

Репутация: -  0  +


Цитата
Ты еще не упомянул самый последний оператор, ReadLn. Зачем он?


ReadLn считывает данные с экрана.От read отличается тем что после считывания данных с одной строки обеспечивает переход на другую!

Цитата
Совет: попробуй его убрать (или заключить в фигурные скобки {} ).


Убрал я его...программа не запустилась на выполнение.А в фигурных скобках он у нас просто комментарием станет..то есть программа выполнять эту строчку не будет.

Цитата
1. Рассмотри, чем отличается новый вариант.

Прежде всего обьявлением новой переменной "n",которая стала означать масимальное число клиентов.Тип данных этой переменной Integer,значения которого могут приобретать от -32768 до +32767.
Также появились еще две строчки:
Код
  Write('Vvedite obshee chislo clientov: ');
  ReadLn(n);          {ввод числа клиентов}

Мы предлагаем ввести общее число клиентов,а процедура Readln считывает введенное число.

Цитата
2. Почему для вывода запроса на ввод количества клиентов я использую Write, а не WriteLn?

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

Цитата
Еще вопрос: в чем ты работаешь?

Работаю в Turbo Pascal 7.0...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Привет!
> ReadLn считывает данные с экрана.
> От read отличается тем что после считывания данных
> с одной строки обеспечивает переход на другую!
Это все так.. но вопрос был, зачем он здесь.

> Убрал я его...программа не запустилась на выполнение.
Что-то не так..
Ага, кажется, я понял! Думаю, произошло следующее: программа отработала, но так быстро, что ты даже не заметил этого! smile.gif
Тот самый ReadLn используется для задержки. Программа доходит до него и ждет нажатия на клавишу Enter. Это дает тебе возможность увидеть результат работы программы до того, как она закончит работу. Сразу после окончания работы ты будешь возвращен в редактор, и результаты работы программы окажутся как бы "под тектом программы". Если ReadLn отсутствует, то результат мгновенно скрывается, так как программа работает фактически миллисекунды.. Увидеть их все равно можно, для этого нужно нажать Alt-F5. Возвращение в редактор - любая клавиша.
Пожалуйста, попробуй снова.

> А в фигурных скобках он у нас просто комментарием станет..
> то есть программа выполнять эту строчку не будет.
Да. Это можно использовать, если ты хочешь убрать кусок программы временно, чтоб не перенабирать или даже не перекопировать его.

> Прежде всего обьявлением новой переменной "n",
> которая стала означать масимальное число клиентов.
Нет, не максимальное, а именно точное число клиентов, ввод данных о которых последует ниже (чем мы сегодня и займемся).

Все остальное верно и не нуждается в уточнениях smile.gif. Надеюсь, ты проверил, что все работает.

> Работаю в Turbo Pascal 7.0...
Ок, учту.
Можем двинуться дальше..
Вот очередной шаг вперед (третий). Здесь я ввожу массив данных. Это область памяти, которая содержит несколько одинаковых ячеек памяти (в данном случае - сто ячеек типа real), сноабженных одним именем (в данном случае TimeIn), но с индексом. Обращение к каждой ячейке осущемтвляется так:
TimeIn[i]
Количество элементов массива в данном случае 100 (с 1 по 100). Оно должно быть заведомо больше того, что может потребоваться в программе (в данном случае - больше реального количества клиентоа за день). Я взял 100, как достаточное число. Именно это число можно назвать максимальным количеством клиентов (см. мое замечание выше).

Для заполнения массива (а также для вывода его элементов) мы используем цикл FOR. для этого цикла нужна переменная целого типа, которая по смыслу будет означать текущий номер клиента. Ее я назвал i и описал в разделе var (найди это описание).

Посмотри все внимательно, разбери и запусти прогу. Если что-то непонятно - спрашивай. Если все понятно - попробуй ввести еще один массив, который будет содержать время, нужное для стрижки каждого клиента. Оно тоже должно вводится с клавы (по условию). То есть, например, клиент №1 пришел в 10:30 (то есть в 10.5 часов) стричься полубоксом, что требует 20 мин (то есть 0.3 часа) - и так про каждого по возрастанию времени прихода. Если не получится - все равно приходи скорее, не тяни резину - покажи, что получается.
Чао, успехов! smile.gif
{ for Don, BarberShop, ver.03, 24/11/06 }
{ by Lapp }

var
TimeIn:array[1..100]of real; {время прихода кждого клиента}
TOpen,TClose:real;
n,i:integer; {общее число клиентов}

begin
TOpen:=9; {время открытия парикмахерской}
TClose:=17; {время закрытия}
WriteLn;
WriteLn('The Barber''s shop is open ',tOpen:4:2,' through ',tClose:4:2);
Write('Vvedite obshee chislo clientov: ');
ReadLn(n); {ввод числа клиентов}
WriteLn('Vvedite vremya prihoda kazhdogo klienta po poraydku:');
for i:=1 to n do ReadLn(TimeIn[i]);
WriteLn('Barber shop posetili ',n,' klientov. Vremya prihoda:');
for i:=1 to n do WriteLn(i,': ',TimeIn[i]: 4:2);
ReadLn
end.

Извиняюсь, забыл вставить код.. Типа в профессоры заделался.. smile.gif)))
Исправлюсь smile.gif

Сообщение отредактировано: volvo -


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской

Репутация: -  0  +


Цитата
попробуй снова.


Попробовал.
Да,когда ReadLn отсутствует,то программа по завершении сразу закрывается..результат мы не видим...

Цитата
TimeIn[i]
2);

Тут ошибку выдал...">" expected.Заключил в скобки- <2>; ,заработала...

Кстати,после того как ввожу число клиентов(допустим 2) и время их прихода(допустим 14.00 и 15.00),программа выдает следующее:
1: FALSE
2: FALSE
Это я время неправильно ввожу или что?

Цитата
Если все понятно - попробуй ввести еще один массив, который будет содержать время, нужное для стрижки каждого клиента

Новый массив-значит мы в разделе var должны описать еще одну переменную.Допустим это будет s.Его тоже обьявлять как integer?
И..как задавать как он хочет стричься?допустим у нас парикмахерская делает 3 вида стрижек...для каждой свое время...задавать через If else?если такая стрижка,то столько..если другая,то столько-то...
Господи,я наверно такую чушь несу...но вот такие мысли..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Дон @ 25.11.2006 17:58) *

Тут ошибку выдал...">" expected.Заключил в скобки- <2>; ,заработала...

Это вызвано тем, что Форум не всегда правильно отображает программу. Реально в программе было
  for i:=1 to n do WriteLn(i,': ',TimeIn[i] :4 :2);

Сейчас, чтобы этого не произошло, я вставил пробелы перед двоеточиями в формате выводв (их вставление в текст программы допустимо).
Извини, что я этого не учел сразу и повтори свои действия с правильным текстом, пожалуйста.

Что касается дальнейшего - тебе нужен еще один массив. Определи его по примеру TimeIn и назови, скажем, ServiceTime. Сделай ввод значений для него тоже.

Еще раз извиняюсь за всякого рода недосмотры.. smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской

Репутация: -  0  +


Цитата
повтори свои действия с правильным текстом


Все отлично работает)))

Цитата
Что касается дальнейшего - тебе нужен еще один массив. Определи его по примеру TimeIn и назови, скажем, ServiceTime. Сделай ввод значений для него тоже.


{ for Don, BarberShop, ver.03, 24/11/06 }
{ by Lapp }

var
TimeIn:array[1..100]of real; {время прихода каждого клиента}
ServiceTime:array[1..100] of Real;{время обслуживания каждого клиента}
TOpen,TClose:real;
n,i:integer; {общее число клиентов}

begin
TOpen:=9; {время открытия парикмахерской}
TClose:=17; {время закрытия}
WriteLn;
WriteLn('The Barber''s shop is open ',tOpen:4:2,' through ',tClose:4:2);
Write('Vvedite obshee chislo clientov: ');
ReadLn(n); {ввод числа клиентов}
WriteLn('Vvedite vremya prihoda kazhdogo klienta po poraydku:');
for i:=1 to n do ReadLn(TimeIn[i]);
WriteLn('Barber shop posetili ',n,' klientov. Vremya prihoda:');
for i:=1 to n do WriteLn(i,': ',TimeIn[i] :4 :2);
Read;
Write('Vvedite vremya,neobxodimoe dlya obslugivania klienta: ');
ReadLn
end.


вот чего получилось...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Дон @ 25.11.2006 17:58) *

И..как задавать как он хочет стричься?допустим у нас парикмахерская делает 3 вида стрижек...для каждой свое время...задавать через If else?если такая стрижка,то столько..если другая,то столько-то...

В условии ясно сказано, что
Цитата
Момент прихода и продолжительность обслуживания вводятся пользователем..

Стрижек может быть много разных, может добавляться дополнительный сервис (мытье головы, завивка..). Короче, просто вводишь время с клавы (как сделано ниже).
Цитата(Дон @ 26.11.2006 16:07) *

вот чего получилось...

Ты ввел массив правильно. Но данные в него не занес.
Организовать ввод данных можно точно так же, как и для времени прихода, то есть ввести еще один цикл.
Но я думаю, что лучше будет делать это в одном цикле. Разбери, как это сделано. Тебе поможет протокол работы программы, который я прилагаю ниже..
{ for Don, BarberShop, ver.04, 26/11/06 }
{ by Lapp }

var
TimeIn:array[1..100]of real; {время прихода кждого клиента}
ServiceTime:array[1..100] of Real; {время обслуживания каждого клиента}
TOpen,TClose:real;
n,i:integer; {общее число клиентов}

begin
TOpen:=9; {время открытия парикмахерской}
TClose:=17; {время закрытия}
WriteLn;
WriteLn('The Barber''s shop is open ',tOpen:4:2,' through ',tClose:4:2);
Write('Vvedite obshee chislo clientov: ');
ReadLn(n); {ввод числа клиентов}
WriteLn('Vvedite vremya prihoda i obsluzhivaniya kazhdogo klienta po poraydku');
WriteLn('cherez probel po odnomu clientu na stroke:');
for i:=1 to n do ReadLn(TimeIn[i],ServiceTime[i]);
WriteLn('Barber shop posetili ',n,' klientov. Vremya prihoda i obsluzhivaniya:');
for i:=1 to n do WriteLn(i,': ',TimeIn[i] :4 :2,' ',ServiceTime[i] :4 :2);
ReadLn
end.

А вот как она работает:
Код
The Barber's shop is open 9.00 through 17.00
Vvedite obshee chislo clientov: 4
Vvedite vremya prihoda i obsluzhivaniya kazhdogo klienta po poraydku
cherez probel po odnomu clientu na stroke:
9.30 1
10 2
11 0.5
15 1.25
Barber shop posetili 4 klientov. Vremya prihoda i obsluzhivaniya:
1: 9.30  1.00
2: 10.00  2.00
3: 11.00  0.50
4: 15.00  1.25

Когда все разберешь и поймешь, качестве работы для мозгов можешь подумать над одним вопросом..
Эта программа как бы моделирует работу парикмахерской - верно? Каждый клиент приходит и записывается в очередь, что соответствует вводу данных о них в порядке возрастания врмени прихода. Но есть одно "но".. Мы сейчас вводим сначала общее число всех клиентов в самом начале - да? А ведь, если подумать, то в начале дня неизвестно, сколько придет клиентов.. так? Подумай, можно ли избежать ввода общего числа клиентов в начале работы программы.
Давай, работай smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской

Репутация: -  0  +


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


честно говоря не понял...а смысл?если пришел один клиент,то введем одного...второй пришел,введем второго...или так не пойдет?

Цитата
Сколько клиентов обслужит мастер за смену продолжительностью Т? Сколько рабочего времени он потратит на обслуживание?


а как ответить на эти вопросы?может быть надо суммировать кол-во клиентов прошедших за день в конце программы?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


> честно говоря не понял...а смысл?
внимательно посмотри на то, как вводятся данные по клиентам сейчас. Мы используем цикл FOR, который требует указания начала и конца. Начало - это всегда 1, это ясно. А конец - это количество всех клиентов. Поэтому для организации такого цикла мы сначала запрашиваем общее число всех клиентов. Если этого не сделать - вотрой параметр цикла будет неопределен. Это ясно?

> если пришел один клиент,то введем одного...
> второй пришел,введем второго...или так не пойдет?
Как ты это себе представляешь? Этот вопрос - не общая фраза, именно в нем заключена суть программирования, и тебе нужно это понять, если ты им начал заниматься. Именно важно представить в мозгу, как будет происходить процесс, причем в деталях. Вот сейчас происходит так: запрашиваем число клиентов, получаем его, и после этого запрашиваем данные по каждому клиенту. То есть если было сказано, что клиентов 5, то мы запрашиваем ровно 5 пар чисел: время прихода и обслуживания каждого. И нет никакой возможности скорректировать число клиентов после этого. Это соответствует предварительной записи клиентов: они звонят заранее, типа вчера или за неделю, и утром текущего дня запись прекращается. Каждый должен прийти, и никого лишнего быть не может - никакой живой очереди дополнительно. И ситуация даже хуже, потому что при предварительной записи клиенту не выдадут время прихода так, чтоб он ждал, а у нас это возможно..
Постарайся понять, что такие аналогии - это чать программирования, и чем лучше ты себе это представляешь, тем лучше будешь программировать. Особенно в задачах на моделирование.

Другой процесс - это реальная очередь без записи. Каждый приходит в случайное время, а девушка у входа регистрирует время прибытия каждого и время, необходимое на стрижку. Если клиента не успевают постричь (типа он пришел за час до закрытия и на стрижку ему нужно 45 мин, но парикмахер освободится только через полчаса). В конце рабочего дня дверь просто закрывается. Чему это соответствует? Тому, что мы вводим клиентов один за другим, как ты и говорил, но как нам узнать, что больше клиентов не будет? Подумай над этим еще

> а как ответить на эти вопросы?может быть надо суммировать
> кол-во клиентов прошедших за день в конце программы?
Не торопись. Мы этим еще не занимались. Но скоро займемся smile.gif

Ты ничего не сказал про то, заработал ли у тебя последний вариант программы, и все ли тебе понятно в нем. Извини, но без этой информации я не могу продолжать.. Не заставляй меня спрашивать каждую мелочь, отвечай сам на важные моменты. Вопрос про модернизацию очереди был дополнительным, а ты отвечал только на него.
Давай, трудись smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Дон, ты сдался? надоело?.. Еще одна зарубка в ряду активно начинающих и странным образом исчезающих собеседников.. Ведь ни один еще не добрался до конца! Не любят у нас бесплатных школ.. sad.gif
Ладно, чтоб логически закончить тему, выкладываю программу, которую я написал сразу и к которой хотел тебя подвести.
Разбирайся сам, я умываю руки..
const
M=100; {максимално возможное число клиентов (размер массива)}
type
tCust=record
TIn,TServ:real {время прихода и необходимое время обслуживания клиента}
end;
var
Line:array[1..M]of tCust;
n,i,k:integer;
t,t1,t2,TOpen,TClose,tWork:real;

function Max(x,y:real):real;
begin
if x>y then Max:=x else Max:=y
end;

begin
TOpen:=9; {время открытия парикмахерской}
TClose:=17; {время закрытия}
n:=0; {счетчик клиентов в очереди}
WriteLn('The Barber''s shop is open ',tOpen:4 :2,', through ',tClose:4 :2);
WriteLn('Type in time of check-in and service time for each customer,');
WriteLn('one customer per line, two numbers devided by a space');
WriteLn('Type Ctrl-Z followed by Enter when done');
while not EoF do begin {регистрация клиентов}
Inc(n);
with Line[n] do ReadLn(TIn,TServ)
end;
WriteLn;
WriteLn('So far we have ',n,' customers');
t:=TOpen; {текущее время начинается с открытия}
TWork:=0; {рабочее время}
k:=0; {счетчик обслуженных клиентов}
for i:=1 to n do with Line[i] do begin {вызываем следующего по очереди}
t1:=Max(t,TIn); {начало обслуживания клиента}
if t1>t then WriteLn('Idle time ',t1-t:4 :2,' hours'); {выводим время простоя, если оно было}
Write('Customer #',i,' was '); {выводим номер клиента}
t2:=t1+TServ; {вычисляем время окончания сеанса}
if t2<=TClose then begin {если хватает рабочего времени ..}
t:=t2; {обновляем текущее время концом сеанса}
TWork:=TWork+TServ; {увеличиваем рабочее время}
Inc(k); {увеличиваем счет клиентов}
WriteLn('served at ',t1:4 :2,' through ',t2:4 :2) {выводим начало и окончание сеанса}
end
else WriteLn(' rejected') {.. если не хватает времени - отказать}
end;
WriteLn('For the whole day ',k,' customers were served');
WriteLn('Work time was ',tWork:4 :2,' hours');
ReadLn
end.

PS
впрочем, у тебя всегда есть шанс реабилитироваться.. ;)


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской

Репутация: -  0  +


Вот уж фигушки...
Ничего я не сдался..стыдно просто...
Просто вы задали вопрос на модернизацию,чтобы не вводить всех посетителей сразу.А я..ну не врублюсь...дурак наверно..но научиться хочу правда!!!!

while not EoF do begin           {регистрация клиентов}
Inc(n);
with Line[n] do ReadLn(TIn,TServ)
end;
WriteLn;
WriteLn('So far we have ',n,' customers');
t:=TOpen; {текущее время начинается с открытия}
TWork:=0; {рабочее время}
k:=0; {счетчик обслуженных клиентов}
for i:=1 to n do with Line[i] do begin {вызываем следующего по очереди}
t1:=Max(t,TIn); {начало обслуживания клиента}
if t1>t then WriteLn('Idle time ',t1-t:4 :2,' hours'); {выводим время простоя, если оно было}
Write('Customer #',i,' was '); {выводим номер клиента}
t2:=t1+TServ; {вычисляем время окончания сеанса}
if t2<=TClose then begin {если хватает рабочего времени ..}
t:=t2; {обновляем текущее время концом сеанса}
TWork:=TWork+TServ; {увеличиваем рабочее время}
Inc(k); {увеличиваем счет клиентов}
WriteLn('served at ',t1:4 :2,' through ',t2:4 :2) {выводим начало и окончание сеанса}
end
else WriteLn(' rejected') {.. если не хватает времени - отказать}
end;
WriteLn('For the whole day ',k,' customers were served');
WriteLn('Work time was ',tWork:4 :2,' hours');
ReadLn
end.


Вот это для меня вообще темный лес..но я хочу разобраться,что к чему...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Дон @ 1.12.2006 15:49) *

Вот уж фигушки...
Ничего я не сдался..

И правильно! smile.gif
Цитата(Дон @ 1.12.2006 15:49) *

Вот это для меня вообще темный лес..но я хочу разобраться,что к чему...

Не спеши. Время есть пока?
Давай договоримся так: есть основные вопросы, и есть дополнительные. Основные никогда не бывают слишком трудными (типа: запустил? увидел?). На основные вопросы, будь добр, отвечай. Дополнительные могут быть очень трудными. На них отвечать совершенно необязательно. Я просто хочу передать тебе смысл и направление мысли. Результаты будут потом..

Итак, пока будем считать, что последний вариант (ver. 04) у тебя запустился и с ним ты разобрался (хотя, повторяю, ответа на это ты не дал). И если уж ты так увлекся тем вопросом, как сделать ввод клиентов без предварительного ввода их числа, то давай с этим разберемся (хотя без этого можно было бы обойтись).

Для этого потребуется:
1. Заменить цикл FOR на цикл WHILE.
Прочитай про него в Книге. По-простому, он повторяется пока выполняется то условие, которое ты поставишь после оператора while (перед do). Как только условие нарушится, повторение заканчивается и программа идет дальше. Например,
while 2*2=4 do ...
- будет повторяться бесконечно. А этот:
while 2*2=5 do ...
- не выполнится ни разу (здесь и выше идет речь о выполнении того, что стоит на месте многоточия). А вот этот:
i:=1;
while i<50 do i:=i*2;
- выполнится раз. В первый раз i=1, во второй 2, в третий 4, в четвертый 8, потом 16, потом 32 - и все, для i=64 он уже не выполнится, и программа продолжит выполняться дальше, причем значение переменной i при этом уже будет равно 64.

2. Понятие конца файла.
Дело в том, что ввод с клавиатуры вообще-то трактуется программой как ввод из файла. Это так называемый Стандартный Ввод. Как у любого файла, у него может быть конец. В Паскале есть специальная функция, которая говорит, что файл закончился. Это функиция EoF(f), название происходит от End of File. В скобках заключается переменная файла, но в случае стандартного ввода скобки можно опустить. То есть несмотря на то, что EoF выглядит как простая переменная, она все же является функцией. Эта функция входит в модуль System, который описывать в операторе uses не обязательно (и мы не описываем). Эта функция возвращает булево значение, то есть true (правда) или false (ложь). Понятно, что цикл
while not EoF do ...
- будет продолжаться до тех пор, пока не кончится стандартный ввод. А когда же он кончится?.. На этот случай есть некоторая хитрость. В DOS признаком конца текстового файла считается символ ^Z (Ctrl-Z), имеющий номер 26 (как последняя буква английского алфавита). А стандартный ввод трактуется как текстовый файл (в отличие от файлов на диске, которые могут быть разными: и текстовыми, и бинарными - все зависит от того, как ты их открываешь, но об этом потом). Так что по нажатии Ctrl-Z, а потом за ним Enter, функция EoF даст true. Условие в цикле перестанет выполняться ("не" "правда", то есть "неправда"), и повторение оператора (в данном случае группы операторов: ввод двух чисел и увеличение на единицу числа клиентов) прекратится.

Тем самым мы автоматически подстчитываем, сколько клиентов пришло.
Вот новая версия программы. Подтверди, пожалуйста, что она нормально отрабатывает и что тебе все понятно. Или задавай вопросы smile.gif.
{ for Don, BarberShop, ver.05, 01/12/06 }
{ by Lapp }

var
TimeIn:array[1..100]of real; {время прихода кждого клиента}
ServiceTime:array[1..100] of Real; {время обслуживания каждого клиента}
TOpen,TClose:real;
n,i:integer; {общее число клиентов}

begin
TOpen:=9; {время открытия парикмахерской}
TClose:=17; {время закрытия}
WriteLn;
WriteLn('The Barber''s shop is open ',tOpen:4:2,' through ',tClose:4:2);
WriteLn('Vvedite vremya prihoda i obsluzhivaniya kazhdogo klienta po poraydku');
WriteLn('cherez probel po odnomu clientu na stroke.');
WriteLn('V konce nazhmite Ctrl-Z i Enter');
n:=0; {счетчик клиентов в очереди}
while not EoF do begin {регистрация клиентов}
Inc(n);
ReadLn(TimeIn[n],ServiceTime[n])
end;
WriteLn('Barber shop posetili ',n,' klientov. Vremya prihoda i obsluzhivaniya:');
for i:=1 to n do WriteLn(i,': ',TimeIn[i] :4 :2,' ',ServiceTime[i] :4 :2);
ReadLn
end.

А вот пример ее работы.
Код
The Barber's shop is open 9.00 through 17.00
Vvedite vremya prihoda i obsluzhivaniya kazhdogo klienta po poraydku
cherez probel po odnomu clientu na stroke.
V konce nazhmite Ctrl-Z i Enter
8.5 2
9 0.25
10 1
13 0.5
14 1
14.5 2
^Z
Barber shop posetili 6 klientov. Vremya prihoda i obsluzhivaniya:
1: 8.50  2.00
2: 9.00  0.25
3: 10.00  1.00
4: 13.00  0.50
5: 14.00  1.00
6: 14.50  2.00

Как только разберешься, двинемся дальше и начнем саму работу парикмахера smile.gif
Успехов!


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Новичок
*

Группа: Пользователи
Сообщений: 22
Пол: Мужской

Репутация: -  0  +


Цитата
Не спеши. Время есть пока?

В принципе да..курсовую через три дня сдавать)

Цитата
Например,
while 2*2=4 do ...
- будет повторяться бесконечно. А этот:
while 2*2=5 do ...
- не выполнится ни разу (здесь и выше идет речь о выполнении того, что стоит на месте многоточия). А вот этот:
i:=1;
while i<50 do i:=i*2;
- выполнится раз. В первый раз i=1, во второй 2, в третий 4, в четвертый 8, потом 16, потом 32 - и все, для i=64 он уже не выполнится, и программа продолжит выполняться дальше, причем значение переменной i при этом уже будет равно 64.


с while все ясно..
с алгоритмикой у мну все в порядке..оформлять я не умею,иногда просто тупо забываю какой знак за каким стоит..буду тренироваться!

Цитата
Вот новая версия программы. Подтверди, пожалуйста, что она нормально отрабатывает и что тебе все понятно. Или задавай вопросы

Все работает и пока что все ясно!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Дон @ 2.12.2006 20:40) *

Все работает и пока что все ясно!
Это очень хорошо.
Я извиняюсь за некоторый перерыв - был занят другими делами, на форум почти не заглядывал sad.gif.
Если это еще актуально - выкладываю окончательную версию. Она отличается от того варианта, что я выкладывал раньше.
1. Я не использую записи (record) для упрощения.
2. Убрал использование функции.
Без всего этого можно обойтись. Ну, и перевел на "квазирусский" (больше не проси.. утомительно это - писать латиницей..)
Работа программы ясна из комментариев. Если есть вопросы - задавай.
{ for Don, BarberShop, ver.06, 05/12/06 }
{ by Lapp }

var
TimeIn:array[1..100]of real; {время прихода кждого клиента}
ServiceTime:array[1..100] of Real; {время обслуживания каждого клиента}
t,t1,t2,TWork,TOpen,TClose:real;
n,i,k:integer; {общее число клиентов}

begin
TOpen:=9; {время открытия парикмахерской}
TClose:=17; {время закрытия}
WriteLn;
WriteLn('The Barber''s shop is open ',tOpen:4:2,' through ',tClose:4:2);
WriteLn('Vvedite vremya prihoda i obsluzhivaniya kazhdogo klienta po poraydku');
WriteLn('cherez probel po odnomu clientu na stroke.');
WriteLn('V konce nazhmite Ctrl-Z i Enter');
n:=0; {счетчик клиентов в очереди}
while not EoF do begin {регистрация клиентов}
Inc(n);
ReadLn(TimeIn[n],ServiceTime[n])
end;
WriteLn('Barber shop posetili ',n,' klientov. Vremya prihoda i obsluzhivaniya:');
for i:=1 to n do WriteLn(i,': ',TimeIn[i] :4 :2,' ',ServiceTime[i] :4 :2);

t:=TOpen; {текущее время по часам мастера, начинается с открытия}
TWork:=0; {рабочее время, подготавливаем}
k:=0; {счетчик обслуженных клиентов, подготавливаем}
for i:=1 to n do begin {вызываем следующего по очереди}
{начало обслуживания клиента - это либо время его прихода...}
t1:=TimeIn[i];
{.. либо время, когда мастер освободился, если он был занят}
if t>t1 then t1:=t;
{выводим время простоя, если оно было}
if t1>t then WriteLn('Vremya prostoya ',t1-t:4:2,' chasov');
{вычисляем время окончания сеанса:}
t2:=t1+ServiceTime[i];
if t2<=TClose then begin {если хватает рабочего времени ..}
t:=t2; {.. то обновляем текущее время концом сеанса (стрижем)}
TWork:=TWork+ServiceTime[i]; {увеличиваем счетчик рабочего времени}
Inc(k); {увеличиваем счетчик обслуженных клиентов}
{выводим информацию об обслуживании клиента и время сеанса}
WriteLn('Klient #',i,' byl obsluzhen s ',t1:4:2,' do ',t2:4:2)
end
{.. если не хватает времени - выводим информацию об отказе}
else WriteLn('Klientu #',i,' bylo otkazano v servise')
end;
{esli v konce rabochego dnya ne bylo clientov, vyvodim vremya prostoya}
if t<TClose then WriteLn('Vremya prostoya ',tClose-t:4:2,' chasov');
WriteLn('Za vesj denj bylo obsluzheno ',k,' klientov');
WriteLn('Rabochee vremya sostavilo ',tWork:4:2,' chasov');
ReadLn
end.

Желаю успехов! И не бросай программирование..
PS
Плохо выглядит вывод времени в долях часа.. По-хорошему, надо сделать вывод в часах и минутах, но это отдельный разговор smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

3 страниц V  1 2 3 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 1.12.2020 4:14
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name