Помощь - Поиск - Пользователи - Календарь
Полная версия: задача подсчитать сколько за 1 час сделано компов
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
maksimla
Задачка
Компьютерного производства рабочее время с 0.00 до 23.59 часов. Когда произвели компьютер сразу комп попадает в погрузочный отдел и зразу грузит в машину. Компьютеры в машину грузят не больше чем один час от изготовления первого компа. Загрузивши последний комп машина уежает. Другая машина приезжает когда новый комп произвели. В последнию машину грузят комп до конца рабочего времени.
Напишите программу которая находит сколько машин за день было и сколько компов погрузилось в каждую машину.
Первичные данный записаны в файле duom.txt . На первой строчке написан натуральное число n(<=1440), обозначает сколько компьютеров произведено всего. На второй строчке записаны два натуральных числа h и m обозначающее час и минуты которые показывают время погрузки компа.
Результаты записываем в файл rez.txt На первой строчке пишем сколько машин погрузили на остальных строчках пишим сколько в каждой машине компов.
Пример начальные данные
8
12 30
23 59
13 29
11 0
0 30
13 31
0 0
13 30
результат
5
2
1
2
2
1
Объяснение
В первую машину погрузили компы в 0.00 и 0.30 час.
во вторую машину погрузили в 11.00 час.
в третию машину погрузили в 12.30 и 13.29 час.
в четвертую машину погрузили в 13.30 и 13.31 час.
в пятую машину погрузили компы в 23.59 час.

В программе сделал сортировку времени по возрастанию
Потом сравниваю время и там только пары показывает ну остальные показывает но не так как я хотел они просто повторяются несколько раз бессмысленно и все
program masdvi;
var n,i,j,p,c:0..1440;
h:array [0..1440] of 0..23;
m:array [0..1440] of 0..59;
duom,rez:text;
a:0..24;
b:0..59;

begin
assign(duom,'duom.txt');
Assign (rez,'rez.txt');
reset (duom);
rewrite (rez);
Readln(duom,n);
for i:=1 to n do
readln(duom,h[i],m[i]);
{********************cortirovka******************************}
for j:=1 to n do
for i:=1 to n-1 do
if (h[i]=h[i+1]) and (m[i]>m[i+1])
then begin
a:=h[i];
h[i]:=h[i+1];
h[i+1]:=a;
b:=m[i];
m[i]:=m[i+1];
m[i+1]:=b;
end
else if (h[i]>h[i+1]) then begin
a:=h[i];
h[i]:=h[i+1];
h[i+1]:=a;
b:=m[i];
m[i]:=m[i+1];
m[i+1]:=b;
end;


{*****************vv error*********************************}
for i:=1 to n do
begin
p:=1;
j:=0;
for j:=i+1 to n do
begin
{writeln('i= ',i,' j= ',j);}
a:=h[i];
inc(a);
if h[i]=h[j] then begin inc(p); writeln('p= ',p,' ',h[i],' = ',h[j],' ',m[i],' ',m[j]); end;
if (a=h[j]) and (m[i]>m[j]) then begin inc(p); writeln('kjh p= ',p,' ',h[i],' = ',h[j],' ',m[i],' ',m[j]); end;
{if (h[i]<>h[j]) and (a<>h[j]) and (p=1) then begin inc(p) writeln(h[i],' ',m[i]); inc(i); end; }
{if (h[i]<>h[j]) and (a<>h[j]) and (p>1) then begin writeln('kkmj') writeln('p= ',p); i:=i+p-1; j:=i;p:=1; writeln('i= ',i); end; }
end;
{writeln('p= ',p);} i:=i+p-1; {writeln('i= ',i);}
end;

{*****************vivod*******************************}
for i:=1 to n do
writeln(h[i],' ',m[i]);
readln;
close(duom);
close(rez);
end.
maksimla
Посмотрел еще получилось это без последних цифр подсчета
program masdvi;
var n,i,j,p,c:0..1440;
h:array [0..1440] of 0..23;
m:array [0..1440] of 0..59;
k:array [0..1440] of 0..1440;
duom,rez:text;
a:0..24;
b:0..59;

