Stefan Sokołowski, Podstawy programowania
LABORATORIUM 3


W poniższym filmiku znajduje się wyjaśnienie natury pętli while:

Proszę go sobie obejrzeć w wolnej chwili, jeśli coś okaże się nie całkiem jasne. Slajdy demonstrowane na tym filmiku dostępne są tutaj; a w postaci do przeglądania lub drukowania — tutaj.


Zadanie 1:

Program prezentowany na powyższym filmiku
   
oblicza potęgę xn dla dowolnej liczby rzeczywistej x oraz dowolnej liczby naturalnej (czyli całkowitej nieujemnej) n. Proszę Wskazówka:   Oprócz pętli może być potrzebne zastosowanie komendy warunkowej if.

Uwaga dla zaawansowanych:   Proszę nie stosować funkcji z biblioteki matematycznej, tylko samodzielnie zaprogramować potęgowanie.


Zadanie 2:

Napisać i uruchomić program liczący silnię danej liczby naturalnej: Przetestować go dla liczb n między 0 a 12.

Sprawdzić, że  12!  kończy się dwoma zerami. Więc iloczyn również powinien kończyć się dwoma zerami. Sprawdzić, że program podaje inny (niepoprawny) wynik. Dlaczego?

Uwaga:   0! = 1.


Zadanie 3:

Każda liczba naturalna n daje się jednoznacznie przedstawić w postaci iloczynu liczby nieparzystej i potęgi liczby 2:
    n  =  p · 2q
(p — nieparzyste). Dla danej liczby n można znaleźć p i q takie jak wyżej przez jej wielokrotne dzielenie przez 2. Liczbę p otrzymamy, kiedy już dalej nie da się podzielić (pozostając wśród liczb naturalnych); liczba q będzie określać, ile razy dało się podzielić.

Napisać, uruchomić i przetestować program, który daną liczbę naturalną rozkłada tak, jak to jest wyjaśnione wyżej.
   1  =  1 · 20
2  =  1 · 21
3  =  3 · 20
4  =  1 · 22
5  =  5 · 20
6  =  3 · 21
7  =  7 · 20
8  =  1 · 23
9  =  9 · 20
10 =  5 · 21


Zadanie 4:

Napisać, uruchomić i przetestować program na znajdowanie największej liczby rzeczywistej z podanych. To znaczy program powinien
Wskazówka:   będzie potrzebne zagnieżdżenie komendy warunkowej if wewnątrz pętli while.

Uwaga dla zaawansowanych:   w tym zadaniu tablice nie są potrzebne i proszę ich nie stosować; program powinien w pętli wczytywać kolejną liczbę i od razu decydować, która z dotąd wczytanych liczb jest największa.


Zadanie 5:

Napisać, uruchomić i przetestować program liczący największy wspólny dzielnik dwóch danych liczb naturalnych n i k w poniżej opisany sposób:
  1. jeśli n=k, to   nwd(n,k) = n = k   i nie ma czego liczyć;
  2. jeśli n>k, to   nwd(n,k) = nwd(n−k, k) , więc w tym przypadku można zastąpić n przez n−k i liczyć dalej, aż te dwie liczby się zrównają, po czym zastosować punkt 1;
  3. jeśli n<k, to symetrycznie do punktu 2.
Na przykład Wskazówka:   będzie potrzebne zagnieżdżenie komendy warunkowej if wewnątrz pętli while.


Zadanie 6 domowe:

W zad.1 i zad.2 z lab.2 program miał zgadnąć liczbę; zakres liczb do dyspozycji był ,,na twardo'' ustalony dla całego programu. Ale stosując pętlę możemy napisać program zgadujący uniwersalnie; t.zn. taki, w którym wielkość zakresu będzie wczytywana; będzie więc mogła być różna dla każdego wykonania programu.

Program powinien więc
  1. poprosić użytkownika o podanie jakiejś liczby naturalnej n,
  2. poprosić o wybranie sobie (ale nie podawanie) jakiejś liczby   k∈{0,1,2,...,n−1} ,
  3. zadać nie więcej niż   ⌊log2 n⌋ + 1   pytań TAK/NIE (więc na przykład 20 pytań powinno wystarczyć dla zgadnięcia liczby wybranej z ponad miliona:   ⌊log2 1 000 000⌋ + 1 = 20 ),
  4. na podstawie odpowiedzi na te pytania odgadnąć i wyświetlić liczbę wybraną przez użytkownika.
Należy to zrobić binarnie — zapytać, czy wybrana liczba jest mniejsza od środka przedziału i na podstawie odpowiedzi ustalić, w której jego połowie ona się mieści; następnie pytać o środek tej połowy... itd., wg poniższego schematu:

Uwaga:   będzie potrzebne zagnieżdżenie komendy warunkowej if (zielonej na schemacie) wewnątrz komendy pętli while.


Do mojej głównej witrynki

Ostatnia modyfikacja: 9 października 2024