& & और || के बीच स्पष्ट विचलन के अलावा || सभी उत्तर बातों के बारे में बात करते हैं, मुझे थोड़ा और आगे जाने दो, एक और झुकाव स्पष्ट करने के लिए (वास्तव में एक बग नहीं, बल्कि एक डिजाइन कमजोरी): आप "हाँ या नहीं" कुछ भी स्वीकार करते हैं और यदि उत्तर आपको "हाँ" जैसा दिखता है बाहर जाएं। कुछ और नहीं जैसे ना। यहां तक कि "एक कप कॉफी"।
एक बेहतर तर्क तर्क को सुसंगत होने के लिए मजबूर होना चाहिए।
अपने मुख्य कार्यक्रम आप
bool do_exit = false;
while(!do_exit)
{
//All useful stuff and then ...
do_exit = getAnswer(std::cin, std::cout,
"Do you want to exit? [yes/no]",
"please answer yes or no");
}
या, अधिक concisely की तरह सबसे अधिक संभावना कुछ करना चाहिए में,
for(bool do_exit=false, !do_exit, do_exit=getAnswer(
"Do you want to exit? [yes/no]",
"please answer yes or no"))
{
//usefull stuff here
}
अब, की सुविधा देता है इस सवाल का जवाब तर्क में मिल:
आप करने के लिए है इनपुट की एक पंक्ति प्राप्त करें (केवल एक शब्द नहीं: एक पंक्ति, क्योंकि मैं "हाँ, मैं चाहता हूं" टाइप कर सकता हूं), इसलिए cin>>string
अच्छी तरह से नहीं खेलता है: बेहतर std::get_line
। यदि यह "हां" सच है, तो "नहीं" झूठी वापसी करता है और यदि कुछ और पढ़ने को दोहराता है।
bool getAnswer(std::istream& istr, std::ostream& ostr,
const std::string& prompt, const std::string& reprompt)
{
ostr << prompt << std::endl;
for(;;)
{
std::string line;
std::getline(istr,line);
if(line == "yes" || line == "Yes" || line == "Y" || line == "y")
return true;
if(line == "no" || line == "No" || line == "N" || line == "n")
return false;
ostr << reprompt << std::end;
}
}
यह आपको अच्छी तरह से जाना "हाँ या ना" वेरिएंट स्वीकार करते हैं, लेकिन कुछ और मना कर देता है।
आगे भी जाकर, हम इस विचार को समझ सकते हैं कि cin/cout अन्य प्रकार की धाराएं हो सकती है, और हो सकता है कि कोई भी "टाइपिंग" न हो।
अनंत लूप में जाने के लिए से बचने के लिए, हम एक प्रयास सीमा लागू कर सकते हैं और अगर यह तक पहुँच जाता है एक अपवाद फेंक:
bool getAnswer(std::istream& istr, std::ostream& ostr,
const std::string& prompt, const std::string& reprompt)
{
ostr << prompt << std::endl;
for(int attempt=5; attempt>0; --attempt)
{
std::string line;
std::getline(istr,line);
if(line == "yes" || line == "Yes" || line == "Y" || line == "y")
return true;
if(line == "no" || line == "No" || line == "N" || line == "n")
return false;
if(attempt>1)
ostr << reprompt << " ("<<attempt-1<<" attempts remaining)"<<std::endl;
}
throw std::domain_error("cannot get valid input");
}
और फोन करने वाले अंत में पकड़ने के लिए जाने और कुछ अन्य कार्रवाई करते हैं, या अंत में कृपा से समाप्त करें।
इसके अलावा, हम केवल आई/ओ और प्रश्नों को ही नहीं, बल्कि उत्तर भी कर सकते हैं, लेकिन यह बहुत दूर हो रहा है।
'' '' '' && 'बदलें। – Maroun
क्यों और अब मैं वास्तव में उलझन में हूं। जबकि हां नहीं, नहीं, फिर लूपिंग रखें, अगर "हां" या "नहीं" तो लूप को तोड़ें – airsoftFreak
मैंने स्पष्टीकरण को उत्तर के रूप में जोड़ा क्योंकि यह टिप्पणी में फिट नहीं है। – Maroun