2012-01-03 8 views
5

ठीक से तुलना करना, इसलिए मैं एक पुस्तक में अभ्यास कर रहा हूं, विभिन्न प्रकार के धन को डॉलर में परिवर्तित कर रहा हूं। कुछ कारणों से जब मैं एक चर चर के लिए इनपुट के रूप में 'ई' टाइप करता हूं और इसे किसी ई कथन में 'ई' से तुलना करता हूं तो तुलना काम नहीं करती है, हालांकि अगर मैं इसे किसी दूसरे अक्षर से बदलता हूं तो यह ठीक काम करेगा। क्या बात है? यहाँ कोड:

1. system("pause"); की तरह कुछ का उपयोग करें कार्यक्रम रोक सकते हैं या यदि आप दृश्य स्टूडियो का उपयोग कर रहे हैं, जिससे कि डिबग विंडो के लिए इंतजार कर रहा है परियोजना सेटिंग्स में परिवर्तन करने के लिए:इनपुट के रूप में char 'e' लेना और

int main() 
{ 
    const double yen_per_dollar = .013; 
    const double pound_per_dollar = 1.55; 
    const double euro_per_dollar = 1.29; 

    double amount = 1; 
    char unit = ' '; 

    std::cout << "Please enter a amount followed by a unit (p, y, or e): "; 
    std::cin >> amount >> unit; 

    if (unit == 'y') 
     std::cout << amount << " yen is $" << amount * yen_per_dollar << " dollars.\n"; 
    if (unit == 'p') 
     if (amount == 1) 
      std::cout << amount << " pound is $" << amount * pound_per_dollar << " dollars.\n"; 
     else 
      std::cout << amount << " pounds is $" << amount * pound_per_dollar << " dollars.\n"; 
    if (unit == 'e') 
     if (amount == 1) 
      std::cout << amount << " euro is $" << amount * euro_per_dollar << " dollars.\n"; 
     else 
      std::cout << amount << " euros is $" << amount * euro_per_dollar << " dollars.\n"; 
    else 
     std::cout << "Sorry, that input isn't in the correct format." << std::endl; 
    std::cin >> amount; // Keeps window open 
} 
+8

¤ उस पर विचार करें उदा। '3.14e20'' डबल' मान का मान्य विनिर्देश है। चीयर्स और एचटी।, –

+0

अहह मैंने सोचा कि इसके साथ कुछ करने के लिए हो सकता है, बस ग्रेड स्कूल से नोटेशन याद रखना, पता नहीं था कि युगल इस तरह व्यक्त किया जा सकता है। धन्यवाद। – Fuddlebutts

+1

कृपया 'सिस्टम ("रोकें") जैसे मंच-निर्भर तकनीकों के साथ कृत्रिम रूप से अपने कार्यक्रमों को रोकें; '। यदि समस्या यह है कि "खिड़की बस गायब हो जाती है", तो प्रोग्राम को अलग-अलग चलाएं, जैसे खिड़की का जीवनकाल कार्यक्रम के जीवनकाल से बंधे नहीं है। आपका प्रोग्राम ** कमांड विंडो ** नहीं बनाता है, और इस तरह, इसे आसपास रखने के लिए तर्कसंगत रूप से ज़िम्मेदार नहीं है। –

उत्तर

-1

यहाँ अपने कार्यक्रम के लिए सुझाव दिए गए हैं आप निष्पादन के बाद।

2. अगले if कथनों के लिए आपको अन्य कथन का उपयोग करना चाहिए और ब्रेसिज़ से घिरा होना चाहिए। यहाँ एक उदाहरण आप इस तरह से यह कर यदि आपका पिछला else बयान आप सही परिणाम दे देंगे है,

else if (unit == 'p') { 
    if (amount == 1) 
     std::cout << amount << " pound is $" << amount * pound_per_dollar << " dollars.\n"; 
    else 
     std::cout << amount << " pounds is $" << amount * pound_per_dollar << " dollars.\n"; 
} 

। अन्यथा आपको हमेशा "क्षमा करें, वह इनपुट सही प्रारूप में नहीं है" को छोड़कर 'ई' को छोड़ दिया जाएगा। वास्तव में, यह आपके कार्यक्रम में क्या हो रहा है।

3. आपको अपने int रिटर्न प्रकार main फ़ंक्शन के लिए return 0 कथन जोड़ना चाहिए।

टाइपिंग एसटीडी हर बार जब आप इस बयान एक बार जोड़ सकते हैं के बजाय 4.,

using namespace std; 

अपने preprocessors शामिल और बाद में इस तरह std namespace सहित छोड़ सकता है के बाद,

cout << "Please enter a amount followed by a unit (p, y, or e): "; 


