Matura 2009 (maj). Zadanie 2. Ceny w systemach dziesiętnym i dwójkowym

Matura 2009 (maj). Zadanie 2. Ceny w systemach dziesiętnym i dwójkowym

W Dwójkolandii tradycyjnie ceny w sklepach są podawane w systemie dwójkowym. Ze względu na rosnący ruch turystów z innych krajów, gdzie wciąż obowiązuje system dziesiętny, rząd Dwójkolandii postanowił, że handlowcy mają obowiązek umieszczania cen w obu systemach.

  1. Pomóż właścicielowi baru szybkiej obsługi uzupełnić obowiązujący cennik:
artykuł cena w systemie dwójkowym cena w systemie dziesiętnym
kakao 111,11 7,75
herbata czarna 100,01  4,25
herbata owocowa  100,10 4,50
capuccino 101,00 5,00
kawa espresso 110,00 6,00

Wyjaśnienie:

  1. Rozdzielamy liczbę na część całkowitą i część ułamokową.
  2. Najpierw zajmiemy się częścią całkowitą, na przykładzie ceny:
    kakao
    111(2) = 1 * 20 + 1 * 21 + 1 * 22 =  1 + 2 + 4 = 7(10)
    kawa espresso:
    110(2) = 0 * 20 + 1 * 21 + 1 * 22 = 0 + 2 + 4 = 6(10)

Zamiana części całkowitej odbywa się za pomocą algorytmu:

Zamiana ceny w systemie binarnym na cenę w systemie dziesiętnym.
System dwójkowy jest najprostszym systemem pozycyjnym, w którym podstawa p = 2. System posiada dwie cyfry 0 i 1, zatem można je kodować bezpośrednio jednym bitem informacji. Wartość dziesiętna liczby zapisanej w naturalnym kodzie binarnym dana jest wzorem:
bn-1bn-2…b2b1b0 = bn-12n-1 + bn-22n-2 + … + b222 + b121 + b020
gdzie :
b – bit, cyfra dwójkowa 0 lub 1
n – liczba bitów w zapisie liczby
101011(2) = 25 + 23 + 21 + 20 = 32 + 8 + 2 + 1 = 43(10)

Zamiana ceny w systemie dziesiętnym na cenę w systemie binarnym.
W jednym kroku algorytmu wykonujemy czynności wyznaczenie reszty (%) z dzielenia przez dwa przekształcanej liczby oraz wykonujemy dzielenie całkowite przez dwa. Tę czynność wykonujemy tak długo, aż liczba dziesiętna będzie większa od 0 (zera).

  1. Kolejnym krokiem jest zamiana części ułamkowej, na przykładzie ceny:

kakao
0,11(2) = 1 * 2-1 + 1 * 2-2 = 1/2 + 1/4 = 0,5 + 0,25 = 0,75(10)

Zamiana ceny w systemie dziesiętnym na cenę w systemie binarnym w części ułamkowej.
Wykonujemy w taki sam sposób części całkowitej, z zapisem po przecinku.

Zamiana ceny w systemie binarnym na cenę w systemie dziesiętnym w części ułamkowej.
Obliczamy wartość części ułamkowej w następujący sposób:
0,111011(2) = 1 * 2-1 + 1 * 2-2 + 0 * 2-3 + 1 * 2-4 + 1 * 2-5 + 1 * 2-6 =  1/2 + 1/4 + 1/8 + 1/32 + 1/64 = 32/64 + 16/64 + 8/64 + 2/64 + 1/64 = 59/64
lub
0,111011(2) = 1 * 2-1 + 1 * 2-2 + 0 * 2-3 + 1 * 2-4 + 1 * 2-5 + 1 * 2-6 = 0,5 + 0,25 + 0,125 + 0,03125 + 0,015325 = 0,921875
Liczymy od pierwszej liczby po przecinku, mnożymy 1 lub 0 z 2 podniesioną do potęgi minusowej o odpowiedniej wartości, w zależności od pozycji danej liczby. pozycję liczymy od przecinka zaczynając od -1, -2, itd.

Liczbę należy zaokrąglić do dwóch miejsc po przecinku.

  1. Ostatnim krokiem jest połączenie dwóch części w całość (części całkowitej i ułamkowej).
  1. Zaproponuj handlowcom metodę przeliczania cen z systemu dwójkowego na dziesiętny i zapisz ją w postaci algorytmu w wybranej przez siebie notacji (lista kroków, schemat blokowy lub język programowania, który wybrałeś/aś na egzamin). Uwzględnij, że ceny są podawane z dokładnością do dwóch miejsc po przecinku. 

