![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
LOVE133 |
![]()
Сообщение
#21
|
![]() Гарцующая лошадка ![]() ![]() Группа: Пользователи Сообщений: 107 Пол: Женский Реальное имя: Любовь Репутация: ![]() ![]() ![]() |
так это и надо было, просто для того чтобы это сделать пришлось вот так вот извратиться.. переделать в файл записей, потом отсортировать.А идея у меня была вначале такая - создать еще массив в котором будет храниться такая информация
1 поле - количество букв 2 поле - номер с какого по порядку начинаются слова с заданным количеством букв(1 поле ) 3 поле - номер, на каком заканчиваются слова с таким количеством букв. все это для того чтобы было удобнее перемещаться по файлу, посмотрел сколько букв, перешел на нужное количество шагов и начинай подбирать подходит слово , не подходит. только вот абсолютно пока не представляю, как там будет рекурсия работать.Нам что-то сказали, типа вставляешь слова, вставляешь, потом когда доходишь до того места , когда боьлше ни одно слово не подходит, вернуться на шаг назад, поменять какое-то другое слово, и опять вставлять, только вот как это делать, никто толкьом объяснить не может... |
Бродяжник |
![]()
Сообщение
#22
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: ![]() ![]() ![]() |
Это типа словарь
Прикрепленные файлы ![]() |
LOVE133 |
![]()
Сообщение
#23
|
![]() Гарцующая лошадка ![]() ![]() Группа: Пользователи Сообщений: 107 Пол: Женский Реальное имя: Любовь Репутация: ![]() ![]() ![]() |
пасибки )) то что нужно и даже больше ))
я где-то здесь на форуме находила, вы решали уже задачу про кроссворд, только там его решить надо было и проверить , а мне составить, но там наверно тоже нужно было его составлять.ТОлько вот с делфи мы еще не работали, может посоветуете с чего хоть начинать слова забивать в кроссворд ? |
Бродяжник |
![]()
Сообщение
#24
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ох...
Это очень сильно зависит от того, какой будет окончательная схема работы. Если бы я стал это делать, я делал бы так: 1. Строим сетку кроссворда и проверяем ее на правильность. 2. По имеющейся сетке строим список "гнезд" с указанием начальных координат слов, их длины и направления. Нужен для организации рекурсии. 3. Желательно отсортировать этот список по убыванию длины слова. Мне кажется, что вначале нужно впихивать самые длинные слова. 4. Далее: - берем очередное "гнездо" и ищем такое слово, которое туда подойдет; - если нашли, вписываем его в сетку и рекурсивно переходим к следующему "гнезду"; - если не нашли, возвращаемся на предыдущий шаг рекурсии и ищем для этого шага другое слово. Если следовать этой схеме, то нужно начинать со списка гнезд. То есть нужно на готовой сетке найти все клетки, у которых есть либо только сосед справа, либо только сосед снизу. Это точки начала слов. Для каждой такой точки определить направление слова и его длину. И занести все это в массив. Круче было бы использовать динамический список... но зачем? И так возни хватит. Удачи! |
LOVE133 |
![]()
Сообщение
#25
|
![]() Гарцующая лошадка ![]() ![]() Группа: Пользователи Сообщений: 107 Пол: Женский Реальное имя: Любовь Репутация: ![]() ![]() ![]() |
смысл понятен, только как проверять подходит слово или нет, я не совсем уловила структуру "гнезда" , это массив или что-то еще? допустим. нашли слово, 5 букв, вертикально , на пересечении буква е, как дальше впихивать с учетом этой самой буквы е?
|
Бродяжник |
![]()
Сообщение
#26
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: ![]() ![]() ![]() |
Структура самого гнезда очень простая - координаты начала, длина слова и направление.
Нечто вроде type Первым делом заполняем этот массив - когда еще никаких букв нет. Потом берем первое найденное гнездо. Пусть будет, как у Вас: 5 букв, вертикально. Выбираем из словаря первое попавшееся слово из пяти букв (обозначим его, как slovo). Гнездо у нас вертикальное. Поэтому организовываем нечто такое: ok := true; Если после выхода из этого цикла ok = true, значит, слово подходит. Тогда вписываем его в сетку: for i=0 to Gnezdo[1].len-1 do Если слово не вертикальное, а горизонтальное, тогда работаем с Setka[Gnezdo[1].x+i][Gnezdo[1].y]. (Gnezdo[1] - это просто для примера, т.е. первое гнездо, а так-то должно быть что-то вида Gnezdo[k].) Если слово не подошло, берем следующее. Правка: исправил struct на record. Что-то меня проглючило... Сообщение отредактировано: volvo - 2.11.2006 12:25 |
LOVE133 |
![]()
Сообщение
#27
|
![]() Гарцующая лошадка ![]() ![]() Группа: Пользователи Сообщений: 107 Пол: Женский Реальное имя: Любовь Репутация: ![]() ![]() ![]() |
Setka[Gnezdo[1].x][Gnezdo[1].y+i] := Slovo[i+1];
тут сначала координаты сетки [x][y] , а потом что? Slovo{i+1} ? |
Бродяжник |
![]()
Сообщение
#28
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: ![]() ![]() ![]() |
Slovo - это слово из словаря, которое мы сейчас проверяем. Это строка. А Slovo[i+1] - это его очередной проверяемый символ. i+1 - потому что i отсчитывается от нуля, а символы в строке нумеруются с 1.
|
LOVE133 |
![]()
Сообщение
#29
|
![]() Гарцующая лошадка ![]() ![]() Группа: Пользователи Сообщений: 107 Пол: Женский Реальное имя: Любовь Репутация: ![]() ![]() ![]() |
понятно, теперь сижу втыкаюсь ... вот еще косяк объявился. не хочет 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 |
![]()
Сообщение
#30
|
Гость ![]() |
Цитата не хочет repeat заботать ... Какой именно? У тебя их 3... |
LOVE133 |
![]()
Сообщение
#31
|
![]() Гарцующая лошадка ![]() ![]() Группа: Пользователи Сообщений: 107 Пол: Женский Реальное имя: Любовь Репутация: ![]() ![]() ![]() |
они по моему все не работают, один общий, то есть выполнять все, пока не выход, то есть c:=5;
второй на case работает, то есть пока c<>5, выполнять по case и третий ждет пока клавишу не нажмут , а потом работать начать .Вроде должно работать, но после одного прохода. как только я заканчиваю сетку рисовать , он меня тихонько выкидывает....Там файл, модуль ваш, с мышкой Прикрепленные файлы ![]() |
LOVE133 |
![]()
Сообщение
#32
|
![]() Гарцующая лошадка ![]() ![]() Группа: Пользователи Сообщений: 107 Пол: Женский Реальное имя: Любовь Репутация: ![]() ![]() ![]() |
Вот что у меня получилось . структура данных
Код 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; У меня теперь проблема, все это работает для одного слова. То есть как считали его , так одно и гоняем, он не считывает нигде больше. Как это можно загнать в рекурсию, то есть что б он считывал, прогонял, проверял, смотрел, если подходит, считываем еще одно слово, если не подходит , возвращаемся на шаг назад и считываем другое слово . Можно как-нибудь из этого организовать рекурсию?то есть считывать слова. пока весь кроссворд не заоплнится ? |
Бродяжник |
![]()
Сообщение
#33
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: ![]() ![]() ![]() |
if horizontal thenВ этом фрагменте if (bukv[x,y+i]=' ') thenЛишнее, потому что okgor перед входом в цикл уже true, а как только оно станет не трю, цикл завершается, поэтому внутри цикла делать его трю не имеет смысла. По поводу репитов-антилов Вы разобрались? Как только Вы заполнили сетку и нажали клавишу, автоматически выполняется проверка, и если все ОК, тогда с:=5, и тут же происходит выход из всех циклов и завершение программы. Так и должно быть по Вашей программе. Я посмотрел выложенный код... если Вы не против, я бы немного изменил подход к работе с мышью. Если Вам интересно, я выложу подправленный вариант. В текущем варианте мне не всегда удавалось сбросить помеченную клетку. По поводу рекурсии... можно ли оформить поиск слова в словаре и проверку по гнезду в отдельные функции такого вида: function NewWord(dlina: integer): string; Тогда рекурсивная функция могла бы выглядеть как-то так: function CheckNext(i: integer): boolean; Сложность будет с проверкой условия больше_нет_слов_такой_длины и организацией работы с функцией NewWord. Добрые у вас преподаватели... Сообщение отредактировано: volvo - 2.11.2006 12:26 |
LOVE133 |
![]()
Сообщение
#34
|
![]() Гарцующая лошадка ![]() ![]() Группа: Пользователи Сообщений: 107 Пол: Женский Реальное имя: Любовь Репутация: ![]() ![]() ![]() |
конечно, интересно мне все.С мышью я тоже мучалась ))) а с циклами что делать тогда? Больше надеяться не на кого , потому что все только открывают рот удивленно " И это на первом курсе??". Тем более проблемы будут с проверкой это точно... Можно словарь разбить на файлы по длине слов...еще есть такие идеи:
Для очередного слова в сетке (желательно начинать с длинных) фаза Do * определяешь маску (какие буквы уже определены) * получаешь курсор выборки из словаря по данной маске и запоминаешь его значение * если обломились производишь откат к предыдущему слову * вставляешь выбранное из словаря слово и переходишь к следующему фаза Redo (когда был откат) * переводишь курсор вперед * если обломились (или вернулись на первое запомненное значение) производишь откат к предыдущему слову * вставляешь выбранное из словаря слово и переходишь к следующему Для случаев, когда в маске зафиксирован префикс (первые несколько букв) диапазон поиска можно сократить. Также можно ввести проверку для каждой позиции буквы в слове собрать множество доступных букв и фильтровать запросы к словарю на основе этих данных. Например, буква Ъ не встречается в начале слова так что незачем сканировать словарь. |
Бродяжник |
![]()
Сообщение
#35
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: ![]() ![]() ![]() |
Я позволил себе
1) сделать так, чтобы клетки меняли состояние не просто, когда мышь нажата, а именно по факту нажатия (т.е. не было нажато - стало нажато); 2) заменить операторы типа if a < 1 then f:=false else f:=trueна эквивалентные им f:=(a>=1); 3) выровнять текст, чтобы было удобнее читать. Расскажите, как должны работать циклы, и я подумаю. Прикрепленные файлы ![]() |
LOVE133 |
![]()
Сообщение
#36
|
![]() Гарцующая лошадка ![]() ![]() Группа: Пользователи Сообщений: 107 Пол: Женский Реальное имя: Любовь Репутация: ![]() ![]() ![]() |
циклы должны работать так
1) New- создать новую сетку , то етсь совсем новую , пустую, нажал - заполнил 2) Make - составить кроссворд , рекурсивно заполнить словами (здесь буду работать, что получится сегодня, покажу ) 3) Exit _ когда пользователь нажмет на эту "кнопку" - выход из программы тоесть нажал на new - новую сетку сделал , нажал потом на make - заполнил кроссворд, дальше еще подумаю , над сохранением ... но это если основную часть выполню и останется время. ТО есть пользователь может составить несколько кроссвордов , переходя по кнопкам.ПОка не нажмется Exit . Задумка была такая. |
LOVE133 |
![]()
Сообщение
#37
|
![]() Гарцующая лошадка ![]() ![]() Группа: Пользователи Сообщений: 107 Пол: Женский Реальное имя: Любовь Репутация: ![]() ![]() ![]() |
Уважаемый Бродяжник , посидели вчера , покумекали, вот что получили , осталось забить это в код....
Вот данная рекурсивная процедура . Будем использовать как мне их обозвали «дырки», то есть места выхода из процедуры, через которые будет проскакивать рекурсия не выполняя никаких функций. Выглядит это так (должно по крайней мере) «гнезда» - упорядоченный массив записей содержащий вот такую структуру 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 или нет . Осталось только реализовать это в код… я все-таки не до конца понимаю рекурсию. Может чем поможете, Алгоритм в принципе понятен и мелкие процедурки типа получения слова осилила. Но вот все это собрать без продлем не могу … эх.. жаль н еработают рисунки, прикрепила текстовый файл, елси что там все понятне. но смысл тут уловить можно . Прикрепленные файлы ![]() |
Бродяжник |
![]()
Сообщение
#38
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: ![]() ![]() ![]() |
Уважаемая Love (можно без 133?),
я тем временем немного поправил циклы, так что меню уже почти работает. Единственное, что накладываются друг на друга сообщения, так что их надо как-то очищать, когда они уже не нужны. Я обвел кнопки рамочками по размеру области для MouseIn, чтобы четко видеть, где отлавливается щелчок. И я уже почти закончил рекурсивную модельку, которая по заданной сетке подбирает гнезда и заполняет их, следя за пересечениями. Думаю, что сегодня и закончу. Она с массой ограничений, но схема там работает. А уже завтра гляну на Ваш материал. Прикрепленные файлы ![]() |
Бродяжник |
![]()
Сообщение
#39
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: ![]() ![]() ![]() |
Хотя бы в какой-то степени оно работает!
(Я составил 4 простеньких кроссворда. Дальше тестить поленился). Читайте ридми. Воть. Прикрепленные файлы ![]() |
LOVE133 |
![]()
Сообщение
#40
|
![]() Гарцующая лошадка ![]() ![]() Группа: Пользователи Сообщений: 107 Пол: Женский Реальное имя: Любовь Репутация: ![]() ![]() ![]() |
Вчера посидела с реализацией своей рекурсивной модели (см.выше) , вроде все должно работать , но есть какие-то непонятки, не могу найти где. В файле несколько процедур добавлено, основная ARBEIT , должна возвращать истину, елси все так и все работает, а так же текстовое поле , в котором все должно быть расставлено по местам , но почему-то этого не происходит....
![]() в 11.30 началось переполнение стека.... (*паника и старх*) Сообщение отредактировано: LOVE133 - 6.05.2006 10:35 Прикрепленные файлы ![]() |
![]() ![]() |
![]() |
Текстовая версия | 8.08.2025 6:59 |