Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
vasiliy9211
0 / 0 / 0
Регистрация: 28.09.2016
Сообщений: 21
#1

Задача "Рабочее время": Помогите Ивану Ивановичу найти его суммарные затраты времени за год. - C++

28.09.2016, 08:25. Просмотров 233. Ответов 3
Метки нет (Все метки)

есть программа написанная на паскале. мне нужно в c++. пропустил несколько занятий в универе и не могу теперь написать программу. help me.
Рабочее время

Иван Иванович – очень ответственный, но очень рассеянный человек. Поэтому когда он начинает очередное дело, он на отдельном листочке пишет дату и время начала (например, 29.01. 10:30), а когда заканчивает, то так же на отдельном листочке – дату и время окончания (например, 02.02. 12:15). Листочки аккуратно укладываются в стопку один на другой. А так как одновременно Иван Иванович может заниматься только одним делом, то листочки однозначно упорядочены в стопке: листок начала какого-то дела, листок окончания этого дела, листок начала, листок окончания… и т.д. Дело начинается в начале минуты, указанной в листочке начала этого дела, а заканчивается в конце минуты, указанной на листочке окончания. Иван Иванович ходит на работу каждый день и его рабочий день продолжается с 10:00 до 18:00. Таким образом, пара листочков «18.11. 15:13» — «20.11. 10:27» была написана при начале и окончании дела длительностью 11ч.15м.

Однажды в конце декабря уборщица Дуся нечаянно уронила эту стопку на пол и, не зная важной закономерности их укладки, собрала листочки обратно в каком-то произвольном порядке. Иван Иванович обнаружил этот прискорбный факт только 31 декабря, когда ему надо было произвести учет своего рабочего времени за год. Год был невисокосный.

Помогите Ивану Ивановичу найти его суммарные затраты времени за год.

Пример:

Input.txt:
4
15.01. 17:00
16.01. 12:00
11.02. 14:00
30.01. 10:00
Output.txt:
103:02
вот код на паскале:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
uses SysUtils;
var
  i,j,tmin,tmax,k:longint;
  s:string;
  t:array[100..3113,0..480] of boolean;
  b:boolean;
begin
  readln(k);
  tmin:=3112;tmax:=100;
  for k:=1 to k do begin
    readln(s);
    i:=StrToInt(s[4]+s[5]+s[1]+s[2]);
    if i>tmax then tmax:=i;
    if i<tmin then tmin:=i;
    j:=strtoint(s[8]+s[9])*60+strtoint(s[11]+s[12])-600;
    t[i,j]:=true;
  end;
  k:=0;
  i:=tmin;
  repeat
    if ((i div 100 in [1,3,5,7,8,10]) and (i mod 100=32)) or
        ((i div 100 in [4,6,9,11]) and (i mod 100=31)) or
        ((i div 100 =2) and (i mod 100=29)) then i:=(i div 100+1)*100+1;
     for j:=0 to 480 do begin
       if t[i,j] then begin
         b:=not b;
         if not b then k:=k+1;
       end;
       if b then k:=k+1;
     end;
     k:=k-ord(b);
     i:=i+1;
  until i>tmax;
  if k mod 60<10 then s:=':0' else s:=':';
  writeln(k div 60,s,k mod 60);
end.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2016, 08:25     Задача "Рабочее время": Помогите Ивану Ивановичу найти его суммарные затраты времени за год.
Посмотрите здесь:
C++ если не составит труда(при вводе "n" должно создаваться предложение "Мне n год (года)")
"Красный Тигр" vs. "Желтый Заяц". А каким будет 3005 год? C++
C++ Превратить заданную пользователем дату в формате "дд.мм.гг" в формат "месяц дд. год"
Найти среднее арифметическое заданного поля (год издания) массива объектов типа "Книга" C++
Вывести "Leap Year", если заданный год високосный и "Normal Year" в противном случае C++
Кто нибудь делал прогу "Эмулятор клавиш с промежутком времени между "нажатиями""? C++
C++ Задача из Златопольского: "Найти числа с известным количеством делителей". Не могу найти ошибку
Из слова апельсин путем "вырезок" и "склеек" его букв получить слово спаниель C++
Со слова процессор путем "вырезок" и "склеек" его букв получить слово рессор C++
В тех словах, которые окончиваются сочетанием букв "ть", заменить его окончание на "ил" C++
Создание объекта класса сразу после его описания (между "}" и ";") C++
C++ Помогите найти ошибки: "Указатели на массивы"

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ФедосеевПавел
Модератор
2084 / 1135 / 468
Регистрация: 01.02.2015
Сообщений: 3,696
28.09.2016, 09:17     Задача "Рабочее время": Помогите Ивану Ивановичу найти его суммарные затраты времени за год. #2
Я не пойму принцип приведённого алгоритма. Когда-то решал эту задачу тривиально:
1. Представил все события на одной оси времени. Т.е. сначала записал в массив "ось времени" (Events) все события, а затем отсортировал их (упорядочил по возрастанию). Тут применил трюк, недопустимый в PABC.NET - содержимое переменной типа TTimeStamp можно представить или как одно число или как два (дата и время в минутах).
2. Теперь все события упорядочены. Перебираем "листочки" и учитываем, что если работа заняла несколько дней, то она прерывалась в 18:00 и возобновлялась в 10:00.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
program acmp_0184;
 
type
  TTimeStamp = record
    case integer of
      0: (Time, Date: word);
      1: (DateTime: dword)
  end;
  TListEvents = array of TTimeStamp;
const
  Days: array[1..12] of word = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334);
const
  TimeStart = 10 * 60;
  TimeStop  = 18 * 60;
 
  procedure QuickSort(var a: TListEvents; N: integer);
 
    procedure sort(l, r: integer);
    var
      i, j: integer;
      x, y: TTimeStamp;
    begin
      i := l;
      j := r;
      x := a[l + random(r - l)];
      repeat
        while a[i].DateTime < x.DateTime do
          i := i + 1;
        while x.DateTime < a[j].DateTime do
          j := j - 1;
        if i <= j then
        begin
          if a[i].DateTime > a[j].DateTime then
          begin
            y := a[i];
            a[i] := a[j];
            a[j] := y;
          end;
          i := i + 1;
          j := j - 1;
        end;
      until i >= j;
      if l < j then
        sort(l, j);
      if i < r then
        sort(i, r);
    end; {sort}
 
  begin
    {quicksort};
    sort(0, N - 1);
  end;
 
var
  Events: TListEvents;
  K: integer;
  s: string;
  temp: integer;
  i: integer;
  WorkTime: dword;
begin
  readln(K);
  setlength(Events, K);
  for i := 0 to K - 1 do
  begin
    readln(s);
    val(copy(s, 1, 2), Events[i].Date);
    val(copy(s, 4, 2), temp);
    Events[i].Date := Events[i].Date + Days[temp];
    val(copy(s, 8, 2), temp);
    val(copy(s, 11, 2), Events[i].Time);
    Events[i].Time := Events[i].Time + 60 * temp;
  end;
 
  QuickSort(Events, K);
 
  WorkTime := 0;
  i := 0;
  while i < K do
  begin
    while Events[i].Date <> Events[i + 1].Date do
    begin
      WorkTime := WorkTime + TimeStop - Events[i].Time;
      Events[i].Time := TimeStart;
      Inc(Events[i].Date);
    end;
    WorkTime := WorkTime + Events[i + 1].Time - Events[i].Time + 1;
    Inc(i, 2);
  end;
 
  temp := WorkTime mod 60;
  Str(temp: 2, s);
  if s[1] = ' ' then
    s[1] := '0';
  writeln(WorkTime div 60, ':', s);
end.
Думаю, что этот код перевести в C/C++ легче. Да и алгоритм понятнее - можно самостоятельно реализовать.

Добавлено через 3 минуты
Ха-ха. Пока отвечал - тема переехала из Pascal в С++.
Puporev
28.09.2016, 09:43
  #3

Не по теме:

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
тема переехала из Pascal в С++.
Перенес, пусть здесь маются, мы свое отмаялись здесь.
Задача "Рабочее время"

Joy
Эксперт Pascal/Delphi
1985 / 1024 / 780
Регистрация: 29.08.2014
Сообщений: 3,730
29.09.2016, 18:12     Задача "Рабочее время": Помогите Ивану Ивановичу найти его суммарные затраты времени за год. #4
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Я не пойму принцип приведённого алгоритма
да табель по дням в рабочих минутах заполняю [101 - первое января..3112-31 декабря, 480 - число минут в сутках], потом сумму считаю и выдаю результат.

Добавлено через 6 минут
*480 - число рабочих минут в сутках.
Yandex
Объявления
29.09.2016, 18:12     Задача "Рабочее время": Помогите Ивану Ивановичу найти его суммарные затраты времени за год.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru