Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Парикмахерская

Автор: Дон 21.11.2006 2:21

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

Автор: lapp 21.11.2006 10:49

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

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

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

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

Автор: Дон 21.11.2006 17:46

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


Я в паскале очень слаб...он у нас идет первый год,преподы постоянно менялись,вообщем ничему нас не учили...давали на самостоятельное изучение...
Вообщем я сегодня-завтра сбегаю за учебником по паскалю и начну штудировать.может быть подскажите автора?
А за алгоритм большое спасибо!!!!!!

Автор: lapp 22.11.2006 6:21

Цитата(Дон @ 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? Между ними мы будем вставлять операторы. Кроме того, мы добавим и данных. Программа заканчивается точкой.

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

Автор: lapp 23.11.2006 20:10

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

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

Автор: Дон 23.11.2006 22:28

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


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

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

Ага,если можно...
А то Promt перевел так:Парикмахерская открывается *** через ***

Автор: lapp 24.11.2006 7:46

> Потом мы взяли эти переменные и присвоили им значения: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

Автор: Дон 25.11.2006 1:44

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


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

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


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

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

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

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

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

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

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

Работаю в Turbo Pascal 7.0...

Автор: lapp 25.11.2006 15:13

Привет!
> 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

Автор: Дон 25.11.2006 20:58

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


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

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

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

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

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

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

Автор: lapp 26.11.2006 5:09

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

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

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

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

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

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

Автор: Дон 26.11.2006 19:07

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


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

Цитата
Что касается дальнейшего - тебе нужен еще один массив. Определи его по примеру 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.


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

Автор: lapp 27.11.2006 13:17

Цитата(Дон @ 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

Автор: Дон 29.11.2006 1:53

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


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

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


а как ответить на эти вопросы?может быть надо суммировать кол-во клиентов прошедших за день в конце программы?

Автор: lapp 29.11.2006 6:42

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

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

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

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

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

Автор: lapp 1.12.2006 9:53

Дон, ты сдался? надоело?.. Еще одна зарубка в ряду активно начинающих и странным образом исчезающих собеседников.. Ведь ни один еще не добрался до конца! Не любят у нас бесплатных школ.. 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
впрочем, у тебя всегда есть шанс реабилитироваться.. ;)

Автор: Дон 1.12.2006 18:49

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

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.


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

Автор: lapp 2.12.2006 3:48

Цитата(Дон @ 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
Успехов!

Автор: Дон 2.12.2006 23:40

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

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

Цитата
Например,
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 все ясно..
с алгоритмикой у мну все в порядке..оформлять я не умею,иногда просто тупо забываю какой знак за каким стоит..буду тренироваться!

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

Все работает и пока что все ясно!

Автор: lapp 6.12.2006 8:04

Цитата(Дон @ 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

Автор: Дон 7.12.2006 1:32

Мда..все-таки комментарии вещь хорошая...без них бы мало что понял)))
А как вывести в начале программы большими белыми буквами "Парикмахерская"?Я так понимаю это особые параметры оператора Write?

Автор: Lapp 7.12.2006 11:39

Цитата(Дон @ 6.12.2006 22:32) *

А как вывести в начале программы большими белыми буквами "Парикмахерская"?Я так понимаю это особые параметры оператора Write?

Что значит большими? к сожалению, в командной строке менять размер шрифта нельзя. Можешь просто написать все прописными: ПАРИКМАХЕРСКАЯ. Да, просто добавь в начале где-нить оператор
WriteLn('ПАРИКМАХЕРСКАЯ');
Если ты просто наберешь это в программном редакторе и запустишь - все сработает. Но при последующих копированиях файла туда-обратно может вместо русских букв полезть всякая дрянь.. Это из-за того, что паскалевский редактор использует кодировку DOS, а ноутпад, например (и не только) - Widows. И это есть та причина, почему я использую английский в программах, либо ненавидимую мной латиницу.. Так что будь к этому морально готов. А если хочешь с этим получше разобраться - скажи, помогу.

Автор: Дон 7.12.2006 12:31

Цитата
И это есть та причина, почему я использую английский в программах, либо ненавидимую мной латиницу..


Можно в принципе и на английсском...я просто хотел сделать нечто вроде приветствия,вот мол,здравствуйте,это парикмахерская...цвет же можно поменять?

Автор: Lapp 7.12.2006 13:08

Цитата(Дон @ 7.12.2006 9:31) *

Можно в принципе и на английсском...я просто хотел сделать нечто вроде приветствия,вот мол,здравствуйте,это парикмахерская...цвет же можно поменять?

Ты все же попробуй на русском. Надо хоть раз самому прочувствовать. А если все будет хорошо, то и хорошо.
Цвет поменять нетрудно. Только нужно будет в самом начале (первой строчкой) вставить оператор:
uses CRT;
Это использование библиотеки для текстового вывода (происходит от Cathode Ray Tube, то есть электронно-лучевая трубка). Тогда ты сможешь менять цвет самих символов и фона:
TextColor©;
TextBackground©;
Поварьируй c в пределах от 0 до 15 (для фона от 0 до 7).

Автор: Дон 8.12.2006 2:24

Цитата
Поварьируй c в пределах от 0 до 15 (для фона от 0 до 7).


И цвет фона поменял и текста,только...
Нужно чтобы цвет меняла только надпись "Парикмахерская"..а так как мы вставляем оператор textcolor после begin,то цвет меняет весь текст в программе...
я думал что-то получится,если напишу так:

Код
begin
TextColor(2);
Write('Парикмахерская');
end;


то есть отдельным циклом...но не вышло..как поступить?

Цитата
Плохо выглядит вывод времени в долях часа..


действительно плохо..как этого можно избежать?

Автор: Lapp 8.12.2006 6:49

Цитата(Дон @ 7.12.2006 23:24) *

Код
begin
TextColor(2);
Write('Парикмахерская');
end;

то есть отдельным циклом...но не вышло..как поступить?
действительно плохо..как этого можно избежать?

Это не цикл.. Циклы - это три конкретных оператора: for, while, repeat. А begin и end - это так называемые "операторные скобки", они превращают группу операторов в как бы один. Но только тут они не нужны. Все, что тебе нужно - это после написания сменить цвет обратно:
Код
TextColor(2);
Write('Парикмахерская');
TextColor(7);

Что касается форматирования времени под вывод минут, то это можно сделать примерно так..

Сначала берешь целую часть времени в часах (это сколько часов), потом дробную часть умножаешь на 60 и округляешь (это минуты).
var Hour,Min:integer;
....
Hour:=Trunc(t);
Min:=Round(Frac(t)*60);
WriteLn('Время ',t :2 :4,' соответствует ', Hour,' час ',Min,' мин');

Этот вариант все же грешит тем, что выводит минуты без нулей. Поэтому если хочешь организовать стандартный вывод Час:Мин (через двоеточие), то надо добавлять печать нуля, если минут меньше 10 (то есть чтоб было 12:02, а не 12:2 )
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);

И напоследок, поскольку у тебя в программе вывод времени делается много раз, то лучше засунуть это все в процедуру.

Автор: Дон 9.12.2006 1:25

Цитата
TextColor(2);
Write('Парикмахерская');
TextColor(7);


Вот какая фигня...текст-то он окрасил...
Только вот когда я задаю Uses Crt; в начале программы,CTRL-Z у меня работать перестает..как они связаны?когда убираю Uses Crt; все прекрасно работает...

Цитата
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);


А это куда вставлять?

Автор: Lapp 9.12.2006 15:35

Цитата(Дон @ 8.12.2006 22:25) *

когда я задаю Uses Crt; в начале программы,CTRL-Z у меня работать перестает..как они связаны?когда убираю Uses Crt; все прекрасно работает...

Что ж, поздравляю - ты сам отлично справился с диагностикой проблемы! это не так просто, можно и не обратить внимания на всякме там CRT.. smile.gif
Серьезно - CRT действительно, з@р@з@, переделывает стандартный ввод по-своему, и за это я ее не люблю. Когда я советовал тебе использовать этот модуль, я забыл, что мы работаем с EoF, извини.. Но вышло даже хорошо - ты набираешь опыт! smile.gif.
Значица, так.. Сейчас я в другой твоей теме брошу ссылку на один простенький но крайне полезный документ. В Сети есть много его HTML-версий, но у них у всех битые связи. А этот хоть и не HTML, но, вроде, правильный - ты его скачай и распакуй.
Там зайди в приложение, описывающее модуль CRT. Мне кажется, этой информации тебе должно хватить, чтобы ты мог заставить Ctrl-Z снова заработать. Только замечу, что после этого тебя ждет другая неприятность - может перестать работать ReadLn (задержка в конце). Советую заменить его на ReadKey (это функция/процедура CRT, очень полезная сама по себе).
Цитата(Дон @ 8.12.2006 22:25) *

А это куда вставлять?

Ну, это не совсем вставлять.. Это я пример типа привел, как сделать вывод времени абстрактно. Ты как бы должен его переработать, взять из него необходимое, лишнее выбросить, что-то изменить - ну и вставить, куда нужно, тоже smile.gif. Я в конце прошлого мессаджа намекал, что хорошо бы организовать этот вывод как процедуру или функцию - причем, функция (типа String), мне кажется, предпочтительнее. Если ты еще не разбирался с процедурами/функциями - самое время начать. Я сейчас не стану тебе спойлить удовольствие, но если не получится - в следующий раз разберем smile.gif.

