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

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

অ্যারে লেবেলটি সহ পোস্টগুলি দেখানো হচ্ছে৷ সকল পোস্ট দেখান
অ্যারে লেবেলটি সহ পোস্টগুলি দেখানো হচ্ছে৷ সকল পোস্ট দেখান

কোড কাতা - ০১

এখানে ১০টি প্রোগ্রাম দেওয়া আছে। প্রোগ্রামগুলো তোমাদেরকে দেখে দেখে টাইপ করতে হবে। তারপরে কম্পাইল ও রান করবে। তারপরে চিন্তা করে দেখবে যে প্রোগ্রাম ঠিকঠাক বুঝেছ কী না। না বুঝলে কমেন্টে প্রশ্ন করতে পারো, কেউ না কেউ উত্তর দিবে। ফাংশন, লুপ, স্ট্রিং - এসব জিনিস প্রোগ্রামগুলোতে দেখানো হয়েছে।

প্রোগ্রামগুলো কিন্তু বেশ কাছাকাছি। তবে তুমি যদি নিজের কোড নিজেই কপি কর, তাহলে লাভ হবে না। এই কোড কাতা প্র্যাকটিসের জন্য প্রতিটি প্রোগ্রাম (যতই কাছাকাছি হোক না কেন) একেবারে প্রথম লাইন থেকে টাইপ করতে হবে। আগের প্রোগ্রামের কোনোকিছু কপি করা চলবে না। এভাবে প্র্যাকটিস করলে তোমার জড়তা কাটবে।

প্রথম প্রোগ্রামে আমরা দেখবো যে আমাদের কম্পাইলার ঠিকঠাক আছে কী না। নিচের প্রোগ্রামটি কম্পাইল ও রান করো।

 #include <stdio.h>  
   
 int main()  
 {  
      // output: Bangladesh  
      printf("Bangladesh");  
      // output: Bangladesh (followed by newline)  
      printf("Bangladesh\n");  
      // output: Bangladesh, newline, Bangladesh, newline  
      printf("Bangladesh\nBangladesh\n");  
      // output: Bangladesh tab character Bangladesh, why only two Bangladesh?  
      printf("Bangladesh\rBangladesh\tBangladesh\n");  
   
      return 0;  
 }  


দ্বিতীয় প্রোগ্রাম:

 #include <stdio.h>  
   
 int main()  
 {  
      int number1 = 10, number2 = 5;  
   
      // addition  
      printf("%d + %d = %d\n", number1, number2, number1 + number2);  
      // subtraction  
      printf("%d - %d = %d\n", number1, number2, number1 - number2);  
      // multiplication  
      printf("%d x %d = %d\n", number1, number2, number1 * number2);  
      // division  
      printf("%d / %d = %d\n", number1, number2, number1 / number2);  
   
      return 0;  
 }  
   

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

 #include <stdio.h>  
   
 int main()  
 {  
      int number1, number2;  
        
      scanf("%d %d", &number1, &number2);  
   
      // addition  
      printf("%d + %d = %d\n", number1, number2, number1 + number2);  
      // subtraction  
      printf("%d - %d = %d\n", number1, number2, number1 - number2);  
      // multiplication  
      printf("%d x %d = %d\n", number1, number2, number1 * number2);  
      // division  
      printf("%d / %d = %d\n", number1, number2, number1 / number2);  
   
      return 0;  
 }  
   

চতুর্থ প্রোগ্রাম:

 #include <stdio.h>  
   
 // this kata is to practice writing user defined function  
   
 void math_operations(int n1, int n2)  
 {  
      // addition  
      printf("%d + %d = %d\n", n1, n2, n1 + n2);  
      // subtraction  
      printf("%d - %d = %d\n", n1, n2, n1 - n2);  
      // multiplication  
      printf("%d x %d = %d\n", n1, n2, n1 * n2);  
      // division  
      printf("%d / %d = %d\n", n1, n2, n1 / n2);  
 }  
   
   
 int main()  
 {  
      int number1, number2;  
        
      scanf("%d %d", &number1, &number2);  
   
      math_operations(number1, number2);  
   
      return 0;  
 }  
   

এবারে পাঁচ নম্বর প্রোগ্রাম। প্রতিবারই তোমরা আগের প্রোগ্রামের সাথে পার্থক্য বুঝতে পারবে যদি কোড ঠিকমতো দেখো, আর প্রোগ্রাম রান করে দেখো।

 #include <stdio.h>  
   
 // this kata is to practice writing user defined function  
   
 void math_operations(int n1, int n2);  
   
 void math_operations(int n1, int n2)  
 {  
      // addition  
      printf("%d + %d = %d\n", n1, n2, n1 + n2);  
      // subtraction  
      printf("%d - %d = %d\n", n1, n2, n1 - n2);  
      // multiplication  
      printf("%d x %d = %d\n", n1, n2, n1 * n2);  
      // division  
      if (n2 == 0) {  
           printf("Can not divide by zero\n");  
           return;  
      }  
      printf("%d / %d = %d\n", n1, n2, n1 / n2);  
 }  
   
   
 int main()  
 {  
      int number1, number2;  
        
      while(1) {  
           scanf("%d %d", &number1, &number2);  
           if (number1 == 0 && number2 == 0) {  
                break;  
           }  
           math_operations(number1, number2);  
      }  
   
      return 0;  
 }  
   

ষষ্ঠ প্রোগ্রাম :

 #include <stdio.h>  
   
   
 void add(int n1, int n2)   
 {  
      printf("%d + %d = %d\n", n1, n2, n1 + n2);  
 }  
   
 void sub(int n1, int n2)  
 {  
      printf("%d - %d = %d\n", n1, n2, n1 - n2);  
 }  
     
 void mul(int n1, int n2)  
 {  
      printf("%d x %d = %d\n", n1, n2, n1 * n2);  
 }  
   
 void div(int n1, int n2)  
 {  
      if (n2 == 0) {  
           printf("Can not divide by zero\n");  
           return;  
      }  
      printf("%d / %d = %d\n", n1, n2, n1 / n2);  
 }   
   
 int main()  
 {  
      int n, number1, number2;  
   
      while(1) {  
           printf("Enter two numbers (or two 0s to exit): ");  
           scanf("%d %d", &number1, &number2);  
           if (number1 == 0 && number2 == 0) {  
                printf("Program Terminated.\n");  
                break;  
           }  
           printf("Enter \n1 for addition\n2 for subtraction\n3 for multiplication\n4 for division\n");  
           scanf("%d", &n);  
           if (n == 1) {  
                add(number1, number2);  
           }   
           else if (n == 2) {  
                sub(number1, number2);  
           }  
           else if (n == 3) {  
                mul(number1, number2);  
           }  
           else if (n == 4) {  
                div(number1, number2);  
           }  
           else {  
                printf("Unknown operation\n");  
           }  
      }  
   
      return 0;  
 }  
   

