প্রোগ্রামিং সংক্রান্ত নানান বই ঘরে বসে অনলাইনে অর্ডার করতে ক্লিক করুন এখানে

বাংলা ভাষায় পাইথন দিয়ে প্রোগ্রামিং শেখার ফ্রি বই - http://pybook.subeen.com

[প্রোগ্রামিং বইঃ অধ্যায় ছয়] অ্যারে।

এতক্ষণে তোমাদের প্রোগ্রামিং জ্ঞান-বুদ্ধি একটু বেড়েছে। চলো, এবার তাহলে কিছু জনসেবামূলক কর্মকাণ্ড করা যাক। আমরা স্কুলের প্রিয় গণিত শিক্ষকের জন্য পরীক্ষার ফলাফল বের করার প্রোগ্রাম লিখে দেব। ওই স্কুলে প্রথম সাময়িক, দ্বিতীয় সাময়িক ও বার্ষিক এই তিনটি পরীক্ষাই 100 নম্বরের হয়। তারপর বার্ষিক পরীক্ষার 50%, দ্বিতীয় সাময়িক পরীক্ষার 25% ও প্রথম সাময়িক পরীক্ষার 25% নিয়ে চূড়ান্ত ফলাফল প্রকাশ করা হয়। তাহলে আমাদের প্রোগ্রামের ইনপুট হচ্ছে ওই তিনটি পরীক্ষার নম্বর। আমাদেরকে চূড়ান্ত ফলাফল দেখাতে হবে। এটি কোনো ব্যাপারই নয়:

 #include <stdio.h>   
 int main()   
 {   
     int ft_marks, st_marks, final_marks;   
     double total_marks;   
     ft_marks = 80;   
     st_marks = 74;   
     final_marks = 97;   
     total_marks = ft_marks / 4.0 + st_marks / 4.0 + final_marks / 2.0;   
     printf("%0.0lf\n", total_marks);   
     return 0;   
 }  
 প্রোগ্রাম: ৬.১  

প্রোগ্রামটির আউটপুট 87। (কিন্তু আমি যদি total_marks = ft_marks / 4.0 + st_marks / 4.0 + final_marks / 2.0; না লিখে এভাবে লিখতাম total_marks = ft_marks / 4 + st_marks / 4 + final_marks / 2; তাহলে আউটপুট আসে 86। কারণ কী? কম্পিউটারের মাথা খারাপ নাকি আমার?)

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

#include