Specyfikacja:

Dane: s – napis złożony z ciągu zer i jedynek, przecinka oraz dwóch cyfr po przecinku (każda cyfra to 0 lub 1). Napis przed przecinkiem nie jest pusty.

Wynik: w – liczba oznaczająca wartość w systemie dziesiętnym liczby podanej w systemie dwójkowym w postaci napisu s.

#include <iostream>
#include <conio.h>
#include <math.h>
#include <iomanip>

using namespace std;

int main()
{
 string cenaB, cenaB2="", cenaB3="";
 int cenaD=0;
 cout << "Podaj cene w systemie binarnym: ";
 cin >> cenaB;
 // pobieranie czesci calosci
 int a=0;
 while (cenaB[a] != ','){
 cenaB2 += cenaB[a];
 a++;
 }
 // pobieranie częsci ulamku
 a++; // przesuniecie o przecinek
 for (a;a<cenaB.length();a++) cenaB3 += cenaB[a];

// zamiana na dziesietna liczbe
 int podstawa = 2;
 int tmp = 1;
 int x;
 for (int i=cenaB2.length()-1; i>=0; i--) {
 x = cenaB2[i]-48;
 cenaD += x*tmp;
 tmp *= podstawa;
 }

// zamiana ulamku
 double wynik=0, s=1;
 for (int z=0; z<cenaB3.length(); z++){
 if (cenaB3[z]=='1') {
 wynik = wynik + pow(2,-s);
 }
 s++;
 }

// wyswietlenie wyniku
 cout << "Cena w systemie dziesietnym: ";
 cout << fixed;
 cout << setprecision(2);
 cout << wynik+cenaD << endl;
 return 0;
}

Matura 2016 (maj). Zadanie 4. Liczba PI

Matura 2016 (maj). Zadanie 4. Liczba PI

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 <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 tego zadania.

Zadanie 4.1. (0–3)
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 S = (a , b) i promieniu r > 0 ma postać:
( x – a ) 2 + ( y – b) 2= r 2

Informacja:
W pliku wśród 100 pierwszych punktów 80 należy do wnętrza koła.

Rozwiązanie:
Układ współrzędnych z wrysowanym kwadratem i kołem.

Plik .cpp rozwiązania zadania:

#include <iostream>
#include <fstream>

#define N 10000

using namespace std;

int main()
{
 ifstream plik;
 ofstream wyniki;
 plik.open("punkty.txt");
 wyniki.open("wyniki_4_1.txt");
 // pobieranie danych do tablicy x i y
 int x[N];
 int y[N];
 for (int i=0; i<N; i++)
 plik >> x[i] >> y[i];

//srodek okregu S = ( a , b )
 int a = 200, b = 200;

//promien okregu
 int r = 200;

int ile = 0;

wyniki << "Wspolrzedne pkt nalezace do brzegu kola (okregu) : " << endl;
 long wynik;
 for (int i=0; i<N; i++) {
 wynik = ((x[i]-a)*(x[i]-a))+((y[i]-b)*(y[i]-b));
 //sprawdzam czy wspolrzedne naleza do brzegu kola
 if (wynik == r*r){
 wyniki << x[i] << " " << y[i] << endl;
 }
 //sprawdzam czy wspolrzedne naleza do wewnatrz kola
 if (wynik < r*r)
 ile++;
 }
 wyniki << "Ilosc pkt nalezacych do okregu: " << endl << ile << endl;

// zamkniecie plikow
 plik.close();
 wyniki.close();

return 0;
}

Zadanie 4.2. (0–3)
Przy założeniu równomiernego rozkładu punktów w kwadracie, stosunek liczby punktów nk należących do koła do liczby punktów n należących do kwadratu jest w przybliżeniu równy stosunkowi pola koła Pk do pola kwadratu P:

Dla przypomnienia:

P = π * r 2

Wyznacz przybliżoną wartość liczby pi, biorąc pod uwagę punkty z pliku punkty.txt:

– pierwszych 1000 punktów,
– pierwszych 5000 punktów,
– wszystkie punkty.

Wyniki zaokrąglij do 4 miejsc po przecinku.

Informacja:
Przybliżona wartość liczby pi dla pierwszych 100 punktów z pliku wynosi 3,2000.

Rozwiązanie:

Ze stosunku podanego powyżej wynik, iż nk/n * 4 = pi.

#include <iostream>
#include <fstream>
#include <iomanip>

#define N 10000

using namespace std;

