Tuesday, September 23, 2014

C প্রোগ্রামিং - 9 অধ্যায়–STring স্ট্রিং 4

কিছু প্রোগ্রাম example হিসেবে দেওয়া হল :

EXAmple 1:

stacat function এর মাধ্যমে ২টা string কে এক সাথে জোড়া লাগান যায় এবং stalen function এর মাধ্যমে length পরিমাপ করা যায় .

 

#include<stdio.h>
#include<string.h>
int main()
{
char a[50]="BANGLA";
char b[50]="desh";

strcat(a,b);
printf("%s and length is %d\n",a,strlen(a));
return 0;


}


Screenshot_6



 


EXAmple  2 : এই problem টা তে তুমি কোন word টা কে reverse করতে চাও তা বলে দিলে, program টি reverse করে দেখবে ।


#include<stdio.h>
int main()
{
char str[30]="bangla",str_new[30];
int i,j;
for(i=5,j=0;i>=0;i--)
{
str_new[j]=str[i];
j++;
}
str_new[j]='\0';
printf("%s",str_new);
printf("\n");

}


 


EXAmple  3 :  strcpy function টা এক variableএর মান কে  অন্য variable এ কপি করতে পারবে 


#include<stdio.h>
#include<string.h>
int main()
{
char a[50]="abcdef";
char b[50];

strcpy(b,a);
printf("%s\n",a);

printf("%s\n",b);

return 0;


}


 


Screenshot_7


 


EXample  3:


#include<stdio.h>
#include<string.h>

int main()
{
char name[3][10];
int i;
for(i=0;i<3;i++)
{
scanf("%s",name[i]);
}

for(i=0;i<3;i++)
{
printf("%s\n",name[i]);
}

}

এখানে আমরা তিনটা ক্যারেক্টার এর ARRAY (2D array) রাখছি , যেখানে  প্রত্যেকটা character এর length হচ্ছে ১০.

 


 


Screenshot_9

C প্রোগ্রামিং - 9 অধ্যায়–STring স্ট্রিং 3

কিছু প্রোগ্রামিংexample হিসেবে দেওয়া হল ।

EXample 1;

STring এ  Input হিসেবে scanf বা %s ব্যবহারের একটি সমস্যা হচ্ছে স্ট্রিংয়ে কোনো হোয়াইটস্পেস ক্যারেক্টার (যেমন: স্পেস, ট্যাব ইত্যাদি) থাকা যাবে না, এমন কিছু পেলে scanf ওই ক্যারেক্টার পর্যন্ত একটি স্ট্রিং ধরে নেয়। যেমন, ইনপুট যদি হয় this is তবে scanf প্রথমে thisকেই স্ট্রিং হিসেবে নেবে, তারপরে যদি আবার scanf ফাংশন কল করা হয়, তবে isকে সে স্ট্রিং হিসেবে ইনপুট নিয়ে নেবে।

এই সমস্যা এড়ানোর জন্য আমরা gets ফাংশন ব্যবহার করতে পারি। নিচের উদাহরণটি দেখো:

 

#include<stdio.h>
int main()
{
char str[30];
// gets(str);
// puts(str);

scanf("%s",str);
printf("%s",str);
return 0;

}


 


 


Screenshot_8 


 


#include<stdio.h>
int main()
{
char str[30];
gets(str);
puts(str);

// scanf("%s",str);
// printf("%s",str);
return 0;

}



 


Screenshot_1


যদি scanf দিয়ে লিখতে চাও তবে নিচের নিয়মে লিখতে হবে ।


#include<stdio.h>
int main()
{
char str[30];
scanf("%[^\n]",str);
printf("%s\n",str);
return 0;

}


 


Screenshot_5 


 


 


EXample :2


কোন string এর length  বাহির করার জন্য strlen() function use করতে হয় ।


#include<stdio.h>
#include<string.h>
int main()
{
char a[50];
scanf("%s",a);
int len=strlen(a);
printf("Length = %d\n",len);
return 0;
}


Screenshot_2


function ছাড়া ও তুমি নিচের way তে বের করতে পার .


#include<stdio.h>
int main()
{
char str[30];
int i,length=0;

gets(str);
for(i=0;str[i]!='\0';i++)
{
length=length+1;
}
printf("length of %s is %d\n",str,length);
}


Screenshot_3


 


Example 3 :


এখানে আমরা তিনটা ক্যারেক্টার এর ARRAY (2D array) রাখছি , যেখানে  প্রত্যেকটা character এর length হচ্ছে ১০.


#include<stdio.h>
#include<string.h>
int main()
{
char name[3][10] = {"shadhin","jahid",{'p' , 'e', 'r', 'v', 'e', 'z'}};
int i;

for(i=0;i<3;i++)
{
printf("%s\n",name[i]);
}

}


 


Example 4: এই problem টা তে তুমি কোন word টা কে reverse করতে চাও এবংতার length বলে দিলে, program টি reverse করে দেখবে ।


#include<stdio.h>
int main()
{
char str[30];
int n,i;
gets(str);
scanf("%d",&n);
for(i=n;i>=0;i--)
{
printf("%c",str[i]);
}

printf("\n");
return 0;
}

C প্রোগ্রামিং - 9 অধ্যায়–STring স্ট্রিং 2

আমাদের পরবর্তী প্রোগ্রামের লক্ষ্য হবে দুটি স্ট্রিং জোড়া দেওয়া বা concatenate করা। যেমন একটি স্ট্রিং যদি হয় "bangla" এবং আরেকটি স্ট্রিং যদি হয় "desh" তবে দুটি জোড়া দিয়ে "bangladesh" বানাতে হবে।

#include<stdio.h>
int main()
{
char a[30]="Bangla",b[30]="desh";
int i,j;
for(i=6,j=0;b[j]!='\0';j++)
{
a[i]=b[j];
i++;
}
a[i]='\0';
printf("%s\n",a);
}


 

স্ট্রিংয়ের বেসিক জিনিসগুলো নিয়ে আলোচনা করলাম। তবে মজার ব্যাপার হচ্ছে সি ল্যাঙ্গুয়েজে একটি হেডার ফাইল আছে, যার নাম string.h এবং ওইখানে বেশিরভাগ স্ট্রিং-সংক্রান্ত কাজের জন্য ফাংশন তৈরি করে দেওয়া আছে (যেমন: strcmp, strlen, strcpy ইত্যাদি)।

