Saturday, September 27, 2014

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

####        function name : strcpy

একটি স্ট্রিং কে অন্য স্ট্রিং এ কপি করতে ব্যবহিত হয় ।

#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_15

####        function name : strlen



একটি স্ট্রিং এর length জানতে  ব্যবহিত হয় ।
#include<stdio.h>
#include<string.h>
int main()
{
char a[50];
scanf("%s",a);
int l=strlen(a);
printf("Length = %d\n",l);
return 0;
}

Screenshot_16

###       function name : strcat



একটি স্ট্রিং এর সাথে অন্য স্ট্রিং কে যোগ করতে ব্যবহিত হয় ।

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

strcat(a,b);
printf("%s \n",a);
return 0;


}


Screenshot_17

#include<stdio.h>
int main()
{
char a[100];
scanf("%s",a);
strcat(a," Bangladesh");
printf("%s",a);
return 0;
}






###       function name : strcmp

২টি  স্ট্রিং এর মধ্যে তুলনা  করতে ব্যবহিত হয় ।

#include<stdio.h>
#include<string.h>
int main()
{

char a[100],b[100];
int x;
gets(a);
gets(b);

x = strcmp(a,b);
if(x!=0)
{
printf("string are not equal");
}
else
{

printf("string are equal");
}

return 0;
}


Thursday, September 25, 2014

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

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

EXample 1:আমরা যদি শুধু a-m বাa-z বা অন্য  কোন নির্দিস্থ স্থান পর্যন্ত প্রিন্ট করতে চাই তাহলে এভাবে %[a-m] use করতে হবে ।

#include<stdio.h>
int main()
{
char str [100];
scanf("%[a-z]",str);
printf("%s",str);
return 0;

}


Screenshot_13

EXample 2:

A_Z ,a-z ,0-9 পর্যন্ত এবং স্পেস সহ print  করতে চাইলে এভাবে শর্ত দিতে হবে।

#include<stdio.h>
int main()
{
char str [100];
scanf("%[A-Z a-z0-9]",str);
printf("%s",str);
return 0;

}




Screenshot_14

EXample 3:নির্দিস্থ কোন কিছু print করতে না চাইলে এভাবে দিতে হয়

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

}

Capture
Example 4:

নতুন লাইন না পাওয়া পর্যন্ত প্রিন্ট করবে ।

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


Capture1

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

কিছু প্রোগ্রাম example হিসেবে দেওয়া হল :
EXample :1
যতক্ষণ B না পাবে ততক্ষণ printf করবে ।
#include<stdio.h>
int main()
{
char ch[10];
int i=0;
ch[0]='E';
ch[1]='W';
ch[2]='U';

ch[3]='B';
ch[4]='A';
ch[5]='N';
ch[6]='G';
ch[7]='L';
ch[8]='A';
while(ch[i]!='B')
{
printf("%c",ch[i]);
i++;
}

}

Screenshot_10





Example 2:

#include<stdio.h>
int main()
{
char ch[10];
int i=0;
ch[0]='E';
ch[1]='W';
ch[2]='U';

ch[3]='\0';
ch[4]='A';
ch[5]='N';
ch[6]='G';
ch[7]='L';
ch[8]='A';

printf("%s",ch);
}




Screenshot_11



Example 3:
#include<stdio.h>
int main()
{
char ch[100]="ewu bangla";
int i;

printf("%c",ch[5]);
return 0;
}

Screenshot_12


 

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 প্রিন্ট করায় আমরা মূল ভ্যারিয়েবলের মান পেয়েছি।

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