Автор: Гость 9.12.2006 17:20

Цитата
Там зайди в приложение, описывающее модуль CRT.


Зашел,почитал...не разобрался unsure.gif
мы должны использовать функцию KeyPressed?

Автор: Lapp 9.12.2006 17:28

Цитата(Гость @ 9.12.2006 14:20) *

Зашел,почитал...не разобрался unsure.gif

Такое там не видел?
CheckEof:Boolean; {Разрешает/запрещает контроль Ctrl-Z}
Перед циклом ввода данных пользователей поставь
CheckEof:=true;
Тогда работа Ctrl-Z возобновится. Правда, по-другому. Например, Enter уже будет не нужен..
И в конце, возможно, будет отличие..

Автор: Дон 10.12.2006 1:27

Цитата
Такое там не видел?


неа..признаться честно,не нашел..

CheckEof:Boolean; мы обьявляем в разделе переменных,а CheckEof:=true; куда?перед циклом ввода данных поставил..все равно не работает моя Ctrl-Z !4.gif

Автор: Lapp 10.12.2006 9:08

> неа..признаться честно,не нашел..
Но теперь-то видишь?

> CheckEof:Boolean; мы обьявляем в разделе переменных,
А вот этого делать не надо. Эта переменная уже определена в модуле CRT, так же как и процедуры и константы типа White, Red.. Когда ты ее определил сам, ты на самом деле ее переопределил, то есть сделал новую такую переменную, а ту сделал недоступной. Потому и не работает.. smile.gif

> а CheckEof:=true; куда?перед циклом ввода данных поставил..
Да, туда.

> все равно не работает моя Ctrl-Z !4.gif
Убери переопределение smile.gif
Теперь ты познакомился поближе с работой модулей.
Step by step. One at a time. Все так и должно быть. Жаль только, что остальные в тему, похоже, перестали заглядывать, а меня тебе приходится ждать сутки.. sad.gif
Больше читай и не пропускай ничего. И делай ипрогоняй маленькие программки-тесты на то, что прочитал. Обычно достаточно две-три строчки - и ты не только лучше разберешься, но и лучше запомнишь.
Успехов!

Автор: Дон 10.12.2006 20:00

Цитата
Если ты еще не разбирался с процедурами/функциями - самое время начать.


нет..признаться,с ними я не знаком..

Цитата
Но теперь-то видишь?


В разделе CRT?Нету!я даже поиск давал по главам,по слову CheckEof...ничего не нашел...

Цитата
Убери переопределение

Убрал-заработало!мелочь,а приятно... rolleyes.gif

Кстати,я убрал вывод простоя между работой парикмахера..вот это:
Код
if t>t1 then t1:=t;
    {выводим время простоя, если оно было}


он ведь показывает сколько прошло времени,пока не было клиентов?просто кажется..лишнее это..да и глазу,если честно,мешает...
осталось только то время,которое с момента обслуживания последнего клиента и до конца работы осталось...

Автор: Lapp 11.12.2006 9:12

Цитата(Дон @ 10.12.2006 17:00) *

В разделе CRT?Нету!я даже поиск давал по главам,по слову CheckEof...ничего не нашел...

Послушай, я же писал:
Цитата(Lapp @ 9.12.2006 12:35) *

Там зайди в приложение, описывающее модуль CRT.

Точнее: Приложение 4, П4.3.2
Надеюсь, теперь найдешь.. smile.gif
А поиск там голимый.. только в текущем топике.. sad.gif

Автор: Дон 12.12.2006 4:08

Цитата
Точнее: Приложение 4, П4.3.2

У нас по приложению 4-Типы данных!
не могу найти wacko.gif

Я вот тут описываю программу..ее надо описать вместе с операторами..

Цитата
Программа состоит из 55 строчек. Язык, используемый программой – русский.
В тексте программы использовались такие операторы, как:
WriteLn;
While;
For;
If; else;

В разделе var мы объявляем время прихода каждого клиента, время его обслуживания, а также общее число клиентов.
Операторами TOpen; и TClose; мы обьявили время открытия и время закрытия парикмахерской.


Подскажите,пожалуйста,как бы покультурней описать While?может быть еще что-то надо описать?

Автор: Lapp 12.12.2006 6:16

> У нас по приложению 4-Типы данных!
Это Глава 4 - Типы данных. Смотри Приложения внизу..

> Я вот тут описываю программу..ее надо описать вместе с операторами..
> Программа состоит из 55 строчек. Язык, используемый программой – русский.
Язык интерфейса программы - русский (латиница)

