QBasic में गोल्फ के लिए टिप्स


13

QBasic में गोल्फिंग के लिए आपके पास क्या सामान्य सुझाव हैं? मैं उन विचारों की तलाश कर रहा हूं जो सामान्य रूप से कोड गोल्फ की समस्याओं पर लागू हो सकते हैं जो कम से कम कुछ हद तक QBasic के लिए विशिष्ट हैं (उदाहरण के लिए "टिप्पणियां हटाएं" एक उत्तर नहीं है)।

QB64 एमुलेटर से संबंधित युक्तियों का भी स्वागत है। इसमें कुछ अतिरिक्त विशेषताएं हैं जो Microsoft QBasic में नहीं हैं।


मैं आपकी प्रेरणा को लेकर उत्सुक हूं। मैंने अपने 10 वीं कक्षा के प्रोग्रामिंग क्लास के बाद से QBASIC का उपयोग नहीं किया है। कमाल है कि कैसे मैंने संस्करण नियंत्रण के किसी भी रूप के बिना सीधे 1.44 फ्लॉपी डिस्क को बचाया और (आमतौर पर) विनाशकारी विफलताओं से बचा।
एंड्रयू ब्रूजा

5
@ एंड्रयूब्रोज़ प्रेरणा? किसी भी भाषा में गोल्फ के लिए मेरी प्रेरणा के समान: मज़े के लिए! मुझे QBasic में छोटे प्रोग्राम लिखने में मज़ा आता है (हालाँकि मैं इसे किसी गंभीर चीज़ के लिए इस्तेमाल नहीं करना चाहता)। इसमें जोड़ा गया बोनस भी है कि इसमें साउंड और ग्राफिक्स (टेक्स्ट और पिक्सेल दोनों) मिला है, जो मेरी पसंदीदा "वास्तविक" भाषा पायथन में है।
DLosc

अजगर की तुलना में QBasic में ग्राफिकल गेम लिखना बहुत आसान है।
आयुष

अगर कोई भी सीधे ग्राफ़िकल QBasic अनुप्रयोगों को ब्राउज़र में आज़माना चाहता है तो वे इसका उपयोग कर सकते हैं: github.com/nfriend/origins-host
mbomb007

जवाबों:


10

अपने लूपिंग कंस्ट्रक्शन को जानें

QBasic कई पाशन निर्माणों है: FOR ... NEXT, WHILE ... WEND, और DO ... LOOP। आप लूप GOTOमें (या कुछ स्थितियों में) भी उपयोग कर सकते हैं RUN

  • FOR ... NEXTयह क्या करता है पर बहुत अच्छा है। पायथन के विपरीत, यह लगभग हमेशा बराबर WHILEया GOTOपाश से छोटा होता है , तब भी जब यह थोड़ा कट्टर हो जाता है:

    FOR i=1TO 19STEP 2:?i:NEXT
    i=1:WHILE i<20:?i:i=i+2:WEND
    i=1:9?i:i=i+2:IF i<20GOTO 9
    

    ध्यान दें कि आपको चर नाम को दोहराने की आवश्यकता नहीं है NEXT, और आप संख्याओं और सबसे निम्नलिखित खोजशब्दों के बीच की जगह को समाप्त कर सकते हैं।

  • WHILE ... WENDके लिए अच्छा है जब आपके पास एक लूप हो जिसे 0 बार निष्पादित करना पड़ सकता है। लेकिन अगर आपको पता है कि लूप कम से कम एक बार निष्पादित होगा, GOTOतो एक बाइट कम हो सकती है:

    WHILE n>1:n=n\2:WEND
    1n=n\2:IF n>1GOTO 1
    
  • मैं केवल DO ... LOOPअनंत छोरों के लिए उपयोग करता हूं (इसके RUNबजाय जहां उपयोग किया जा सकता है) को छोड़कर । हालांकि यह बिना शर्त के समान वर्णों की लागत लेता है GOTO, यह पढ़ने के लिए थोड़ा अधिक सहज है। (ध्यान दें कि "अनंत लूप" में लूप शामिल हो सकते हैं जिन्हें आप एक का उपयोग करके बाहर निकालते हैं GOTO।) DO WHILE/ DO UNTIL/ LOOP WHILE/ LOOP UNTILवाक्यविन्यास बहुत क्रिया है; आप का उपयोग करना बेहतर है WHILEया GOTOउचित के रूप में।
  • GOTOजैसा कि ऊपर उल्लेख किया गया है, लूप करते समय / लिखने के लिए सबसे छोटा सामान्य तरीका है। लेबल के बजाय एकल-अंक लाइन संख्या का उपयोग करें। ध्यान दें कि जब एक बयान GOTOके THENहिस्से में केवल एक चीज होती है IF, तो दो समान रूप से शॉर्टकट शॉर्टकट उपलब्ध होते हैं:

    IF x>y GOTO 1
    IF x>y THEN 1
    

    GOTOअधिक जटिल नियंत्रण प्रवाह बनाने के लिए भी इस्तेमाल किया जा सकता है । Naysayers इसे "स्पेगेटी कोड" के रूप में संदर्भित करते हैं, लेकिन यह कोड गोल्फ है: अपठनीयता लगभग एक गुण है! GOTOगौरव!

  • RUNउपयोगी है जब आपको कार्यक्रम में एक निश्चित स्थान पर कूदने की आवश्यकता होती है और आपको चर के किसी भी मान को रखने की आवश्यकता नहीं होती है। RUNअपने आप ही ऊपर से प्रोग्राम को पुनः आरंभ करेगा; एक लेबल या पंक्ति संख्या के साथ, यह उस रेखा पर पुनः आरंभ होगा। मैंने मुख्य रूप से स्टेटलेस अनंत लूप बनाने के लिए इसका उपयोग किया है ।

5

PRINTऔर के लिए शॉर्टकट का उपयोग करेंREM

आप उपयोग कर सकते हैं ?के बजाय PRINT, और 'के बजाय REM(टिप्पणी)।

'चार्ल 'या स्ट्रिंग सिंटैक्स के एक भाग के रूप में समर्थन करने वाली भाषाओं के साथ पॉलीग्लोटिंग करते समय भी उपयोगी हो सकता है ।


5

प्रभागीय परीक्षण

उन कार्यक्रमों में जिनकी आपको जाँच करने की आवश्यकता है कि क्या एक पूर्णांक दूसरे से विभाज्य है, उपयोग करने का स्पष्ट तरीका है MOD:

x MOD 3=0

लेकिन एक छोटा तरीका पूर्णांक विभाजन का उपयोग करना है:

x\3=x/3

यही है, xइंट-डिव फ्लोट-डिव के 3बराबर है ।x3

ध्यान दें कि ये दोनों दृष्टिकोण 0झूठी और सच्चाई के लिए वापस आ जाएंगे -1, इसलिए आपको परिणाम को नकारात्मक करने की आवश्यकता हो सकती है, या जोड़ने के बजाय इसे घटा सकते हैं।


यदि आपको विपरीत स्थिति की आवश्यकता होती है (जैसे xकि विभाज्य नहीं है 3), तो स्पष्ट दृष्टिकोण है न के बराबर ऑपरेटर का उपयोग करना:

x\3<>x/3

लेकिन अगर xगैर-गारंटी होने की गारंटी दी जाती है, तो हम एक बाइट बचा सकते हैं। इंटेगर डिवीजन परिणाम को कम करता है, इसलिए यह हमेशा फ्लोट डिवीजन से कम या बराबर होगा। इसलिए, हम स्थिति को इस प्रकार लिख सकते हैं:

x\3<x/3

इसी तरह, अगर xनकारात्मक होने की गारंटी दी जाती है , तो ट्रंकेशन परिणाम बढ़ाता है, और हम लिख सकते हैं x\3>x/3। यदि आप का संकेत नहीं जानते हैं x, तो आपको रहना होगा <>


5

स्कैनर का दुरुपयोग