begin
assign(duom,'duom.txt');
Assign (rez,'rez.txt');
reset (duom);
rewrite (rez);
Readln(duom,n);
for i:=1 to n do
readln(duom,h[i],m[i]);
{********************cortirovka******************************}
for j:=1 to n do
for i:=1 to n-1 do
if (h[i]=h[i+1]) and (m[i]>m[i+1])
then begin
a:=h[i];
h[i]:=h[i+1];
h[i+1]:=a;
b:=m[i];
m[i]:=m[i+1];
m[i+1]:=b;
end
else if (h[i]>h[i+1]) then begin
a:=h[i];
h[i]:=h[i+1];
h[i+1]:=a;
b:=m[i];
m[i]:=m[i+1];
m[i+1]:=b;
end;


{*****************vv error*********************************}
c:=0;
for i:=1 to n do
begin
j:=0;
p:=0;
for j:=i+1 to n do
begin
{writeln('i= ',i,' j= ',j); }
a:=h[i];
inc(a);
if h[i]=h[j] then begin
if p=0 then p:=2
else inc(p);
writeln('p= ',p,' ',h[i],' = ',h[j],' ',m[i],' ',m[j]);
end;
if (a=h[j]) and (m[i]>m[j]) then begin
if p=0 then p:=2
else inc(p);
writeln('kjh p= ',p,' ',h[i],' = ',h[j],' ',m[i],' ',m[j]);
end;
if (h[i]<>h[j]) and (a<>h[j]) and (p=0) then begin
inc(p);
writeln(h[i],' ',m[i]);
end;
{if (h[i]<>h[j]) and (a<>h[j]) and (p>1) then begin writeln('kkmj') writeln('p= ',p); i:=i+p-1; j:=i;p:=1; writeln('i= ',i); end;}
end;
{writeln('p= ',p);
writeln('i= ',i);}
inc©;
k[c]:=p;
if i=n-2 then i:=n
else i:=i+p-1;
{writeln('i:=i+p-1: =',i); }

end;
writeln;
writeln©;
writeln;
for j:=1 to c do
writeln(k[j]);

{*****************vivod*******************************}
for i:=1 to n do
writeln(h[i],' ',m[i]);
readln;
close(duom);
close(rez);
end.


Добавлено через 4 мин.
И еще мне не нравится что идет циклы после сравнения и что дальше нечего сравнивать уже если один раз неравно
volvo
Цитата
Потом сравниваю время и там только пары показывает ну остальные показывает но не так как я хотел
Вот так хотел? smile.gif
type
pair = record
hr, min: integer;
end;
const
n = 8;
ar: array[1 .. n] of pair = (
(hr:12; min:30),
(hr:23; min:59),
(hr:13; min:29),
(hr:11; min: 0),
(hr: 0; min:30),
(hr:13; min:31),
(hr: 0; min: 0),
(hr:13; min:30)
);

function more(a, b: pair): boolean;
begin
more := ((a.hr > b.hr) or ((a.hr = b.hr) and (a.min > b.min)));
end;
function diff(a, b: pair): integer;
begin
diff := 60 * (b.hr - a.hr) + (b.min - a.min);
end;

var
i, j: integer;
T, start: pair;
begin
for i := 1 to n do
for j := n downto i+1 Do
if more(ar[Pred(j)], ar[j]) then begin
T := ar[Pred(j)]; ar[Pred(j)] := ar[j]; ar[j] := T
end;

start := ar[1];
for i := 1 to n do begin
if diff(start, ar[i]) >= 60 then begin
writeln;
start := ar[i];
end;
write(ar[i].hr, ':', ar[i].min, ' ');
end;

end.
(я для теста вбил твои данные в программу, но ничего не мешает тебе читать их из файла. Как видишь, время полностью совпадает с тем, что ты привел. Осталось только подсчитать количество компьютеров в каждой машине и все...)
maksimla
Спасибо теперь все работает все доделал и разобрался только есть несколько вопросов Почему в в type использовали integer о не byte или 0..59? Сколько памети берет 0..59 меньше чем byte? И я не ошибся что взял 0..59 ?
type
pair = record
hr, min: 0..59;
end;
var
n,a:0..1440;
ar: array[1 .. 1440] of pair;
mas:array [1..1440] of 0..1440;
function more(a, b: pair): boolean;
begin
more := ((a.hr > b.hr) or ((a.hr = b.hr) and (a.min > b.min)));
end;
function diff(a, b: pair): integer;
begin
diff := 60 * (b.hr - a.hr) + (b.min - a.min);
end;