এখন আমরা আরেকটি প্রোগ্রাম লিখব যেটি ইনপুট হিসেবে একটি স্ট্রিং নেবে (যেখানে অনেকগুলো শব্দ থাকবে)। এই স্ট্রিংয়ের সর্বোচ্চ দৈর্ঘ্য হবে 1000 । শব্দগুলোর মাঝখানে এক বা একাধিক স্পেস থাকবে। আউটপুট হিসেবে প্রতিটি শব্দ আলাদা লাইনে প্রিন্ট করতে হবে। বিরামচিহ্নগুলো (punctuation) প্রিন্ট করা যাবে না এবং শব্দের প্রথম অক্ষর হবে বড় হাতের।

অনেক শর্ত দিয়ে ফেললাম। তবে প্রোগ্রামটি খুব কঠিন কিছু নয়। নিজে নিজে চেষ্টা করতে পারো। আর না পারলে এখন চলো দেখি কীভাবে সমাধান করা যায়।

প্রথম কথা হচ্ছে, ইনপুট নেব কীভাবে? বুঝতেই পারছ যে ইনপুটে যেহেতু স্পেস থাকবে, scanf("%s") ব্যবহার করা যাবে না। তাই আমরা gets() ব্যবহার করব। তার পরের কথা হচ্ছে একটি শব্দে কোন কোন ক্যারেক্টার থাকতে পারে? যেহেতু বলা নেই, আমরা ধরে নিই 'a' থেকে 'z', 'A' থেকে 'Z' আর '0' থেকে '9' থাকবে।

তার পরের প্রশ্ন হচ্ছে, আমরা কখন বুঝব বা আমাদের প্রোগ্রামকে কীভাবে বোঝাবো যে একটি শব্দ শুরু হয়েছে?-এর জন্য আমরা একটি ভেরিয়েবল রাখতে পারি। ভেরিয়েবলের নাম যদি দিই is_word_started তাহলে এর মান 0 হলে বুঝব শব্দ শুরু হয়নি, শব্দ শুরু হলে এর মান আমরা 1 করে দেব। আবার শব্দ শেষ হলে 0 করে দেব। যখন দেখব শব্দ শুরু হয়ে গেছে (is_word_started-এর মান 1) কিন্তু কোনো ক্যারেক্টারের মান 'a' – 'z' বা 'A' – 'Z', বা '0' – '9' এই রেঞ্জের মধ্যে নেই, তখনই বুঝব শব্দটি শেষ। তোমরা যদি এর আগে প্রোগ্রামটি চেষ্টা করার পরও লিখতে না পারো, এখন চেষ্টা করলে পারবে আশা করি। আমি এখন কোডটি লিখে দেব তবে সেটি দেখার আগে অবশ্যই নিজে করার চেষ্টা করতে হবে।

 
#include <stdio.h>    
#include <string.h>
int main()
{
char s[1002], word[100];
int i, j, length, is_word_started;
gets(s);
length = strlen(s);
is_word_started = 0;
for (i = 0, j = 0; i < length; i++) {
if (s[i] >= 'a' && s[i] <= 'z') {
if (is_word_started == 0) {
is_word_started = 1;
word[j] = 'A' + s[i] - 'a'; // first character is capital
j++;
}
else {
word[j] = s[i];
j++;
}
}
else if (s[i] >= 'A' && s[i] <= 'Z') {
if (is_word_started == 0) {
is_word_started = 1;
}
word[j] = s[i];
j++;
}
else if (s[i] >= '0' && s[i] <= '9') {
if (is_word_started == 0) {
is_word_started = 1;
}
word[j] = s[i];
j++;
}
else {
if (is_word_started == 1) {
is_word_started = 0;
word[j] = '\0';
printf("%s\n", word);
j = 0;
}
}
}
return 0;
}



প্রোগ্রামটি বুঝতে কি একটু সমস্যা হচ্ছে? আগে প্রোগ্রামটি চটপট কম্পিউটারে টাইপ করে ফেলো, কম্পাইল ও রান করো। যারা লিনাক্স ব্যবহার করছ তারা gets() ব্যবহারের কারণে কম্পাইলার থেকে একটি সতর্ক সংকেত (warning) পেতে পারো, পাত্তা দিয়ো না।

ইনপুট হিসেবে যেকোনো কিছু লিখতে পারো। যেমন: This is a test.। আউটপুট কী?

আউটপুট হচ্ছে এই রকম:

This
Is
A

কী মুশকিল! test গেল কোথায়?

এখন তোমার কাজ হবে test-এর নিখোঁজ হওয়ার রহস্যটা তদন্ত করা। তারপর আমি প্রোগ্রামটি ব্যাখ্যা করব।

তোমরা দেখো প্রোগ্রামে আমি স্ট্রিংয়ের দৈর্ঘ্য নির্ণয়ের জন্য strlen ফাংশন ব্যবহার করেছি। আর-এর জন্য আমাকে string.h হেডার ফাইলটি include করতে হয়েছে। ইনপুট হিসেবে স্ট্রিংটা নিলাম s-এ। আর word রাখার জন্য একটি অ্যারে ডিক্লেয়ার করে রেখেছি। তারপর আমি i = 0 থেকে length পর্যন্ত একটি লুপ চালিয়েছি s-এর ভেতরের প্রতিটি ক্যারেক্টার পরীক্ষা করার জন্য।

if (s[i] >= 'a' && s[i] <= 'z') দিয়ে পরীক্ষা করলাম এটি ছোট হাতের অক্ষর নাকি। যদি ছোট হাতের অক্ষর হয় তবে একটি শব্দের প্রথম অক্ষর কি না সেটি জানতে হবে। কারণ প্রথম অক্ষর হলে ওটাকে আবার বড় হাতের অক্ষরে রূপান্তর করতে হবে। সেই পরীক্ষাটা আমরা করেছি: if (is_word_started == 0) দিয়ে। এটি সত্য হওয়া মানে শব্দ শুরু হয়নি, এটিই প্রথম অক্ষর। তাই আমরা is_word_started-এর মান 1 করে দেব। আর word[j]তে s[i]-এর বড় হাতের অক্ষরটা নেব। তারপর j-এর মান এক বাড়াতে হবে। else if (s[i] >= 'A' && s[i] <= 'Z') এবং else if (s[i] >= '0' && s[i] <= '9') এই দুটি শর্তের ভেতরেই আমরা একই কাজ করি। s[i]কে word[j]তে কপি করি। তাই চাইলে দুটি শর্তকে একসঙ্গে এভাবেও লিখতে পারতাম: else if ((s[i] >= 'A' && s[i] <= 'Z') || (s[i] >= '0' && s[i] <= '9')) তার পরের else-এর ভেতরে ঢোকার মানে হচ্ছে আগের if এবং else if-এর শর্তগুলো মিথ্যা হয়েছে। তাই s[i]-এর ভেতরে যেই ক্যারেক্টার আছে সেটি word-এ রাখা যাবে না। এবং যদি word ইতিমধ্যে শুরু হয়ে গিয়ে থাকে, সেটি শেষ করতে হবে এবং wordটি প্রিন্ট করতে হবে। আর যদি word শুরু না হয়ে থাকে তাহলে কিছু করার দরকার নেই।

 else {    
if (is_word_started == 1) {
is_word_started = 0;
word[j] = '\0';
printf("%s\n", word);
j = 0;
}
}

তোমরা কি test-রহস্য সমাধান করতে পেরেছ? তোমরা চেষ্টা করতে থাকো আর আমি এখন প্রোগ্রামটি অন্যভাবে লিখব (এর সঙ্গে test রহস্যের কোনো সম্পর্ক নেই সেটি বলে রাখলাম)।

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

 
#include <stdio.h>    
#include <string.h>
int main()
{
char s[1002], ch;
int i, length, is_word_started;
gets(s);
length = strlen(s);
is_word_started = 0;
for (i = 0; i < length; i++) {
if (s[i] >= 'a' && s[i] <= 'z') {
if (is_word_started == 0) {
is_word_started = 1;
ch = 'A' + s[i] - 'a';
printf("%c", ch);
}
else {
printf("%c", s[i]);
}
}
else if ((s[i] >= 'A' && s[i] <= 'Z') || (s[i] >= '0' && s[i] <= '9')) {
if (is_word_started == 0) {
is_word_started = 1;
}
printf("%c", s[i]);
}
else {
if (is_word_started == 1) {
is_word_started = 0;
printf("\n");
}
}
}
printf("\n");
return 0;
}



এখন প্রোগ্রামটি বুঝতে চেষ্টা করো এবং বিভিন্ন ইনপুট দিয়ে পরীক্ষা করে দেখো। যেমন:

This is test number 9.9

 

লেখাটি এইখান হতে নেওয়া

Monday, September 22, 2014

C প্রোগ্রামিং - 9 অধ্যায়–STring স্ট্রিং ১ম

এক বা একাধিক character মিলে string তৈরি হয়। সোজা কথায় স্ট্রিং হচ্ছে ক্যারেক্টার টাইপের অ্যারে। তবে প্রোগ্রামিংয়ে এটির ব্যবহার এতই বেশি যে কোনো কোনো ল্যাঙ্গুয়েজে  স্ট্রিংকে আলাদা একটি ডাটা টাইপ হিসেবে ধরা হয়। তবে সি-তে আমরা char টাইপের অ্যারে দিয়েই স্ট্রিংয়ের কাজ করব।
নিচের উদাহরণগুলো লক্ষ করো:
 
   1:  char country[11] = {'B', 'a', 'n', 'g', 'l', 'a', 'd', 'e', 's', 'h', '\0'};    
   2:  char country[] = {'B', 'a', 'n', 'g', 'l', 'a', 'd', 'e', 's', 'h', '\0'};    
   3:  char country[] = "Bangladesh";    
   4:  char *country = "Bangladesh";    



এভাবে আমরা স্ট্রিং ডিক্লেয়ার করতে পারি। চারটি ডিক্লারেশন আসলে একই জিনিস। সবার শেষে একটি Null character ('\0') দিলে কম্পাইলার বুঝতে পারে এখানেই স্ট্রিংয়ের শেষ। আবার তৃতীয় উদাহরণে অ্যারের উপাদানগুলো আলাদা করে লেখা হয়নি, একসঙ্গে লেখা হয়েছে। এ ক্ষেত্রে কম্পাইলার নিজেই Null character বসিয়ে নেবে। চতুর্থ উদাহরণটিতে যে জিনিসটা ব্যবহার করা হয়েছে তার নাম পয়েন্টার (pointer)।
এবারে প্রোগ্রাম লিখার পালা।
 


#include <stdio.h>     

 int main()     

 {     

     char country[] = {'B', 'a', 'n', 'g', 'l', 'a', 'd', 'e', 's', 'h', '\0'};     

     printf("%s\n", country);     

     return 0;     

 }

এখানে লক্ষ করো যে printf-এর ভেতরে %s ব্যবহার করা হয়েছে স্ট্রিং প্রিন্ট করার জন্য। আর অ্যারেতে শেষের '\0'টা ব্যবহার না করলেও চলে আসলে। বর্তমানের কম্পাইলারগুলো এটি বুঝে নিতে পারে।






#include <stdio.h>     

 int main()     

 {     

     char country[] ={'B', 'a', 'n', 'g', 'l', 'a', 'd', 'e', 's', 'h', '\0', 'i', 's', ' ', 'm', 'y', ' ', 'c', 'o', 'u', 'n', 't', 'r', 'y'};     

     printf("%s\n", country);        

     return 0;     

 }    

 প্রোগ্রাম: ৯.৩  



প্রোগ্রামে স্ট্রিংয়ের ভেতরে এক জায়গায় '\0' থাকায় কম্পাইলার ধরে নিচ্ছে ওখানে স্ট্রিংটা শেষ হয়ে গেছে।

Screenshot_7
 
 
এবারে আমরা একটি প্রোগ্রাম লিখব। একটি স্ট্রিংয়ের ভেতরের সব অক্ষরকে বড় হাতের অক্ষরে (অর্থাৎ capital letter বা uppercase character) রূপান্তর করা। তবে এর জন্য আমাদের একটি জিনিস জানতে হবে।
প্রতিটি অক্ষরের বিপরীতে কম্পিউটার একটি সংখ্যার কোড ব্যবহার করে। সেই কোড অনুযায়ী, 'A'-এর মান হচ্ছে 65, 'B'-এর মান হচ্ছে 66, 'C'-এর মান হচ্ছে 67... এভাবে 'Z'-এর মান হচ্ছে 90 ।
তেমনই 'a' হচ্ছে 97, 'b' হচ্ছে 98 ... এভাবে 'z' হচ্ছে 122 । সুতরাং কোনো ক্যারেক্টার বড় হাতের কি না সেটি আমরা নির্ণয় করতে পারি এভাবে: if(ch >= 'A' && ch <= 'Z') অথবা if(ch >= 65 && ch <= 90) ।
তেমনই ছোট হাতের অক্ষরের জন্য: if(ch >= 'a' && ch <= 'z') অথবা if(ch >= 97 && ch <= 122)  ।
 