int main()
{
 ifstream plik;
 ofstream wyniki;
 plik.open("punkty.txt");
 wyniki.open("wyniki_4.txt");
 // pobieranie danych do tablicy x i y
 int x[N];
 int y[N];
 for (int i=0; i<N; i++)
 plik >> x[i] >> y[i];

//srodek okregu S = ( a , b )
 int a = 200, b = 200;

//promien okregu
 int r = 200;

int ile1000 = 0;
 int ile5000 = 0;
 int ile = 0;

long wynik;
 for (int i=0; i<1000; i++) {
 wynik = ((x[i]-a)*(x[i]-a))+((y[i]-b)*(y[i]-b));
 if (wynik <= r*r) ile1000++;
 }
 for (int i=0; i<5000; i++) {
 wynik = ((x[i]-a)*(x[i]-a))+((y[i]-b)*(y[i]-b));
 if (wynik <= r*r) ile5000++;
 }
 for (int i=0; i<N; i++) {
 wynik = ((x[i]-a)*(x[i]-a))+((y[i]-b)*(y[i]-b));
 if (wynik <= r*r) ile++;
 }
 wyniki << "Ze wzoru wynika, iz stosunke Nk do N nalezy przemnozyc o 4." << endl;
 wyniki << "Przyblizona wartosc liczby pi (pierwszych 1000 pkt): ";
 wyniki << fixed; 
 //ustawia wyswietlana liczbe zmiennoprzecinkowa na notacje stala, potrzebna do tego biblioteka iomanip
 wyniki << setprecision(4); 
 //ustawia dokladnosc wyswietlanej liczby na liczbe w nawiasie np. 4 to 0,0001
 wyniki << (double(ile1000) / 1000) * 4 << endl;
 wyniki << "Przyblizona wartosc liczby pi (pierwszych 5000 pkt): ";
 wyniki << fixed; 
 wyniki << setprecision(4);
 wyniki << (double(ile5000) / 5000) * 4 << endl;
 wyniki << "Przyblizona wartosc liczby pi (wszystkich pkt): ";
 wyniki << fixed; 
 wyniki << setprecision(4); 
 wyniki << (double(ile) / N) * 4 << endl;

// zamkniecie plikow
 plik.close();
 wyniki.close();

return 0;
}

Zadanie 4.3. (0−5)
Błąd bezwzględny przybliżonej wartości liczby pi, wyznaczonej z n punktów, definiujemy następująco:

gdzie:

π – wartość liczby pi, będąca wynikiem standardowej funkcji z narzędzia informatycznego, z którego korzystasz;

pin – przybliżona wartość liczby pi wyznaczona z n kolejnych punktów, poczynając od pierwszego punktu z pliku punkty.txt, np. pi1000 – liczba wyznaczona z pierwszego tysiąca punktów.

Oblicz   εn dla n = 1, 2, 3, …, 1700. Na podstawie powyższego zestawienia utwórz wykres liniowy ilustrujący zmiany dokładności wyznaczanej liczby pi. Zadbaj o czytelność wykresu. Wartości dla ε1000 oraz ε1700 (zaokrąglone do czterech miejsc po przecinku) zapisz do pliku wyniki_4.txt.

Rozwiązanie:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstdlib>
#include <math.h>

#define N 1700

using namespace std;

int main()
{
 ifstream plik;
 ofstream wyniki;
 plik.open("punkty.txt");
 wyniki.open("wyniki_4.txt");
 // pobieranie danych do tablicy x i y
 int x[N];
 int y[N];
 long n[N];
 double w[N];
 //srodek okregu S = ( a , b )
 int a = 200, b = 200;
 //promien okregu
 int r = 200;
 //ilosc punktow nalezacych do kola
 int ile = 0;
 //tmp wynik
 long wynik;

for (int i=0; i<N; i++) {
 plik >> x[i] >> y[i];
 ile = 0;
 for (int j=0; j<=i; j++) {
 wynik = ((x[j]-a)*(x[j]-a))+((y[j]-b)*(y[j]-b));
 if (wynik <=r*r) ile++;
 }
 n[i] = ile;
 w[i] = fabs( M_PI - (double(ile) / i) * 4 ); // wartosc bezwzgledna liczby zmiennoprzecinkowej

}
 for (int a=1; a<N; a++) {
 wyniki << fixed;
 wyniki << setprecision(4);
 wyniki << w[a] << endl;
 }
 // zamkniecie plikow
 plik.close();
 wyniki.close();

return 0;
}

