স্কোয়ারড সংখ্যার সংমিশ্রণের সময় আমার কী স্পষ্টত নেতিবাচক সংখ্যা বা শূন্য হ্যান্ডেল করা দরকার?


220

আমি সম্প্রতি আমার ক্লাসে একটি পরীক্ষা ছিল। সমস্যাগুলির মধ্যে একটি ছিল:

একটি নম্বর দেওয়া এন , সি / সি ++ যে সংখ্যা সংখ্যার যোগফল ফেরৎ একটি ফাংশন লিখতে ছক । (নিম্নলিখিতটি গুরুত্বপূর্ণ) পরিসর এর এন [- 10 ^ 7 (10 ^ 7)] হল। উদাহরণ: যদি এন = 123 হয় তবে আপনার ফাংশনটি 14 (1 ^ 2 + 2 ^ 2 + 3 ^ 2 = 14) এ ফিরে আসবে।

এটি আমি লিখেছি যে ফাংশন:

int sum_of_digits_squared(int n) 
{
    int s = 0, c;

    while (n) {
        c = n % 10;
        s += (c * c);
        n /= 10;
    }

    return s;
}

আমার কাছে ডানদিকে তাকাল। সুতরাং এখন পরীক্ষাটি আবার ফিরে এসেছিল এবং আমি খুঁজে পেলাম যে শিক্ষক আমাকে বুঝতে পারা যায় না এমন কারণের জন্য সমস্ত পয়েন্ট দেন নি। তাঁর মতে, আমার ফাংশনটি সম্পূর্ণ হওয়ার জন্য, আমার নিম্নলিখিত বিবরণ যুক্ত করা উচিত ছিল:

int sum_of_digits_squared(int n) 
 {
    int s = 0, c;

    if (n == 0) {      //
        return 0;      //
    }                  //
                       // THIS APPARENTLY SHOULD'VE 
    if (n < 0) {       // BEEN IN THE FUNCTION FOR IT
        n = n * (-1);  // TO BE CORRECT
    }                  //

    while (n) {
        c = n % 10;
        s += (c * c);
        n /= 10;
    }

    return s;
}

এর পক্ষে যুক্তিটি হ'ল এন সংখ্যাটি [- (10 ^ 7), 10 ^ 7] এর মধ্যে রয়েছে, সুতরাং এটি নেতিবাচক সংখ্যা হতে পারে। তবে আমি দেখতে পাই না যেখানে আমার নিজস্ব ফাংশনটির সংস্করণ ব্যর্থ হয়। যদি আমি সঠিকভাবে বুঝতে অর্থ while(n)হল while(n != 0), না while (n > 0) , তাই ফাংশনের আমার সংস্করণে সংখ্যা এন লুপ লিখতে ব্যর্থ হবে না। এটি ঠিক একই কাজ করবে।

