PDA

Просмотр полной версии : Спаситеее. Генератор случайных чисел



Небо Принстона
23.03.2007, 12:29
Спасите девушку от двойки. Напишите пожалуйста программу:
Запрограммировать игру «Угадай число». Программа с помощью генератора случайных чисел выбирает целое число в диапазоне от 0 до 9. Угадать это число за три попытки. После каждой попытки сообщается больше или меньше названное число задуманного.
:)

Хыиуду
23.03.2007, 12:48
Какой язык хотя бы?
Допустим, Паскаль ;)


uses crt;
var x,count,i:byte;
begin
randomize;
x:=random(10);
for count:=1 to 3 do
begin
writeln('Введите число');
readln(i);
if i>x then writeln('Ваше число больше')
else if i<x then writeln('Ваше число меньше')
else begin writeln('Вы угадали!'); break;end;
end;
if count>3 then writeln('Вы проиграли!') else writeln('Вы выиграли!');
readln;
end.

somewhere
23.03.2007, 14:05
if count>3
Хыиуду, вроде опытный программист, а такие нелепые ошибки. Нет Begin к тому-же в цикле For.


uses crt;
var x,count,i:byte;
begin
randomize;
x:=random(10);
count:=1;
repeat
writeln('Введите число');
readln(i);
if i>x then writeln('Ваше число больше')
else if i<x then writeln('Ваше число меньше');
inc(count);
until (i=x) or (count>3);
if i<>x then writeln('Вы проиграли!') else writeln('Вы выиграли!');
readln;
end.

Колядин Максим
23.03.2007, 21:16
Хыиуду, вроде опытный программист, а такие нелепые ошибки.
Никто не застрахован от ошибок, даже такой опытный программист, как Хыиуду. Но бывают такие неблагоприятные деньки, когда голова совсем "не в ту степь" думает-);
Поскольку задача для начинающих, то пишу очередной вариант с пояснением:


uses crt;
var c,x,attempt: integer;{с-введённое число; x-загаданное; attempt - кол-во попыток}
begin {начать}
clrscr;
randomize; {инициализируем генератор случайных чисел}
x:=random(10); {загаданное число от 0 до 9}
attempt:=1; {первая попытка}
repeat {повторяем...}
writeln('Попытка №',attempt);
write('Введите число: '); readln(c); {вводим число}
if (c>9) or (c<0) then begin
writeln('Будь внимательнее!'); {контролируем выход за пределы интервала}
continue
end;
if c>x then writeln('Перебор!') else if c<x then writeln('Слишком мало...');
{если введенное число больше загаданного, написать "Перебор", иначе, "Слишком мало..."}
inc(attempt); {увеличиваем число использованных попыток}
until (c=x) or (attempt>3); {завершаем цикл, если загаданное число равно введённому, или если использовано больше трёх попыток}
If c=x then write('Поздравляем! Вы угадали число с ',attempt,' попытки!')
else
write('Вы проиграли...');
{если загаданное число равно введённому, тогда написать "Поздравляем...", иначе, "Вы проиграли..."}
readkey; {пауза}
end.

Небо Принстона
24.03.2007, 12:41
Спасибо большое. только два я видимо получу. они требуют написать все через процедуру и функцию.:(

Колядин Максим
24.03.2007, 19:17
Спасибо большое. только два я видимо получу. они требуют написать все через процедуру и функцию.
Эта проблема легкорешаема:


uses crt;
var c,x,attempt: integer;
win,loose: boolean;

procedure config;
begin
clrscr;
randomize;
x:=random(10);
attempt:=1;
end;

procedure enter_ch;
begin
writeln('Попытка №',attempt);
write('Введите число: '); readln(c);
end;

function control: integer;
begin
if (c>9) or (c<0) then begin
writeln('Будь внимательнее!');
end;
if c>x then writeln('Перебор!') else if c<x then writeln('Слишком мало...');
inc(attempt);
end;

function congratulate:boolean;
begin
If win then write('Поздравляем! Вы угадали число с ',attempt-1,' попытки!')
else
write('Вы проиграли...');
readkey;
end;
{НАЧАЛО ПРОГРАММЫ}
begin
config;
while (not win) and (not loose) do begin
enter_ch;
control;
if c=x then win:=true;
if attempt>3 then loose:=true;
end;
congratulate;
end.

Сама сказала с процедурами и функциями, хотя они здесь не очень нужны...

Хыиуду
26.03.2007, 10:47
А в чем ошибка? Это как раз из серии "левые штучки". Если выход из цикла будет естественным путем, а не через break, значение count будет равно 4. Можно проверить.
А насчет Begin согласен - мой косяк. Это уже начинаются заглюки с Python, где нету бегинов и эндов, а операторные скобки делаются путем добавления пробелов в начале строки.

somewhere
26.03.2007, 11:30
А в чем ошибка? Это как раз из серии "левые штучки". Если выход из цикла будет естественным путем, а не через break, значение count будет равно 4. Можно проверить.
Вот это уже точно "левые" штучки. Видно ты с чем-то путаешь


var i:byte;
begin
for i:=1 to 3 do
writeln(i);
Writeln(i);
end.

Results


1
2
3
3

Хыиуду
26.03.2007, 12:10
У меня ровно с тем же кодом (только выводил через Memo1.Lines.Add() ) получилось
1
2
3
4
Дельфи 7.0

somewhere
26.03.2007, 13:52
На Дельфи - согласен, но вот (uses crt;) в проге, говорит о Паскале - а там немного по-другому.

Хыиуду
26.03.2007, 14:10
Странно, неужели они логику одного из фундаментальных операторов поменяли?

BBB
27.03.2007, 09:55
Странно, неужели они логику одного из фундаментальных операторов поменяли?Что-то припоминается мне из теории Паскаля, что про счетчик цикла for по выходе из цикла говорится, что его значение никак не гарантировано. Т.е. при программировании не следует делать никаких допущений о значении этой переменной.

Хыиуду
27.03.2007, 10:06
Мне припоминалось, что при выходе из цикла for значение индекса равно последнему значению плюс один. Потому что цикл, если не ошибаюсь, ассемблерно реализован примерно так (в переводе опять же на Паскаль):


i:=startvalue-1;
lab1: i:=i+1;
if i>endvalue then goto lab2;
{выполнение команд цикла}
goto lab1;
lab2: {идти дальше по программе}

BBB
27.03.2007, 10:18
Мне припоминалось, что при выходе из цикла for значение индекса равно последнему значению плюс один. Потому что цикл, если не ошибаюсь, ассемблерно реализован примерно так (в переводе опять же на Паскаль):


i:=startvalue-1;
lab1: i:=i+1;
if i>endvalue then goto lab2;
{выполнение команд цикла}
goto lab1;
lab2: {идти дальше по программе}
Снова. Насколько я помню, это (значение счетчика цикла по его выходу) никем не гаратировано. То, что в какой-то реализации какого-то языка получается такой результат, не гарантирует, что вдругой реализации даже этого де языка результат будет такой же. Пожалуй, это можно назвать "недокументированной особенностью". А, как известно, полагаться на недокументированные штучки - это риск.

Хыиуду
27.03.2007, 10:49
А я и говорю, левые штучки. Впрочем, у меня на ТурбоПаскале 7.0, сколько себя помню, так и было.

Небо Принстона
06.04.2007, 11:58
Большое человеческое спасибо. Наверное минут за пять программу написали, но все равно - помощь неоценима. Добавила там еще счетчик, а то количество попыток неправильно выдавал:)