Część druga zadania (wykres):

  1. Pobieramy z pliku textowego dane do excela.
  2. Dane, które pobraliśmy są w formie tekstowej. Rozdzielone są kropką zamiast przecinkiem.
  3. Należy zamienić (CTR+H) kropkę (.) na przecinek (,).
  4. Zaznaczamy wszystkie dane pobrane z pliku txt i tworzymy wykres liniowy. Poprawiamy wygląd wykresu i gotowe!

 

Matura 2016 (maj). Zadanie 3. Test

Matura 2016 (maj). Zadanie 3. Test

Oceń, czy poniższe zdania są prawdziwe. Zaznacz P, jeśli zdanie jest prawdziwe, albo F – jeśli zdanie jest fałszywe. W każdym zadaniu cząstkowym punkt uzyskasz tylko za komplet poprawnych odpowiedzi.

Zadanie 3.1. (0–1)
Po wpisaniu w pasku adresu przeglądarki http://81.219.47.83 otwiera się strona Centralnej Komisji Egzaminacyjnej, ale po wpisaniu http://cke.edu.pl pojawia się błąd „Nie można odnaleźć podanej strony”. Możliwe przyczyny tego stanu rzeczy to:

1. awaria serwera SMTP Centralnej Komisji Egzaminacyjnej F
2. awaria serwera poczty użytkownika F
3. awaria serwera DNS P
4. brak prawidłowego klucza szyfrującego w przeglądarce F

Wyjaśnienie:

Wpisując adres domenowy w pasku adresu przeglądarki wyświetli się błąd, oznacza, że jest problem z serwerem DNS. Domain Name System (DNS, pol. „system nazw domenowych”) – system serwerów, protokół komunikacyjny oraz usługa obsługująca rozproszoną bazę danych adresów sieciowych. Pozwala na zamianę adresów znanych użytkownikom Internetu na adresy zrozumiałe dla urządzeń tworzących sieć komputerową. Dzięki DNS nazwa mnemoniczna, np. pl.wikipedia.org jest tłumaczona na odpowiadający jej adres IP, czyli 91.198.174.192.

Serwer SMTP – (ang. Simple Mail Transfer Protocol) – protokół komunikacyjny opisujący sposób przekazywania poczty elektronicznej w Internecie.

Zadanie 3.2. (0–1)

Dana jest funkcja f określona wzorem rekurencyjnym:

matura 2016 maj zadanie 3

Wtedy:

1. f(8) = 1/3 F
2. f(9) = 3/4 P
3. f(10) = 4 P
4. f(100) = -1/3 F

 

Działanie funkcji rekurencyjnej podanej powyżej to wyniki:
f(1) = 4
f(2) = -1/3
f(3) = 3/4
f(4) = 4 itd.
Wynik się powtarzają: co daje dla elementu 1,4,7,10,13,16 daje wynik 4, dla elementu 2,5,8,11,14,17 daje wynik -1/3, zaś dla elementów 3,6,9,12,15,18 daje wynik 3/4.

Zadanie 3.3. (0–1)

Dla dwóch liczb 1111(2) i 101(2), ich

1. suma jest równa 10110(2)   P   F
2. różnica jest równa 1010(2)  P F
3. iloczyn jest mniejszy od 110000(2) P F
4. iloraz jest większy od 10(2) P F

 

Suma liczb binarnych:

Liczby w systemie dwójkowym dodajemy podobnie, jak w systemie dziesiętnym. Gdy po dodaniu dwóch cyfr uzyskujemy wartość niemożliwą do zapisania pojedynczą cyfrą, zachodzi tzw. przeniesienie. Odejmujemy wtedy od wyniku podstawę systemu, a do następnej (starszej) pozycji dodajemy 1. W przypadku liczb dwójkowych przeniesienie wystąpi już wtedy, gdy wynik dodawania dwóch cyfr jest większy od 1. Poniższa tabliczka dodawania obrazuje wyżej omówione zasady:

 0
 +  0
 0
 0
 +  1
 1
 1
 +  0
 1
 1
  +  1
  1  0

 

Rozwiązanie:

 1   1   1 
 1  1  1  1
 +  1  0  1
 1  0  1  0  0

Różnica liczb binarnych:

Przy odejmowaniu korzystamu z tabliczki przedstawionej poniżej. Przy wykonywaniu działania 0-1 otrzymujemy wynik 1, ale należy pamiętać o odjęciu (1) z kolejnej kolumny.

 0
 –  0
 0
 1
 –  0
 1
 1
 –  1
 0
 (1)  0
  –  1
 0

 

Rozwiązanie:

 1  1  1  1
 –  1  0  1
 1  0  1  0

Iloczyn liczb binarnych:

