Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 for  [new]
SDF
Member

Откуда:
Сообщений: 149
Хочу исползувать этот код. Но, мне надо что каждая цифра (1,2,...10) в таблице участвовала одиноковый раз. Как иожно это сделать?
Помогите пожалуста.

К сообщению приложен файл (11.prg - 403bytes) cкачать
15 май 06, 11:14    [2663342]     Ответить | Цитировать Сообщить модератору
 Re: for  [new]
SDF
Member

Откуда:
Сообщений: 149
Т.е. наоборот, неодинаковый раз.
Сейчас, каждая цифра встречается 296010 раз, но мне надо что это было разные.
15 май 06, 15:09    [2665123]     Ответить | Цитировать Сообщить модератору
 Re: for  [new]
SDF
Member

Откуда:
Сообщений: 149
Извените, каждая цифра встречается 84 раз.
15 май 06, 15:12    [2665147]     Ответить | Цитировать Сообщить модератору
 Re: for  [new]
alex11100
Guest
Юстас Алексу
15 май 06, 16:31    [2665753]     Ответить | Цитировать Сообщить модератору
 Re: for  [new]
SDF
Member

Откуда:
Сообщений: 149
??
18 май 06, 16:53    [2680238]     Ответить | Цитировать Сообщить модератору
 Re: for  [new]
DIMM@
Member

Откуда: Витебск
Сообщений: 136
Напиши нормально и ясно что ты хочешь!!! Файл твой скачал посмотрел .. ну и что надо сделать? Если упираться в твоё слово "разные" то используй не For а RAND() и будет тебе счастье). Короче опиши толком задачу
18 май 06, 17:15    [2680383]     Ответить | Цитировать Сообщить модератору
 Re: for  [new]
SDF
Member

Откуда:
Сообщений: 149
Да, мне надо именно rand(), но как я незнаю. Потому что если rand() исползувать, можно получится что 1 цифр 1 раз участвовать в таблице, другой 100 раз больше, 3-й воопщи не участвовать. А мне надо что все цифры прибилизительно одинокывый раз участвовалась. Количество етих цифр не очеть отличалис друг от друга.
18 май 06, 17:28    [2680490]     Ответить | Цитировать Сообщить модератору
 Re: for  [new]
DIMM@
Member

Откуда: Витебск
Сообщений: 136
Не очень отличались это как? К чему вообще такой алгоритм? Можешь объяснить задание полностью? Вот например как вариант:

=RAND(-1)

CREATE TABLE bigTable (a1 N(2,0), a2 N(2,0),;
a3 N(2,0), a4 N(2,0), a5 N(2,0), a6 N(2,0), a7 N(2,0))

DECLARE x(10)

FOR i=1 TO 100
FOR j=1 TO 7
x[j]=INT(RAND()*10)
ENDFOR
INSERT INTO bigTable (A1, a2, a3, a4, a5,A6,A7);
VALUES (x[1], x[2], x[3], x[4], x[5],X[6],X[7])
ENDFOR
BROWSE
Можешь в VALUE сразу вместо эл-ов массива написать INT(RAND()*10), но так вроде понятнее. Если не то , то поробуй еще раз ясно описать задачу...
19 май 06, 09:29    [2682342]     Ответить | Цитировать Сообщить модератору
 Re: for  [new]
SDF
Member

Откуда:
Сообщений: 149
Мне надо, чтобы в одном записе не повторялись цифры и цифры только из 1-го до 10. У Вас 0 тоже встречается.
Вообщи то мой вариант меня устраеваеть, только 1 НО:
Здесь каждая цифры встречается одиноковый (84) раз,Мне надо в эта программы добавить такой алгоритм что, допустим если, 1 встречается Z раз,
тогда,
2 -z+2
3- z+4
...
6-z+5
...
10-z+3

встречается.
Т.Е. каждая цифра сколько раз будет встречатся я сям мог ругулировать.

P.S. Алгоритм для лоторея
19 май 06, 11:29    [2683128]     Ответить | Цитировать Сообщить модератору
 Re: for  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Да задай счетчик в самом начале (например, массив) и в момент присвоения уменьшай значение счетчика. Выбор через RAND() только среди тех значений, которые доступны.

* Номер элемента - цифра. От 1 до 9
* Значение - сколько осталось не использованных вариантов
DIMENSION laRemains(9)
laRemains[1] = 84
laRemains[2] = 85
laRemains[3] = 86
laRemains[4] = 87
laRemains[5] = 88
laRemains[6] = 89
laRemains[7] = 90
laRemains[8] = 91
laRemains[9] = 92

* Строка, содержащая список доступных цифр
LOCAL lcAvailable
lcAvailable = "132456789"

* Итоговая таблица
CREATE TABLE bigTable (a1 N(2,0), ;
		a2 N(2,0), ;
		a3 N(2,0), ;
		a4 N(2,0), ;
		a5 N(2,0), ;
		a6 N(2,0), ;
		a7 N(2,0))

* Заполнение таблицы, пока доступно не менее 7 разных цифр
* Предполагаю, что в одной записи не должно быть повторяющихся значений
RAND(-1)
LOCAL lcAvailableOneLine, lnI, lnNextPos, lnNextValue
DO WHILE LEN(m.lcAvailable) >= 7
	lcAvailableOneLine = m.lcAvailable
	SELECT bigTable
	APPEND BLANK
	FOR m.lnI = 1 TO 7
		* Вычисляю очередное значение
		lnNextPos = ROUND(RAND()*LEN(m.lcAvailableOneLine),0)
		IF m.lnNextPos = 0
			lnNextPos = 1
		ENDIF
		lnNextValue = INT(VAL(SubStr(m.lcAvailableOneLine,m.lnNextPos,1)))

		* Записываю найденное значение
		REPLACE ("a"+TransForm(m.lnI)) WITH m.lnNextValue

		* Корректирую данные
		m.lcAvailableOneLine = STUFF(m.lcAvailableOneLine,m.lnNextPos,1,"")
		laRemains[m.lnNextValue] = laRemains[m.lnNextValue] - 1
		IF laRemains[m.lnNextValue] = 0
			m.lcAvailable = ChrTran(m.lcAvailable,TranForm(m.lnNextValue),"")
		ENDIF
	ENDFOR
ENDDO

Если могут быть двух-значные значения, например, число 10, то можно оперировать буквами, являющимися ASCII-кодом нужного числа, делая замену на цифру в момент записи в таблицу.

lcAvailable = CHR(1)+CHR(2)+CHR(3)+CHR(4)+CHR(5)+...
...
REPLACE ("a"+TransForm(m.lnI)) WITH ASC(m.lnNextValue)

Или же использовать символы и дополнительный массив - перекодировщик

DIMENSION laValue(10)
laValue[1] = "a"
laValue[2] = "b"
laValue[3] = "c"
...

Выбор происходит среди символов, а через ASCAN() получаем индекс массива, которое и является нужным числом для записи.

Можно вместо массива использовать курсор.
19 май 06, 12:14    [2683502]     Ответить | Цитировать Сообщить модератору
 Re: for  [new]
SDF
Member

Откуда:
Сообщений: 149
TranForm что за команда, у меня foxpro 6 и ошибка получается
19 май 06, 14:55    [2684711]     Ответить | Цитировать Сообщить модератору
 Re: for  [new]
DIMM@
Member

Откуда: Витебск
Сообщений: 136
Вот блин.. опечатка это просто ...исправь на TransForm
19 май 06, 15:05    [2684795]     Ответить | Цитировать Сообщить модератору
 Re: for  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Опечатка.

TRANSFORM() - преобразование данных в символьное представление определенного формата. В данном случае - без ведущих пробелов.
19 май 06, 15:08    [2684809]     Ответить | Цитировать Сообщить модератору
 Re: for  [new]
SDF
Member

Откуда:
Сообщений: 149
Да,помоему именно это мне нужна.
Но, остоется еще 2 вопроса:
1. Насчет двух-значные значения ( например, число 10) я не понял что делать?
2.Здесь помоему не проверяется (да и я не сказал об этом ранше) повторяющие записи. Напирмер,
1 4 5 6 3 8 9
1 4 5 6 3 8 9
не должна быть.
19 май 06, 15:33    [2685026]     Ответить | Цитировать Сообщить модератору
 Re: for  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
SDF
1. Насчет двух-значные значения ( например, число 10) я не понял что делать?


Ты уже почти год занимаешся "лотерейными билетами" и все время наступаешь на одни и те же "грабли".

Для программирования вообще и FoxPro в частности

Отображение информации не равно хранению информации.

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

Я написал в коде

* Строка, содержащая список доступных цифр
LOCAL lcAvailable
lcAvailable = "132456789"
В данном случае, для наглядности, символы, из которых состоит строка совпадают с теми номерами, которые собственно и записываются. Т.е. если надо выбрать цифру 1, то ищем в переменной символ "1".

Но ведь это вовсе не обязательно. Вполне допустимо в качестве символьной строки написать

* Строка, содержащая список доступных цифр
LOCAL lcAvailable
lcAvailable = "абвгдежзи"

Кроме того, сформировать массив соответсвия того, что

а = 1
б = 2
в = 3
г = 4
д = 5
е = 6
ж = 7
з = 8
и = 9

Теперь, когда выбираем в строке поиска, например, букву "а" смотрим по таблице соответсвия, что буква "а" - это цифра 1. Вот эту цифру и записываем.

2.Здесь помоему не проверяется (да и я не сказал об этом ранше) повторяющие записи. Напирмер, 
1 4 5 6 3 8 9
1 4 5 6 3 8 9
не должна быть.
Если еще добавишь, что строки

1 2 3
3 2 1

это одно и то же значение, то я бы рекомендовал тебе вообще отказаться от RAND() и заполнить вообще все возможные варианты "тупым" перебором значений. Это же элементарная задача на перебор вариантов получается. Т.е. можно решить "в лоб" через вложенные циклы.

* Подбор вариантов выбора 7 значений из 10 возможных
* В одном наборе не должно быть одинаковых значений
* Один набор не должен повторятся несколько раз

LOCAL lnAvailable, lnNumValue, lnDelta
lnNumValue  = 7
lnAvailable = 10
lnDelta 	= m.lnAvailable - m.lnNumValue

CREATE CURSOR bigTable (a1 I, a2 I, a3 I, a4 I, a5 I, a6 I, a7 I)

LOCAL lnI1, lnI2, lnI3, lnI4, lnI5, lnI6, lnI7
FOR lnI1 = 1 TO 1 + m.lnDelta
	FOR lnI2 = m.lnI1 + 1 TO 2 + m.lnDelta
		FOR lnI3 = m.lnI2 + 1 TO 3 + m.lnDelta
			FOR lnI4 = m.lnI3 + 1 TO 4 + m.lnDelta
				FOR lnI5 = m.lnI4 + 1 TO 5 + m.lnDelta
					FOR lnI6 = m.lnI5 + 1 TO 6 + m.lnDelta
						FOR lnI7 = m.lnI6 + 1 TO 7 + m.lnDelta
							INSERT INTO bigTable (a1, a2, a3, a4, a5, a6, a7) ;
							VALUES (m.lnI1, m.lnI2, m.lnI3, m.lnI4, m.lnI5, m.lnI6, m.lnI7)
						ENDFOR
					ENDFOR
				ENDFOR
			ENDFOR
		ENDFOR
	ENDFOR
ENDFOR

Получим ВСЕГО 120 вариантов. Ты уверен, что ничего не напутал в условиях?
20 май 06, 23:04    [2688084]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить