<titledata-rh="true">Practice exam C | mf</title><metadata-rh="true"name="viewport"content="width=device-width,initial-scale=1"><metadata-rh="true"name="twitter:card"content="summary_large_image"><metadata-rh="true"property="og:url"content="https://blog.mfocko.xyz/pb071/pexam/cams/"><metadata-rh="true"name="docusaurus_locale"content="en"><metadata-rh="true"name="docsearch:language"content="en"><metadata-rh="true"name="docusaurus_version"content="current"><metadata-rh="true"name="docusaurus_tag"content="docs-pb071-current"><metadata-rh="true"name="docsearch:version"content="current"><metadata-rh="true"name="docsearch:docusaurus_tag"content="docs-pb071-current"><metadata-rh="true"property="og:title"content="Practice exam C | mf"><metadata-rh="true"name="description"content="Stalkingcars…
<em>faculty computers</em>.</li><li>In browser you are only allowed to have the following tabs open:<ul><li><ahref="https://en.cppreference.com"target="_blank"rel="noopener noreferrer">C documentation</a></li><li>page containing the assignment</li></ul></li><li>You <strong>are not</strong> allowed to use your own source code, e.g. prepared beforehand
or from the seminars.</li><li>You have <strong>5 minutes</strong> to read through the assignment and ask any follow-up
questions should be there something unclear.</li><li>You have <strong>60 minutes</strong> to work on the assignment, afterward your work will be
discussed with your seminar tutor.</li></ul></div></div><p>Your task is to write a program <code>cams</code> that will be processing input from the
cams that are capable of identifying license plates on the cars and then
print out summary based on the input data. Your contributions to the society are
very much appreciated and may (or may not) be used for (each or none) of the
following purposes<supid="fnref-1"><ahref="#fn-1"class="footnote-ref">1</a></sup>:</p><ul><li>stalking people leaving and coming back home,</li><li>retroactively making people pay for the parking,</li><li>providing evidence of people speeding on highways,</li><li>tracking people that don't pay tolls, or</li><li>convict employees leaving the work prematurely.</li></ul><h2class="anchor anchorWithStickyNavbar_LWe7"id="format-of-the-input-file">Format of the input file<ahref="#format-of-the-input-file"class="hash-link"aria-label="Direct link to Format of the input file"title="Direct link to Format of the input file"></a></h2><p>Input for your program consists of the data from the cameras. You will be given
the data from the cameras as a path to a file and user should also be able to
specify <code>-</code> (i.e. <code>stdin</code>) as the path.</p><p>Each “scan” (i.e. reading) of the cameras consists of the following data:</p><ul><li><p><em>camera ID</em>: non-negative integer identifying a camera</p></li><li><p><em>plate</em>: string of unknown length that can consist of any characters apart
from whitespace</p></li><li><p><em>timestamp</em>: date and time of the scan as an unsigned integer (represented as
structure from the system header <code>time.h</code><strong>is</strong> the <code>unsigned int</code> that you
are provided in the input file.</p></div></div></li></ul><p>And they are compiled into one reading such as:</p><divclass="codeBlockContainer_Ckt0 theme-code-block"style="--prism-color:#000000;--prism-background-color:#ffffff"><divclass="codeBlockContent_biex"><pretabindex="0"class="prism-code language-text codeBlock_bY9V thin-scrollbar"><codeclass="codeBlockLines_e6Vv"><spanclass="token-line"style="color:#000000"><spanclass="token plain">camera_ID: plate timestamp</span><br></span></code></pre><divclass="buttonGroup__atx"><buttontype="button"aria-label="Copy code to clipboard"title="Copy"class="clean-btn"><spanclass="copyButtonIcons_eSgA"aria-hidden="true"><svgviewBox="0 0 24 24"class="copyButtonIcon_y97N"><pathfill="currentColor"d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svgviewBox="0 0 24 24"class="copyButtonSuccessIcon_LjdS"><pathfill="currentColor"d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>There should be always <strong>at least one</strong> space in between each part of the
reading. Readings are separated by the commas, which may, but don't have to, be
accompanied by whitespace around.</p><h4class="anchor anchorWithStickyNavbar_LWe7"id="examples">Examples<ahref="#examples"class="hash-link"aria-label="Direct link to Examples"title="Direct link to Examples"></a></h4><p>Few examples of the data from the cameras follow</p><divclass="codeBlockContainer_Ckt0 theme-code-block"style="--prism-color:#000000;--prism-background-color:#ffffff"><divclass="codeBlockContent_biex"><pretabindex="0"class="prism-code language-text codeBlock_bY9V thin-scrollbar"><codeclass="codeBlockLines_e6Vv"><spanclass="token-line"style="color:#000000"><spanclass="token plain">10: ABC-12-34 1664608712, 289: XYZ-98-76 1665416417,</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain">25: ABC-12-34 1633078256 , 42: TryToCatchMe 1671602419,</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain">11: EL9-987 1679541338 ,2 : Foo-666 1683170082,42: YourMum 1683170082,</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain">42: TryToCatchMe 1671602419 , 1234: TryToCatchMe 1671602419,</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain">19: ABC-12-34 1664659649, 69:YouShould-not-pLaCe-4ny-expectations%on^the(input 1680307994,</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain">9 : 9B9-161 1665416417 , 10: 1a1-999 1671602419,1:lmao 1633078256,</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain">16: ABC-12-34 1664609012</span><br></span></code></pre><divclass="buttonGroup__atx"><buttontype="button"aria-label="Copy code to clipboard"title="Copy"class="clean-btn"><spanclass="copyButtonIcons_eSgA"aria-hidden="true"><svgviewBox="0 0 24 24"class="copyButtonIcon_y97N"><pathfill="currentColor"d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svgviewBox="0 0 24 24"class="copyButtonSuccessIcon_LjdS"><pathfill="currentColor"d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2class="anchor anchorWithStickyNavbar_LWe7"id="format-of-the-output">Format of the output<ahref="#format-of-the-output"class="hash-link"aria-label="Direct link to Format of the output"title="Direct link to Format of the output"></a></h2><divclass="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><divclass="admonitionHeading_tbUL"><spanclass="admonitionIcon_kALy"><svgviewBox="0 0 14 16"><pathfill-rule="evenodd"d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><divclass="admonitionContent_S0QG"><p>All the examples consider using data from the example of the input.</p></div></div><p>You are expected to print out the dates and cameras that has captured the
license plate for each of them (in a sorted fashion).</p><p>If there are multiple scans present and the timespan (i.e. time difference
between the scans is bigger than 60 minutes, you should separate them by a
newline). For example:</p><divclass="codeBlockContainer_Ckt0 theme-code-block"style="--prism-color:#000000;--prism-background-color:#ffffff"><divclass="codeBlockContent_biex"><pretabindex="0"class="prism-code language-text codeBlock_bY9V thin-scrollbar"><codeclass="codeBlockLines_e6Vv"><spanclass="token-line"style="color:#000000"><spanclass="token plain">*** ABC-12-34 ***</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"> 25: Fri Oct 1 10:50:56 2021</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"style="display:inline-block"></span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"> 10: Sat Oct 1 09:18:32 2022</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"> 16: Sat Oct 1 09:23:32 2022</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"style="display:inline-block"></span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"> 19: Sat Oct 1 23:27:29 2022</span><br></span></code></pre><divclass="buttonGroup__atx"><buttontype="button"aria-label="Copy code to clipboard"title="Copy"class="clean-btn"><spanclass="copyButtonIcons_eSgA"aria-hidden="true"><svgviewBox="0 0 24 24"class="copyButtonIcon_y97N"><pathfill="currentColor"d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svgviewBox="0 0 24 24"class="copyButtonSuccessIcon_LjdS"><pathfill="currentColor"d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><divclass="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><divclass="admonitionHeading_tbUL"><spanclass="admonitionIcon_kALy"><svgviewBox="0 0 12 16"><pathfill-rule="evenodd"d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><divclass="admonitionContent_S0QG"><p>Since you are given the timestamp in a <code>time_t</code> compatible type on UN<!---->*<!---->X, you
can safely use <code>ctime(3)</code> for printing the timestamp as a <em>human readable</em> time
when outputting the date and time.</p></div></div><divclass="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><divclass="admonitionHeading_tbUL"><spanclass="admonitionIcon_kALy"><svgviewBox="0 0 12 16"><pathfill-rule="evenodd"d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><divclass="admonitionContent_S0QG"><p>For a better readability you can include one more newline after the last line
of the output.</p></div></div><h2class="anchor anchorWithStickyNavbar_LWe7"id="example-usage">Example usage<ahref="#example-usage"class="hash-link"aria-label="Direct link to Example usage"title="Direct link to Example usage"></a></h2><p>You can also have a look at example usage of your program. We can run your
program from the shell like</p><divclass="codeBlockContainer_Ckt0 theme-code-block"style="--prism-color:#000000;--prism-background-color:#ffffff"><divclass="codeBlockContent_biex"><pretabindex="0"class="prism-code language-text codeBlock_bY9V thin-scrollbar"><codeclass="codeBlockLines_e6Vv"><spanclass="token-line"style="color:#000000"><spanclass="token plain">$ ./cams example_1.txt</span><br></span></code></pre><divclass="buttonGroup__atx"><buttontype="button"aria-label="Copy code to clipboard"title="Copy"class="clean-btn"><spanclass="copyButtonIcons_eSgA"aria-hidden="true"><svgviewBox="0 0 24 24"class="copyButtonIcon_y97N"><pathfill="currentColor"d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svgviewBox="0 0 24 24"class="copyButtonSuccessIcon_LjdS"><pathfill="currentColor"d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>And it will produce an output:</p><divclass="codeBlockContainer_Ckt0 theme-code-block"style="--prism-color:#000000;--prism-background-color:#ffffff"><divclass="codeBlockContent_biex"><pretabindex="0"class="prism-code language-text codeBlock_bY9V thin-scrollbar"><codeclass="codeBlockLines_e6Vv"><spanclass="token-line"style="color:#000000"><spanclass="token plain">*** ABC-12-34 ***</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"> 25: Fri Oct 1 10:50:56 2021</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"style="display:inline-block"></span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"> 10: Sat Oct 1 09:18:32 2022</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"> 16: Sat Oct 1 09:23:32 2022</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"style="display:inline-block"></span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"> 19: Sat Oct 1 23:27:29 2022</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"style="display:inline-block"></span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain">*** EL9-987 ***</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"> 11: Thu Mar 23 04:15:38 2023</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"style="display:inline-block"></span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain">*** Foo-666 ***</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"> 2: Thu May 4 05:14:42 2023</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"style="display:inline-block"></span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain">*** TryToCatchMe ***</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"> 42: Wed Dec 21 07:00:19 2022</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"> 42: Wed Dec 21 07:00:19 2022</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"> 1234: Wed Dec 21 07:00:19 2022</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"style="display:inline-block"></span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain">*** XYZ-98-76 ***</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"> 289: Mon Oct 10 17:40:17 2022</span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain"style="display:inline-block"></span><br></span><spanclass="token-line"style="color:#000000"><spanclass="token plain">*** YouShould-not-pLaCe-4ny-expectations%on^the(input ***</span><br></span><spanclass="token-line"style="c
information from the files.</li><li>For keeping the “records”, use some <strong>dynamic</strong> data structure.<ul><li>Don't forget to consider pros and cons of using <em>specific</em> data structures
before going through implementing.</li></ul></li><li>You <strong>are not required</strong> to produce 1:1 output to the provided examples, they
are just a hint to not waste your time tinkering with a user experience.</li><li>If any of the operations on the input files should fail,
<strong>you are expected to</strong> handle the situation <em>accordingly</em>.</li><li>Failures of any other common functions (e.g. functions used for memory
management) should be handled in <strong>the same way</strong> as they were in the