এখন কোনো ক্যারেক্টার যদি ছোট হাতের হয়, তবে তাকে বড় হাতের অক্ষরে রূপান্তর করার উপায় কী? উপায় খুব সহজ। একটি উদাহরণ দেখো: char ch = 'c'; ch = 'A' + (ch – 'a'); এখানে যেটি হচ্ছে, প্রথমে ch থেকে 'a' বিয়োগ করা হচ্ছে মানে 'c' থেকে 'a' বিয়োগ (আসলে 99 থেকে 97 বিয়োগ হচ্ছে )। বিয়োগফল 2 ।   এবারে 'A'-এর সঙ্গে যদি ওই 2 যোগ করে দিই তবে সেটি 'C' হয়ে যাবে! এখন প্রোগ্রামটি লিখে ফেলা যাক:
 



#include <stdio.h>     
int main()
{
char country[] = {'B', 'a', 'n', 'g', 'l', 'a', 'd', 'e', 's', 'h'};
int i, length;
printf("%s\n", country);
length = 10;
for(i = 0; i < length; i++) {
if(country[i] >= 97 && country[i] <= 122) {
country[i] = 'A' + (country[i] - 'a');
}
}
printf("%s\n", country);
return 0;
}

এবার আমরা কোনো স্ট্রিংয়ের দৈর্ঘ্য মাপার জন্য একটি ফাংশন লিখব! এটি তেমন কঠিন কিছু নয়। একটি লুপের সাহায্যে স্ট্রিংয়ের প্রতিটি উপাদান পরীক্ষা করতে হবে এবং Null character ('\0') পেলে লুপ থেকে বের হয়ে যাবে অর্থাৎ, '\0' না পাওয়া পর্যন্ত লুপ চলতে থাকবে। আর লুপ যতবার চলবে স্ট্রিংয়ের দৈর্ঘ্যও তত হবে।
 

#include <stdio.h>
int string_length(char str[])
{
int i, length = 0;
for(i = 0; str[i] != '\0'; i++)
{
length++;
}
return length;
}
int main()
{
char c[100];
int length;
while(1 == scanf("%s", c))
{
length = string_length(c);
printf("length: %d\n", length);
}
return 0;
}

ওপরের প্রোগ্রামটায় তোমরা দেখতে পাচ্ছ যে ইনপুট নেওয়ার জন্য scanf ফাংশন ব্যবহার করা হয়েছে এবং স্ট্রিং ইনপুট নেওয়ার জন্য %s ব্যবহৃত হয়েছে। scanf ফাংশনটি যতটি উপাদান ইনপুট হিসেবে নেয়, সেই সংখ্যাটি রিটার্ন করে। while(1 == scanf("%s", c)) লাইনে যেটি ঘটছে তা হলো, যতক্ষণ একটি c-এর নাম scanf দিয়ে ইনপুট নেওয়া হচ্ছে, ফাংশনটি 1 রিটার্ন করছে, আর লুপের ভেতরের কন্ডিশন সত্য হচ্ছে (1 == 1), তাই লুপের কাজ চলতে থাকবে।
আরেকটি জিনিস খেয়াল করো যে c-এর আগে কোন & চিহ্ন ব্যবহার করা হয়নি। তোমরা &c লিখে দেখো প্রোগ্রামটি কী আচরণ করে। তবে %s ব্যবহারের একটি সমস্যা হচ্ছে স্ট্রিংয়ে কোনো হোয়াইটস্পেস ক্যারেক্টার (যেমন: স্পেস, ট্যাব ইত্যাদি) থাকা যাবে না, এমন কিছু পেলে scanf ওই ক্যারেক্টার পর্যন্ত একটি স্ট্রিং ধরে নেয়। যেমন, ইনপুট যদি হয় this is তবে scanf প্রথমে thisকেই স্ট্রিং হিসেবে নেবে, তারপরে যদি আবার scanf ফাংশন কল করা হয়, তবে isকে সে স্ট্রিং হিসেবে ইনপুট নিয়ে নেবে। এই সমস্যা এড়ানোর জন্য আমরা gets ফাংশন ব্যবহার করতে পারি। নিচের উদাহরণটি দেখো:
 

#include <stdio.h>
int main()
{
char ara[100];
while(NULL != gets(ara)) {
printf("%s\n", ara);
}
return 0;
}

এই প্রোগ্রামটিও চলতে থাকবে যতক্ষণ না তুমি ctrl + z (মানে কি-বোর্ডে ctrl ও z একসঙ্গে) চাপো, লিনাক্সের জন্য ctrl + d। ctrl + z বা ctrl + d দিলে gets ফাংশনটি NULL রিটার্ন করে। আরেকটি জিনিস লক্ষ করো যে আমি char ara[100]; ডিক্লেয়ার করে শুরুতেই বলে দিয়েছি স্ট্রিংয়ের সর্বোচ্চ দৈর্ঘ্য হবে 100 ।
আরেকটি ব্যাপার। string_length ফাংশনের ভেতরে আসলে দুটি ভেরিয়েবল ব্যবহার না করলেও চলে। আমরা ফাংশনটি এভাবেও লিখতে পারি:

int string_length(char str[])     
{
int i;
for(i = 0; str[i] != '\0'; i++);
return i;
}


লেখাটি এই খান হতে নেওয়া 
 



















Sunday, September 21, 2014

C প্রোগ্রামিং - আট অধ্যায় - (pointer)-পয়েন্টার-2

 
pointer নিয়ে কিছু example দেওয়া হল :


EXAMPLE 1 :
//pointer
#include<stdio.h>
int main()
{
int *p,a;
p = &a;
*p=5;
printf("%d\t %d\n",a,*p);
return 0;
}

 


EXAMPLE 2 :


