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;
}