শর্ত A এর সাথে মিলে গেলে, ক্রিয়াকলাপ করার জন্য শর্ত বিয়ের সাথে মিল থাকা দরকার


148

আমার প্রশ্নটি হ'ল:

if (/* condition A */)
{
    if(/* condition B */)
      {
         /* do action C */
      }
    else
      /* ... */
}
else
{
   /* do action C */
}

একবারে দু'বার পরিবর্তে কেবলমাত্র সি কোডের ক্রিয়াকলাপ একবারে লেখা সম্ভব?

কীভাবে এটি সরল করা যায়?


56
একটি ক্রিয়াতে "অ্যাকশন সি" এর কোড রাখবেন?
কনকাউট

26
এই দু: খিত এই সত্যিই সি ++ এর সাথে সম্পর্কিত নয় প্রশ্ন HNQ পেয়েছিলাম: /
YSC

2
আমাকে সাহায্য করার জন্য আপনাকে সবাইকে ধন্যবাদ! শুরুতে, আমি ঠিক নিশ্চিত করতে চাই যে সবকিছু ঠিক আছে তাই আমি যদি নেস্টেড ব্যবহার করি তবে। কারণ এটি অনুমান করা সহজতম উপায়। আমি পরের বার প্রশ্ন জিজ্ঞাসা করার পরে আরও চেষ্টা করার চেষ্টা করব। সকলের দিনটি
শুভ হোক

13
এটি একটি খুব ভাল কৌশল: কোডটি লিখুন যা প্রথমে কাজ করে, তারপরে এটিকে মার্জিত এবং দক্ষ করার বিষয়ে চিন্তা করুন worry
কোড-শিক্ষানবিস

3
@ টিম আমি উত্তর হিসাবে এটি পোস্ট করেছি। সাইড নোটে, সেখানে কম ভোট দেখে দুঃখ হচ্ছে।
কনকাউট

উত্তর:


400

এই ধরণের সমস্যার ক্ষেত্রে আপনার প্রথম পদক্ষেপটি সর্বদা লজিক টেবিল তৈরি করা।

A | B | Result
-------------------
T | T | do action C
T | F | ...
F | T | do action C
F | F | do action C

একবার আপনি টেবিল তৈরি করার পরে, সমাধানটি পরিষ্কার।

if (A && !B) {
  ...
}
else {
  do action C
}

মনে রাখবেন যে এই যুক্তিটি সংক্ষিপ্ত হলেও ভবিষ্যতের প্রোগ্রামারদের বজায় রাখা কঠিন হতে পারে।


35
আমি সত্যিই পছন্দ করি যে আপনি ওপিকে কীভাবে এটি বিকাশ করবেন তা বুঝতে সহায়তা করার জন্য আপনি সত্য সারণীটি দেখিয়েছিলেন। আপনি কী এটিকে আরও একধাপ এগিয়ে নিয়ে যেতে পারেন এবং কীভাবে আপনি সত্যের টেবিল থেকে বুলিয়ান এক্সপ্রেশন পাবেন? প্রোগ্রামিং এবং বুলিয়ান যুক্তিতে নতুন কারও জন্য, এটি সম্ভবত মোটেও পরিষ্কার নয়।
কোড-শিক্ষানবিস

14
যদি মূল্যায়নের Bপার্শ্ব প্রতিক্রিয়া হয় তবে লজিক টেবিলটি তার জন্য অ্যাকাউন্টে থাকতে হবে।
ইয়াক্ক - অ্যাডাম নেভ্রামামন্ট

79
@ ইয়াক্ক আমার উত্তর দুটি কারণে পার্শ্ব প্রতিক্রিয়াগুলিকে সম্বোধন করে না। প্রথমত, সমাধানটির (কাকতালীয়ভাবে) সঠিক পার্শ্ব প্রতিক্রিয়া আচরণ রয়েছে। দ্বিতীয়ত, এবং আরও গুরুত্বপূর্ণ বিষয় হল, এ এবং বি এর পার্শ্ব প্রতিক্রিয়াগুলি হ'ল খারাপ কোড হবে এবং সেই ফ্রঞ্জের মামলা সম্পর্কে আলোচনা মূলত বুলিয়ান যুক্তি সম্পর্কে একটি প্রশ্নের বিচ্যুতি হবে।
QuestionC

52
সম্ভবত লক্ষ্য করার মতো, যদি A && !Bকেসটি কোনও অপ-অপশন হয়: !(A && !B)এর সমতুল্য !A || Bযার অর্থ আপনি if (!A || B) { /* do action C */ }খালি ব্লকটি এড়াতে পারেন এবং এড়াতে পারেন ।
কেআরয়ান

54
if (A && !B)ভবিষ্যতের প্রোগ্রামারদের যদি এটি বজায় রাখা সত্যিই কঠিন হয় তবে তাদের সাহায্য করার কোনও দরকার নেই।
রায়

65

আপনার দুটি বিকল্প রয়েছে:

  1. একটি ক্রিয়া লিখুন যা "অ্যাকশন সি" সম্পাদন করে।

  2. আপনার যুক্তিটি পুনরায় সাজান যাতে বিবৃতি দেওয়া আপনার এত বেশি নেস্টেড না থাকে। নিজেকে জিজ্ঞাসা করুন কী কী পরিস্থিতিতে "ক্রিয়া সি" ঘটতে পারে? "কন্ডিশন বি" সত্য হয় বা "শর্ত এ" মিথ্যা হয় এমনটি আমার কাছে লাগে। আমরা এটি "নট এ ও বি" হিসাবে লিখতে পারি। এটি সি কোডে অনুবাদ করা, আমরা পাই

    if (!A || B) {
        action C
    } else {
        ...
    }
    

এই ধরণের অভিব্যক্তি সম্পর্কে আরও জানতে, আমি "বুলিয়ান বীজগণিত", "প্রিডিকেট লজিক" এবং "প্রিডিকেট ক্যালকুলাস" গুগল করার পরামর্শ দিই। এগুলি গভীর গাণিতিক বিষয়। আপনার সব কিছু শেখার দরকার নেই, কেবলমাত্র মূল বিষয়গুলি।

আপনার "শর্ট সার্কিট মূল্যায়ন" সম্পর্কেও শিখতে হবে। এ কারণে, আপনার মূল যুক্তিটি হুবহু হ'ল অভিব্যক্তির ক্রমটি গুরুত্বপূর্ণ। যখন B || !Aযুক্তিযুক্তভাবে সমতুল্য হয় তবে এটি শর্ত হিসাবে ব্যবহার করা হলে "ক্রিয়া সি" কার্যকর করা হবে যখন Bএর মান নির্বিশেষে সত্য হয় A


15
@ ইয়াক্ক ডি-মরগানের আইন দেখুন।
কোড-শিক্ষানবিস

@ কোড-শিক্ষানবিস দয়া করে আমার খারাপ যৌক্তিক চিন্তাভাবনা ক্ষমা করুন। (! এ || বি) এবং (এএন্ডএন্ড! বি) এর মধ্যে কোনও পার্থক্য আছে কিনা তা জানতে চাই। মনে হচ্ছে উভয়ই আমার সমস্যার জন্য ঠিক আছে। আমি আপনার এবং প্রশ্নসির পদ্ধতির অর্থ approach
starf15h

6
@ স্টারফ 15 ঘন্টা আরও একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে: যেখানে "অ্যাকশন সি" কার্যকর করা হয়। এই পার্থক্যটি আমাদের দুটি সমাধানকে ঠিক সমান করে তোলে। আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি "ডি মরগানের আইনগুলি" গুগল করুন যা আপনাকে এখানে কী চলছে তা বুঝতে সহায়তা করবে।
কোড-শিক্ষানবিস

5
দুটি সমাধান ঠিক হয় সমতুল্য, কিন্তু ব্যবহারিক পার্থক্য হতে পারে ঠিক কি উপর নির্ভর করে ...হয় । যদি এটি কিছু না হয় (যেমন, "এই শর্তগুলি মেটানো হয় তবে সি করুন; অন্যথায় কিছু করবেন না"), তবে এটি স্পষ্টতই উচ্চতর সমাধান, কারণ elseবিবৃতিটি তখন পুরোপুরি বাদ দেওয়া যেতে পারে।
জানুস বাহস জ্যাকেট

1
এছাড়াও, এ এবং বি এর নামের উপর নির্ভর করে এই ব্যবস্থাটি প্রশ্নাবলীর বিন্যাসের চেয়ে কোনও মানুষের পক্ষে বেশি পঠনযোগ্য বা কম পাঠযোগ্য হতে পারে ।
মাইকেল - ক্লে শিরকি

15

আপনি বিবৃতিটি এভাবে সরল করতে পারেন:

if ((A && B) || (!A)) // or simplified to (!A || B) as suggested in comments
{
    do C
}

অন্যথায় পৃথক ফাংশনে 'সি' এর জন্য কোড রাখুন এবং এটিকে কল করুন:

DoActionC()
{
    ....
    // code for Action C
}
if (condition A)
{
    if(condition B)
      {
         DoActionC(); // call the function
      }
    else
      ...
}
else
{
   DoActionC(); // call the function
}

7
বা আরও সহজভাবেif (!A || B)
তাস

2
যৌক্তিকভাবে, ((A&&B) ||! A) (B ||! A) এর সমতুল্য
কোড-শিক্ষানবিস

@ কোড-শিক্ষানবিশ B || !Aহবে থেকে trueশুধুমাত্র যদি Bহয় trueআসলে চেক ছাড়া, Aস্বল্প-পরিক্রমার কারণে
CinCout

1
@ সিনকাউট ভাল পয়েন্ট। যদিও আমার বক্তব্যটি তাত্ত্বিক বুলিয়ান যুক্তির দৃষ্টিকোণ থেকে এখনও সত্য, আমি শর্ট সার্কিট বুলিয়ান অপারেটরদের কার্যকারিতা বিবেচনা করিনি। ভাগ্যক্রমে, আমার নিজের উত্তরটির সঠিক ক্রম রয়েছে।
কোড-শিক্ষানবিস

1
সুতরাং একটি যুক্তিযুক্ত দৃষ্টিকোণ থেকে, আদেশ কিছু যায় আসে না। তবে, রক্ষণাবেক্ষণ এবং পঠনযোগ্যতার দৃষ্টিকোণ থেকে, ঠিক কী দাঁড়াবে Aএবং Bতার উপর নির্ভর করে একটি বিশাল পার্থক্য থাকতে পারে ।
কোড-শিক্ষানবিস

14

প্যাটার্ন মেলানো একটি ভাষায়, আপনি সমাধানটি এমনভাবে প্রকাশ করতে পারেন যাতে প্রশ্নকারীর উত্তরের সত্যের ছকটি আরও সরাসরি প্রতিবিম্বিত হয়।

match (a,b) with
| (true,false) -> ...
| _ -> action c

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


10

সমস্যার বিবৃতি:

শর্ত A এর সাথে মিলে গেলে, ক্রিয়াকলাপ করার জন্য শর্ত বিয়ের সাথে মিল থাকা দরকার

অন্তর্নিহিত বর্ণনা : একটি এম বি , একটি যৌক্তিক প্রস্তাব সমান !A || B(অন্যান্য উত্তর হিসাবে উল্লিখিত):

bool implies(bool p, bool q) { return !p || q; }

if (implies(/* condition A */,
            /* condition B */))
{
    /* do action C */
}

সম্ভবত এটি inlineসি এর জন্য চিহ্নিত করুন এবং constexprপাশাপাশি সি ++?
einpoklum

@ আইনপোকলুম আমি সেগুলির কয়েকটি বিশদে প্রবেশ করিনি কারণ এই প্রশ্নটি সত্যই কোনও ভাষা নির্দিষ্ট করে নি (তবে সি-এর মতো সিনট্যাক্স সহ একটি উদাহরণ দিয়েছে), তাই আমি সি-এর মতো সিনট্যাক্স সহ একটি উত্তর দিয়েছি। ব্যক্তিগতভাবে আমি একটি ম্যাক্রো ব্যবহার করব যাতে শর্তটি বিহীনভাবে মূল্যায়ন করা না হয়।
জেমসডলিন

6

ওহ, এটি আমাকে আরও ছড়িয়ে দিয়েছে, তবে কোড-do action C অ্যাপ্রেন্টিসের দ্বারা নির্দেশিত হিসাবে আমাদের নীস্টড- elseব্লকটি চালানো বা চালানোর গ্যারান্টিযুক্ত রয়েছে , সুতরাং কোডটি এখানে সরল করা যেতে পারে:

if (not condition A or condition B) {
    do action C
} else {
    ...
}

এইভাবে আমরা 3 টি মামলা মারছি:

  1. নেস্টেড do action C আপনার প্রশ্নের যুক্তি প্রয়োজন condition Aএবং condition Bহতে true- এই যুক্তি, যদি আমরা 2 পৌঁছানোর য় শব্দটি if-statement তারপর আমরা জানি যে condition Aহয় trueএইভাবে সব আমরা নির্ণয় করা হয় প্রয়োজন condition Bহয়true
  2. নেস্টেড else আপনার প্রশ্নের যুক্তি মধ্যে -block প্রয়োজনীয় condition Aহতে trueএবং condition Bহতে false- একমাত্র উপায় যে আমরা পৌঁছতে পারে elseএই যুক্তি মধ্যে -block যদি হবে condition Aছিল trueএবং condition Bছিলfalse
  3. বাইরের elseআপনার প্রশ্নের যুক্তি মধ্যে -block প্রয়োজনীয় condition Aহতে false- এই লজিকে যদি condition Aমিথ্যা আমরা হয়do action C

আমাকে এখানে সোজা করার জন্য কোড-অ্যাপ্রেন্টিসের প্রপস। আমি তার উত্তরটি গ্রহণ করার পরামর্শ দেব , যেহেতু তিনি এটিকে সম্পাদনা না করে সঠিকভাবে উপস্থাপন করেছেন: /


2
নোট করুন যে "কন্ডিশন এ" এর আবার মূল্যায়ন করার প্রয়োজন নেই। সি ++ এ, আমাদের বাদ দেওয়া মাঝের আইন রয়েছে। যদি "শর্ত নয় এ" মিথ্যা হয়, তবে "শর্ত এ" অবশ্যই সত্য।
কোড-শিক্ষানবিস

1
সংক্ষিপ্ত-সার্কিট মূল্যায়নের কারণে, মিথ্যা Bহলেই মূল্যায়ন করা হবে !A। সুতরাং উভয় elseবিবৃতি কার্যকর করতে ব্যর্থ হতে হবে ।
কোড-শিক্ষানবিস

এমনকি শর্ট সার্কিট মূল্যায়ন !A || Bব্যতীত উভয়ই মিথ্যা !Aএবং Bমিথ্যা। সুতরাং, কার্যকর Aহবে যখন সত্য else। পুনর্নির্মাণ করার দরকার নেই A
কোড-শিক্ষানবিস

@ কোড-শিক্ষানবিস ভাল দুর্গন্ধ, চমৎকার পর্যবেক্ষণ, আমি আমার উত্তর সংশোধন করেছি, কিন্তু আপনার গ্রহণযোগ্যতা প্রস্তাব। আপনি ইতিমধ্যে কী রেখেছেন তা আমি কেবল ব্যাখ্যা করার চেষ্টা করছি।
জোনাথন মে

আমি আশা করি প্রতিটি কেস ব্যাখ্যা করার জন্য আমি আপনাকে আরও একটি ভোট দিতে পারতাম।
কোড-শিক্ষানবিস

6

যুক্তি ধারণাতে, আপনি নিম্নলিখিত হিসাবে এই সমস্যাটি সমাধান করতে পারেন:

f = ab +! a
f =?

একটি প্রমাণিত সমস্যা হিসেবে এই ফলাফল f = !a + b। সমস্যাটি প্রমাণ করার কয়েকটি উপায় রয়েছে যেমন সত্যের টেবিল, কর্নহো ম্যাপ ইত্যাদি।

সুতরাং সি ভিত্তিক ভাষাগুলিতে আপনি নিম্নলিখিত হিসাবে ব্যবহার করতে পারেন:

if(!a || b)
{
   // Do action C
}

PS: কর্নহো ম্যাপ আরও জটিল সিরিজের শর্তগুলির জন্য ব্যবহৃত হয়। এটি বুলিয়ান বীজগণিত প্রকাশগুলি সরল করার একটি পদ্ধতি।


6

যদিও ইতিমধ্যে ভাল উত্তর রয়েছে, আমি ভেবেছিলাম যে সত্যিকারের টেবিলটি মূল্যায়ন করার জন্য বুলিয়ান বীজগণিতের ক্ষেত্রে নতুন যে কারও কাছে এই পদ্ধতির আরও স্বজ্ঞাত হতে পারে।

প্রথম কাজটি আপনি করতে চান তা হ'ল আপনি কোন অবস্থার অধীনে সি কার্যকর করতে চান এটি যখন তখন হয় (a & b)। এছাড়াও যখন !a। সুতরাং তোমার আছে(a & b) | !a

আপনি যদি ছোট করতে চান তবে যেতে পারেন। "নরমাল" গাণিতিকের মতো, আপনিও গুণ করতে পারেন can

(a & b) | !a = (a | !a) & (b | !a)। ক | ! একটি সর্বদা সত্য, সুতরাং আপনি কেবল এটি পেরিয়ে যেতে পারেন, যা আপনাকে সর্বনিম্ন ফলাফল সহ ছেড়ে দেয়:b | !a । যদি আদেশটি কোনও তফাৎ করে, কারণ আপনি কেবলমাত্র খ কে পরীক্ষা করতে চান! যদি সত্য হয় (উদাহরণস্বরূপ! যখন একটি নালপয়েন্টার চেক হয় এবং বি @LordFarquaad তার মন্তব্যে নির্দেশিত মত পয়েন্টারে একটি অপারেশন), আপনি সম্ভবত দুটোকে স্যুইচ করতে চাই

অন্য ক্ষেত্রে (/ * ... * /) সি কার্যকর করা হয় না তা সর্বদা কার্যকর করা হবে, সুতরাং আমরা কেবল এটি অন্য ক্ষেত্রে রাখতে পারি।

এছাড়াও উল্লেখযোগ্য যে এটি সম্ভবত কোনও পদ্ধতিতে ক্রিয়া সি রাখার যে কোনও উপায় বোধ করে।

যা নিম্নলিখিত কোড সহ আমাদের ছেড়ে যায়:

if (!A || B)
{
    doActionC()  // execute method which does action C
}
else
{
   /* ... */ // what ever happens here, you might want to put it into a method, too.
}

আপনি আরও অপারেন্ডগুলির সাথে শর্তগুলিও হ্রাস করতে পারেন যা সত্যের টেবিলগুলির সাথে দ্রুত কুৎসিত হয়। আর একটি ভাল পন্থা কর্নোগ মানচিত্র। তবে আমি এখন এর গভীরে যাব না।


4

কোডটিকে আরও টেক্সটের মতো দেখতে বুলিয়ান পতাকা ব্যবহার করুন। যুক্তিটি বিশেষত অস্পষ্ট হলে মন্তব্য যুক্ত করুন।

bool do_action_C;

// Determine whether we need to do action C or just do the "..." action
// If condition A is matched, condition B needs to be matched in order to do action C
if (/* condition A */)
{
    if(/* condition B */)
      do_action_C = true; // have to do action C because blah
    else
      do_action_C = false; // no need to do action C because blarg
}
else
{
  do_action_C = true; // A is false, so obviously have to do action C
}

if (do_action_C)
  {
     DoActionC(); // call the function
  }
else
  {
  ...
  }


2

আমি কোনও পদ্ধতিতে সি বের করতে এবং তারপরে সমস্ত ক্ষেত্রে যত তাড়াতাড়ি সম্ভব ফাংশনটি থেকে বেরিয়ে আসব। elseশেষে একক জিনিস সহ ধারাগুলি সর্বদা সম্ভব হলে উল্টো করা উচিত। এখানে ধাপে ধাপে উদাহরণ রয়েছে:

এক্সট্র্যাক্ট সি:

if (A) {
   if (B)
      C();
   else
      D();
} else
   C();

প্রথমে ifপরিত্রাণ পেতে প্রথমে বিপরীত করুন else:

if (!A) {
   C();
   return;
}

if (B)
   C();
else
   D();

দ্বিতীয় থেকে মুক্তি পান else:

if (!A) {
   C();
   return;
}

if (B) {
   C();
   return;
} 

D();

এবং তারপরে আপনি লক্ষ্য করতে পারেন যে দুটি ক্ষেত্রে একই শরীর রয়েছে এবং একত্রিত হতে পারে:

if (!A || B) {
   C();
   return;
}

D();

উন্নতি করার জন্য alচ্ছিক জিনিসগুলি হ'ল:

  • প্রসঙ্গে নির্ভর করে, তবে যদি !A || Bবিভ্রান্তিকর হয় তবে উদ্দেশ্যটি ব্যাখ্যা করতে এটি এক বা একাধিক ভেরিয়েবলের সাথে বের করুন

  • যে কোনও C()বা D()অ-ব্যতিক্রমী D()কেসটি শেষ হওয়া উচিত, সুতরাং যদি ব্যতিক্রম হয়, তবে ifশেষ বারটিকে উল্টে দিন


2

পতাকা ব্যবহার করাও এই সমস্যার সমাধান করতে পারে

int flag = 1; 
if ( condition A ) {
    flag = 2;
    if( condition B ) {
        flag = 3;
    }
}
if(flag != 2) { 
    do action C 
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.