Вопрос: Как в программе реализовать случайный ответ на вопрос?

Занятие №7  «Функция random. Команда выбора case of»

Ключевые слова:  генерация случайных чисел, random, randomize, функция выбора case of

Вопросы для повторения
Найдите ошибки в  программе x:=8; if x>9 and x<20 then y:=2*x+1; x:=x-10; else y:=24-x*10; x:=x*2-8;
Что получится в результате выполнения программы?   x:=12; y:=5; if x>0 then begin if x>10    then y:=x    else y:=-x; end; else y:=2*x+1;     x:=8; if x>9 then y:=2*x+1 else y:=24-x*10    

Давайте подумаем с Вами, всегда ли человек одинаково отвечает на вопрос-приветствие? Правильно, собеседник не всегда сможет отвечать одинаково. Один и тот же человек никогда на один и тот же вопрос не ответит одинаково. Например, когда ему сказали «Привет», он может ответить «Привет», а в другой раз «Здравствуйте». А наша программа отвечает всегда одинаково. И получается, что разговор происходит между программой и человеком. А наша цель, создать такую программу, чтобы она отвечала так, как человек отвечал бы другому человеку, выбирая свой ответ случайным образом.

Вопрос: Как в программе реализовать случайный ответ на вопрос?

Цель:

· Составить программу, которая на вопрос о приветствии выводила разные ответы при каждом новом исполнении программы;

Для случайного выбора ответа в Паскале придуман генератор случайных чисел - оператор random.

Функция random генерирует случайное число в диапазоне от 0 (включительно) до единицы. Значит функция random вернет действительное число.

В Pascal для действительных или вещественных чисел существует тип данных real [i].

Так называемые случайные числа в среде программирования на самом деле псевдослучайные. Формируется последовательность псевдослучайных чисел, и числа из нее берутся по порядку. Поэтому при каждом запуске программы мы получим одни и те же числа. Чтобы этого избежать, используется оператор randomize.

Randomize вводится в промежутке после begin и до random (обычно оператор randomize ставят сразу после begin, так как это упрощает чтение кода).

Затем идет присвоение оператора random к выбранной переменной.

оператор:=random;

 Давайте посмотрим, как это будет выглядеть на языке Pascal.

var x:real;
begin
randomize;
x:=random;

write(x:5:2, ‘ ’);
end;

 

В скобках у write указан формат вывода данных. Что это значит?

x:m:n, где x - выводимое данное действительного типа, m - общее поле выводимого числа (включая знак числа, целую часть, точку и дробную часть), n - поле дробной части.

 

В примере Write(x:5:2) всего знаков будет 5, включая целую и дробную части и запятую, а после запятой будет выведено 2 знака.

 

Если указать формат вывода следующий write(x:5:3), то после запятой будет 3 знака.

Часто необходимо генерировать числа в некотором диапазоне чисел, например, от 0 до 2 или от 0 до 20.

Как указать диапазон генерации случайных чисел?

 

 При генерации случайных чисел от 0 до n, оператор random умножают на n.

Пример:

х:=random*n;

Пример, сгенерировать числа в диапазоне от 0 до 10:

х:=random*10;

 

Попробуйте написать программу, которая выводит случайные числа из диапазона от 0 до 10 и исполнить ее. Посмотрите, что будет получаться при исполнении программы.

 

Генерировать можно и целые числа, например, числа из диапазона от 2 до 10,  запись генерации будет выглядеть следующим образом.

х:= random (max-min+1)+min;

- min - целое число, не превышающее max;
- max - целое число, большее min;
Здесь min и max являются диапазонами генератора случайных чисел.

Пример, сгенерировать числа из диапазона от 2 до 10

х:= random (10-2+1)+2; или х:= random (9)+2;

       Функция random, вызванная с целочисленным параметром N, возвращает беззнаковые целые величины (тип данных integer) из интервала [0,N-1].

       Как вы уже поняли, генерируются числа, а нам нужно случайным образом выдавать строку. Решить это проблему можно, необходимо прописать условие принадлежности числа промежутку, например если случайное число принадлежит промежутку от 1 до 2, то на экран выводится фраза s1=’Привет’, а если число принадлежит промежутку от 2 до 3, то выводится s2=’Добрый день’ и т.д.

Давайте попробуем составить такую программу.

Посмотрите на код программы и скажите, нравится ли Вам такая форма записи?

Можно ли как то сократить эту запись?

 

Да можно, есть еще один оператор выбора case of.

Синтаксис оператора выбора case of имеет следующий вид.

Case <анализируемая переменная> of

<Значение 1>:<Действие 1>;

<Значение 2>:<Действие 2>;

<Значение 3>:<Действие 3>;

<Значение N>:<Действие N>;

Else <Действие N + 1>

end;

Пример.

var otmetka: integer;

begin

writeln ('Какую отметку ты получил по информатике?');

readln (otmetka);

case otmetka of

1,2:writeln('Кошмар!');

3: writeln ('Неважно');

4: writeln ('Неплохо');

5: writeln ('Молодец!');

else writeln ('Таких отметок не бывает');

end;

end.

 

Замечу, что у оператора case of есть существенное ограничение — переменная, стоящая после слова case, в примере выше это переменная otmetka, должна быть порядкового типа (integer). А значения типов real и string применять в операторе case нельзя.

Как вещественный тип преобразовать в целый тип?

 

    Для этого существуют операции округления trunc() и round(). В скобках указывается переменная, которую необходимо округлить.

Отличие trunc() от round() следующее, функция trunc() при округлении отбрасывает дробную часть и выводит только целое число. Функция round() округляет по математическим правилам.

Например, если взять trunc(3.67) то ответ будет 3, а если
 round(3.67), то ответ будет 4.
А также trunc(3.25) и round(3.25) то и в том и другом случае будет ответ 3.

 

В операторе case of вместо анализируемой переменной может находиться какое-нибудь выражение.

 Например, case a*a+1 of

Кроме того, конструкция <Значение 1>:<Действие 1>; может выглядеть следующим образом. 12.. 18. Она обозначает то же, что и 12,13,14,15,16,17,18. Служит в нашем случае для сокращения записи и называется диапазоном.

Пример.

var age:integer;

begin

 

writeln ('Введи свой возраст');

readln (age);

case otmetka of

1..6:writeln('Дошкольник');

7..18: writeln ('Школьник');

19..65: writeln ('Рабочий');

66..120: writeln ('Пенсионет');

else writeln ('Такого возраста нет');

end;

end.

 

Давайте попробуем написать с вами такую процедуру. Мы поздороваемся с программой и она нам случайно выведет «здравствуй» или «привет». Если случайное число больше 1, то выводи «здравствуйте», а иначе «привет». При этом входным аргументом в процедуре будет строка-приветсвие, а выходным строка-ответ. 

 

Дополните данной процедурой основную программу с прошлых занятий.

Ответы на вопросы
Найдите ошибки во фрагменте  программе x:=8; if (x>9) and (x<20) then begin y:=2*x+1; x:=x-10;end else begin y:=24-x*10; x:=x*2-8; end;
Что получится в результате выполнения программы?   x:=12; y:=5; if x>0 then begin if x>10    then y:=x    else y:=-x; end; else y:=2*x+1; y=12   x:=8; if x>9 then y:=2*x+1 else y:=24-x*10 y=-56  

 

 

Спасибо за внимание!

 


[i] REAL – вещественные числа в диапазоне от 2.9´10-39 (2.9E-39) до 1.7´1038 (1.7E38), занимают шесть байт; любые числа, то есть может быть и 1,4: -5; 29,3.. могут быть отрицательными и могут содержать дробную часть











Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: