Program do podawania i zgadywania liczb.

Program do podawania i zgadywania liczb.

Wątek przeniesiony 2022-04-06 16:29 z Off-Topic przez cerrato.

ME
  • Rejestracja:około 3 lata
  • Ostatnio:około 3 lata
  • Postów:1
0

Cześć.
Mam do zaprogramowania taki program, gdzie komputer losuje liczbę, a ja muszę ją zgadnąć. Wyświetlają się podpowiedzi, czy liczba jest za duża, czy za mała.
I to zadanie zrobiłem, ale teraz mam je tak zmodyfikować, żeby to komputer i losował liczbę i ją zgadywał za mnie. Ma się sugerować tymi informacjami czy za duża, czy za mała.
Problem jest taki, że nie potrafię napisać kodu, aby komputer sam proponował liczbę i potem podawał kolejną jeżeli nie zgadł. U mnie to wygląda tak, że od razu podaje dobry wynik.

Czy jest ktoś w stanie napisać kod w funkcji zgadywanka ?

Kopiuj
#include <iostream> 
#include <cstdlib> 
#include <ctime> 
using namespace std ; 
int losowanie(int N){ 
int w; 
srand(time(0)); 
for (int i=0; i < 50; i++)
w = rand() % (N+1); 
return w;
}

void zgadywanka()
{ 
int N = 1000;
int liczba = losowanie(N); 
cout<<"zgadnij liczbę z przedziału 0 - "<<N<<endl;

}

int main ( ) { setlocale(LC_ALL,""); 
zgadywanka();

return 0;
}
edytowany 1x, ostatnio: cerrato
Althorion
Moderator C/C++
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 12 godzin
  • Postów:1607
1

Czy jest ktoś w stanie napisać kod w funkcji zgadywanka ?

Tak, ktoś z pewnością jest w stanie.

A w czym konkretnie tkwi Twój problem? Nie umiesz wymyślić, jak by to miało działać, czy nie umiesz tego zaprogramować? Dwa różne problemy, dwie różne odpowiedzi…

ME
Ehh, nie wiem jak powinien wyglądać kod. Próbowałem coś wymyślać, ale tylko doszedłem do tego, że komputer zgaduje jedną liczbę i nie próbuje dalej, lub podaje od razu poprawną liczbę, albo podaje mnóstwo różnych liczb i nie sugeruje się tym czy za duża czy za mała.
_13th_Dragon
Wygładzać ma ładnie. Algorytm podano niżej w postaci hasła do google oraz wytłumaczenia łopatologicznego. Czemu nie pokażesz co próbowałeś wymyślić, jak to zobaczymy natychmiast będziemy widzieć z czym masz problem.
SI
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 11 godzin
2

Poczytaj o wyszukiwaniu binarnym, to jest to czego potrzebujesz w tym zadaniu

Althorion
Moderator C/C++
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 12 godzin
  • Postów:1607
1

Ehh, nie wiem jak powinien wyglądać kod. Próbowałem coś wymyślać, ale tylko doszedłem do tego, że komputer zgaduje jedną liczbę i nie próbuje dalej, lub podaje od razu poprawną liczbę, albo podaje mnóstwo różnych liczb i nie sugeruje się tym czy za duża czy za mała.

Odpowiadaj w postach, nie w komentarzach.

No ale: jak już wiem, z czym masz problem, to można zacząć pomagać. Optymalnym (w sensie minimalizacji maksymalnej liczby zgadywań) rozwiązaniem tego problemu jest strzelanie zawsze w środek zakresu — w ten sposób, niezależnie od tego, jakiego pecha będziemy mieli, zawsze nam co najmniej połowa możliwości odpadnie.

Zatem: na początku wiesz tylko, że szukana liczba jest od zera do tysiąca. Szukasz połowy tego przedziału — (0 + 1000) / 2 == 500. Niech to będzie ten strzał. Jak trafi, to super; jak nie, to usłyszysz, że szukana wartość jest albo mniejsza, albo większa. Jeśli mniejsza, to teraz operujesz na przedziale od zera do czterystu dziewięćdziesięciu dziewięciu (bo tylko takie liczby są mniejsze od pięciuset, jak się dowiedziałeś). Więc znowu szukasz środka, tak samo — (0 + 499) / 2 == 249 (C++ przy dzieleniu liczb naturalnych zaokrągla w kierunku zera). A jakbyś się dowiedział, że jednak jest większa? To podobnie, ale zmieniła się Twoja wiedza na temat dolnego ograniczenia — liczba jest pomiędzy pięćset jeden, a tysiącem, a wtedy ten środek wypada w (501 + 1000) / 2 == 750. I tak dalej, i tak dalej.

Czy rozumiesz tę ideę? Czy potrafiłbyś ją zaimplementować? Jeśli nie, to z czym konkretnie masz problem? Im konkretniej wyrazisz swoje kłopoty, tym łatwiej Cię będzie nakierować.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.