Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Подключение мыши

Автор: -LOVE133- 19.04.2006 15:12

скачала несколько юнитов для работы с мышью, но при запуске программы требует файл типа TPU , а все юниты просто с расширение PAS. что в этих ситуациях обычно делают?

Автор: volvo 19.04.2006 15:16

Обычно - просто компилируют PAS файл модуля, и компилятор создает TPU файл...

Или загружают в Паскаль основную программу (НЕ модуль), и в меню выбирают Compile -> Build, тогда Паскаль сам откомпилирует все необходимые PAS файлы в TPU (желательно, чтобы PAS файлы модулей при этом находились в той же папке, что и основная программа)...

Автор: Гость 19.04.2006 17:43

а еще хотела спросить в вашем юните в МИККИ что обозначается, первый раз встречаю это слово... smile.gif

Автор: volvo 19.04.2006 17:49

Там же написано:

Цитата
микки(шаг) - наименьшее расстояние, перемещение на которое мышь может зарегистрировать (т.е. расстояние регистрируемое датчиками мыши). Обычно 0.125 мм.

Автор: LOVE133 19.04.2006 18:31

пытаюсь реализовать такой алгоритм :
1) есть сетка с координатами
2) если в каком-то окне щелкнуть мышью, то подсветить эту клетку
3) если щелкнуть повторно , то снять выделение
не получается применить прцедуры, а так же в графическом режиме сделать отдельное выделение, типа процедуры window(x1,y1,x2,y2) в crt . Подскажите, как применять процедуры юнита mouse

Автор: Бродяжник 19.04.2006 20:40

Вот примитивная заготовка, чтобы понять основные моменты.

program test;
uses graph, crt, mouse;

var d,m: integer;
c: char;
mx,my: word;

begin
d:=vga;
m:=vgahi;

initgraph(d,m,''); // не забудьте скопировать EGAVGA.BGI в папку с программой

if not initmouse then
begin
restorecrtmode;
halt;
end;

showmouse;

repeat

if mousepressed then
begin
getmousexy(mx,my);
hidemouse;
lineto(mx,my);
showmouse;
end;

until keypressed;

while keypressed do c:=readkey;

hidemouse;

restorecrtmode;
end.

Автор: LOVE133 20.04.2006 1:25

а нет процедуры. которая определяет, в каком месте экрана находится курсор?

Автор: volvo 20.04.2006 1:34

Чем

Procedure GetMouseXY(VAR KoordX,KoordY:Word );
не устраивает? Она же возвращает координаты мыши...

Автор: LOVE133 20.04.2006 1:38

все.... перепутала просто один юнит с другим smile.gif все устраивает, а , кстати, для вывода графики обязательно мышь выключать надо? а еще все таки не могу вычертить окно , даже по этой процедуре... толи setviewport то ли window ?

Автор: volvo 20.04.2006 1:41

Если не хочешь получать после вывода графики и движения мышкой разные "артефакты" на экране - лучше отключать, тогда курсор мыши не мешает нормальному выводу графики.

А насчет окна - Window не получится однозначно - у тебя графический режим, а не текстовый. SetViewPort только устанавливает ViewPort, но никак не отчерчивает ничего... Объясни подробнее, что именно ты хочешь нарисовать и что выделять?

Может, тебе подойдет простой Rectangle и функция MouseIn ?

Автор: LOVE133 20.04.2006 1:47

у меня есть сетка (line(x1,y1,x2,y2)) которые делят экран на сетку , мне надо чтобы после щелчка мышью по полю, ячейка выделялась другим цветом, а после второго щелчка снималось выделение.. подскажите, как хоть выделение организовать.. да. там еще проблема будет с определением координат выделения, потому что на сколько делить экран задает пользователь )))) то есть , при 10*10 нужно будет определить , сколько заливать , какой размер )))

Автор: volvo 20.04.2006 2:07

Пишу прямо здесь, так что могут быть мелкие помарки... Идея такая:

const
size_x = 10;
size_y = 10;
var
selected: array[1 .. size_y, 1 .. size_x] of boolean;
{ изначально присвоить все элементы False }

...
len_x := getmaxx div size_x; { это если поле должно быть на весь экран }
len_y := getmaxy div size_y;

{ Отрисовываем начальную сетку... }
setcolor(white);
for i := 1 to size_y do
for j := 1 to size_x do begin
rectangle((j - 1)*len_x, (i - 1)*len_y, j*len_x, i*len_y);
selected[i, j] := false;
end;

{ после нажатия на кнопку мыши проверяем: }
for i := 1 to size_y do
for j := 1 to size_x do
if mouseIn((j - 1)*len_x, (i - 1)*len_y, j*len_x, i*len_y) then begin
selected[i, j] := not selected[i, j];
if selected[i, j] then setfillstyle(solidfill, lightgray)
else setfillstyle(solidfill, getbkcolor);
bar((j - 1)*len_x, (i - 1)*len_y, j*len_x, i*len_y);
setcolor(white);
rectangle((j - 1)*len_x, (i - 1)*len_y, j*len_x, i*len_y);

{ в принципе, все - из For-ов можно выходить... }
end;
...

Автор: LOVE133 21.04.2006 1:35

Немного доработала.Теперь в процессе создаю матрицу, в которой если клетка выделена, то будет единица, если нет, то ноль.Вроде работает.Для кроссворда теперь нужно чтобы не было отдельно стоящих единиц, чтобы все были связаны между собой .Предложили алгоритм "киселя". Разливать, как кисель ))
Смысл такой : берем первую единицу, которая встречается, если у нее есть соседние по горизонтали и вертикали, то добавляем к ним по единице, дальше проверяем соседей у соседей (может рекурсия пройдет, не знаю ), и опять по единице добавляем. К концу прохода должна остаться всего одна единица. то есть если кроссворд был такой
0100
0100
1111
0100
то после прохода должно получиться что-то типа этого
0100
0200
4345
0400
и проверяем, есть ли еще единицы, если есть, то нужно вернуться и опять заполнять кроссворд, пока все не будет на месте. Пробовала через цикл, но что-то не то получается...

Автор: LOVE133 23.04.2006 21:11

вчера вечером посидела, вот что получилось

Код

procedure increm(i,j:integer;n:integer;  var a:array [1..10,1..10] of byte);
begin                
if a[i,j]=0  
  then

  begin
   if (i<n) and (j<n) then
     begin
      increm(i+1,j,n,a);
      increm(i,j+1,n,a);
     end;
  end

else

if  a[i+1,j]=0 then
begin
  if (i<n) and (j<n) then
  increm(i+1,j,n,a) ;
  end

else
begin
a[i+1,j]:=a[i,j]+1;
if (i<n) and (j<n) then
increm(i+1,j,n,a);
end;
if  a[i,j+1]=0 then
begin
  if (i<n) and (j<n) then
  increm(i,j+1,n,a) ;
  end

else
begin
a[i,j+1]:=a[i,j]+1;
if (i<n) and (j<n) then
increm(i,j+1,n,a);
end;
end;


но почему-то работает только вправо и вниз, а мне нужно, чтоб она еще влево шла и вверх проверяла ..
показательный пример в файле


Прикрепленные файлы
Прикрепленный файл  INCREM.PAS ( 1.52 килобайт ) Кол-во скачиваний: 282

Автор: volvo 23.04.2006 22:36

program IncMassive;
type
setArray = array[1..10, 1..10] of integer;
var
a,b:setarray;
i,j:integer;
n:integer;

procedure print(const a: setarray);
var i, j: integer;
begin
writeln;
for i := 1 to n do begin
for j := 1 to n do write(a[i,j]:3);
writeln;
end;
end;

procedure increm(i_start, j_start: integer;
n: integer; value: integer; var a: setarray);
begin
a[i_start, j_start] := value;

if (i_start > 1) and (a[i_start - 1, j_start] > value)
then increm(i_start - 1, j_start, n, value + 1, a);

if (i_start < n) and (a[i_start + 1, j_start] > value)
then increm(i_start + 1, j_start, n, value + 1, a);

if (j_start > 1) and (a[i_start, j_start - 1] > value)
then increm(i_start, j_start - 1, n, value + 1, a);

if (j_start < n) and (a[i_start, j_start + 1] > value)
then increm(i_start, j_start + 1, n, value + 1, a);
end;


begin
randomize;
write('input N:'); readln(n);

for i := 1 to n do
for j := 1 to n do a[i, j] := random(2);

print(a);

b := a;
for i := 1 to n do
for j := 1 to n do
if b[i, j] = 1 then inc(b[i, j], n*n);

for i := 1 to n do
for j := 1 to n do
if b[i, j] = n*n + 1 then Increm(i, j, n, 2, b);

for i := 1 to n do
for j := 1 to n do
if b[i, j] <> 0 then dec(b[i, j]);

print(b);
readln;
end.

?

Так тебе нужно, чтобы было в результате?

..

Автор: LOVE133 23.04.2006 22:51

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

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

Автор: LOVE133 27.04.2006 2:05

скачала словарь существительных, теперь его пытаюсь отсортировать по количеству буквБ самые маленькие слова вверху и чтоб оставил сортировку по алфавиту внутри.Должно вроде работать правильно, хотя не уверенаю Хотелось бы узнать, правильно она будет работать или нет?


Прикрепленные файлы
Прикрепленный файл  data.txt ( 591.61 килобайт ) Кол-во скачиваний: 1978
Прикрепленный файл  FILE_SOR.PAS ( 580 байт ) Кол-во скачиваний: 293

Автор: Бродяжник 27.04.2006 12:23

Словарь скачивать пока влом, поэтому маленький вопрос. Файл словаря это действительно файл из записей с фиксированной длиной 26 байт? Это именно file of slova? А не простой текстовый?
И второе: может быть, стоило бы все же явно задать условие сортировки по алфавиту? Так, на всякий случай...

Автор: LOVE133 27.04.2006 16:45

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

Автор: Бродяжник 27.04.2006 16:49

ладно, уговорили. Скачаю Ваш словарь, отсортирую, выложу отсортированный. Короткие в начало, одинаковые - по алфавиту. Но в виде простого текстового файла.

Автор: LOVE133 27.04.2006 17:04

так это и надо было, просто для того чтобы это сделать пришлось вот так вот извратиться.. переделать в файл записей, потом отсортировать.А идея у меня была вначале такая - создать еще массив в котором будет храниться такая информация
1 поле - количество букв
2 поле - номер с какого по порядку начинаются слова с заданным количеством букв(1 поле )
3 поле - номер, на каком заканчиваются слова с таким количеством букв.
все это для того чтобы было удобнее перемещаться по файлу, посмотрел сколько букв, перешел на нужное количество шагов и начинай подбирать подходит слово , не подходит.

только вот абсолютно пока не представляю, как там будет рекурсия работать.Нам что-то сказали, типа вставляешь слова, вставляешь, потом когда доходишь до того места , когда боьлше ни одно слово не подходит, вернуться на шаг назад, поменять какое-то другое слово, и опять вставлять, только вот как это делать, никто толкьом объяснить не может...

Автор: Бродяжник 27.04.2006 17:25

Это типа словарь


Прикрепленные файлы
Прикрепленный файл  Slovar.zip ( 256.56 килобайт ) Кол-во скачиваний: 4543

Автор: LOVE133 27.04.2006 17:33

пасибки )) то что нужно и даже больше ))
я где-то здесь на форуме находила, вы решали уже задачу про кроссворд, только там его решить надо было и проверить , а мне составить, но там наверно тоже нужно было его составлять.ТОлько вот с делфи мы еще не работали, может посоветуете с чего хоть начинать слова забивать в кроссворд ?

Автор: Бродяжник 27.04.2006 19:20

Ох...
Это очень сильно зависит от того, какой будет окончательная схема работы.
Если бы я стал это делать, я делал бы так:
1. Строим сетку кроссворда и проверяем ее на правильность.
2. По имеющейся сетке строим список "гнезд" с указанием начальных координат слов, их длины и направления. Нужен для организации рекурсии.
3. Желательно отсортировать этот список по убыванию длины слова. Мне кажется, что вначале нужно впихивать самые длинные слова.
4. Далее:
- берем очередное "гнездо" и ищем такое слово, которое туда подойдет;
- если нашли, вписываем его в сетку и рекурсивно переходим к следующему "гнезду";
- если не нашли, возвращаемся на предыдущий шаг рекурсии и ищем для этого шага другое слово.
Если следовать этой схеме, то нужно начинать со списка гнезд. То есть нужно на готовой сетке найти все клетки, у которых есть либо только сосед справа, либо только сосед снизу. Это точки начала слов. Для каждой такой точки определить направление слова и его длину. И занести все это в массив. Круче было бы использовать динамический список... но зачем? И так возни хватит.
Удачи!

Автор: LOVE133 3.05.2006 19:47

смысл понятен, только как проверять подходит слово или нет, я не совсем уловила структуру "гнезда" , это массив или что-то еще? допустим. нашли слово, 5 букв, вертикально , на пересечении буква е, как дальше впихивать с учетом этой самой буквы е?

Автор: Бродяжник 3.05.2006 20:22

Структура самого гнезда очень простая - координаты начала, длина слова и направление.
Нечто вроде

type
TGnezdo = record
x,y: byte;
len: byte;
horizontal: boolean;
end;

var
Gnezdo: array[1..100] od TGnezdo;

Первым делом заполняем этот массив - когда еще никаких букв нет. Потом берем первое найденное гнездо. Пусть будет, как у Вас: 5 букв, вертикально. Выбираем из словаря первое попавшееся слово из пяти букв (обозначим его, как slovo). Гнездо у нас вертикальное. Поэтому организовываем нечто такое:
ok := true;
i:=0;
while (ok) and (i<Gnezdo[1].len) do
begin
if (Setka[Gnezdo[1].x][Gnezdo[1].y+i] <> ' ') and (Setka[Gnezdo[1].x][Gnezdo[1].y+i] <> Slovo[i+1])
then ok := false
else inc(i);
end;

Если после выхода из этого цикла ok = true, значит, слово подходит. Тогда вписываем его в сетку:
for i=0 to Gnezdo[1].len-1 do
begin
Setka[Gnezdo[1].x][Gnezdo[1].y+i] := Slovo[i+1];
end;

Если слово не вертикальное, а горизонтальное, тогда работаем с Setka[Gnezdo[1].x+i][Gnezdo[1].y].
(Gnezdo[1] - это просто для примера, т.е. первое гнездо, а так-то должно быть что-то вида Gnezdo[k].)
Если слово не подошло, берем следующее.
Правка: исправил struct на record. Что-то меня проглючило...

Автор: LOVE133 3.05.2006 20:31

Setka[Gnezdo[1].x][Gnezdo[1].y+i] := Slovo[i+1];

тут сначала координаты сетки [x][y] , а потом что? Slovo{i+1} ?

Автор: Бродяжник 3.05.2006 20:39

Slovo - это слово из словаря, которое мы сейчас проверяем. Это строка. А Slovo[i+1] - это его очередной проверяемый символ. i+1 - потому что i отсчитывается от нуля, а символы в строке нумеруются с 1.

Автор: LOVE133 3.05.2006 20:47

понятно, теперь сижу втыкаюсь ... вот еще косяк объявился. не хочет repeat заботать ...

Код

begin

Window(25,25,100,100);
writeln('Input the size of the crossvord:') ;
readln(n);
driver:=detect;
initgraph(driver,mode,'');
setcolor(white);
settextstyle(4,0,4);
outTextXY(490,60,'New');
outTextXY(490,100,'Make!');
outTextXY(490,140,'EXIT');
initmouse;
showmouse;
c:=0;
Repeat
  repeat
   if  ( mousein (490,55,600,90) ) and mousepressed then  c:=1;
   if (mousein (490,100,600,150)) and mousepressed then c:=2;
   if (mousein (490,160,600,210)) and mousepressed  then c:=3;
   until c>0;
repeat
case c of
1: begin
  setviewport(1,1,479,479,clipoff);
  clearviewport;
  setka(n,selected,a);
  zapolnyaem(selected,n,a);


  outtextXY(490,300,'enter!');
  if proverka(a,n) then
  begin
    settextstyle(2,0,2);
    outtextXY(490,180,'VSE V NORME!');
    c:=5;
  end
   else c:=1;
   end;

   2:begin
   c:=5;
     readln;
     end;
   3:begin
     outtextXY(490,300,'Bolwoe spasibo!');
     readln;
     c:=5;
     end;
   end;
   until c=5;
until c=5;
readln;
end.


после выполнения один раз просто выкидывает и все...
вроде должен подождать пока я на выход нажму..

Автор: volvo 3.05.2006 21:00

Цитата
не хочет repeat заботать ...
Какой именно? У тебя их 3...

Автор: LOVE133 3.05.2006 21:11

они по моему все не работают, один общий, то есть выполнять все, пока не выход, то есть c:=5;
второй на case работает, то есть пока c<>5, выполнять по case и третий ждет пока клавишу не нажмут , а потом работать начать .Вроде должно работать, но после одного прохода. как только я заканчиваю сетку рисовать , он меня тихонько выкидывает....Там файл, модуль ваш, с мышкой


Прикрепленные файлы
Прикрепленный файл  123.PAS ( 4.49 килобайт ) Кол-во скачиваний: 204

Автор: LOVE133 4.05.2006 12:45

Вот что у меня получилось . структура данных

Код

Tgnezdo=record
     x,y:integer;                  - координаты ячейки, где начинается слово
     len:byte;                      -длина слова
     horizontal:boolean;    - горизонтально или вертикально расположено слово
     end;

Дальше я бы хотела сделать так 1) берем первое гнездо из массива гнезд , смотрим, как расположено слово , сколько букв в нем
2) смотрим на сетку-массив символов, где если есть буква , то стоит пробел, если буквы нет в этом месте, то стоит 0
Код

for i:=1 to n do
   for j:=1 to n do
    begin
     if a[i,j]=1 then bukv[i,j]:=' ' else bukv[i,j]:='0';
     end;    - где a[I,j] – исходный массив нулей и единиц(сетка кроссворда)


3) считываем из файла слово нужной длины, кидаем в массив , дальше идем так:
Код

for w:=1 to q do      {q-количество слов , счетчик}    

for j:=1 to b[gnezdo[q].len].first do readln(f,s);
{здесь b-массив записей, обозначающих начало и конец слов в текстовом файле заданной длины, то есть  B[3].first=576, потому что слова длиной 3 начинаются с 576 строки в словаре}

  with gnezdo[w] do
  begin
  
{после прохода следующего блока если ок истина, то слово подходит и его можно запихнуть в сетку по горизонтали  }  

if horizontal then
    begin
    okgor:=true;
    i:=0;
     while okgor and ( i <len) do
     begin
     if (bukv[x,y+i]=' ') then
       begin
        okgor:=true;
        ok:=true;
        inc(i);
        end
       else if  (bukv[x,y+i]<>s[i])
     then
     begin
      okgor:=false
     end
     else inc(i);
     end;

  
{все верно, запихиваем в сетку }

  if okgor then
      for i:=0 to len-1 do
       begin
       bukv[x,y+i]:=s[i+1];
       end

  

  {все то же самое , но для вертикали }
    okgor:=true;
    i:=0;
     while okgor and ( i <len) do
     begin
     if   (bukv[x+i,y]=' ')   then
     begin
      okgor :=true;
      inc(i);
      end
      else if  (bukv[x+i,y]<>s[i])
     then
     begin
           okgor:=false
      end
       else inc(i);

     end;

     if okgor then
      for i:=0 to len-1 do
       begin
       bukv[x+i,y]:=s[i+1];
       end



   end;

        end;
        end;

У меня теперь проблема, все это работает для одного слова. То есть как считали его , так одно и гоняем, он не считывает нигде больше. Как это можно загнать в рекурсию, то есть что б он считывал, прогонял, проверял, смотрел, если подходит, считываем еще одно слово, если не подходит , возвращаемся на шаг назад и считываем другое слово . Можно как-нибудь из этого организовать рекурсию?то есть считывать слова. пока весь кроссворд не заоплнится ?

Автор: Бродяжник 4.05.2006 14:20

if horizontal then
begin
okgor:=true;
i:=0;
while okgor and ( i <len) do
begin
if (bukv[x,y+i]=' ') then
begin
okgor:=true;
ok:=true;
inc(i);
end
else if (bukv[x,y+i]<>s[i])
then
begin
okgor:=false
end
else inc(i);
end;
В этом фрагменте
          if (bukv[x,y+i]=' ') then
begin
okgor:=true; { ВОТ ЭТО ЛИШНЕЕ }
ok:=true;
inc(i);
end
Лишнее, потому что okgor перед входом в цикл уже true, а как только оно станет не трю, цикл завершается, поэтому внутри цикла делать его трю не имеет смысла.
По поводу репитов-антилов Вы разобрались? Как только Вы заполнили сетку и нажали клавишу, автоматически выполняется проверка, и если все ОК, тогда с:=5, и тут же происходит выход из всех циклов и завершение программы. Так и должно быть по Вашей программе.
Я посмотрел выложенный код... если Вы не против, я бы немного изменил подход к работе с мышью. Если Вам интересно, я выложу подправленный вариант. В текущем варианте мне не всегда удавалось сбросить помеченную клетку.
По поводу рекурсии... можно ли оформить поиск слова в словаре и проверку по гнезду в отдельные функции такого вида:
function NewWord(dlina: integer): string;
begin
{возвращает слово заданной длины.
при этом надо как-то учитывать те слова,
что уже были выбраны ранее.}
end;

function GoodWord(s: string; i: integer): boolean;
begin
{возвращает true, если слово, заданное строкой s,
можно вписать в гнездо с номером i}
end;

Тогда рекурсивная функция могла бы выглядеть как-то так:
function CheckNext(i: integer): boolean;
var s: string;
begin
if i > числа_гнезд then {все гнезда проверены}
begin
CheckNext := true; {шабаш}
exit;
end;

repeat

s := NewWord(Gnezdo[i].len); {выбираем слово из словаря}

if GoodWord(s,i) {слово хорошее}
then
begin
if CheckNext(i+1) then {вызываем рекурсию}
begin
CheckNext := true;
exit;
end;
end;
until больше_нет_слов_такой_длины;

CheckNext := false; {заполнить гнездо так и не удалось}
end;

Сложность будет с проверкой условия больше_нет_слов_такой_длины и организацией работы с функцией NewWord. Добрые у вас преподаватели...

Автор: LOVE133 4.05.2006 19:13

конечно, интересно мне все.С мышью я тоже мучалась ))) а с циклами что делать тогда? Больше надеяться не на кого , потому что все только открывают рот удивленно " И это на первом курсе??". Тем более проблемы будут с проверкой это точно... Можно словарь разбить на файлы по длине слов...еще есть такие идеи:

Для очередного слова в сетке (желательно начинать с длинных)

фаза Do
* определяешь маску (какие буквы уже определены)
* получаешь курсор выборки из словаря по данной маске и запоминаешь его значение
* если обломились производишь откат к предыдущему слову
* вставляешь выбранное из словаря слово и переходишь к следующему

фаза Redo (когда был откат)
* переводишь курсор вперед
* если обломились (или вернулись на первое запомненное значение) производишь откат к предыдущему слову
* вставляешь выбранное из словаря слово и переходишь к следующему



Для случаев, когда в маске зафиксирован префикс (первые несколько букв) диапазон поиска можно сократить.

Также можно ввести проверку для каждой позиции буквы в слове собрать множество доступных букв и фильтровать запросы к словарю на основе этих данных.
Например, буква Ъ не встречается в начале слова так что незачем сканировать словарь.

Автор: Бродяжник 4.05.2006 21:28

Я позволил себе
1) сделать так, чтобы клетки меняли состояние не просто, когда мышь нажата, а именно по факту нажатия (т.е. не было нажато - стало нажато);
2) заменить операторы типа

if a < 1 then f:=false else f:=true
на эквивалентные им
f:=(a>=1);

3) выровнять текст, чтобы было удобнее читать.
Расскажите, как должны работать циклы, и я подумаю.


Прикрепленные файлы
Прикрепленный файл  1.pas ( 5.39 килобайт ) Кол-во скачиваний: 221

Автор: LOVE133 4.05.2006 22:07

циклы должны работать так
1) New- создать новую сетку , то етсь совсем новую , пустую, нажал - заполнил
2) Make - составить кроссворд , рекурсивно заполнить словами (здесь буду работать, что получится сегодня, покажу )
3) Exit _ когда пользователь нажмет на эту "кнопку" - выход из программы
тоесть нажал на new - новую сетку сделал , нажал потом на make - заполнил кроссворд, дальше еще подумаю , над сохранением ... но это если основную часть выполню и останется время. ТО есть пользователь может составить несколько кроссвордов , переходя по кнопкам.ПОка не нажмется Exit . Задумка была такая.

Автор: LOVE133 5.05.2006 15:09

Уважаемый Бродяжник , посидели вчера , покумекали, вот что получили , осталось забить это в код....
Вот данная рекурсивная процедура . Будем использовать как мне их обозвали «дырки», то есть места выхода из процедуры, через которые будет проскакивать рекурсия не выполняя никаких функций.
Выглядит это так (должно по крайней мере)
«гнезда» - упорядоченный массив записей содержащий вот такую структуру

Tgnezdo=record
x,y:integer; - координаты ячейки, где начинается слово
len:byte; -длина слова
horizontal:boolean; - горизонтально или вертикально расположено слово

вот данная процедура

Код

Функция ARBEIT ( передаем текстовое поле, где пробелами обозначены места где есть или должна быть  буква, и номер «гнезда» ) :Boolean;

N слова:=0; retValue:=0;(retValue – метка для прохождения процедур без выполнения)


Процедура Mask(текстовое поле, «гнездо» ):string;
(процедура получает строку типа такой “_А_ _ Л”)
Получение очередного слова из
Файла


                        Сравнение с маской            
                                                                 не подходит
                                                                  ( Inc(номер слова))
                                                              
Подходит




Если номер гнезда равен
                            максимальному номеру гнезд

                  нет                                              да

клонируем текстовое поле                                           забиваем слово в текстовое поле
забиваем слово в клон                                                      retValue:=2 ( то есть True)
(*первый выход из рекурсии)




If     ARBEIT (копия текстового поля; N гнезда +1)


False                                                            True  
(переход к получения
нового слова  
                                            
                                             Присваиваем полю значение копии
                                             retValue:=2 ( то есть True)



ТО есть теперь все циклы и условия нужно будет проверять с условием if RetValue =2 или нет . Осталось только реализовать это в код… я все-таки не до конца понимаю рекурсию. Может чем поможете, Алгоритм в принципе понятен и мелкие процедурки типа получения слова осилила. Но вот все это собрать без продлем не могу … эх.. жаль н еработают рисунки, прикрепила текстовый файл, елси что там все понятне. но смысл тут уловить можно .


Прикрепленные файлы
Прикрепленный файл  ________________________________.doc ( 27 килобайт ) Кол-во скачиваний: 193

Автор: Бродяжник 5.05.2006 18:37

Уважаемая Love (можно без 133?),
я тем временем немного поправил циклы, так что меню уже почти работает. Единственное, что накладываются друг на друга сообщения, так что их надо как-то очищать, когда они уже не нужны. Я обвел кнопки рамочками по размеру области для MouseIn, чтобы четко видеть, где отлавливается щелчок.
И я уже почти закончил рекурсивную модельку, которая по заданной сетке подбирает гнезда и заполняет их, следя за пересечениями. Думаю, что сегодня и закончу. Она с массой ограничений, но схема там работает.
А уже завтра гляну на Ваш материал.


Прикрепленные файлы
Прикрепленный файл  1.pas ( 5.39 килобайт ) Кол-во скачиваний: 216

Автор: Бродяжник 5.05.2006 20:03

Хотя бы в какой-то степени оно работает!
(Я составил 4 простеньких кроссворда. Дальше тестить поленился).
Читайте ридми.
Воть.


Прикрепленные файлы
Прикрепленный файл  Recurs.zip ( 32.7 килобайт ) Кол-во скачиваний: 152

Автор: LOVE133 6.05.2006 11:38

Вчера посидела с реализацией своей рекурсивной модели (см.выше) , вроде все должно работать , но есть какие-то непонятки, не могу найти где. В файле несколько процедур добавлено, основная ARBEIT , должна возвращать истину, елси все так и все работает, а так же текстовое поле , в котором все должно быть расставлено по местам , но почему-то этого не происходит.... mega_chok.gif может как-нибудь подправить можно. А в вашем кроссворде я так поняла можно модель рекурсивную взять, и вставить в прогу основную)). Может к вечеру что-то прояснится ....


в 11.30 началось переполнение стека.... (*паника и старх*)


Прикрепленные файлы
Прикрепленный файл  PEREDELI.PAS ( 9.56 килобайт ) Кол-во скачиваний: 247

Автор: Бродяжник 6.05.2006 12:06

Когда сдавать-то? smile.gif

Автор: LOVE133 6.05.2006 14:37

сдавать демо-версию завтра, а у меня кроме веселого меню и пары кнопок ничего нет )))) даже левого какого вывода слов на экран ...

Автор: Бродяжник 6.05.2006 17:30

Сочувствую...
В том файле, который Вы прикрепили последним, я нашел пару ошибок.
1) это то, что я ведь в своей проге не случайно сделал функцию IsLetter. Вот представьте себе, что Вы пытаетесь узнать, есть ли сосед слева у самой левой клетки? Или сосед сверху у самой верхней? Что будет? Range Check Error, вот что.
2) Когда Вы первый раз вызываете функцию ARBEIT, Вы передаете ей переменную Ng, которая не определена. Перед первым вызовом надо поставить Ng := 1.
Больше я ничего не смог выяснить, из-за отсутствия файла словаря. Мой-то словарь не подходит!
Сегодня буду в сети еще часов до 4 по Москве, а дальше все... каникулы до среды.

Автор: LOVE133 6.05.2006 17:33

а так , если пользоваться вашей программой. как е в мой интерфейс загнать? а в принципе , будет работать такая рекурсия или надо все в принципе переделывать? а словарь вот....


Прикрепленные файлы
Прикрепленный файл  DATA_.rar ( 198.94 килобайт ) Кол-во скачиваний: 159

Автор: Бродяжник 6.05.2006 18:08

ща посмотрим...
Правка:
Жаль, но чтобы привести это все в чувство, нужно больше времени.
И словарь кстати не тот совсем... ведь это простой текстовый файл, а в программе у Вас стоит FSTR=file of string, что вовсе не то же самое.
К сожалению, в ближайших несколько дней я уже не смогу быть Вам полезным...
Удачи!

Автор: LOVE133 6.05.2006 18:33

завтра как-нибудь еще отверчусь, скажу, что все в процессе, постараюсь отладить, может чего и получится...Огромное спасибо за неоценимую помощь ))) give_rose.gif

Автор: LOVE133 7.05.2006 18:52

вот... только теперь выясняется, что память в паскале не резиновая и словарь в 50000 слов обработать трудновато, даже не знаю, что тут можно сделать ... может подскажете, потому что замучала ошибка выхода за диапазон, и словарь пришлось урезать , теперь слова длинне 5 букв использовать нельзя. В файле словарь и код.МОжет можно как-нибудь решить проблему нехватки памятики и выхода за диапазоны?


Прикрепленные файлы
Прикрепленный файл  123.rar ( 18.11 килобайт ) Кол-во скачиваний: 151

Автор: Бродяжник 10.05.2006 13:41

Привет!
В последнем выложенном файле есть как минимум следующие ошибки:
1. Еще раз возвращаюсь к разнице между text и file of string. Ваш словарь - это text, а не file of string. Поэтому к нему нельзя обращаться, как к file of string. В частности, нельзя использовать процедуру seek. Сделайте следующую вещь: напишите маленькую программу такого вида:

program test;
var f1: text;
f2: file of string;
p,m: string;
begin
p := 'Preved';
m := 'Medved';
assign(f1,'f1.txt');
rewrite(f1);
assign(f2,'f2.txt');
rewrite(f2);
writeln(f1,p);
writeln(f1,m);
write(f2,p);
write(f2,m);
close(f1);
close(f2);
end;
А потом сравните файлы f1.txt и f2.txt. И найдите 10 отличий.
Поэтому считывание слова из словаря (GEt_word_from_sl) не работает.
2. Теперь к функции Maska_Slova, конкретно вот к этому фрагменту:
with gnezdo do            
begin
i:=0;
if horizontal then
begin
while i<len do
begin
inc(i);
str:=str +text[x,y];
inc(y);
end;
end
Если if horizontal, то почему увеличивается игрек? Ведь это вертикальная координата?
3. Процедура Get_Gnezda (я уже об этом упоминал).
for i:=1 to n do
for j:=1 to n do
begin
if (a[i,j]=1) and (a[i-1,j]<>1 )and (a[i+1,j]=1 )then

Если индекс i отсчитывается от единицы, это значит, что будет обращение к ячейке a[i-1,j] то есть a[0,j]. А такой ячейки нет. Поэтому такое обращение даст ошибку. Значит, надо учитывать эту особенность - если клетка находится в 1 столбце, у нее не может быть соседей слева. То же самое касается клеток первой строки: у них не может быть соседей сверху. Чтобы это учесть, я в своих экспериментах написал функцию, которая при обращении к несуществующим ячейкам ведет себя так, как если бы там были "небуквенные" ячейки. Вы можете обойти это по-другому, но эту проблему надо решить.
4. Вы вставили в функцию ARBEIT присваивание
ng := 1;

Это не совсем то, что требовалось, потому что это напрочь убило рекурсию. Это нужно было прописать перед первым вызовом ARBEIT:
if a[i,j]=1 then bukv[i,j]:=' ' else bukv[i,j]:='0';
Get_gnezda(a, gnezdo,n, q);
ng := 1;
if ARBEIT( bukv,Ng) then ok:=true ;

Или просто
if ARBEIT( bukv,1) then ok:=true ;

Для начала разберитесь с этим.

Автор: LOVE133 13.05.2006 0:09

Доброго времени суток ))
все координально переделала, вроде работает... теперь начались косяки с интерфейсом
1) не могу повторно задать сетку и создать кроссворд, то есть когда ошибочно введена сетка, повторное нажатие на NEW вызывает сетку, но кроссворд на MAKE уже не получается
2) как быть с выводом готового кроссворда на экран ? в графическом режиме не отображаются русские буквы (((, выключать графику?
3) можно конечно попробовать в транслите. но тогда начинаются проблемы с перекодированием - в русском 33 буквы, в английском всего 26 )))
тут демо-версия, выводит кроссворд в графическом режиме...


Прикрепленные файлы
Прикрепленный файл  coursovik1.rar ( 68.04 килобайт ) Кол-во скачиваний: 142

Автор: Бродяжник 15.05.2006 14:57

Вот, сыскал в сети... русские фонты для BGI.


Прикрепленные файлы
Прикрепленный файл  Rus_chr.rar ( 111.17 килобайт ) Кол-во скачиваний: 158

Автор: Бродяжник 15.05.2006 16:05

И еще есть замечания по рекурсии.
Во-первых, что делает переменная flag? Ведь на участке между

flag := false
и
if not flNoWord and not flag then
значение flag не меняется. Поэтому фактически это условие сводится к
if not flNoWord
. Во-вторых, как должна работать рекурсия? У нас должна быть возможность вернуться назад на любое число шагов. Например, первые 5 гнезд заполнились нормально. А шестое мы так и не смогли заполнить. Мы возвращаемся назад на один шаг. Это значит, что последнее вписанное слово нужно вычеркнуть из сетки. То есть либо необходим специальный алгоритм вычеркивания, либо нужно сохранить предыдущую копию. Допустим, у нас есть копия. Но вот беда - оказывается, что другого варианта заполнения пятого гнезда нет. Это значит, что надо вернуться еще на шаг назад и вычеркнуть из сетки еще и четвертое слово. То есть нужна еще одна копия - и не одна, а весь набор промежуточных копий для всех шагов. Если мощь компьютера позволяет, можно и так. А если нет? Тогда нужно изобретать специальный алгоритм вычеркивания. Почему специальный? Потому что он должен учитывать то, что буква в сетке может принадлежать не одному, а сразу двум словам. И вычеркивать ее нужно с оглядкой.
Еще один вариант сводится к тому, чтобы в специальном стеке хранить все вписываемые в сетку буквы, а также те символы, которые были в сетке до этого вписывания. Например, пересекаются слова "кот" и "сон". При выписывании слова "кот", в стек попадают:
к (пробел)
о (пробел)
т (пробел)
При вписывании слова "сон":
с (пробел)
о о
н (пробел)
Теперь при вычеркивании слова "сон" на место букв "с" и "н" будут вписаны пробелы, а вместо "о" опять "о", которое и останется там, если не будет вычеркнуто слово "кот".
Ведь сейчас что получается? Допустим, пятое слово пересекается с четвертым и шестым. Мы заполнили шесть гнезд, дошли до седьмого. С седьмым ничего не вышло, с шестым и пятым тоже, пришлось вернуться к четвертому слову. Мы меняем четвертое слово и снова беремся за пятое. Вызываем для него ARBEIT. Входим в ARBEIT и заново определяем маску пятого слова (и это правильно). И в эту маску попадают буквы из нового четвертого слова, а также - внимание! - из уже отвергнутого шестого (оно ведь все-таки было вписано в сетку!).

Автор: LOVE133 15.05.2006 20:24

после многочисленных тестов пришла к выводу что рекурсия плохая и не работает ))) (*тихонько сходит с ума*). Работает только в одну сторону с перебором словаря и просто проверкой , подходит , не подходит...
но ничего путного придумать не могу, потому как не хватате глубоко понимания сущности рекурсии...
если хранить маску слов на всех этапах, то не хватит никакой памяти... Однокурсник использует деревья и списки, остался последний день, не думаю, что успею переделать все ))

Автор: Бродяжник 16.05.2006 14:14

Я уже почти заставил его работать, хотя тут, конечно, всплыли новые приколы. Например, может случиться так, что есть четыре первых гнезда. При этом первые три не пересекаются друг с другом, а четвертое пересекается с первым и со вторым. Мы заполнили три первых, перешли к четветрому, а с ним не стряслось. И происходит что: мы возвращаемся к третьему, меняем в нем слово - и это никак не влияет на ситуацию с четвертым гнездом. Мы прокручиваем все варианты для третьего гнезда, и только потом переходим ко второму и что-то в нем меняем. И это может продолжаться весьма долго...
но зато у меня уже заполнился вот такой кроссворд:

.О.В.
АДАЗА
.Ё.В.
АЖГОН
.А.Д.


Еще бы узнать, что такое АЖГОН и АДАЗА...

Автор: Бродяжник 16.05.2006 15:17

Оно работает!
Это еще актуально?

Автор: LOVE133 16.05.2006 16:45

Конечно актуально ))) допуск до экзамена )) тут не только такие приколы выплыли.. почти половина моей работы напрасна, при чем так что выть хочется... Сделала мышь, чтоб удобнее было, теперь надо клавиатуру подключать, интерфейс плохой. проверка неправильная.Теперь надо не только проверить можно ли составить кроссворд, но и пользователю показать , что так делать нельзя, то есть если он уже забил слово, то сделать так , чтоб ы восседние клеточки и кликнуть-то нельзя было, то есть показать, куда можно кликать а куда нет, вообщем полный провал ... сколько глюков будет, я уже чувствую...

Автор: Бродяжник 16.05.2006 17:30

Ладно, кладу то, что пока есть.
Те несколько кроссвордов, которые я пробовал, заполнились.
Единственное, что:
- я так и понял, что с проверкой что-то неладно, поэтому я ее просто отключил;
- процесс рекурсии может быть длительным. При этом желательно брать такую сетку, чтобы в ней был минимум горизонтальных слов. Например, кроссворд в виде буквы Ш строится на ура, а вот в виде Е не так быстро. Если хотите порадоваться, задайте сетку в виде квадрата

*****
*...*
*...*
*...*
*****

- словарь полон всяких загадочных слов типа "аак" или "абаза". Ну, тут мы не виноваты...
Итак, вот исходник.
(У меня буквы в графическом режиме выводятся нормально. Если у вас - нет, поэкспериментируйте со шрифтами).


Прикрепленные файлы
Прикрепленный файл  123.pas ( 13 килобайт ) Кол-во скачиваний: 208

Автор: LOVE133 16.05.2006 17:41

пасибо вам огроменно , не знаю, что б я делала ))) все работает на ура, и даже если где-то выяснится что не на ура, то наверно не расстроюсь, теперь остался интерфейс. но тут как-нибудь постараюсь справиться... теперь вот придется думать над проверками, где можно клутку ставить , а где нет ... начинаю трассировать программу. так графика подвисает после очередного прерывания и ничего сделать не могу. потому как мышь пропадает, поэтому и проверить сложно , где что не работает.

Автор: Бродяжник 16.05.2006 21:18

Хорошо!
С интерфейсом Вы справитесь, Вы жутко способная. smile.gif
А я пойду почивать на лаврах.
Удачи!

Автор: LOVE133 17.05.2006 19:49

Вчера докрутила, перестала мышь работать... не работает на весь экран в программе, то есть на полэкрана работает, а на вторую половину никак.Самое интересное. что запускаешь оригинал, на работает, запускаешь похожую программу, с теми же процедурами - работает . И если оригинал запустить после копии, то он тоже начинает работать, а ошибку найти не могу, ничего вроде не меняла.Может подскажете, где косяк?


Прикрепленные файлы
Прикрепленный файл  coursovik.rar ( 59.62 килобайт ) Кол-во скачиваний: 124

Автор: Бродяжник 18.05.2006 19:13

unsure.gif У мя все работает... и причин ему не работать не видно...
А вообще ничего, ничего, проект развивается!
(А заставка, кстати, была неплохая...)

Автор: LOVE133 19.05.2006 17:51

надеюсь - это окончательный вариант... Только есть еще несколько вопросов по процедурам в программе. Если можно, прокомментируйте несколько процедур, как именно они работают, файл Komment.pas . У меня обнаружилось несколько непоняток в связи с неполадками в работе )))
1) словарь просматривается от начала до конца только один раз? или по кругу?
2) в случае ситуации, когда нельзя составить кроссворд в принципе, что будет в этом случае, зависнет?
3) пару раз выводил на экран кроссворд, в котором одно и тоже слово встречалось 3 раза )))
и еще.. проверку на правильность ввода при самом вводе сетки мне милостиво разрешили не делать, но заставили выводить где именно ошибся пользователь.Так как у меня процедура SELECTED заполнения идет через repeat , то там очень сложно что-то поменять так , что б и смысл соранился и что-то можно было вывести... я думала о полной перерисовке экрана, то есть если есть 4 клетки вместе, то выделить их все , елси есть одна стоящая одиноко. выделить и ее, а потом спросить перерисовать сетку или нет.
это конечно все мелочи, меня волнуют больше всего комментарии , отчет писать надо будет )


Прикрепленные файлы
Прикрепленный файл  ________.rar ( 209.69 килобайт ) Кол-во скачиваний: 160
Прикрепленный файл  KOMMENT.PAS ( 3.31 килобайт ) Кол-во скачиваний: 211

Автор: Бродяжник 19.05.2006 20:16

Read this.


Прикрепленные файлы
Прикрепленный файл  comment.txt ( 8.09 килобайт ) Кол-во скачиваний: 263

Автор: LOVE133 22.05.2006 2:01

Volvo , очень прошу вас прокомментировать код... потому как самой не осилить ну никак, как не старалась.Так как писала не я и процедура рекурсивная то и трассировать очень сложно, не все понимаю , как работает.А спрашивать будут...

program IncMassive;

type

setArray = array[1..10, 1..10] of integer;

var

a,b:setarray;

i,j:integer;

n:integer;


procedure print(const a: setarray);

var i, j: integer;

begin

writeln;

for i := 1 to n do begin

for j := 1 to n do write(a[i,j]:3);

writeln;

end;

end;


procedure increm(i_start, j_start: integer;

n: integer; value: integer; var a: setarray);

begin

a[i_start, j_start] := value;


if (i_start > 1) and (a[i_start - 1, j_start] > value)

then increm(i_start - 1, j_start, n, value + 1, a);


if (i_start < n) and (a[i_start + 1, j_start] > value)

then increm(i_start + 1, j_start, n, value + 1, a);


if (j_start > 1) and (a[i_start, j_start - 1] > value)

then increm(i_start, j_start - 1, n, value + 1, a);


if (j_start < n) and (a[i_start, j_start + 1] > value)

then increm(i_start, j_start + 1, n, value + 1, a);

end;



begin

randomize;

write('input N:'); readln(n);


for i := 1 to n do

for j := 1 to n do a[i, j] := random(2);


print(a);


b := a;

for i := 1 to n do

for j := 1 to n do

if b[i, j] = 1 then inc(b[i, j], n*n);


for i := 1 to n do