var
i, j: integer;
T, start: pair;
duom,rez:text;
begin
assign(duom,'duom.txt');
Assign (rez,'rez.txt');
reset (duom);
rewrite (rez);
Readln(duom,n);
for i:=1 to n do
readln(duom,ar[i].hr,ar[i].min);
for i := 1 to n do
for j := n downto i+1 Do
if more(ar[Pred(j)], ar[j]) then begin
T := ar[Pred(j)]; ar[Pred(j)] := ar[j]; ar[j] := T
end;
a:=0;
j:=0;
start := ar[1];
for i := 1 to n do begin
if diff(start, ar[i]) >= 60 then begin
if a>0 then begin inc(j); mas[j]:=a end;
a:=0;
start := ar[i];
end;
inc(a);
end;
if a>0 then begin inc(j); mas[j]:=a end;
writeln(rez,j);
for i:=1 to j do
writeln(rez,mas[i]);
close(duom);
close(rez);
end.



А я еще попробовал и у меня получилось с циклом while только последний элемент не выводит
program masdvi;
var n,i,j,p:0..1440;
h:array [0..1440] of 0..23;
m:array [0..1440] of 0..59;
duom,rez:text;
a:0..24;
b:0..59;

begin
assign(duom,'duom.txt');
Assign (rez,'rez.txt');
reset (duom);
rewrite (rez);
Readln(duom,n);
for i:=1 to n do
readln(duom,h[i],m[i]);
{********************cortirovka******************************}
for j:=1 to n do
for i:=1 to n-1 do
if (h[i]=h[i+1]) and (m[i]>m[i+1])
then begin
a:=h[i];
h[i]:=h[i+1];
h[i+1]:=a;
b:=m[i];
m[i]:=m[i+1];
m[i+1]:=b;
end
else if (h[i]>h[i+1]) then begin
a:=h[i];
h[i]:=h[i+1];
h[i+1]:=a;
b:=m[i];
m[i]:=m[i+1];
m[i+1]:=b;
end;


{*****************vv error*********************************}
i:=1;
while i<n do
begin
j:=i+1;
p:=0;
while j<n do
begin
writeln('i= ',i,' j= ',j);
a:=h[i];
inc(a);
if h[i]=h[j] then begin
if p=0 then p:=2
else inc(p);
writeln('p= ',p,' ',h[i],' = ',h[j],' ',m[i],' ',m[j]);
end;
if (a=h[j]) and (m[i]>m[j]) then begin
if p=0 then p:=2
else inc(p);
writeln('kjh p= ',p,' ',h[i],' = ',h[j],' ',m[i],' ',m[j]);
end;
if (h[i]<>h[j]) and (a<>h[j]) and (p=0) then begin
inc(p);
writeln(h[i],' ',m[i]);
end;
if (h[i]<>h[j]) and (p>=1) or (a<>h[j]) then begin
writeln('kkmj'); writeln('p= ',p); i:=i+p; j:=i; p:=0; writeln('i= ',i); end;
inc(j)
end;

end;

{*****************vivod*******************************}
for i:=1 to n do
writeln(h[i],' ',m[i]);
readln;
close(duom);
close(rez);
end.

теперь мне кажется что моя програмка огромная по сравнению с вашей. Вашее решение понравилось больше что компактное меньше писать надо.
volvo
Цитата
Сколько памети берет 0..59 меньше чем byte?
Меньше чем байт ничего брать по определению не может. Это - минимальный размер. Ты не можешь выделить памяти меньше одного байта, хотя тебе для хранения 0 .. 59 достаточно 6 бит.

Почему я взял Integer - просто по привычке. Если будет большой массив (1440 элементов - уже достаточно много), то имеет смысл сделать байтовые элементы, чтобы не тратить память впустую. С другой стороны, возможно, что обращения к массиву Integer-ов будут выполняться быстрее, чем к Byte-ам. Мне привычнее использовать Integer в таких случаях.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.