তিনটি সংখ্যার তুলনা করার সহজ এবং পরিষ্কার উপায়


11

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

a = countAs();
b = countBs();
c = countCs();

if (a > b && a > c)
    status = MOSTLY_A;
else if (b > a && b > c)
    status = MOSTLY_B;
else if (c > a && c > b)
    status = MOSTLY_C;
else
    status = DONT_KNOW;

এই প্যাটার্নটি কয়েকবার ঘটে এবং দীর্ঘ পরিবর্তনশীল নামগুলির সাথে এটি প্রতিটি ifসঠিক কিনা তা দৃশ্যত নিশ্চিত করতে কিছুটা কঠিন হয়ে যায় । আমি মনে করি এটি করার আরও ভাল এবং পরিষ্কার উপায় হতে পারে; কেউ কি কিছু বলতে পারেন?


কিছু সম্ভাব্য নকল রয়েছে, তবে তারা এই প্রশ্নের সাথে পুরোপুরি একত্রিত হয় না।

প্রস্তাবিত সদৃশটিতে: একাধিক শর্ত পরীক্ষা করার পদ্ধতি? প্রস্তাবিত সমস্ত সমাধানের মূল কোড হিসাবে সমান আনাড়ি মনে হয়, তাই তারা আরও ভাল সমাধান সরবরাহ করে না।

এবং এই পোস্টটি হ্যান্ডেল করার মার্জিত উপায়গুলি (যদি অন্যথায়) কেবল নীড়ের স্তর এবং অসামান্য বিষয় নিয়ে কাজ করে, যা এখানে সমস্যা নয়।


3
আমার কাছে কেবল সমস্যাটি কোড পুনরাবৃত্তি etition আপনার এখানে যা আছে তা পড়ার জন্য অত্যন্ত স্পষ্ট, কেন এটি পরিবর্তন? এটি এটিকে একটি ফাংশন হিসাবে বিভক্ত করুন যা a, b, c এবং রিটার্নের স্থিতি নেয়। যদি এটি আপনাকে আরও ভাল অনুভব করে তবে এটিতে একটি "ইনলাইন" ফেলে দিন। কোনও ম্যাক্রো নেই, কোনও জটিলতা নেই, কেবলমাত্র ভাল পুরানো ফাংশন নিষ্কাশন। পরে যদি আমার এটির সাথে কাজ করার প্রয়োজন হয় তবে আমি আপনার পরিষ্কার কোডটির জন্য আপনাকে ধন্যবাদ জানাব।
জে ট্রানা



মনে রাখবেন যে আপনার # নির্দিষ্ট সংজ্ঞাটির নাম খারাপভাবে দেওয়া হয়েছে। A = 40, b = 30, c = 30 বিবেচনা করুন MO ফলাফলটি MOSTLY_A। তবে বেশিরভাগ জিনিসগুলি আসলে এ নয়, তবে বি বা সি হতে পারে আপনি মোর_এ চেষ্টা করতে পারেন (যদিও এখনও অস্পষ্ট - বি এর চেয়ে বেশি এ এবং সি এর চেয়ে বেশি এ, বা বি ও সি এর চেয়ে আরও বেশি সংযুক্ত?), বা এ_লার্জিস্ট, MAX_IS_A, ...? (যা প্রশ্নের উত্তর হিসাবে সর্বোচ্চ (ক, সর্বাধিক (বি, সি) )ও প্রস্তাব করে)।
টনি

উত্তর:


12

যুক্তি ফ্যাক্টরিজ করুন, তাড়াতাড়ি ফিরে আসুন

মন্তব্যে প্রস্তাবিত হিসাবে, returnজিনিসগুলি অনেক সহজ করার জন্য আপনার যুক্তি কেবল কোনও ফাংশনে আবৃত করা এবং প্রারম্ভিক প্রস্থানের সাথে প্রস্থান করার পক্ষে যথেষ্ট হবে । এছাড়াও, আপনি অন্য ক্রিয়াকলাপগুলিতে টেস্টগুলি অর্পণ করে কিছুটা কার্যকারিতা তৈরি করতে পারেন। আরও দৃ concrete়ভাবে:

bool mostly(max,u,v) {
   return max > u && max > v;
}

status_t strictly_max_3(a,b,c)
{
  if mostly(a,b,c) return MOSTLY_A;
  if mostly(b,a,c) return MOSTLY_B;
  if mostly(c,a,b) return MOSTLY_C;
  return DONT_KNOW;
}

এটি আমার আগের প্রয়াসের চেয়ে সংক্ষিপ্ত:

status_t index_of_max_3(a,b,c)
{
  if (a > b) {
    if (a == c)
      return DONT_KNOW;
    if (a > c)
      return MOSTLY_A;
    else
      return MOSTLY_C;
  } else {
    if (a == b)
      return DONT_KNOW;
    if (b > c)
      return MOSTLY_B;
    else
      return MOSTLY_C;
  }
}

উপরেরটি আরও কিছুটা ভার্বোজ, তবে আইএমএইচও পড়া সহজ এবং একাধিকবার তুলনা পুনরুদ্ধার করে না।

ভিজ্যুয়াল কনফার্মেশন

ইন আপনার উত্তর আপনি বলে:

আমার সমস্যাটি বেশিরভাগ ভিজ্যুয়াল নিশ্চিতকরণ ছিল যে সমস্ত তুলনা একই ভেরিয়েবল ব্যবহার করে

... এছাড়াও, আপনার প্রশ্নে, আপনি বলেছেন:

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

আপনি যা অর্জন করতে চাইছেন তা আমি বুঝতে পারি না: আপনি যে প্যাটার্নটি তার প্রয়োজন তা কপি-পেস্ট করতে চান? উপরে এক মত একটি ফাংশন সঙ্গে, আপনি একবার প্যাটার্ন ক্যাপচার, এবং আপনার সমস্ত যে সমস্ত তুলনা ব্যবহার একবার পরীক্ষা a, bএবং cপ্রয়োজনীয়। তারপরে, আপনি যখন ফাংশনটি কল করবেন তখন আপনাকে আর চিন্তা করার দরকার নেই। অবশ্যই, অনুশীলনে আপনার সমস্যাটি আপনি বর্ণিত সমস্যার চেয়ে কিছুটা জটিল: যদি তা হয় তবে দয়া করে সম্ভব হলে কিছু বিশদ যুক্ত করুন।


1
DONT_KNOW সম্পর্কে আপনার মন্তব্য আমি বুঝতে পারছি না , যদি সি সবচেয়ে ছোট এবং ক এবং বি একই হয় তবে কী হবে? অ্যালগরিদম ফিরে আসবে যে খ সবচেয়ে বড়, যখন একটি খ হিসাবে একই।
পিটার বি

@PieterB আমি অভিমানী যে এটা না ব্যাপার যদি আমরা পারেন ফিরে যাবে wronlgy ছিল MOSTLY_Aবা MOSTLY_Cক্ষেত্রে a == cএবং a > b। এটা ঠিক আছে। ধন্যবাদ।
coredump

@ ডকব্রাউন মঞ্জুর, বেশিরভাগ সুবিধাগুলি প্রারম্ভিক প্রস্থান আচরণ থেকে আসে।
coredump

1
+1, এখন এটি ওপিএস মূল কোডের চেয়ে উন্নতি।
ডক ব্রাউন

9

টি এল: ডিআর; আপনার কোডটি ইতিমধ্যে সঠিক এবং "পরিষ্কার"।

আমি দেখতে পেয়েছি প্রচুর লোক উত্তরের চারপাশে ঝাঁপিয়ে পড়েছে তবে প্রত্যেকে গাছের মধ্যে দিয়ে বন মিস করছে। আসুন এই প্রশ্নটি সম্পূর্ণরূপে বুঝতে সম্পূর্ণ কম্পিউটার বিজ্ঞান এবং গাণিতিক বিশ্লেষণ করি।

প্রথমত, আমরা নোট করি যে আমাদের 3 টি ভেরিয়েবল রয়েছে, প্রতিটিতে 3 টি রাষ্ট্র রয়েছে: <, =, বা>। আদেশের মোট সংখ্যা 3 ^ 3 = 27 টি রাজ্য, যা আমি প্রতিটি রাজ্যের জন্য একটি অনন্য সংখ্যা, পি # হিসাবে চিহ্নিত করব assign এই পি # নম্বরটি একটি ফ্যাকটোরিয়াল নম্বর সিস্টেম

আমাদের কাছে থাকা সমস্ত অনুমতি গণনা করা:

a ? b | a ? c | b ? c |P#| State
------+-------+-------+--+------------
a < b | a < c | b < c | 0| C
a = b | a < c | b < c | 1| C
a > b | a < c | b < c | 2| C
a < b | a = c | b < c | 3| impossible a<b b<a
a = b | a = c | b < c | 4| impossible a<a
a > b | a = c | b < c | 5| A=C > B
a < b | a > c | b < c | 6| impossible a<c a>c
a = b | a > c | b < c | 7| impossible a<c a>c
a > b | a > c | b < c | 8| A
a < b | a < c | b = c | 9| B=C > A
a = b | a < c | b = c |10| impossible a<a
a > b | a < c | b = c |11| impossible a<c a>c
a < b | a = c | b = c |12| impossible a<a
a = b | a = c | b = c |13| A=B=C
a > b | a = c | b = c |14| impossible a>a
a < b | a > c | b = c |15| impossible a<c a>c
a = b | a > c | b = c |16| impossible a>a
a > b | a > c | b = c |17| A
a < b | a < c | b > c |18| B
a = b | a < c | b > c |19| impossible b<c b>c
a > b | a < c | b > c |20| impossible a<c a>c
a < b | a = c | b > c |21| B
a = b | a = c | b > c |22| impossible a>a
a > b | a = c | b > c |23| impossible c>b b>c
a < b | a > c | b > c |24| B
a = b | a > c | b > c |25| A=B > C
a > b | a > c | b > c |26| A

পরিদর্শন দ্বারা আমরা দেখতে পেয়েছি:

  • 3 রাষ্ট্র যেখানে A সর্বাধিক,
  • 3 রাজ্য যেখানে বি সর্বোচ্চ,
  • 3 রাজ্য যেখানে সি সর্বোচ্চ, এবং
  • ৪ টি রাজ্য যেখানে A = B, বা B = C হয়।

আস, এ, বি এবং সি এর মান সহ এই সমস্ত অনুমিতি গণনা করতে একটি প্রোগ্রাম লিখি (পাদটীকা দেখুন) পি # দ্বারা স্থিতিশীল বাছাই:

a ?? b | a ?? c | b ?? c |P#| State
1 <  2 | 1 <  3 | 2 <  3 | 0| C
1 == 1 | 1 <  2 | 1 <  2 | 1| C
1 == 1 | 1 <  3 | 1 <  3 | 1| C
2 == 2 | 2 <  3 | 2 <  3 | 1| C
2  > 1 | 2 <  3 | 1 <  3 | 2| C
2  > 1 | 2 == 2 | 1 <  2 | 5| ??
3  > 1 | 3 == 3 | 1 <  3 | 5| ??
3  > 2 | 3 == 3 | 2 <  3 | 5| ??
3  > 1 | 3  > 2 | 1 <  2 | 8| A
1 <  2 | 1 <  2 | 2 == 2 | 9| ??
1 <  3 | 1 <  3 | 3 == 3 | 9| ??
2 <  3 | 2 <  3 | 3 == 3 | 9| ??
1 == 1 | 1 == 1 | 1 == 1 |13| ??
2 == 2 | 2 == 2 | 2 == 2 |13| ??
3 == 3 | 3 == 3 | 3 == 3 |13| ??
2  > 1 | 2  > 1 | 1 == 1 |17| A
3  > 1 | 3  > 1 | 1 == 1 |17| A
3  > 2 | 3  > 2 | 2 == 2 |17| A
1 <  3 | 1 <  2 | 3  > 2 |18| B
1 <  2 | 1 == 1 | 2  > 1 |21| B
1 <  3 | 1 == 1 | 3  > 1 |21| B
2 <  3 | 2 == 2 | 3  > 2 |21| B
2 <  3 | 2  > 1 | 3  > 1 |24| B
2 == 2 | 2  > 1 | 2  > 1 |25| ??
3 == 3 | 3  > 1 | 3  > 1 |25| ??
3 == 3 | 3  > 2 | 3  > 2 |25| ??
3  > 2 | 3  > 1 | 2  > 1 |26| A

আপনি যদি ভাবছিলেন যে আমি কীভাবে জানি যে কোন # রাজ্যগুলি অসম্ভব, এখন আপনি জানেন। :-)

অর্ডার নির্ধারণের জন্য সর্বনিম্ন তুলনার সংখ্যা:

লগ 2 (27) = লগ (27) / লগ (2) = ~ 4.75 = 5 তুলনা

অর্থাত্ coredump সঠিক 5 ন্যূনতম সংখ্যার তুলনা করেছে। আমি তার কোডটি ফর্ম্যাট করব:

