{"id":"informatyka-2016-maj-matura-rozszerzona/zad/4.1","paper_id":"informatyka-2016-maj-matura-rozszerzona","number":"4.1","points":3,"ptype":"open","subject":"informatyka","category":"matura","year":2016,"month":"maj","level":"rozszerzona","text":"Zadanie 4. Liczba PI\n\nW kartezjańskim układzie współrzędnych na płaszczyźnie narysowano kwadrat o boku długości 400 i środku symetrii w punkcie (200;200). Boki kwadratu są równoległe do osi układu współrzędnych. W kwadrat wpisano koło. Następnie wylosowano 10 000 punktów należących do kwadratu. Współrzędne (x,y) punktów zostały zapisane w pliku punkty.txt, każdy punkt w osobnym wierszu. Wiersz ma postać dwóch liczb całkowitych z zakresu <0;400>, rozdzielonych pojedynczym znakiem odstępu.\n\nWskazówka: Równanie okręgu o środku w punkcie S = (a,b) i promieniu r > 0 ma postać: (x-a)² + (y-b)² = r².\n\nInformacja: W pliku wśród 100 pierwszych punktów 80 należy do wnętrza koła.\n\nWypisz współrzędne tych punktów, które należą do brzegu koła (okręgu), oraz podaj liczbę punktów należących do wnętrza koła (brzeg koła nie należy do wnętrza koła).","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Punkty na okręgu (brzegu koła):** **(256, 8)** oraz **(200, 400)**\n\n**Liczba punktów wewnątrz koła:** **7852**\n\n## Sposób 1 - geometryczna analiza\n\n**Parametry koła:**\n- Środek: S = (200, 200)\n- Bok kwadratu = 400, więc promień wpisanego koła = bok/2 = **r = 200**.\n- Równanie okręgu: `(x - 200)² + (y - 200)² = 200² = 40000`.\n\n**Klasyfikacja punktu (x, y):**\n- `d² = (x - 200)² + (y - 200)²`\n- `d² < 40000` → punkt **wewnątrz** koła\n- `d² = 40000` → punkt **na okręgu** (brzegu)\n- `d² > 40000` → punkt **poza** kołem\n\n## Sposób 2 - implementacja Python\n\n```python\nbrzeg = []\nwnetrze = 0\n\nwith open('punkty.txt') as f:\nfor linia in f:\nczesci = linia.strip().split()\nif len(czesci) != 2:\ncontinue\nx, y = int(czesci[0]), int(czesci[1])\nd2 = (x - 200) ** 2 + (y - 200) ** 2\nif d2 == 40000:\nbrzeg.append((x, y))\nelif d2 < 40000:\nwnetrze += 1\n\nprint(\"Punkty na okręgu:\", brzeg) # [(256, 8), (200, 400)]\nprint(\"Liczba punktów wewnątrz:\", wnetrze) # 7852\n\n**Dlaczego (256, 8) jest na okręgu?**\n(256 - 200)² + (8 - 200)² = 56² + (-192)² = 3136 + 36864 = **40000** ✓\n\n**Dlaczego (200, 400) jest na okręgu?**\n(200 - 200)² + (400 - 200)² = 0 + 200² = **40000** ✓ (punkt na styku okręgu z górnym bokiem kwadratu).\n\n## Sposób 3 - C++ i Pascal\n\n**C++:**\n```cpp\n#include <iostream>\n#include <fstream>\nusing namespace std;\n\nint main() {\nifstream f(\"punkty.txt\");\nint x, y, wnetrze = 0;\nwhile (f >> x >> y) {\nlong long d2 = (long long)(x - 200) * (x - 200)\n+ (long long)(y - 200) * (y - 200);\nif (d2 == 40000) cout << x << \" \" << y << endl;\nelse if (d2 < 40000) wnetrze++;\n}\ncout << \"Wnetrze: \" << wnetrze << endl;\nreturn 0;\n}\n\n**Pascal:**\n```pascal\nprogram LiczbaPi41;\nvar f: TextFile; x, y, wn, d2: LongInt;\nbegin\nAssignFile(f, 'punkty.txt'); Reset(f);\nwn := 0;\nwhile not Eof(f) do begin\nReadln(f, x, y);\nd2 := (x - 200) * (x - 200) + (y - 200) * (y - 200);\nif d2 = 40000 then Writeln(x, ' ', y)\nelse if d2 < 40000 then wn := wn + 1;\nend;\nCloseFile(f);\nWriteln('Wnetrze: ', wn);\nend.\n\n**Arkusz kalkulacyjny:**\n- Kolumna A: x, kolumna B: y.\n- Kolumna C: `=(A1-200)^2+(B1-200)^2` (kwadrat odległości od środka).\n- Kolumna D: `=JEŻELI(C1=40000;\"BRZEG\";JEŻELI(C1<40000;\"WNETRZE\";\"ZEWNETRZE\"))`.\n- Filtruj kolumnę D = \"BRZEG\" → punkty na okręgu.\n- `=LICZ.JEŻELI(D1:D10000;\"WNETRZE\")` → 7852.\n\n## Reference informatyczny - geometria okręgu w programowaniu\n\n> Reference - Sprawdzenie czy punkt leży w/na/poza okręgiem:\n> - **Punkt P = (x, y) względem okręgu o środku S = (a, b) i promieniu r**:\n> - Liczymy `d² = (x - a)² + (y - b)²` (uwaga: NIE pierwiastek, żeby uniknąć błędu float).\n> - Jeśli `d² < r²` → wewnątrz.\n> - Jeśli `d² = r²` → na okręgu.\n> - Jeśli `d² > r²` → poza.\n> - **Dla liczb całkowitych** porównanie `d² = r²` jest dokładne (brak zaokrągleń).\n> - **Dla zmiennoprzecinkowych** używaj `|d² - r²| < ε` (epsilon, np. 10⁻⁹).\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 4.1, max 3 pkt):\n> - **2 pkt** za prawidłowe współrzędne punktów na okręgu (po 1 pkt za każdą parę: (256, 8) i (200, 400))\n> - **1 pkt** za prawidłową liczbę punktów wewnątrz koła (7852)\n> - **0 pkt** - odpowiedź błędna\n\n## Typowe pułapki\n\n- **Wliczanie brzegu do wnętrza** - treść wyraźnie mówi \"brzeg koła nie należy do wnętrza koła\". Punkty z `d² = r²` NIE są wnętrzem.\n- **Pomyłka ze środkiem** - środek to (200, 200), nie (0, 0). Łatwa pomyłka po przeczytaniu \"bok 400\".\n- **Niedokładne porównanie** - używanie `sqrt(d²) == 200` zamiast `d² == 40000` może dać błędy float (`sqrt(40000.0)` powinno być dokładnie 200, ale lepiej trzymać się arytmetyki całkowitoliczbowej).\n- **Overflow w C++** - (x - 200)² ≤ 200² = 40000, suma ≤ 80000 - mieści się w 32-bitowym int. Bez problemu.\n- **Brak konwersji na int** - `linia.strip().split()` w Pythonie zwraca stringi, trzeba zrzutować: `int( )`.\n\n## Złożoność obliczeniowa\n\n- Jedno przejście przez plik: **O(N)** gdzie N = 10000.\n- Każda iteracja: O(1) operacji arytmetycznych.\n- **Łącznie: O(N) = O(10000) ≈ 10⁴ operacji.**","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2016 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Zadanie 4. Liczba PI</p>\n<p>W kartezjańskim układzie współrzędnych na płaszczyźnie narysowano kwadrat o boku długości 400 i środku symetrii w punkcie (200;200). Boki kwadratu są równoległe do osi układu współrzędnych. W kwadrat wpisano koło. Następnie wylosowano 10 000 punktów należących do kwadratu. Współrzędne (x,y) punktów zostały zapisane w pliku punkty.txt, każdy punkt w osobnym wierszu. Wiersz ma postać dwóch liczb całkowitych z zakresu &lt;0;400&gt;, rozdzielonych pojedynczym znakiem odstępu.</p>\n<p>Wskazówka: Równanie okręgu o środku w punkcie S = (a,b) i promieniu r &gt; 0 ma postać: (x-a)² + (y-b)² = r².</p>\n<p>Informacja: W pliku wśród 100 pierwszych punktów 80 należy do wnętrza koła.</p>\n<p>Wypisz współrzędne tych punktów, które należą do brzegu koła (okręgu), oraz podaj liczbę punktów należących do wnętrza koła (brzeg koła nie należy do wnętrza koła).</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>Punkty na okręgu (brzegu koła):</strong> <strong>(256, 8)</strong> oraz <strong>(200, 400)</strong></p>\n<p><strong>Liczba punktów wewnątrz koła:</strong> <strong>7852</strong></p>\n<h4>Sposób 1 - geometryczna analiza</h4>\n<p><strong>Parametry koła:</strong></p>\n<ul><li>Środek: S = (200, 200)</li><li>Bok kwadratu = 400, więc promień wpisanego koła = bok/2 = <strong>r = 200</strong>.</li><li>Równanie okręgu: <code>(x - 200)² + (y - 200)² = 200² = 40000</code>.</li></ul>\n<p><strong>Klasyfikacja punktu (x, y):</strong></p>\n<ul><li><code>d² = (x - 200)² + (y - 200)²</code></li><li><code>d² &lt; 40000</code> → punkt <strong>wewnątrz</strong> koła</li><li><code>d² = 40000</code> → punkt <strong>na okręgu</strong> (brzegu)</li><li><code>d² &gt; 40000</code> → punkt <strong>poza</strong> kołem</li></ul>\n<h4>Sposób 2 - implementacja Python</h4>\n<p>```python<br>brzeg = []<br>wnetrze = 0</p>\n<p>with open(&#x27;punkty.txt&#x27;) as f:<br>for linia in f:<br>czesci = linia.strip().split()<br>if len(czesci) != 2:<br>continue<br>x, y = int(czesci[0]), int(czesci[1])<br>d2 = (x - 200) <strong> 2 + (y - 200) </strong> 2<br>if d2 == 40000:<br>brzeg.append((x, y))<br>elif d2 &lt; 40000:<br>wnetrze += 1</p>\n<p>print(&quot;Punkty na okręgu:&quot;, brzeg) # [(256, 8), (200, 400)]<br>print(&quot;Liczba punktów wewnątrz:&quot;, wnetrze) # 7852</p>\n<p><strong>Dlaczego (256, 8) jest na okręgu?</strong><br>(256 - 200)² + (8 - 200)² = 56² + (-192)² = 3136 + 36864 = <strong>40000</strong> ✓</p>\n<p><strong>Dlaczego (200, 400) jest na okręgu?</strong><br>(200 - 200)² + (400 - 200)² = 0 + 200² = <strong>40000</strong> ✓ (punkt na styku okręgu z górnym bokiem kwadratu).</p>\n<h4>Sposób 3 - C++ i Pascal</h4>\n<p><strong>C++:</strong><br>```cpp<br>#include &lt;iostream&gt;<br>#include &lt;fstream&gt;<br>using namespace std;</p>\n<p>int main() {<br>ifstream f(&quot;punkty.txt&quot;);<br>int x, y, wnetrze = 0;<br>while (f &gt;&gt; x &gt;&gt; y) {<br>long long d2 = (long long)(x - 200) * (x - 200)</p>\n<ul><li>(long long)(y - 200) * (y - 200);</li></ul>\n<p>if (d2 == 40000) cout &lt;&lt; x &lt;&lt; &quot; &quot; &lt;&lt; y &lt;&lt; endl;<br>else if (d2 &lt; 40000) wnetrze++;<br>}<br>cout &lt;&lt; &quot;Wnetrze: &quot; &lt;&lt; wnetrze &lt;&lt; endl;<br>return 0;<br>}</p>\n<p><strong>Pascal:</strong><br>```pascal<br>program LiczbaPi41;<br>var f: TextFile; x, y, wn, d2: LongInt;<br>begin<br>AssignFile(f, &#x27;punkty.txt&#x27;); Reset(f);<br>wn := 0;<br>while not Eof(f) do begin<br>Readln(f, x, y);<br>d2 := (x - 200) * (x - 200) + (y - 200) * (y - 200);<br>if d2 = 40000 then Writeln(x, &#x27; &#x27;, y)<br>else if d2 &lt; 40000 then wn := wn + 1;<br>end;<br>CloseFile(f);<br>Writeln(&#x27;Wnetrze: &#x27;, wn);<br>end.</p>\n<p><strong>Arkusz kalkulacyjny:</strong></p>\n<ul><li>Kolumna A: x, kolumna B: y.</li><li>Kolumna C: <code>=(A1-200)^2+(B1-200)^2</code> (kwadrat odległości od środka).</li><li>Kolumna D: <code>=JEŻELI(C1=40000;&quot;BRZEG&quot;;JEŻELI(C1&lt;40000;&quot;WNETRZE&quot;;&quot;ZEWNETRZE&quot;))</code>.</li><li>Filtruj kolumnę D = &quot;BRZEG&quot; → punkty na okręgu.</li><li><code>=LICZ.JEŻELI(D1:D10000;&quot;WNETRZE&quot;)</code> → 7852.</li></ul>\n<h4>Reference informatyczny - geometria okręgu w programowaniu</h4>\n<blockquote>Reference - Sprawdzenie czy punkt leży w/na/poza okręgiem:<br>- <strong>Punkt P = (x, y) względem okręgu o środku S = (a, b) i promieniu r</strong>:<br>- Liczymy <code>d² = (x - a)² + (y - b)²</code> (uwaga: NIE pierwiastek, żeby uniknąć błędu float).<br>- Jeśli <code>d² &lt; r²</code> → wewnątrz.<br>- Jeśli <code>d² = r²</code> → na okręgu.<br>- Jeśli <code>d² &gt; r²</code> → poza.<br>- <strong>Dla liczb całkowitych</strong> porównanie <code>d² = r²</code> jest dokładne (brak zaokrągleń).<br>- <strong>Dla zmiennoprzecinkowych</strong> używaj <code>|d² - r²| &lt; ε</code> (epsilon, np. 10⁻⁹).</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 4.1, max 3 pkt):<br>- <strong>2 pkt</strong> za prawidłowe współrzędne punktów na okręgu (po 1 pkt za każdą parę: (256, 8) i (200, 400))<br>- <strong>1 pkt</strong> za prawidłową liczbę punktów wewnątrz koła (7852)<br>- <strong>0 pkt</strong> - odpowiedź błędna</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Wliczanie brzegu do wnętrza</strong> - treść wyraźnie mówi &quot;brzeg koła nie należy do wnętrza koła&quot;. Punkty z <code>d² = r²</code> NIE są wnętrzem.</li><li><strong>Pomyłka ze środkiem</strong> - środek to (200, 200), nie (0, 0). Łatwa pomyłka po przeczytaniu &quot;bok 400&quot;.</li><li><strong>Niedokładne porównanie</strong> - używanie <code>sqrt(d²) == 200</code> zamiast <code>d² == 40000</code> może dać błędy float (<code>sqrt(40000.0)</code> powinno być dokładnie 200, ale lepiej trzymać się arytmetyki całkowitoliczbowej).</li><li><strong>Overflow w C++</strong> - (x - 200)² ≤ 200² = 40000, suma ≤ 80000 - mieści się w 32-bitowym int. Bez problemu.</li><li><strong>Brak konwersji na int</strong> - <code>linia.strip().split()</code> w Pythonie zwraca stringi, trzeba zrzutować: <code>int( )</code>.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Jedno przejście przez plik: <strong>O(N)</strong> gdzie N = 10000.</li><li>Każda iteracja: O(1) operacji arytmetycznych.</li><li><strong>Łącznie: O(N) = O(10000) ≈ 10⁴ operacji.</strong></li></ul>"}]}