Matura 2017 (maj). Zadanie 4. Trójki liczb

Matura 2017 (maj). Zadanie 4. Trójki liczb

W pliku liczby.txt znajduje się 1000 trójek liczb całkowitych dodatnich rozdzielonych pojedynczymi odstępami, każda trójka – w osobnym wierszu. Liczby zapisane w pliku należą do przedziału [1, 32 767].

Plik do pobrania.

Fragment danych z pliku liczby.txt:

20634 31423 261
11009 21970 32126
26318 16336 5158
24196 14586 3545

Napisz program(y), który(e) da(dzą) odpowiedzi do poniższych zadań. Odpowiedzi zapisz
w pliku wyniki4.txt, a każdą odpowiedź poprzedź odpowiednim numerem zadania.

Zadanie 1.

Podaj, w ilu wierszach pliku z danymi liczby w trójkach są uporządkowane rosnąco.

Przykład:

Dla danych
4587 9351 28950
15010 28342 31848
30172 7492 6768
29120 21664 32328

odpowiedzią jest 2 (w dwóch wyróżnionych wierszach liczby są uporządkowane rosnąco).

Rozwiązanie:

#include <iostream>
#include <fstream>
#define N 1000
#define T 3
using namespace std;
int main()
{
 int t[T][N];
 fstream plik;
 plik.open("liczby.txt");
 if (!plik.good()) cout << "brak pliku!";
   else {
     for (int i=0; i<N;i++)
     plik >> t[0][i] >> t[1][i] >> t[2][i];
 }
 plik.close();
 // zadanie 1
 int wiersz=0;
 for (int i=0; i<N;i++)
   if ((t[0][i] < t[1][i]) && (t[1][i] < t[2][i])) {
     cout << t[0][i] << " " << t[1][i] << " " << t[2][i] << endl;
     wiersz++;
   }
 fstream wynik;
 wynik.open("wynik4.txt", ios::out);
 wynik << wiersz << endl;
 wynik.close();
 return 0;
}

Komentarz:

Pobieramy dane z pliku do zmiennych tablicowych t[0][1000], t[1][1000], t[2][1000]. Następnie sprawdzamy czy liczba t1 jest mniejsza od t2 oraz cz liczba t2 jest mniejsza od t3, jeśli tak to zwiększamy wartość wiersz o jeden.

Zadanie 2.

Dla każdego wiersza wyznacz największy wspólny dzielnik (NWD) trójki liczb w nim zapisanych i podaj sumę tych dzielników.

Przykład:

Dla danych
3 6 9
34 10 4
36 20 28
16 40 56

odpowiedzią jest 17, ponieważ NWD trójek liczb w kolejnych wierszach to: 3, 2, 4, 8 (3+2+4+8=17).

Rozwiązanie:

#include <iostream>
#include <fstream>
#define N 1000
#define T 4
using namespace std;
int NWD(int a, int b) {
 while (a!=b) {
 if (a>b) a-=b;
 else b-=a;
 }
 return a;
}
int main()
{
 int t[T][N];
 fstream plik;
 plik.open("liczby.txt");

if (!plik.good()) cout << "brak pliku!";
 else {
 for (int i=0; i<N;i++)
 plik >> t[0][i] >> t[1][i] >> t[2][i];
 }
 plik.close();
 // zadanie 2
 int suma = 0;
 for (int i=0; i<N;i++) {
 t[3][i] = NWD(NWD(t[0][i],t[1][i]),t[2][i]);
 suma+=t[3][i];
 }
 fstream wynik;
 wynik.open("wynik4.txt", ios::out);
 wynik << suma << endl;
 wynik.close();
 return 0;
}

Komentarz:

Pobieramy dane z pliku do zmiennych tablicowych t[0][1000], t[1][1000], t[2][1000]. Następnie obliczamy dla każdej trójki NWD metodą Euklidesa i wynik przypisujemy do tablicy nr 4. Na koniec wykonujemy sumowanie wartości zapisanych w tablicy.

Zadanie 3.

Dla każdego wiersza oblicz sumę cyfr wszystkich liczb znajdujących się w tym wierszu.
Podaj:

  • liczbę wierszy, dla których suma cyfr ze wszystkich trzech zapisanych liczb jest równa
    35;
  • największą sumę cyfr w wierszu oraz liczbę wierszy, w których suma cyfr równa jest
    tej największej wartości.

Przykład:

Dla danych
45 9151 2800
2882 15040 2800 (*)
30172 2592 1102
29121 23564 320 (*)
3 243 765

W dwóch wierszach suma cyfr jest równa 35 (wytłuszczone wiersze). Maksymalną sumą jest 40, która wystąpiła 2 razy – w wierszach oznaczonych (*).

Rozwiązanie:

#include <iostream>
#include <fstream>
#define N 1000
#define T 4
using namespace std;
int sumacyfr(int c) {
 int s=0;
 while (c>0) {
 int tmp=c%10;
 c/=10;
 s+=tmp;
 }
 return s;
}
int main()
{
 int t[T][N];
 fstream plik;
 plik.open("liczby.txt");
 if (!plik.good()) cout << "brak pliku!";
 else {
 for (int i=0; i<N;i++)
 plik >> t[0][i] >> t[1][i] >> t[2][i];
 }
 plik.close();
 // zadanie 3
 int ile = 0;
 int suma = 0;
 int maksimum = 0;
 int ile_maks = 0;
 for (int i=0; i<N;i++) {
 t[3][i] = sumacyfr(t[0][i])+sumacyfr(t[1][i])+sumacyfr(t[2][i]);
 if (t[3][i] == 35)
   ile++;
   if (maksimum<t[3][i]) maksimum = t[3][i];
 }
 for (int i=0; i<N;i++)
   if (t[3][i] == maksimum)
   ile_maks++;
 fstream wynik;
 wynik.open("wynik4.txt", ios::out);
 wynik << "ilosc sumy cyfr rownych 35 : "<< ile << endl;
 wynik << "wartosc maksimalnej sumy cyfr rowna jest : "<< maksimum << endl;
 wynik << "ilosc wystepowan maksimum jest rowna : "<< ile_maks << endl;
 wynik.close();
 return 0;
}

 

Matura 2017 (maj). Zadanie 2. Liczby pierwsze

Matura 2017 (maj). Zadanie 2. Liczby pierwsze

Parą liczb bliźniaczych nazwiemy dwie liczby pierwsze różniące się o 2. Liczbami bliźniaczymi są 11 i 13, gdyż obie liczby są pierwsze i różnica pomiędzy nimi wynosi 2. Para 13 i 15 nie jest parą liczb bliźniaczych, gdyż 15 jest liczbą złożoną.

Zadanie 1.

Uzupełnij poniższą tabelę. Wykonaj obliczenia i podaj odpowiedź, czy istnieje taka liczba, z którą liczba a tworzy parę liczb bliźniaczych.

Liczba a Czy liczba a jest pierwsza? Liczba b1=a+2 Czy liczba b1 jest pierwsza? Liczba b2=a–2 Czy liczba b2 jest pierwsza? Czy istnieje taka liczba b, z którą liczba a tworzy parę liczb bliźniaczych?
17 tak 19 tak 15 nie TAK
5 tak 7 tak 3 tak TAK
31 tak  33  nie  29 tak  TAK
41 tak  43  tak  39  nie  TAK
49 nie  51  nie  47  tak  NIE

Rozwiązanie:

Liczba pierwsza jest to taka liczba naturalna większa od 1, która posiada dokładnie dwa dzielniki: 1 i samą siebie. Sprawdzamy każdą liczby a czy jest to liczba pierwsza, jeśli nie to nawet nie musimy sprawdzać kolejnych liczb, zaś jeśli tak to sprawdzamy liczby b1=a-2 oraz b2=a+2. Jeśli, któraś z liczb b1, b2 jest liczbą pierwszą to wtedy mówimy, że liczby tworzą parę liczb bliźniaczych.

Zadanie 2.

Zapisz algorytm (w postaci listy kroków, schematu blokowego lub w wybranym języku programowania) sprawdzający, czy dana liczba należy do pary liczb bliźniaczych. Twój algorytm powinien być zgodny z poniższą specyfikacją.

Uwaga: w zapisie możesz wykorzystać tylko operacje dodawania, odejmowania, mnożenia, dzielenia, dzielenia całkowitego i brania reszty z dzielenia całkowitego, operacje logiczne oraz samodzielnie napisane funkcje.

Specyfikacja algorytmu:

Dane:

a – dodatnia liczba całkowita, a ≥ 3

Wynik:

komunikat TAK, jeżeli a należy do pary liczb bliźniaczych
komunikat NIE, jeżeli a nie należy do pary liczb bliźniaczych

Algorytm:

#include <iostream>
#include <math.h>
using namespace std;
bool czypierwsza(int a) {
  bool spr;
  if(a<2) spr = false;
  //gdy liczba jest mniejsza niz 2 to nie jest pierwsza
  for(int i=2;i<=sqrt(a);i++) {
    if(a%i==0) {
      spr = false;
      break;
    }
    spr = true;
  }
  return spr;
}
int main()
{
 cout << "Podaj liczbe: ";
 int liczba;
 cin >> liczba;
 if (( czypierwsza(liczba)&& czypierwsza(liczba-2)) || (czypierwsza(liczba) && czypierwsza(liczba+2)))
   cout << "TAK";
 else
   cout << "NIE" << endl;
 return 0;
}

Matura 2017 (maj). Zadanie 1. Szyfrowanie

Matura 2017 (maj). Zadanie 1. Szyfrowanie

Dany jest algorytm szyfrujący tekst jawny s o następującej specyfikacji:

Dane:

d – długość tekstu do zaszyfrowania, d > 1
s[1..d] – tekst jawny, ciąg znaków o długości d
k – liczba całkowita dodatnia taka, że k < d
n – liczba całkowita dodatnia taka, że n < d

Wynik:

szyfr [1..d] – zaszyfrowany tekst s

Algorytm:

od j=1 do d
 szyfr[j] ← s[j]
 i ← 1
 dopóki i ≤ d – k
 szyfr[i] ↔ szyfr[i+k]
 i ← i+n

Operacja szyfr[a] ↔ szyfr[b] oznacza zamianę w ciągu szyfr znaku z pozycji a na znak z pozycji b – i na odwrót.

Zadanie 1.

Uzupełnij tabelę – wpisz zaszyfrowany tekst, który otrzymasz w wyniku wykonania algorytmu.

s d k n szyfr
ataknadranem 12 4 2 ntdkaaeranam
maturazinformatyki 18 3 5  uatmrnziafarmotyki
stokrotka 9 1 2 tskoorkta 

Rozwiązanie:

Kod w języku programowania c++:

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
 char tekst[]="stokrotka";
 int d=strlen(tekst);
 cout << d << endl;
 char szyfr[d];
 int k=1, n=2;
 cout << "Tekst jawny: " << tekst << endl;
for (int j=0; j<d; j++)
 szyfr[j]=tekst[j];
int i=0;
 while(i<=d-k-1){
 swap(szyfr[i],szyfr[i+k]);
 i+=n;
 }
cout << "Tekst szyfowany: " ;
 for (int j=0; j<d; j++)
 cout << szyfr[j];
return 0;
}

Zadanie 2.

W kolumnie szyfr zapisano zaszyfrowany tekst s. Odszyfruj tekst i zapisz go w kolumnie s.

szyfr d k n s
eiindaezotinwezssyktpo 22 2 2  pieniadzetoniewszystko

Algorytm:

od j=1 do d
 szyfr[j] ← s[j]
 i ← d-n
 dopóki i > 0
 szyfr[i] ↔ szyfr[i-k]
 i ← i-n

Kod w języku programowania c++:

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
 char tekst[]="eiindaezotinwezssyktpo";
 int d=strlen(tekst);
 cout << d << endl;
 char szyfr[d];
 int k=2, n=2;
 cout << "Tekst szyfowany: " << tekst << endl;
for (int j=0; j<d; j++)
 szyfr[j]=tekst[j];
int i=d-n;
 while(i>0){
 swap(szyfr[i],szyfr[i-k]);
 i-=n;
 }
cout << "Tekst jawny: " ;
 for (int j=0; j<d; j++)
 cout << szyfr[j];
return 0;
}

Zadanie 3.

Uzupełnij zapis algorytmu tak, aby w wyniku jego działania otrzymać odszyfrowany tekst s.

Uwaga: W zapisie możesz wykorzystać operacje dodawania, odejmowania, mnożenia, dzielenia, dzielenia całkowitego i brania reszty z dzielenia całkowitego, operację zamiany dwóch znaków ↔ oraz samodzielnie napisane funkcje.

Specyfikacja:

Dane:

d – długość zaszyfrowanego tekstu, d > 1
szyfr [1..d] – zaszyfrowany tekst o długości d
k – liczba całkowita dodatnia taka, że k < d
n – liczba całkowita dodatnia taka, że n < d

Wynik:

s [1..d] – tekst jawny

Algorytm:

od j=1 do d
s[j] ← szyfr[j]
i ← 1
dopóki i <= d-n-k
 i ← i+n
dopóki i >= 1
 s[i] ↔ s[i+k]
 i ← i-n

Matura 2013 (maj). Zadanie 6. Fundusze

W pliku historia.txt znajdują się wartości jednostek uczestnictwa różnych funduszy inwestycyjnych w kolejnych dniach roboczych 2008 roku. W każdym wierszu znajduje się 13 danych: data oraz 12 liczb rzeczywistych (zapisanych z dwoma miejscami po przecinku), które są cenami jednostek kolejnych funduszy (A, B, C, D, E, F, G, H, I, J, K, L) w danym dniu. Wszystkie dane rozdzielone są średnikami.

Przykład:
2008-01-02;50,90;51,62;53,12;58,66;58,96;59,26;48,15;48,17;48,19;50,23;50,23;50,23
2008-01-03;50,42;51,13;52,62;57,92;58,22;58,51;48,04;48,06;48,08;50,07;50,07;50,07

Wykorzystując dane zawarte w pliku oraz dostępne narzędzia informatyczne wykonaj poniższe polecenia. Odpowiedzi zapisz w pliku zadanie6.txt, a odpowiedź do każdego podpunktu poprzedź literą oznaczającą ten podpunkt.

Rozwiązanie:
Zaczynamy od pobrania danych do arkusza kalkulacyjnego. Plik gotowy do rozwiązywania zadań jest gotowy do pobrania tu.

a) Dla każdego z funduszy podaj średnią cenę jednostki (z całego roku). Wynik zaokrąglij do dwóch miejsc po przecinku.

Do obliczenia średniej wartości ceny jednostki i zaokrąglenia do dwóch miejsc po przecinku wykonujemy za pomocą funkcji:
=ZAOKR(ŚREDNIA(B2:B252);2)

b) Podaj liczbę dni, w których ceny jednostek wszystkich funduszy były wyższe niż 33 zł. Takimi dniami były między innymi dni przedstawione w powyższym przykładzie.

 

c) Podaj cenę, która w całym roku wystąpiła najczęściej, i napisz, ile razy wystąpiła.

d) Dla każdego z dwunastu funduszy podaj najniższą i najwyższą cenę jednostki, jaką odnotowano w 2008 roku. Sporządź wykres liniowy ilustrujący otrzymane zestawienie. Pamiętaj o prawidłowym i czytelnym opisie wykresu.

Matura 2015 (maj). Zadanie 4. Fabryka samochodów

Fabryka samochodów GAZELA produkuje od 2005 roku samochody osobowe czterech marek: Dama, Granta, Dorkas, Lodera. W pierwszym kwartale 2005 roku wyprodukowano 237 samochodów marki Dama, 198 – Granta, 207 – Dorkas oraz 312 – Lodera.

W każdym kolejnym kwartale, w stosunku do poprzedniego kwartału, aż do końca 2009 roku, produkcja samochodów wzrastała. Dla samochodów marki Dama – o 2%, dla samochodów marki Granta – o 2,7%, dla samochodów marki Dorkas – o 3% i dla samochodów marki Lodera – o 2%.

W wyniku kryzysu w 2010 roku wzrost produkcji został zatrzymany i przez cały 2010 rok liczba wyprodukowanych samochodów była stała – utrzymała się dla wszystkich marek na poziomie produkcji z ostatniego kwartału 2009 roku. W roku 2011 i 2012 produkcja co kwartał malała odpowiednio dla samochodu marki Dama – o 1%, samochodu marki Granta – o 1,2%, samochodu marki Dorkas – o 1,9% i samochodu marki Lodera – 2,5%.

Uwaga: Wszystkie wyliczane wartości produkcji zaokrąglaj w dół do liczb całkowitych.

Wykorzystując dostępne narzędzia informatyczne, na podstawie informacji zapisanych wyżej, wykonaj polecenia. Każdą odpowiedź, z wyjątkiem wykresu w zadaniu 4.5., zapisz w pliku wynik4.txt i poprzedź ją numerem oznaczającym zadanie.

Rozwiązanie:

Należy utworzyć skoroszyt wg szablonu na rysunku. Dane do pierwszego kwartału 2005 uzupełniamy z treści zadania, zaś kolejne kwartały obliczamy ze wzoru:

=ZAOKR.DÓŁ(B4+(B4*C9);0)

gdzie:

B4 – wartość z pierwszego (z poprzedniego) kwartału;
C9 – wartość procentowa wzrostu lub spadku produkcji samochodów;

Zadanie 4.1. (2 pkt)

Ile samochodów poszczególnych marek wyprodukowano w ostatnim kwartale 2011 roku?

Rozwiązanie:

Uzupełniamy tabelę wg lat, aż do roku 2012. Spisujemy wartości z ostatniego kwartału roku 2011. Wartości przepisujemy do pliku tekstowego.

Zadanie 4.2. (2 pkt) 

Zakładając, że spadek produkcji samochodów w następnych latach będzie wyglądał tak samo jak w roku 2011 i 2012, wskaż markę samochodu, którego kwartalna produkcja najwcześniej będzie mniejsza od produkcji tej marki z pierwszego kwartału 2005 roku. Podaj markę samochodu, liczbę wyprodukowanych samochodów oraz kwartał i rok, kiedy to nastąpi.

Rozwiązanie:

Do rozwiązania zastosowałem formatowanie warunkowe zmieniające kolor komórek z warunkiem mniejsze niż wartość komórki w pierwszym kwartale 2005 roku.

Zadanie 4.3. (2 pkt)

Podaj – dla każdej marki – w ilu kwartałach, w okresie od początku 2005 roku do końca 2012 roku, produkcja przekraczała 300 sztuk?

Rozwiązanie:

Należy utworzyć tabelę pomocniczą zawierająca nazwy modeli samochodów oraz dla każdej utworzyć formułę:

=LICZ.JEŻELI(B4:AG4;”>300″)

Zakres komórek jest podawany od początku roku 2005 do końca roku 2012. Powtórz tę instrukcję dla wszystkich aut.

Zadanie 4.4. (1 pkt)

Podaj, ile samochodów łącznie wyprodukowano w fabryce GAZELA do końca 2010 roku.

Rozwiązanie:

To zadanie jest bardzo nietypowe, należy wykorzystać funkcję

=SUMA(zakres)

Wynik działania funkcji na rysunku.

Zadanie 4.5. (3 pkt)

Utwórz wykres kolumnowy 3D prezentujący wielkość produkcji każdej marki samochodu w kolejnych latach od roku 2005 do roku 2012. Zadbaj o czytelność wykresu.

Rozwiązanie:

Utwórz nową tabelę z kolumnami sumującymi produkcję każdego auta w każdym kolejnym roku wg tabelki poniżej.

 

Matura 2013 (maj). Zadanie 5 – Znajomi i ich zainteresowania

Baltazar spisuje informacje o swoich znajomych i ich hobby, które przechowuje w plikach. W każdym pliku informacje zapisane w wierszach są rozdzielone pojedynczymi znakami odstępu.

Plik Osoby.txt zawiera 200 wierszy z informacjami o znajomych: Id_osoba, Imię, Nazwisko.
Przykład:
o001 Jan Nadolicki
o002 Anna Augustowska

Plik Hobby.txt zawiera 50 wierszy z informacjami o rodzajach hobby: Id_hobby, Hobby.
Przykład:
h001 numizmatyka
h002 historia

Plik Ma_Hobby.txt przechowuje w 400 wierszach informacje o tym, czym interesują się znajomi Baltazara: Id, Id_osoba, Id_hobby.
Przykład:
1 o152 h005
2 o065 h043

Wykorzystując dane zawarte w tych plikach oraz dostępne narzędzia informatyczne, wykonaj poniższe polecenia. Odpowiedzi zapisz w pliku zadanie5.txt, a odpowiedź do każdego podpunktu poprzedź literą oznaczającą ten podpunkt.

Narzędziem jakim się posłużymy będzie MS Access. W pierwszym kroku musimy pobrać dane z plików tekstowych do programu. Wykonujemy to realizując poniższe kroki:

Krok 1:
Pobieramy dane z pliku tekstowego wybierając Dane zewnętrzne → Plik tekstowy.

Krok 2:
Przechodzimy kreator Pobieranie danych zewnętrznych. Przykładowe pobieranie danych znajduje się poniżej.

Krok 3:
Tworzymy relację wg rysunku poniżej. Tak przygotowaną bazę możemy używać do rozwiązania zadań, do pobrania tu.

  1. Podaj wszystkie rodzaje hobby rozpoczynające się od litery „k”.

Rozwiązanie:
Wybieramy wstążkę tworzenie → projekt kwerendy. Wybieramy tabelę hobby i dodajemy do nowej kwerendy. Następnie dodajemy pole hobby z tabeli Hobby do kwerendy. Kryteria jakie musimy dodać to jest wpisanie like „k*” i ostatnim krokiem jest uruchom kwerendę.
Zapisujemy kwerendę jako A.
Wynik kwerendy należy skopiować do pliku tekstowego jako rozwiązanie.

  1. Podaj, ile osób interesuje się majsterkowaniem.

Rozwiązanie:
Wybieramy wstążkę tworzenie → projekt kwerendy. Wybieramy tabelę hobby, Ma_Hobby, Osoby, które mamy dodać do kwerendy. Z wybranych tabel dodajemy pola: Hobby z tabeli Hobby oraz Id_osoba z tabeli Osoby.
Zapisujemy kwerendę pod nazwą B. Wyniku działania kwerendy mam 7 rekordów, ale jeśli chcielibyśmy teraz policzyć nasze rekordy to jest ich 8, ponieważ jeden rekord się powtarza.
Tworzymy kwerendę B – wynik, aby policzyć ile jest rekordów wyświetlanych w kwerendzie B. Robimy to wybierając ikonę Sumy. Dodajemy pole ID_osoby z kwerendy B do nowej kwerendy i podsumowanie wybieramy Policz i dajemy uruchom. Na koniec zapisujemy zmiany w kwerendzie.

  1. Utwórz zestawienie imion i nazwisk tych osób, których zainteresowaniem jest programowanie. Zestawienie posortuj niemalejąco, alfabetycznie według nazwisk.

Rozwiązanie:
Wybieramy wstążkę tworzenie → projekt kwerendy. Do kwerendy dodajemy table: hobby, Ma_Hobby, Osoby. Z tabel dodajemy pola: Imię i nazwisko z tabli Osoby i Hobby z tabeli Hobby. W polu nazwisko ustawiamy sortuj na rosnąco. Odznaczamy Pole hobby, aby nie wyświetlało się w wynikach, zaś do tego pola dodajemy kryterium „programowanie”. Uruchamiamy kwerendę. Zapisujemy kwerendę, jako C.

  1. Utwórz zestawienie imion i nazwisk tych osób, które mają więcej niż 4 rodzaje hobby. Zestawienie posortuj niemalejąco, alfabetycznie według nazwisk, a tam, gdzie nazwiska się powtarzają – według imion.

Rozwiązanie:
Wybieramy wstążkę tworzenie → projekt kwerendy. Wybieramy pola imię i nazwisko z tabeli Osoby i pole Hobby z tabeli Hobby. Ustawiamy sortowanie Nazwisk i imion na rosnąco, Włączamy sumę, w hobby podsumowanie ustawiamy na policz, odznaczamy pokaż i kryteria ustawiamy na większe od 4. Zapisujemy kwerendę, jako D.

  1. Podaj wszystkie rodzaje hobby, którymi interesuje się największa liczba osób.