status_t index_of_max_3(a,b,c)
{
    if (a > b) {
        if (a == c) return DONT_KNOW; // max a or c
        if (a >  c) return MOSTLY_A ;
        else        return MOSTLY_C ;
    } else {
        if (a == b) return DONT_KNOW; // max a or b
        if (b >  c) return MOSTLY_B ;
        else        return MOSTLY_C ;
    }
}

আপনার সমস্যার জন্য আমরা সমতার জন্য পরীক্ষার বিষয়ে চিন্তা করি না তাই আমরা 2 টি পরীক্ষা বাদ দিতে পারি।

কোডটি যদি খুব পরিষ্কার / খারাপ হয় তবে এটির ভুল উত্তর না পেলে এটি একটি ভাল লক্ষণ যে আপনি সমস্ত মামলা সঠিকভাবে পরিচালনা করছেন!

পরবর্তী, সরলতার জন্য, লোকেরা উত্তরটি "উন্নত" করার চেষ্টা চালিয়ে যায়, যেখানে তারা মনে করে উন্নতির অর্থ তুলনা সংখ্যার "অনুকূলকরণ", তবে এটি আপনি যা জিজ্ঞাসা করছেন তা কঠোর নয়। আপনি যেখানে জিজ্ঞাসা করেছেন "সবাইকে আরও ভাল হতে পারে" বলে আপনি বিভ্রান্ত করেছেন কিন্তু 'আরও ভাল' অর্থ কী তা ব্যাখ্যা করেননি। কম তুলনা? কম কোড? সর্বোত্তম তুলনা?

আপনি যেহেতু কোড পাঠযোগ্যতার বিষয়ে জিজ্ঞাসা করছেন (যথাযথতা দেওয়া হয়েছে) আমি কেবল আপনার পাঠযোগ্যতার জন্য আপনার কোডে একটি পরিবর্তন করব: অন্যদের সাথে প্রথম পরীক্ষাটি সারিবদ্ধ করুন।

        if      (a > b && a > c)
            status = MOSTLY_A;
        else if (b > a && b > c)
            status = MOSTLY_B;
        else if (c > a && c > b)
            status = MOSTLY_C;
        else
            status = DONT_KNOW; // a=b or b=c, we don't care

ব্যক্তিগতভাবে আমি এটি নিম্নলিখিত পদ্ধতিতে লিখতে চাই তবে এটি আপনার কোডিং মানগুলির জন্য খুব অপ্রচলিত হতে পারে:

        if      (a > b && a > c) status = MOSTLY_A ;
        else if (b > a && b > c) status = MOSTLY_B ;
        else if (c > a && c > b) status = MOSTLY_C ;
        else /*  a==b  || b ==c*/status = DONT_KNOW; // a=b or b=c, we don't care

পাদটীকা: ক্রমানুসারে উত্পন্ন করার জন্য এখানে সি ++ কোড রয়েছে:

#include <stdio.h>

char txt[]  = "< == > ";
enum cmp      { LESS, EQUAL, GREATER };
int  val[3] = { 1, 2, 3 };

enum state    { DONT_KNOW, MOSTLY_A, MOSTLY_B, MOSTLY_C };
char descr[]= "??A B C ";

cmp Compare( int x, int y ) {
    if( x < y ) return LESS;
    if( x > y ) return GREATER;
    /*  x==y */ return EQUAL;
}

int main() {
    int i, j, k;
    int a, b, c;

    printf( "a ?? b | a ?? c | b ?? c |P#| State\n" );
    for( i = 0; i < 3; i++ ) {
        a = val[ i ];
        for( j = 0; j < 3; j++ ) {
            b = val[ j ];
            for( k = 0; k < 3; k++ ) {
                c = val[ k ];

                int cmpAB = Compare( a, b );
                int cmpAC = Compare( a, c );
                int cmpBC = Compare( b, c );
                int n     = (cmpBC * 9) + (cmpAC * 3) + cmpAB; // Reconstruct unique P#

                printf( "%d %c%c %d | %d %c%c %d | %d %c%c %d |%2d| "
                    , a, txt[cmpAB*2+0], txt[cmpAB*2+1], b
                    , a, txt[cmpAC*2+0], txt[cmpAC*2+1], c
                    , b, txt[cmpBC*2+0], txt[cmpBC*2+1], c
                    , n
                );

                int status;
                if      (a > b && a > c) status = MOSTLY_A;
                else if (b > a && b > c) status = MOSTLY_B;
                else if (c > a && c > b) status = MOSTLY_C;
                else /*  a ==b || b== c*/status = DONT_KNOW; // a=b, or b=c

                printf( "%c%c\n", descr[status*2+0], descr[status*2+1] );
            }
        }
    }
    return 0;
}

সম্পাদনাগুলি: প্রতিক্রিয়ার উপর ভিত্তি করে, টিএল: ডিআর শীর্ষে স্থানান্তরিত, অরক্ষিত টেবিল সরানো, 27 সাফ, কোড ক্লিন আপ, অসম্ভব অবস্থার বর্ণিত।


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

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

2
গঠনমূলক প্রতিক্রিয়া coredump জন্য ধন্যবাদ। এটি মধ্য যাচাই করা টেবিলটি সহজেই যাচাই করার পরে আমি সরিয়ে ফেলেছি।
Michaelangel007

2
যীশু! কে বলবে যে তিনটি সংখ্যার তুলনা করা প্রায় রকেট বিজ্ঞানের মতো জটিল?
ম্যান্ড্রিল

@ ম্যান্ড্রিল কম্পিউটার বিজ্ঞানী হিসাবে কোনও সমস্যা পুঙ্খানুপুঙ্খভাবে বোঝা আমাদের কাজ । কেবলমাত্র 3-দিকের তুলনার জন্য সমস্ত 27 সম্ভাব্য ক্রমশক্তি গণনার মাধ্যমে আমরা যাচাই করতে পারি যে আমাদের সমাধান সমস্ত ক্ষেত্রে কাজ করে। আমরা প্রোগ্রামার হিসাবে সর্বশেষ জিনিসটি হ'ল লুকানো বাগ এবং অ্যাকাউন্টবিহীন প্রান্তের কেস। ভার্বোসিটি হ'ল মূল্য যা এককে নির্ভুলতার জন্য প্রদান করে।
Michaelangel007

5

@ এমএসডাব্লু আপনাকে a, b, c এর পরিবর্তে একটি অ্যারে ব্যবহার করতে বলেছিল, এবং @ বাসাইল আপনাকে একটি ফাংশনে "সর্বাধিক" যুক্তিটি রিফেক্টরটি বলেছিল। এই দুটি ধারণার সংমিশ্রণ বাড়ে

val[0] = countAs();    // in the real code, one should probably define 
val[1] = countBs();    // some enum for the indexes 0,1,2 here
val[2] = countCs();

 int result[]={DONT_KNOW, MOSTLY_A, MOSTLY_B, MOSTLY_C};

তারপরে একটি ফাংশন সরবরাহ করুন যা একটি স্বেচ্ছাসেবী অ্যারের সর্বাধিক সূচক গণনা করে:

// returns the index of the strict maximum, and -1 when the maximum is not strict
int FindStrictMaxIndex(int *values,int arraysize)
{
    int maxVal=INT_MIN;
    int maxIndex=-1;
    for(int i=0;i<arraysize;++i)
    {
       if(values[i]>maxVal)
       {
         maxVal=values[i];
         maxIndex=i;
       }
       else if (values[i]==maxVal)
       {
         maxIndex=-1;
       }
    }
    return maxIndex;
}

এবং এটি পছন্দ করুন

 return result[FindStrictMaxIndex(val,3)+1];

এলওসি-র মোট সংখ্যা আসলটির চেয়ে বেড়েছে বলে মনে হয়েছে, তবে এখন আপনার পুনরায় ব্যবহারযোগ্য ফাংশনে মূল যুক্তি রয়েছে এবং আপনি যদি একাধিকবার ফাংশনটি পুনরায় ব্যবহার করতে পারেন তবে তা পরিশোধ করতে শুরু করে। তদুপরি, FindStrictMaxIndexফাংশনটি আপনার "ব্যবসায়ের প্রয়োজনীয়তা" এর সাথে আর উদ্বেগযুক্ত নয় (উদ্বেগের বিভাজন), সুতরাং আপনাকে পরে এটি সংশোধন করতে হবে এমন ঝুঁকিটি আপনার মূল সংস্করণ (উন্মুক্ত-নীতি) এর তুলনায় অনেক কম। উদাহরণস্বরূপ, আর্গুমেন্টের সংখ্যা পরিবর্তন হওয়া বা MOSTLY_ABC এর তুলনায় অন্যান্য রিটার্ন মানগুলি ব্যবহার করার প্রয়োজন থাকলেও আপনি ফাংশনটি পরিবর্তন করতে হবে না, বা আপনি a, b, c এর চেয়ে অন্য ভেরিয়েবলগুলি প্রক্রিয়া করছেন। অধিকন্তু, 3, আলাদা আলাদা মানগুলির পরিবর্তে একটি অ্যারের ব্যবহার a, b, c অন্যান্য কোডেও আপনার কোড সহজতর করতে পারে।

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


আমি এটি পছন্দ করি - এর সাহসগুলি FindStrictMaxIndex()খুব পরিষ্কার নাও হতে পারে, তবে কলারের দৃষ্টিকোণ থেকে এটি অর্জন করার চেষ্টা করছে তা যুক্তিযুক্তভাবে সুস্পষ্ট।
কেন YN

অথবা দুটি অ্যারে ধরে রাখার পরিবর্তে, কী-মান-জোড়াগুলির একটি অ্যারে ধরে রাখুন: {MOSTLY_A, countAs ()}, মান অনুসারে অর্ডার করা প্রথম উপাদানটি নিয়ে কীটি পড়ুন।
জুলিয়া হ্যাওয়ার্ড

@ জুলিয়াহ্যাওয়ার্ড: আমি এই জাতীয় সমাধানটির মূল পরামর্শটি না দেওয়ার মূল কারণটি ছিল প্রশ্নটির "সি" ট্যাগ - সি-তে, কী-মান সংযোজনগুলির সাথে মোকাবিলা করার জন্য এবং কেভিপি-র ক্ষেত্রে টাইপ করা একটি ফাংশন তৈরি করার জন্য আরও কিছু বয়লারপ্লেট কোডের প্রয়োজন হবে C সাধারণ intটাইপ করা ফাংশনটির চেয়ে বিভিন্ন প্রসঙ্গে সম্ভবত পুনরায় ব্যবহারযোগ্য হবে না । তবে যদি কেউ পাইথন বা পার্লের মতো আলাদা ভাষা ব্যবহার করে তবে আমি আপনার মন্তব্যে সম্মত।
ডক ব্রাউন

1
@ gnasher729: এটি মূল নির্ভর করে যে অরজিনাল কোডটিতে কতগুলি "সদৃশ" রয়েছে, তারা আসলে কতটা অনুরূপ, এবং কতক্ষণ এই FindStrictMaxIndexফাংশনটি পুনরায় ব্যবহার করা যেতে পারে। পুনঃব্যবহারের এক বা মাত্র দুই বারের জন্য, অবশ্যই এটি পরিশোধ করবে না, তবে এটি আমার উত্তরে আমি ইতিমধ্যে লিখেছি। ভবিষ্যতের পরিবর্তনগুলি সম্পর্কে আমি উপরে উল্লিখিত অন্যান্য সুবিধাগুলিও নোট করুন।
ডক ব্রাউন

1
... এবং নোট করুন যে মূল 8 লাইনগুলি return result[FindStrictMaxIndex(val,3)]; কোডের যে বিন্দুতে মূল 8 লাইন স্থাপন করা হয়েছিল সেখানে একটি সাধারণ এক-লাইনার দ্বারা প্রতিস্থাপন করা যেতে পারে । অন্যান্য অংশগুলি, বিশেষত FindStrictMaxIndexনিজেই "ব্যবসায় যুক্তি" থেকে সম্পূর্ণ পৃথক হয়ে গেছে, যা তাদের ব্যবসায়ের প্রয়োজনীয়তা পরিবর্তনের ফোকাস থেকে সরিয়ে নিয়ে যায়।
ডক ব্রাউন

-1

আপনার সম্ভবত কোনও ম্যাক্রো বা একটি ফাংশন MAX সর্বাধিক দুটি সংখ্যা দেওয়া উচিত।

তাহলে আপনি কেবল চান:

 status = MAX(a,MAX(b,c));

আপনি সংজ্ঞা দিতে পারে

 #define MAX(X,Y) (((X)>(Y))?(X):(Y))

তবে সতর্কতা অবলম্বন করুন - পার্শ্ব প্রতিক্রিয়াগুলি সম্পর্কে উল্লেখ করুন- ম্যাক্রো ব্যবহার করার সময় (যেহেতু MAX(i++,j--) অদ্ভুত আচরণ করবে)

সুতরাং আরও ভাল একটি ফাংশন সংজ্ঞায়িত

 static inline int max2ints(int x, int y) {
    return (x>y)?x:y;
 }

এবং এটি ব্যবহার করুন (বা কমপক্ষে #define MAX(X,Y) max2ints((X),(Y))....)

আপনার যদি ম্যাক্সের উত্স বুঝতে হয় তবে আপনার একটি দীর্ঘ ম্যাক্রো থাকতে পারে #define COMPUTE_MAX_WITH_CAUSE(Status,Result,X,Y,Z) যা একটি দীর্ঘ do{... }while(0) ম্যাক্রো, সম্ভবত

#define COMPUTE_MAX_WITH_CAUSE(Status,Result,X,Y,Z) do { \
  int x= (X), y= (Y), z=(Z); \
  if (x > y && y > z) \
    { Status = MOSTLY_FIRST; Result = x; } \
  else if (y > x && y > z) \
    { Status = MOSTLY_SECOND; Result = y; } \
  else if (z > x && z > y) \
    { Status = MOSTLY_THIRD; Result = z; } \
  /* etc */ \
  else { Status = UNKNOWN; Result = ... } \
} while(0)

তাহলে আপনি COMPUTE_MAX_WITH_CAUSE(status,res,a,b,c) বেশ কয়েকটি জায়গায় প্রার্থনা করতে পারেন । এটি কিছুটা কুরুচিপূর্ণ। আমি স্থানীয় ভেরিয়েবল সংজ্ঞায়িত x, y, z খারাপ পার্শ্ব প্রতিক্রিয়া কম ....


2
কোনও ফাংশনে সাধারণ যুক্তিকে রিফ্যাক্ট করা সঠিক পদ্ধতি, তবে আমি এখানে দুটি জিনিস এড়িয়ে যাব: ১. আমি নতুন প্রয়োজনীয়তা "আবিষ্কার" করব না (ওপি সর্বাধিক গণনা করার জন্য জিজ্ঞাসা করল না)। এবং ২ য়: ফলাফলের কোডটি আরও ডিআরওয়াই হয়ে উঠলেও, এটি যদি কোনও জটিল ম্যাক্রোর ন্যায্যতা দেয় তবে তা খুব বিতর্কিত।
ডক ব্রাউন

1
ম্যাক্রোগুলি সর্বশেষ অবলম্বনের একটি সরঞ্জাম হওয়া উচিত। অবশ্যই এই সমস্যার সীমা ছাড়াই।
কেভিন ক্লাইনে

-1

আমার এ সম্পর্কে আরও চিন্তাভাবনা ছিল, সুতরাং যেহেতু আমার সমস্যাটি বেশিরভাগ ভিজ্যুয়াল কনফার্মেশন ছিল যে সমস্ত তুলনা একই ভেরিয়েবল ব্যবহার করে, তাই আমি মনে করি এটি একটি কার্যকর পদ্ধতির হতে পারে:

a = countAs();
b = countBs();
c = countCs();

if (FIRST_IS_LARGEST(a, b, c))
    status = MOSTLY_A;
else if (SECOND_IS_LARGEST(a, b, c))
    status = MOSTLY_B;
else if (THIRD_IS_LARGEST(a, b, c))
    status = MOSTLY_C;
else
    status = DONT_KNOW; /* NO_SINGLE_LARGEST is a better name? */

প্রতিটি ম্যাক্রো লাগে যে a, bএবং cএকই আদেশ নিশ্চিত করা সহজ, এবং ম্যাক্রো নাম আমাকে বের কাজ করতে সব তুলনা এবং ANDs না কি করছেন থাকার পরিমাণ সঞ্চয় হয়।


1
(1) ফাংশনের পরিবর্তে সহায়ক ম্যাক্রোগুলি কেন? (২) আপনার এখানে কেন ভিজ্যুয়াল কনফার্মেশন দরকার? এটা সত্যিই আপনার মূল সমস্যা বা ভিজ্যুয়াল নিশ্চিতকরণ একটি জন্য প্রয়োজন ফল কোড নকলের ? আপনার সর্বোত্তম বিকল্পটি হ'ল আপনার কোডটিকে একটি একক, সরল ফাংশনে পরিণত করা যা আপনি একবারে একবারে পরীক্ষা করে দেখেন
coredump
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.