তারপরে, আমি ঘরে বসে কম্পিউটারে ফাংশনটির উভয় সংস্করণ চেষ্টা করেছিলাম এবং আমি যে সমস্ত উদাহরণ চেষ্টা করেছি তার ঠিক একই উত্তর পেয়েছি। সুতরাং, sum_of_digits_squared(-123)সমান sum_of_digits_squared(123)(যা আবার সমান 14) (এমনকি বিশদটি যা আমার স্পষ্টত যোগ করা উচিত ছিল না)। প্রকৃতপক্ষে, আমি যদি স্ক্রিনে সংখ্যার অঙ্কগুলি (কমপক্ষে গুরুত্বপূর্ণ থেকে বৃহত্তর পর্যন্ত) মুদ্রণ করার চেষ্টা করি, তবে আমি যে 123ক্ষেত্রে পেয়েছি 3 2 1এবং যে -123ক্ষেত্রে আমি পেয়েছি -3 -2 -1(যা প্রকৃতপক্ষে আকর্ষণীয়। তবে এই সমস্যায় আমাদের অঙ্কগুলি বর্গাকার হওয়ার পরে কিছু যায় আসে না।

তো, কে ভুল?

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


120
n = n * (-1)একটি হাস্যকর লেখার উপায় n = -n; এটি কেবলমাত্র একাডেমিকই ভাবতে পারে। রিডানড্যান্ট প্রথম বন্ধনী যুক্ত করা যাক।
ব্যবহারকারী 207421

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

94
আমি এটি আকর্ষণীয় মনে করি যে "সংখ্যাযুক্ত সংখ্যার অঙ্কগুলির যোগফল" তিন (3) সম্পূর্ণ ভিন্ন উপায়ে ব্যাখ্যা করা যায়। (নম্বর 123 হয়, তাহলে সম্ভাব্য ব্যাখ্যা উত্পাদ 18, 14, এবং 36)
আন্দ্রিয়াস Rejbrand

23
@ ইল্কাচ্চু: "সংখ্যাযুক্ত বর্গের অঙ্কের যোগফল"। ঠিক আছে, "স্কোয়ার সংখ্যাটি" স্পষ্টভাবে 123 ^ 2 = 15129, সুতরাং "সংখ্যার অঙ্কের অঙ্কের যোগফল" "15129 এর অঙ্কগুলির যোগফল", যা স্পষ্টতই 1 + 5 + 1 + 2 + 9 = 18।
Andreas Rejbrand

15
n = n * (-1)? Wut ??? আপনার প্রোফেসর যা খুঁজছেন তা হ'ল: = n = -n '। সি ভাষার একটি অ্যানারি মাইনাস অপারেটর রয়েছে।
কাজ 21

উত্তর:


245

একটি আলোচনার সংক্ষিপ্তসার যা মন্তব্যে ঘুরছে:

  • আগে থেকে পরীক্ষা করার কোনও ভাল কারণ নেই n == 0while(n)পরীক্ষা যে ক্ষেত্রে পুরোপুরি হ্যান্ডেল করবে।
  • %নেতিবাচক অপারেশনগুলির ফলাফলটি আলাদাভাবে সংজ্ঞায়িত করা হয়েছিল , সম্ভবত এটি সম্ভবত আপনার পূর্ববর্তী সময়ে অভ্যস্ত ছিল। , ফল (ক পিডিপি -11, যেখানে ডেনিস রিচি মূলত উন্নত সি তে সহ উল্লেখযোগ্য হল, তাড়াতাড়ি ইউনিক্স) কিছু পুরানো সিস্টেমে a % bছিল সবসময় সীমার মধ্যে [0 .. b-1], যার মানে হল -123% থেকে 10 7. এই ধরনের একটি সিস্টেম ছিল, পরীক্ষা আগে থেকে n < 0প্রয়োজন হবে।

তবে দ্বিতীয় বুলেটটি কেবল আগের সময়ের ক্ষেত্রেই প্রযোজ্য। উভয় সি এবং সি ++ স্ট্যান্ডার্ডের সংস্করণগুলিতে, পূর্ণসংখ্যা বিভাগকে 0 এর দিকে কাটাতে সংজ্ঞায়িত করা হয়েছে, সুতরাং দেখা যাচ্ছে যে n % 10negativeণাত্মক হওয়ার nপরেও আপনাকে সম্ভবত (সম্ভবত নেতিবাচক) শেষ সংখ্যা দেওয়ার গ্যারান্টিযুক্ত n

সুতরাং "এর অর্থ কী while(n)?" প্রশ্নের উত্তর হয় "হিসাবে ঠিক একই while(n != 0)" , এবং উত্তর "এই কোড নেতিবাচক জন্য সঠিকভাবে কাজ হিসাবে ভাল ইতিবাচক উইল n?" হয় "হ্যাঁ, যেকোন আধুনিক অধীনে, কম্পাইলার স্ট্যান্ডার্ড-অনুসারী।" "তাহলে প্রশিক্ষক কেন এটি চিহ্নিত করলেন?" প্রশ্নের উত্তর সম্ভবত তারা 1999 সালে সি এবং 2010 বা আরও কিছু ক্ষেত্রে সি ++ এর সাথে ঘটেছিল একটি উল্লেখযোগ্য ভাষা পুনরায় সংজ্ঞা সম্পর্কে অবগত নন।


39
"এন == 0" এর জন্য আগাম পরীক্ষা করার কোনও ভাল কারণ নেই - প্রযুক্তিগতভাবে, এটি সঠিক। তবে প্রদত্ত যে আমরা একটি শিক্ষণ সেটিংয়ে একজন অধ্যাপকের কথা বলছি, তারা আমাদের চেয়ে ব্রিভটির বিষয়ে স্পষ্টতার প্রশংসা করতে পারে। n == 0কমপক্ষে অতিরিক্ত পরীক্ষা যুক্ত করা যেকোন পাঠকের ক্ষেত্রে তত্ক্ষণাত এবং সম্পূর্ণরূপে সুস্পষ্ট হয়ে যায় সেই ক্ষেত্রে কী ঘটে। এটি ছাড়া পাঠককে তাদের সন্তুষ্ট করতে হবে যে লুপটি প্রকৃতপক্ষে এড়িয়ে গেছে এবং sপ্রত্যাবর্তনের ডিফল্ট মানটি হ'ল সঠিক।
ilkkachu

22
এছাড়াও, অধ্যাপক এটি জানতে চাইতে পারেন যে শিক্ষার্থী সচেতন এবং কেন এবং কীভাবে ফাংশনটি শূন্যের একটি ইনপুট দিয়ে আচরণ করে (অর্থাৎ এটি দুর্ঘটনার দ্বারা সঠিক মানটি ফিরিয়ে দেয় না ) সম্পর্কে চিন্তাভাবনা করতে পারে । তারা এমন শিক্ষার্থীদের সাথে দেখা হতে পারে যারা এই ক্ষেত্রে কী ঘটবে বুঝতে পারে না যে লুপটি শূন্যগুণে চলতে পারে ইত্যাদি you're আপনি যখন কোনও শিক্ষণ সেটিংয়ের সাথে কথা বলছেন তখন কোনও অনুমান এবং কোণার ক্ষেত্রে অতিরিক্ত স্পষ্ট হওয়া ভাল। ..
ilkkachu

36
@ilkkachu যদি এটি হয় তবে শিক্ষকের উচিত এমন একটি কাজটি করা উচিত যা সঠিকভাবে কাজ করার জন্য এই জাতীয় পরীক্ষার প্রয়োজন।
ক্লুট্ট

38
@ ইল্কাচ্চু ঠিক আছে, আমি সাধারণ ক্ষেত্রে আপনার বক্তব্য গ্রহণ করি, কারণ আমি বংশবৃদ্ধির বিষয়ে স্পষ্টতাকে পুরোপুরি প্রশংসা করি - এবং বেশিরভাগ সময়, কেবলমাত্র একটি শিক্ষণিক বিন্যাসে আবশ্যক নয়। কিন্তু যে বলেন, কখনও কখনও সংক্ষিপ্ততা হয় স্বচ্ছতা, এবং আপনি উভয় সাধারণ ক্ষেত্রে পরিচালনা করতে প্রধান কোডের জন্য সাজাতে পারেন যদি এবং , প্রান্ত ক্ষেত্রে (গুলি) প্রান্ত মামলা জন্য বিশেষ ক্ষেত্রে সঙ্গে কোড (এবং কভারেজ বিশ্লেষণ) cluttering ছাড়া , এটি একটি সুন্দর জিনিস! আমি মনে করি এটি এমনকি শিক্ষানবিশ স্তরে প্রশংসা করার মতো কিছু।
স্টিভ সামিট

49
@ ইলক্কাচু সেই যুক্তি অনুসারে আপনার অবশ্যই অবশ্যই এন = 1 এবং এর জন্য পরীক্ষা করা উচিত। এখানে বিশেষ কিছু নেই n=0। অপ্রয়োজনীয় শাখা এবং জটিলতার পরিচয় দেওয়া কোডটি কোনও সহজ করে তোলে না, এখন থেকে আপনাকে কেবল এটিই দেখাতে হবে না যে সাধারণ অ্যালগরিদমটি ঠিক আছে আপনাকে সমস্ত বিশেষ ক্ষেত্রেও আলাদাভাবে চিন্তা করতে হবে।
ভু

107

আপনার কোড পুরোপুরি ঠিক আছে

আপনি একেবারে সঠিক এবং আপনার শিক্ষক ভুল। অতিরিক্ত জটিলতা যুক্ত করার কোনও কারণ নেই, কারণ এটি ফলাফলকে মোটেই প্রভাবিত করে না। এমনকি এটি একটি বাগ প্রবর্তন করে। (নিচে দেখ)

প্রথমত, nশূন্য কিনা পৃথক চেক স্পষ্টতই সম্পূর্ণ অপ্রয়োজনীয় এবং এটি উপলব্ধি করা খুব সহজ। সত্যি কথা বলতে কি আমি আসলে আপনার শিক্ষকদের যোগ্যতা নিয়ে প্রশ্ন করি যদি সে সম্পর্কে এই বিষয়ে আপত্তি থাকে। তবে আমি অনুমান যে সময়ে সময়ে প্রত্যেকের একটি মস্তিষ্ক ফার্ট হতে পারে। যাইহোক, আমি মনে করি এটি while(n)পরিবর্তন করা উচিত while(n != 0)কারণ এটি অতিরিক্ত লাইন ব্যয় না করে কিছুটা অতিরিক্ত স্পষ্টতা যুক্ত করে। যদিও এটি একটি ছোটখাটো জিনিস।

দ্বিতীয়টি কিছুটা বোধগম্য, তবে তিনি এখনও ভুল।

এটি সি 11 স্ট্যান্ডার্ড 6.5.5.p6 যা বলে:

যদি ভাগফল a / b উপস্থাপনযোগ্য হয় তবে এক্সপ্রেশনটি (a / b) * b + a% b এর সমান হবে; অন্যথায়, দু'এ / বি এবং% বি উভয়ের আচরণ সংজ্ঞায়িত।

পাদটীকা এই বলে:

একে প্রায়শই "শূন্যের দিকে কাটা" বলা হয়।

শূন্য মানে দিকে truncation যে জন্য পরম মান a/bজন্য পরম মান সমান (-a)/bসবার জন্য aএবং bযেটা ঘুরে মানে আপনার কোড পুরোপুরি জরিমানা করে।

মডুলো সহজ গণিত, তবে বিপরীত হতে পারে

তবে, আপনার শিক্ষকের একটি বক্তব্য রয়েছে যে আপনার সাবধান হওয়া উচিত, কারণ আপনি ফলাফলটি বানাচ্ছেন তা এখানে সত্যই গুরুত্বপূর্ণ। a%bউপরের সংজ্ঞা অনুসারে গণনা করা সহজ গণিত, তবে এটি আপনার অন্তর্দৃষ্টির বিপরীতে যেতে পারে। গুণ এবং বিভাগের জন্য, অপারেন্ডদের সমান চিহ্ন থাকলে ফলাফলটি ইতিবাচক হয়। তবে এটি যখন মডুলোর ক্ষেত্রে আসে, ফলাফলটিতে প্রথম অপারেন্ডের মতো একই চিহ্ন থাকে । দ্বিতীয় অপারেন্ডটি সাইনকে মোটেই প্রভাবিত করে না। উদাহরণস্বরূপ, 7%3==1কিন্তু (-7)%(-3)==(-1)

এটি প্রদর্শিত একটি স্নিপেট এখানে:

$ cat > main.c 
#include <stdio.h>

void f(int a, int b) 
{
    printf("a: %2d b: %2d a/b: %2d a\%b: %2d (a%b)^2: %2d (a/b)*b+a%b==a: %5s\n",
           a, b ,a/b, a%b, (a%b)*(a%b), (a/b)*b+a%b == a ? "true" : "false");
}

int main(void)
{
    int a=7, b=3;
    f(a,b);
    f(-a,b);
    f(a,-b);
    f(-a,-b);
}

$ gcc main.c -Wall -Wextra -pedantic -std=c99

$ ./a.out
a:  7 b:  3 a/b:  2 a%b:  1 (a%b)^2:  1 (a/b)*b+a%b==a:  true
a: -7 b:  3 a/b: -2 a%b: -1 (a%b)^2:  1 (a/b)*b+a%b==a:  true
a:  7 b: -3 a/b: -2 a%b:  1 (a%b)^2:  1 (a/b)*b+a%b==a:  true
a: -7 b: -3 a/b:  2 a%b: -1 (a%b)^2:  1 (a/b)*b+a%b==a:  true

সুতরাং, ব্যঙ্গাত্মকভাবে, আপনার শিক্ষক ভুল হয়ে নিজের বক্তব্য প্রমাণ করেছেন।

আপনার শিক্ষকের কোডটি ত্রুটিযুক্ত

হ্যাঁ, এটি আসলে। যদি ইনপুটটি হয় INT_MINএবং আর্কিটেকচার দুটিটির পরিপূরক এবং বিট প্যাটার্ন যেখানে সাইন বিট 1 এবং সমস্ত মান বিট 0 হয় কোনও ফাঁদ মান নয় (ফাঁদ মান ব্যতীত দু'জনের পরিপূরক ব্যবহার করা খুব সাধারণ) তবে আপনার শিক্ষকের কোডটি অপরিবর্তিত আচরণ করবে লাইনে n = n * (-1)। আপনার কোডটি - যদি কখনও এত সামান্য হয় - তবে তার থেকে ভাল । এবং কোডটিকে অপ্রয়োজনীয় জটিল করে একেবারে শূন্য মান অর্জন করে একটি ছোট বাগ প্রবর্তনের কথা বিবেচনা করে, আমি বলতে পারি যে আপনার কোডটি অনেক ভাল।

অন্য কথায়, সংকলনগুলিতে যেখানে INT_MIN = -32768 (যদিও ফলস্বরূপ ফাংশনটি <-32768 বা> 32767 হয় এমন কোনও ইনপুট গ্রহণ করতে পারে না), -32768 এর বৈধ ইনপুট অপরিজ্ঞাত আচরণের কারণ, কারণ - (- 32768i16) 16-বিট পূর্ণসংখ্যা হিসাবে প্রকাশ করা যায় না। (আসলে, -32768 সম্ভবত কোনও ভুল ফলাফল সৃষ্টি করতে পারে না, কারণ - (- 32768i16) সাধারণত -32768i16 এ মূল্যায়ন করে এবং আপনার প্রোগ্রামটি সঠিকভাবে নেতিবাচক সংখ্যাগুলি পরিচালনা করে)) (SHRT_MIN সংকলকটির উপর নির্ভর করে -32768 বা -32767 হতে পারে))

তবে আপনার শিক্ষক স্পষ্টতই বলেছেন যে nএটি [-10 ^ 7 এর মধ্যে থাকতে পারে; 10 ^ 7]। একটি 16-বিট পূর্ণসংখ্যা খুব ছোট; আপনাকে [কমপক্ষে] একটি 32-বিট পূর্ণসংখ্যা ব্যবহার করতে হবে। ব্যবহার করা intসম্ভবত তার কোডটিকে নিরাপদ বলে মনে হতে পারে, কেবলমাত্র এটি ছাড়াও int32-বিট পূর্ণসংখ্যার প্রয়োজন হয় না। আপনি যদি 16-বিটের আর্কিটেকচারের জন্য সংকলন করেন তবে আপনার কোড স্নিপেট উভয়ই ত্রুটিযুক্ত। তবে আপনার কোডটি এখনও অনেক বেশি ভাল কারণ এই দৃশ্যটি INT_MINতার সংস্করণটি সহ উল্লিখিত বাগটি পুনরায় পরিচয় করে । এড়াতে, আপনি longপরিবর্তে লিখতে পারেন int, যা উভয় স্থাপত্যের মধ্যে 32-বিট পূর্ণসংখ্যা। এ longএর গ্যারান্টিযুক্ত যে কোনও মান [-2147483647; রেঞ্জের মধ্যে রাখতে সক্ষম হবে; 2147483647]। সি 11 স্ট্যান্ডার্ড 5.2.4.2.1 LONG_MIN প্রায়শই হয়-2147483648কিন্তু সর্বোচ্চ অনুমোদিত মানের জন্য (হ্যাঁ, সর্বোচ্চ, এটি একটি ঋণাত্মক সংখ্যা থাকবে) LONG_MINহয় 2147483647

আমি আপনার কোডে কি পরিবর্তন করব?

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

  • ভেরিয়েবলের নামগুলি কিছুটা ভাল হতে পারে তবে এটি একটি সংক্ষিপ্ত ফাংশন যা বোঝা সহজ, সুতরাং এটি কোনও বড় বিষয় নয়।
  • আপনি শর্তটি থেকে পরিবর্তন করতে nপারেন n!=0। শব্দার্থকভাবে, এটি 100% সমতুল্য, তবে এটি এটি কিছুটা স্পষ্ট করে তোলে।
  • ঘোষিতকরণের ঘোষণাকে c(যার নাম দিয়েছি digit) এটি লুপের ভিতরে থাকায় এটি কেবল সেখানে ব্যবহৃত হয়েছে it's
  • longএটি পুরো ইনপুট সেটটিকে পরিচালনা করতে পারে তা নিশ্চিত করতে যুক্তির ধরণটি পরিবর্তন করুন।
int sum_of_digits_squared(long n) 
{
    long sum = 0;

    while (n != 0) {
        int digit = n % 10;
        sum += (digit * digit);
        n /= 10;
    }

    return sum;
}

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

  • পরিবর্তনটি সম্পূর্ণরূপে এড়িয়ে sum += (digit * digit)যান sum += ((n%10)*(n%10))এবং এড়িয়ে যান digit
  • digitNegative ণাত্মক হলে এর সাইন পরিবর্তন করুন । তবে কোডটি আরও জটিল করার বিরুদ্ধে আমি দৃ just়ভাবে পরামর্শ দেব কেবলমাত্র একটি পরিবর্তনশীল নামটি বোঝার জন্য। এটি একটি খুব শক্ত কোড গন্ধ।
  • একটি পৃথক ফাংশন তৈরি করুন যা শেষ অঙ্কটি বের করে। int last_digit(long n) { int digit=n%10; if (digit>=0) return digit; else return -digit; }আপনি যদি সেই ফাংশনটি অন্য কোথাও ব্যবহার করতে চান তবে এটি দরকারী।
  • এটির নাম দিন cযা আপনি মূলত করেন। এই পরিবর্তনশীল নামটি কোনও কার্যকর তথ্য দেয় না, তবে অন্যদিকে, এটিও বিভ্রান্তিমূলক নয়।

তবে সত্যি বলতে, এই মুহুর্তে আপনার আরও গুরুত্বপূর্ণ কাজ করা উচিত। :)


19
যদি ইনপুটটি থাকে INT_MINএবং আর্কিটেকচার দুটিটির পরিপূরক (যা খুব সাধারণ) ব্যবহার করে তবে আপনার শিক্ষকদের কোডটি অপরিজ্ঞাত আচরণ করবে। সেকি। যে একটি চিহ্ন ছেড়ে যাবে। ;-)
অ্যান্ড্রু হেনেল

5
এটি উল্লেখ করা উচিত যে এ ছাড়াও (a/b)*b + a%b ≡ a, ওপির কোডটি /শূন্যের দিকে গোল করে এবং এটিও নির্ভর করে (-c)*(-c) ≡ c*c। এটি যুক্তিযুক্ত হতে পারে যে অতিরিক্ত চেকগুলি মানক গ্যারান্টি থাকা সত্ত্বেও ন্যায়সঙ্গত, কারণ এটি যথেষ্ট পরিমাণে অ-স্পষ্ট। (অবশ্যই এটা সমানভাবে ভাল যুক্তি করা যেতে পারে যে, বরং একটি মন্তব্য প্রাসঙ্গিক মান বিভাগে লিঙ্ক হওয়া উচিত, কিন্তু শৈলী নির্দেশিকা পরিবর্তিত হয়।)
leftaroundabout

7
@ মার্টিনরোসেনৌ আপনি "সম্ভবত" বলছেন। আপনি কি নিশ্চিত যে এটি আসলে ঘটছে বা এটি স্ট্যান্ডার্ড বা অন্য কিছু দ্বারা অনুমোদিত বা আপনি কেবল অনুমান করছেন?
ক্লুত 8

6
@ মার্টিনরোসেনাউ: ঠিক আছে, কিন্তু এই সুইচগুলি ব্যবহার করা এটি আর সি না করে দেবে। জিসিসি / ক্ল্যাংয়ের এমন কোনও সুইচ নেই যা আমি অবগত থাকা কোনও আইএসএতে পূর্ণসংখ্যা বিভাগকে ভেঙে দেয়। যদিও সাইন বিট উপেক্ষা করা হয়ত ধ্রুবক বিভাজনকারীদের জন্য সাধারণ গুণক বিপরীত ব্যবহার করে একটি গতিপথ দিতে পারে। (তবে আমি পরিচিত সমস্ত আইএসএর সাথে একটি হার্ডওয়্যার বিভাগ নির্দেশ রয়েছে যা এটি শূন্যের দিকে ছাঁটাই করে সি৯৯ উপায়ে প্রয়োগ করে, তাই সি %এবং /অপারেটররা কেবল idivএক্স ৮ on এ, বা sdivএআরএম বা যে কোনও কিছুতে সংকলন করতে পারে । তবুও, এটি অনেকটা সম্পর্কিত নয়) সংকলন-সময়-ধ্রুবক বিভাজনকারীদের জন্য দ্রুত কোড-জেন)
পিটার

5
@ টনিক এএফআইকে, এটি সাধারণত সমাধান করা হয় তবে মান হিসাবে এটি ইউবি।
klutt

20

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

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

/ * দ্রষ্টব্য: এটি নেতিবাচক মানগুলির জন্য কাজ করে, কারণ মডুলাসটি স্কোয়ার হয়ে যায় * /


9
সি- %কে সেরা হিসাবে অবশিষ্টাংশ বলা হয় , কারণ এটি এমনকি স্বাক্ষরিত ধরণের ক্ষেত্রেও।
পিটার কর্ডস

15
স্কোয়ারিং গুরুত্বপূর্ণ, তবে আমি মনে করি এটি স্পষ্ট অংশ। যা উল্লেখ করা উচিত তা হ'ল (উদাঃ) -7 % 10 আসলে-7 3 এর চেয়ে বেশি হবে
জ্যাকব রায়হলে

5
"সঠিক গাণিতিক মডুলাস" এর অর্থ কোনও কিছু নয়। সঠিক শব্দটি হ'ল "ইউক্লিডিয়ান মডুলো" (প্রত্যয়টি মনে রাখুন!) এবং এটি প্রকৃতপক্ষে সিটির %অপারেটর নয়।
জানু হুডেক

আমি এই উত্তরটি পছন্দ করি কারণ এটি মডিউলগুলি ব্যাখ্যা করার একাধিক উপায়ে প্রশ্ন নিষ্পত্তি করে। সুযোগ / ব্যাখ্যায় কখনও এ জাতীয় জিনিসটি রাখবেন না। এটি কোড গল্ফ নয়।
হার্পার - মনিকা 21

1
"সঠিক গাণিতিক মডুলাস সর্বদা অ-নেতিবাচক থাকে" - সত্যই নয়। মডুলো অপারেশনের ফলাফলটি একটি সমতুল্য শ্রেণি , তবে ফলাফলটি সেই শ্রেণীর অন্তর্গত ক্ষুদ্রতম অ-নেতিবাচক সংখ্যা হিসাবে গণ্য করা সাধারণ।
ক্লুট্ট

10

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

আধুনিক সি ++ তে (দ্রষ্টব্য: আমি সত্যই জানি না যে সি এর উপরে কোথায় দাঁড়িয়েছে), আপনার অধ্যাপক উভয়ই বিবেচনায় ভুল বলে মনে করছেন।

প্রথমে এই অংশটি এখানে রয়েছে:

if (n == 0) {
        return 0;
}

সি ++ এ, এটি মূলত : একই জিনিস :

if (!n) {
        return 0;
}

এর অর্থ আপনার সময়টি এই জাতীয় কোনও কিছুর সমতুল্য:

while(n != 0) {
    // some implementation
}

এর অর্থ যেহেতু আপনি কেবলমাত্র যখন আপনার বাইরে চলে যাচ্ছেন যখন যখন কোনওভাবে কার্যকর করা হবে না, তবে এখানে সত্যিই এটি যুক্ত করার কোনও কারণ নেই কারণ আপনি লুপের পরে এবং ইফ-তে যেভাবেই সমান হন। যদিও আমার বলা উচিত যে এটি কোনও কারণে এগুলি পৃথক ছিল তবে আপনার যদি এটি থাকা দরকার।

সুতরাং সত্যই, যদি আমি ভুল না করে বিবৃতিটি বিশেষভাবে কার্যকর না হয়।

দ্বিতীয় অংশটি হল যেখানে জিনিসগুলি লোমশ হয়ে উঠেছে:

if (n < 0) {
    n = n * (-1);
}  

ইস্যুটির কেন্দ্রস্থল হ'ল .ণাত্মক সংখ্যা আউটপুটগুলির মডুলাসের আউটপুট।

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

বাইনারি / অপারেটরটি ভাগফল উপস্থাপন করে এবং বাইনারি% অপারেটর দ্বিতীয় দ্বারা প্রথম প্রকাশের বিভাগ থেকে বাকী অংশ দেয়। / বা% এর দ্বিতীয় অপারেন্ডটি শূন্য হলে আচরণটি সংজ্ঞায়িত হয়। ইন্টিগ্রাল অপারেন্ডগুলির জন্য / অপারেটর বাতিল হওয়া কোনও ভগ্নাংশের সাথে বীজগণিতের ভাগফল উপার্জন করে; যদি ভাগের a / b ফলাফলের ধরণের ক্ষেত্রে উপস্থাপনযোগ্য হয়, (a / b) * b + a% b এর সমান।

এবং পরে:

যদি উভয় অপারেশন ননজেটিভ হয় তবে বাকীগুলি ননজেটিভ; যদি তা না হয় তবে অবশিষ্টের সাইনটি প্রয়োগ-সংজ্ঞায়িত।

উদ্ধৃত উত্তরের পোস্টারটি সঠিকভাবে উল্লেখ করেছে, এই সমীকরণের গুরুত্বপূর্ণ অংশটি এখানেই:

(a / b) * b + a% খ

আপনার মামলার উদাহরণ নিলে আপনি এরকম কিছু পাবেন:

-13/ 10 = -1 (integer truncation)
-1 * 10 = -10
-13 - (-10) = -13 + 10 = -3 

একমাত্র ধরা শেষ লাইন:

যদি উভয় অপারেশন ননজেটিভ হয় তবে বাকীগুলি ননজেটিভ; যদি তা না হয় তবে অবশিষ্টের সাইনটি প্রয়োগ-সংজ্ঞায়িত।

তার মানে এই যে এই ক্ষেত্রে কেবলমাত্র সাইনটি প্রয়োগ-সংজ্ঞায়িত বলে মনে হয়। এটি আপনার ক্ষেত্রে সমস্যা হওয়া উচিত নয় কারণ আপনি যেভাবেই এই মানটিকে স্কোয়ার করছেন।

এটি বলেছিল, মনে রাখবেন যে এটি অগত্যা সি ++ বা সি 99 এর পূর্ববর্তী সংস্করণগুলিতে প্রযোজ্য নয়। যদি আপনার অধ্যাপক এটি ব্যবহার করেন তবে এটি হতে পারে।


সম্পাদনা: না, আমি ভুল করছি এটি সি 99 বা পরবর্তী ক্ষেত্রেও মনে হয় :

সি 99 এর প্রয়োজন যখন যখন / বি উপস্থাপনযোগ্য হয়:

(a / b) * b + a% b এর সমান হবে a

এবং অন্য জায়গা :

যখন পূর্ণসংখ্যাগুলি বিভক্ত হয়ে যায় এবং বিভাগটি নিখুঁত হয়, যদি উভয় অপারেন্ডটি ইতিবাচক হয় তবে / অপারেটরের ফলাফলটি বীজগণিত ভাগফলের চেয়ে কম বৃহত্তম সংখ্যার এবং% অপারেটরের ফলাফল ধনাত্মক হয়। অপারেন্ডটি যদি নেতিবাচক হয় তবে / অপারেটরের ফলাফলটি বীজগণিত ভাগফলের চেয়ে কম সংখ্যক কম বা বীজগণিত ভাগফলের চেয়ে ক্ষুদ্রতম পূর্ণসংখ্যা বাস্তবায়ন-সংজ্ঞায়িত হয়, যেমন% অপারেটরের ফলাফলের লক্ষণ is যদি ভাগফল a / b উপস্থাপনযোগ্য হয় তবে এক্সপ্রেশন (a / b) * b + a% b এর সমান হবে।

কোন এএনএসআই সি বা আইএসও সি -5% 10 হওয়া উচিত তা নির্দিষ্ট করে?

তাই হ্যা. এমনকি সি 99 এ, এটি আপনাকে প্রভাবিত করবে বলে মনে হয় না। সমীকরণ একই।


1
আপনি যে অংশগুলি উদ্ধৃত করেছেন সেগুলি এই উত্তরটিকে সমর্থন করে না। "অবশিষ্টাংশের চিহ্নটি বাস্তবায়ন সংজ্ঞায়িত করা হয়" এর অর্থ এই নয় যে (-1)%10উত্পাদন করতে পারে -1বা 1; এর অর্থ এটি উত্পাদন করতে পারে -1বা 9, এবং পরবর্তী ক্ষেত্রে (-1)/10উত্পাদন করতে পারে -1এবং ওপির কোড কখনই শেষ হবে না।
স্টিবাবাসিক

আপনি কি এর জন্য কোনও উত্সকে নির্দেশ করতে পারেন? আমার বিশ্বাস করতে খুব কষ্ট হয় (-1) / 10 হ'ল -1। এটি 0 হওয়া উচিত Also এছাড়াও, (-1)% 10 = 9 প্রশাসক সমীকরণ লঙ্ঘন করেছে বলে মনে হচ্ছে।
চিপস্টার

1
@ শিপস্টার, দিয়ে শুরু করুন (a/b)*b + a%b == a, তারপর দিন a=-1; b=10, দেওয়া (-1/10)*10 + (-1)%10 == -1। এখন, যদি -1/10সত্যিই গোল হয়ে যায় (-আইএনএফের দিকে), তবে আমাদের আছে (-1/10)*10 == -10এবং আপনার (-1)%10 == 9প্রথম মিলটি সমীকরণের প্রয়োজন। অন্যান্য উত্তরের রাজ্যের মতো , এটি বর্তমান মানদণ্ডের মধ্যে কীভাবে কাজ করে তা নয়, তবে এটি কীভাবে এটি ব্যবহার করত তা ব্যবহার করে। এটা সত্যিই যেমন বাকি চিহ্ন, কিন্তু কিভাবে বিভাজন চক্রের এবং কি বাকি তারপর সম্পর্কে না হয়েছে সমীকরণ সন্তুষ্ট যাবে।
ইল্কাচ্চু

1
@ শিপস্টার উত্স হ'ল স্নিপেটস যা আপনি উদ্ধৃত করেছেন। নোট করুন (-1)*10+9=-1, সুতরাং পছন্দ (-1)/10=-1এবং (-1)%10=9পরিচালনা পরিচালনা সমীকরণ লঙ্ঘন করে না। অন্যদিকে পছন্দটি (-1)%10=1যেভাবেই (-1)/10বেছে নেওয়া হোক না কেন পরিচালনা পরিচালনা সমীকরণকে সন্তুষ্ট করতে পারে না ; এর qমতো কোনও পূর্ণসংখ্যা নেই q*10+1=-1
স্টুবাসিক

8

অন্যরা যেমন উল্লেখ করেছে যে, এন == 0 এর জন্য বিশেষ চিকিত্সা বোকামি, যেহেতু প্রতিটি গুরুতর সি প্রোগ্রামারটির পক্ষে এটি স্পষ্ট যে "যখন (এন)" কাজটি করে।

এন <0 এর জন্য আচরণটি সুস্পষ্ট নয়, সে কারণেই আমি এই 2 লাইনের কোড দেখতে পছন্দ করব:

if (n < 0) 
    n = -n;

বা কমপক্ষে একটি মন্তব্য:

// don't worry, works for n < 0 as well

সত্যিই, আপনি কোন সময় নেতিবাচক হতে পারে যে বিবেচনা শুরু করেছিলেন? কোডটি লেখার সময় বা আপনার শিক্ষকের মন্তব্য পড়ার সময়?


1
এন নেতিবাচক কিনা তা নির্বিশেষে এন স্কোয়ারটি ইতিবাচক হবে। তাহলে, কেন প্রথম স্থানে সাইনটি সরাবেন? -3 * -3 = 9; 3 * 3 = 9. 30 বা বিজড়িত বছরগুলিতে আমি এটি শিখার পরে কি গণিতের পরিবর্তন হয়েছে?
মেরোভেক্স

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

5

এটি আমাকে একটি কার্যভারের কথা মনে করিয়ে দেয় যা আমি ব্যর্থ হয়েছি

90 এর দশকে ফিরে। প্রভাষক প্রায় লুপগুলিতে ছড়িয়ে পড়েছিলেন এবং দীর্ঘ গল্প সংক্ষিপ্ত, আমাদের অ্যাসাইনমেন্টটি ছিল একটি ফাংশন লিখতে যা কোনও প্রদত্ত সংখ্যার> 0 এর জন্য অঙ্কের সংখ্যা ফেরত দেয়।

সুতরাং, উদাহরণস্বরূপ, সংখ্যার সংখ্যা 321হবে 3

যদিও নিয়োগ কেবল একটি ফাংশন যা ডিজিটের সংখ্যা উপস্থাপিত লিখতে বললেন, প্রত্যাশা যে আমরা একটি লুপ ব্যবহার করেন 10 দ্বারা ভাগ পর্যন্ত ... ছিল আপনি এটা পাবেন, যেমন বক্তৃতা দ্বারা আচ্ছাদিত

তবে লুপগুলি ব্যবহার করে স্পষ্টভাবে বলা হয়নি তাই আমি: took the log, stripped away the decimals, added 1এবং পরবর্তীকালে পুরো ক্লাসের সামনে ল্যাম্বাস্ট করা হয়েছিল।

পয়েন্ট হ'ল, অ্যাসাইনমেন্টের উদ্দেশ্যটি ছিল লেকচারের সময় আমরা কী শিখলাম সে সম্পর্কে আমাদের বোঝার পরীক্ষা করা । আমি যে বক্তৃতাটি পেয়েছি তা থেকে আমি শিখলাম কম্পিউটার শিক্ষকটি কিছুটা ঝাঁকুনির (তবে সম্ভবত কোনও পরিকল্পনা নিয়ে কোনও ঝাঁকুনি?)


আপনার পরিস্থিতিতে:

সি / সি ++ তে একটি ফাংশন লিখুন যা বর্গাকার সংখ্যার অঙ্কের যোগফল দেয়

আমি অবশ্যই দুটি উত্তর সরবরাহ করতে হবে:

  • সঠিক উত্তর (প্রথম সংখ্যাটি স্কোয়ারিং), এবং
  • উদাহরণটি রেখে ভুল উত্তর, কেবল তাকে খুশি রাখতে ;-)

5
এবং এছাড়াও একটি তৃতীয় এক অঙ্কের যোগফল?
ক্রিসস

