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

Program do podawania i zgadywania liczb.

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 ?

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

2

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

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ć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1