যখন আমরা পয়েন্টার ভ্যারিয়েবল দিয়ে কোন ভ্যারিয়েবল এর এড্রেস বের করতে চাইবো, তখন শুধু পয়েন্টার ভ্যারিয়েবল লিখলেই হবে। কিন্তু যখন আমরা পয়েন্টার ভ্যারিয়েবল দিয়ে মূল ভ্যারিয়েবল এর ভ্যালু বের করতে চাইবো, তখন পয়েন্টার ভ্যারিয়েবল এর আগে * যোগ করতে হবে।

//pointer
#include<stdio.h>
int main()
{
int x,y;
int *p,*q;
p=&x;
q=&y;

x=5;
y=7;
printf("%d %d %d %d",*p,x,*q,y);
printf("\n%d %d %d %d",p,&x,q,&y);

return 0;
}
Screenshot_1
EXAMPLE 3 :
#include<stdio.h>
int main()
{
int arr[100]={5,4,1,2,4,};
printf("%d %d %d %d\n",arr,&arr[0],arr[0],arr[1]);

return 0;
}
Screenshot_3
EXAMPLE 4 :
//pointer
#include<stdio.h>
int main()
{
int a,*pa=&a;
char c,*pc=&c;
float f,*pf=&f;
double d,*pd=&d;

printf("%d %d %d %d",pa,pc,pf,pd);
return 0;
}

 


EXAMPLE 5 :


(*p)++; যাকে pointer করছে তার মান বাড়ার জন্য ।


*p++; adress  এর মান বাড়ার জন্য ।

#include<stdio.h>
int main()
{ int a=5,*p=&a;
printf("%d %d %d\n",a,*p,p);

(*p)++;
printf("%d %d %d\n",a,*p,p);

*p++;
printf(" %d\n",p);

return 0;
}
Screenshot_2
EXAMPLE 6 :
arr1+5 হল arr1[5]হতে arr1[7] পর্যন্ত মান printf করবে .
//string pointer
#include<stdio.h>
#include<string.h>

int main()
{ char arr[]="EWU";
char arr1[]="DINajpur";
char *p;

p=strcpy(arr,arr1+5);
printf("%s",p);
printf(" %d %d",p,arr);

return 0;
}

Screenshot_5


 


 


EXAMPLE 7 :

#include<stdio.h>
int main()
{
int arr[10]={2,4,1,7,4,3,9};
int *p;
p=&arr[5];
printf("%d %d\n",*p,*(p+1));


return 0;
}
Screenshot_4
EXAMPLE 8 :
 
#include<stdio.h>
#include<string.h>
struct structure{
char name[12];
int value;
};
void swap(struct structure *a,struct structure *b)
{
struct structure temp;
strcpy(temp.name,a->name);
temp.value=a->value;
strcpy(a->name,b->name);
a->value=b->value;
strcpy(b->name,temp.name);
b->value=temp.value;
}
int main()
{
struct structure val1,val2;
printf("ENTER val1 Name and value \n");
scanf("%s%d",val1.name,&val1.value);
printf("ENTER val1 Name and value \n");
scanf("%s%d",val2.name,&val2.value);

if(val2.value>val1.value)
swap(&val1,&val2);
printf("val1 (%d) %s \n",val1.value,val1.name);
printf("val2 (%d) %s \n",val2.value,val2.name);

return 0;

}

Screenshot_6

C প্রোগ্রামিং - আট অধ্যায় - (pointer)-পয়েন্টার-1

পয়েন্টার প্রোগ্রামিং এ দারুন একটি টুল। পয়েন্টার সম্পর্কে জানার আগে কিছু ব্যাসিক জিনিস জানা যাক, যেগুলো বুঝতে কাজে দিবে।

ভ্যারিয়েবল গুলো কিভাবে কম্পিউটার মেমরিতে/ র‍্যাম এ স্টোর হয়?

র‍্যাম এর এক একটি সেল এক একটি বাইট।

আর প্রত্যেকটা বাইট এর একটি করে এড্রেস রয়েছে। আর প্রতিটা বাইটে ৮টি করে বিট রয়েছে। C প্রোগ্রামিং - আট অধ্যায় - Pointer পয়েন্টার

memory cell in ram

আমরা যখন বলি আমাদের র‍্যাম 8 Giga byte, তখন আমাদের কম্পিউটারের র‍্যামে মোট 8 000 000 000 bytes ডেটা স্টোর করা যাবে, এবং এদের প্রত্যেকের একটি করে এড্রেস রয়েছে। প্রথমটি ০ পরের টি 1, এর পরের টির এড্রেস 2 এভাবে বাড়তে থাকে।  যদিও কম্পিউটার এ এড্রেস গুলো রিপ্রেজেন্ট করে হেক্সাডেসিমেল নাম্বার সিস্টেমে।

আমরা যখন একটি ভ্যারিয়েবল ডিক্লেয়ার করি আমদের প্রোগ্রামে, এবং যখন আমরা প্রোগ্রামটি এক্সিকিউট/রান করি তখন কম্পিউটার ঐ ভ্যারিয়েবল এর জন্য কিছু মেমরি এলোকেট করে। কতবাইট মেমরি এলোকেট করবে, তা নির্ভর করে ঐ ভ্যারিয়েবল এর ডেটা টাইপ এবং কম্পাইলার এর উপর।

সাধারনত কম্পাইলার গুলো একটা int এর জন্য 4 byte মেমরি এলোকেট করে। তেমনি একটি char ভ্যারিয়েবলের জন্য 1 byte মেমরি এলোকেট করে। floating-point নাম্বার এর জন্য 4 byte মেমরি এলোকেট করে।

যেমন যখন কম্পিউটার দেখে এমন একটি ডিক্লারেশন int a; তখন এটি বুঝতে পারে এটি একটি ইন্টিজার ভ্যারিয়েবল এবং এর জন্য 4 বাইট মেমরি এলোকেট করা দরকার। তখন র‍্যাম এর খালি যায়গা থেকে এটি এই ইন্টিজারের জন্য   4 বাইট মেমরি এলোকেট করে।

আমরা সহজেই একটি ভ্যারিয়েবলের মেমরি লোকেশন বের করতে পারি, নিচের প্রোগ্রামটি দেখা যাকঃ

#include <stdio.h>
int main()
{
int a =5;
printf("Memory address of variable a is: %d",&a);
return 0;
}


উপরের প্রোগ্রামটি রান করালে এমন কিছু দেখাবেঃ Memory address of variable a is: 2686732 । এক কম্পিউটারে এক এক মান দেখাবে। এবং একবার একে এক ভ্যালু দেখাবে।   কোন ভ্যারিয়েবল এর এর মেমরি এড্রেস জানার জন্য & [ampersend] ব্যবহার করা হয়। যাকে  address-of operator [&] ও বলা হয়।  যা দিয়ে আমরা একটি ভ্যারিয়েবল এর  এড্রেস বা মেমরি লোকেশন পেতে পারি।

যখন আমরা প্রোগ্রামটি রান করি, তখন কম্পিউটার র‍্যাম এর খালি যায়গা থেকে ভ্যারিয়েবল a এর জন্য 4 বাইট মেমরি এলোকেট করে। কম্পিউটার অটোমেটিকেলি তখন a এর জন্য 2686732 এবং 2686733 এবং 2686734 এবং 2686735  নং সেল এলোকেট করে রাখে। আর মেমরি এড্রেস জানার জন্য শুধু মাত্র শুরুর এড্রেস জানলেই হয়। আমরা যখন a এর মেমরি এড্রেস প্রিন্ট করেছি, তখন শুধু শুরুর এড্রেস 2686732 ই পেয়েছি। যদি ও a ভ্যারিয়েবল এর জন্য 2686732-2686735  মেমরি এলোকেট করা হয়েছে এবং এর মান 5 এই  সেলে স্টোর করে রাখা হয়েছে। এখন আমরা যদি a এর মান পরিবর্তন করে অন্য আরেকটা ভ্যালু রাখি, যেমন 8, তখন র‍্যামের 2686732 - 2686735 এ  সেল এর মান ও পরিবর্তন হয়ে যাবে এবং এ দুটো সেলে 5 এর পরিবর্থে 8 স্টোর হবে।

এবার পয়েন্টার কি জানা যাক।

পয়েন্টার হচ্ছে একটা ভ্যারিয়েবল যার ভ্যালু হচ্ছে আরেকটি ভ্যারিয়েবল এর মেমরি লোকেশন। পয়েন্টার  একটা ডেটা, অ্যারে বা ভ্যারিয়েবল এর কম্পিউটার মেমরি লোকেশন  রিপ্রেজেন্ট করে বা পয়েন্ট করে। অন্যান্য ভ্যারিয়েবল এর মত  পয়েন্টার ভ্যারিয়েবল ব্যবহার করার আগে কম্পিউটার/ কম্পাইলারকে বলতে হবে এটা একটি পয়েন্টার ভ্যারিয়েবল। নিচের মত করে একটি পয়েন্টার ভ্যারিয়েবল ডিক্লেয়ার করে।

data_type *name;

যেমন integer পয়েন্টারের জন্যঃ  int *i;

asterisk [*] একটি ভ্যারিয়েবলের আগে ব্যবহার করে পয়েন্টার হিসেবে ডিক্লেয়ার করা হয়। যাকে indirection operator বা value-at-address operator বলা হয়। এখানে আরো কিছু ডেটা টাইপ এর পয়েন্টার ডিক্লারেশন এর উদাহরন দেওয়া হলোঃ

int*ip;/* pointer to an integer */

double*dp;/* pointer to a double */

float*fp;/* pointer to a float */

char*ch /* pointer to a character */


আমরা এখন দেখব কিভাবে পয়েন্টার ব্যবহার করতে হয় একটি প্রোগ্রামে।

 

#include <stdio.h>
int main ()
{
int a = 5; /* variable declaration */
int *ip; /* pointer variable declaration */
ip = &a; /* store address of "a" in pointer variable*/
printf("Address of a variable: %d\n", &a );
/* address stored in pointer variable */
printf("Address stored in ip variable: %d\n", ip );
return 0;
}
এখানে আমরা একটি ভ্যারিয়েবল a ডিক্লেয়ার করেছি। এরপর একটি পয়েন্টার ভ্যারিয়েবল ডিক্লেয়ার করেছি। তারপর পয়েন্টার ভ্যারিয়েবলে a এর মেমরি এড্রেস রেখেছি। তারপর & অপারেটর দিয়ে a ভ্যারিয়েবল এর এড্রেস প্রিন্ট করে দেখলাম। এবং পয়েন্টার ভ্যারিয়েবল এর ভ্যালু প্রিন্ট করে দেখলাম। উভয় এর মান ই একই।

আমরা ইচ্ছে করলে এখন ip  পয়েন্টার ভ্যারিয়েবল দিয়ে a এর মান বের করতে পারি।

#include <stdio.h>
int main ()
{
int a = 5;
int *ip;
ip = &a;
/* access the value using the pointer */
printf("Value of *ip variable: %d\n", *ip );
return 0;
}

 

আমরা যখন প্রগ্রামটি রান করব, তখন ip যে ভ্যারিয়েবলটির এড্রেস শো করবে, তার মান প্রিন্ট করবে।

 

লক্ষকরি, যখন আমরা পয়েন্টার ভ্যারিয়েবল দিয়ে কোন ভ্যারিয়েবল এর এড্রেস বের করতে চাইবো, তখন শুধু পয়েন্টার ভ্যারিয়েবল লিখলেই হবে। কিন্তু যখন আমরা পয়েন্টার ভ্যারিয়েবল দিয়ে মূল ভ্যারিয়েবল এর ভ্যালু বের করতে চাইবো, তখন পয়েন্টার ভ্যারিয়েবল এর আগে * যোগ করতে হবে। যেমন প্রথম প্রোগ্রামে আমরা ip [পয়েন্টার ভ্যারিয়েবল] প্রিন্ট করায় আমরা এড্রেস পেয়েছি। এবং পরের প্রোগ্রামে ip এর আগে একটা * দিয়ে *ip প্রিন্ট করায় আমরা মূল ভ্যারিয়েবলের মান পেয়েছি।

লেখাটি এইখান থাকে নেওয়া

Thursday, August 21, 2014

C প্রোগ্রামিং দ্বিতীয় অধ্যায় - TRUE হলে 1 FALSE হলে 0 printf করবে

আমরা জানি কম্পিউটার ০ এবং ১ ছাড়া কিছু বুজতে পারে না । তাই যখন আমরা relation operator use করি তখন শর্ত যদি ভুল হয় তখন ০   printf করবে আর TRUE হলে
  1   printf করবে ।

#include
int main()
{
    int a=1,b=2,c;
    c= a>b;
    printf("%d ",c);
    return 0;
}






