টপিকঃ জোড়-বিজোড় সংখ্যা বের করার প্রোগ্রাম (সি প্রোগ্রাম) .

জোড়-বিজোড় সংখ্যা বের করার প্রোগ্রাম (সি প্রোগ্রাম) .

ইনপুট :

প্রথম লাইনে একটি সংখ্যা থাকবে। সংখ্যাটির মান যত, ততটি লাইনে একটি করে অঋণাত্মক পূর্ণসংখ্যা দেওয়া থাকবে। একটি সংখ্যায় সর্বোচ্চ একশটি অঙ্ক থাকতে পারে।

আউটপুট :

প্রতিটি পূর্ণসংখ্যার জন্য, সংখ্যাটি জোড় হলে even আর বিজোড় হলে odd প্রিন্ট করতে হবে।

উদাহরণ:

ইনপুট:

3
100
0
1111



আউটপুট:

even
even
odd

----------------------
 

#include <stdio.h>
    #include <stdlib.h>

    int main()
    {
        int n;
        long long inum;
        scanf("%d", &n);
        while(n--)
        {
            scanf("%lld", &inum);
            if(inum == 0 || inum % 2 == 0)
            {
                printf("even\n");
            }

            else
            {
                printf("odd\n");
            }
        }

        return 0;
    }

প্রোগ্রামটা কম্পাইলারে ঠিকভাবে রান করছে , কিন্তু কিভাবে কাজ করছে , কেও একটু বুজিয়ে বলতে পারবেন ?
while(n--) < এ কি বুজানো হয়েছে ? এবং n-- এর জায়গায় যদি n=n-1 দেই , তাইলে প্রোগ্রাম টা একটু চেঞ্জ হয়ে যায় (১ বার কম ইনপুট দেওয়া যায়) । কেন ?

Re: জোড়-বিজোড় সংখ্যা বের করার প্রোগ্রাম (সি প্রোগ্রাম) .

আপনি কি while লুপের ব্যবহার জানেন? বা কতটুকু জানেন, তা বললে বুঝাতে সহজ হবে।

"সংকোচেরও বিহ্বলতা নিজেরই অপমান। সংকটেরও কল্পনাতে হয়ও না ম্রিয়মাণ।
মুক্ত কর ভয়। আপন মাঝে শক্তি ধর, নিজেরে কর জয়॥"

Re: জোড়-বিজোড় সংখ্যা বের করার প্রোগ্রাম (সি প্রোগ্রাম) .

ব্যাবহার তো জানি , কিন্তু কেমনে বলব কতটুকু জানি ?

Re: জোড়-বিজোড় সংখ্যা বের করার প্রোগ্রাম (সি প্রোগ্রাম) .

প্রোগ্রামটা কিভাবে কাজ করছে বুজিয়ে বললে চলবে ভাই ।  smile

Re: জোড়-বিজোড় সংখ্যা বের করার প্রোগ্রাম (সি প্রোগ্রাম) .

while(expression)
{
    //loop body
}

while লুপের স্ট্রাকচার উপরের মত। এখানে while লুপের পরে ব্রেকেটের মাঝে সাধারণত আমরা রিলেশনাল অপারেটর (<, >, ==, !=, <=, >=) সহ বিভিন্ন expression  দেখে অভ্যস্ত যেমন,

i = 1;
while(i < 10)
{
   printf("%d " i);
   i++;
}

উপরের কোডটি ১ - ৯ প্রিন্ট করবে। কারণ শুরুতে i = 1 এবং while এর কন্ডিশন টেস্ট (expression) i < 10 সত্যি। তাই লুপ বডি কাজ করবে। লুপ বডিতে i এর মান প্রিন্ট করে এর মান এক বাড়িয়ে দিবে। যখন i এর মান ১০ তখন expression  i < 10 মিথ্যা হয়ে যাওয়ায় লুপ বডি আর কাজ করবে না।

কিন্তু while এর মধ্যে আমরা যেন কোন expression দিতে পারি। যেমন  while(a = b), while(scanf("%d", &n) ==  ), while(a + b) ইত্যাদি। এখানে যদি expression এর ভ্যালু যদি non zero হয় তাহলে  এটাকে কম্পাইলার এটাকে সত্যি হিসাবে বিবেচনা করবে আর যদি zero হয় তাহলে সেটা মিথ্যা হিসাবে বিবেচিত হবে।  while(10) যদি থাকে তাহলে এটা সব সময় কাজ করবে। কারণ ১০ নন জিরো। আবার  while(0) কখনই কাজ করবে না।

আপনার প্রোগ্রামে প্রথমে  scanf("%d", &n); লাইনের মাধ্যমে n এর মান টার্মিনাল থেকে নেওয়া হয়েছে। ধরি n এর মান ৩। এখন আপনার  while statement দেখা যাক।

while(n--) এখানে n এর মান ৩ হলে আমরা পাচ্ছি  while(3--) যার মান non zero তাই লুপ বডি কাজ করবে।


এবার দেখা যাক n-- এবং n = n-1 ব্যবহারের মাঝে সমস্যা কোথায়।

n-- এর মানে হচ্ছে n = n-1 অর্থাৎ n এর সাথে ১ বিয়োগ দিয়ে বিয়োগফল n এ রাখা। অর্থাৎ n  এর মান ৩ হলে n-- এর পর n এর মান হবে ২। সে হিসাবে  while এর মাঝে n-- এবং n = n-1 এর মাঝে সমস্যা থাকার কথা না। কিন্তু হচ্ছে।

কারণ n-- এর ভ্যালু কোথাও এসাইন করা হলে প্রথমে n এর পুরাতন মান এসাইন করা হয় এবং তারপর n এর মান ১ কমানো হয়। নীচের উদাহরণ দেখুন

int a, b =10;

a = b--;

এখানে a = 10 এবং b = 9 হবে। অর্থাৎ b এর মান (১০) এটা প্রথমে a কে দিয়েছে ফলে a এর মান ১০ এবং তারপর b-- কাজ করেছে ফলে b এর মান কমে ৯ হয়েছে।

এখন আপনার while লুপ n  এর মান ৩ হলে অবস্থা দাঁড়াচ্ছে-
while(n--) => while(3--) এখানে প্রথমে while(n) এটা সত্য কিনা (নন জিরো হলেই সত্য) তা টেস্ট করবে তারাপর n-- এর কাজ হবে অর্থাৎ n এর মান এক কমিয়ে দিবে।

আপনার while লুপ এ n এর মান ৩ দিলে লুপ ৩ বার চলবে।

n = 3; while(3--) => while(3) টেস্ট করবে, তারপর n-- এর কাজ হবে অর্থাৎ n = 2 হবে।
n = 2; while(2--) => while(2) টেস্ট করবে, তারপর n-- এর কাজ হবে অর্থাৎ n = 1 হবে।
n = 1; while(1--) => while(1) টেস্ট করবে, তারপর n-- এর কাজ হবে অর্থাৎ n = 0 হবে।
n = 0; while(0--) => while(0) টেস্ট করবে এবং 0 হওয়ায় লুপ বডি কাজ করবে না।

এখন যদি while(n = n-1) ব্যবহার করেন তাহলে কি হবে দেখা যাক।

n = 3; while(n = n-1) => while(n = 3-1) => while(n=2) => while(2) এবং n = 2 হবে।
n = 2; while(n = n-1) => while(n = 2-1) => while(n=1) => while(1) এবং n = 1 হবে।
n = 1; while(n = n-1) => while(n = 1-1) => while(n=0) => while(0) এবং n = 0 হবে। লুপ থেকে বের হয়ে আসবে।

তাহলে দেখা যাচ্ছে এখানে লুপ চলবে দুইবার।

আশা করছি কিছুটা বুঝাতে পরেছি। না হলে প্রশ্ন করেন; ফোরামে অনেক এক্সপার্ট আছেন তারা আরও ভাল ভাবে সাহায্য করতে পারবেন।

"সংকোচেরও বিহ্বলতা নিজেরই অপমান। সংকটেরও কল্পনাতে হয়ও না ম্রিয়মাণ।
মুক্ত কর ভয়। আপন মাঝে শক্তি ধর, নিজেরে কর জয়॥"

Re: জোড়-বিজোড় সংখ্যা বের করার প্রোগ্রাম (সি প্রোগ্রাম) .

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