जैसा कि बहुत सी भाषाओं में, यह जानना कि कौन से पात्र और जिन्हें हटाया नहीं जा सकता, महत्वपूर्ण है।

  • प्रतीक के आगे कोई भी स्थान हटाया जा सकता है: IF""=a$THEN?0
  • अंतरिक्ष आम तौर पर एक अंकों और एक पत्र होने वाली के बीच हटाया जा सकता है इसी क्रम में : FOR i=1TO 10STEP 2। वहाँ (पर उपलब्ध QBasic 1.1 के बीच कुछ मतभेद हैं archive.org ) और QB64 :
    • QBasic 1.1 किसी भी अंक और निम्नलिखित पत्र के बीच की जगह को हटाने की अनुमति देता है। इसके अलावा, प्रिंट स्टेटमेंट्स में, यह लगातार मूल्यों के बीच अर्धविराम का अनुमान लगाएगा: ?123xबन जाता है PRINT 123; x। ऊपर दिए गए अपवाद जैसे अनुक्रम हैं, 1e2और 1d+3जिन्हें वैज्ञानिक संकेतन के रूप में माना जाता है 100!और 1000#(क्रमशः एकल और डबल-सटीक) तक विस्तारित किया जाता है ।
    • QB64 आम तौर पर ही है, लेकिन संख्याएं आती हैं नहीं किया जा सकता d, eया fसब पर जब तक कि वे एक अच्छी तरह से गठित वैज्ञानिक संकेतन शाब्दिक का हिस्सा हैं। (उदाहरण के लिए, आप में लाइन नंबर के बाद अंतरिक्ष छोड़ सकते हैं नहीं 1 FORया 9 ENDकी तरह QBasic में आप कर सकते हैं उचित,।) प्रिंट बयान में यह केवल infers अर्धविराम किसी एक्सप्रेशन के एक स्ट्रिंग है: ?123"abc"काम करता है, लेकिन नहीं ?TAB(5)123या ?123x
  • अर्धविराम की बात हो रही, QBasic 1.1 एक के पीछे अर्धविराम कहते PRINTबयान है कि के लिए एक कॉल के साथ समाप्त होता है TABया SPC। (QB64 नहीं करता है।)
  • 0दशमलव बिंदु ( .1या 1.) से पहले या बाद में छोड़ा जा सकता है , लेकिन दोनों ( .) नहीं।
  • ENDIFके बराबर है END IF
  • एक स्ट्रिंग के समापन दोहरे उद्धरण को एक पंक्ति के अंत में छोड़ा जा सकता है।

endifवास्तव में QB64 में काम करता है, इस उत्तर को
बन्द करें

@wastl तो यह करता है। जब मैंने पहली बार QB64 में इसका परीक्षण किया, तो मैं एक पुराने संस्करण का उपयोग कर रहा था जिसमें यह एक सिंटैक्स त्रुटि थी। उल्लेख करने के लिए धन्यवाद!
DLosc

4

Nextकथन सम्मिलित करें

Next:Next:Next

नीचे संक्षेपण किया जा सकता है

Next k,j,i

जहां के लिए iterators Forलूप बने हैं i, jऔर k- इसी क्रम में।

उदाहरण के लिए नीचे (69 बाइट्स)

Input n,m,o
For i=0To n
For j=0To m
For k=0To o
?i;j;k
Next
Next
Next

65 बाइट्स तक घनीभूत हो सकते हैं

Input n,m,o
For i=0To n
For j=0To m
For k=0To o
?i;j;k
Next k,j,i

और जहां तक ​​यह प्रभाव स्वरूपण और इंडेंटेशन को प्रभावित करता है, मुझे लगता है कि इसे संभालने के लिए सबसे अच्छा दृष्टिकोण बयान को बाहरी के साथ अगले बयान को संरेखित करना है। उदाहरण के लिए।

Input n,m,o
For i=0To n
    For j=0To m
        For k=0To o
            ?i;j;k
Next k,j,i

4

अपने इनपुट के तरीकों को जानें

QBasic उपयोगकर्ता कीबोर्ड इनपुट पाने के लिए कई तरीके हैं: INPUT, LINE INPUT, INPUT$, और INKEY$

  • INPUTआपका मानक बहुउद्देशीय इनपुट विवरण है। प्रोग्राम बंद हो जाता है कि यह क्या कर रहा है, एक कर्सर प्रदर्शित करता है, और उपयोगकर्ता को कुछ इनपुट टाइप करने देता है, जिसे समाप्त किया गया है EnterINPUTसंख्या या तार पढ़ सकते हैं, और यह कई मानों को अल्पविराम से अलग कर सकते हैं। आप एक स्ट्रिंग को संकेत के रूप में निर्दिष्ट कर सकते हैं, आप डिफ़ॉल्ट प्रश्न-चिह्न प्रॉम्प्ट के साथ जा सकते हैं, और आप यहां तक ​​कि (मैंने अभी आज रात यह सीखा है) पूरी तरह से दबा सकते हैं। कुछ नमूना चालान:
    • INPUT x$,y
      डिफ़ॉल्ट ? प्रॉम्प्ट का उपयोग करता है और एक स्ट्रिंग और एक नंबर पढ़ता है, अल्पविराम से अलग हो जाता है।
    • INPUT"Name";n$
      के साथ संकेत देता है Name? और एक स्ट्रिंग पढ़ता है।
    • INPUT"x=",x
      प्रॉम्प्ट x=(कोई प्रश्नचिह्न नहीं है! सिंटैक्स में अल्पविराम पर ध्यान दें) और एक संख्या पढ़ता है।
    • INPUT;"",s$
      प्रांप्ट को दबाता है (खाली प्रॉम्प्ट स्ट्रिंग के साथ उपरोक्त कॉमा सिंटैक्स का उपयोग करके), एक स्ट्रिंग को पढ़ता है, और जब उपयोगकर्ता हिट दर्ज करता है तो अगली पंक्ति में नहीं जाता है (जो अर्धविराम उसके बाद INPUTहोता है)। उदाहरण के लिए, यदि आप इसके PRINT s$तुरंत बाद, आपकी स्क्रीन दिखाई देगी User_inputUser_input
  • इसका एक दोष यह INPUTहै कि आप इसमें एक कॉमा के साथ एक स्ट्रिंग नहीं पढ़ सकते हैं, क्योंकि INPUTकॉमा एक क्षेत्र विभाजक के रूप में उपयोग करता है। मनमानी (मुद्रण योग्य ASCII) वर्णों की एक पंक्ति को पढ़ने के लिए उपयोग करें LINE INPUT। इसे एक ही वाक्यविन्यास विकल्प मिला है INPUT, सिवाय इसके कि यह बिल्कुल एक चर लेता है जो एक स्ट्रिंग चर होना चाहिए। दूसरा अंतर यह है कि LINE INPUTडिफ़ॉल्ट रूप से एक संकेत प्रदर्शित नहीं होता है; यदि आप एक चाहते हैं, तो आपको इसे स्पष्ट रूप से निर्दिष्ट करना होगा।
  • INPUT$(n)कोई संकेत या कर्सर प्रदर्शित नहीं करता है, लेकिन बस तब तक इंतजार करता है जब तक कि उपयोगकर्ता nपात्रों में प्रवेश नहीं करता है, और फिर उन वर्णों से युक्त स्ट्रिंग लौटाता है। इसके विपरीत INPUTया LINE INPUT, उपयोगकर्ता को Enterबाद में प्रेस करने की आवश्यकता नहीं है , और वास्तव Enterमें पात्रों में से एक हो सकता है (यह एएससीआईआई चरित्र 13 देगा, जिसे सी-जैसी भाषाओं के रूप में जाना जाता है \r)।

    आमतौर पर, यह उपयोगी है INPUT$(1), आमतौर पर एक लूप में। संवादात्मक कार्यक्रमोंINPUT$ में अच्छा है जहाँ एकल keypresses बातें करते हैं । दुर्भाग्य से, यह केवल उन कुंजियों के साथ काम करता है जिनके पास ASCII कोड हैं; इस तरह बातें शामिल हैं Escऔर Backspaceनहीं, बल्कि तीर कुंजी, Insertऔर Delete, और अन्य।

  • जो कहाँ INKEY$आता है। यह उसी में समान है INPUT$(1)कि यह एक एकल कुंजी 1 का परिणाम देता है , लेकिन इसमें भिन्न:

    • INKEY$ कोई तर्क नहीं लेता।
    • जब INPUT$(n)तक निष्पादन निष्पादन को रोक देता है जब तक कि उपयोगकर्ता nपात्रों में प्रवेश INKEY$नहीं करता है , तब तक निष्पादन को रोक नहीं देता है। यदि उपयोगकर्ता वर्तमान में एक कुंजी दबा रहा है, तो INKEY$उस कुंजी का प्रतिनिधित्व करने वाला एक स्ट्रिंग लौटाता है; यदि नहीं, तो यह वापस आ जाता है"" । इसका मतलब यह है कि यदि आप INKEY$अगले कीप को प्राप्त करने के लिए उपयोग करना चाहते हैं , तो आपको इसे एक व्यस्त वेटिंग लूप: 2 में लपेटना होगा

      k$=""
      WHILE""=k$
      k$=INKEY$
      WEND
      
    • दोनों INPUT$और INKEY$चाबी के लिए वापसी ASCII वर्ण कि (भागने, टैब, और बैकस्पेस की तरह नियंत्रण वर्णों सहित) ASCII वर्ण के अनुरूप हैं। हालाँकि, INKEY$कुछ कुंजियाँ भी संभाल सकते हैं जिनमें ASCII कोड नहीं हैं। इन के लिए (मदद फ़ाइल को saith), "INKEY $ 2 बाइट स्ट्रिंग को अशक्त वर्ण (ASCII 0) और कीबोर्ड स्कैन कोड से बना देता है।"

      कीचड़ की तरह साफ़? यहाँ कुछ उदाहरण हैं। यदि आप उपयोग करते हैंINKEY$ बाएं तीर कुंजी के एक कुंजी को पकड़ने के लिए ऊपर दिए लूप काk$ हैं, तो स्ट्रिंग "␀K"( Kप्रतिनिधित्व स्कैन कोड 75 के साथ) होगा। सही तीर के लिए, यह "␀M"(77) है। पृष्ठ नीचे है "␀Q"(81)। F5 "␀?"(63) है।

      कीचड़ के रूप में अभी भी स्पष्ट है? हाँ। यह दुनिया की सबसे सहज बात नहीं है। मदद फ़ाइल में स्कैन कोड की एक तालिका है, लेकिन मैं हमेशा सिर्फ थोड़ा प्रोग्राम लिखता हूं INKEY$कि सही मान क्या हैं, यह जानने के लिए कुंजी का एक गुच्छा दबाएं। एक बार जब आप जानते हैं कि कौन वर्ण जो कुंजी के अनुरूप है, तो आप उपयोग कर सकते हैं RIGHT$(k$,1)और LEN(k$)सभी विभिन्न मामलों आपके सामने आने वाले के बीच अंतर करना।

    जमीनी स्तर? INKEY$अजीब है, लेकिन यह एकमात्र तरीका है जब आपके प्रोग्राम को गैर-अवरोधक इनपुट की आवश्यकता होती है या आवश्यकता है तीर कुंजियों का उपयोग करने की आवश्यकता है


1 शामिल नहीं है Shift,Ctrl , Alt, PrntScr, Caps Lock, और इसी तरह। जिनकी गिनती नहीं है। : ^ पी

2WHILE ... WEND मुहावरा यहाँ क्या मैं अपने QBasic किताबों में सीखा है। गोल्फिंग प्रयोजनों के लिए, हालांकि, एक GOTOलूप कम है


3

LOCATE वास्तव में शक्तिशाली हो सकता है

LOCATEबयान आप स्क्रीन पर कर्सर कहीं भी (सामान्य 80x40 चरित्र अंतरिक्ष सीमाओं के भीतर) जगह है और उस स्थान पर कुछ प्रिंट करने देता है। एक चुनौती का यह जवाब वास्तव में यह दिखाता है (और इस विषय से अन्य कई युक्तियों के साथ भी संयुक्त है)।

चुनौती हमें एक 16x6 ग्रिड में दबाए गए प्रत्येक चरित्र को आउटपुट करने के लिए कहती है। इसके साथ LOCATEबस ASCII कोड ( aइस कोड में) पर div और mod का मामला है :

LOCATE a\16-1,1+2*(a MOD 16)

और फिर चरित्र को मुद्रित करना:

?CHR$(a)

3

QBasic में, DIMवैरिएबल बनाने के लिए कथन का उपयोग करने के लिए प्रथागत है , उन्हें एक नाम और एक प्रकार दे रहा है। हालाँकि, यह अनिवार्य नहीं है, QBasic भी वेरिएबल के नाम के प्रत्यय द्वारा एक प्रकार प्राप्त कर सकता है। चूंकि आप एक ही समय में एक चर घोषित नहीं कर सकते हैं और शुरू कर सकते हैं, इसलिए अक्सर DIMकोडगुल्फ़ को छोड़ना बुद्धिमान है । दो स्निपेट जो कार्यात्मक रूप से समान हैं *:

DIM a AS STRING: a = "example"
a$ = "example"

* ध्यान दें कि यह दो भिन्न चर नाम बनाता है।

हम एकल सटीक संख्याओं और डबल्स के $लिए स्ट्रिंग के लिए एक चर नाम के अंत में जोड़कर चर के प्रकार को निर्दिष्ट कर सकते हैं । जब कोई प्रकार निर्दिष्ट नहीं किया जाता है तो एकल ग्रहण किया जाता है।!%

a$ = "Definitely a string"
b! = "Error!"

ध्यान दें कि यह सरणियों के लिए भी है। आमतौर पर, एक सरणी को इस प्रकार परिभाषित किया जाता है:

DIM a(20) AS STRING

लेकिन सरणियों को भी ध्यान देने की आवश्यकता नहीं है DIM:

a$(2) = "QBasic 4 FUN!"

a$अब 11 के साथ तार के लिए एक सरणी है स्लॉट्स के : इंडेक्स 0 से टू और इंडेक्स 10. सहित। यह इसलिए किया जाता है क्योंकि QBasic में एक विकल्प होता है जो एरेज़ के लिए 0-आधारित और 1-आधारित इंडेक्सिंग दोनों की अनुमति देता है। एक डिफ़ॉल्ट सरणी प्रकार इस तरह से दोनों का समर्थन करता है।

याद रखें कि बीस-स्लॉट सरणी हम DIMऊपर ध्यान दें? वास्तव में इसमें 21 स्लॉट हैं, क्योंकि एक ही सिद्धांत मंद और गैर-मंद दोनों सरणियों पर लागू होता है।


मुझे यह कभी नहीं लगा कि सरणियों पर भी लागू होता है। दिलचस्प।
ट्राइकोप्लाक्स

3

संक्षिप्त IFबयान

IF बयान बल्कि महंगे हैं, और उन्हें नीचे गोल्फिंग बहुत बाइट बचा सकता है।

निम्नलिखित पर विचार करें ( एग्री द आउटग्राफर द्वारा उत्तर से अनुकूलित ):

IF RND<.5THEN
x=x-1
a(i)=1
ELSE
y=y-1
a(i)=0
ENDIF

पहली चीज जो हम कर सकते हैं वह ENDIFहै सिंगल-लाइन IFस्टेटमेंट का उपयोग करके सेव करना :

IF RND<.5THEN x=x-1:a(i)=1ELSE y=y-1:a(i)=0

यह तब तक काम करता है जब तक आप इसे किसी और चीज की तरह एक ही लाइन पर रखने की कोशिश नहीं करते हैं। विशेष रूप से, यदि आपके पास नेस्टेड IFस्टेटमेंट हैं, तो केवल अंतरतम एक-पंक्तिबद्ध हो सकता है।

लेकिन इस मामले में, हम IFगणित का पूरी तरह से उपयोग कर सकते हैं । विचार करें कि हम वास्तव में क्या चाहते हैं:

  • अगर RND<.5सच है ( -1), हम चाहते हैं:
    • x 1 से कम करने के लिए
    • y वही रहने के लिए
    • a(i) 1 बनने के लिए
  • अन्यथा, अगर RND<.5गलत है ( 0), हम चाहते हैं:
    • x वही रहने के लिए
    • y 1 से कम करने के लिए
    • a(i) बनने के लिए 0

अब अगर हम एक चर में (सशर्त का परिणाम बचाने के r=RND<.5), हम के नए मूल्यों की गणना कर सकते हैं x, yऔर a(i):

  • जब rहै -1, x=x-1; जब rहै 0, x=x+0
  • जब rहै -1, y=y+0; जब rहै 0, y=y-1
  • जब rहै -1, a(i)=1; जब rहै 0, a(i)=0

तो हमारा अंतिम कोड इस तरह दिखता है:

r=RND<.5
x=x+r
y=y-1-r
a(i)=-r

मूल संस्करण पर एक भारी 20 बाइट्स (40%) की बचत।


गणित दृष्टिकोण को आश्चर्यजनक रूप से अक्सर लागू किया जा सकता है, लेकिन जब दो मामलों के बीच तर्क में अंतर होता है (जैसे जब आपको एक मामले में कुछ इनपुट करने की आवश्यकता होती है, लेकिन दूसरे में नहीं), तो भी आपको उपयोग करने की आवश्यकता होगी IF


3

कभी-कभी, आपको ऐरे से बचना चाहिए

QBasic में ऐरे, जब बिना इंस्टेंट किए DIMकेवल 11 स्लॉट होते हैं। यदि किसी चुनौती के लिए 11 से अधिक स्लॉट्स (या N स्लॉट्स, जहाँ N 11 से बड़ा हो सकता है) DIMकी आवश्यकता होती है , तो आपको ऐरे चाहिए । इसके अलावा, मान लें कि हम इस सरणी को डेटा के साथ आबाद करना चाहते हैं:

DIM a$(12)
a$(0) = "Value 1"
a$(1) = "Value 2"
...

यहां तक ​​कि गोल्फ के लिए, यह बहुत सी जगह ले सकता है। ऐसे अवसरों पर, यह करने के लिए बाइट्स में सस्ता हो सकता है:

a$ = "value 1value 2"

यहां, हम सब कुछ 1 समवर्ती स्ट्रिंग में रखते हैं। बाद में, हम इसे इस तरह एक्सेस करते हैं:

?MID$(a$,i*7,7)

इस दृष्टिकोण के लिए, यह महत्वपूर्ण है कि सभी मूल्य समान लंबाई के हों। सबसे लंबा मान लें और अन्य सभी को बाहर करें:

a$="one  two  threefour "

आपको अंतिम मूल्य को पैड करने की आवश्यकता नहीं है, और आप समापन उद्धरण को छोड़ भी सकते हैं! यदि चुनौती निर्दिष्ट करती है कि उत्तर में व्हाइट-स्पेस की अनुमति नहीं है, तो उपयोग करेंRTRIM$() इसे ठीक लिए करें।

आप इस तकनीक को यहां कार्रवाई में देख सकते हैं ।


3

PRINT( ?) में कुछ विचित्रताएँ हैं

नंबर एक अग्रणी और अनुगामी स्थान के साथ मुद्रित होते हैं।

मुद्रण एक लाइनब्रेक जोड़ता है। इस व्यवहार को बयान के अंत में अल्पविराम जोड़कर बदला जा सकता है, इसके बजाय एक टैब डालने के लिए, या किसी भी सम्मिलन से बचने के लिए एक अर्ध-उपनिवेश:

प्रिंटिंग के समय, अलग-अलग ऑपरेशन के बीच &या उपयोग करना आवश्यक नहीं है ;। प्रत्येक पक्ष, अक्षर और की सामग्री पर रिक्त स्थान के साथ, ?1"x"s$संख्या प्रिंट करें1xs$

?"foo"
?"bar"
?10
?"foo",
?"bar"
?"foo"; 
?"bar"
?1CHR$(65)
?1" "CHR$(65)
?"A","B

आउटपुट

foo
bar
 10
foo           bar
foobar
 1 A
 1  A
A             B

बस के साथ एक लाइनब्रेक प्रिंट किया जा सकता है ?


विशेष रूप से मुद्रण संख्याओं पर: एक स्थान संख्या से पहले मुद्रित किया जाता है यदि यह nonnegative है; अन्यथा, एक ऋण चिह्न -वहाँ मुद्रित होता है। संख्या के बाद एक स्थान भी मुद्रित किया जाता है। इन रिक्त स्थानों से छुटकारा पाने के लिए मैंने जो सबसे अच्छा तरीका खोजा है PRINT USINGवह है - डडनो यदि आप इस उत्तर को जोड़ना चाहते हैं या यदि यह एक अलग उत्तर होना चाहिए।
DLosc

2

WRITE के स्थान पर उपयोगी हो सकता है PRINT

PRINTआमतौर पर जिस तरह से आप आउटपुट करना चाहते हैं, यह बहुत लचीला है और ?शॉर्टकट है। हालाँकि, WRITEकमांड आपको विशिष्ट परिस्थितियों में बाइट्स बचा सकता है:

  • एक स्ट्रिंग को आउटपुट करते समय, WRITEइसे डबल कोट्स ( ") में लपेटता है । यदि आपको दोहरे उद्धरण चिह्नों के साथ आउटपुट की आवश्यकता है, WRITE s$तो इससे बहुत कम है ?CHR$(34);s$;CHR$(34)। उदाहरण के लिए, सबसे कम ज्ञात QBasic quine देखें
  • एक नंबर आउटपुट करते समय, WRITEऐसा करने से पहले और बाद में रिक्त स्थान नहीं जोड़ता PRINTहै। WRITE nसे बहुत छोटा है ?MID$(STR$(n),2)। उदाहरण के लिए, QB64 में FizzBuzz देखें
  • कई मानों को आउटपुट करते समय, WRITEउन्हें कॉमा से अलग करता है: WRITE 123,"abc"आउटपुट 123,"abc"। मैं ऐसे परिदृश्य के बारे में नहीं सोच सकता जहाँ यह उपयोगी होगा, लेकिन इसका मतलब यह नहीं है कि कोई भी ऐसा नहीं है।

की सीमाएं WRITE:

  • इसके साथ विभाजक के बिना कई मानों को आउटपुट करने का कोई तरीका नहीं है PRINT a;b
  • आउटपुट के अंत में न्यूलाइन को दबाने का कोई तरीका नहीं है। (आप इसके साथ काम करने में सक्षम हो सकते हैं LOCATE, लेकिन इसकी कीमत बहुत अधिक है।)

1

कभी-कभी, QBasic कार्यों के लिए इनपुट मांगता है। गाली कि!

कुछ ऐसे फ़ंक्शन हैं जो स्ट्रिंग्स के बजाय वर्णों पर काम करते हैं, लेकिन charQBasic में डेटाटाइप नहीं है , केवल string ($)प्रकार है। उदाहरण के लिए ASC()फ़ंक्शन लें , जो किसी वर्ण के लिए ASCII कीकोड देता है। अगर हम प्रवेश करेंगे

PRINT ASC("lala")

केवल पहले l QBasic द्वारा विचार किया जाएगा। इस तरह, हमें एक स्ट्रिंग को 1 लंबाई तक काटने से परेशान नहीं होना है।

एक और उदाहरण इस सवाल से आता है जहां STRING$()फ़ंक्शन का उपयोग उत्तरों में से एक में किया जाता है।

STRING $ फ़ंक्शन दो तर्कों, एक संख्या n और एक स्ट्रिंग s $ लेता है, और एक स्ट्रिंग का निर्माण करता है जिसमें $ s के पहले वर्ण की n प्रतियाँ होती हैं।

@ डलास, यहाँ

ध्यान दें कि QBasic, जब एक बहु-चार स्ट्रिंग की पेशकश की जाती है और केवल एक चार की आवश्यकता होती है, स्वचालित रूप से पहले चार लेता है और बाकी को अनदेखा करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.