चूंकि समाधानों की एक उचित संख्या है मैं आपके प्रश्न के "समालोचक" भाग के साथ जाने वाला हूं। नोटों की एक जोड़ी: मैंने कुछ टाइपो तय किए हैं और नोट किया है कि मैंने कहाँ किया। अगर मैं उनके बारे में गलत हूं तो एक टाइपो टिप्पणी में इसका उल्लेख करें और मैं बताऊंगा कि क्या चल रहा है। मैं कई चीजों को इंगित करने जा रहा हूं जो आप पहले से ही जानते होंगे, इसलिए यदि मैंने किया तो कृपया अपराध न करें। कुछ टिप्पणियां अशुभ लग सकती हैं, लेकिन मुझे नहीं पता कि आप अपनी यात्रा में कहां हैं इसलिए यह मान लें कि आप अभी शुरुआत कर रहे हैं।
CREATE function Palindrome (
@String Char
, @StringLength Int
, @n Int
, @Palindrome BIN
, @StringLeftLength Int
हमेशा एक charया varcharपरिभाषा के साथ लंबाई शामिल हैं । हारून बर्ट्रेंड यहां गहराई से बात करता है । वह बात कर रहा है, varcharलेकिन उसी के लिए जाता है char। varchar(255)अगर आप केवल अपेक्षाकृत छोटे तार चाहते हैं या शायद varchar(8000)बड़े लोगों के लिए या यहां तक कि इसके लिए मैं इसका उपयोग करूंगा varchar(max)। Varcharचर लंबाई के तार के charलिए केवल तय लोगों के लिए है। चूंकि आप स्ट्रिंग की लंबाई के बारे में सुनिश्चित नहीं हैं जो उपयोग में पारित हो रही है varchar। इसके अलावा यह binaryनहीं है bin।
आगे आपको उन सभी चर को पैरामीटर के रूप में रखने की आवश्यकता नहीं है। उन्हें अपने कोड में घोषित करें। यदि आप इसे या बाहर पारित करने की योजना बनाते हैं, तो केवल पैरामीटर सूची में कुछ डालें। (आप देखेंगे कि यह अंत में कैसा दिखता है।) इसके अलावा आपके पास @StringLeftLength है लेकिन इसका उपयोग कभी न करें। इसलिए मैं इसे घोषित नहीं करने जा रहा हूं।
अगली चीज जो मैं करने जा रहा हूं, वह कुछ चीजों को स्पष्ट करने के लिए फिर से प्रारूपित करने की है।
BEGIN
SET @n=1
SET @StringLength = Len(@String) -- Missed an @
WHILE @StringLength - @n >1
IF Left(@String,@n)=Right(@String, @StringLength) -- More missing @s
SET @n = @n + 1 -- Another missing @
SET @StringLength = @StringLength - 1 -- Watch those @s :)
RETURN @Palindrome = 1 -- Assuming another typo here
ELSE
RETURN @Palindrome =0
END
यदि आप मेरे द्वारा किए गए इंडेंटिंग के तरीके को देखते हैं, तो आप देखेंगे कि मेरे पास यह है:
WHILE @StringLength - @n >1
IF Left(@String,@n)=Right(@String, @StringLength)
SET @n = @n + 1
ऐसा इसलिए है क्योंकि कमांड WHILEऔर IFउनके बाद केवल पहली पंक्ति की कोड को प्रभावित करते हैं। BEGIN .. ENDयदि आप कई कमांड चाहते हैं तो आपको एक ब्लॉक का उपयोग करना होगा। इतना तय है कि हम मिल:
WHILE @StringLength - @n > 1
IF Left(@String,@n)=Right(@String, @StringLength)
BEGIN
SET @n = @n + 1
SET @StringLength = @StringLength - 1
RETURN @Palindrome = 1
END
ELSE
RETURN @Palindrome = 0
आप देखेंगे कि मैंने केवल एक BEGIN .. ENDब्लॉक जोड़ा है IF। ऐसा इसलिए है क्योंकि भले ही IFबयान को कई पंक्तियों लंबा है (और यहां तक कि कई आदेशों शामिल हैं) यह अभी भी एक सिंगल स्टेटमेंट (सब कुछ कवर में प्रदर्शन किया है IFऔर ELSEबयान के कुछ भागों)।
आगे आपको अपने दोनों के बाद एक त्रुटि मिलेगी RETURNs। आप एक चर या एक शाब्दिक वापस कर सकते हैं। आप चर सेट नहीं कर सकते हैं और इसे उसी समय लौटा सकते हैं।
SET @Palindrome = 1
END
ELSE
SET @Palindrome = 0
RETURN @Palindrome
अब हम तर्क में हैं। पहले मुझे यह बताने दें कि आपके द्वारा उपयोग किए जा रहे कार्य LEFTऔर RIGHTकार्य महान हैं, लेकिन वे आपको अनुरोधित दिशा से आपके द्वारा दिए गए वर्णों की संख्या देने जा रहे हैं। तो चलिए आपको "परीक्षण" शब्द में पास करते हैं। पहली पास पर आपको यह प्राप्त होने वाला है (चर हटाते हुए):
LEFT('test',1) = RIGHT('test',4)
t = test
LEFT('test',2) = RIGHT('test',3)
te = est
जाहिर है कि आप क्या उम्मीद नहीं है। आप वास्तव में substringइसके बजाय उपयोग करना चाहते हैं । सबस्ट्रिंग आपको न केवल शुरुआती बिंदु बल्कि लंबाई से गुजरने देता है। तो आपको मिलेगा:
SUBSTRING('test',1,1) = SUBSTRING('test',4,1)
t = t
SUBSTRING('test',2,1) = SUBSTRING('test',3,1)
e = s
आगे आप अपने स्टेटमेंट में आपके द्वारा उपयोग किए जाने वाले वैरिएबल को केवल IF स्टेटमेंट की एक स्थिति में बढ़ा रहे हैं। पूरी तरह से उस संरचना से परिवर्तनशील चर को खींचो। इसके लिए एक अतिरिक्त BEGIN .. ENDब्लॉक की आवश्यकता होती है , लेकिन मुझे दूसरे को हटाने की जरूरत नहीं है।
WHILE @StringLength - @n > 1
BEGIN
IF SUBSTRING(@String,@n,1) = SUBSTRING(@String, @StringLength,1)
SET @Palindrome = 1
ELSE
SET @Palindrome = 0
SET @n = @n + 1
SET @StringLength = @StringLength - 1
END
WHILEअंतिम परीक्षा के लिए आपको अपनी स्थिति बदलने की आवश्यकता है ।
WHILE @StringLength > @n
और अंतिम लेकिन कम से कम नहीं, जिस तरह से यह अब खड़ा है हम अंतिम चरित्र का परीक्षण नहीं करते हैं यदि विषम संख्या में वर्ण हैं। उदाहरण के लिए 'आना' का nपरीक्षण नहीं किया गया है। यह ठीक है, लेकिन यह मुझे एक अक्षर शब्द के लिए खाते की आवश्यकता है (यदि आप चाहते हैं कि यह एक सकारात्मक के रूप में गिना जाए)। तो हम यह कर सकते हैं कि मूल्य को सामने रखकर।
और अब हमारे पास आखिरकार है:
CREATE FUNCTION Palindrome (@String varchar(255))
RETURNS Binary
AS
BEGIN
DECLARE @StringLength Int
, @n Int
, @Palindrome binary
SET @n = 1
SET @StringLength = Len(@String)
SET @Palindrome = 1
WHILE @StringLength > @n
BEGIN
IF SUBSTRING(@String,@n,1) = SUBSTRING(@String, @StringLength,1)
SET @Palindrome = 1
ELSE
SET @Palindrome = 0
SET @n = @n + 1
SET @StringLength = @StringLength - 1
END
RETURN @Palindrome
END
एक आखिरी टिप्पणी। मैं सामान्य रूप से प्रारूपण का बहुत बड़ा प्रशंसक हूं। यह वास्तव में आपको यह देखने में मदद कर सकता है कि आपका कोड कैसे काम करता है और संभावित गलतियों को इंगित करने में मदद करता है।
संपादित करें
जैसा कि स्फिंक्स ने उल्लेख किया है कि हमारे तर्क में अभी भी दोष है। एक बार जब हम हिट करते हैं ELSEऔर @Palindrome0 पर सेट होते हैं तो जारी रखने का कोई मतलब नहीं है। वास्तव में उस समय हम बस कर सकते थे RETURN।
IF SUBSTRING(@String,@n,1) = SUBSTRING(@String, @StringLength,1)
SET @Palindrome = 1
ELSE
RETURN 0
यह देखते हुए कि हम अब केवल @Palindrome"यह अभी भी संभव है यह एक पैलिंड्रोम है" के लिए उपयोग कर रहा है, वास्तव में इसका कोई मतलब नहीं है। हम परिवर्तनशील से छुटकारा पा सकते हैं और अपने तर्क को विफलता ( ) और (सकारात्मक प्रतिक्रिया) पर शॉर्ट सर्किट पर स्विच कर सकते हैं, अगर यह लूप के माध्यम से सभी तरह से बनाता है। आप देखेंगे कि यह वास्तव में कुछ हद तक हमारे तर्क को सरल करता है।RETURN 0RETURN 1
CREATE FUNCTION Palindrome (@String varchar(255))
RETURNS Binary
AS
BEGIN
DECLARE @StringLength Int
, @n Int
SET @n = 1
SET @StringLength = Len(@String)
WHILE @StringLength > @n
BEGIN
IF SUBSTRING(@String,@n,1) <> SUBSTRING(@String, @StringLength,1)
RETURN 0
SET @n = @n + 1
SET @StringLength = @StringLength - 1
END
RETURN 1
END
LTRIM(RTRIM(...))खाली स्थान के?