स्विच स्टेटमेंट में स्विच कैसे कम करें?


9

इसलिए मैं एक डेटाबेस से दो लोगों के आधार पर एक अभिवादन लाइन बनाने की विधि बना रहा हूं।

चार पैरामीटर हैं: दो नाम ( name1और name2) और दो लिंग ( genderऔर gender2)।

प्रत्येक लिंग संयोजन के लिए, मेरे पास एक अलग आउटपुट है।

उदाहरण के लिए: यदि लिंग 1 है M(पुरुष) और लिंग 2 भी है M, तो आउटपुट कुछ इस तरह होना चाहिए:

Dear Sir name1 and Sir name2,

इस समय, मेरा स्विच इस तरह दिखता है:

switch(gender1){
    case 'M':
        switch(gender2){
            case 'M': printf("Dear Sir %s and Sir %s", name1, name2); break;
            case 'W': printf("Dear Sir %s and Madame %s", name1, name2); break;
            case 'R': ...
        }
        break;
    case 'W':
        switch(gender2){
            case 'M': printf("Dear Madame %s and Sir %s", name1, name2); break
            case 'W': printf("Dear Madame %s and Madame %s", name1, name2); break;
            case 'R': ...
        }
        break;
    case ...etc.
}

ध्यान दें कि मैं कई लिंग विकल्प हैं, जैसे 'R'के लिए "Dear Relation"और कुछ और है कि मैं समय का अनुवाद करने की जरूरत नहीं है।

मैं इस डबल स्विच स्टेटमेंट को कैसे कम कर सकता हूं?

एक विधि में दूसरा स्विच डालना एक विकल्प नहीं है क्योंकि एक ऐसा मामला भी है जहां दोनों के नाम समान हैं और फिर आउटपुट को इस तरह संयोजित किया जाना चाहिए: "Dear Sir and Madame name1,"



1
यदि आपकी भाषा इसे अनुमति देती है, तो एक अभिव्यक्ति पर स्विच करें जो दोनों मानों के साथ भिन्न हो , जैसे gender1+gender2
किलियन फोथ

3
एक असंबंधित बिंदु पर, यहां उपयोग करने वाली महिला का शीर्षक है Madam, नहीं MadameMadameफ्रांसीसी रूप है।
रोजोमोक

3
थोड़ा अनावश्यक, लेकिन यह तथ्य कि आपका 'लिंग' चर 'पुरुष' हो सकता है, 'महिला' या 'संबंध' थोड़ा परेशान कर सकता है ...
धान

4
"ध्यान दें कि मेरे पास कई लिंग विकल्प हैं" ठीक है, यह निश्चित रूप से इन दिनों प्रचलन में है ...
ऑर्बिट

जवाबों:


32

शीर्षक को प्रिंटफ के मापदंडों में जोड़ें:

char* title1;
switch(gender1){
    case 'M':
        title1 = "Sir";
        break;
    case 'W':
       title1 = "Madam";
        break;
    case ...etc.
}
char* title2;
switch(gender2){
    case 'M':
        title2 = "Sir";
        break;
    case 'W':
       title2 = "Madam";
        break;
    case ...etc.
}
printf("Dear %s %s and %s %s", title1, name1, title2, name2);

आप पुन: प्रयोज्य और कॉम्पैक्टनेस के लिए अपने स्वयं के फ़ंक्शन पर स्विच निकाल सकते हैं।


1
यह कभी-कभी काम करता है, कभी-कभी नहीं ...
डेडुप्लिकेटर

4
@Deduplicator डिफ़ॉल्ट रूप से और असाधारण मामलों को अलग से संभालें।
वैल

17
... और इसे एक फ़ंक्शन बनाएं genderToTitleताकि आपको इसे दोहराना न पड़े? (या एक पाश का उपयोग करें)
Bergi

18

कट्टरपंथी समाधान: उपयोगकर्ता को अपना शीर्षक (पूर्वनिर्धारित सूची जो आप प्रदान करते हैं) से निर्दिष्ट करें ।

आपका समाधान (जैसा कि अंग्रेजी आंखों से देखा जाता है) केवल लॉर्ड्स ("सर") और महिलाओं के लिए पूरा करने के लिए प्रकट होता है; अधिकांश पुरुषों को "मि", ज्यादातर महिलाओं को "मिस", "मिसेज" या "मिस" के रूप में संबोधित किया जाएगा, जो उनकी वैवाहिक स्थिति और व्यक्तिगत राय पर निर्भर करता है। फिर पेशेवर स्टैंडिंग के आधार पर अन्य सम्मानों की एक पूरी श्रृंखला है - "डॉक्टर्स", "प्रोफेसर", "रेवरेंड्स" और यहां तक ​​कि, अगर आप अपनी साइट के बारे में वास्तव में आशावादी महसूस कर रहे हैं , "पवित्रता"!

सरल समाधान: आपको "लिंग" का सम्मान करने के लिए एक [एकल] फ़ंक्शन की आवश्यकता है। इसे एक बार कोड करें और इसे दोनों लोगों के लिए कॉल करें:

printf("Dear %s %s and %s %s" 
   , getTitle( gender1 ), name1 
   , getTitle( gender2 ), name2 
   ) ; 

यहाँ समस्या यह है: डेटाबेस पर मेरा कोई नियंत्रण नहीं है। लेकिन आपकी अतिरिक्त जानकारी के लिए धन्यवाद, इसकी सराहना करें :)
moffeltje

