Софтуерно Инженерство
Loading...
IliqnK avatar IliqnK 30 Точки

[HOMEWORK] DB - Functions - Problem 7. Define Function

Здравейте,

Някой може ли да помогне с първите 2 теста от този проблем?

Ето и заявката ми:

CREATE FUNCTION ufn_IsWordComprised
  (
  @setOfLetters nvarchar(max), 
  @word nvarchar(max)
  )
RETURNS bit
AS
BEGIN 
    SET @word = REPLACE(@word, char(9), '')
    SET @word = RTRIM(LTRIM(@word))
    DECLARE @l int = 1;
    WHILE LEN(@word) >= @l
    BEGIN
      DECLARE @charindex int; 
      DECLARE @letter char(1);
      SET @letter = SUBSTRING(@word, @l, 1)
      SET @charindex = CHARINDEX(@letter, @setOfLetters, 0)
      IF @charindex = 0
      BEGIN 
        RETURN 0
      END
      SET @setOfLetters = STUFF(@setOfLetters, @charindex, 1, '')
      SET @l += 1;
    END

    RETURN 1
END

Тагове:
0
C# DB Fundamentals 11/10/2016 10:55:55
silviyadimitrova avatar silviyadimitrova 6 Точки

Някой може ли да ми каже къде бъркам (освен, че решението е доста дълго..)?

И между другото не трябва ли да търсим резултат 0, ако в Word има два пъти буква, която в SetOfLetters присъства само веднъж? В този случай не можем да конструираме думата Word от дадените букви.

 

CREATE FUNCTION ufn_IsWordComprised(@SetOfLetters NVARCHAR(50), @Word NVARCHAR(50))

RETURNS BIT
AS
BEGIN
    DECLARE @Result BIT = 0

    IF (LEN(@SetOfLetters) < LEN(@Word))
        BEGIN
            RETURN @Result
        END
    
    DECLARE
        @CurrentIndex INT = 1,
        @CurrentLetterIndex INT = 1

    WHILE(LEN(@SetOfLetters) <> 0 AND @CurrentLetterIndex <= LEN(@Word))
    BEGIN
        IF (CHARINDEX(SUBSTRING(@Word, @CurrentLetterIndex, 1), @SetOFLetters, 1) = 0)
        BEGIN
            RETURN @Result
        END
        
        DECLARE @CurrentLetter NVARCHAR(1) = SUBSTRING(@Word, @CurrentLetterIndex, 1)

        SET @SetOfLetters = REPLACE(@SetOfLetters, @CurrentLetter, '')

        SET @CurrentIndex += 1
        SET @CurrentLetterIndex += 1

    END

    SET @Result = 1
    RETURN @Result
END
 

0