Помощь - Поиск - Пользователи - Календарь
Полная версия: задача подсчитать сколько за 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(c);
 k[c]:=p;
                 if i=n-2 then i:=n
                           else i:=i+p-1;
                           {writeln('i:=i+p-1: =',i);    }

end;
    writeln;
    writeln(c);
    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 в таких случаях.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.