8
Dear Sirपते के रूप में सभी पुरुषों के लिए पूरी तरह से स्वीकार्य है। मैं सहमत हूं कि एक शीर्षक के रूप में, सर (के रूप में Sir Phill) शूरवीरों (न कि प्रभुओं) तक सीमित होना चाहिए, लेकिन यह एक अलग मामला है।
रोजोमोके

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

4
@rojomoke नहीं, यह कोई अलग बात नहीं है। यह प्रश्न "प्रिय महोदय (यहां नाम डालें)" के बारे में है, न कि एक सादे "प्रिय महोदय" के बारे में। "प्रिय महोदय (डालने यहाँ नाम)" है का उपयोग करते हुए "सर" एक शीर्षक के रूप।
hvd

बीए अक्सर फ़्लायर साइनअप पृष्ठ, शायद २००३ में, शीर्षक की ड्रॉप-डाउन सूची में "उसकी पवित्रता" थी। अभी भी मुझे पता है सभी के लिए है। मुझे याद है क्योंकि ड्रॉप-डाउन इतना लंबा था कि हम उस पोर्टेबल ब्राउज़र को क्रैश कर रहे थे जिसे हम एकीकृत कर रहे थे। मैं एक मुक्त क्षेत्र की सिफारिश करता हूं, सिवाय इसके कि बीए विशेष रूप से शायद डेब्रेट का संरक्षण करता है और विभिन्न संदर्भों के लिए प्रत्येक शीर्षक के कई रूपों को जानता है (न्यूनतम के रूप में अलग-अलग लिफाफे का पता और अभिवादन)
स्टीव जेसप

9

टाइटल वास्तव में डेटाबेस में होते हैं, लेकिन आपने कहा कि आपका इस पर कोई नियंत्रण नहीं है। आपने एक भाषा टैग निर्दिष्ट नहीं किया है, लेकिन सिंटैक्स C परिवार में है, इसलिए यह छद्म कोड होगा जो लगभग C ++ है:

map<string, string> titles;
titles.emplace("M", "Sir");
titles.emplace("F", "Madam");

cout << "Dear " << titles[gender1] << " " << name1 << " and "
     << titles[gender2] << " " << name2 << endl;

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



यह सी ++ 11 वाक्य रचना प्रारंभकर्ता साथ जाने के लिए एक अच्छा विचार हो सकता है, और यह कर रही है static const: static const map<string, string> titles{make_pair("M", "Sir"), make_pair("F", "Madam")};। यदि constइसे संशोधित करने की अनुमति दी जानी चाहिए , तो कोई भी इसे छोड़ सकता है।
डिडुप्लीकेटर

@ डेडप्लिकेटर निश्चित रूप से, एक बेहतर तरीका है। मैं यहाँ सादगी के लिए जा रहा था, वहाँ कोई भाषा टैग नहीं है लेकिन यह C ++ जैसा दिखता है। लेकिन आप सही हैं, C ++ 11 मान रहे हैं।

3

शाफ़्ट फ़्रीक का उत्तर एक अच्छा विचार है यदि वाक्य सभी समान पैटर्न हैं, लेकिन दो इनसेट्स के साथ, प्रत्येक केवल gender1संबंधित पर निर्भर है gender2

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

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

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

// Using a macro in C for readability. C++ would use a constexpr function
#define COMBINE(a, b) ((a<<CHAR_BIT)+b)

switch( COMBINE(gender1, gender2)) {
  case COMBINE('M', 'M'): 
    print "Dear Sirs";
    break;
  case COMBINE('M', 'F'): 
  case COMBINE('F', 'M'): 
    print "Dear Sir and Madam";
    break;
  ...
#undef COMBINE

बेशक, जैसा कि आप एक डेटाबेस से सभी चार इनपुट (2 नाम और 2 लिंग) प्राप्त कर रहे हैं, एक और तालिका जोड़कर और उस पर शामिल होने के लिए उचित सलामीकरण शायद अधिक लचीला और शायद ऊपर से आसान है।


2

यदि आपकी भाषा आपको ऐसा करने की अनुमति देती है, तो आप लिख सकते हैं

switch(gender1+gender2) {
  case "MM": 
    print "Dear Sirs";
    break;
  case "MF": 
  case "FM":
    print "Dear Sir and Madam";
    break;
  ...

यह आपके संस्करण से बेहतर नहीं है , क्योंकि अभी भी दोहराव है, लेकिन यह नेस्टेड से बचता है switch


5
यदि आप ऐसा करते हैं, तो कपकेक के प्यार के लिए इसे एक सरणी या कुछ और में डाल दें और स्विच से छुटकारा पाएं .... प्रणाम ['एमएम'] = "प्रिय Sirs"; प्रणाम ['एमएफ'] = "प्रिय महोदया और सर"; वांछितकरण = अभिवादन [लिंग १ + लिंग २];
JDT


क्या कहें जो वास्तव में भाषा पर निर्भर करता है, लेकिन मूल रूप से कुंजी और मूल्यों का एक संग्रह है, हाँ।
JDT

1
इसके लिए थोड़ा सा परिशोधन है, जो किसी भी भाषा में काम करता है: दोनों इनपुट-वर्णों से एक पूर्णांक की गणना करें, और उस पर स्विच करें, न कि एक स्ट्रिंग पर।
Deduplicator

0

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

var lookupKey = "SALUTATION_" + gender1 + "_" + gender2;
var format = GetLocalizedString(lookupKey);
printf(format, name1, name2);

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

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