এখন সাত নম্বর প্রোগ্রাম করবো। আমি এখানে কোনো প্রোগ্রামের বর্ণনা লিখছি না, নিজেরা বুঝে নেবে। আর শেষে একটা ভিডিওর লিঙ্ক দিয়ে দিবো।

 #include <stdio.h>  
   
   
 int add(int n1, int n2)   
 {  
      return n1 + n2;  
 }  
   
 int sub(int n1, int n2)  
 {  
      return n1 - n2;  
 }  
   
 int mul(int n1, int n2)  
 {  
      return n1 * n2;  
 }  
   
 int div(int n1, int n2)  
 {  
      return n1 / n2;  
 }   
   
 int main()  
 {  
      int n, number1, number2, result;  
   
      while(1) {  
           printf("Enter two numbers (or two 0s to exit): ");  
           scanf("%d %d", &number1, &number2);  
           if (number1 == 0 && number2 == 0) {  
                printf("Program Terminated.\n");  
                break;  
           }  
           printf("Enter \n\t1 for addition\n\t2 for subtraction\n\t3 for multiplication\n\t4 for division\n: ");  
           scanf("%d", &n);  
           if (n == 1) {  
                result = add(number1, number2);  
           }   
           else if (n == 2) {  
                result = sub(number1, number2);  
           }  
           else if (n == 3) {  
                result = mul(number1, number2);  
           }  
           else if (n == 4) {  
                if (number2 == 0) {  
                     printf("Can not divide by zero\n");  
                     continue;  
                }  
                result = div(number1, number2);  
           }  
           else {  
                printf("Unknown operation\n");  
                continue;  
           }  
           printf("Result : %d\n", result);  
      }  
   
      return 0;  
 }  
   

অষ্টম প্রোগ্রাম :

 #include <stdio.h>  
 #include <string.h>  
   
   
 int add(int n1, int n2)   
 {  
      return n1 + n2;  
 }  
   
 int sub(int n1, int n2)  
 {  
      return n1 - n2;  
 }  
    
 int mul(int n1, int n2)  
 {  
      return n1 * n2;  
 }  
   
 int div(int n1, int n2)  
 {  
      return n1 / n2;  
 }   
   
 int main()  
 {  
      int number1, number2, result;  
      char operation[10];  
   
      while(1) {  
           printf("Enter two numbers (or two 0s to exit): ");  
           scanf("%d %d", &number1, &number2);  
           if (number1 == 0 && number2 == 0) {  
                printf("Program Terminated.\n");  
                break;  
           }  
           printf("Enter any of the following command\n");  
           printf("\tadd for addition\n\tsub for subtraction\n\tmul for multiplication\n\tdiv for division\n: ");  
           scanf("%s", operation);  
           if (!strcmp(operation, "add")) {  
                result = add(number1, number2);  
           }   
           else if (!strcmp(operation, "sub")) {  
                result = sub(number1, number2);  
           }  
           else if (!strcmp(operation, "mul")) {  
                result = mul(number1, number2);  
           }  
           else if (!strcmp(operation, "div")) {  
                if (number2 == 0) {  
                     printf("Can not divide by zero\n");  
                     continue;  
                }  
                result = div(number1, number2);  
           }  
           else {  
                printf("Unknown command\n");  
                continue;  
           }  
           printf("Result : %d\n", result);  
      }  
   
      return 0;  
 }  
   

নবম প্রোগ্রাম :

 #include <stdio.h>  
 #include <string.h>  
   
   
 float add(float n1, float n2)   
 {  
      return n1 + n2;  
 }  
   
 float sub(float n1, float n2)  
 {  
      return n1 - n2;  
 }  
   
 float mul(float n1, float n2)  
 {  
      return n1 * n2;  
 }  
   
 float div(float n1, float n2)  
 {  
      return n1 / n2;  
 }   
   
 int main()  
 {  
      float number1, number2, result;  
      char operation[10];  
   
      while(1) {  
           printf("Enter two numbers (or two 0s to exit): ");  
           scanf("%f %f", &number1, &number2);  
           if (number1 == 0.0 && number2 == 0.0) {  
                printf("Program Terminated.\n");  
                break;  
           }  
           printf("Enter any of the following command\n");  
           printf("\tadd for addition\n\tsub for subtraction\n\tmul for multiplication\n\tdiv for division\n: ");  
           scanf("%s", operation);  
           if (!strcmp(operation, "add")) {  
                result = add(number1, number2);  
           }   
           else if (!strcmp(operation, "sub")) {  
                result = sub(number1, number2);  
           }  
           else if (!strcmp(operation, "mul")) {  
                result = mul(number1, number2);  
           }  
           else if (!strcmp(operation, "div")) {  
                if (number2 == 0.0) {  
                     printf("Can not divide by zero\n");  
                     continue;  
                }  
                result = div(number1, number2);  
           }  
           else {  
                printf("Unknown command\n");  
                continue;  
           }  
           printf("Result : %0.2f\n", result);  
      }  
   
      return 0;  
 }  
   