#include
int main()
{
    int a=5,b=2,c;
    c=a>b;
    printf("%d ",c);
    return 0;
}
 





Wednesday, August 20, 2014

C প্রোগ্রামিং দ্বিতীয় অধ্যায় -size of data type


আজ আমরা দেখব কোন ডাটা টাইপ কত জায়গা নেয় । এই জন্য আমাদের একটা function use করতে হবে ।
sizeof(data type)..................
#include<stdio.h>
int main()
{
int a;
a=5;
printf("%d",sizeof(int));
return 0;
}


Capture
এখানে  a একটি variable , যেটা int টাইপ এবং এর সাইজ ৪ বাইট জায়গা নিয়ে আছে।  



#include<stdio.h>
int main()
{
double a;
a=5.555;
printf("%d",sizeof(double));
return 0;
}

ss


এখানে  a একটি variable , যেটা double টাইপ এবং এর সাইজ ৮ বাইট জায়গা নিয়ে আছে।  

Thursday, May 22, 2014

C প্রোগ্রামিং - 07 অধ্যায় - ARRAY অ্যারে কি ????? PART -2



আচ্ছা আমরা এখন একটা প্রোগ্রাম চিন্তা করি যেটা ইউজার থেকে ৬টা নাম্বার নিবে এবং পরে তা যোগ করে রেজাল্ট আমাদের দেখাবে। এটা সাধারন পদ্ধতিতে করতে গেলে আমাদের আগে ৬টা ভ্যারিয়েবল নিতে হত, তারপর সেগুলোকে যোগ করতে হত তারপর যোগফল দেখাতে হতো।

এখন আমরা কত সহজেই এ জিনিসটা করতে পারব মাত্র একটি ভ্যারিয়েবল নিয়েঃ

 

#include <stdio.h>
int main()
{
int Number[6];
int i, result=0;
for(i=0; i<6; i++)
{
printf("Enter %d no Number:\n", i+1);
scanf("%d", &Number[i]);
result=result+Number[i];
}
printf("Result is: %d", result);
return 0;
}


 

 

এখানে আমরা একটা Integer Array নিলাম যার Size হচ্ছে 6, অর্থাৎ আমরা এর মধ্যে শুধু মাত্র ৬টি ইলিমেন্ট বা মান  রাখতে পারব।


scanf("%d", &Number[i]);


এটা দিয়ে আমরা i এর বর্তমার মান যত তত তম ঘরে ইনপুট নেওয়া মানটি রাখব। প্রথমে i এর মান ধরে নিয়েছি 0, Number[0] অর্থাৎ প্রথম ঘরে রানটাইমে আমাদের ইনপুট দেওয়া সংখ্যাটি রাখবে। আমরা যেহেতু লুপ চালিয়েছি এবং প্রতিবার i এর মান এক করে বাড়িয়ে দিয়েছি তাই পরের বার i এর মান হবে 1 এবং Number[1] বা Number Array এর দ্বিতীয় ঘরে রানটাইমে দ্বিতীয়বার ইনপুট দেওয়া আমাদের সংখ্যাটি রাখবে। এভাবে লুপটি ৬ বার ঘুরবে। আমরা বুদ্ধি করে প্রতিবার সংখ্যাটি result=result+Number[i]; এ লাইনের সাহায্যে ইনপুট নেওয়ার সময় আগের যোগফলের সাথে যোগ করে দিচ্ছি। পরে রেজাল্টি প্রিন্ট করলে আমরা সব গুলো সংখ্যার যোগ ফল পেয়ে যাবো।

 

 

এখন ইচ্ছে করলে আমরা প্রোগ্রামটি একটু মডিফাই করে কি কি সংখ্যা আমরা ইনপুট দিয়েছি তা বেরও করতে পারব। শুধু মাত্র আরেকটি লুপ চালিয়ে Number Array এর উপাদান গুলো প্রিন্ট করলেই হবে।


#include <stdio.h>
int main()
{
int Number[6];
int i, j, result=0;
for( i=0; i<6; i++)
{
printf("Enter %d no Number:\n", i+1);
scanf("%d", &Number[i]);
result=result+Number[i];
}
printf("Result is %d and you entered: ", result);
for( j=0; j<6; j++)
{
printf("%d ", Number[j]);
}
return 0;
}


 

 






array সম্পর্কে আজ এই পর্যন্ত ।

Thursday, May 15, 2014

C প্রোগ্রামিং - 07 অধ্যায় - ARRAY অ্যারে কি ????? PART -1



একটা প্রোগ্রামের কথা   চিন্তা করি, যেটায় ইউজার থেকে দুইটা নাম্বার নিয়ে যোগ করে তা রিটার্ন / প্রিন্ট করবে বা কনসোলে দেখাবে।
সহজেই আপনি প্রোগ্রামটা লিখে ফেলতে পারবেন তাই না? দুটি ভ্যারিয়েবল নিলাম, তারপর তা যোগ করে প্রিন্ট করলাম। শেষ।
#include <stdio.h>
int main()
{
int x, y;
printf("Enter First Number:\n");
scanf("%d", &x);
printf("Enter Second Number:\n");
scanf("%d", &y);
printf("Addition is %d", (x+y));
return 0;
}


আচ্ছা, যদি তিনটি সংখ্যা যোগ করতে বলে তখন কি করবেন? তিনটি ভ্যারিয়বল নিয়ে তা যোগ করে প্রিন্ট করবেন তাই তো?
আচ্ছা, যদি তিনশ বা তিনহাজার সংখ্যা নিয়ে কাজ করতে হয় তখন কি করবেন? এত গুলো ভ্যারিয়বল কিভাবে লিখবেন? লিখতে কত সময় লাগবে? আর প্রোগ্রামের সাইজ কত বড় হয়ে যাবে না? আরো অনেক গুলো প্রশ্ন জন্ম নিবে এমন সমস্যায়।
যাই হোক, প্রোগ্রামিং আসেছে মানুষের সমস্যা কমাতে , বাড়াতে নয়। তাই এর জন্য অনেক সহজ একটা সমাধান আছে। যার নাম Array, অনেক মজার একটা জিনিস। এতে একই ধরনের (Character, Floating ,int, String )অনেকগুলো ভেরিয়েবল একসঙ্গে রাখা যায়। ভেরিয়েবলের যেমন নাম রাখি, অ্যারের বেলাতেও তেমন একটি নাম দিতে হয়।
এখন আমাকে যদি আপনি জিজ্ঞেস করেন Array কি? তাহলে  আমি বলব কন্টেইনার বাক্স (variable এর মত )। যেটার মধ্যে অনেক কিছু রাখা যায় (variable)। বাক্সটা কেমন হবে তা আমরা বলে দিতে পারি ( যেমন ঃ Character, Floating ,int, String ইত্যাদি  )। বাক্সটায় কয়েকটা খোপ/প্রকোষ্ঠ থাকবে তা আমরা বলে দিতে পারি (কয়টি নিব variable ; 3,4,9.... etc ) এবং বলে দেওয়ার পর তার মধ্যে সুন্দর মত কিছু ডাটা/তথ্য রাখতে পারি ।
যেমন আমরা যখন ৩০০টি ভ্যারিয়বল নিয়ে কাজ করব, তখন ঐ কন্টেইনার বা বাক্সে ৩০০টি প্রকোষ্ঠ আমাদের জন্য তৈরি হবে। আর আমরা সুন্দর মত একটা একটা করে ভ্যারিয়বল রাখতে পারব দেখতে বাক্সের মত  । নিচের ছবিটি দেখুনঃ

