Парикмахерская. Для каждого посетителя парикмахерской (с одним мастером) известны следующие величины: t – момент его прихода и τ – продолжительность его обслуживания. Сколько клиентов обслужит мастер за смену продолжительностью Т? Сколько рабочего времени он потратит на обслуживание?
Момент прихода и продолжительность обслуживания вводятся пользователем..
Помогите,плизз,если кто может..
Задачи на моделирование встречаются не очень часто, так что я не мог отказать себе в написании программы. Но сначала обсудим алгоритм..
По сути, весь алгоритм - это один цикл по клиентам.
Засовываем все данные о клиентах в массив записей, которые содержат время прихода и необходимое время обслуживания. Я считаю, что этот массив уже при задании отсортирован по времени прихода. Если нет - надо отсортировать. Если есть одинаковые времена прихода - пусть сами разбираются, кому идти первым - то есть как расположились в массиве, так и будет. Далее, если необходимое время обслуживания превышает остаток времени до конца рабочего дня, то такому клиенту в обслуживании отказывается. Это не оговорено в условии, так что нужно уточнить с преподавателем. Возможна ситуация, когда есть "grace period", на время которого мастер может задержаться на работе, но это несколько усложнит прогу.
Итак..
1. обнуляем счетчик клиентов и рабочее время;
2. в текущее время кладем время открытия;
3. делаем цикл "for" по клиентам;
4. берем максимум из текущего времени и времени прихода следующего клиента;
5. вычисляем время окончания сеанса;
6. если время окончания за пределами рабочего дня - отказываем в сервисе (переходим к следующему);
7. если укладываемся - стрижем (увеличиваем счетчик клиентов и рабочее время);
8. обновляем текущее время концом сеанса.
Вот, примерно так. Попробуй написать по этому алгоритму программу и показывай, что получилось .
const
M=100; {максимално возможное число клиентов (размер массива)}
type
tCust=record
TIn,TServ:real {время прихода и необходимое время обслуживания клиента}
end;
var
Line:array[1..M]of tCust;
begin
end.
Дон, я понял, что надо не так резко.
Начнем с самого простого и постараемся подобраться к программе, о которой шла речь.
Разбери в деталях вот эту прогу. Обязательно запускай все, что изучаешь! Старайся, чтоб не оставалось ничего непонятного. Читай, спрашивай, возвращайся к предыдущим постам...
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.
> Потом мы взяли эти переменные и присвоили им значения:9 и 17.
Верно. Надеюсь, понятно, что это есть время открытия и закрытия заведения.. Формат чисел действительный, да.
> Writeln,насколько мне помнится,пишет с новой строки.
Нет, наоброт: начинает с того места, где курсор, а вот после окончания переводит его на следующую строку. Если вывод происходит на последнюю строку экрана, то добавляется строка, а все остальное скроллится вверх.
> Не понял только что значат цифры 4:2?
> Может быть это число знаков до и после запятой?
Только не 4:2, а 2 - двоеточие существенно, и оно есть принадлежность четверки (и двойки соответственно).
Первое число - длина всего поля вывода, второе - сколько знаков после точки. Это формат вывода. Его можно не писать (попробуй)).
> Ага,если можно...
Упускаешь хорошую возможность параллельно взяться за английский.. подумай еще раз.
> А то Promt перевел так:Парикмахерская открывается *** через ***
Почти верно. "Парикмахерская открыта с *** до *** "
Конечно, по-настоящему надо писать не 17, а 5 pm (5 часов после полудня, то есть 5 вечера). Кроме того, желательно десятичную часть часов переводить в минуты... Но это мы сделаем потом, если у тебя хватит пороху .
Эту строку я вывожу, чтоб было понятно, какие данные вводить по клиентам дальше.
Ты еще не упомянул самый последний оператор, 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.
Привет!
> ReadLn считывает данные с экрана.
> От read отличается тем что после считывания данных
> с одной строки обеспечивает переход на другую!
Это все так.. но вопрос был, зачем он здесь.
> Убрал я его...программа не запустилась на выполнение.
Что-то не так..
Ага, кажется, я понял! Думаю, произошло следующее: программа отработала, но так быстро, что ты даже не заметил этого!
Тот самый ReadLn используется для задержки. Программа доходит до него и ждет нажатия на клавишу Enter. Это дает тебе возможность увидеть результат работы программы до того, как она закончит работу. Сразу после окончания работы ты будешь возвращен в редактор, и результаты работы программы окажутся как бы "под тектом программы". Если ReadLn отсутствует, то результат мгновенно скрывается, так как программа работает фактически миллисекунды.. Увидеть их все равно можно, для этого нужно нажать Alt-F5. Возвращение в редактор - любая клавиша.
Пожалуйста, попробуй снова.
> А в фигурных скобках он у нас просто комментарием станет..
> то есть программа выполнять эту строчку не будет.
Да. Это можно использовать, если ты хочешь убрать кусок программы временно, чтоб не перенабирать или даже не перекопировать его.
> Прежде всего обьявлением новой переменной "n",
> которая стала означать масимальное число клиентов.
Нет, не максимальное, а именно точное число клиентов, ввод данных о которых последует ниже (чем мы сегодня и займемся).
Все остальное верно и не нуждается в уточнениях . Надеюсь, ты проверил, что все работает.
> Работаю в Turbo Pascal 7.0...
Ок, учту.
Можем двинуться дальше..
Вот очередной шаг вперед (третий). Здесь я ввожу массив данных. Это область памяти, которая содержит несколько одинаковых ячеек памяти (в данном случае - сто ячеек типа real), сноабженных одним именем (в данном случае TimeIn), но с индексом. Обращение к каждой ячейке осущемтвляется так:
TimeIn[i]
Количество элементов массива в данном случае 100 (с 1 по 100). Оно должно быть заведомо больше того, что может потребоваться в программе (в данном случае - больше реального количества клиентоа за день). Я взял 100, как достаточное число. Именно это число можно назвать максимальным количеством клиентов (см. мое замечание выше).
Для заполнения массива (а также для вывода его элементов) мы используем цикл FOR. для этого цикла нужна переменная целого типа, которая по смыслу будет означать текущий номер клиента. Ее я назвал i и описал в разделе var (найди это описание).
Посмотри все внимательно, разбери и запусти прогу. Если что-то непонятно - спрашивай. Если все понятно - попробуй ввести еще один массив, который будет содержать время, нужное для стрижки каждого клиента. Оно тоже должно вводится с клавы (по условию). То есть, например, клиент №1 пришел в 10:30 (то есть в 10.5 часов) стричься полубоксом, что требует 20 мин (то есть 0.3 часа) - и так про каждого по возрастанию времени прихода. Если не получится - все равно приходи скорее, не тяни резину - покажи, что получается.
Чао, успехов!
{ 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.
for i:=1 to n do WriteLn(i,': ',TimeIn[i] :4 :2);
{ 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.
{ 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.
> честно говоря не понял...а смысл?
внимательно посмотри на то, как вводятся данные по клиентам сейчас. Мы используем цикл FOR, который требует указания начала и конца. Начало - это всегда 1, это ясно. А конец - это количество всех клиентов. Поэтому для организации такого цикла мы сначала запрашиваем общее число всех клиентов. Если этого не сделать - вотрой параметр цикла будет неопределен. Это ясно?
> если пришел один клиент,то введем одного...
> второй пришел,введем второго...или так не пойдет?
Как ты это себе представляешь? Этот вопрос - не общая фраза, именно в нем заключена суть программирования, и тебе нужно это понять, если ты им начал заниматься. Именно важно представить в мозгу, как будет происходить процесс, причем в деталях. Вот сейчас происходит так: запрашиваем число клиентов, получаем его, и после этого запрашиваем данные по каждому клиенту. То есть если было сказано, что клиентов 5, то мы запрашиваем ровно 5 пар чисел: время прихода и обслуживания каждого. И нет никакой возможности скорректировать число клиентов после этого. Это соответствует предварительной записи клиентов: они звонят заранее, типа вчера или за неделю, и утром текущего дня запись прекращается. Каждый должен прийти, и никого лишнего быть не может - никакой живой очереди дополнительно. И ситуация даже хуже, потому что при предварительной записи клиенту не выдадут время прихода так, чтоб он ждал, а у нас это возможно..
Постарайся понять, что такие аналогии - это чать программирования, и чем лучше ты себе это представляешь, тем лучше будешь программировать. Особенно в задачах на моделирование.
Другой процесс - это реальная очередь без записи. Каждый приходит в случайное время, а девушка у входа регистрирует время прибытия каждого и время, необходимое на стрижку. Если клиента не успевают постричь (типа он пришел за час до закрытия и на стрижку ему нужно 45 мин, но парикмахер освободится только через полчаса). В конце рабочего дня дверь просто закрывается. Чему это соответствует? Тому, что мы вводим клиентов один за другим, как ты и говорил, но как нам узнать, что больше клиентов не будет? Подумай над этим еще
> а как ответить на эти вопросы?может быть надо суммировать
> кол-во клиентов прошедших за день в конце программы?
Не торопись. Мы этим еще не занимались. Но скоро займемся
Ты ничего не сказал про то, заработал ли у тебя последний вариант программы, и все ли тебе понятно в нем. Извини, но без этой информации я не могу продолжать.. Не заставляй меня спрашивать каждую мелочь, отвечай сам на важные моменты. Вопрос про модернизацию очереди был дополнительным, а ты отвечал только на него.
Давай, трудись
Дон, ты сдался? надоело?.. Еще одна зарубка в ряду активно начинающих и странным образом исчезающих собеседников.. Ведь ни один еще не добрался до конца! Не любят у нас бесплатных школ..
Ладно, чтоб логически закончить тему, выкладываю программу, которую я написал сразу и к которой хотел тебя подвести.
Разбирайся сам, я умываю руки..
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.
Вот уж фигушки...
Ничего я не сдался..стыдно просто...
Просто вы задали вопрос на модернизацию,чтобы не вводить всех посетителей сразу.А я..ну не врублюсь...дурак наверно..но научиться хочу правда!!!!
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.
{ 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.
{ 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.
Мда..все-таки комментарии вещь хорошая...без них бы мало что понял)))
А как вывести в начале программы большими белыми буквами "Парикмахерская"?Я так понимаю это особые параметры оператора Write?
var Hour,Min:integer;
....
Hour:=Trunc(t);
Min:=Round(Frac(t)*60);
WriteLn('Время ',t :2 :4,' соответствует ', Hour,' час ',Min,' мин');
var
Hour,Min:integer;
Ziro:string[1];
....
Hour:=Trunc(t);
Min:=Round(Frac(t)*60);
if Min<10 then Ziro:='0' else Ziro:='';
WriteLn('Время ',t :2 :4,' соответствует ', Hour,':',Ziro,Min);
> неа..признаться честно,не нашел..
Но теперь-то видишь?
> CheckEof:Boolean; мы обьявляем в разделе переменных,
А вот этого делать не надо. Эта переменная уже определена в модуле CRT, так же как и процедуры и константы типа White, Red.. Когда ты ее определил сам, ты на самом деле ее переопределил, то есть сделал новую такую переменную, а ту сделал недоступной. Потому и не работает..
> а CheckEof:=true; куда?перед циклом ввода данных поставил..
Да, туда.
> все равно не работает моя Ctrl-Z
Убери переопределение
Теперь ты познакомился поближе с работой модулей.
Step by step. One at a time. Все так и должно быть. Жаль только, что остальные в тему, похоже, перестали заглядывать, а меня тебе приходится ждать сутки..
Больше читай и не пропускай ничего. И делай ипрогоняй маленькие программки-тесты на то, что прочитал. Обычно достаточно две-три строчки - и ты не только лучше разберешься, но и лучше запомнишь.
Успехов!
> У нас по приложению 4-Типы данных!
Это Глава 4 - Типы данных. Смотри Приложения внизу..
> Я вот тут описываю программу..ее надо описать вместе с операторами..
> Программа состоит из 55 строчек. Язык, используемый программой – русский.
Язык интерфейса программы - русский (латиница)
> В тексте программы использовались такие операторы, как:
> WriteLn;
> While;
> For;
> If; else;
Убери ";", это не есть часть оператора. А внутри оператора "if ... then ... else" они просто являются ошибкой (проверь, попробуй поставить ";" перед else).
> В разделе var мы объявляем время прихода каждого клиента,
Мы объявляем переменные для хранения времени ....
> Операторами TOpen; и TClose; мы обьявили время открытия и
Это не операторы. Это переменные, которые мы завели для хранения времени открытия и закрытия парикмахерской.
> как бы покультурней описать While?может быть еще что-то надо описать?
Цикл while осуществляет регистрацию клиентов по мере их поступления, присваивая каждому клиенту его номер и занося в массивы время прихода и время, необходимое для обслуживания каждого клиента. Выход из цикла осуществляется по признаку конца файла ввода (Ctrl-Z для файла типа text).
Цикл for является централной конструкцией в данной программе. Он осуществляет моделирование работы мастера, состоящее в вызове мастером клиентов по очереди (по мере освобождения мастера либо по мере поступления клиентов, в зависимости от того, что наступает раньше). Моделирование осуществляется посредством вычисления времени начала (переменная t) и конца (переменная t1) сеанса. При этом если оставшегося рабочего времени недостаточно для обслуживания вызываемого клиента, то ему сообщается о невозможности обслуживания, после чего осуществляется переход к следующему по очереди клиенту. Цикл заканчивается по окончании обслуживания (либо сообщении об отказе в сервисе) всех клиентов. В процессе цикла суммируется общее рабочее время мастера (переменная tWork), а также выводится информауия о предпринятом действии (обслуживание с временем начала и конца, отказ). По завершении цикла выводится суммарное общее число обслуженных (то есть тех, кому не было отказано в сервисе) клиентов и полное рабочее время мастера.
Вот, примерно так, думаю..
> Усе..найдено)))
Вывод: внимательнее относись к советам и ууказаниям. Я с самомго начала говорил именно о приложении.
> что такое выходные данные?
Как что? То, что программа выводит. Обычно это то, что спрашивается в задаче, но иногда приходится привоекать еще что-то.. Здесь, например, спрашивается только кол-во обслуженных клиентов и рабочее время. Мы же выводим весь протокол рабочего дня - построчно, кого и когда обслужили или послали.. Эти данные можно назвать "промежуточными", но раз мы их выводим - они выходные. Упомяни, что это делается для контроля работы программы и может быть убрано (кстати, можешь ввести печать/непечать этих данных по ключу)
> еще математическая модель задачи..это как?
Ну.. Скажем, это суммирование времени в цикле с проверкой условий на пригодность данных (если времени нужно много - данные непригодны, клиенту отказывается).
[/quote]
Прошелся по программе...возникло несколько вопросов...
> Прошелся по программе...возникло несколько вопросов...
Дон, без обид - надо активнее. Время проходиться по программе прошло. Если хочешь научиться программировать - делай хотя бы по одной новой задаче в день. Свои задачи, не для сдачи. Тогда не будет всяких побочных (извини, дурацких) вопросов, а будет только одно: правильный результат. И если ты сможешь это делать, то увидишь, что вопросы больше не возникают. То есть они возникают, но сразу находят ответ. Просто подходить нужно с другой стороны - с максимального количества практики. И тогда все будет ясно, все вопросы ответятся сами собой. Задачи можешь брать из текущей ленты нашего Форума (самые простые сначала), решать их и сверяться с тем, что отвечают. Всегда можно вмешаться в беседу, если что-то неясно..
> Вот тут можно поподробнее..
> почему crt так действует на Eof,при этом блокируя работу CTRL-Z?
Да просто она так сделана! Я не видел ее сорсов и ничего про это не знаю. Перехватывает файловый ввод/вывод на консоль, да и все тебе тут.. Так захотели разработчики.. При этом они, как ты убедился, оставили лазейку для использования Ctrl-Z, хотя и не очень хорошо. В свое время, чтоб избежать всяких таких сложностей, я написал свой собственный модуль для работы с экраном (цвет и т.п.), а CRT отложил в сторонку, и пользовался Ctrl-Z без ограничений. Правда, у этого подхода тоже есть недостатки, но это другой разговор.
> Twork-это время работы.
это общее время работы, то есть промежуток
> topen и tclose -закрытие открытие...
то есть моменты свершения неких событий
> запутался вот где...t,t1,t2 - это что за времена?работы,обслуживания и..и чего?
t - это как бы текущее время в нашей модели.
t1 - время начала сеанса стрижки;
t2 - время окончания сеанса.
Ты не замечал, что то, что мы называем временем (и измеряем в часах, секундах..) на самом деле имеет сильно неодинаковый смысл? Рассмотрим фразу:
"Мой обед по расписанию рабочего дня длится 1 час, при этом начинается он в 12:00, поэтому сейчас, в 12:45, господин старший менеджер, я имею полное право разгадывать кроссворд."
Тут 1 час - это длительность промежутка времени. Обед был сегодня, будет завтра - это некий процесс, и 1 час - это продолжительность его течения. Здесь TWork - это время работы парикмахера, то есть сколько времени продолжался процесс стрижки. Этот процесс мог прерываться (если были простои), но мы считаем суммарное время. И это важно, так как промежутки времени можно суммировать.
12:00 - это время события. Такое же, как твой год рождения или отмена крепостного права (1861г.). Оно зафиксировано на шкале времени. Тут таковыми являются время открытия и закрытия, время начала и окончания сеанса. Складывать их бессмысленно (сложи начало обеда (12) с концом обеда (13) - и что получишь? Кому надо это 25?). Зато можно к таким временам прибавлять промежутки. Еще, их можно вычитать, чтоб получать промежутки..
12:45 - это текущее время. Оно в каждой реальности одно, но реальностей может быть много. Смотря фильм, мы живем во времени фильма (а в нем может быть несколько нитей). Решая задачу про парикмахера (моделируя его деятельность во времени), мы должны иметь его текущее время. При этом отмечать всякие события, мелкие и крупные, если надо. Например, начало и конец сеанса..
Ты понял, почему я все это развел?
Ты сказал: "Twork-это время работы". Это неточно. Я уточнил: общее время работы, чтобы ты не путал с текущим временем работы (жизни) парикмахера. И счел нужным навести порядок в твоих мыслях. Получилось?..