Ahojky.Tady mám program na hadání čísel.Můžete se na to někdo mrknout jestli to mám podle tohoto zadání dobře.Díky.
Sestavte program, který vygeneruje náhodné celé číslo ze zvoleného rozsahu (1 .. N) a umožní uživateli hádat toto číslo. Po každém tipu uživatele, program napoví, zda hledané číslo je menší nebo větší než zvolená hodnota. Po uhodnutí čísla se kromě gratulace k úspěchu zobrazí i počet pokusů. Pokud uživatel zadá hodnotu nula, znamená to, že se vzdává. Po skončení hádání program nabídne další hru nebo ukončení.
VSTUP: N - horní hranice rozsahu čísel
tipy uživatele
VÝSTUP: nápovědy k hádání (je menší/větší)
gratulace a počet pokusů
Uses crt;
var cislo, hadane, n:Integer;
label znovu;
begin
TextColor(LightBlue);
Writeln('---- Program na hadani cisla ----');
TextColor(White);
znovu:
Writeln;
Writeln('Myslim si cislo od 1 do 100, uhodni ho:');
Writeln;
Randomize;
Cislo:=Random(100);
n:=1;
Write(n,'. pokus: ');
Read(hadane);
While hadane <> cislo do
begin
if hadane > cislo then writeln('Je mensi!')
else writeln('Je vetsi!');
n:=n+1;
Writeln;
Write(n,'. pokus: ');
Read(hadane);
if hadane = 0 then Halt(0);
end;
Writeln;
Write('Gratuluji, myslel jsem si cislo ',cislo,' a uhodnul si ho na ',n,'. pokus');
Writeln;
Writeln;
Write('Chcete hrat znovu? (A/N)');
if UpCase(ReadKey) = 'A' then goto znovu;
end.
Fórum › Pascal
Hadani
To Malirka :
Jsou tam 2 chyby- horni hranice se ma nacist ze zadani, tak na zacatek jeste nacist hranici a pak jeste vsude kde mas ted 100 to prepsat na promenou.
A ta druha je, ze random je od 0 do (parametr-1), tj random(5) vypise jedno z cisel 0,1,2,3,4 a protoze nulu nechces, musis to jeste o 1 zvednout tj cislo:=random(hranice)+1;
A mala drobnost: label a goto je fuj, fuj, fuj, za kazde pouziti ztrati 1 andel kridla.
To Krychlik : Tady jsem to upravila:
Uses crt;
var N,HADANE,CISLO,POKUSU: Integer;
C: Char;
begin
clrscr;
repeat
POKUSU:= 0;
N:= 0;
HADANE:= 0;
CISLO:= 0;
clrscr;
TextColor(LightBlue);
Writeln('---- Program na hadani cisla ----');
TextColor(White);
Writeln;
Writeln('Zadejte jaka bude horni hranice:');
Readln(N);
Randomize;
CISLO:= random(N);
While CISLO = 0 do CISLO:= Random(N);
Writeln;
Writeln('Hadejte cislo od 1 do ',N);
Readln(HADANE);
if (HADANE <> 0) and (HADANE <> CISLO) then begin
Repeat
POKUSU:= POKUSU + 1;
Writeln;
if HADANE > CISLO then writeln('Cislo je mensi!')
else writeln('Cislo je vetsi!');
Writeln;
readln(HADANE);
until (HADANE = CISLO) or (HADANE = 0);
Writeln;
if HADANE = 0 then writeln('Vzdal jste se')
else Writeln('Gratuluji uhadl/la jste cislo na ', POKUSU+1 ,'. pokus!!!!!!');
end
else begin
if HADANE = 0 then writeln('Vzdal jste se')
else if HADANE = CISLO then writeln('Gratuluji uhadl/la jste cislo na prvni pokus!');
end;
Writeln;
Writeln('Chcete pokracovat? A/N');
Read(C);
Until C<>'A';
Readln;
end.
Ja tu snad pisu pro srandu kralikum CISLO:= random(N) generuju nahodne cislo DO N ale bez N, je to nutne jeste o 1 zvetsit takze CISLO:= random(N+1); nebo CISLO:= random(N)+1; to druhe je o neco lepsi protoze tam uz nebude 0.
A proc je na zacatku POKUSU:= 0; a potom se pokoutne ve vysledku pricita 1? nebylo by lepsi zacinat od 1?
s tim random mas pravdu, nevedel sem jak to udelat a tak sem to tam resil tim cyklem. (jeste sem zkousel interval ale to nefungovalo :smile1: )
a s tim pokusu to je pravda kdyz sem to zacinal psat tak sem chtel pocitat s tim ze da hned prvni cislo 0 a aby to nepocitalo jako pokus ale pak sem to udelal jinak a zapomnel sem to upravit a ten konec je prasarna (Writeln('Gratuluji uhadl/la jste cislo na ', POKUSU+1 ,'. pokus!!!!!!'); ) pac uz sem to chtel dodelat tak aby to fungovalo.
Tady mám konečnou verzi programu,ale pan učitel mi napsal abych to upravila,ale nevím jak to udělat....
Tady co mi napsal učitel:
Program je funkční, ale oznamuje o jeden pokus více než ja skutečnost.
Také by šel vylepšit, aby se výpis Gratulace či informace o Vzdání se použil
v programu pouze jednou. Pokud by se nedařilo vyřešit, přijmu i tuto
variantu, protože jsi první.
A tady mám ten program:
Uses crt;
var N,HADANE,CISLO,POKUSU: Integer;
C: Char;
begin
clrscr;
repeat
POKUSU:= 1;
N:= 0;
HADANE:= 0;
CISLO:= 0;
clrscr;
TextColor(LightBlue);
Writeln('---- Program na hadani cisla ----');
TextColor(White);
Writeln;
Writeln('Zadejte jaka bude horni hranice:');
Readln(N);
Randomize;
CISLO:= random(N+1);
Writeln;
Writeln('Hadejte cislo od 1 do ',N);
Readln(HADANE);
if (HADANE <> 0) and (HADANE <> CISLO) then begin
Repeat
POKUSU:= POKUSU + 1;
Writeln;
if HADANE > CISLO then writeln('Cislo je mensi!')
else writeln('Cislo je vetsi!');
Writeln;
readln(HADANE);
until (HADANE = CISLO) or (HADANE = 0);
Writeln;
if HADANE = 0 then writeln('Vzdal jste se')
else Writeln('Gratuluji uhadl/la jste cislo na ', POKUSU+1 ,'. pokus!!!!!!');
end
else begin
if HADANE = 0 then writeln('Vzdal jste se')
else if HADANE = CISLO then writeln('Gratuluji uhadl/la jste cislo na prvni pokus!');
end;
Writeln;
Writeln('Chcete pokracovat? A/N');
Read(C);
Until C<>'A';
Readln;
end.
Nejjednodušší možnost: když napíšeš "víc", program k číslu přičte 1. Když "míň", odečte 1. Je to na dlouho, ale funguje to spolehlivě :-).
Pro praktické použití bych doporučil metodu půlení intervalu: tipneš číslo uprostřed možného rozsahu, při "víc" zahodíš celou levou půlku (tj. levou mez posuneš na to prostřední číslo), při "míň" zahodíš pravou (pravou mez posuneš na prostředek). Tím se ti možný rozsah zužuje tak dlouho, až se levá a pravá mez sejdou na jednom čísle a to je ten výsledek (případně se do něj náhodou trefíš dřív).
Moje stránka.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Program na "hádání" — založil jumbo
Hra na hadani cisla C++ — založil ondrej
Hádaní Čísel - problém s opakovaním — založil Tomáš
Hadani oblibeneho cisla a ochrana — založil Mortimer
Hádání čísel - smyčka proběhene 2x — založil Ryan99
Moderátoři diskuze