এটা একটা বাক্সের মত দেখায় , যার মধ্যে ৬টি প্রকোষ্ঠ বা ঘর  (index) রয়েছে?
Array কিছুটা এমন। আর এটা দেখতে একটা লাইনের মত তাই না? আর তাই এর নাম Linear Array বা One Dimensional Array.
Array এর ভিতরে যা থাকে তাকে Array Elements বলে।
এরেতে সব ধরনের ডাটা রাখা যায়, এমন Integer, Character, Floating Point Number, String ইত্যাদি।
Array তে আরেকটা জিনিস আছে, যার নাম হচ্ছে Index. যা দিয়ে আমরা কোন প্রকোষ্ঠে কিছু রাখতে পারব বা কি রাখছি তা বের করতে পারব। প্রতিটা প্রকোষ্ঠের একটা ইনডেক্স থাকে। Array এর প্রথম Element এর Index হচ্ছে ০, দ্বিতীয় Element এর Index বা উপাদানের হচ্ছে ১ , তৃতীয় উপাদানের হচ্ছে ২ ইত্যাদি। এভাবে বাড়তে থাকবে। উপাদানের নাম্বারের থেকে এক কমই হচ্ছে ইনডেক্স নাম্বার। যেমন ষষ্ঠ উপাদানের ইনডেক্স হচ্ছে ০৫।
ইনডেক্স কি তা এখনি পরিষ্কার হয়ে যাবে। মনে করি আমরা Number নামে একটা Array নিয়েছি যার সাইজ হচ্ছে ৬, সাইজ বলতে এরেতে কয়েটা উপাদান থাকবে তা বুঝানো হচ্ছে।
এরে হচ্ছে একটা ভ্যারিয়েবল, যা কিছু ধরে রাখতে পারে সাধারন গাণিতিক ভ্যারিয়েবলের মত। এখন আমরা যদি Number নামক Array তে কিছু রাখতে চাই, তাহলে বলে দিতে হবে কোন ঘরে/ইনডেক্সে রাখব।
যেমন
Number[0] = 77; লিখলে Number Array এর প্রথম ইন্ডেক্সে 77 রেখে দিবে।
Number[1] = 11; লিখলে Number Array এর দ্বিতীয় ইন্ডেক্সে 11 রেখে দিবে।
Number[2] = 54; লিখলে Number Array এর তৃতীয় ইন্ডেক্সে 54 রেখে দিবে।
এভাবে বাকি ইনডেক্সে অন্যান্য সংখ্যা আমরা রাখতে পারব।



এটা কিছুটা এমন ,মনে কর আমাদের ক্লাস এ ৩ টা রবিন নামে ছেলে আছে । তাদের আমরা রবিন-১,রবিন-২,রবিন-৩ বলে ডাকি   এবং তাদের তুমি কিছু আম দিবে । তো
রবিন-১  কে তুমি দিলে ৫ টি আম ,
রবিন-২ কে দিলে তুমি ১০ টি ,এবং
রবিন-৩ কে দিলে ২ টি ,
এখানে রবিন হল array এর নাম ।
রবিন-১,২,৩, এই গুল হল index.
আর রবিন-১ ,রবিন- ২ , রবিন -৩ প্রত্যেকে হল এক একটি variable .
এবং ৫,১০,২  এগুল হল variable এর মান ।
লুপ  ব্যবহার  করে আমরা অনেক গুলি variable ,  array এর মাধ্যমে  এক সাথে নিতে পারি এবং তা  নিয়ে কাজ করতে পারি ।
তবে আগে আমরা simple code করব তারপর লুপ ব্যবহার করে কাজ করব ,তাহলে বুঝতে  সুবিধা হবে ।
example :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;
}


 
এখানে ara হল array এর নাম , ara[5] এখানে আমরা ৫( ০,১,২,৩,৪) টি variable নিয়ে কাজ করব ।
variable গুলো হল ara[০] ,  ara[১] , ara[২] ,‌ ara[৩] , ara[৪] ;
int a[5] = {10,20,30,40,50} ; মানে হল
ara[০] =১০,
  ara[১] =২০,
ara[২] =,৩০‌
ara[৩] =৪০,
ara[৪] =৫০;
তবে আমরা কিন্তু   printf এ ara[০] , ara[২] output দিয়েছি ।
 example :2
#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;
 }

এটির জন্য কী আউটপুট আসা উচিত?
Capture
আমি জানি না এবং এটি জানা সম্ভব নয়। যেকোনো ধরনের সংখ্যা আসতে পারে। এগুলোকে গারবেজ (garbage) বলে। কারণ আসলে তো ওই অ্যারেতে -1, 5, 100 এই ইনডেক্স বলতে কিছু নেই। অ্যারেটির দৈর্ঘ্যই হচ্ছে 5 সুতরাং ইনডেক্স হবে 0 থেকে 4 .
example 3 :
এখন কোনো অ্যারের সব উপাদান যদি একসঙ্গে দেখাতে চাই, তাহলে উপায় কী? উপায় হচ্ছে প্রথম উপাদান (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;
}

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

#include <stdio.h>
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 th element is: %d\n", i, ara[i]);
}
return 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;
}


 
বাকি টুকু part 2 তে দেখ ..........................................