मैंने निम्नलिखित वीबी कोड लिखा है।

Dim qu1, qu2, facroredload, bx, iterations, q3, err As Double
                
bx = 0.1
qu1 = "constant"

For iterations = 0 To 10000
    qu2 = "constant" * bx
    q3 = qu1 + qu2
    facroredload = "constant" / bx ^ 2
    err = Math.Abs(q3 - facroredload)

    Select Case err
        Case > 10
            bx += 0.1
        Case err <= 10 And err > 1
            bx = bx + 0.01
        Case err <= 1 And err > 0.1
            bx = bx + 0.001
        Case err <= 0.1 And err > 0.01
            bx = bx + 0.0001
        Case err < 0.01
            Exit For
    End Select
Next

bx मान १.७०००००००००४ तक पहुंच जाता है (मुझे नहीं पता कि कोड बहुत अधिक दशमलव क्यों जोड़ता है) और फिर यह कभी नहीं बदलता है। For कथन अभी भी रोमांचक है लेकिन, bx कभी भी 1.7 से आगे नहीं जाता है, भले ही Case err <= 10 And err > 1 सत्य हो।

0
Tofy 12 सितंबर 2020, 01:04

1 उत्तर

सबसे बढ़िया उत्तर

वीबी का Select Case वास्तव में सिर्फ एक फैंसी if स्टेटमेंट है। प्रत्येक Case का एक यदि अभिव्यक्ति में अनुवाद कैसे किया जाता है, यह केस अभिव्यक्ति के प्रारूप पर निर्भर करता है। तीन विकल्प हैं:

  • एक श्रेणी विवरण, जैसे Case 1 to 10। इसका अनुवाद If err >= 1 And err <= 10 होता है।
  • एक बयान जो एक तुलना ऑपरेटर से शुरू होता है, जैसे > जो आपका पहला Case शुरू करता है। इस सिंटैक्स का उपयोग करते समय, यह आपके परीक्षण व्यंजक को केस एक्सप्रेशन से पहले सम्मिलित करता है, जैसा कि If err > 10 में है।
  • एक बयान जो एक श्रेणी नहीं है और एक तुलना ऑपरेटर से शुरू नहीं होता है, जैसे कि आपका दूसरा Case। इस स्थिति को एक तुलना ऑपरेटर के मामले की तरह ही माना जाता है, जहां तुलना ऑपरेटर को = माना जाता है। इसका मतलब है कि आपका दूसरा Case If err = (err <= 10 And err > 1) माना जाता है।

एक बार जब आप इसे समझ लेते हैं तो आपको यह देखने में सक्षम होना चाहिए कि आपका दूसरा Case कथन आपके लिए काम क्यों नहीं करता है। यदि err 1.7 है, तो दूसरा केस स्टेटमेंट If err = True तक उबलता है, लेकिन गलती सही नहीं है, यह 1 और 10 के बीच की संख्या है।

अपना कोड ठीक करने के लिए आपके पास कुछ विकल्प हैं। सबसे सरल उपाय यह है:

    Select Case err
        Case > 10
            bx += 0.1
        Case > 1
            bx = bx + 0.01
        Case > 0.1
            bx = bx + 0.001
        Case > 0.01
            bx = bx + 0.0001
        Case Else
            Exit For
    End Select

यदि एक से अधिक Case संतुष्ट हैं, तो If/ElseIf की तरह केवल पहला संतुष्ट क्लॉज ही निष्पादित किया जाएगा। यही कारण है कि उपरोक्त कोड काम करता है, भले ही यह केवल प्रत्येक श्रेणी की निचली सीमा निर्दिष्ट करता है। यदि आपको निहित ऊपरी सीमा पसंद नहीं है, तो आप इसे इस तरह जोड़ सकते हैं: Case > 1 And err <= 10। व्यक्तिगत रूप से मुझे लगता है कि प्रत्येक सीमा की ऊपरी सीमा को छोड़ना वास्तव में स्पष्ट है।

0
Darryl 11 सितंबर 2020, 23:15