Naukę mnożenia w systemie binarnym rozpoczynamy od zapoznania się z „tabliczką mnożenia” (poniżej). Każdą cyfrę mnożnej mnożymy przez poszczególne cyfry mnożnika zapisując wyniki mnożeń w odpowiednich kolumnach. Działania są nawet prostsze niż w systemie dziesiętnym, ponieważ wynik mnożenia jest zawsze jednocyfrowy. Na końcu dodajemy do siebie wszystkie cyfry w kolumnach.

 0
 *  0
 0
 1
 *  0
 0
 0
 *  1
 0
 1
  *  1
 1

Rozwiązanie:

     1   1   1   1 
   *     1  0  1
 1  1  1  1
 0  0  0  0
 +  1  1  1  1
 1  0  0  1  0  1  1

Iloraz liczb binarnych:

Dzielenie w naturalnym systemie dwójkowym jest podobne do dzielenia w systemie dziesiętnym. Dzielimy dzielną przez dzielnik i wynik zapisujemy nad kreską. Następnie mnożymy otrzymany wynik przez dzielnik i dokonujemy odejmowania pod kreską.

Rozwiązanie:

   1  1          
 1   1   1  1  :   1  0   1 
 –  1 0 1
1  0  1 0
 – 1 0 1
0 0 0      

Zadanie 3.4. (0–1)

 1. Jednym z zadań systemu operacyjnego jest przydział pamięci działającym programom. P
2. Na jednym dysku twardym mogą być zainstalowane dwa systemy operacyjne. P
3. System operacyjny musi być przechowywany w pamięci ROM. F
4. System operacyjny musi być przechowywany na twardym dysku. F

 

Ad. 1. Zadania systemu operacyjnego:

1. Zapewnienie komunikacji między komputerem a użytkownikiem.
2. Obsługiwanie zasobów sprzętowych.
3. Regulowanie dostępu poszczególnych programów do zasobów sprzętowych.
4. Przydzielanie informacjom (plikom) pamięci.
5. Sterowanie przesyłaniem danych

Ad. 2. Dysk twardy
Dysk twardy może posiadać wiele partycji, na których mogą być zainstalowane różne systemy operacyjne.

Ad. 3. Pamięć ROM:

Pamięć stała ROM (ang. Read Only Memory – pamięć tylko do odczytu) jest stosowana w systemach procesorowych do przechowywania danych, które się nie zmieniają – np. różnego rodzaju tabele funkcji, parametry urządzeń, a także procedury startowe komputera i obsługa różnych urządzeń wejścia/wyjścia. Cechą charakterystyczną pamięci ROM jest przechowywanie zapisanych danych nawet po wyłączeniu zasilania. Dzięki temu są one od razu gotowe do użycia tuż po ponownym uruchomieniu systemu komputerowego. Drugą charakterystyczną cechą jest stałość zapisanych danych, których zwykle nie można zmieniać w trakcie normalnej pracy pamięci – gwarantuje to, iż przechowywana informacja przetrwa nienaruszona podczas różnego rodzaju błędów zapisu pamięci. Stąd bierze swój początek angielska nazwa ROM – Read Only Memory, czyli pamięć tylko do odczytu.

Ad. 4. System operacyjny:

System operacyjny (ang. operating system, skrót OS) – oprogramowanie zarządzające systemem komputerowym, tworzące środowisko do uruchamiania i kontroli zadań użytkownika. System taki może być uruchomiony z różnych nośników, np. na CD-ROM, Pendrive, itp.

Matura 2016 (maj). Zadanie 2. Przestawienia w tablicy

Matura 2016 (maj). Zadanie 2. Przestawienia w tablicy

Parametrem podanej poniżej funkcji przestaw jest tablica A o długości n, indeksowana od 1, w której znajdują się liczby całkowite. Niech klucz będzie wartością pierwszego elementu tablicy A. Funkcja przestawia (zamienia wzajemnie) elementy tablicy A tak, aby po jej wykonaniu w lewej części tablicy były wszystkie elementy tablicy mniejsze od klucza, natomiast w prawej części – wszystkie większe lub równe kluczowi.

Specyfikacja:

Dane:

n – liczba całkowita dodatnia
A[1..n] – tablica liczb całkowitych

Wynik:

A[1..n] – tablica liczb całkowitych ułożona według podanej reguły

funkcja przestaw(A)
  klucz ← A[1]
  w ← 1
  dla k = 2, 3, ..., n wykonaj
    jeśli A[k] < klucz
      zamień(A[w], A[k])
      w ← w + 1