for j := 1 to n do

if b[i, j] = n*n + 1 then Increm(i, j, n, 2, b);


for i := 1 to n do

for j := 1 to n do

if b[i, j] <> 0 then dec(b[i, j]);


print(b);

readln;

end.

Автор: pascal65536 23.05.2006 10:07

Извините, что вмешиваюсь.
Просто Вы затронули интересную тему - составление кроссворда.
Я тоже бился над этой задачей, лет несколько тому назад.
Если интересно, то с удовольствием поделюсь опытом.
Очень мне словарь Ваш понравился. Я свой создавал сам, ещё до того как смог впервые выйти в интернет.
Пришлось написать спец. утилитку - "выдиратель" слов из текста, причем тех, в которых нет ничего, кроме букв русского алфавита (в Вашем словаре есть слова с дефисами это слово ведь не годится для кроссворда)
Потом возникла проблема отделения имён существительных в ед.числе им.падеже от всех остальных, тогда пришлось написать ещё одну программку, которая по окончанию определяла нужное это слово или нет. Набор неверных окончаний хранился в отдельном файле.
Сетку для кроссворда "рисовал" в текстовом редакторе, из звёздочек и пробелов. Мыши на моём компьютере по моему не было тогда, или я просто не решался её подключать.
И полным перебором всех слов сетка заполнялась. Правда не все сетки ей были по зубам, на этом я собственно и остановился.
Ещё пару слов про словарь. Слова были разбиты по длине, и хранились в отдельных файлах. 02, 03 ... 24
Длиннее 24 букв слов в орфографическом словаре нет, да и вряд ли его придётся использовать.
При такой системе хранения, отпадала проблема отбрасывания "коротких" или "длинных" слов. Файл делался короче, примерно, в 10 раз и работать с ним было намного легче. По крайней мере отбрасывалась как минимум одна проверка на совпадение длины.

Автор: LOVE133 23.05.2006 11:33

Я с удовольчствием рассмотрю все предложения ))) Когда я бралась за эту задачу. я не думала, что все будет настолько сложно и запутанно. Утром доделала заполнение сетки, теперь начались проблемы с рекурсией.
Дело в том , что в программе используется массив USED - использованные ранее подошедшие и не подошедшие слова. То есть , если словарь хотя бы 4000 слов, то на каком-то шаге рекурсии , его весь нужно загнать в этот массви, джля того чтобы определить подходит слово или его надо удалить на этом шаге, но в паскале это возможно только с помощью динамической памяти... вот тут я и села. ТО есть программа до ходит да максимального размера массива использованных слов, а дальше проверка , было слово или нет просто станвовится бесполезной. ведь массив кончился и ничего туда больше не записывается. тут образуется зацикливание, вроде до конца файла еще не дошли, и слова уже все подряд подходят и рекурсия дальше не идет .... что тут делать?


Прикрепленные файлы
Прикрепленный файл  ________.rar ( 182.91 килобайт ) Кол-во скачиваний: 171

Автор: Бродяжник 24.05.2006 14:28

Love133
Если потерпите, завтра выложу версию с продвинутым словарем, поддерживающим запоминание до 32000 слов и ускоренный поиск слова заданной длины.
pascal65536
Привет соратникам! smile.gif

Автор: GoodWind 24.05.2006 15:50

тут вот какая мысль возникла... а ведь большинство слов в получившемся кроссворде нвчинаются на первые 3-4 буквы алфавита...

Автор: LOVE133 24.05.2006 16:50

а потому словарь отсортирован по алфавиту и длине слов. в начале самые длинные, и гнезда сортируются так же, то есть берем первое подходящее слово ( а оно в начале алфавита smile.gif ) и идем дальше и так до упора. Если не прокатило, берем второе подходящее слово - все из того же словаря , значит отличаться они будут максимумна 2-3 буквы )))) Попробовала работать с динамической памятью... Косяков немеряно, память толком выгрузить не могу.... но работает вернее...

Конечно потерплю )) деваться все равно некуда, сдавать-то надо....

Автор: pascal65536 24.05.2006 19:47

GoodWind
Это поначалу так, что слова начинаются на одинаковые буквы, потом, когда кроссворд достроится до конца, окажется, что буквы-то разные. Первое слово берётся из алфавитного списка, а все оставльные подбираются по маске.

Автор: LOVE133 24.05.2006 20:30

Paskal , как там насчет наработок ? мне было бы интересно посмотреть на ваш вариант обработки словаря и перебор, потому как дымаю полным перебором все это дело решилось бы быстрее раза в 3 )))

Автор: pascal65536 24.05.2006 20:35

LOVE133
Думаете, быстрее? Нифига подобного. СтОит подумать над другим алгоритмом, отличным от полного перебора.
А исходник выложу у себя на сайте, сюда линк выложу. Думаю, администраторы не обидятся.

Автор: Бродяжник 25.05.2006 20:43

Oops...
Зашился я с работой, так что не до кроссвордов. Видимо, я выбываю из игры...
В общем, идея была такая - хранить в массиве использованных слов не сами слова, а номера соответствующих записей в файле словаря. Тогда имеем всего два байта на слово, за счет чего размер массива можно существенно растянуть. Для этого, правда, пришлось сконвертировать словарь из текстового в типизированный файл. Начерно я это реализовал, оно даже работает, хотя одну не очень большую сетку ковыряло с полчаса. (А все из-за того, что слова на i-том и i+1-м уровне рекурсии оказались не связанными друг с другом). Но к "передаче в эксплуатацию" не готово.
mega_chok.gif

Автор: LOVE133 25.05.2006 23:22

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

Автор: pascal65536 26.05.2006 1:19

Выкладываю исходник, для общего ознакомления.
Только, пожалуйста, не надо его массово распространять.
Дата создания многих файлов - август 1999 года, так что прошу не судить строго, за корявый местами код.
http://www.pascal.hop.ru/temp/findword.zip Ссылка будет актуальна до июня.
В архиве есть всё, о чем я писал. Сетка кроссворда в файле setka.txt

Автор: Бродяжник 26.05.2006 13:31

Вот.
Читайте ReadMe.txt
Может, стоит подумать над тем, чтобы как-то отображать на экране процесс поиска, чтобы пользователь не скучал, и не думал, что все повисло? Хотя в графическом режиме это будет давать лишние тормоза...


Прикрепленные файлы
Прикрепленный файл  New_voc.zip ( 143.99 килобайт ) Кол-во скачиваний: 179

Автор: LOVE133 27.05.2006 14:06

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

Автор: Бродяжник 29.05.2006 13:07

Удачи!