প্রাকৃতিক ভাষা থেকে সি ++ এক্সপ্রেশন


9

অ্যাসাইনমেন্ট:

নিম্নলিখিত প্রাকৃতিক ভাষা এক্সপ্রেশন সি অনুবাদ করুন। ধরে নিন যে সমস্ত ভেরিয়েবলগুলি অ-নেতিবাচক সংখ্যা বা বুলিয়ান (মান সত্য বা মিথ্যা)।

স্বভাবিক ভাষা:

হয় ক এবং খ উভয়ই মিথ্যা বা সি সত্য, তবে উভয়ই নয়।

আমার সমাধান:

(a==0 && b==0)xor(c==1)

অধ্যাপকদের সমাধান:

(!a && !b) != c

প্রশ্নাবলী:

  1. আমি মনে করি আমি প্রথম বন্ধনীটি সামান্যই বুঝতে পেরেছি, "নন-এ" এবং "নট-বি" বলে আমি মনে করি যে a এবং b অবশ্যই ভুল হতে হবে, তবে শুরুর দিকে আব শূন্য হিসাবে ধরে নেওয়া হয়। রাইট?

  2. তবে সেই অংশটি কী বলে যা "অসম থেকে সি" বলে?

  3. আমি অধ্যাপকদের সমাধানটি বুঝতে পারি না, কেউ কি আমার জন্য এটি ভেঙে দিতে পারে?

সাহায্যের জন্য আপনাকে ধন্যবাদ!


সাধারণভাবে আমি কথ্য ভাষা বুলিয়ান এক্সপ্রেশনগুলি কোডে অনুবাদ করে যত্নবান হতে চাই। একটি সাধারণ ভুল হ'ল "A সমান বি বা সি" এর a == b or cপরিবর্তে অনুবাদ করা a == b or a ==c। সমস্যাটি হ'ল কথ্য
ল্যাঙ্গুয়েজটি অনর্থক

উত্তর:


5

আমি এটা ধরে নেব a, bএবং cআছে bool

আসুন কিছু সত্য সারণী আঁকুন:

| a | !a | a==1 | a==0 |
| 0 |  1 |   0  |   1  |
| 1 |  0 |   1  |   0  |

আপনি দেখুন করতে পারেন, aএবং a==1সমতুল্য, এবং !aএবং a==0এছাড়াও হয় সমতুল্য, তাই আমরা পুনর্লিখন করতে (a==0 && b==0)xor(c==1)যেমন (!a && !b) xor c

এখন আরও কিছু সত্যের ছক:

| a | b | a xor b | a != b |
| 0 | 0 |    0    |    0   |
| 0 | 1 |    1    |    1   |
| 1 | 0 |    1    |    1   |
| 1 | 1 |    0    |    0   |

সুতরাং a!=bসমতূল্য a xor bতাই আমরা পুনর্লিখন করতে পারেন (!a && !b) xor cথেকে (!a && !b)!=c। যেমন আপনি দেখতে পাচ্ছেন, আপনার সমাধানগুলি সম্পূর্ণরূপে সমতুল্য, সবেমাত্র বিভিন্ন 'চিহ্ন' দিয়ে লেখা।


ইউপিডি : উল্লেখ করতে ভুলে গেছি। অধ্যাপকের সমাধান ঠিক সেভাবে দেখায় এমন কারণ রয়েছে।

অধ্যাপকের সমাধানটি আরও মূর্তিমান। আপনার সমাধানটি প্রযুক্তিগতভাবে সঠিক হলেও এটি কোনও ইডিয়োমেটিক সি ++ কোড নয়।

প্রথম সামান্য সমস্যাটি হ'ল ধরণের ব্যবহার। আপনার সমাধান মধ্যে রূপান্তর উপর নির্ভর intএবং boolআপনি একটি নম্বর বা ব্যবহারের বুলিয়ান মান তুলনা করুন xor, যা একটি 'বিট-জ্ঞানী একচেটিয়া বা' অভিনয় অপারেটর intগুলি খুব। একটি আধুনিক সি ++ এ সঠিক ধরণের মানগুলি ব্যবহার করা এবং এ জাতীয় রূপান্তরগুলির উপর নির্ভর না করার জন্য এটি অনেক বেশি প্রশংসিত হয় কারণ তারা কখনও কখনও ততটা স্পষ্ট এবং তর্ক করতে শক্ত হয় না। জন্য boolযেমন মান trueএবং falseপরিবর্তে 1এবং 0যথাক্রমে। এছাড়াও !=চেয়ে বেশি উপযুক্ত xorকারণ যখন টেকনিক্যালি boolগুলি নম্বর সংরক্ষণ করা হয়, কিন্তু sematically যদি আপনি কোন সংখ্যা, শুধু লজিক্যাল মান না।

দ্বিতীয় সমস্যাটিও মূর্খতা সম্পর্কে। এখানে এই ব্যবস্থার সবচেয়ে গুরত্বপূর্ণ: a == 0। বুলিয়ান ধ্রুবকের সাথে বুলিয়ান এক্সপ্রেশনগুলির তুলনা করা ভাল অভ্যাস হিসাবে বিবেচিত হয় না। আপনি ইতিমধ্যে জানেন a == trueযে পুরোপুরি ন্যায়বিচারের সমতুল্য a, এবং a == falseন্যায়সঙ্গত !aবা not a(আমি পরবর্তীকে পছন্দ করি)। সেই তুলনাটি কেন ভাল নয় তা বোঝার জন্য কেবল দুটি কোড স্নিপেটের তুলনা করুন এবং সিদ্ধান্ত নিন, যা পরিষ্কার is

if (str.empty() == false) { ... }

বনাম

if (not str.empty()) { ... }

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

@ কনরাড রুডল্ফ, ওহ, হ্যাঁ, আমি এটি উল্লেখ করতে পুরোপুরি ভুলে গেছি। সম্ভবত আমি আমার উত্তরটি সম্পাদনা করব, ধন্যবাদ
ইউরি কোভালেনকো

3

বুলিয়ান না, বিট না

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

বুলিয়ানদের তুলনা না করা কেন এটি নিরাপদ থাকা সত্ত্বেও 0 বা 1 এর সাথে তুলনা না করাই ভাল এই প্রশ্নটি দেখুন ।

ব্যবহার না করার একটি খুব ভাল কারণ xorহ'ল এটি বিট-ওয়াইজ এক্সক্লুসিভ বা অপারেশন। এটি আপনার উদাহরণে কাজ করার কারণ ঘটেছে কারণ বাম হাত এবং ডান হাত উভয়ই বুলিয়ান এক্সপ্রেশন যা 1 বা 0 এ রূপান্তর করে (আবার দেখুন 1 )।

বুলিয়ান একচেটিয়া-বা বাস্তবে !=

ভাবটি ভেঙে দেওয়া

আপনার অধ্যাপকের সমাধানটি আরও ভালভাবে বুঝতে, বুলিয়ান অপারেটরদের তাদের "বিকল্প টোকেন" সমতুল্য সঙ্গে প্রতিস্থাপন করা সবচেয়ে সহজ, এটি এটিকে আরও ভাল redable (imho) এবং সম্পূর্ণ সমতুল্য সি ++ কোডে রূপান্তরিত করে: 'এর জন্য নয়' ব্যবহার করে! ' এবং 'এবং' 'এবং' এর জন্য আপনি পাবেন

    (not a and not b) != c

দুর্ভাগ্যক্রমে, exclusive_orঅন্য কোনও লজিকাল অপারেটর নেই not_eq, যা এই ক্ষেত্রে সহায়ক নয়।

যদি আমরা প্রাকৃতিক ভাষার প্রকাশটি ভেঙে ফেলি:

হয় ক এবং খ উভয়ই মিথ্যা বা সি সত্য, তবে উভয়ই নয়।

প্রথমে বুলিয়ান প্রস্তাব এবং এ এবং বি সম্পর্কে বাক্যটিতে:

হয় এ বা বি, তবে উভয়ই নয়।

এটি অনুবাদ করে A != B(কেবল বুলিয়ানদের জন্য, কোনও ধরণের A এবং B এর জন্য নয়)

তখন প্রস্তাব ছিল এ

a এবং b উভয়ই মিথ্যা

যা হিসাবে বলা যেতে পারে

ক মিথ্যা এবং খ মিথ্যা

যা অনুবাদ করে (not a and not b)এবং শেষ পর্যন্ত

সি সত্য

যা কেবল অনুবাদ করে c। তাদের সংযুক্ত করে আপনি আবার পাবেন (not a and not b) != c

তারপরে এই অভিব্যক্তিটি কীভাবে কাজ করে তা আরও বিশদের জন্য আমি অন্যরা তাদের উত্তরে যে সত্য সারণীগুলি দিয়েছি তা স্থগিত করি।

তুমি দুজনেই ভুল

এবং যদি আমি নীটপিক করতে পারি: মূল অ্যাসাইনমেন্টে বলা হয়েছে যে ক, বি এবং সি অ-নেতিবাচক সংখ্যা হতে পারে, তবে নির্বিঘ্নে জানায়নি যে তারা যদি সংখ্যা হয় তবে তাদের মান 0 এবং 1 এর মধ্যে সীমাবদ্ধ করা উচিত যদি কোনও সংখ্যা থাকে তবে trueপ্রথাগত হিসাবে 0 টি প্রতিনিধিত্ব করে না , তবে নিম্নলিখিত কোডটি একটি আশ্চর্যজনক উত্তর দেবে :

    auto c = 2; // "true" in some way
    auto a = 0; // "false"
    auto b = 0; // "false"

    std::cout << ((!a && !b) != c);

// this will output: 1 (!)
// fix by making sure that != compares booleans:

    std::cout << ((!a && !b) != (bool)c);

ওয়েল আশা a, bএবং cহিসাবে ঘোষণা করা হয় bool, যা কেস c == 1হয় সঠিক , যদিও নৃশংস কোড। যাইহোক, এই উত্তরটি আমি লিখে ফেলতাম: ওপির কোডটি অধ্যাপকের সমতুল্য হতে পারে, তবে এটি খারাপ সি ++।
কনরাড রুডলফ

1
ওপি এর নিয়োগ লেখা থেকে @KonradRudolph: variables are non-negative numbers or boolean। সুতরাং +1 থেকে @ ধাভিণীথকে এমন একটি বিশদ যা আপনি এখানকার বেশিরভাগ লোকই মিস করেছেন (আমাকে প্রাথমিকভাবে, প্রাথমিকভাবে) মিস করার জন্য তা থেকে পেয়েছেন।
ফ্রডোইন

দুর্দান্ত, ইসি। ধন্যবাদ! তবে আপনি কি তখন আমার প্রফেসরের সমাধানটি আমাকে ব্যাখ্যা করতে পারেন কারণ আমি এটি বুঝতে পারি না।
লিওমনেড

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

2

আমি আরও কয়েকটি শব্দ দিয়ে ব্যাখ্যা করার চেষ্টা করব: সংখ্যাগুলি স্পষ্টভাবে বুলিয়ান মানগুলিতে রূপান্তরিত হতে পারে:

মান শূন্য (অবিচ্ছেদ্য, ভাসমান-বিন্দু, এবং আনস্কোপড গণনার জন্য) এবং নাল পয়েন্টার এবং নাল পয়েন্টার-থেকে-সদস্যের মানগুলি মিথ্যা হয়ে যায়। অন্যান্য সমস্ত মান সত্য হয়।

Cppreferences উপর উত্স

এটি নিম্নলিখিত সিদ্ধান্তে নিয়ে যায়:

  • a == 0একই হিসাবে !a, কারণ aএকটি বুলিয়ান রূপান্তরিত হয় এবং তারপরে উল্টানো, যা সমান !(a != 0)। একই খ জন্য যায়।

  • c==11 টির c সমান হলেই সত্য হয়ে উঠবে 1. রূপান্তরটি ব্যবহার (bool)cকরলে ফল পাওয়া যায় trueযখন c != 0ঠিক না c == 1। সুতরাং এটি কাজ করতে পারে , কারণ একজন প্রতিনিধিত্ব করতে সাধারণত 1 মান ব্যবহার করে trueতবে এটি গ্যারান্টেড নয়।

  • a != ba xor bকখন aএবং bআর বুলিয়ান এক্সপ্রেশন হিসাবে একই । এটি সত্য, যখন একটি মান বা অন্যটি সত্য হয়, তবে উভয়ই নয়। এই ক্ষেত্রে বাম হাতের দিকটি (a==0 && b==0)বুলিয়ান, সুতরাং ডান cহাতটিও বুলিয়ানে রূপান্তরিত হয়, সুতরাং, উভয় পক্ষকে বুলিয়ান এক্সপ্রেশন হিসাবে ব্যাখ্যা করা হয়, এইভাবে এই ক্ষেত্রে !=একই xor

অন্যান্য উত্তরগুলি সরবরাহ করে এমন সত্যচেতনার সাহায্যে আপনি এগুলি নিজেই পরীক্ষা করতে পারেন।


2

আমরা সত্যের টেবিলগুলি থেকে দেখতে পাচ্ছি:

  • !( not) এবং ==0একই ফলাফল দিন।
  • !=এবং xorএকই ফলাফল দিন।
  • c==1 ঠিক হিসাবে একই c

সুতরাং অন্যগুলির অধীনে একটি, এই 2 টি এক্সপ্রেশন কেন একই ফলাফল দেয় তা দেখায়:

(a==0 && b==0) xor (c==1)
(!a   && !b)   !=   c

সত্যের সারণী:

না

    |   | ! |
    | 0 | 1 |
    | 1 | 0 |

== 0

    |   |==0|
    | 0 | 1 |
    | 1 | 0 |

== 1

    |   |==1|
    | 0 | 0 |
    | 1 | 1 |

এবং

   | a | b | && |
   | 0 | 0 |  0 |
   | 0 | 1 |  0 |
   | 1 | 0 |  0 |
   | 1 | 1 |  1 |

সমান না

   | a | b | != |
   | 0 | 0 |  0 |
   | 0 | 1 |  1 |
   | 1 | 0 |  1 |
   | 1 | 1 |  0 |

XOR যাও

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