একটি স্যুইচ বিবৃতিতে একটি স্যুইচ কমাতে?


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ফরাসি ফর্ম হয়।
rojomoke

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
@ উত্সাহক ডিফল্টরূপে এটি করুন এবং ব্যতিক্রমী কেসগুলি পৃথকভাবে পরিচালনা করুন।
Val,

17
… এবং এটি এমন একটি ফাংশন তৈরি করুন genderToTitleযাতে আপনাকে এটির পুনরাবৃত্তি করতে না হয়? (বা একটি লুপ ব্যবহার করুন)
বার্গি

18

মূল সমাধান: ব্যবহারকারীকে তাদের নিজস্ব শিরোনাম (আপনার দেওয়া পূর্বনির্ধারিত তালিকা থেকে) নির্দিষ্ট করতে দিন।

আপনার সমাধান (যেমন ইংরাজির চোখের মাধ্যমে দেখা যায়) কেবল লর্ডস ("স্যার") এবং মহিলাদের জন্য দেখা দেয়; বৈবাহিক অবস্থান এবং ব্যক্তিগত মতামতের উপর নির্ভর করে বেশিরভাগ পুরুষকে "মিঃ" হিসাবে সম্বোধন করা হত, বেশিরভাগ মহিলাকে "মিস", "মিসেস" বা "মিস" হিসাবে অভিহিত করা হত। তারপরে পেশাদার স্ট্যান্ডিংয়ের উপর ভিত্তি করে অন্যান্য সম্মানজনক কিছু রয়েছে - "ডক্টর", "অধ্যাপক", "শ্রদ্ধা" এবং এমনকি যদি আপনি নিজের সাইট সম্পর্কে সত্যই আশাবাদী বোধ করেন তবে "পবিত্রতা"!

সহজ সমাধান: "লিঙ্গ" কে সম্মানিত করে অনুবাদ করতে আপনার একটি [একক] ফাংশন প্রয়োজন। এটি একবার কোড করুন এবং উভয় লোকের জন্য কল করুন:

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

এখানে সমস্যাটি হ'ল: ডেটাবেসটিতে যা কিছু আছে তার উপরে আমার কোনও নিয়ন্ত্রণ নেই। তবে আপনার অতিরিক্ত তথ্যের জন্য ধন্যবাদ, এটি প্রশংসা করুন :)
মফেল্টে

8
Dear Sirঠিকানার ফর্ম হিসাবে সমস্ত পুরুষদের জন্য পুরোপুরি গ্রহণযোগ্য। আমি সম্মত হই যে শিরোনাম হিসাবে স্যার (যেমন হিসাবে Sir Phill) কেবল নাইটগুলিতে সীমাবদ্ধ করা উচিত (প্রভু নয়) তবে এটি ভিন্ন বিষয়।
রোজমোক

1
এটি কীভাবে ডাটাবেসে অ্যাক্সেসের প্রয়োজন হবে তা আমি দেখছি না। এটি আমার কাছে এটি করার সবচেয়ে পরিষ্কার পদ্ধতি। অন্যান্য দুর্দান্ত সুইচ হ্রাস রয়েছে, তবে এটি সবচেয়ে পরিষ্কার প্রতিস্থাপন, পাশাপাশি যুক্তিটিকে সুন্দরভাবে মডুলাইজ করা।
ড্যান

4
@রোজমোক না, এটি আলাদা বিষয় নয়। এই প্রশ্নটি "প্রিয় স্যার (এখানে নাম সন্নিবেশ করান)" সম্পর্কে, একটি সরল "প্রিয় স্যার" সম্পর্কে নয়। "প্রিয় মহাশয় (সন্নিবেশ এখানে নাম)" হয় ব্যবহার "স্যার" একটি শিরোনাম হিসাবে।
এইচডিভি

বিএ ঘন ঘন ফ্লায়ার সাইনআপ পৃষ্ঠায়, প্রায় ২০০৩ এর প্রায় শিরোনামের তালিকায় ড্রপ-ডাউন তালিকায় "তার পবিত্রতা" ছিল। এখনও আমি জানি সমস্ত কি করে। আমার মনে আছে কারণ ড্রপ-ডাউনটি এত দীর্ঘ ছিল যা আমরা সংহত করে যাচ্ছিলাম সেই পোর্টেবল ব্রাউজারটি ক্র্যাশ করেছে। আমি একটি মুক্ত ক্ষেত্রের প্রস্তাব দেব, বিশেষত বিএ বাদে সম্ভবত ডিবেটসের সাথে পরামর্শ করে এবং বিভিন্ন প্রসঙ্গে প্রতিটি শিরোনামের একাধিক রূপ জানেন (নূন্যতম হিসাবে বিভিন্ন খামের ঠিকানা এবং অভিবাদন)
স্টিভ জেসোপ

9

শিরোনামগুলি সত্যই ডাটাবেসের অন্তর্ভুক্ত, তবে আপনি বলেছিলেন যে এটির উপর আপনার কোনও নিয়ন্ত্রণ নেই। আপনি কোনও ভাষার ট্যাগ নির্দিষ্ট করেন নি তবে বাক্য গঠনটি সি পরিবারে রয়েছে, সুতরাং এটি সিউডোকোড হবে যা প্রায় সি ++:

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যদি কেউ এর পরিবর্তনের অনুমতি দেয় তবে তা ছাড়তে পারেন।
Deduplicator

@ অনুগ্রহকারী অবশ্যই স্পষ্টভাবে, আরও ভাল উপায় আছে। আমি এখানে সরলতার জন্য যাচ্ছি যে এখানে কোনও ভাষা ট্যাগ নেই তবে এটি দেখতে সি ++ এর মতো। তবে আপনি সি ++ 11 ধরে ধরে ঠিক আছেন।

3

র্যাচিট খামখেয়াল এর উত্তর বেশ একটি ভাল ধারণা যদি বাক্য সব একই প্যাটার্ন আছে, কিন্তু দুই insets, এক সাথে শুধুমাত্র উপর নির্ভরশীল 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
যদি আপনি এটি করেন, কাপকেকসের ভালবাসার জন্য এটি এটিকে বা অন্য কিছুতে রেখে দেয় এবং স্যুইচ থেকে মুক্তি পান .... অভিবাদন ['এমএম'] = "প্রিয় স্যারস"; অভিবাদন ['এমএফ'] = "প্রিয় ম্যাডাম এবং স্যার"; কাঙ্ক্ষিত স্যালুটেশন = অভিবাদন [জেন্ডার 1 + লিঙ্গ 2];
জেডিটি

1
@ জেডিটি অভিধান ?
gnat

এটিকে কী বলা যায় তা ঠিক ভাষার উপর নির্ভর করে তবে মূলত কী এবং মানগুলির সংগ্রহ, হ্যাঁ।
জেডিটি

1
এতে একটি সামান্য পরিমার্জন রয়েছে, যা কেবল কোনও ভাষায় কাজ করে: উভয় ইনপুট-অক্ষর থেকে একটি একক পূর্ণসংখ্যা গণনা করুন এবং স্ট্রিংয়ের পরিবর্তে এটিকে স্যুইচ করুন।
Deduplicator

0

আপনি সাধারণত চাইবেন যে ইউআই স্ট্রিংগুলি স্থানীয়করণ এবং আপডেট করার সহজতার জন্য উত্স কোডটিতে হার্ড-কোডিং না হয়ে স্ট্রিং টেবিল থেকে টানুন। সুতরাং আমি যে পদ্ধতিটি গ্রহণ করব তা হ'ল লুকিং কী তৈরির জন্য ইনপুটগুলি ব্যবহার করা, যাতে এরকম কিছু:

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

ব্যবহারকারীদের নিজস্ব শিরোনাম নির্বাচন করতে দেওয়া সম্পর্কে অন্যান্য পরামর্শগুলি আপনার কাছে সেই তথ্য পাওয়ার সুযোগ থাকলে বৈধ। আমি এখনও সমাধানটিতে একটি স্ট্রিং টেবিল লুক ব্যবহার করব।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.