দশম ও শেষ প্রোগ্রাম :

 #include <stdio.h>  
 #include <string.h>  
   
   
 float add(float n1, float n2)   
 {  
      return n1 + n2;  
 }  
   
 float sub(float n1, float n2)  
 {  
      return n1 - n2;  
 }   
   
 float mul(float n1, float n2)  
 {  
      return n1 * n2;  
 }  
   
 float div(float n1, float n2)  
 {  
      return n1 / n2;  
 }   
   
 int main()  
 {  
      float number1, number2, result;  
      char input[20];  
      char operation[10];  
   
      while(1) {  
           printf("Enter two numbers (or type exit): ");  
           scanf(" %[^\n]", input);  
           if (!strcmp(input, "exit")) {  
                printf("Program Terminated.\n");  
                break;  
           }  
           sscanf(input, "%f %f", &number1, &number2);  
             
           printf("Enter any of the following command\n");  
           printf("\tadd for addition\n\tsub for subtraction\n\tmul for multiplication\n\tdiv for division\n: ");  
           scanf("%s", operation);  
           if (!strcmp(operation, "add")) {  
                result = add(number1, number2);  
           }   
           else if (!strcmp(operation, "sub")) {  
                result = sub(number1, number2);  
           }  
           else if (!strcmp(operation, "mul")) {  
                result = mul(number1, number2);  
           }  
           else if (!strcmp(operation, "div")) {  
                if (number2 == 0.0) {  
                     printf("Can not divide by zero\n");  
                     continue;  
                }  
                result = div(number1, number2);  
           }  
           else {  
                printf("Unknown command\n");  
                continue;  
           }  
           printf("Result : %0.2f\n", result);  
      }  
   
      return 0;  
 }  
   

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

কোড কাতার ভিডিও :



ফেসবুক গ্রুপের লিঙ্কঃ https://www.facebook.com/groups/programming.school/

প্রোগ্রামিং প্রশ্নোত্তরের ওয়েবসাইটঃ http://programabad.com

এলোমেলো অ্যারে

সমস্যাটি পড়তে এবং সমাধান জমা দিতে ভিজিট করুন দ্বিমিক অনলাইন জাজ।
লিঙ্কঃ https://dimikoj.com/problems/28/

৫২টি প্রোগ্রামিং সমস্যা ও সমাধান বইতে এই সমস্যার সমাধান নিয়ে আলোচনা করা হয়েছে।

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

গণিত শিক্ষকের জন্য লেখা প্রোগ্রামটির কথা মনে আছে তো? সেই যে আমরা তিনটি অ্যারে ব্যবহার করে প্রোগ্রাম লিখেছিলাম ছাত্র-ছাত্রীদের গণিত পরীক্ষার মোট নম্বর বের করার জন্য। মনে না থাকলে প্রোগ্রামটি আবার দেখে নাও।

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

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



Roll: 1
Roll: 2
Roll: 3
Roll: 4
Roll: 5
Roll: 6
Roll: 7
Roll: 8
Roll: 9
Roll: 10
First terminal exam
80
70
92
78
58
83
85
66
99
81
Second terminal exam
75
67
55
100
91
84
79
61
90
97
Final exam
98
67
75
89
81
83
80
90
88
77
Total marks











Total Marks সারির ঘরগুলো ফাঁকা, কারণ এগুলো এখনো হিসাব করিনি। প্রথম সাময়িক পরীক্ষার 25%, দ্বিতীয় সাময়িক পরীক্ষার 25% এবং ফাইনাল পরীক্ষার 50% নম্বর যোগ করে মোট নম্বর বের করতে হবে। এখন দেখো, আমাদের ছকে তাদের নম্বরগুলো রাখতে হয়েছে 4 টা সারি (row) এবং 10 টা কলামে। আমরা আগে যেই প্রোগ্রাম লিখেছিলাম, তাতে প্রথম রো-এর জন্য একটি অ্যারে, দ্বিতীয় রো-এর জন্য একটি, তৃতীয় রো-এর জন্য একটি এবং চতুর্থ রো-এর জন্য একটি অ্যারে ব্যবহার করেছিলাম। এখন ব্যবহার করব একটি 2-D অ্যারে (টু ডাইমেনশনাল অ্যারে)।

2-D অ্যারে ডিক্লেয়ার করার নিয়ম হচ্ছে: data_type array_name [number of rows][number of columns];
যেমন ওপরের ছকটা যদি marks নামের একটি 2-D অ্যারেতে রাখতে চাই, তবে লিখতে হবে: int marks[4][10];

এখন, অ্যারের প্রথম রো হচ্ছে marks[0], দ্বিতীয় রো হচ্ছে marks[1], তৃতীয় রো হচ্ছে marks[2] এবং চতুর্থ রো হচ্ছে marks[3]। আবার marks[0][0] হচ্ছে প্রথম রো-এর প্রথম কলাম, marks[0][1] হচ্ছে প্রথম রো-এর দ্বিতীয় কলাম, marks[0][5] হচ্ছে প্রথম রো-এর ষষ্ঠ কলাম, marks[1][0] হচ্ছে দ্বিতীয় রো-এর প্রথম কলাম, marks[2][3] হচ্ছে তৃতীয় রো-এর চতুর্থ কলাম। আশা করি, বুঝতে পেরেছ।

এখন বলো তো, যার রোল নম্বর 10 তার দ্বিতীয় সাময়িক পরীক্ষার নম্বর কোন ঘরে আছে? আর marks[0][0] ঘরে কার এবং কোন পরীক্ষার নম্বর আছে?

marks[0][0]-এ থাকবে রোল 1-এর প্রথম সাময়িক পরীক্ষার নম্বর আর marks[1][9]-এ থাকবে রোল 10-এর দ্বিতীয় সাময়িক পরীক্ষার নম্বর। অ্যারেতে সংখ্যাগুলো এভাবে রাখতে পারি:

 int marks[4][10] = {{80, 70, 92, 78, 58, 83, 85, 66, 99, 81}, {75, 67, 55, 100, 91, 84, 79, 61, 90, 97}, {98, 67, 75, 89, 81, 83, 80, 90, 88, 77}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};  

এখানে খেয়াল করেছ যে আমরা আসলে একটি অ্যারের ভেতর চারটি এক ডাইমেনশনের অ্যারে রেখেছি। marks[0]তে আছে প্রথম সাময়িক পরীক্ষায় সবার নম্বর, marks[1]-এ দ্বিতীয় সাময়িক পরীক্ষার নম্বর, marks[2]-এ ফাইনাল পরীক্ষার নম্বর এবং marks[3]তে মোট নম্বর (যেহেতু এখনো এটি হিসাব করিনি, তাই সব 0 লিখে দিলাম)।

এখন সম্পূর্ণ প্রোগ্রামটি তোমার কম্পিউটারে টাইপ করে কম্পাইল ও রান করো।

 #include <stdio.h>  
 int main()  
 {  
     int marks[4][10] = {{80, 70, 92, 78, 58, 83, 85, 66, 99, 81}, {75, 67, 55, 100, 91, 84, 79, 61, 90, 97}, {98, 67, 75, 89, 81, 83, 80, 90, 88, 77}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};  
     int col;  
     for(col = 0; col < 10; col++) {  
         marks[3][col] = marks[0][col] / 4.0 + marks[1][col] / 4.0 + marks[2][col] / 2.0;  
         printf("Roll NO: %d  Total Marks: %d\n", col + 1, marks[3][col]);  
     }  
     return 0;  
 }  
 প্রোগ্রাম: ১১.১  

নম্বরগুলো আগে না লিখে যদি আমরা ব্যবহারকারীর কাছ থেকে ইনপুট হিসেবে নিতে চাইতাম তাহলে কী করতে হতো?

 int marks[4][10];  
 int i, j;  
 for (i = 0; i < 4; i++) {  
     for (j = 0; j < 10; j++) {  
         scanf("%d", &ara[i][j]);  
     }  
 }  

এভাবে নেস্টেড লুপের সাহায্যে আমরা ইনপুট নিতে পারি। প্রথম লুপটি ব্যবহার করা হয়েছে রো-এর জন্য আর দ্বিতীয় লুপটি কলামের জন্য। যখন i = 0, অর্থাৎ প্রথম রো-এর জন্য আমরা j = 0 থেকে 9 পর্যন্ত সব ঘরের ইনপুট নিচ্ছি, তারপর আবার i = 1 (দ্বিতীয় রো)-এর জন্য j = 0 থেকে 9 (প্রতি কলাম) পর্যন্ত সব ঘরের মান ইনপুট নেওয়া হচ্ছে।

এখন আমরা 1 থেকে 10 পর্যন্ত সংখ্যাগুলোর নামতা বের করার জন্য 2-D অ্যারে ব্যবহার করে একটি প্রোগ্রাম লিখব। একের নামতা হবে প্রথম রো-তে, দুইয়ের নামতা দ্বিতীয় রো-তে … দশের নামতা দশম রো-তে থাকবে। তোমরা কি প্রোগ্রামটি নিজে নিজে লিখার চেষ্টা করবে? এক ঘণ্টার মধ্যেও যদি না হয়, তবে আমার কোডটি দেখো। প্রোগ্রামিং শেখার সময় অনেক সহজ প্রোগ্রাম লিখতেও প্রচুর সময় লাগে, তাতে হতাশ হবার কিছু নেই।

 #include <stdio.h>  
 int main()  
 {  
     int namta[10][10];  
     int row, col;  
     for (row = 0; row < 10; row++) {  
         for(col = 0; col < 10; col++) {  
             namta[row][col] = (row + 1) * (col + 1);  
         }  
     }  
     for (row = 0; row < 10; row++) {  
         for(col = 0; col < 10; col++) {  
             printf("%d x %d = %d\n", (row + 1), (col + 1), namta[row][col]);  
         }  
         printf("\n");  
     }  
     return 0;  
 }  
 প্রোগ্রাম: ১১.২  

সম্পূর্ণ আউটপুট স্ক্রিনে না-ও আটতে পারে, তাতে চিন্তার কিছু নেই।

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

আচ্ছা, কেউ যদি বলে, সার্কভুক্ত সাতটি দেশের নাম একটি অ্যারেতে রাখতে, তাহলে কী করবে? একটি char type অ্যারেতে একটি দেশের নাম রাখা যায়। যেমন: char country[] = "Bangladesh";। তাহলে সাতটি দেশের নাম রাখার জন্য আমাদের একটি 2-D অ্যারে ব্যবহার করতে হবে। এই অ্যারেতে মোট কয়টি রো থাকবে? সাতটি। কলাম কয়টি থাকবে? জানি না। আসলে একেক দেশের নামের দৈর্ঘ্য তো একেক রকম। তাই আমরা একটি কাজ করতে পারি, কলামে 100টি ক্যারেক্টার রাখার ব্যবস্থা করতে পারি, কারণ সার্কের কোনো দেশের নামে তো 100টির বেশি ক্যারেক্টার নেই, কম আছে।

 #include <stdio.h>  
 int main()  
 {  
     char saarc[7][100] = {"Bangladesh", "India", "Pakistan", "Sri Lanka", "Nepal", "Bhutan", "Maldives"};  
     int row;  
     for (row = 0; row < 7; row++) {  
         printf("%s\n", saarc[row]);  
     }  
     return 0;  
 }  
 প্রোগ্রাম: ১১.৩  

প্রোগ্রামটি তোমার কম্পিউটারে লিখে রান করাও। এখন তোমরা বলো তো, saarc[3][3], saarc[0][5] ও saarc[5][0] – এই তিনটি ঘরে কী কী ক্যারেক্টার আছে? একটু পরে একটি প্রোগ্রাম লিখব, তার সঙ্গে তোমার উত্তর মিলিয়ে নেবে।

আমরা যদি ওই অ্যারের প্রতিটি ক্যারেক্টার আলাদাভাবে প্রিন্ট করতে চাই, তবে প্রোগ্রামটি এভাবে লিখতে পারি:

 #include <stdio.h>  
 #include <string.h>  
 int main()  
 {  
     char saarc[7][100] = {"Bangladesh", "India", "Pakistan", "Sri Lanka", "Nepal", "Bhutan", "Maldives"};  
     int row, col, name_length;  
     for (row = 0; row < 7; row++) {  
         name_length = strlen(saarc[row]);  
         for(col = 0; col < name_length; col++) {  
             printf("%c ", saarc[row][col]);  
         }  
         printf("\n");  
     }  
     return 0;  
 }  
 প্রোগ্রাম: ১১.৪  

আবার যদি দেখতে চাই কোন ঘরে কী আছে, তাহলে রো এবং কলাম নম্বরসহ প্রিন্ট করতে পারি।

 #include <stdio.h>  
 #include <string.h>  
 int main()  
 {  
     char saarc[7][100] = {"Bangladesh", "India", "Pakistan", "Sri Lanka", "Nepal", "Bhutan", "Maldives"};  
     int row, col, name_length;  
     for (row = 0; row < 7; row++) {  
         name_length = strlen(saarc[row]);  
         for(col = 0; col < name_length; col++) {  
             printf("(%d, %d) = %c, ", row, col, saarc[row][col]);  
         }  
         printf("\n");  
     }  
     return 0;  
 }  
 প্রোগ্রাম: ১১.৫  

এবারে নিচের ছকটি দেখো।

6
4
7
8
9
3
7
1
9
9
8
6
4
2
7
2
4
2
5
9
4
1
6
7
3

এখন 2-D অ্যারে ব্যবহার করে তোমাদের দুটি প্রোগ্রাম লিখতে হবে। প্রথম প্রোগ্রামটির কাজ হবে প্রতিটি রো-এর সংখ্যাগুলোর যোগফল বের করা আর দ্বিতীয় প্রোগ্রামের কাজ হবে প্রতিটি কলামের সংখ্যাগুলোর যোগফল বের করা।

প্রথম প্রোগ্রামের আউটপুট হবে এই রকম:
Sum of row 1: 34
Sum of row 2: 29
Sum of row 3: 27
Sum of row 4: 22
Sum of row 5: 21
দ্বিতীয় প্রোগ্রামের আউটপুট হবে এই রকম:
Sum of column 1: 23
Sum of column 2: 22
Sum of column 3: 20
Sum of column 4: 31
Sum of column 5: 37

তোমাদের অনেকেরই দ্বিতীয় প্রোগ্রামটি লিখতে একটু সময় লাগতে পারে, কিন্তু হতাশার কোন কারণ নেই। সময় লাগাই স্বাভাবিক। এখন নিচের ছকটি দেখো। আগের ছকটির সঙ্গে-এর কোথায় যেন একটু মিল রয়েছে!


6
3
8
2
4
4
7
6
4
1
7
1
4
2
6
8
9
2
5
7
9
9
7
9
3

