Sprawdź się
Zadanie 2. Liczba PI (9 pkt)
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 10000 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.
Korzystając z powyższych danych oraz dostępnych narzędzi informatycznych, wykonaj zadania. Wyniki zapisz w pliku tekstowym wyniki_4.txt
. Odpowiedź do każdego zadania poprzedź numerem właściwego zadania.
Zadanie zostało stworzone przez Centralną Komisję Egzaminacyjną i pojawiło się na egzaminie maturalnym z informatyki w 2019 roku (poziom rozszerzony, część II, egzamin w tzw. starej formule). Cały arkusz można znaleźć na stronie internetowej CKE.
Przycisk do pobrania TXT 1000 punktów współrzędnych . Pobierz załącznik
Zadanie 2.1 (3 pkt)
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).
Wskazówka:
Równanie okręgu o środku w punkcie i promieniu ma postać:
Informacja:
W pliku wśród pierwszych punktów należy do wnętrza koła.
Do oceny oddajesz:
plik
wyniki_4.txt
zawierający poprzedzoną numerem zadania odpowiedź (współrzędne punktów należących do brzegu koła oraz liczbę punktów należących do wnętrza koła);plik(i) z komputerową realizacją zadania (kodem programu).
Swoje rozwiązanie przetestuj dla danych zapisanych w testerkach.
JĘZYK JAVA
Przykładowe rozwiązanie:
public class Rozwiazanie {
public static void main(String[] args) {
int[] punktyX = {145, 116, 389, 12, 165, 79, 256, 200, 27, 9};
int[] punktyY = {370, 330, 191, 344, 303, 312, 8, 400, 5, 12};
int r = 200;
int rKwadrat = r * r;
int a = 200;
int b = 200;
int ile = 0;
for (int i = 0; i < 10; i++) {
int wynik = ((punktyX[i] - a)*(punktyX[i] - a)) + ((punktyY[i] - b)*(punktyY[i] - b));
if(wynik == rKwadrat){
System.out.println(punktyX[i] + " " + punktyY[i]);
}
else if(wynik < rKwadrat){
ile++;
}
}
System.out.println(ile);
}
}
JĘZYK C++
Przykładowe rozwiązanie:
#include <iostream>
using namespace std;
int main ()
{
int punktyX[] = {145, 116, 389, 12, 165, 79, 256, 200, 27, 9};
int punktyY[] = {370, 330, 191, 344, 303, 312, 8, 400, 5, 12};
int r = 200;
int rKwadrat = r * r;
int a = 200;
int b = 200;
int ile = 0;
for (int i = 0; i < 10; i++) {
int wynik = ((punktyX[i] - a)*(punktyX[i] - a)) + ((punktyY[i] - b)*(punktyY[i] - b));
if(wynik == rKwadrat){
cout << punktyX[i] << " " << punktyY[i] << endl;
}
else if(wynik < rKwadrat){
ile++;
}
}
cout << ile << endl;
}
JĘZYK PYTHON
Przykładowe rozwiązanie:
punkty_x = [145, 116, 389, 12, 165, 79, 256, 200, 27, 9]
punkty_y = [370, 330, 191, 344, 303, 312,8, 400, 5, 12]
r = 200
r_kwadrat = r * r
a = 200
b = 200
ile = 0
for i in range(0, 10):
wynik = ((punkty_x[i] - a)*(punkty_x[i] - a)) + ((punkty_y[i] - b)*(punkty_y[i] - b))
if wynik == r_kwadrat:
print(str(punkty_x[i]) + " " + str(punkty_y[i]))
elif wynik < r_kwadrat:
ile += 1
print(ile)
Zadanie 2.2
Przy założeniu równomiernego rozkładu punktów w kwadracie, stosunek liczby punktów należących do koła do liczby punktów należących do kwadratu jest w przybliżeniu równy stosunkowi pola koła do pola kwadratu :
Dla przypomnienia:
Wyznacz przybliżoną wartość liczby , biorąc pod uwagę punkty z pliku punkty.txt
:
pierwsze punktów,
pierwsze punktów,
wszystkie punkty.
Wynik zaokrąglij do czterech miejsc po przecinku.
Informacja:
Przybliżona wartość liczby dla pierwszych punktów z pliku wynosi .
Do oceny oddajesz:
plik
wyniki_4.txt
zawierający poprzedzoną numerem zadania odpowiedź (przybliżoną wartość liczby zaokrągloną do czterech miejsc po przecinku);plik(i) z komputerową realizacją zadania (kodem programu).
Swoje rozwiązanie przetestuj dla danych zapisanych w testerkach.
C++
Do wypisania wyliczonej wartości z dokładnością do 4 miejsc po przecinku możesz użyć manipulatorów setprecision
i fixed
z biblioteki iomanip
.
Przykładowe rozwiązanie:
#include <iostream>
#include <iomanip>
using namespace std;
int main ()
{
int punktyX[] = {145, 116, 389, 12, 165, 79, 92, 183, 283, 34, 226, 227, 117, 329, 369, 46, 34, 82, 264, 324, 318, 344, 195, 28, 360, 369, 120, 107, 64, 141, 316, 390, 249, 283, 377, 139, 172, 212, 277, 168, 154, 5, 96, 265, 379, 112, 70, 16, 218, 28, 271, 373, 220, 120, 192, 37, 280, 306, 118, 192, 171, 31, 233, 392, 215, 89, 135, 116, 46, 282, 0, 13, 378, 195, 70, 317, 166, 161, 383, 107, 122, 204, 147, 99, 370, 23, 238, 234, 254, 78, 211, 314, 52, 92, 317, 345, 52, 100, 123, 340, 171, 257, 182, 165, 254, 130, 330, 72, 239, 14, 326, 119, 81, 1, 349, 91, 342, 72, 301, 198, 75, 291, 240, 364, 334, 42, 297, 303, 304, 347, 178, 58, 5, 322, 33, 251, 289, 153, 96, 177, 234, 227, 15, 246, 127, 127, 369, 260, 81, 60, 382, 322, 45, 149, 364, 116, 104, 200, 55, 117, 82, 143, 364, 192, 55, 298, 218, 220, 210, 253, 134, 101, 98, 241, 108, 7, 149, 104, 265, 102, 48, 294, 235, 8, 1, 62, 98, 129, 337, 19, 313, 69, 206, 43, 46, 169, 166, 135, 300, 371, 159, 228};
int punktyY[] = {370, 330, 191, 344, 303, 312, 176, 212, 145, 315, 126, 76, 292, 278, 21, 395, 285, 183, 359, 132, 4, 345, 330, 381, 257, 247, 56, 375, 375, 376, 191, 395, 200, 134, 250, 311, 258, 125, 256, 367, 155, 306, 389, 311, 1, 185, 96, 111, 263, 109, 152, 246, 240, 390, 145, 125, 159, 319, 298, 38, 45, 278, 121, 254, 381, 280, 267, 388, 294, 112, 78, 243, 93, 123, 175, 130, 350, 18, 169, 89, 388, 231, 354, 60, 297, 280, 278, 168, 230, 393, 181, 261, 223, 197, 330, 253, 28, 165, 262, 311, 179, 114, 256, 63, 249, 144, 257, 41, 299, 355, 99, 68, 13, 170, 177, 185, 60, 47, 396, 298, 153, 20, 360, 330, 398, 231, 280, 13, 73, 252, 258, 295, 170, 228, 333, 32, 212, 386, 343, 325, 368, 324, 291, 158, 229, 178, 382, 204, 42, 181, 203, 187, 21, 241, 34, 342, 153, 148, 65, 192, 291, 132, 173, 368, 11, 241, 296, 116, 5, 126, 305, 312, 39, 378, 319, 362, 112, 343, 44, 191, 376, 293, 170, 145, 16, 120, 61, 357, 94, 195, 128, 130, 339, 223, 270, 97, 24, 340, 161, 233, 4, 148};
int r = 200;
int rKwadrat = r * r;
int a = 200;
int b = 200;
int ilePoWszystkichIteracjach = 0;
for (int i = 0; i < 200; i++) {
int wynik = ((punktyX[i] - a)*(punktyX[i] - a)) + ((punktyY[i] - b)*(punktyY[i] - b));
if(wynik <= rKwadrat){
ilePoWszystkichIteracjach++;
}
}
double piPoWszystkichIteracjach = ilePoWszystkichIteracjach / 200.0 * 4;
cout << setprecision(4) << fixed << piPoWszystkichIteracjach << endl;
}
JĘZYK JAVA
Do wypisania wyliczonej wartości z dokładnością do 4 miejsc po przecinku możesz użyć metody format()
obiektu typu String
oraz ciągu formatującego %.4f
.
Przykładowe rozwiązanie:
public class Rozwiazanie {
public static void main(String[] args) {
int[] punktyX = {145, 116, 389, 12, 165, 79, 92, 183, 283, 34, 226, 227, 117, 329, 369, 46, 34, 82, 264, 324, 318, 344, 195, 28, 360, 369, 120, 107, 64, 141, 316, 390, 249, 283, 377, 139, 172, 212, 277, 168, 154, 5, 96, 265, 379, 112, 70, 16, 218, 28, 271, 373, 220, 120, 192, 37, 280, 306, 118, 192, 171, 31, 233, 392, 215, 89, 135, 116, 46, 282, 0, 13, 378, 195, 70, 317, 166, 161, 383, 107, 122, 204, 147, 99, 370, 23, 238, 234, 254, 78, 211, 314, 52, 92, 317, 345, 52, 100, 123, 340, 171, 257, 182, 165, 254, 130, 330, 72, 239, 14, 326, 119, 81, 1, 349, 91, 342, 72, 301, 198, 75, 291, 240, 364, 334, 42, 297, 303, 304, 347, 178, 58, 5, 322, 33, 251, 289, 153, 96, 177, 234, 227, 15, 246, 127, 127, 369, 260, 81, 60, 382, 322, 45, 149, 364, 116, 104, 200, 55, 117, 82, 143, 364, 192, 55, 298, 218, 220, 210, 253, 134, 101, 98, 241, 108, 7, 149, 104, 265, 102, 48, 294, 235, 8, 1, 62, 98, 129, 337, 19, 313, 69, 206, 43, 46, 169, 166, 135, 300, 371, 159, 228};
int[] punktyY = {370, 330, 191, 344, 303, 312, 176, 212, 145, 315, 126, 76, 292, 278, 21, 395, 285, 183, 359, 132, 4, 345, 330, 381, 257, 247, 56, 375, 375, 376, 191, 395, 200, 134, 250, 311, 258, 125, 256, 367, 155, 306, 389, 311, 1, 185, 96, 111, 263, 109, 152, 246, 240, 390, 145, 125, 159, 319, 298, 38, 45, 278, 121, 254, 381, 280, 267, 388, 294, 112, 78, 243, 93, 123, 175, 130, 350, 18, 169, 89, 388, 231, 354, 60, 297, 280, 278, 168, 230, 393, 181, 261, 223, 197, 330, 253, 28, 165, 262, 311, 179, 114, 256, 63, 249, 144, 257, 41, 299, 355, 99, 68, 13, 170, 177, 185, 60, 47, 396, 298, 153, 20, 360, 330, 398, 231, 280, 13, 73, 252, 258, 295, 170, 228, 333, 32, 212, 386, 343, 325, 368, 324, 291, 158, 229, 178, 382, 204, 42, 181, 203, 187, 21, 241, 34, 342, 153, 148, 65, 192, 291, 132, 173, 368, 11, 241, 296, 116, 5, 126, 305, 312, 39, 378, 319, 362, 112, 343, 44, 191, 376, 293, 170, 145, 16, 120, 61, 357, 94, 195, 128, 130, 339, 223, 270, 97, 24, 340, 161, 233, 4, 148};
int r = 200;
int rKwadrat = r * r;
int a = 200;
int b = 200;
int ilePoWszystkichIteracjach = 0;
for (int i = 0; i < 200; i++) {
int wynik = ((punktyX[i] - a)*(punktyX[i] - a)) + ((punktyY[i] - b)*(punktyY[i] - b));
if(wynik <= rKwadrat){
ilePoWszystkichIteracjach++;
}
}
double piPoWszystkichIteracjach = ilePoWszystkichIteracjach / 200.0 * 4;
System.out.println(String.format("%.4f", piPoWszystkichIteracjach));
}
}
JĘZYK PYTHON
Do wypisania wyliczonej wartości z dokładnością do 4 miejsc po przecinku możesz użyć formatowania f‑string lub metody format()
ciągu znakowego. W obydwu przypadkach użyć należy ciągu formatującego :.4f
.
Przykładowe rozwiązanie:
punktyX = [145, 116, 389, 12, 165, 79, 92, 183, 283, 34, 226, 227, 117, 329, 369, 46, 34, 82, 264, 324, 318, 344, 195, 28, 360, 369, 120, 107, 64, 141, 316, 390, 249, 283, 377, 139, 172, 212, 277, 168, 154, 5, 96, 265, 379, 112, 70, 16, 218, 28, 271, 373, 220, 120, 192, 37, 280, 306, 118, 192, 171, 31, 233, 392, 215, 89, 135, 116, 46, 282, 0, 13, 378, 195, 70, 317, 166, 161, 383, 107, 122, 204, 147, 99, 370, 23, 238, 234, 254, 78, 211, 314, 52, 92, 317, 345, 52, 100, 123, 340, 171, 257, 182, 165, 254, 130, 330, 72, 239, 14, 326, 119, 81, 1, 349, 91, 342, 72, 301, 198, 75, 291, 240, 364, 334, 42, 297, 303, 304, 347, 178, 58, 5, 322, 33, 251, 289, 153, 96, 177, 234, 227, 15, 246, 127, 127, 369, 260, 81, 60, 382, 322, 45, 149, 364, 116, 104, 200, 55, 117, 82, 143, 364, 192, 55, 298, 218, 220, 210, 253, 134, 101, 98, 241, 108, 7, 149, 104, 265, 102, 48, 294, 235, 8, 1, 62, 98, 129, 337, 19, 313, 69, 206, 43, 46, 169, 166, 135, 300, 371, 159, 228]
punktyY = [370, 330, 191, 344, 303, 312, 176, 212, 145, 315, 126, 76, 292, 278, 21, 395, 285, 183, 359, 132, 4, 345, 330, 381, 257, 247, 56, 375, 375, 376, 191, 395, 200, 134, 250, 311, 258, 125, 256, 367, 155, 306, 389, 311, 1, 185, 96, 111, 263, 109, 152, 246, 240, 390, 145, 125, 159, 319, 298, 38, 45, 278, 121, 254, 381, 280, 267, 388, 294, 112, 78, 243, 93, 123, 175, 130, 350, 18, 169, 89, 388, 231, 354, 60, 297, 280, 278, 168, 230, 393, 181, 261, 223, 197, 330, 253, 28, 165, 262, 311, 179, 114, 256, 63, 249, 144, 257, 41, 299, 355, 99, 68, 13, 170, 177, 185, 60, 47, 396, 298, 153, 20, 360, 330, 398, 231, 280, 13, 73, 252, 258, 295, 170, 228, 333, 32, 212, 386, 343, 325, 368, 324, 291, 158, 229, 178, 382, 204, 42, 181, 203, 187, 21, 241, 34, 342, 153, 148, 65, 192, 291, 132, 173, 368, 11, 241, 296, 116, 5, 126, 305, 312, 39, 378, 319, 362, 112, 343, 44, 191, 376, 293, 170, 145, 16, 120, 61, 357, 94, 195, 128, 130, 339, 223, 270, 97, 24, 340, 161, 233, 4, 148]
r = 200
r_kwadrat = r * r
a = 200
b = 200
ile_po_wszystkich_iteracjach = 0
for i in range(0, 200):
wynik = ((punktyX[i] - a)*(punktyX[i] - a)) + ((punktyY[i] - b)*(punktyY[i] - b))
if wynik <= r_kwadrat:
ile_po_wszystkich_iteracjach += 1
pi_po_wszystkich_iteracjach = ile_po_wszystkich_iteracjach / 200 * 4
print(f'{pi_po_wszystkich_iteracjach:.4f}')
Zadanie 3. Rękopis znaleziony w Bajtolandii
W pewnym zamku w Bajtolandii archeologowie odnaleźli ukrytą komnatę, a w niej odkryli rękopis. Badacze doszli do wniosku, że rękopis ten zawiera współrzędne miejsca, w którym ukryto legendarny artefakt – złoty cyrkiel.
Wiedzą, że skryba, który przygotował rękopis, był genialnym matematykiem, który za cel postawił sobie znalezienie wszystkich par liczb zaprzyjaźnionych. Współrzędne ukrył wśród 100 par liczb, jednak nie wszystkie z nich są liczbami zaprzyjaźnionymi.
Archeologowie zakładają, że współrzędne również będą liczbami zaprzyjaźnionymi.
Ponieważ badacze nie mogli sprawdzić wszystkich współrzędnych, poszukali kolejnych wskazówek. Na jednej ze ścian znaleźli inskrypcję, która wskazywała, że prawidłowe współrzędne to para liczb zaprzyjaźnionych, które są większe od liczby pierwszej X, ale mniejsze od liczby pierwszej Y. Wartości liczb pierwszych X i Y były wyryte na podłodze komnaty.
Wszystkie niezbędne dane archeologowie zapisali w pliku rekopis.txt
.
Korzystając z powyższych danych oraz dostępnych narzędzi informatycznych, wykonaj zadania. Wyniki zapisz w pliku tekstowym wyniki.txt.
Plik rekopis.txt
zawiera 101 par liczb naturalnych. W pierwszym wierszu znajdują się liczby pierwsze X oraz Y (liczby zapisane na posadzce). Kolejne wiersze zawierają liczby będące potencjalnymi współrzędnymi ukrycia artefaktu. Liczby oddzielone są od siebie pojedynczym znakiem spacji, każda z par zapisana jest w osobnym wierszu.
Wypisz z pliku rekopis.txt
taką parę liczb zaprzyjaźnionych, w której obie liczby należą do przedziału <X,Y>.
Liczby zaprzyjaźnione to taka para liczb naturalnych, których suma dzielników właściwych każdej z tych liczb jest równa drugiej liczbie. Dzielnikami właściwymi liczby nazywamy dzielniki, które są mniejsze od tej liczby.
Do oceny oddajesz:
plik
wyniki_5.txt
zawierający poprzedzoną numerem zadania odpowiedź (parę liczb zaprzyjaźnionych);plik(i) z komputerową realizacją zadania (kodem programu).
Swoje rozwiązanie przetestuj dla danych zapisanych w testerkach.
JĘZYK C++
Przykładowe rozwiązanie:
#include <iostream>
using namespace std;
bool czySaZaprzyjaznione(int liczba1, int liczba2) {
int suma1 = 0, suma2 = 0;
for(int i = 1; i < liczba1; i++) {
if(liczba1 % i == 0) {
suma1 += i;
}
}
for(int i = 1; i < liczba2; i++) {
if(liczba2 % i == 0) {
suma2 += i;
}
}
return suma1 == liczba2 && suma2 == liczba1;
}
int main() {
int rekopis[11][2] = {
{211, 947}, {490, 317}, {204, 318}, {290, 431}, {351, 471},
{433, 394}, {428, 217}, {432, 188}, {154, 233}, {220, 284},
{17296, 18416}
};
int X = rekopis[0][0];
int Y = rekopis[0][1];
for(int i = 1; i < 11; i++) {
int a = rekopis[i][0];
int b = rekopis[i][1];
if(a > X && a < Y && b > X && b < Y && czySaZaprzyjaznione(a, b)) {
cout << "(" << a << ", " << b << ")";
}
}
return 0;
}
JĘZYK JAVA
Przykładowe rozwiązanie:
public class Main {
public static void main(String[] args) {
int[][] rekopis = {
{211, 947}, {490, 317}, {204, 318}, {290, 431}, {351, 471},
{433, 394}, {428, 217}, {432, 188}, {154, 233}, {220, 284},
{17296, 18416}
};
int X = rekopis[0][0];
int Y = rekopis[0][1];
for(int i = 1; i < rekopis.length; i++) {
int a = rekopis[i][0];
int b = rekopis[i][1];
if(a > X && a < Y && b > X && b < Y && czySaZaprzyjaznione(a, b)) {
System.out.println("(" + a + ", " + b + ")");
}
}
}
public static boolean czySaZaprzyjaznione(int liczba1, int liczba2) {
int suma1 = 0, suma2 = 0;
for(int i = 1; i < liczba1; i++) {
if(liczba1 % i == 0) {
suma1 += i;
}
}
for(int i = 1; i < liczba2; i++) {
if(liczba2 % i == 0) {
suma2 += i;
}
}
return suma1 == liczba2 && suma2 == liczba1;
}
}
JĘZYK PYTHON
Przykładowe rozwiązanie:
rekopis = [
[211, 947],
[490, 317],
[204, 318],
[290, 431],
[351, 471],
[433, 394],
[428, 217],
[432, 188],
[154, 233],
[220, 284],
[17296, 18416]
]
def czy_sa_zaprzyjaznione(a, b):
suma_a = 0
for i in range(1, a):
if a % i == 0:
suma_a += i
suma_b = 0
for i in range(1, b):
if b % i == 0:
suma_b += i
return suma_a == b and suma_b == a
X, Y = rekopis[0]
liczby_zaprzyjaznione = []
for para in rekopis[1:]:
a, b = para
if X < a < Y and X < b < Y and czy_sa_zaprzyjaznione(a, b):
liczby_zaprzyjaznione.append((a, b))
for para in liczby_zaprzyjaznione:
print(para)
Odpowiedź
Poprawna odpowiedź do zadania dla danych z pliku: