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
- 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; }
- 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, …, dn – 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; }