Strona główna » Algorytmy » Artykuły » Zgadnij liczbę

Zgadnij liczbę

Cel

Napisz aplikację uruchamianą w konsoli Windows, która po uruchomieniu przyjmie dwie liczby całkowite, które będą zakresem z którego zostanie wylosowana liczba, a następnie program podając proste wskazówki pomoże nam zgadnąć liczbę. Po wpisaniu prawidłowej liczby należy wypisać komunikat o wpisaniu poprawnej odpowiedzi.

Strategia zgadywania

Wyobraźmy sobie listę liczb z zakresu [a, b]. Wylosowana liczba znajduje się na tej liście na pewnej pozycji. Najszybszym sposobem będzie określenie w której części listy szukać. Tutaj warto zastosować schemat Wyszukiwania Binarnego, ponieważ w każdym kroku będziemy odrzucać połowę pozostałych liczb na liście. Istnieje też szansa na trafienie liczby podczas zwężania zakresu.

Implementacja

Założenia

Do programu zostaną dołączone biblioteki ctime oraz cstdlib, które pozwolą na skorzystanie z funkcji rand(), która będzie generowała pseudolosowe liczby na podstawie czasu systemu.

Rozwiązanie

C++
C#
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. using namespace std;
  5. int main() {
  6.   setlocale(LC_ALL, "");
  7.   int a, b, r, g;
  8.   cout << "Podaj zakres:" << endl;
  9.   cin >> a >> b;
  10.   srand(time(NULL));
  11.   r = (rand() % (b - a)) + a;
  12.   cout << "Zgadnij liczbę" << endl;
  13.   do {
  14.     cin >> g;
  15.     if (r != g)
  16.       cout << ((r < g) ? "za duża" : "za mała") << endl;
  17.   } while (r != g);
  18.   cout << "Brawo zgadłeś liczbę!" << endl;
  19.   system("PAUSE");
  20.   return 0;
  21. }

(8.) Na początek ustalamy kodowanie znaków w konsoli, dzięki temu polskie znaki nie będą pojawiały się w postaci znaczków. Następnie (9.) deklarujemy zmienne, które oznaczają kolejno: a - dolna granica zakresu, b - górna granica zakresu, g - ostatnie wpisane rozwiązanie i r oznaczające liczbę, którą użytkownik ma zgadnąć.

Po (11.) wprowadzeniu zmiennych (12.) uruchamia generator liczb losowych w zależności od czasu, a następnie (13.) losujemy liczbę do zgadnięcia. Należy pamiętać, że funkcja rand() zwróci wartości od 0 do RAND_MAX. W celu nie przekroczenia zakresu należy najpierw wyciągnąć modulo z dzielenia wylosowanej liczby przez różnice górnej granicy zakresu i dolnego. W ten sposób uzyskujemy liczbę z zakresu [0, b - a]. Teraz wystarczy dodać a, żeby mieć zakres [a, b].

Zasadnicze działanie ma (15.) pętla do ... while. To właśnie w niej odbywa się (16.) wczytanie kolejnej wpisanej odpowiedzi i o ile liczba (17.) nie została odgadnięta (18.) wypisany komunikat czy odpowiedź jest większa czy mniejsza. (19.) Pętla jest przerywana kiedy wpisana odpowiedź jest zgodna z wylosowaną wcześniej liczbą. Na sam koniec (20.) wypisujemy stosowny komunikat.