তথ্য ও যোগাযোগ প্রযুক্তি • প্রোগ্রামিং ভাষা

তথ্য ও যোগাযোগ প্রযুক্তি প্রশ্ন

একটি স্কুলের শিক্ষার্থীদের নাম বর্ণানুক্রমে সাজানোর জন্য ডেটা এন্ট্রি অপারেটর নিচের প্রোগ্রামটি ব্যবহার করে। প্রোগ্রামটি দুটি নাম ইনপুট নিয়ে তুলনা করে। প্রথম অপারেটর দুজন শিক্ষার্থীর নাম স্পেস দিয়ে আলাদা করে ইনপুট দিল: Karim Rahim। দ্বিতীয় অপারেটর এক শিক্ষার্থীর পূর্ণ নাম ইনপুট দিল: Md Karim, যেন সেটি একটি নাম হিসেবে তুলনা হয়।

#include <stdio.h>
#include <string.h>
int main()
{
    char s1[80], s2[80];
    int value;
    scanf("%s %s", s1, s2);
    value = strcmp(s1, s2);
    if (value == 0) {
        printf("%s and %s are equal.
", s1, s2);
    }
    else if (value > 0) {
        printf("%s is greater than %s.
", s1, s2);
    }
    else {
        printf("%s is smaller than %s.
", s1, s2);
    }
    return 0;
}
  1. ক)

    স্ট্রিংয়ের শেষ অক্ষরটি কী হয়?

    (1)
  2. খ)

    char s1[80]; ঘোষণা করলে সর্বোচ্চ কতটি অক্ষর রাখা যায়? ব্যাখ্যা কর।

    (2)
  3. গ)

    প্রথম অপারেটরের ইনপুটের জন্য উদ্দীপকের প্রোগ্রামটির আউটপুট নির্ণয় কর।

    (3)
  4. ঘ)

    দ্বিতীয় অপারেটরের ইনপুটের ক্ষেত্রে প্রোগ্রামটির আউটপুট কী হবে? প্রোগ্রামটি অপারেটরের উদ্দেশ্য পূরণ করবে কি না, যুক্তিসহ বিশ্লেষণ কর।

    (4)

উত্তর ও ব্যাখ্যা

  1. ক)

    AI-তৈরি নমুনা উত্তর স্ট্রিংয়ের শেষ অক্ষরটি হলো নাল ক্যারেক্টার ('\0')।

  2. খ)

    AI-তৈরি নমুনা উত্তর char s1[80]; ঘোষণা করলে অ্যারেতে মোট ৮০টি ঘর থাকে। কিন্তু সি ভাষায় স্ট্রিংয়ের শেষ অক্ষর হিসেবে সবসময় নাল ক্যারেক্টার ('\0') থাকতে হয়। এই নাল ক্যারেক্টারের জন্য শেষ ঘরটি বরাদ্দ রাখতে হয়। তাই ৮০টি ঘরের মধ্যে সর্বোচ্চ ৭৯টি অক্ষর রাখা যায়।

  3. গ)

    AI-তৈরি নমুনা উত্তর scanf("%s %s", s1, s2) এ ইনপুট Karim Rahim দেওয়ায় s1 = "Karim" এবং s2 = "Rahim" হবে।
    strcmp() ফাংশন দুটি স্ট্রিং আভিধানিক ক্রমে তুলনা করে। প্রথম অক্ষর দুটি 'K' ও 'R'। বর্ণানুক্রমে 'K' আগে আসে, অর্থাৎ 'K' < 'R'। তাই Karim আভিধানিক ক্রমে Rahim এর আগে আসবে এবং Karim ছোট বিবেচিত হবে। strcmp() এর রিটার্ন মান -1 (ঋণাত্মক) হবে।
    value == 0 মিথ্যা এবং value > 0 মিথ্যা হওয়ায় শেষের else ব্লক চলবে।
    অতএব আউটপুট হবে: Karim is smaller than Rahim.

  4. ঘ)

    AI-তৈরি নমুনা উত্তর দ্বিতীয় অপারেটরের ইনপুট: Md Karim।
    scanf() এর %s স্পেস (space) ক্যারেক্টার পর্যন্ত পড়ে, অর্থাৎ স্ট্রিংয়ের ভেতরে স্পেস থাকতে পারে না। তাই প্রথম %s কেবল Md পড়বে এবং দ্বিতীয় %s পরবর্তী শব্দ Karim পড়বে। ফলে s1 = "Md" এবং s2 = "Karim" হবে। অর্থাৎ পুরো নামটি একটি স্ট্রিং হিসেবে ইনপুট না হয়ে দুটি আলাদা স্ট্রিং হিসেবে ইনপুট হয়েছে।
    strcmp("Md", "Karim") এ প্রথম অক্ষর 'M' ও 'K' তুলনা করা হবে। বর্ণানুক্রমে 'M' পরে আসে, অর্থাৎ 'M' > 'K'। দৈর্ঘ্য কম (২টি অক্ষর) হলেও আভিধানিক ক্রমে Md বড় বিবেচিত হবে। strcmp() এর রিটার্ন মান 1 হবে। value > 0 সত্য হওয়ায় আউটপুট হবে: Md is greater than Karim.
    এই ফলে Md ও Karim দুটি আলাদা নামের মতো তুলনা হয়েছে, কিন্তু অপারেটরের উদ্দেশ্য ছিল Md Karim কে একটি পূর্ণ নাম হিসেবে তুলনা করা। তাই প্রোগ্রামটি উদ্দেশ্য পূরণ করে না। এজন্য নামের অংশগুলোর মধ্যে স্পেসের বদলে আন্ডারস্কোর (যেমন Md_Karim) ব্যবহার করে ইনপুট দিতে হবে, অথবা স্পেসসহ স্ট্রিং ইনপুট নেওয়ার মতো ব্যবস্থা নিতে হবে। প্রথম অপারেটরের ইনপুটে প্রতিটি নাম একটি শব্দের হওয়ায় সেখানে প্রোগ্রামটি সঠিকভাবে কাজ করেছে।

আরও প্রশ্ন অনুশীলন করতে অ্যাপে যাও