সংখ্যাটি দশটির একাধিক বা নির্দিষ্ট ব্যাপ্তির মধ্যে রয়েছে কিনা তা নির্ধারণ করা হচ্ছে


103

আমার প্রোগ্রামে আমার কয়েকটি লুপ দরকার। আমি সিউডো কোডটি লিখতে পারি তবে আমি কীভাবে এগুলি যুক্তিযুক্তভাবে লিখব তা সম্পূর্ণ নিশ্চিত নই।

আমার দরকার -

if (num is a multiple of 10) { do this }

if (num is within 11-20, 31-40, 51-60, 71-80, 91-100) { do this }
else { do this } //this part is for 1-10, 21-30, 41-50, 61-70, 81-90

এটি একটি সাপ এবং মই বোর্ড গেমের জন্য, যদি এটি আমার প্রশ্নের জন্য আরও কিছু বোঝায়।

আমি যদি প্রথম বিবৃতিতে আমার মডুলাসটি ব্যবহার করা দরকার তবে if (num == 100%10)তা সঠিক হবে?

দ্বিতীয়টি আমার কোনও ধারণা নেই। আমি এটিকে লিখতে পারি if (num > 10 && num is < 21 || etc)তবে এর চেয়ে স্মার্ট কিছু থাকতে হবে।


16
সাধারণত, ভাল কোডের দৈর্ঘ্য ইংরেজির দৈর্ঘ্যের সাথে সমানুপাতিক হয় যা এটি বর্ণনা করে। সুতরাং যখন আপনার "স্পেসিফিকেশন" 11-20, 31-40, 51-60, 71-80, 91-100 বলে, আপনি নিজের কোডটিও সেই সংখ্যাগুলি উল্লেখ করার আশা করতে পারেন। যদি এই সংখ্যাগুলি কোথাও থেকে আসে বা কোনও কারণে উত্পন্ন হয় তবে দেখুন সংখ্যাগুলির চেয়ে আপনি কারণটি কোড করতে পারেন কিনা see
লুউকি

39
@ ব্যবহারকারী 3419168: সংকলকটি আপনার কোডটি কতটা পঠনযোগ্য তা পাত্তা দেয় না; এটি এটি একটি সেকেন্ডের ভগ্নাংশে সংকলন করবে। তবে আপনার কোডটি পড়তে থাকা মানুষের পক্ষে, আপনি যে পছন্দগুলি করেন তা এটিকে সেকেন্ড, মিনিট, ঘন্টা বা কখনই না বোঝার কারণ হতে পারে। এটি একটি ব্যয় আরোপ করে; লোকেরা কোড পড়তে এবং বোঝার জন্য অর্থ প্রদান করে, তাই এগুলিকে সহজ করে দিন। পঠনযোগ্যতা সর্বাধিক করতে উত্পাদন কোডটি সর্বদা লিখুন এবং মনে রাখবেন সংক্ষেপে কোডটি আরও ভালভাবে সম্পাদন করে না।
এরিক লিপার্ট

2
@ আমেদাসড্রজাইস - আমি খুব কমই এটি করেছি তবে কেবল পারফরম্যান্সের সমালোচনা বিভাগে। সবচেয়ে কঠোর লুপটি যেটিকে 100M বার বলা হয় এটি যোগ্যতা অর্জন করে - যদি সাপ এবং মইয়ের কোনও খেলায় বিবৃতিটি না দেয়। আপনি যেখানে তাদের মধ্যে লাইন আঁকেন তা একটি ব্যক্তিগত পছন্দ।
ফ্লোরিস

2
আমি এটি বলতে ঘৃণা করি, তবে পর্যাপ্ত কর্পোরেট কাজ করে, নতুনদের সাথে রিয়েল কোড লেখার সাথে, আমাকে এটি জোর করে বলার পরামর্শ দিতে হবে। কারণ তখন নতুন ছেলেরা এটি বুঝতে পারবে এবং এটি ভাঙবে না। দুঃখজনক হলেও সত্য - কিছু ক্ষেত্রে এর স্মার্ট বোবা হতে।
রিচার্ড লে ম্যাসুরিয়ার

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

উত্তর:


86

প্রথমটির জন্য, কোনও সংখ্যাটি ব্যবহারের একাধিক কিনা তা পরীক্ষা করতে:

if (num % 10 == 0) // It's divisible by 10

দ্বিতীয়টির জন্য:

if(((num - 1) / 10) % 2 == 1 && num <= 100)

তবে এটি বরং ঘন, এবং আপনি কেবলমাত্র বিকল্পগুলি তালিকাভুক্তভাবে তালিকাভুক্ত করা থেকে ভাল হতে পারেন।


এখন আপনি কী করছেন সে সম্পর্কে আপনি আরও ভাল ধারণা দিয়েছেন, আমি দ্বিতীয়টি এইভাবে লিখব:

   int getRow(int num) {
      return (num - 1) / 10;
   }

   if (getRow(num) % 2 == 0) {
   }

এটি একই যুক্তিযুক্ত, তবে ফাংশনটি ব্যবহার করে আমরা এর অর্থ কী তা সম্পর্কে একটি পরিষ্কার ধারণা পাই।


79
if((num - 1) / 10) % 2 == 1 && num < 100)- আমি যদি দেখি তবে কেঁদে ফেলব।
ড্যানিয়েল কামিল কোজার

32
@ ড্যানিয়েল কামিলকোজার, আপনার যেমন করা উচিত।
উইনস্টন ইওয়ার্ট

2
@ ব্যবহারকারী 3419168, কেবল নিজের দ্বারা এটি পৃথিবীতে এর অর্থ কী তা অবাক করে দেয় one এটি বিশ্বের কী করার চেষ্টা করছে তা কোনও ইঙ্গিত দেয় না। এজন্য সম্পাদনায় আমি এমন একটি সংস্করণ দেখিয়েছি যা যুক্তিকে একটি ফাংশনে বিভক্ত করে তোলে যা গণনাগুলি আসলে কী করছে তা স্পষ্ট করে তোলে।
উইনস্টন ইওয়ার্ট

3
num >= 11(1) নিম্নোক্ত সীমাটি নিষিদ্ধ করা হয়েছে এবং (2) %নেতিবাচক সংখ্যায় একটি নেতিবাচক সংখ্যাও ফেরত দেওয়া বুদ্ধিমানের কাজ হতে পারে । (আমি অবশ্যই & 1এখানে ব্যবহার করা "নিরাপদ" তবে অতিরিক্ত জ্ঞানও গ্রহণ করব
umes

2
সম্পাদনাটির জন্য +1, এটি রেঞ্জের তালিকা কেন আসে এবং এটি পাঠযোগ্য উপস্থাপন করে। আইএমও, এক ধাপ উপরে getRow(num) % 2 == 0হ'ল এটি কোনও ক্রিয়াকলাপের মোড়কের পাশাপাশি ক্রিয়াসলটি কী উদ্দেশ্য তা কী তা পরিষ্কার করে দেবে। bool inEvenRow(int num){ return getRow(num) % 2 ==0;}
মিঃমিন্দর

40

যদি (সংখ্যা 10 এর একক হয়) {এটি করুন}

if (num % 10 == 0) {
  // Do something
}

যদি (সংখ্যাটি 11-20, 31-40, 51-60, 71-80, 91-100 এর মধ্যে হয়) this এটি করুন}

এখানে কৌশলটি হ'ল রেঞ্জগুলির মধ্যে এক ধরণের সাধারণতার সন্ধান করা। অবশ্যই, আপনি সর্বদা "ব্রুট ফোর্স" পদ্ধতিটি ব্যবহার করতে পারেন:

if ((num > 10 && num <= 20) ||
    (num > 30 && num <= 40) ||
    (num > 50 && num <= 60) ||
    (num > 70 && num <= 80) ||
    (num > 90 && num <= 100)) {
  // Do something
}

তবে আপনি লক্ষ্য করতে পারেন যে, যদি আপনি এটি 1থেকে বিয়োগ করেন তবে আপনার numব্যাপ্তি থাকবে:

10-19, 30-39, 50-59, 70-79, 90-99

অন্য কথায়, সমস্ত দুই-অঙ্কের নম্বর যার প্রথম অঙ্কটি বিজোড়। এর পরে, আপনাকে এমন একটি সূত্র নিয়ে আসা উচিত যা এটি প্রকাশ করে। আপনি 10 দ্বারা বিভাজক করে প্রথম সংখ্যাটি পেতে পারেন এবং আপনি যখন 2 দ্বারা বিভাজন করেন তখন 1 টির বাকী অংশ পরীক্ষা করে পরীক্ষা করে দেখতে পারেন যে এটিকে একসাথে রেখে:

if ((num > 0) && (num <= 100) && (((num - 1) / 10) % 2 == 1)) {
  // Do something
}

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

এটি কোডটি কাজ করতে পরবর্তী বিকাশকারীকে ধরে নিতে সহায়তা করে সশস্ত্র এবং আপনি কোথায় থাকেন তা জানে। :-)


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

3
ক্রিস, এটি একটি দুর্দান্ত কৌশল যখন "চতুরতা" এর সুস্পষ্ট সুবিধা থাকে: অনেক সংক্ষিপ্ত কোড (যার অর্থ একটি টাইপের কম সম্ভাবনা, বিশেষত যদি এটি পরিবর্তন হয়), বা দক্ষতার বৃহত উন্নতি। ব্রেভিটি, স্পষ্টতা এবং দক্ষতার মধ্যে প্রায় সবসময়ই একটি বাণিজ্য থাকে এবং একটি ভাল আপস খুঁজে পাওয়া একটি বিকাশ করার জন্য একটি দুর্দান্ত দক্ষতা। ( একটি স্নিকারীর জন্য স্ট্যাকওভারফ্লো. com/ a/ 2151844/29157 দেখুন ))
অ্যাডাম লিস

1
এটি অনেক ভাল পদ্ধতির। 'চতুর কোড' এর চেয়ে বোঝা এত সহজ এবং পারফরম্যান্সের পার্থক্য সম্ভবত नगणনীয়।
ব্যবহারকারী 1477388

@ অ্যাডলিস, হ্যাঁ, আমার মতামতের খুব কম মূল্য নেই কারণ এই সিদ্ধান্তগুলির ফলস্বরূপতা দেখার মতো অভিজ্ঞতা আমার নেই। আমি নিশ্চিত আমি শীঘ্রই যথেষ্ট করব, এবং প্রয়োজনে আমি দ্বিতীয় মতামতটি নিশ্চিত করবো।
ক্রিস

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

30

আপনি যদি জিসিসি বা কোনও সংকলক ব্যবহার করেন যা কেস রেঞ্জগুলিকে সমর্থন করে আপনি এটি করতে পারেন তবে আপনার কোডটি পোর্টেবল হবে না

switch(num)
{
case 11 ... 20:
case 31 ... 40:
case 51 ... 60:
case 71 ... 80:
case 91 ... 100:
    // Do something
    break;
default:
    // Do something else
    break;
}

1
আপনি আমাকে দয়া করে বলতে পারেন কেন এই কোডটি বহনযোগ্য নয়?
এম শরথ হেগডে

8
@ স্মারথ হেগডে কারণ এটির জন্য জিসিসি এক্সটেনশন প্রয়োজন, যা মানক অংশ নয় এবং কিছু সংকলক এটি সমর্থন করবে না
ব্রায়ান চেন

5
এটি সঠিক উত্তর, কারণ উদ্দেশ্যটি কী তা অবিলম্বে স্পষ্ট। মডুলোর সাথে এই সমস্ত 'চালাক' উত্তরগুলি রক্ষণাবেক্ষণের দুঃস্বপ্ন, এমনকি মন্তব্য সহ।
স্মার্কিংম্যান

@ স্মার্কিংম্যান প্রকৃতপক্ষে আমি মূল মন্তব্যে আমার মন্তব্যে যা বলেছিলাম। এটি একটি কর্পোরেট চাকরিতে নতুন কোডারদের কিছু অভিজ্ঞতার প্রয়োজন বুঝতে পারে যে স্পষ্টভাবে নিনজা উপায়ের চেয়ে সুস্পষ্ট উপায়টি প্রায়শই ভাল।
রিচার্ড লে ম্যাসুরিয়ার

15

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

template<typename It, typename Elem>
bool in_any_interval(It first, It last, const Elem &val) {
    return std::any_of(first, last, [&val](const auto &p) {
        return p.first <= val && val <= p.second;
    });
}

সরলতার জন্য, আমি একটি সুস্পষ্ট pairযুক্তির পরিবর্তে বহুবর্ষীয় ল্যাম্বডা (সি ++ 14) ব্যবহার করেছি । এটি সম্ভবত ব্যবহার <==স্ট্যান্ডার্ড অ্যালগরিদমের সাথে সামঞ্জস্য থাকতে হবে, তবে এটি যতক্ষণ Elemতার <=জন্য এটি সংজ্ঞায়িত করে কাজ করে works যাইহোক, এটি এটি ব্যবহার করা যেতে পারে:

std::pair<int, int> intervals[]{
    {11, 20}, {31, 40}, {51, 60}, {71, 80}, {91, 100}
};

const int num = 15;
std::cout << in_any_interval(std::begin(intervals), std::end(intervals), num);

এখানে একটি সরাসরি উদাহরণ রয়েছে


ঝরঝরে সমাধান। আমি সম্ভবত একটি একক অ্যারে ব্যবহার করতাম, যেহেতু আপনি জোড় উপস্থাপন করতে প্রতি লাইনে 2 নম্বর দিয়ে এটি ফর্ম্যাট করতে পারেন।
কেভিন লাম

@ হান্টারগুই 2, খুব ভাল বিষয়। আমি এটি জোড়ায় পরিচালনা করতে আসলে এটি পরিবর্তন করতে চলেছি কারণ আমি কেবল কোনও কারণে জিপ পুনরাবৃত্তকারীদের সম্পর্কে ভাবছিলাম।
ক্রিস

সত্যিই চমৎকার stl পদ্ধতির! এটা ভালবাসা!
হাইগুয়ারো

5

প্রথমটি সহজ। আপনাকে কেবলমাত্র আপনার নাম্বারটিতে মডুলো অপারেটর প্রয়োগ করতে হবে:

if ( ( num % 10 ) == 0)

যেহেতু সি ++ প্রতিটি সংখ্যাটি 0 হিসাবে সত্য নয় এটি মূল্যায়ন করছে, আপনি এটি লিখতেও পারেন:

if ( ! ( num % 10 ) )  // Does not have a residue when divided by 10

দ্বিতীয়টির জন্য, আমি মনে করি এটি বুঝতে পরিষ্কার:

প্রতি 20 টি প্যাটার্নটি পুনরাবৃত্তি করে, তাই আপনি 20 টি মডুলো গণনা করতে পারেন you আপনি যে সমস্ত উপাদান চান তা 20 এর দ্বারা বিভাজ্য অংশগুলি ব্যতীত এক সারিতে থাকবে।

এগুলি পেতে, নেতিবাচক সংখ্যার সাথে ডিল এড়াতে কেবল নাম্বার -1 বা আরও ভাল নাম্বার 19 ব্যবহার করুন।

if ( ( ( num + 19 ) % 20 ) > 9 )

এটি ধরে নিচ্ছে যে প্যাটার্নটি চিরতরে পুনরাবৃত্তি হয়, সুতরাং 111-120 এর জন্য এটি আবার প্রয়োগ করা হবে এবং আরও অনেক কিছু। অন্যথায় আপনার সংখ্যাগুলি 100 এ সীমাবদ্ধ করতে হবে:

if ( ( ( ( num + 19 ) % 20 ) > 9 ) && ( num <= 100 ) )

5

কোডটিতে বেশ কয়েকটি ভাল মন্তব্য সহ, এটি বেশ সংক্ষিপ্তভাবে এবং সহজেই লেখা যেতে পারে।

// Check if it's a multiple of 10
if (num % 10 == 0) { ... }

// Check for whether tens digit is zero or even (1-10, 21-30, ...)
if ((num / 10) % 2 == 0) { ... }
else { ... }

2
প্রথম মন্তব্য অপ্রয়োজনীয়। যে কোনও প্রোগ্রামার অল্প অভিজ্ঞতার সাথে জানতে পারবেন যে num % 10 == 0এটি num10 এর একাধিক হিসাবে একই জিনিস
জাস্টিন

7
হ্যাঁ তবে নতুনরাও এই সাইটটি পড়েন। আমি সেই মন্তব্যটি আমার নিজের কোডে সাধারণত ব্যবহার করব না তবে এটি প্রাথমিকভাবে যারা উত্তরসূচক প্রশ্নটি থেকে উপকৃত হবে তাদের উত্তরটি পরিষ্কার করে দেয়।
লা-কোমাদ্রেজা

2
দয়া করে কখনও এটি করবেন না। এটি পাঠককে ধীর করে এবং দু'বার সমস্ত কিছু পড়তে বাধ্য করে, পাঠযোগ্যতা হ্রাস করে। যে কোনও প্রোগ্রামার যে এটি বুঝতে পারে না তার if (num % 10 == 0)অর্থ আপনার কোড // Check if it's a multiple of 10বজায় রাখা উচিত নয় । এটি একটি সুপরিচিত অ্যান্টি-প্যাটার্ন।
দাউদ ইবনে কেরেম