Rozwiązanie:
Wybieramy wstążkę tworzenie → projekt kwerendy. Wybieramy tabele: hobby, Ma_Hobby, Osoby. Dodajemy pola na Hobby oraz Id_osoba z tabeli Osoby. Odznaczamy pokaż dla pola Id_osoba oraz dodajemy Sortowanie ustawiając na malejąco. Włączamy Sumę, w podsumowaniu dajemy policz dla pola Id_osoba. Wartość zwróć ustawiamy na 5 i dajemy uruchom. Kwerendę zapisujemy, jako podpunkt E.

Uwaga:
Wszystkie wyniki kwerend zapisz w pliku tekstowym zadanie5.txt.

 

Gotowe rozwiązanie 

 

 

Matura 2012 (maj). Zadanie 2. Diamenty

Matura 2012 (maj). Zadanie 2. Diamenty

W sejfie jubilera znajduje się n diamentów wycenionych odpowiednio na d1, …, dn złotych, przy czym żadne dwa diamenty nie są w tej samej cenie. Jubiler nie ujawnia cen diamentów, co oznacza, że tylko on zna ceny d1, …, dn.
Dla zainteresowanych klientów jubiler wykonuje operację porównania cen diamentów: dla wskazanych numerów i oraz j podaje, czy diament o numerze i ma wyższą cenę, niż diament o numerze j.
Przyjmijmy następujący sposób oznaczania wyniku operacji porównania cen:
większe( i , j ) = prawda, gdy d1 > d
większe( i , j ) = fałsz, gdy d1 < d

  1. Poniżej prezentujemy pewien algorytm korzystający z operacji porównania cen:
 Krok 1. j ← 0
 Krok 2. i ← 1
 Krok 3. dopóki i < n
   jeżeli większe(i, i i + 1) to j ← j + 1
   i ← i + 1
 Krok 4. wypisz j

Uzupełnij poniższą tabelę, podając wyniki działania powyższego algorytmu po jego wykonaniu dla wskazanych danych.

n d1, …, dn Wynik algorytmu
4 5 2 1 6 2
4 2 5 1 2 1
4 1 2 3 4 0
4 4 3 2 1 3

Komentarz:
Musimy podać wartość zmiennej j. Zmienna j jest zwiększona o jeden pod warunkiem, że funkcja większe(i,j) zwróci prawdą (true). Prawda jest wtedy, kiedy element i tablicy jest większy od elementów i+1, czyli element sprawdzany jest większe od elementu następnego.

Algorytm

#include <iostream>
#define N 4
using namespace std;
int d[N] = {1,2,3,4};
bool wieksze(int i, int j) {
  if (d[i]>d[j]) return true;
  else return false;
}
int main()
{
  int j=0;
  int i=0;
  while (i<N-1) {
    if (wieksze(i,i+1)) j++;
    i++;
  }
  cout << j << endl;
  return 0;
}

 

  1. Zapisz algorytm (w postaci listy kroków, schematu blokowego lub w wybranym języku programowania), który dla podanego ciągu cen diamentów znajduje numer diamentu o najwyższej cenie. W algorytmie zastosuj operację większe porównania cen dwóch diamentów.

Specyfikacja:

Dane:

n – liczba naturalna większa od zera oznaczająca liczbę diamentów
d1, …, d– ceny diamentów o kolejnych numerach 1, 2, …, n; ceny dwóch różnych diamentów są różne

Wynik:

i – numer diamentu o najwyższej cenie

Algorytm:

#include <iostream>
#define N 4
using namespace std;
int d[N] = {2,5,1,2};
bool wieksze(int i, int maks) {
  if (d[i]>d[maks]) return true;
  else return false;
}
int main()
{
  int maks=0;
  int i=0;
  while (i<N-1) {
  if (wieksze(i,maks)) maks = i;
  i++;
 }
  cout << maks << endl;
  return 0;
}

 

Matura 2011 (maj). Zadanie 2. Potęgowanie

Matura 2011 (maj). Zadanie 2. Potęgowanie

Dana jest następująca specyfikacja oraz algorytm obliczania potęgi o wykładniku naturalnym:

Specyfikacja:

Dane: liczba rzeczywista a oraz liczba naturalna n, n ≠ 0

Wynik: liczba rzeczywista p = an = a * a * a * … * a (n razy)

Algorytm:

krok 1. p = 1 , b = a
krok 2. dopóki n > 0 wykonuj:

a) jeśli a mod 2 ≠ 0, to p = p * b
b) b = b * b
c) n = n div 2

Uwaga:
n div 2 oznacza wynik dzielenia całkowitego n przez 2, a n mod 2 oznacza resztę z dzielenia całkowitego n przez 2.

  1. Przeanalizuj podany algorytm i uzupełnij tabelę wartościami zmiennych p, b oraz n po kolejnych wykonaniach kroku 2 dla dowolnej początkowej wartości a oraz dla początkowej wartości zmiennej n równej 12.
   b   n 
 1  a  12
 1  a2 6
 1 a4 
 a4 a8 
a12  a16 

Opis:
Algorytm w języku c++:

#include <iostream>
using namespace std;
int main()
{
  double a;
  int n;
  cout << "Podaj a: ";
  cin >> a;
  cout << "Podaj n: ";
  cin >> n;
  double p=1, b=a;
  cout << " n = " << n << " b = " << b << " p = " << p << endl;
  while (n>0) {
     if (n%2!=0) p=p*b;
     b=b*b;
     n=n/2;
  cout << " n = " << n << " b = " << b << " p = " << p << endl;
 }
 return 0;
}

Komentarz:
Z algorytmu wynika, iż zmienna b jest podnoszona do kwadratu, czyli b=b*b daje nam: a, a2, a4, a8, a16, a32, itd. Pod b jest podstawiana wartość zmiennej a.
Pod zmienną n przypisywane jest dzielenie całkowite, tzn. dzielenie dwóch liczb całkowitych, gdzie wynikiem jest liczba całkowita.
n=12/2, n=6
n=6/2, n=3
n=3/2, n=1
n=1/2, n=0
Zmienna  p jest zwiększana, tylko wtedy gdy zmienna n jest nieparzysta oraz jest zwiększana tyle razy, ile ma wartość zmienna b w danym kroku.

  1. Uzupełnij poniższą tabelę, wpisując liczby wszystkich mnożeń, wykonywanych przez powyższy algorytm dla podanych wartości n, tzn. liczby wykonanych instrukcji p = p * b i b = b * b.
n liczba mnożeń
2 3
3
4
5
6
7

Opis:
Algorytm w języku c++:

#include <iostream>
using namespace std;
int main()
{
  double a;
  int n;
  cout << "Podaj a: ";
  cin >> a;
  cout << "Podaj n: ";
  cin >> n;
  cout << "n = " << n;
  double p=1, b=a;
  int ile=0;
  while (n>0) {
    if (n%2!=0) {
       p=p*b;
       ile++;
    }
  b=b*b;
  ile++;
  n=n/2;
  }
  cout << " Mnozen = " << ile << endl;
  return 0;
}

Komentarz:
W naszym algorytmie mnożeń, czyli instrukcja b=b*b wykonywana jest tyle ile razy pętla while, zaś instrukcja p=p*b jest wykonywana tyle ile razy instrukcja if.

  1. Podkreśl funkcję, której wartość jest równa liczbie mnożeń wykonywanych przez powyższy algorytm dla wartości n będącej potęgą dwójki:
    • ƒ(n) = 2 + log2n
    • ƒ(n) = 1 + n
    • ƒ(n) = 2n2 – 1
    • ƒ(n) = 2n

Opis:
rozwiązując funkcje dla n = 2, 3, 4, 5 ,6 daje nam:

ƒ(n) = 2 + log2n
ƒ(2) = 2 + log22 = 2 + 1 = 3
ƒ(4) = 2 + log24 = 2 + 2 = 4

ƒ(n) = 1 + n
ƒ(2) = 1 + 2 = 3
ƒ(3) = 4
ƒ(4) = 5
ƒ(5) = 6
ƒ(6) = 7

ƒ(n) = 2n2 – 1
ƒ(2) = 2 * 22 – 1 = 7
ƒ(3) = 17
ƒ(4) = 31
ƒ(5) = 49
ƒ(6) = 71

ƒ(n) = 2n
ƒ(2) = 22 = 4
ƒ(3) = 8
ƒ(4) = 16
ƒ(5) = 32
ƒ(6) = 64

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!