S
Sliva
Подскажите, как можно вставить в кроссворд (который я представляю как таблицу с атрибутами id, x- начало слова y-конец слова) следующее слово. ПОЖАЛУЙСТА!
Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе
DECLARE
i NUMBER;
s VARCHAR2 (100) := 'Text';
BEGIN
FOR i IN 1 .. LENGTH (s)
LOOP
DBMS_OUTPUT.put_line (SUBSTR (s, i, 1));
END LOOP;
END;
PROCEDURE InsertWord (w in VARCHAR2, xst in INTEGER, yst in INTEGER, pol in INTEGER, ic in INTEGER)
IS
-- выбирает символ из таблицы
CURSOR getSymb (str in INTEGER, st in INTEGER) IS
SELECT word FROM Crossword WHERE (x = str) AND (y = st);
BEGIN
i INTEGER;
j INTEGER;
lenw NUMBER; -- длина слова
symP VARCHAR2(1); -- символ справа
symL VARCHAR2(1); -- символ слева
symU VARCHAR2(1); -- символ сверху
symD VARCHAR2(1); -- символ снизу
curSym VARCHAR2(1); -- текущий символ
symHU VARCHAR2(1); -- вспомогательный символ для пробежки по столбцу сверху
symHD VARCHAR2(1); -- вспомогательный символ для пробежки по строке снизу
symHL VARCHAR2(1); -- вспомогательный символ для пробежки по строке слева
symHR VARCHAR2(1); -- вспомогательный символ для пробежки по строке справа
lenw:= LENGTH(w); -- узнали длину вставляемого слова
open getSymb (xst-1,yst);
FETCH getSymb INTO symL; -- узнали букву слева
close getSymb;
open getSymb (xst,yst-1);
FETCH getSymb INTO symU; -- узнали букву сверху
close getSymb;
open getSymb (xst,yst+1);
FETCH getSymb INTO symD; -- узнали букву снизу
close getSymb;
open getSymb (xst+1,yst);
FETCH getSymb INTO symP; -- узнали букву справа
close getSymb;
// Сначала в какую сторону устанавливаем! Если символ слева пустой, то проверяем до конца строки достаточно ли пустых символов для вставки слова
iF (symL='')and(symU='')and(symD='')and (pol = 1) THEN // если по горизонтали, а слева, сверху, снизу ничего нет
FOR i IN xst..lenw+1 // следущий символ за вставляемым словом д.б. пустым
LOOP
open getSymb(i,yst); // бежим по строке и открываем для каждого символа, начиная с позиции вставляемого слова
FETCH getSymb INTO curSym; // узнали текущий символ
IF (curSym='') THEN INSERT INTO Crossword VALUES (i,yst, w[i], lenw, pol, 1); end if; ??? w[i] и последний символ??? или сравнивать с NULL?
IF (curSym<>'') and (curSym<>w[i]) THEN DBMS_OUTPUT.put_line('Nelzya vstavit slovo!'); END IF; //если символы есть и они не совпадают с символами из слова
IF (curSym=w[i]) THEN // если буква совпала
open getSymb(xst, yst-1); // открываем клетку ячейки, которая выше
FETCH getSymb INTO SymHU;
open getSymb( xst, yst+1); // открываем клетку ячейки, которая ниже расположена
FETCH getSymb INTO SymHD;
IF (SymHU='') and (SymHD='') THEN // если нет слова по вертикали => вставить нельзя, т.к. это м.б. слово
DBMS_OUTPUT.put_line('Nelzya vstavit slovo!');
END IF;
IF (SymHU<>'') or (SymHD<>'') THEN // если что-то есть по вертикали то слово вставить можно
GOTO ins_wordH; // иначе будем вставлять слово с позиции i
END IF;
<<ins_wordH>>
FOR j IN xst..lenw LOOP INSERT INTO Crossword VALUES (j,yst, w[j], lenw, pol, 1); END LOOP;
END IF;
close getSymb;
END LOOP;
// Если клетка слева, справа и сверху пустые и вставляем по вертикали, то проверка до конца строки - есть ли свободное место
IF (symL='')and(symP='')and (symU='') and (pol = 0) THEN
FOR i IN yst..lenw+1
LOOP
open getSymb (xst, i); // пробегаем по вертикали, по столбцу
FETCH getSymb INTO curSym;
IF (curSym='') THEN INSERT INTO Crossword VALUES (xst,i, w[i], lenw, pol, 1); END IF; ??? w[i] и последний символ
IF (curSym<>'')and (curSym<>w[i]) THEN DBMS_OUTPUT.put_line('Nelzya vstavit slovo!'); END IF; //если символы есть и они не совпадают с символами из слова
IF (curSym=w[i]) THEN // если символ стоит => м.б. либо слово по вертикали, а значит вставить нельзя, либо слово по гор-ли и надо проверить совпадают буквы
open getSymb (xst-1,yst);
FETCH getSymb INTO SymHL; // узнали клетку слева
open getSymb (xst+1,yst);
FETCH getSymb INTO SymHR; // узнали клетку справа
IF (SymHL='')and(SymHR='') THEN // слова по горизонтали нет, т.к. слово идет ниже
DBMS_OUTPUT.put_line('Nelzya vstavit slovo!');
END IF;
IF (SymHL<>'') or (SymHR<>'') THEN // если символы стоят => есть слово по горизонтали
GOTO ins_wordV; // иначе будем вставлять слово с позиции i
END IF;
<<ins_wordV>>
FOR j IN yst..lenw LOOP INSERT INTO Crossword VALUES (j,yst, w[j], lenw, pol, 1); END LOOP;
END IF;
close getSymb;
END LOOP;
END InsertWord;
begin
-- Call the function
:result := имя_пакета.имя_функции(параметр => :параметр);
end;
-- Call the procedure
mycrosswords.insertword(w => :w,
xst => :xst,
yst => :yst,
pol => :pol,
ic => :ic);
create or replace procedure test_proc as
l_index number;
begin
for x in (select * from user_objects) loop
l_index := x.object_id;
end loop;
end;
begin
-- Call the procedure
test_proc;
end;
Обучение наступательной кибербезопасности в игровой форме. Начать игру!