Uwaga:
Funkcja zamień(x,y) zamienia wzajemnie wartości zmiennych x i y – w powyższym przypadku zamienia wzajemnie dwa elementy tablicy A.

Zadanie 2.1. (0–2)
Dana jest liczba n = 6 oraz tablica A = [4,6,3,5,2,1]. Podaj kolejność elementów w tablicy A po wykonaniu funkcji przestaw(A).

Krok 1.
Podstawiamy pod klucz = A[1], czyli klucz = 4. Zmienna w = 1, w to jest nr elementu w tablicy, z którym będziemy zamieniać element mniejszy od klucza.

Krok 2.
Sprawdzamy czy A[2] < klucza, czyli czy 6<4, tu odpowiedź brzmi nie. Nie wykonujemy zamiany. Sprawdzamy kolejny element tablicy. Po wykonaniu tej czynności nasz tablica A = [4,6,3,5,2,1].

Krok 3.
Sprawdzamy czy A[3] < klucza, czyli czy 3<4, tu odpowiedź brzmi tak. Zamieniamy element tablicy A[1] z A[3], czyli 3 z 4. Po wykonaniu tej czynności nasz tablica A = [3,6,4,5,2,1]. Zwiększamy o 1 wartość zmiennej w, tj. w = 2. Sprawdzamy kolejny element tablicy.

Krok 4.
Sprawdzamy czy A[4] < klucz, czyli czy 5<4, tu odpowiedź brzmi nie. Nie wykonujemy zamiany. Sprawdzamy kolejny element tablicy.Po wykonaniu tej czynności nasz tablica A = [3,6,4,5,2,1].

Krok 5.
Sprawdzamy czy A[5] < klucza, czyli czy 2<4, tu odpowiedź brzmi tak. Zamieniamy element tablicy A[2] z A[5], czyli 6 z 2. Po wykonaniu tej czynności nasz tablica A = [3,2,4,5,6,1]. Zwiększamy o 1 wartość zmiennej w, tj. w = 3. Sprawdzamy kolejny element tablicy.

Krok 6.
Sprawdzamy czy A[6] < klucza, czyli czy 1<4, tu odpowiedź brzmi tak. Zamieniamy element tablicy A[3] z A[6], czyli 4 z 1. Po wykonaniu tej czynności nasz tablica A = [3,2,1,5,6,4]. Zwiększamy o 1 wartość zmiennej w, tj. w = 4. Koniec naszej tablicy.

Odpowiedź:
Tablica A = [3,2,1,5,6,4].

Kod w C++ sprawdzający poprawność działania algorytmu:

#include <iostream>
using namespace std;
int main()
{
 int n = 6;
 int A[n] = {4,6,3,5,2,1};
 int klucz = A[0];
 int w = 0;
 for (int k=1; k<n; k++)
 if (A[k] < klucz) {
 swap(A[w], A[k]);
 w++;
 }
 for (int i=0; i<n; i++)
 cout << A[i] << " ";
 cout << endl;
 cout << "Zamian = " << w << endl;
 return 0;
}

Zadanie 2.2. (0–1)
Podaj przykład siedmioelementowej tablicy A, dla której funkcja przestaw(A) dokładnie 5 razy wykona zamień.

Musi to być taka tablica, gdzie dokładnie 5 elementów będzie mniejszych od klucza. Kluczem jest pierwszy element tablicy. Przykładowa tablica to: A = [6,5,4,3,2,1,7].

Odpowiedź:
Tablica A = [5,4,3,2,1,6,7].

Zadanie 2.3. (0–3)
Tablica A[1..100] zawiera wszystkie liczby całkowite z przedziału <1, 100> w następującej kolejności:
A = [10, 20, 30, …, 100, 9, 19, 29, …, 99, 8, 18, 28, …, 98, …., 1, 11, 21, …, 91].
(najpierw rosnąco wszystkie liczby kończące się na 0, potem rosnąco liczby kończące się na 9, potem na 8 itd.)
Podaj wartość zmiennej w oraz wartości trzech pierwszych elementów tablicy A (A[1], A[2], A[3]), po wykonaniu funkcji przestaw(A).

Wartość zmiennej w jest równa ilości wykonanych zamian liczb, czyli tu będzie to 9 zmian, tak więc w = 9, ponieważ mniejszych liczb od klucz (A[1] = 10) jest 9 (tj. 9,8,7,6,5,4,3,2,1).  Jeśli chodzi o elementy to w zależności, który element jest pierwszy mniejszy od klucza, który jest równy 10. W podanym zapisie mamy że najpierw napotykamy 9, potem 8 itd. do 1.

