14 FreeBASIC - тасуем карты (массивы-задачи ч2)
Как перемешать карты в колоде? Для начала возьмем массив на 36 элементов - k(36), а карты это цифры от 1 до 36, и заполним массив случайны.. стоп, случайные числа же могут повторяться. Тогда заполняя массив будем искать есть ли уже такое число в массиве и если есть - заполним случайным числом этот элемент ещё раз, и опять проверим, и т.д.
Заполняем массив k случайными числами от 1 до 36
'for i=1 to 36'
' k(i)=int(rnd()*36+1)'
но нужно же проверить, а вдруг такое значение в массиве уже есть
'for i=1 to 36'
' k(i)=int(rnd()*36+1)'
' for j=1 to 36'
' if k(i)=k(j) and i<>j then flag=1'
' next j'
для просмотра мы открыли ещё один цикл(переменная этого цикла j) и проверяем - если текущий элемент k(i) будет равен хоть какому-то элементу массива (кроме самого себя - i<>j), то надо этот случай как то отметить - установим значение переменой flag в 1
и будем выбирать этому текущему элементу значение до тех пор пока будем находить в массиве рвное ему значение(т.е. пока flag=1) Ну а до такого поиска с проверкой будем считать что такого элемента в массиве ещё нет, ведь если есть мы же его найдём, поэтому установим в начале цикла flag=0
for i=1 to 36
do
flag=0
k(i)=int(rnd()*36+1)
for j=1 to 36
if k(i)=k(j) and i<>j then flag=1
next j
loop while flag=1
next i
Получилась такая вот программа
при решении этой задачи использовалась переменая-флаг(flag) Этот вид переменных часто используются в программах. Такое название они получили по аналогии с обычными флагами - флаг бывает поднят, бывает спущен, евличие или отсутствие флага сигнализирут произошло или нет некое событие, проанализировать которое нужно в другом месте программы. Такие переменные ещё называют логическими, и даже в некоторых языках программирования их выделяют в особый тип данных - логический. И часто такая переменная может принимать только два значения - 0 или 1.
Но я примоминаю что решал подобную задачу другим способом, попробую это выудить из памяти
dim as integer i, j
dim k(36) as integer
randomize timer
for i=1 to 36
do
t=int(rnd()*36+1)
loop while k(t)<>0
k(t)=i
next i
for i=1 to 36
print k(i);
next i
sleep
Здесь иной подход к заполнению массива. Я заполняю его числами подряд, беру значения, 1,2,3,4...36, но сам массив заполняю в случайном порядке. Например первое случайное число выпало 17 - значит 1 я заношу в 17 эелемент массива, потом беру второе случайное число, пусть будет 23, и в 23й элемент заношу 2, и т.д. Но перед занесением убеждаюсь что туда ещё ничего не заносили - должен быть ноль. Т.е я выбрал случайно индекс для элемента массива и пока ему соответствующий элемент массива содержит не ноль, я перевыбираю индекс на другой.
do
t=int(rnd()*36+1)
loop while k(t)<>0
цикл прервётся если в k(t) встретится ноль, тогда можно туда занести следующий по порядку номер
'k(t)=i'
Этот вариант мне понравился больше, он более краток))) А краткость сестра таланта))) И обошлись без переменной flag
А как ещё можно решить эту задачу?
PS "тасуем карты" здесь подразумевается конечный результат - получить в итоге перемешанные карты в колоде, а не процесс))
13 FreeBASIC - массивы(задачи)
12 FreeBASIC - массивы
11 FreeBASIC - задачки
10 FreeBASIC - Игра угадай число
09 FreeBASIC - случайные числа, RND
08 FreeBASIC - случайные числа, RND
07 FreeBASIC - циклы
06 FreeBASIC - условный оператор
05 FreeBASIC - первые простые задачки
04 FreeBasic - графика
03 FreeBASIC. Текстовые переменные и операции с ними
02 FreeBASIC Переменные в Бейсике
01 Начинаем изучать FreeBasic
00 FreeBASIC лучший из диалектов бейсика