:: Игры Разума
совсем простой алгоритм
Божья_коровка
Автор

Сообщений: 25731
Дата регистрации: 23.08.2001
Привет всем, что то я сегодня с утра гючу, пятница наверно ПРобую реализовать простейший алгоритмик - есть табличка в ней 1 поле

Цитата:
поле1
1
1
1
5
5
6
8
8
как из данной таблички посчитать количество Поле1 исключив одинаковые цифры?
вариант - SELECT COUNT(DISTINC поле1) from таблица - не предлагать. надо сделать простым циклом. в этом примере Количство Поле 1 равно будет = 4.


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 2 раз(а). Последнее : Божья_коровка, 12.09.08 08:31
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
Snick

Сообщений: 5949
Откуда: Москва
Дата регистрации: 21.05.2001
На вскидку
nCount=0
SCAN
cOldPole1=Pole1
nCount=nCount+1
SCAN FOR Pole1=cOldPole1
ENDSCAN
ENDSCAN
Внутренний цикл может быть нужно заменить на DO WHILE - не проверял, естественно.


------------------
www.sngsnick.com

Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
Божья_коровка
Автор

Сообщений: 25731
Дата регистрации: 23.08.2001
Усложняю условие, нет у вас цикла SCAN, как без него обойтись?


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
Snick

Сообщений: 5949
Откуда: Москва
Дата регистрации: 21.05.2001
DO WHILE
А можно еще с FOR извратиться


------------------
www.sngsnick.com





Исправлено 1 раз(а). Последнее : Snick, 12.09.08 08:46
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
rhs72

Сообщений: 1934
Откуда: Алматы - Чарджоу
Дата регистрации: 21.03.2007
Index On поле
Set index to ...
lnKol=0
lnCur=-999999999999
scan
if поле<>lnCur
lnKol=lnKol+1
lnCur=поле
endif
endscan
Наверное праздник давит


Елена, если ты просто развлекаешься, то тему перенесу.


------------------
"Знание того, что считать ответом, равносильно знанию ответа".




Исправлено 1 раз(а). Последнее : rhs72, 12.09.08 08:48
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
Божья_коровка
Автор

Сообщений: 25731
Дата регистрации: 23.08.2001
SCAN не использовть, индексирование тоже...


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
Божья_коровка
Автор

Сообщений: 25731
Дата регистрации: 23.08.2001
Цитата:
Елена, если ты просто развлекаешься, то тему перенесу.
Да нет не надо переносить, охота увидеть варианты, кто что предложит


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
Aries

Сообщений: 4349
Откуда: Николаев
Дата регистрации: 24.12.2002
Какой язык используется для написания?


------------------
Я бы переписал жизнь, но Бог не дает мне исходники (с)
==============================
Злостный линуксоид!
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
Божья_коровка
Автор

Сообщений: 25731
Дата регистрации: 23.08.2001
макро язык RSL, можно использовать циклы FOR и WHILE, контсрукцию IF...
SELECT и SCAN исключен


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
Burn

Сообщений: 5643
Откуда: Днепр
Дата регистрации: 02.01.2002
Динамические массивы, возможность создания еще одной таблички есть?
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
Божья_коровка
Автор

Сообщений: 25731
Дата регистрации: 23.08.2001
Угу, есть


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
Burn

Сообщений: 5643
Откуда: Днепр
Дата регистрации: 02.01.2002
Тогда чтото вроде:

USE MyTable
GO top
lnCount=1
DIMENSION laCount(lnCount)
laCount(lnCount)=MyTable.Field1
FOR i=1 TO Count('MyTable')
llFind=.f.
FOR j=1 TO ALen(laCount)
IF laCount(j)=MyTable.Field1
llFind=.t.
EXIT
ENDIF
ENDFOR
IF !llFind
lnCount=lnCount+1
DIMENSION laCount(lnCount)
laCount(lnCount)=MyTable.Field1
ENDIF
SKIP
ENDFOR
? ALen(laCount)
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
samson_inv

Сообщений: 5915
Откуда: Ростов-на-Дону
Дата регистрации: 01.01.2005
CREATE CURSOR dgt ( p n(1))
FOR i=1 TO 9
DO CASE
CASE i=1
INSERT INTO dgt (p) VALUES (i)
INSERT INTO dgt (p) VALUES (i)
INSERT INTO dgt (p) VALUES (i)
CASE i=5
INSERT INTO dgt (p) VALUES (i)
INSERT INTO dgt (p) VALUES (i)
CASE i=6
INSERT INTO dgt (p) VALUES (i)
CASE i=8
INSERT INTO dgt (p) VALUES (i)
INSERT INTO dgt (p) VALUES (i)
ENDCASE
NEXT
DIMENSION AD[9]
STORE 0 TO AD
GO top
FOR y=1 TO RECCOUNT()
GO y
AD[p] = AD[p] +1
NEXT
все элем мас, что больше нуля посчитать
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
rhs72

Сообщений: 1934
Откуда: Алматы - Чарджоу
Дата регистрации: 21.03.2007
Local Array tmp(1)
tmp(1)=tbl.fld
skip
do while eof()
=ASORT(tmp)
lnKol=ALEN(tmp)
if tmp(lnKol)<tbl.fld
DIMENSION tmp(lnKol+1)
tmp(lnKol+1)=tbl.fld
endif
skip
enddo
? ALEN(tmp)


------------------
"Знание того, что считать ответом, равносильно знанию ответа".




Исправлено 1 раз(а). Последнее : rhs72, 12.09.08 10:01
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
LUCIAN

Сообщений: 343
Откуда: Лида Беларусь
Дата регистрации: 25.03.2008
cOldPole1=-1
COUNT FOR boz_kor() TO nCount
?nCount
FUNCTION Boz_kor
IF Pole1#cOldPole1
cOldPole1=Pole1
RETURN .T.
ELSE
RETURN .F.
ENDIF
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
rhs72

Сообщений: 1934
Откуда: Алматы - Чарджоу
Дата регистрации: 21.03.2007
To LUCIAN
+1


------------------
"Знание того, что считать ответом, равносильно знанию ответа".
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
Каратаев

Сообщений: 3977
Откуда: Алматы
Дата регистрации: 04.12.2001
Лена, вот еще до кучи вариантик:
CREATE CURSOR cur1 (fld_ I)
INSERT INTO cur1 (fld_) VALUES (1)
INSERT INTO cur1 (fld_) VALUES (1)
INSERT INTO cur1 (fld_) VALUES (1)
INSERT INTO cur1 (fld_) VALUES (5)
INSERT INTO cur1 (fld_) VALUES (5)
INSERT INTO cur1 (fld_) VALUES (6)
INSERT INTO cur1 (fld_) VALUES (8)
INSERT INTO cur1 (fld_) VALUES (8)
*BROWSE
SELECT fld_, COUNT('fld_') AS количество FROM cur1 ;
GROUP BY fld_ HAVING COUNT('fld_')>0 into cursor cur_dups
USE IN SELECT('cur1')
SELECT cur_dups
BROWSE
USE IN SELECT('cur_dups')
RETURN


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
Владимир Максимов

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
Если рассмотреть схему решения подобной задачи совсем "абстрактно", то требуется сделать следующее:

1. Необходимо организовать перебор записей таблицы. По одной записи за раз.
2. Необходимо организовать дополнительное хранилище, куда будут записываться уже использованные значения.

Тогда схема работы будет примерно такая:

Цикл перебора записей таблицы
Если значение текущей записи есть в дополнительном хранилище, то переходим к следующей записи
Если значения текущей записи нет в дополнительном хранилище,
то записываю значение текущей записи в дополнительное хранилище
и увеличиваю счетчик на 1
Конец цикла перебора записаей

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

Цикл перебора записей упорядоченной таблицы
Если это первая запись таблицы ИЛИ значение текущей записи не равно значению переменной,
то записываю значение текущей записи в переменную
и увеличиваю счетчик на 1
В противном случае, переходим к следующей записи
Конец цикла перебора записаей

Ну, а какими способами реализовать эти алгоритмы зависит от конкретного языка программирования.
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
1. Если набор не сортирован - сортировать по возрастанию.
2. Последовательным перебором и сравнением с предыдушим значением перенести значения набора в новый набор.
При этом при совпадении выбранного значения с предыдущим - значение в новый набор не переносить.


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.
Ratings: 0 negative/0 positive
Re: совсем простой алгоритм
Burn

Сообщений: 5643
Откуда: Днепр
Дата регистрации: 02.01.2002
Влад Колосов
1. Если набор не сортирован - сортировать по возрастанию.
Сортировка в общем случае достаточно трудоемкая задача. Простейший пузырек требует n! оперций. Вроде есть более рациональные методы но никто не опускается ниже n2 операций. Метода же, описаная в общем виде Владимиром, требует немного меньше, если есть повторяющиеся значения. И только в случае полной уникальности выходит на n2
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 3 (Гостей: 3)

© 2000-2024 Fox Club 
Яндекс.Метрика