5. ई है पूर्णांक/डबल आदि संख्यात्मक प्रकारों के साथ उपयोग करने के लिए एक आरक्षित चार। ई घातीय का मतलब है। मुद्रा दर्ज करते समय, स्पष्ट रूप से सीन को बताने से पहले एक स्पेस का उपयोग करें कि यह ई संख्यात्मक इनपुट का हिस्सा नहीं है। अन्यथा, आपको तारों का उपयोग करके इनपुट को पार्स करना होगा।

+0

ध्यान दें कि यदि आप 'मुख्य()' के अंत से एक स्पष्ट 'वापसी' छोड़ देते हैं, तो प्रभाव यह है कि आपने 'वापसी 0' लिखा था। केवल 'मुख्य()' को यह छूट मिलती है। मुझे यह बहुत पसंद नहीं है, लेकिन यह मानक व्यवहार है (और सी 99 भी इसका समर्थन करता है, और इसलिए सी 11 करता है)। "वापसी 0" का उपयोग कर –

+0

अच्छा होगा। पुराने दिनों में हमें प्रोग्रामिंग प्रतियोगिताओं में समय-समय पर त्रुटियों का संकलन मिला क्योंकि अधिकांश जज कंपाइलर ऐसा नहीं थे .. –

+0

स्पष्ट योग्यता अच्छी होगी यदि कार्यक्रम अनावश्यक नामस्थान सदस्यों सहित अच्छी राशि मेमोरी का उपभोग कर रहा है .. छोटे कार्यक्रमों के लिए स्पष्ट योग्यताएं ' बहुत मायने रखता हूँ –

2

बहुत सारी टिप्पणियां हैं लेकिन कोई समाधान नहीं है। वास्तव में, मैं एक अच्छा समाधान के साथ नहीं आ सकता था, या तो। सबसे अच्छा मैं सोच सकता हूं कि एक कस्टम num_get पहलू स्थापित करना है (यह अकेले निश्चित रूप से कोडवर्क को गृहकार्य समाधान के रूप में सौंपने के लिए उपयुक्त होने के रूप में नियम देता है): यह कुछ हद तक उन्नत चीजें हैं और मुझे नहीं लगता कि कई लोग कभी भी इस बारे में सोचो।

इसके अलावा, मुझे लगता है कि आप मुद्राओं को डेटा ड्राइव करना चाहते हैं, यानि प्रत्येक मुद्रा के लिए कोड शाखा रखने के बजाय, आप सभी मुद्राओं का वर्णन करने वाले किसी प्रकार का कंटेनर सेट करना चाहते हैं (बीटीडब्ल्यू, बहुवचन यूरो यूरो है)। परिणामी कार्यक्रम इस तरह कुछ दिखाई देगा:

#include <iostream> 
#include <locale> 
#include <string> 
#include <tuple> 
#include <map> 
#include <ctype.h> 

struct currency_get: 
    std::num_get<char> 
{ 
    iter_type do_get(iter_type it, iter_type end, std::ios_base&, std::ios_base::iostate& err, double& v) const 
    { 
     std::string input; 
     for (; it != end && (*it == '.' || *it == '-' || *it == '+' 
          || isdigit(static_cast<unsigned char>(*it))); ++it) 
     { 
      input.push_back(*it); 
     } 
     errno = 0; 
     if (input.empty()) 
     { 
      err |= std::ios_base::failbit; 
     } 
     else 
     { 
      v = strtod(input.c_str(), 0); 
     } 

     return it; 
    } 
}; 

int main() 
{ 
    typedef std::tuple<double, std::string, std::string> desc; 
    std::map<char, desc> currencies; 
    currencies['y'] = desc(0.013, "yen", "yen"); 
    currencies['p'] = desc(1.55, "pound", "pounds"); 
    currencies['e'] = desc(1.29, "euro", "euro"); 

    double amount(0); 
    char currency(' '); 
    std::locale loc(std::locale(), new currency_get); 
    std::cin.imbue(loc); 

    if (std::cin >> amount >> currency) 
    { 
     std::map<char, desc>::const_iterator it(currencies.find(currency)); 
     if (it != currencies.end()) 
     { 
      desc const& d(it->second); 
      std::cout << amount << " " << (amount == 1? std::get<1>(d): std::get<2>(d)) << " is " 
         << (std::get<0>(d) * amount) << " dollar" 
         << (std::get<0>(d) * amount == 1? "": "s") << "\n"; 
     } 
    } 
    else 
    { 
     std::cout << "input failed\n"; 
    } 
} 
+2

मुझे लगता है कि सबसे आसान समाधान उपयोगकर्ता को संख्या और मुद्रा विनिर्देशक के बीच एक जगह टाइप करने की आवश्यकता है। :) –

संबंधित मुद्दे