14 FreeBASIC - тасуем карты (массивы-задачи ч2)

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 лучший из диалектов бейсика

Авторы получают вознаграждение, когда пользователи голосуют за их посты.
Голосующие читатели также получают вознаграждение за свой голос.
Порядок сортировки:  Популярное
32
  ·  2 месяца назад

Сюда приплывал Моби Дик

72
  ·  2 месяца назад

Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
cats, spinner, littleboo, t3ran13, aim, ianboil, analise, francisgrey, mishka, sergiy, vako, gildar, andrvik, max-max, kanenakat, oleg257, zoss, midnight, dimarss, tristamoff, kilobucks, ohlamoon, shuler, maksina, zlody, dr-boo, arsar, volv, nefer, turkish-r, renat242, markvial, vict0r, gryph0n, voltash, ladynazgool, karusel1, sharps, cepera, francesco, maxiandr, exan, retoldname, stranniksenya, alikssandra, gapel, galerina, acidgarry, oagalakova, borisss, candy777, optimist, yurchello, dayver, lushaya, bammbuss, dmitrijv, seagull15, graff0x, manavendra, mr-nikola, ondantr, nerengot, vladsm, mirgais, varja, upper, prifix, mp42b, abloud, foxycat, ksantoprotein, process, chugoi, nikulinsb, shafarevich, d0z4t0r, tulencha, amalinavia, kito-boy, vsebudethorosho, nikitosuna, izbushka, astramar, propoker, cryptovisitor, zelivsky, html, vredinka2345, carpe-diem, makcl, ivanzar, marina-spring, azarovskiy, funt33, samael27, kalter, maksh, mister-omortson, nightinga1e, siddxa, cryptobandera, doublingseason, necrogenesis, photofreediver, maryatekun, lologom, anykeycheg, prezza, akva22, elcpa, karabum, sevaev, dobrotanya, boliwar, veta-less, irkinmick, svetozarhobbot, archual, automedia, alexxela, burger-knig, cryptenthusiast
Поэтому я тоже проголосовал за него!


dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:

47
  ·  2 месяца назад

Предлогаю обменяться просмотрами и подписками) хорошая статья! взаимно лайкну каждого кто откоментит мой последний пост)

@sergiy, Поздравляю!
Ваш пост был упомянут в моем хит-параде в следующей категории:

  • Голосов - 9 позицию - 786 Голосов