Odpowiedź:
w = 10.
A[1] = 9, A[2] = 8, A[3] = 7.

Matura 2016 (maj). Zadanie 1. Liczby skojarzone

Matura 2016 (maj). Zadanie 1. Liczby skojarzone

Dwie różne liczby całkowite a i b większe od 1 nazwiemy skojarzonymi, jeśli suma wszystkich różnych dodatnich dzielników a mniejszych od a jest równa b+1, a suma wszystkich różnych dodatnich dzielników b mniejszych od b jest równa a+1.
Skojarzone są np. liczby 140 i 195, ponieważ:
  1. dzielnikami 140 są 1, 2, 4, 5, 7, 10, 14, 20, 28, 35, 70, a ich suma wynosi 196 = 195+1.
  2. dzielnikami 195 są 1, 3, 5, 13, 15, 39, 65, a suma tych liczb równa jest 141 = 140+1.

Zadanie 1.1. (0–1)

Zbadaj, które z następujących par liczb (a, b) są liczbami skojarzonymi, i wypełnij poniższą tabelę:
a b dzielniki a
(mniejsze od a)
dzielniki b
(mniejsze od b)
suma
dzielników
a
suma
dzielników
b
skojarzone
TAK/NIE
 78  64 1,2,3,6,13,26,39 1,2,4,8,16,32 90 63 NIE
 20  21 1,2,4,5,10 1,3,7  23 12 NIE
 75  48  1,3,5,15,25 1,2,3,4,6,8,12,16,24 49 76 TAK
Obliczenia:

Przykład 1.
a = 20;
Dzielniki a to: 1,2,4,5,10. 
Suma dzielników: 1+2+4+5+10 = 22
b = 21;
Dzielniki b to: 1,3,7.
Suma dzielników: 1+3+7 = 11

Sprawdzenie:
a + 1 = suma dzielników b ?
21 ≠ 11
i
b + 1 = suma dzielników a ?
22 = 22

Przykład 2.
a = 75;
Dzielniki a to: 1,3,5,15,25.
Suma dzielników: 1+3+5+15+25 = 49
b = 48;
Dzielniki b to: 1,2,3,4,6,8,12,16,24.
Suma dzielników: 1+2+3+4+6+8+12+16+24 = 76

Sprawdzenie:
a + 1 = suma dzielników b ?
76 = 76
i
b + 1 = suma dzielników a ?
49 = 49

Zadanie 1.2. (0–4)

Dana jest liczba całkowita a większa od 1. Ułóż i zapisz w wybranej przez siebie notacji algorytm, który znajdzie i wypisze liczbę b skojarzoną z a lub komunikat „NIE”, jeśli taka liczba nie istnieje.
W zapisie algorytmu możesz korzystać tylko z następujących operacji arytmetycznych: dodawania, odejmowania, mnożenia, dzielenia całkowitego i obliczania reszty z dzielenia.

Uwaga:
Przy ocenie algorytmu będzie brana pod uwagę liczba operacji arytmetycznych wykonywanych przez Twój algorytm.

Specyfikacja:
Dane: Liczba całkowita a > 1.
Wynik: Liczba całkowita b skojarzona z a lub komunikat „NIE”, jeśli taka liczba nie istnieje.

Algorytm:

int main()
{
 cout << "Zadnie 1. Matura 2016 - maj!" << endl;
 int a,b;
 cout << "Podaj a = ";
 cin >> a;
 cout << "Podaj b = ";
 cin >> b;
 int suma1 = 0;
 cout << " Dzielniki a: ";
 for (int i=1; i<a; i++)
 if ( a % i == 0 ) {
 cout << i << " ";
 suma1 += i;
 }
 cout << endl << " Suma dzilnikow = " << suma1 << endl;

int suma2 = 0;
cout << ” Dzielniki b: „;
for (int i=1; i<b; i++)
if ( b % i == 0 ) {
cout << i << ” „;
suma2 += i;
}
cout << endl << ” Suma dzielnikow = ” << suma2 << endl;
cout << ” Liczby skojarzone: „;
if (suma1==b+1 && suma2==a+1) cout << ” TAK ” << endl;
else cout << ” NIE ” << endl;
return 0;
}

Największy wspólny dzielnik

Największy wspólny dzielnik

Wyjaśnienie problemu

Największy wspólny dzielnik (NWD) dwóch liczb całkowitych – to największa liczba naturalna, która dzieli obie te liczby bez reszty.

Zatem metoda pierwsza

Największy wspólny dzielnik (NWD) znajduje się następująco. Rozkładem liczby na czynniki pierwsze, zakreślam wspólne dzielniki, mnożę zakreślone dzielniki i tak otrzymujemy liczbę będącą NWD.

Przykład

280 2 150 2
140 2 75 3
70 2 25 5
35 5 5 5
7 7 1
1

NWD(280,150) = 2 * 5 = 10

36 2 16 2
18 2 8 2
9 3 4 2
3 3 2 2
1 0 1

NWD(36,16) = 2 * 2 = 4

Zatem metoda druga

Algorytm Euklidesa jest szybkim sposobem obliczania największego wspólnego dzielnika dwóch (zwłaszcza dużych) liczb całkowitych. Polega ona na dzieleniu modulo (reszta z dzielenie).

Algorytm

Aby obliczyć NWD(a,b), wykonujemy kolejno następujące kroki:

  1. Dzielimy z resztą liczbę a przez liczbę b
    • jeżeli reszta =0, to NWD(a,b)=b
    • jeżeli reszta ?0, to przypisujemy liczbie a wartość liczby b, liczbie b wartość otrzymanej reszty, a następnie wykonujemy ponownie punkt 1.

Przykład

Liczba A = 280  B = 150

280 : 150 = 1 reszty 130
150 : 130 = 1 reszty 20
130 : 20 = 6 reszty 10
20 : 10 = 2 reszty 0

Otrzymaliśmy resztę równą zero, zatem szukany NWD będzie równy ostatniej niezerowej reszcie:

NWD(280, 150) = 10

Zatem metoda trzecia

Największy wspólny dzielnik (NWD) możemy wyznaczyć metodą Euklidesa, która polega na wyznaczeniu dwóch liczb naturalnych. Kolejnym krokiem jest sprawdzenie, która liczba jest większa i zamianie miejscami jeśli to konieczne, aby ustawić większa liczba na początku. Następnie wykonujemy odejmowanie, powstały wynik podstawiamy pod liczbę większą, gdzie powstaje nowa para. Powtarzamy te czynności do momentu, kiedy dwie liczby są równe.

Przykład

Liczba A = 280 B = 150

280 – 150 = 130
150 – 130= 20
130 – 20 = 110
110 – 20 = 90
90 – 20 = 70
70 – 20 = 50
50 -20 = 30
30 – 20 = 10
20 – 10 = 10
10 10

Ponieważ liczby są sobie równe, oznacza to, że największy wspólny dzielnik liczb 280 i 150 to 10.

 

Liczby względnie pierwsze

Liczby względnie pierwsze

Wyjaśnienie problemu

Jeżeli dwie liczby całkowite a i b spełniają warunek NWD(a,b)=1, czyli nie mają żadnego naturalnego dzielnika oprócz 1, to liczby takie nazywamy liczbami względnie pierwszymi. Rozkłady na czynniki pierwsze liczb względnie pierwszych wyróżniają się brakiem czynników wspólnych dla wszystkich liczb.

Zatem

jeśli rozkładamy dwie  liczby na czynniki pierwsze to liczby po prawej stronie tabeli z pierwszej liczby nie powtórzą się w liczbach znajdujących się po prawej stronie rozkładu drugiej liczby.

Przykład

15=3⋅5
28=2⋅2⋅7
wspólne czynniki: brak
nwd(15,28)=1
Liczby 15 i 28 są względnie pierwsze.

15=3⋅5
16=2⋅2⋅2⋅2
wspólne czynniki: brak
nwd(15,16)=1
Liczby 15 i 16 są względnie pierwsze.

25=5⋅5
27=3⋅3⋅3
wspólne czynniki: brak
nwd(25,27)=1
Liczby 25 i 27 są względnie pierwsze.

Algorytm

Dane wejściowe

 

Dane wyjściowe

Podaj adres sieci dla IP 192.168.0.254 przy masce 28-bitowej?

Odpowiedź:

Adres IP:
192.168.0.254

Maska podsieci:
255.255.255.240

AdresIP:  11000000.10101000.00000000.11111110
Maska IP: 11111111.111111111.11111111.11110000

Adres IP: 1 1 0 0 0 0 0 0 . 1 0 1 0 1 0 0 0 . 0 0 0 0 0 0 0 0 . 1 1 1 1 1 1 1 0
Maska: 1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 1 1 1 0 0 0 0
Adres sieci: 1 1 0 0 0 0 0 0 . 1 0 1 0 1 0 0 0 . 0 0 0 0 0 0 0 0 . 1 1 1 1 0 0 0 0

Adres sieci: 192.168.0.240