@ ক্রিস - হ্যাঁ, আমি তেমন স্মার্ট নই :-(
স্লোলিয়ারার

1
আমি আমার ছাত্র সময় খুব অস্পষ্ট assignment আমার ভাগ ছিল। একজন শিক্ষক কিছুটা হেরফেরের পাঠাগার চেয়েছিলেন তবে তিনি আমার কোড দেখে অবাক হয়েছিলেন এবং বলেছিলেন যে এটি কাজ করছে না। আমাকে তার কাছে উল্লেখ করতে হয়েছিল যে তিনি কখনই তার কার্যভারে অন্তর্নিহিততা সংজ্ঞায়িত করেননি এবং আমি অন্য পছন্দটি করার সময় সে কম বিট 0 হিসাবে বেছে নিয়েছিল। একমাত্র বিরক্তিকর অংশটি হ'ল তিনি আমাকে না বলে পার্থক্যটি কোথায় তা বুঝতে পেরেছিলেন।
17:25

1

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

আমি পর্যাপ্ত স্ট্রাইজ করতে পারি না তা হ'ল "অর্থপূর্ণ পরিবর্তনশীল নাম ব্যবহার করুন"

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

সি কোড সহ আমি আর একটি জিনিস দেখতে পাই যা হ'ল লোকেরা বুদ্ধিমান দেখানোর চেষ্টা করছে। (এন! = 0) ব্যবহার করার পরিবর্তে আমি সবাইকে দেখাব যে আমি (এন) লেখার সময় কতটা চালাক, কারণ এর অর্থ একই জিনিস। ঠিক আছে এটি আপনার সংকলকটিতে রয়েছে তবে আপনি পরামর্শ দিয়েছিলেন যে শিক্ষকের পুরানো সংস্করণটি সেভাবে কার্যকর হয়নি।

একটি সাধারণ উদাহরণ হ'ল একটি অ্যারেতে সূচককে একই সাথে বাড়ানোর সময় উল্লেখ করা হয়; নম্বর [i ++] = আইপ্রেম;

এখন, পরবর্তী প্রোগ্রামার যারা কোডটিতে কাজ করেন তাদের জানতে হবে যে আমি নিয়োগের আগে বা পরে বর্ধিত হয়েছি, যাতে কেউ প্রদর্শিত হতে পারে।

ডিস্কের জায়গার একটি মেগাবাইট সস্তা যে টয়লেট পেপারের রোল, স্থান বাঁচানোর চেষ্টা করার পরিবর্তে স্পষ্টতার জন্য যান, আপনার সহকারী প্রোগ্রামাররা আরও সুখী হবে।


2
আমি সিতে কয়েকবার কয়েকবার প্রোগ্রাম করেছি এবং আমি জানি যে ++iমূল্যায়নের আগে i++বর্ধিতকরণ এবং তারপরে ইনক্রিমেন্ট। while(n)এছাড়াও একটি সাধারণ ভাষা বৈশিষ্ট্য। এই জাতীয় যুক্তির উপর ভিত্তি করে আমি প্রচুর কোড পছন্দ করেছি if (foo == TRUE)। আমি পুনরায় সম্মত: পরিবর্তনশীল নাম, যদিও।
অ্যালান ocallaghan

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

1
নিশ্চিত নয়, এই উত্তরের ডাউনভোটগুলি কীসের জন্য দেওয়া হয়েছিল। আমার কাছে এখানে বর্ণিত সমস্ত কিছুই সত্য এবং গুরুত্বপূর্ণ এবং প্রতিটি বিকাশকারীদের জন্য একটি ভাল পরামর্শ। বিশেষত স্মার্ট-অ্যাস-প্রোগ্রামিং অংশটি যদিও এর while(n)জন্য সবচেয়ে খারাপ উদাহরণ না (আমি আরও "পছন্দ করি" if(strcmp(one, two)))
কাই হাপম্যান

1
এবং তদুপরি, আপনার সত্যিকার অর্থে কারও প্রযোজনা ক্ষেত্রে ব্যবহার করা উচিত এমন সি কোডের মধ্যে পার্থক্য i++এবং ++iসংশোধন করা উচিত নয়।
klutt

2
@ পলম্যাকার্থি আমরা উভয়ই কোড পঠনযোগ্যতার জন্য। তবে এর অর্থ কী তা নিয়ে আমরা একমত নই। এছাড়াও, এটি উদ্দেশ্যমূলক নয়। একজন ব্যক্তির পক্ষে যা পড়া সহজ তা অন্যজনের পক্ষে শক্ত হতে পারে। ব্যক্তিত্ব এবং পটভূমি জ্ঞান এটি দৃ strongly়ভাবে প্রভাবিত করে। আমার মূল বিষয়টি হ'ল আপনি কিছু নিয়ম অন্ধভাবে অনুসরণ করে সর্বাধিক পঠনযোগ্যতা পাবেন না।
klutt

0

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


4
"অতিরিক্ত রিটার্ন হ'ল গোটো স্টেটমেন্ট এবং আমরা সি তে গোটো ব্যবহার করি না।" - এটি একটি বিস্তৃত সাধারণীকরণ এবং খুব দূরের প্রসারিতের সংমিশ্রণ।
এসএস অ্যান

1
"আমরা" অবশ্যই সি তে গোটো ব্যবহার করি that এতে কোনও ভুল নেই।
ক্লুত 15

1
এছাড়াও, এই ফাংশনটির সাথে কোনও ভুল নেইint findChar(char *str, char c) { if(!str) return -1; int i=0; while(str[i]) { if(str[i] == c) return i; i++; } return -1; }
16-24

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

1
@ পিটারক্র্যাসোই দয়া করে আপনার এটির সংস্করণটিও দেখান: পেস্টবিন.
com

0

সমস্যার বিবৃতি বিভ্রান্তিকর, তবে সংখ্যার উদাহরণটি বর্গাকার সংখ্যার অঙ্কের যোগফলের অর্থ স্পষ্ট করে । এখানে একটি উন্নত সংস্করণ:

সি এবং সি ++ সাধারণ উপসেট একটি ফাংশন যে একটি পূর্ণসংখ্যা লাগে লিখুন nসীমার মধ্যে [-10 7 , 10 7 ] যদি: এবং আয় তার প্রতিনিধিত্বের সংখ্যা বর্গের সমষ্টি বেস 10. উদাহরণ nহল 123, আপনার ফাংশন ফিরে আসতে হবে 14(1 2 + 2 2 + 3 2 = 14)।

আপনি যে ফাংশনটি লিখেছেন তা 2 টি বিবরণ ব্যতীত দুর্দান্ত:

  • যুক্তিটির longনির্দিষ্ট রেঞ্জের সমস্ত মানের জন্য উপযুক্ত হওয়া উচিত কারণ টাইপটি longসি স্ট্যান্ডার্ড দ্বারা কমপক্ষে 31 টি মান বিট রাখার গ্যারান্টিযুক্ত, সুতরাং [-10 7 , 10 7 ] এ সমস্ত মান উপস্থাপনের জন্য যথেষ্ট পরিসীমা । (নোট করুন যে প্রকারটি intরিটার্ন টাইপের জন্য যথেষ্ট, যার সর্বাধিক মান 568)
  • %নেতিবাচক অপারেন্ডগুলির জন্য আচরণটি স্বজ্ঞাত নয় এবং এর স্পেসিফিকেশনটি C99 স্ট্যান্ডার্ড এবং পূর্ববর্তী সংস্করণগুলির মধ্যে পরিবর্তিত হয়েছে। আপনার পদ্ধতির এমনকি নেতিবাচক ইনপুটগুলির জন্য কেন বৈধ তা আপনার নথিভুক্ত করা উচিত।

এখানে একটি পরিবর্তিত সংস্করণ:

int sum_of_digits_squared(long n) {
    int s = 0;

    while (n != 0) {
        /* Since integer division is defined to truncate toward 0 in C99 and C++98 and later,
           the remainder of this division is positive for positive `n`
           and negative for negative `n`, and its absolute value is the last digit
           of the representation of `n` in base 10.
           Squaring this value yields the expected result for both positive and negative `c`.
           dividing `n` by 10 effectively drops the last digit in both cases.
           The loop will not be entered for `n == 0`, producing the correct result `s = 0`.
         */
        int c = n % 10;
        s += c * c;
        n /= 10;
    }
    return s;
}

শিক্ষকের উত্তরের একাধিক ত্রুটি রয়েছে:

  • প্রকারের intমানগুলির অপর্যাপ্ত পরিসীমা থাকতে পারে।
  • মান বিশেষ করার প্রয়োজন নেই 0
  • নেতিবাচক মানগুলি অবহেলা করা অপ্রয়োজনীয় এবং এর জন্য অপরিবর্তিত আচরণ থাকতে পারে n = INT_MIN

সমস্যার বিবৃতিতে অতিরিক্ত বাধা দেওয়া (C99 এবং এর মানগুলির ব্যাপ্তি n), কেবল প্রথম ত্রুটি একটি সমস্যা। অতিরিক্ত কোডটি এখনও সঠিক উত্তর উত্পাদন করে।

আপনার এই পরীক্ষায় একটি ভাল নম্বর পাওয়া উচিত, তবে negativeণাত্মক বিষয়গুলির জন্য আপনার বোঝার জন্য একটি লিখিত পরীক্ষায় ব্যাখ্যাটির প্রয়োজন হয় n, অন্যথায় শিক্ষক অনুমান করতে পারেন যে আপনি অজানা এবং কেবল ভাগ্যবান হয়েছেন । মৌখিক পরীক্ষায়, আপনি একটি প্রশ্ন পেয়েছেন এবং আপনার উত্তর এটি পেরেক দিয়েছিল।

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