int main()
{
int ft_marks_1, st_marks_1, final_marks_1, ft_marks_2, st_marks_2, final_marks_2, ft_marks_3, st_marks_3, final_marks_3,

তোমরা নিশ্চয়ই বুঝতে পারছ, আমি কী করতে যাচ্ছি? বলো তো এভাবে প্রোগ্রামটি লিখতে গেলে মোট কয়টি ভেরিয়েবলের দরকার? 160টি। স্যারের কষ্ট কমাতে গিয়ে আমাদের কষ্ট এত বাড়ানোর কোনো মানে হয় না। কিন্তু এধরনের প্রোগ্রাম তো আমাদের প্রায়ই লিখতে হবে। চিন্তা নেই! প্রায় সব প্রোগ্রামিং ল্যাংগুয়েজেই অ্যারে (Array) নামে একটি চমৎকার জিনিস আছে। এতে একই ধরনের অনেকগুলো ভেরিয়েবল একসঙ্গে রাখা যায়। ভেরিয়েবলের যেমন নাম রাখি, অ্যারের বেলাতেও তেমন একটি নাম দিতে হয়। Cতেও অ্যারে আছে।

ভেরিয়েবলের যেমন একটি ডাটা টাইপ থাকে, অ্যারেরও থাকে। অ্যারেটি যে ডাটা টাইপের হবে তাতে কেবল সেই রকম ডাটাই রাখা যাবে। যেমন char টাইপের অ্যারেতে কেবল char টাইপের জিনিস থাকবে।

অ্যারেতে কয়টি উপাদান থাকবে সেটি শুরুতেই বলে দিতে হয়।
int ara[10]; এভাবে আমরা একটি অ্যারে ডিক্লেয়ার করতে পারি, যার নাম হচ্ছে ara, যেটিতে কেবল ইন্টিজার টাইপের ডাটা থাকবে আর এই অ্যারেতে মোট দশটি সংখ্যা রাখা যাবে। প্রথমটি হচ্ছে ara[0] (হ্যাঁ, ara[1] না কিন্তু), দ্বিতীয়টি ara[1], তৃতীয়টি ara[2], এভাবে দশম সংখ্যাটি হচ্ছে ara[9]। অর্থাৎ, ara[i] হচ্ছে i+1তম উপাদান।

এবারে চলো অ্যারে নিয়ে একটু খেলাধুলা করা যাক। প্রতিটি প্রোগ্রাম কিন্তু অবশ্যই কম্পিউটারে চালিয়ে দেখবে।


 #include <stdio.h>   
 int main()   
 {   
     int ara[5] = {10, 20, 30, 40, 50};   
     printf("First element: %d\n", ara[0]);   
     printf("Third element: %d\n", ara[2]);    
     return 0;   
 }  
 প্রোগ্রাম: ৬.২  

আউটপুট ঠিকঠাক দেখতে পাচ্ছ?

আরেকটি প্রোগ্রাম:

 #include <stdio.h>   
 int main()   
 {    
     int ara[5] = {6, 7, 4, 6, 9};   
     printf("%d\n", ara[-1]);   
     printf("%d\n", ara[5]);   
     printf("%d\n", ara[100]);    
     return 0;   
 }  
 প্রোগ্রাম: ৬.৩  

এটির জন্য কী আউটপুট আসা উচিত? আমি জানি না এবং এটি জানা সম্ভব নয়। যেকোনো ধরনের সংখ্যা আসতে পারে। এগুলোকে গারবেজ (garbage) বলে। কারণ আসলে তো ওই অ্যারেতে -1, 5, 100 এই ইনডেক্স বলতে কিছু নেই। অ্যারেটির দৈর্ঘ্যই হচ্ছে 5 সুতরাং ইনডেক্স হবে 0 থেকে 4।

এখন কোনো অ্যারের সব উপাদান যদি একসঙ্গে দেখাতে চাই, তাহলে উপায় কী? উপায় হচ্ছে প্রথম উপাদান (ara[0]), দ্বিতীয় উপাদান (ara[1]), তৃতীয় উপাদান (ara[2]) … এভাবে একে একে সবগুলো প্রিন্ট করা। আর তার জন্য অবশ্যই আমরা লুপের সাহায্য নেব।

 #include <stdio.h>   
 int main()   
 {   
     int ara[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};   
     int i;   
     for(i = 0; i < 10; i++) {   
         printf("%d th element is: %d\n", i+1, ara[i]);   
     }    
     return 0;   
 }  
 প্রোগ্রাম: ৬.৪  

আর যদি শেষ উপাদান থেকে প্রথম উপাদান পর্যন্ত দেখাতে হতো? কোনো সমস্যা নেই, শুধু লুপে এ indexটি 9 থেকে 0 পর্যন্ত আনলেই চলবে। এখন তোমরা প্রোগ্রামটি লিখে ফেলো।

এবারে একটি ছোট সমস্যা। কোনো একটি অ্যারেতে দশটি উপাদান আছে, সেগুলো বিপরীত ক্রমে রাখতে হবে। অর্থাৎ দশম উপাদানটি হবে প্রথম উপাদান, প্রথমটি হবে দশম, দ্বিতীয়টি হবে নবম, নবমটি হবে দ্বিতীয়.. এই রকম। তার জন্য আমরা যেটি করতে পারি, আরেকটি অ্যারের সাহায্য নিতে পারি। দ্বিতীয় অ্যারেটিতে প্রথম অ্যারের উপাদানগুলো বিপরীত ক্রমে রাখবো। তারপর দ্বিতীয় অ্যারেটি প্রথম অ্যারেতে কপি করে ফেলব।

 #include <stdio.h>   
 int main()   
 {   
     int ara[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};   
     int ara2[10];   
     int i, j;   
     for(i = 0, j = 9; i < 10; i++, j--) {   
         ara2[j] = ara[i];   
     }    
     for(i = 0; i < 10; i++) {   
         ara[i] = ara2[i];   
     }   
     for(i = 0; i < 10; i++) {   
         printf("%d\n", ara[i]);   
     }   
     return 0;   
 }  
 প্রোগ্রাম: ৬.৫  

এখানে লক্ষ করো যে প্রথম অ্যারেটির ক্ষেত্রে আমি তৃতীয় বন্ধনীর ভেতর অ্যারের উপাদান সংখ্যা বলে দিইনি, কারণ সি-এর কম্পাইলার দ্বিতীয় বন্ধনীর ভেতর সংখ্যাগুলো দেখেই বুঝে নিতে পারে যে araতে দশটি উপাদান আছে। দ্বিতীয় অ্যারে অর্থাৎ ara2তে এখন কোনো কিছু নেই। তাই শুরুতেই বলে দিতে হবে যে তাতে কয়টি উপাদান থাকবে। তাহলে কম্পাইলার সেই অনুসারে কম্পিউটারের মেমোরির মধ্যে অ্যারের জন্য জায়গা করে নেবে।

প্রোগ্রামটি ভালোভাবেই কাজ করছে। কিন্তু তোমরা একটু চিন্তাভাবনা করলেই বুঝতে পারবে যে দ্বিতীয় অ্যারেটি ব্যবহার করার কোনো দরকার ছিল না। আমরা একটি বহুল প্রচলিত পদ্ধতিতেই কাজটি করতে পারতাম।
int temp;
temp = ara[9];
ara[9] = ara[0];
ara[0] = temp;
প্রথম ও দশম উপাদান অদলবদল হয়ে গেল। তারপর
temp = ara[8];
ara[8] = ara[1];
ara[1] = temp;
দ্বিতীয় ও নবম উপাদান অদলবদল হয়ে গেল। তাহলে চলো প্রোগ্রামটি লিখে ফেলি:

 #include <stdio.h>   
 int main()   
 {   
     int ara[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};    
     int i, j, temp;   
     for(i = 0, j = 9; i < 10; i++, j--) {   
         temp = ara[j];   
         ara[j] = ara[i];   
         ara[i] = temp;   
     }    
     for(i = 0; i < 10; i++) {   
         printf("%d\n", ara[i]);   
     }   
     return 0;   
 }  
 প্রোগ্রাম: ৬.৬  

প্রোগ্রামটি চালাও। কী দেখলে? আউটপুট কি এরকম?
10
20
30
40
50
60
70
80
90
100

তারমানে কাজ হয়নি! আসলে আমি একটি ছোট্ট ভুল করেছি, সেটি তোমরা খুঁজে বের করো। এ ধরনের ভুলকে বলে বাগ (bug), তখন প্রোগ্রাম ঠিকমতো রান করে কিন্তু সঠিক আউটপুট দেয় না। আমার কোডে বাগ আছে, তোমরা ডিবাগ (debug) করো (মানে বাগটি বের করে ঠিক করো)।

এখন চলো আমাদের আগের সমস্যায় ফিরে যাই। আমরা এখন প্রথম সাময়িক পরীক্ষায় সবার গণিতের নম্বর একটি অ্যারেতে রাখব, দ্বিতীয় সাময়িক পরীক্ষার নম্বর আরেকটি অ্যারেতে, বার্ষিক পরীক্ষার নম্বরের জন্য আরও একটি এবং রেজাল্টের জন্যও একটি অ্যারে ব্যবহার করব।

int ft_marks[40], st_marks[40], final_marks[40];
double total_marks[40];

যার রোল নম্বর 1 তার নম্বরগুলো থাকবে অ্যারের প্রথম ঘরে (মানে index 0 হবে)। এখন বলো তো total_marks[34]-এ কার সর্বমোট নম্বর আছে? যার রোল নম্বর 35। তাহলে কারও রোল নম্বর n হলে তার সর্বমোট নম্বর হচ্ছে total_marks[n-1]।

এখন প্রোগ্রামটি লিখে ফেলা যাক:

 #include <stdio.h>   
 int main()   
 {   
     int ft_marks[40] = {83, 86, 97, 95, 93, 95, 86, 52, 49, 41, 42, 47, 90, 59, 63, 86, 40, 46, 92, 56, 51, 48, 67, 49, 42, 90, 42, 83, 47, 95, 69, 82, 82, 58, 69, 67, 53, 56, 71, 62},   
     st_marks[40] = {86, 97, 95, 93, 95, 86, 52, 49, 41, 42, 47, 90, 59, 63, 86, 40, 46, 92, 56, 51, 48, 67, 49, 42, 90, 42, 83, 47, 95, 69, 82, 82, 58, 69, 67, 53, 56, 71, 62, 49},   
     final_marks[40] = {87, 64, 91, 43, 89, 66, 58, 73, 99, 81, 100, 64, 55, 69, 85, 81, 80, 67, 88, 71, 62, 78, 58, 66, 98, 75, 86, 90, 80, 85, 100, 64, 55, 69, 85, 81, 80, 67, 88, 71};   
     int i;   
     double total_marks[40];   
     for(i = 0; i < 40; i++) {   
         total_marks[i] = ft_marks[i] / 4.0 + st_marks[i] / 4.0 + final_marks[i] / 2.0;   
     }    
     for(i = 1; i <= 40; i++) {   
         printf("Roll NO: %d\tTotal Marks: %0.0lf\n", i, total_marks[i-1]);   
     }   
     return 0;   
 }  
 প্রোগ্রাম: ৬.৭  

রান করে দেখো, কী সুন্দর আউটপুট! printf ফাংশনের ভেতরে দেখো এক জায়গায় আমি \t লিখেছি, এতে ট্যাব (Tab) প্রিন্ট হবে (কিবোর্ডের বাঁ দিকে দেখো)। রোল নং প্রিন্ট করার পরে একটি ট্যাব দিয়ে টোটাল মার্কস প্রিন্ট করলে দেখতে একটু ভালো লাগে এই জন্য \t ব্যবহার করেছি, এমনিতে কোনো দরকার নেই।

কিন্তু এত সুন্দর প্রোগ্রাম দেখে তোমার শিক্ষক কোথায় তোমাকে একটু চটপটি খাওয়াবেন না উল্টা আরেকটি আবদার করে বসলেন। কোন নম্বর কতজন পেয়েছে সেটি উনি দেখতে চান। মানে 50 কতজন পেল, 51 কতজন পেল … এই রকম আর কি। বাকি অংশ পড়ার আগে প্রোগ্রামটি তোমরা নিজে নিজে লিখার চেষ্টা করো। এখন ইচ্ছা না করলে বইটি পড়া বন্ধ করে দাও এবং পরে কোনো একসময় চেষ্টা করবে।

আশা করি, তোমাদের মধ্যে কেউ কেউ প্রোগ্রামটি লিখে ফেলেছ। যদি কমপক্ষে এক ঘণ্টা চেষ্টার পরেও লিখতে না পারো তাহলে এখন আমরা সমাধানের চেষ্টা করতে পারি। শুরুতেই একটি ব্যাপার খেয়াল করো যে কেউ কিন্তু 50-এর নিচে নম্বর পায়নি। তাই 50 থেকে 100 পর্যন্ত কোন নম্বর কতজন পেল সেটি বের করলেই চলবে। আমার মাথায় প্রথমেই যে সমাধান আসছে সেটি হলো total_marks অ্যারেতে প্রথমে দেখব, কয়টি 50 আছে, তারপর আবার দেখব কয়টি 51 আছে … এভাবে 100 পর্যন্ত দেখব। মানে 50 থেকে 100 পর্যন্ত সব সংখ্যার জন্য total_marks অ্যারেতে সংখ্যাগুলো চেক করব।
for(marks = 50; marks <= 100; marks++) { লুপের সাহায্যে প্রথমে marks-এর মান 50, তারপরে 51, এভাবে এক এক করে বাড়াব 100 পর্যন্ত।
count = 0; ধরে নিচ্ছি শূন্য জন 'marks' নম্বর পেয়েছে। marks-এর সব কটি মানের জন্যই প্রথমে আমরা এই কাজটি করব। এবারে total_marks অ্যারেতে দেখব যে কোনো নম্বর যদি marks-এর সমান হয়, তবে count-এর মান এক বাড়িয়ে দেব। তাহলে কোনো একটি নম্বর (marks) যতবার অ্যারেতে আছে, count-এর মান তত হবে।
  for(i = 0; i < 40; i++) {
      if(total_marks[i] == marks) {
          count++;
      }
  } 
  printf("Marks: %d Count: %d\n", marks, count); এখানে আমরা প্রতিটি marks এবং সেটি  কতবার আছে (count) তা প্রিন্ট করে দিচ্ছি।
}
তাহলে পুরো প্রোগ্রাম লিখে ফেলি:
 #include <stdio.h>   
 int main()   
 {   
     int marks, i, count;   
     int total_marks[] = {86, 78, 94, 68, 92, 78, 64, 62, 72, 61, 72, 66, 65, 65, 80, 72, 62, 68, 81, 62, 56, 68, 58, 56, 82, 70, 74, 78, 76, 84, 88, 73, 62, 66, 76, 70, 67, 65, 77, 63};   
     for(marks = 50; marks <= 100; marks++) {   
         count = 0;   
         for(i = 0; i < 40; i++) {   
             if(total_marks[i] == marks) {   
                 count++;   
             }   
         }   
         printf("Marks: %d Count: %d\n", marks, count);   
     }        
     return 0;   
 }  
 প্রোগ্রাম: ৬.৮  

তেমন কঠিন কিছু নয়। নেস্টেড ফর লুপ ব্যবহার করে সহজ-সরল সমাধান করে ফেললাম। আচ্ছা বলো তো if-এর ভেতর যে শর্তটি আমরা পরীক্ষা করছি (total_marks[i] == marks) এই কাজটি প্রোগ্রামে কতবার হয়? বাইরের লুপটি ঘুরবে 51 বার এবং প্রতিবারের জন্য ভেতরের লুপটি ঘুরবে 40 বার। তাহলে মোট 51 x 40 = 2040 বার।

ওপরের প্রোগ্রামটি আমরা এখন একটু অন্যভাবে লিখার চেষ্টা করব। নিচের প্রোগ্রামটি চটপট টাইপ করে ফেলো এবং রান করো:

 #include <stdio.h>   
 int main()   
 {   
     int i;   
     int total_marks[] = {86, 78, 94, 68, 92, 78, 64, 62, 72, 61, 72, 66, 65, 65, 80, 72, 62, 68, 81, 62, 56, 68, 58, 56, 82, 70, 74, 78, 76, 84, 88, 73, 62, 66, 76, 70, 67, 65, 77, 63};   
     int marks_count[101];   
     for(i = 0; i < 101; i++) {   
         marks_count[i] = 0;   
     }   
     for(i = 0; i < 40; i++) {   
         marks_count[total_marks[i]]++;   
     }   
     for(i = 50; i <= 100; i++) {   
         printf("Marks: %d Count: %d\n", i, marks_count[i]);   
     }        
     return 0;   
 }  
 প্রোগ্রাম: ৬.৯  

এখানে আমি যেটি করেছি, একটি অতিরিক্ত অ্যারে ব্যবহার করেছি। marks_count একটি ইন্টিজার টাইপের অ্যারে এবং marks_count[n] দিয়ে আমরা বুঝব n সংখ্যাটি কতবার total_marks-এর মধ্যে আছে। নম্বর যেহেতু 0 থেকে 100-এর মধ্যে হতে পারে তাই আমরা ওই অ্যারেতে মোট 101টি সংখ্যা রাখার ব্যবস্থা করলাম। int marks_count[101];
শুরুতে যেহেতু কিছুই জানি না, তাই ধরে নিই, সব সংখ্যা শূন্য বার আছে। তাই marks_count অ্যারের সব ঘরে 0 বসিয়ে দিই:
for(i = 0; i < 101; i++) { marks_count[i] = 0; } এখন total_marks অ্যারের প্রতিটি সংখ্যার জন্য marks_count অ্যারের ওই ঘরের মান এক বাড়িয়ে দিই। for(i = 0; i < 40; i++) { marks_count[total_marks[i]]++; } বুঝতে সমস্যা হচ্ছে নাকি? একটু চিন্তা করো। যখন i-এর মান 0, তখন total_marks[i] হচ্ছে total_marks[0], অর্থাৎ 86। এখন আমাদের দরকার হচ্ছে marks_count অ্যারের ওই ঘরটার (মানে marks_count[86]) মান এক বাড়িয়ে দেওয়া। শুরুতে ছিল শূন্য, এখন হবে এক। আমরা কিন্তু সে কাজটিই করেছি marks_count[total_marks[i]]-এর মান এক বাড়িয়ে দিয়েছি marks_count[total_marks[i]]++; আসলে ব্যাপারটি এইভাবেও লেখা যেত: t_m = total_marks[i]; marks_count[t_m]++; এখনো যারা মাথা চুলকাচ্ছ তারা নিচের প্রোগ্রামটি কম্পিউটারে রান করাও। এখানে প্রতিবার marks_count[total_marks[i]]++; করার পরে marks_count অ্যারেটি আমরা এক লাইনে প্রিন্ট করেছি।
 #include <stdio.h>   
 int main()   
 {   
     int i, j;   
     int total_marks[] = {6, 7, 4, 6, 9, 7, 6, 2, 4, 3, 4, 1};   
     int marks_count[11];   
     for(i = 0; i < 11; i++) {   
         marks_count[i] = 0;   
     }   
     for(i = 0; i < 12; i++) {   
         marks_count[total_marks[i]]++;   
         for(j = 0; j <= 10; j++) {   
             printf("%d ", marks_count[j]);   
         }   
         printf("\n");      
     }       
     return 0;   
 }  
 প্রোগ্রাম: ৬.১০  


পরের অধ্যায়

৪১টি মন্তব্য:

  1. উত্তরগুলি
    1. Trace the variables first.. when i == 4 then j == 5
      So when i == 5 then j == 4 !! Right?
      And then the problem raises....think carefully hope u will find it...

      মুছুন
  2. ভাইয়া এভাবে তো আরো সহজে করা যাচ্ছে। ২ টা array বা temp ব্যবহার করা লাগতেছে না।

    উত্তরমুছুন
    উত্তরগুলি
    1. তোমার আগের কমেন্টটা (যেখানে কোড আছে) পাবলিশ করলাম না। করতে পারলে তো ভালো, অভিনন্দন! বাকীরা করুক।

      মুছুন
  3. array বা temp ছাড়া ৬.৫ এভাবেও করা যায়:

    #include

    int main()

    {
    int ara[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
    int i, j;
    for(i = 0, j = 9; i < 10; i++, j--){
    printf("%d\n", ara[j]);
    }
    return 0;
    }

    উত্তরমুছুন
    উত্তরগুলি
    1. আমার মনে হয় এটা ৬.৪ এর অনুশীলনীর সমাধান হয়েছে। array টা একি আছে , কিন্তু উপাদানগূলো উল্টাভাবে দেখানো হয়েছে। কিন্তু ৬.৫ এ প্রশ্ন ছিল array টাকেই উলটো করে সাজানো...

      মুছুন
  4. #include
    int main()
    {
    int i;
    int total_marks[] = {86, 78, 94, 68, 92, 78, 64, 62, 72, 61, 72, 66, 65, 65, 80, 72, 62, 68, 81, 62, 56, 68, 58, 56, 82, 70, 74, 78, 76, 84, 88, 73, 62, 66, 76, 70, 67, 65, 77, 63};
    int marks_count[101];
    for(i = 0; i < 101; i++) {
    marks_count[i] = 0;
    }
    for(i = 0; i < 40; i++) {
    marks_count[total_marks[i]]++;
    }
    for(i = 50; i <= 100; i++) {
    printf("Marks: %d Count: %d\n", i, marks_count[i]);
    }
    return 0;
    }
    প্রোগ্রাম: ৬.৯
    আমি উপরের সমস্যাটার কিছুই বুঝিনি । ব্যাপারটা একটু ব্যাখ্যা করবেন কি ?
    আর আমি এই সমস্যাটা না বুঝেই পরের অধ্যায়ে চলে গেছি ।

    উত্তরমুছুন
    উত্তরগুলি
    1. তুমি এক কাজ কর। ঠান্ডা মাথায় প্রতিটি লাইনের ব্যাখ্যা লেখ (এই কমেন্টের জবাবে)। তাহলে তোমার নিজের বুঝতে সুবিধা হবে। আর কোনো কিছু ভুল হলে আমি সেটি ধরিয়ে দেবার চেষ্টা করব।

      মুছুন
    2. প্রথমত, আমি ভেরিয়েবল ডিক্লেয়ার করেছি ।
      তারপর, প্রথমে marks_count অ্যারের মান শূণ্য ধরেছি । (আমার মনে হয় এটা প্রথমেই ডিক্লেয়ার করা যেত)
      তারপর, i এর মান ধরেছি জিরো । এবং দ্বিতীয় শর্তটি পরীক্ষা করেছি । যেহেতু এখানে ০ < 40 এর চাইতে ছোট সেহেতু আমরা i এর মান 0 ধরেছি (যতক্ষণ i <40 হচ্ছে)। এবং আমরা লুপের ভেতর i এর মান বসিয়ে দিয়েছি ।
      অর্থাৎ , marks_count [total_marks [0]] = marks_count[86] ।
      তারপর,marks_count এর মান হল 86 এরপর 87 এরপর 88 ... এভাবে 40 বার করার পর আমরা আবার লুপে ফিরে আসবো ।
      তখন, i এর মান হবে 1 অর্থাৎ marks_count [total_marks [1]] = marks_count[78]...তারপর marks_count এর মান হবে 79, 80, 81... এভাবে 40 বার করার পর total_marks [2] হবে ।

      ব্যাপারটা কি এরকম ?

      ইউরেকা আমি বুঝতে পেরেছি ! ! !

      মুছুন
    3. এই অংশটা আবার পড়:

      marks_count একটি ইন্টিজার টাইপের অ্যারে এবং marks_count[n] দিয়ে আমরা বুঝব n সংখ্যাটি কতবার total_marks-এর মধ্যে আছে। নম্বর যেহেতু 0 থেকে 100-এর মধ্যে হতে পারে তাই আমরা ওই অ্যারেতে মোট 101টি সংখ্যা রাখার ব্যবস্থা করলাম। int marks_count[101];
      শুরুতে যেহেতু কিছুই জানি না, তাই ধরে নিই, সব সংখ্যা শূন্য বার আছে। তাই marks_count অ্যারের সব ঘরে 0 বসিয়ে দিই:
      for(i = 0; i < 101; i++) { marks_count[i] = 0; } এখন total_marks অ্যারের প্রতিটি সংখ্যার জন্য marks_count অ্যারের ওই ঘরের মান এক বাড়িয়ে দিই। for(i = 0; i < 40; i++) { marks_count[total_marks[i]]++; } বুঝতে সমস্যা হচ্ছে নাকি? একটু চিন্তা করো। যখন i-এর মান 0, তখন total_marks[i] হচ্ছে total_marks[0], অর্থাৎ 86। এখন আমাদের দরকার হচ্ছে marks_count অ্যারের ওই ঘরটার (মানে marks_count[86]) মান এক বাড়িয়ে দেওয়া। শুরুতে ছিল শূন্য, এখন হবে এক। আমরা কিন্তু সে কাজটিই করেছি marks_count[total_marks[i]]-এর মান এক বাড়িয়ে দিয়েছি।

      মুছুন
    4. আর ৬.১০ প্রোগ্রামটা বোঝার চেষ্টা কর। এটা বুঝতে পারলে আবার ৬.৯ বোঝার চেষ্টা কর।

      মুছুন
  5. ভাইয়া আপনার ৬.৬ এর প্রোগ্রাম টা বুঝতে সমস্যা হচ্ছে যদিও সমস্যা হওয়ার কথা না। একটু দৃষ্টি আকর্ষন করছি।
    দেখুন প্রথমে আমরা ভেরিয়েবল ডিক্লেয়ার করলাম।
    int ara[] = {10,20,30,40,50,60,70,80,90,100}, i, j, temp;

    এখন আমাদের কাজ অ্যারে টা কে এই রকম করা ara[] = {100,90,80,70,60,50,40,30,20,10}; এবং তা আমরা করেছি এই ভাবে
    for( i=0,j=9; i<10; i++,j--){
    temp = ara[j];
    ara[j] = ara[i];
    ara[i] = temp;
    }
    লুপ টার প্রথম স্টেপ টা হল
    temp = ara[9]; // temp এর মান এখন 100
    ara[9] = ara[0]; // ara[9] এর মান এখন 10
    ara[0] = temp ; // ara[0] এর মান এখন 100
    দ্বিতীয় স্টেপ হল
    temp = ara[8]; // temp এর মান এখন 90
    ara[8] = ara[1]; // ara[8] এর মান এখন 20
    ara[1] = temp; // ara[1] এর মান এখন 90
    এই ভাবে শেষ পর্যায়ে আমরা পাচ্ছি ara[] = {100,90,80,70,60,50,40,30,20,10};
    এখন আমাদের
    for(i = 0; i < 10; i++) {
    printf("%d\n", ara[i]);
    }
    এই প্রোগ্রামের জন্য অবশ্যই নিচের আউটপুট আসার কথা।
    100
    90
    80
    70
    60
    50
    40
    30
    20
    10
    কিন্তু আসছে না। আউটপুট টা পেতে গেলে যদি এভাবে লিখতে হয়
    for( j=9; j>=0;j--){
    printf("%d\n", ara[j]);
    }
    তাহলে উপরে temp এর মাধ্যমে মান পরিবর্তন করার মানেই হয়না।

    উত্তরমুছুন
  6. ভাইয়া আমরা ৬.৬ তো এভাবেও ্করতে পারতাম-

    #include

    void main()
    {
    int ara[]={10,20,30,40,50,60,70,80,90,100};
    int i;

    for(i=9;i>=0;i--)
    {
    printf("%d th element is:%d\n",10-i,ara[i]);
    }
    }
    এটা কি সঠিক হয়েছে?

    উত্তরমুছুন
    উত্তরগুলি
    1. You have printed the elements of the Array in a reverse way. But the positions of the elements remain same as before. Like it doesn't changed from , ara[]={10,20,30,40,50,60,70,80,90,100} to ara[]={100,90,80,70,60,50,40,30,20,10}.

      মুছুন
  7. তারমানে কাজ হয়নি! আসলে আমি একটি ছোট্ট ভুল করেছি, সেটি তোমরা খুঁজে বের করো। এ ধরনের ভুলকে বলে বাগ (bug), তখন প্রোগ্রাম ঠিকমতো রান করে কিন্তু সঠিক আউটপুট দেয় না। আমার কোডে বাগ আছে, তোমরা ডিবাগ (debug) করো (মানে বাগটি বের করে ঠিক করো)।
    স্যার ডিবাগ করতে পারছি না । সমাধান কি বলে দেয়া যাবে প্লিজ ?

    উত্তরমুছুন
    উত্তরগুলি
    1. বলতে চাইলে তো আগেই বলে দিতাম। না পারলে অসুবিধা নাই। পরে চেষ্টা করবে। :)

      মুছুন
  8. স্যার কোড টা কি ঠিক আছে ?
    #include
    int main()
    {
    int ara[]={10,20,30,40,50,60,70,80,90,100};
    int i,j,temp;
    for(i=0,j=9;i<10 && i<j;i++,j--){
    temp=ara[j];
    ara[j]=ara[i];
    ara[i]=temp;
    }
    for(i=0;i<10;i++){
    printf("%d\n",ara[i]);
    }
    return 0;
    }

    উত্তরমুছুন
    উত্তরগুলি
    1. স্যার কোড টা ঠিক আছে কি না তা তো বল্লেন না?

      মুছুন
    2. কোড চেক করা তো খুব সহজ। কোড রান করে যদি আউটপুট ঠিকঠাক যদি আসে তাহলে কোড ঠিক আছে। :)

      মুছুন
  9. ৬.৬ এর প্রোগ্রামটির বাগ ঠিক করতে পেরেছি৤ ধন্যবাদ ভাইয়া এত সুন্দর একটি সমস্যা দেয়ার জন্য৤

    উত্তরমুছুন
  10. এই মন্তব্যটি লেখক দ্বারা সরানো হয়েছে।

    উত্তরমুছুন
  11. ভাই,৬.৫ একটু ব্যাখ্যা করেন।এখানে লুপ তিনটি কিভাবে কাজ করল আমি বুঝিনি

    উত্তরমুছুন
    উত্তরগুলি
    1. না বুঝলে সমস্যা নাই, সামনে এগিয়ে যাও, কিছুদিন পরে আবার পড়বে, তখন ঠিক বুঝতে পারবে।

      মুছুন
  12. আমার একটি প্রশ্ন আছে । কোন array এর শেষ উপাদান যেমনঃ (ara[4]={1,2,3,4,5} এর ara[4] নং উপাদান) অদ্ভূত আচরণ করে । ওটি ব্যাবহার করল প্রোগ্রাম ক্র্যাশ করে।কারণটা কী?

    উত্তরমুছুন
    উত্তরগুলি
    1. ara[4] হলে ইনডেক্স 0, 1, 2, 3 এই চারটা ব্যবহার করা যাবে। ara[5]={1,2,3,4,5} লিখলে ইনডেক্স 0 থেকে 4 পর্যন্ত ব্যবহার করা যাবে।

      মুছুন
  13. স্যার উদাহরন ৬.৬ এ bug টা মনে হয় i এর continuation condition এ, i<10 না হয়ে i<5 হলে result টা সঠিক হবে।

    উত্তরমুছুন
  14. এই মন্তব্যটি লেখক দ্বারা সরানো হয়েছে।

    উত্তরমুছুন
  15. ভাইয়া, ৬.৬ এর প্রব্লেমটা সলভ করার জন্য একটা " if(i==4) { break; } " ব্যবহার করেছি, এটা কি ঠিক আছে?

    #include
    int main()
    {
    int ara[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
    int i, j, temp;
    for(i = 0, j = 9; i < 10; i++, j--) {
    temp = ara[j];
    ara[j] = ara[i];
    ara[i] = temp;

    if(i==4){
    break;
    }
    }
    for(i = 0; i < 10; i++) {
    printf("%d\n", ara[i]);
    }
    return 0;
    }

    উত্তরমুছুন
    উত্তরগুলি
    1. Yes it is correct. But an if/break statement take a bit more time to compile and run the program. If you could change something in the first for loops (for i=0,j=9;i<10;i++,j--) condition statement, then the program would be more efficient.

      মুছুন
  16. include

    int main()
    {
    int ara[]={10,20,30,40,50,60,70,80,90,100};
    int ara2[10];
    int i,j;
    for(i=9,j=0;i>=0;i--,j++){
    ara2[i]=ara[j];
    }
    for(i=9;i>=0;i--){
    printf("%d\n",ara[i]);
    }
    return 0;
    }
    ভাইয়া প্রোগ্রাম:6•5 এর সমাধান এইভাবে করলে হবে না?

    উত্তরমুছুন
    উত্তরগুলি
    1. Delete the first for loop statement and run the program again. You will find that your output is correct!! But sorry you are wrong.:)

      You have printed the elements of the Array in a reverse way. But the positions of the elements remain same as before. Like it doesn't changed from , ara[]={10,20,30,40,50,60,70,80,90,100} to ara[]={100,90,80,70,60,50,40,30,20,10}.

      মুছুন
  17. সুবিন ভাইয়া, ৬.৫টা একটু ভাল করে বুঝিয়ে দিতে পারবেন???বিশেষ করে লাস্টের ৩টা for লুপ

    উত্তরমুছুন
  18. সুবিন ভাইয়া, ৬.৫টাতে ৩টা for লুপ use না করে ২টা for লুপ দিয়ে করা যায়,,,এখানে ৩টা for লুপ use করা হল কেন ?
    #include
    int main()
    {
    int ara[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
    int ara2[10];
    int i, j;
    for(i = 0, j = 9; i < 10; i++, j--) {
    ara2[j] = ara[i];
    }
    for(i = 0; i < 10; i++) {
    ara[i] = ara2[i];
    printf("%d\n", ara[i]);
    }


    return 0;
    }

    উত্তরমুছুন
  19. ভাইয়া ৬.৫ এর সমস্যা টা তো এভাবে লেখা যায়

    #include
    int main()
    {
    int ara[10]={10,20,30,40,50,60,70,80,90,100};
    int i;
    for(i=9;i>=0;i--) {
    printf("%d\n",ara[i]);
    }
    return 0;

    }

    উত্তরমুছুন
  20. sorting এর basic নিয়ে একটা লেকচার দরকার ছিল

    উত্তরমুছুন
  21. ভাইয়া আপনার দেওয়া সি এর সমস্যা গুলো ওইএইচপি দিয়ে সমাধান করি ।

    উত্তরমুছুন
  22. আর যদি শেষ উপাদান থেকে প্রথম উপাদান পর্যন্ত দেখাতে হতো? কোনো সমস্যা নেই, শুধু লুপে এ indexটি 9 থেকে 0 পর্যন্ত আনলেই চলবে। এখন তোমরা প্রোগ্রামটি লিখে ফেলো।
    This is problem number 6.4 or. is this the right way to solve the problem. anyhow ans is ok. but i am not sure about the formula even i tried to use "break" but it wont work why? thanks for understanding.

    #include
    #include

    int main()
    {
    int ara[10]= {10,20,30,40,50,60,70,80,90,100};
    int i;
    for(i=9;i>=0;i--){
    printf("%d number ara will be:%d\n",i+1,ara[i]);
    }
    return 0;
    }

    উত্তরমুছুন

এখানে বিষয়সংশ্লিষ্ট মন্তব্য কিংবা প্রশ্ন করা যাবে। বাংলায় মন্তব্য করার সময় বাংলা হরফে লিখতে হবে। আর রোমান হরফে লিখলে ইংরেজিতে লিখতে হবে। নতুবা মন্তব্য প্রকাশ করা হবে না। ধন্যবাদ।