1
@ ডেভিডওয়্যালিস উপরে মন্তব্য দেখুন। আমরা গ্যারান্টি দিতে পারি না যে এই পোস্টের পাঠকরা এই অ্যান্টি-প্যাটার্নটি জানবেন।
লা-কোমাদ্রেজা

1
না, আমি বোঝাতে চাইছি যে প্রতিটি লাইনে এটি কী করে তা মন্তব্য করা একটি বিরোধী-নিদর্শন। আমার অর্থ এই নয় যে ব্যবহার %করা একটি বিরোধী-প্যাটার্ন; অবশ্যই এটি না। সত্যই, ধরে নিচ্ছি যে এই পোস্টের অনেক পাঠকই শিক্ষানবিশ হবে, তাদের মন্তব্য লেখার এই ধরণটি প্রোগ্রামার হিসাবে তাদের বিকাশে একটি নেতিবাচক অবদান রাখছে।
দাউদ ইবনে কেরেম

4

আপনি মূলত উত্তরটি নিজেই ব্যাখ্যা করেছেন তবে এখানে কোডটি কেবল ক্ষেত্রে দেওয়া আছে।

if((x % 10) == 0) {
  // Do this
}
if((x > 10 && x < 21) || (x > 30 && x < 41) || (x > 50 && x < 61) || (x > 70 && x < 81) || (x > 90 && x < 101)) {
  // Do this
}

2
সংশোধন করুন x < 41 x > 50এবং প্রথম বন্ধনী স্থাপন করুন।
101010

1
টেকনিক্যালি @ 40 ম-এর operator&&চেয়ে বেশি অগ্রাধিকার রয়েছে operator||, সুতরাং এটি ঠিক আছে তবে আমি নিশ্চিত যে জিসিসি যাইহোক এটি সম্পর্কে সতর্ক করে দিয়েছে।
ক্রিস

18
বৈষম্য প্রতিনিধিত্বমূলক বিবেচনা 10 < x < 21যেমন 10 < x && x < 21বদলে x > 10 && x < 21। আপনি যখন গাণিতিকভাবে লিখতেন ঠিক একই ক্রমে থাকা অসমতাটি পড়া সহজ।
এরিক লিপার্ট

5
এই কোডটি মোটামুটি অপঠনযোগ্য এবং প্রকৃত যুক্তি সম্পর্কে খুব কম বলে। আমি এই উত্তর অপছন্দ করি।
দারিউজ

3
আমি এটিকে হুড়োহুড়ি করছি কারণ আপনি ওপি যা করেছেন ঠিক তার জবাব দিয়েছেন।
ব্রুনো ফেরেরিরা

3

আপনি এটি অতিরিক্ত বিবেচনা করা হতে পারে।

if (x % 10)
{
   .. code for 1..9 ..
} else
{
   .. code for 0, 10, 20 etc.
}

প্রথম লাইনটি if (x % 10)কাজ করে কারণ (ক) একটি মান যা 10 এর একাধিক '0' হিসাবে গণনা করে, অন্যান্য সংখ্যার ফলে তাদের অবশিষ্ট থাকে, (খ) এর মধ্যে 0 এর মান ifবিবেচিত হয় false, অন্য কোনও মান হয়true

সম্পাদনা:

কুড়ি দশকে পিছনে পিছনে টগল করতে, একই কৌশলটি ব্যবহার করুন। এবার, মূল সংখ্যাটি হ'ল 10:

if (((x-1)/10) & 1)
{
  .. code for 10, 30, ..
} else
{
   .. code for 20, 40, etc.
}

x/100 থেকে 9 হিসাবে 010 থেকে 19 এর মতো কোনও সংখ্যা প্রদান 1করে। সমান বা বিজোড় - এর উপর পরীক্ষা করা & 1- আপনাকে এটি বলছে যদি এটি সমান বা বিজোড় হয়। আপনার রেঞ্জগুলি আসলে "11 থেকে 20" হওয়ায় পরীক্ষার আগে 1 টি বিয়োগ করুন sub


1

পাঠযোগ্যতার জন্য একটি আবেদন

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

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

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

#include <stdio.h>

enum {NO, YES, WINNER};
enum {OUT_OF_RANGE=-1, ODD, EVEN};

int notInRange(int square) {
  return(square < 1 || square > 100)?YES:NO;
}

int isEndOfRow(int square) {
  if (notInRange(square)) return OUT_OF_RANGE;
  if (square == 100) return WINNER; // I am making this up...
  return (square % 10 == 0)? YES:NO;
}

int rowType(unsigned int square) {
  // return 1 if square is in odd row (going to the right)
  // and 0 if square is in even row (going to the left)
  if (notInRange(square)) return OUT_OF_RANGE; // trap this error
  int rowNum = (square - 1) / 10;
  return (rowNum % 2 == 0) ? ODD:EVEN; // return 0 (ODD) for 1-10, 21-30 etc.
                                       // and 1 (EVEN) for 11-20, 31-40, ...
}

int main(void) {
  int a = 12;
  int rt;
  rt = rowType(a); // this replaces your obscure if statement

  // and here is how you handle the possible return values:
  switch(rt) {
  case ODD:
    printf("It is an odd row\n");
    break;
  case EVEN:
    printf("It is an even row\n");
    break;
  case OUT_OF_RANGE:
    printf("It is out of range\n");
    break;
  default:
    printf("Unexpected return value from rowType!\n");
  }

  if(isEndOfRow(10)==YES) printf("10 is at the end of a row\n");
  if(isEndOfRow(100)==WINNER) printf("We have a winner!\n");
}

3
এটি কি খুব বেশি দূরে ঠেলে দেওয়ার চেষ্টা করছে না YESএবং NO?
rmobis

@ রাফেল_ - এটি ভাল হতে পারে: আমি কেবল "উদাহরণস্বরূপ" দেখছিলাম। অনেকে সত্য / মিথ্যা, স্পষ্টতই ব্যবহার করেন। কিন্তু আমার মনে আছে না করতে পারেন (কারণ বিভিন্ন ভাষায় বিভিন্ন নিয়মাবলী ব্যবহার করুন): হয় TRUE, Trueঅথবা true? এবং কি, যদি কোনও হয়, হেডার ফাইলগুলিকে আমার সাধারণ সি-তে অন্তর্ভুক্ত করা দরকার? তাই আমি আমার নিজের ঘূর্ণিত। অবাক হ'ল যদি এটাই কি ডাউনটা পেয়েছে ...
ফ্লোরিস

1

প্রথমটির জন্য:

if (x % 10 == 0)

এতে প্রয়োগ হবে:

10, 20, 30, .. 100 .. 1000 ...

দ্বিতীয়টির জন্য:

if (((x-1) / 10) % 2 == 1)

এর জন্য আবেদন করবে:

11-20, 31-40, 51-60, ..

আমরা প্রথমে x-1পেতে প্রথম :

10-19, 30-39, 50-59, ..

তারপরে আমরা তাদের ভাগ করে নিলাম 10:

1, 3, 5, ..

সুতরাং আমরা পরীক্ষা করি যে এই ফলাফলটি বিজোড়।


1

আপনি নিম্নলিখিত চেষ্টা করতে পারেন:

        // multiple of 10
        if ((num % 10) == 0)
        {
           // Do something
        }
        else if (((num / 10) % 2) != 0)
        {
            //11-20, 31-40, 51-60, 71-80, 91-100
        }
         else
        {
            //other case
        }

ও.পি. প্রশ্নে 10 এর একাধিকের জন্য চেকটি ব্যাপ্তি চেকের সাথে সম্পর্কিত নয়, এবং পরিসীমা চেকটিতে আপনার কোড ((20/10)% 2) - এর সাথে 11 এর একই পরিসরে থাকা দরকার -> ( 2% 2) -> 0
Serpiton

0

আমি জানি যে এই প্রশ্নের অনেক উত্তর রয়েছে তবে আমি যেভাবেই হোক আমার এখানে ফেলে দেবো ...

স্টিভ ম্যাককনেলের কোড সম্পূর্ণ থেকে নেওয়া , দ্বিতীয় সংস্করণ : "সিঁড়ি-পদক্ষেপ অ্যাক্সেস টেবিলগুলি:

তবুও অন্য ধরণের টেবিল অ্যাক্সেস হ'ল সিঁড়ি ধাপ পদ্ধতি। এই অ্যাক্সেস পদ্ধতিটি সূচক কাঠামোর মতো সরাসরি নয়, তবে এটি তত ডেটা স্থান নষ্ট করে না। সিঁড়ি-পদক্ষেপের কাঠামোর সাধারণ ধারণা, চিত্র 18-5-এ চিত্রিত, কোনও টেবিলের এন্ট্রিগুলি পৃথক ডেটা পয়েন্টের পরিবর্তে ডেটার সীমাগুলির জন্য বৈধ।

এখানে চিত্র বিবরণ লিখুন

চিত্র 18-5 সিঁড়ি-পদক্ষেপের পদ্ধতিটি একটি "সিঁড়ি" -কে যে স্তরে আঘাত করে তার স্তর নির্ধারণ করে প্রতিটি প্রবেশকে শ্রেণিবদ্ধ করে। এটি যে ধাপে আঘাত করে তার পদক্ষেপটি এটি নির্ধারণ করে।

উদাহরণস্বরূপ, আপনি যদি গ্রেডিং প্রোগ্রাম লিখছেন তবে "বি" প্রবেশের পরিধিটি 75 শতাংশ থেকে 90 শতাংশ পর্যন্ত হতে পারে। এখানে কোনও একক গ্রেডের প্রোগ্রাম করতে হতে পারে তা এখানে:

এখানে চিত্র বিবরণ লিখুন

সিঁড়ি-পদক্ষেপের পদ্ধতিটি ব্যবহার করতে, আপনি প্রতিটি ব্যাপ্তির উপরের প্রান্তটি একটি টেবিলের মধ্যে রাখেন এবং তারপরে প্রতিটি রেঞ্জের উপরের প্রান্তের বিরুদ্ধে স্কোর পরীক্ষা করতে একটি লুপ লিখুন। আপনি যখন স্কোরটি প্রথমে একটি ব্যাপ্তির শীর্ষের চেয়ে বেশি পয়েন্টটি সন্ধান করেন, আপনি গ্রেডটি কী তা জানেন। সিঁড়ি ধাপের কৌশলটি দিয়ে, আপনাকে অবশ্যই রেঞ্জগুলির শেষ পয়েন্টগুলি সঠিকভাবে পরিচালনা করতে সাবধান হতে হবে। ভিজ্যুয়াল বেসিকের এখানে কোড রয়েছে যা এই উদাহরণের ভিত্তিতে একদল শিক্ষার্থীদের গ্রেড প্রদান করে:

এখানে চিত্র বিবরণ লিখুন

যদিও এটি একটি সাধারণ উদাহরণ, আপনি একাধিক শিক্ষার্থী, একাধিক গ্রেডিং স্কিম (উদাহরণস্বরূপ, বিভিন্ন কার্যালয়ে বিভিন্ন পয়েন্ট স্তরগুলির জন্য বিভিন্ন গ্রেড) এবং গ্রেডিং স্কিমের পরিবর্তনগুলি সহজেই পরিচালনা করতে পারেন handle "

কোড সম্পূর্ণ , দ্বিতীয় সংস্করণ, পৃষ্ঠা 426 - 428 (অধ্যায় 18)।


কেন আপনি এই ভুল প্রশ্ন মনে করেন? আমি ওপি মামলায় উদাহরণ না দেওয়ার কারণে এর অর্থ এই নয় যে আমি ভুল প্রশ্নের উত্তর
দিয়েছি

0

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

এটি আপনার প্রোগ্রামটিকে আরও নমনীয় করে তুলতে সহায়তা করতে পারে, আপনি যদি পরে সিদ্ধান্ত নেন যে আপনি একটি 6 x 6 বোর্ডে গেমের বাচ্চাদের সংস্করণ চান বা একটি উন্নত সংস্করণ (যে আপনি সারা রাত ধরে খেলতে পারেন) 40 x 50 বোর্ডে চান ।

সুতরাং আমি নীচে এটি কোড করব:

// What is the size of the game board?
#define ROWS            10
#define COLUMNS         10

// The numbers of the squares go from 1 (bottom-left) to (ROWS * COLUMNS)
// (top-left if ROWS is even, or top-right if ROWS is odd)
#define firstSquare     1
#define lastSquare      (ROWS * COLUMNS)
// We haven't started until we roll the die and move onto the first square,
// so there is an imaginary 'square zero'
#define notStarted(num) (num == 0)
// and we only win when we land exactly on the last square
#define finished(num)   (num == lastSquare)
#define overShot(num)   (num > lastSquare)

// We will number our rows from 1 to ROWS, and our columns from 1 to COLUMNS
// (apologies to C fanatics who believe the world should be zero-based, which would
//  have simplified these expressions)
#define getRow(num)   (((num - 1) / COLUMNS) + 1)
#define getCol(num)   (((num - 1) % COLUMNS) + 1)

// What direction are we moving in?
// On rows 1, 3, 5, etc. we go from left to right
#define isLeftToRightRow(num)    ((getRow(num) % 2) == 1)
// On rows 2, 4, 6, etc. we go from right to left
#define isRightToLeftRow(num)    ((getRow(num) % 2) == 0)

// Are we on the last square in the row?
#define isLastInRow(num)    (getCol(num) == COLUMNS)

// And finally we can get onto the code

if (notStarted(mySquare))
{
  // Some code for when we haven't got our piece on the board yet
}
else
{
  if (isLastInRow(mySquare))
  {
    // Some code for when we're on the last square in a row
  }


  if (isRightToLeftRow(mySquare))
  {
    // Some code for when we're travelling from right to left
  }
  else
  {
    // Some code for when we're travelling from left to right
  }
}

হ্যাঁ, এটি ভার্ভোজ, তবে এটি গেম বোর্ডে ঠিক কী ঘটছে তা পরিষ্কার করে দেয়।

যদি আমি এই গেমটি কোনও ফোন বা ট্যাবলেটে প্রদর্শন করার জন্য বিকাশ করতাম তবে আমি ধ্রুবকের পরিবর্তে ROWS এবং COLUMNS পরিবর্তনশীল তৈরি করতাম, যাতে স্ক্রিনের আকার এবং দিকনির্দেশের সাথে মেলে তারা গতিশীলভাবে (কোনও গেমের শুরুতে) সেট করতে পারে।

আমি মিড-গেমের যেকোন সময়, স্ক্রিনের ওরিয়েন্টেশনকে পরিবর্তিত করার অনুমতি দিয়েছি - সমস্ত কিছুই রেখে, আপনাকে কেবল ROWS এবং COLUMNS এর মানগুলি স্যুইচ করতে হবে (প্রতিটি প্লেয়ার চালু রয়েছে এমন বর্তমান বর্গ সংখ্যা এবং এবং সমস্ত সাপ এবং মই এর স্কোয়ার শুরু / শেষ) অপরিবর্তিত। তারপরে আপনাকে 'ঠিক' বোর্ডটি খুব সুন্দরভাবে আঁকতে হবে এবং আপনার অ্যানিমেশনগুলির জন্য কোড লিখতে হবে (আমি ধরে নিই যে এটি আপনার ifবক্তব্যের উদ্দেশ্য ছিল ) ...


আমি ফ্লোরিসের উত্তরটিও আপ-ভোট দিয়েছি - একই রকম ফলাফল অর্জনের একটি ভিন্ন স্টাইল, যা আমি আমার উত্তর লেখার আগে দেখিনি
লরেন্স রেনশওয়া

2
আপনার পরিবর্তে ইনলাইন ফাংশনটি ব্যবহার করা উচিত#define
ব্রায়ান চেন

আপনি যখন ফাংশনের মতো #defineনির্দেশাবলী ব্যবহার করেন তখন যুক্তিগুলির চারপাশে প্রথম বন্ধনী স্থাপন করার জন্য এটি ভাল অনুশীলন , যেখানে সেগুলি প্রসারিত হয়। আপনার পরিবর্তে #define finished(num) (num == lastSquare)লিখতে হবে #define finished(num) ((num) == lastSquare)। কারণটি হ'ল আপনি যদি কম অপেক্ষাকৃত অপারেটর সহ কোনও অপারেটর যুক্ত একটি অভিব্যক্তি দিয়ে এই জাতীয় নির্দেশ ব্যবহার করেন তবে আপনি যে উত্তরটি প্রত্যাশা করেছেন তা পাবেন না। এই ক্ষেত্রে, যদি আপনি অতিরিক্ত বন্ধনী ব্যবহার না করেন তবে finished(a & b)প্রসারিত হয় (a & b == lastSquare)যা আপনি অবশ্যই যা চান তা প্রায় নয়।
দাউদ ইবনে কেরেম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.