আসলে আগের ছকের রোগুলো নতুন ছকের কলাম, আর আগের ছকের কলামগুলো নতুন ছকের রো। যেমন আগের ছকের প্রথম রো-টি ছিল: 6, 4, 7, 8, 9। আর এই ছকের প্রথম কলাম হচ্ছে: 6, 4, 7, 8, 9। একইভাবে আগের ছকের দ্বিতীয় রো নতুন ছকের দ্বিতীয় কলামের সঙ্গে মেলে। এখন আমরা একটি প্রোগ্রাম লিখব, যেটি একটি 5 x 5 অ্যারেকে (অর্থাৎ 5 রো এবং 5 কলামবিশিষ্ট অ্যারে), আরেকটি 5 x 5 অ্যারেতে এমনভাবে কপি করবে, যাতে প্রথম অ্যারের রোগুলো হয় দ্বিতীয় অ্যারের কলাম আর প্রথম অ্যারের কলামগুলো হয় দ্বিতীয় অ্যারের রো। মানে ওপরের ছক দুটির মত আরকি। যেমন প্রথম অ্যারের প্রথম রো যদি হয়: 1, 2, 3, 4, 5 তাহলে দ্বিতীয় অ্যারের প্রথম কলাম হবে 1, 2, 3, 4, 5। তোমার কি বিষয়টি একটু জটিল মনে হচ্ছে? তাহলে কিছুক্ষণ বিশ্রাম নিয়ে তারপর নিচের প্রোগ্রামটি কম্পাইল করো, রান করো, আউটপুট দেখো এবং কীভাবে কাজ করছে বোঝার চেষ্টা করো।

 #include <stdio.h>  
 #include <string.h>  
 int main()  
 {  
     int ara1[5][5] = {{1, 2, 3, 4, 5}, {10, 20, 30, 40, 50}, {100, 200, 300, 400, 500}, {1000, 2000, 3000, 4000, 5000}, {10000, 20000, 30000, 40000, 50000}};  
     int ara2[5][5];  
     int r, c;  
     printf("Content of first array (ara1): \n");  
     for (r = 0; r < 5; r++) {  
         for(c = 0; c < 5; c++) {  
             printf("%d ", ara1[r][c]);  
         }  
         printf("\n");  
     }  
     printf("\n");  
     // now start copy  
     for (r = 0; r < 5; r++) {  
         for(c = 0; c < 5; c++) {  
             ara2[c][r] = ara1[r][c];  
         }  
     }  
     printf("Content of second array (ara2): \n");  
     for (r = 0; r < 5; r++) {  
         for(c = 0; c < 5; c++) {  
             printf("%d ", ara2[r][c]);  
         }  
         printf("\n");  
     }  
     return 0;  
 }  
 প্রোগ্রাম: ১১.৬  

তোমরা যদি এতক্ষণ 2-D অ্যারের সব উদাহরণ এবং যেসব প্রোগ্রাম নিজে লিখতে বলেছি, সেগুলো সব কম্পিউটারে রান করে থাকো এবং বুঝে থাকো (বুঝতে হলে অবশ্যই চিন্তা করতে হবে) তবে তোমাদের আর 2-D অ্যারে নিয়ে সমস্যা হওয়ার কথা নয়। অ্যারে কিন্তু 3-D, 4-D কিংবা আরও বেশি ডাইমেনশনের হতে পারে, তবে সেগুলো নিয়ে এই বইতে আর আলোচনা করব না।

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

এতক্ষণে তোমাদের প্রোগ্রামিং জ্ঞান-বুদ্ধি একটু বেড়েছে। চলো, এবার তাহলে কিছু জনসেবামূলক কর্মকাণ্ড করা যাক। আমরা স্কুলের প্রিয় গণিত শিক্ষকের জন্য পরীক্ষার ফলাফল বের করার প্রোগ্রাম লিখে দেব। ওই স্কুলে প্রথম সাময়িক, দ্বিতীয় সাময়িক ও বার্ষিক এই তিনটি পরীক্ষাই 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;   
 }  
 প্রোগ্রাম: ৬.১০  


পরের অধ্যায়