> В тексте программы использовались такие операторы, как:
> WriteLn;
> While;
> For;
> If; else;
Убери ";", это не есть часть оператора. А внутри оператора "if ... then ... else" они просто являются ошибкой (проверь, попробуй поставить ";" перед else).

> В разделе var мы объявляем время прихода каждого клиента,
Мы объявляем переменные для хранения времени ....

> Операторами TOpen; и TClose; мы обьявили время открытия и
Это не операторы. Это переменные, которые мы завели для хранения времени открытия и закрытия парикмахерской.

> как бы покультурней описать While?может быть еще что-то надо описать?
Цикл while осуществляет регистрацию клиентов по мере их поступления, присваивая каждому клиенту его номер и занося в массивы время прихода и время, необходимое для обслуживания каждого клиента. Выход из цикла осуществляется по признаку конца файла ввода (Ctrl-Z для файла типа text).

Цикл for является централной конструкцией в данной программе. Он осуществляет моделирование работы мастера, состоящее в вызове мастером клиентов по очереди (по мере освобождения мастера либо по мере поступления клиентов, в зависимости от того, что наступает раньше). Моделирование осуществляется посредством вычисления времени начала (переменная t) и конца (переменная t1) сеанса. При этом если оставшегося рабочего времени недостаточно для обслуживания вызываемого клиента, то ему сообщается о невозможности обслуживания, после чего осуществляется переход к следующему по очереди клиенту. Цикл заканчивается по окончании обслуживания (либо сообщении об отказе в сервисе) всех клиентов. В процессе цикла суммируется общее рабочее время мастера (переменная tWork), а также выводится информауия о предпринятом действии (обслуживание с временем начала и конца, отказ). По завершении цикла выводится суммарное общее число обслуженных (то есть тех, кому не было отказано в сервисе) клиентов и полное рабочее время мастера.

Вот, примерно так, думаю.. smile.gif

Автор: Дон 13.12.2006 2:35

Цитата
Смотри Приложения внизу..


Усе..найдено)))

Цитата
Вот, примерно так, думаю..

спасибо большое give_rose.gif

Я вот еще чего не догоняю...
Цитата
: исходные данные (подробно описать исходные данные и их типы); математическая модель задачи (описать метод решения); выходные данные (описать конечные данные и их типы).


Исходных данных у нас два штуки-время прихода и время обслуживания,тип данных-real.
А вот остальное я торможу...что такое выходные данные?это время простоя,кол-во пришедших клиентов и время,в общем потраченное?или я неправильно понимаю задание...
еще математическая модель задачи..это как?

Автор: Lapp 13.12.2006 8:35

> Усе..найдено)))
Вывод: внимательнее относись к советам и ууказаниям. Я с самомго начала говорил именно о приложении.

> что такое выходные данные?
Как что? blink.gif То, что программа выводит. Обычно это то, что спрашивается в задаче, но иногда приходится привоекать еще что-то.. Здесь, например, спрашивается только кол-во обслуженных клиентов и рабочее время. Мы же выводим весь протокол рабочего дня - построчно, кого и когда обслужили или послали.. Эти данные можно назвать "промежуточными", но раз мы их выводим - они выходные. Упомяни, что это делается для контроля работы программы и может быть убрано (кстати, можешь ввести печать/непечать этих данных по ключу)
> еще математическая модель задачи..это как?
Ну.. Скажем, это суммирование времени в цикле с проверкой условий на пригодность данных (если времени нужно много - данные непригодны, клиенту отказывается).
[/quote]

Автор: Дон 14.12.2006 21:29

Прошелся по программе...возникло несколько вопросов...

Цитата
Серьезно - CRT действительно, з@р@з@, переделывает стандартный ввод по-своему, и за это я ее не люблю. Когда я советовал тебе использовать этот модуль, я забыл, что мы работаем с EoF, извини..

Вот тут можно поподробнее..почему crt так действует на Eof,при этом блокируя работу CTRL-Z?

Цитата
t,t1,t2,TWork,TOpen,TClose:real;


Twork-это время работы.
topen и tclose -закрытие открытие...
запутался вот где...t,t1,t2 - это что за времена?работы,обслуживания и..и чего?

Автор: Lapp 15.12.2006 8:42

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

> Вот тут можно поподробнее..
> почему 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-это время работы". Это неточно. Я уточнил: общее время работы, чтобы ты не путал с текущим временем работы (жизни) парикмахера. И счел нужным навести порядок в твоих мыслях. Получилось?.. smile.gif

Автор: Дон 16.12.2006 20:51

Цитата
Получилось?..


А то...
Я почему постоянно переспрашиваю..глупости всякие...боюсь что-то недопонять...
Лучше быть умным и иногда тупить,чем быть тупым и всегда умничать))))