tutorial - the c++ programming language




उपयोगकर्ता परिभाषित सूत्रों की गणना(c++ के साथ) (6)

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

हम हमारे सी ++ प्रोग्राम में उपयोगकर्ता परिभाषित फ़ार्मुलों चाहते हैं। जैसे मूल्य v = x + (y - (z - 2)) / 2 बाद में प्रोग्राम में उपयोगकर्ता एक्स, वाई और जेड को परिभाषित करेगा -> प्रोग्राम को गणना के परिणाम को वापस करना चाहिए।
सोमवेन बाद में सूत्र परिवर्तित हो सकता है, इसलिए अगली बार जब कार्यक्रम सूत्र को पार्स करना चाहिए और नए मान जोड़ देगा।

किसी भी विचार / संकेत कैसे इस तरह कुछ करना है?

अब तक मैं इन सूत्रों की गणना करने के लिए एक पार्सर लिखने के लिए समाधान पर आया हूं - शायद इसके बारे में कोई विचार?


अपना जीवन आसान बनाने के लिए, मुझे लगता है कि इस तरह का इनपुट जीयूआई के माध्यम से सबसे अच्छा किया जाता है जहां उपयोगकर्ताओं को वे किस प्रकार में टाइप कर सकते हैं।

यदि आप कमांड लाइन से ऐसा करने की योजना बना रहे हैं (जो आपके पोस्ट से प्राप्त हुई छाप है), तो आपको संभवतः स्वीकार्य इनपुट का एक सख्त सेट परिभाषित करना चाहिए (उदा। केवल एक अक्षर चर, कोई सफेद स्थान नहीं, और केवल कुछ निश्चित गणितीय प्रतीकों: ( ) + - * / आदि)।

उसके बाद, आपको निम्न की आवश्यकता होगी:
इनपुट चार सरणी में पढ़ें
चर और कार्यों की सूची बनाने के लिए इसे पार्स करें
उन कार्यों को पूरा करें - बमडस के आदेश में


तीन संभव कार्यान्वयन के साथ आम तौर पर ऐसा करने के दो तरीके हैं:

  1. जैसा कि आपने खुद पर छुआ है, सूत्रों का मूल्यांकन करने के लिए एक पुस्तकालय
  2. कोड में सूत्र को संकलित करना

दूसरा विकल्प यहां आमतौर पर कुछ ऐसे संकलन करके किया जाता है जो एक प्लगइन के रूप में लोड किया जा सकता है, या इसे एक अलग प्रोग्राम में संकलित किया जा सकता है जो तब लाया जाता है और आवश्यक आउटपुट उत्पन्न करता है।

सी ++ के लिए मैं अनुमान लगाता हूं कि मूल्यांकन के लिए एक पुस्तकालय संभवत: कहीं मौजूद होगा, जहां मैं शुरू करूँगा।


यदि आप अपना स्वयं लिखना चाहते हैं, तो "औपचारिक ऑटोमेटा" और / या "परिमित राज्य मशीन व्याकरण" की खोज करें

आम तौर पर आप क्या करेंगे, पार्स स्ट्रिंग करेंगे, स्टैक पर वर्णों को धक्का देकर आप जायेंगे। फिर अक्षर बंद पॉप शुरू करें और क्या पॉप है के आधार पर कार्य करें। यह कोड के लिए आसान है अगर आप समीकरणों को रिवर्स पॉलिश नोटेशन पर बल देते हैं।


इसके लिए अपना खुद का पार्सर बनाना एक सीधे-आगे की कार्रवाई होनी चाहिए:

) इनफ़िक्स से पोस्टफिक्स नोटेशन (एक ठेठ कम्पस्की असाइनमेंट) से समीकरण को परिवर्तित करें (मैं एक स्टैक का उपयोग कर रहा हूं)) आप चाहते हैं कि मूल्यों को प्राप्त करने के लिए प्रतीक्षा करें) infix आइटमों के ढेर को पॉप कर दें, जहां की आवश्यकता वाले चर के लिए मान छोड़ें) प्रदर्शित करें परिणाम


एएनटीएलआर के साथ आप एक पार्सर / कंपाइलर बना सकते हैं जो उपयोगकर्ता इनपुट की व्याख्या करेगा, फिर विज़िटर पैटर्न का उपयोग करके गणना निष्पादित करें। एक अच्छा उदाहरण यहाँ है , लेकिन यह सी # में है। आप अपनी आवश्यकताओं के अनुसार इसे जल्दी से अनुकूलित कर सकते हैं और अपने विकास प्लेटफॉर्म के रूप में सी ++ का प्रयोग कर रहें।







c++