সি –রিকারসিং (C – Recursion)

সি –রিকারসিং (C – Recursion)

Md. Amirul Islam (ARIF)

Bogra

 

 

রিকারসিং ( Recursion) হল আইটেম রিপিটিং করার একটি স্বয়ংসম্পূর্ণ প্রক্রিয়া। প্রোগ্রামিং ল্যাঙ্গুয়েজে একই প্রয়োগ পাশাপাশি  যদি একটি প্রোগ্রাম আপনাকে অনুমতি দেয় একই ফাংশনের ভিতরে একই /the same ফাংশন কল করতে তাহলে এটাকে রিকারসিং বলা হয় ।

এভাবে ফাংশন কল করা হয়ঃ

 

void recursion(){   recursion(); /* function calls itself */} int main(){   recursion();}  

সি প্রোগ্রামিং ল্যাঙ্গুয়েজ রিকারসিং সমর্থিত অর্থাৎ একটি ফাংশন নিজেকেই কল করতে পারে । কিন্তু যখন রিকারসিং ব্যাবহার করা হয় তখন প্রোগ্রামারের প্রয়োজন হয় ফাংশনটি থেকে সতর্কতার সাথে একটি এক্সিট কন্ডিশন সংজ্ঞায়িত করা, অন্যথায় এটি ইনফিনিটি লুপে চলে যাবে ।

 

রিকার্সিভ ফাংশনগুলো খুবই গুরুত্বপূর্ণ অনেক গাণিতিক সমস্যা সমাধান করতে।  যেমন একটি নাম্বারের গৌণিক নিরূপণ (calculate factorial), জেনারেটিং Fibonacci সিরিজ ইত্যাদি।

 

সংখ্যা গুণিতক (Number Factorial)

নিচের উদাহরনটি অনুসরন করুন। যা একটি রিকার্সিভ ফাংশন ব্যবহার করে একটি প্রদত্ত সংখ্যার জন্য গৌণিক হিসাব: সংখ্যা গুণিতক

 

#include <stdio.h> int factorial(unsigned int i){   if(i <= 1)   {      return 1;   }   return i * factorial(i 1);}int  main(){    int i = 15;    printf(“Factorial of %d is %d\n”, i, factorial(i));    return 0;}

 

 

 

যখন উপরের কোড গুলো প্রণীত ও অনুষ্ঠিত (compiled and executed) হয় তখন নিম্নলিখিত ফলাফল সৃষ্টি করে:

Factorial of 15 is 2004310016 Fibonacci সিরিজ (Fibonacci Series) আরেকটি উধাহরন অনুসরন করুন, যা একটি রিকার্সিভ ফাংশন ব্যবহার করে একটি প্রদত্ত সংখ্যার জন্য Fibonacci সিরিজ তৈরি করে: #include <stdio.h> int fibonaci(int i){   if(i == 0)   {      return 0;   }   if(i == 1)   {      return 1;   }   return fibonaci(i1) + fibonaci(i2);} int  main(){    int i;    for (i = 0; i < 10; i++)    {       printf(“%d\t%n”, fibonaci(i));    }    return 0;}

যখন উপরের কোড গুলো প্রণীত ও অনুষ্ঠিত (compiled and executed) হয় তখন নিম্নলিখিত ফলাফল সৃষ্টি করে:

 0       1       1       2       3       5       8       13      21      34     

 

সি প্রোগ্রামিঙে এরর হ্যান্ডেলিং . Error Handling in C Programming

সি প্রোগ্রামিঙে এরর হ্যান্ডেলিং
রিদওয়ান বিন শামীম

যেহেতু সি প্রোগ্রামিঙে সরাসরি ভুল সংশোধনের সুযোগ নেই কিন্তু সিস্টেম প্রোগ্রামিং ল্যাঙ্গুয়েজ হওয়ার কারণে কিছু নিম্ন মানের পরিবর্তনের সুযোগ দিয়ে থাকে। বেশিরভাগ সি এমনকি ইউনিক্স ফাংশনও -1 বা NULL রিটার্ন দেখায়, এবং errno নামক এরর কোড প্রদর্শন করে যা একটি গ্লোবাল কোড, যা নির্দেশ করে ভুলটি কোন ফাংশন কলের সময় হয়েছিল। হিডার ফাইলে বিভিন্ন এরর কোড পাওয়া যায়। তাই সি প্রোগ্রামিং রিটার্ন ভ্যলু চেক করে ও সেই মোতাবেক ব্যবস্থা নেয়। প্রোগ্রাম শুরুর সময় errno কে ০ নির্ধারণ করে নেয়া ভাল, এর মানে হচ্ছে প্রোগ্রামে কোন ভুল নেই।
errno, perror()এবং strerror()
perror() এবং strerror(),errnoএর অধীনে টেক্সট মেসেজ প্রদর্শনে ব্যবহার করা হয়। perror() ফাংশন এর কাছে সরবরাহকৃত string প্রদর্শন করে কোলন, স্পেসের
মাধ্যমে, তারপর লিখিত বার্তা আকারে errno value প্রদর্শন করে। strerror()ফাংশন লিখিত বার্তার একটি পয়েন্টার ফেরত দেয়, বর্তমান errno value সহ। একটি এরর কন্ডিশন তৈরি করে এমন একটি ফাইল খোলার চেষ্টা করা যাক যার অস্তিত্বই নেই। এখানে যদিও দুটি ফাংশন ব্যবহার করা হবে, একটি বা বেশি ফাংশনও ব্যবহার করা যায়। আরেকটি ব্যপার হল, stderr file stream ব্যবহার করা ভাল এররের আউটপুট পাওয়ার জন্য।
#include <stdio.h>
#include <errno.h>
#include <string.h>

extern int errno ;

int main ()
{
FILE * pf;
int errnum;
pf = fopen (“unexist.txt”, “rb”);
if (pf == NULL)
{
errnum = errno;
fprintf(stderr, “Value of errno: %d\n”, errno);
perror(“Error printed by perror”);
fprintf(stderr, “Error opening file: %s\n”, strerror( errnum ));
}
else
{
fclose (pf);
}
return 0;
}
উপরোক্ত কোড লেখার পর যে ফলাফল আসবে তা হল,
Value of errno: 2
Error printed by perror: No such file or directory
Error opening file: No such file or directory

শূন্য এরর দিয়ে ডিভাইড করাঃ অনেক ডেভলপার এটি করেন না, যার ফলে রানটাইম এরর হয়ে প্রোগ্রামটি অচল হয়ে যায়। শূন্য এরর দিয়ে ডিভাইড করতে নিচের কোড লিখতে হবে,
#include <stdio.h>
#include <stdlib.h>

main()
{
int dividend = 20;
int divisor = 0;
int quotient;

if( divisor == 0){
fprintf(stderr, “Division by zero! Exiting…\n”);
exit(-1);
}
quotient = dividend / divisor;
fprintf(stderr, “Value of quotient : %d\n”, quotient );

exit(0);
}
ঠিকভাবে লিখলে যা ফলাফল হবে তা হল,
Division by zero! Exiting…
প্রোগ্রামের Exit Status ঃ প্রোগ্রামিঙে কোন সফল কোডিঙের পরে EXIT_SUCCESS কোড পাওয়া যায় যা মূলত একটি ম্যাক্রো, এর মান ০, কোন প্রোগ্রামে এরর কন্ডিশন থাকলে এবং সেভাবেই বের হয়ে আসার চেষ্টা করলে এই কোডটি দেখাবে, EXIT_FAILURE। যেটিকে -1 দ্বারা প্রকাশ করা হয়, তাই এক্ষেত্রে এই কোড লেখা হয়,
#include <stdio.h>
#include <stdlib.h>

main()
{
int dividend = 20;
int divisor = 5;
int quotient;

if( divisor == 0){
fprintf(stderr, “Division by zero! Exiting…\n”);
exit(EXIT_FAILURE);
}
quotient = dividend / divisor;
fprintf(stderr, “Value of quotient : %d\n”, quotient );

exit(EXIT_SUCCESS);
}
ঠিকভাবে লিখা হলে যে ফলাফল আসবে তা হল,
Value of quotient : 4

এরচেয়ে কম ওয়ার্ডে হল না। বোনাস (1.20 => 350 words article) আশা করছি।

সি ফাইল অপারেশন্স . C File I/O

শেখ আবুল হাশিম

খুলনা খানজাহান আলী কলেজ

বাগেরহাট, খুলনা।

 

১. ফাইল খোলা
২. ফাইল থেকে কোন কিছু পড়া বা ফাইলে কিছু লেখা
৩. ফাইল বন্ধ করা

ফাইল ব্যবহারের জন্য আমাদের একটা ফাইল handle দরকার। এটার মাধ্যমে আমরা একটা ফাইরকে চিহ্নিত করি। এটা FILE টাইপের একটা পয়েন্টার যেটাকে এভাবে ডিক্লেয়ার করতে হয়ঃ

FILE *fp;

fopen দিয়ে একটা ফাইল খুললে আমরা এটা রিটার্ন পাই।

 

File open:

fp = fopen(filename, mode);

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

r – read মোডে ফাইল খোলা হবে। ফাইল আগে থেকে না থাকলে এভাবে ব্যবহার করলে FILE পয়েন্টার রিটার্ন করবে না।
w – read মোডে ফাইল খোলা হবে। ফাইল না থাকলে নতুন একটা ফাইল তৈরি হবে। ফাইল আগে থেকে থাকলে ফাইলের সব ডাটা মুছে যাবে এবং ফাইলের প্রথম থেকে লেখে হবে।
a – append- আগে থেকে আছে এরকম ফাইলের শেষে থেকে লেখা শুরু করার জন্য এই মোড ব্যবহার করা হয়। ফাইল না থাকলে নতুন একটা ফাইল তৈরি হবে।

+ ব্যবহার করে একই সাথে read এবং write করা যায়। এরপর ব্যবহার করে কিভাবে বা হবে সেটা ঠিক করা যায়।

r+ – একই সাথে লেখা এবং পড়ার দরকার হলে এবং ফাইলের শুরু থেকে পড়া শুরু করার জন্য এই মোড ব্যবহার করা হয়।
w+ – একই সাথে লেখা এবং পড়ার দরকার হলে এবং ফাইলের শুরু থেকে লেখা শুরু করার জন্য এই মোড ব্যবহার করা হয়। ফাইল না থাকলে নতুন একটা ফাইল তৈরি হবে।
a+ – একই সাথে লেখা এবং পড়ার দরকার হলে এবং ফাইলের শেষে লেখা শুরু করার জন্য এই মোড ব্যবহার করা হয়। ফাইল না থাকলে নতুন একটা ফাইল তৈরি হবে।

নীচে কয়েকটি উদাহরণ দেখি।

একটা ফাইল খুলে কোন কিছু লেখার জন্য এভাবে ফাইল ওপেন করা যায়ঃ

fp = fopen(“myfile.txt”, “w”);

তাহলে myfile.txt নামে একটি ফাইল তৈরি হবে যেটার মধ্যে আমরা লিখতে পারব।

read মোডে ফাইল খোলার জন্য এভাবে লিখতে হবেঃ

fp = fopen(“names.txt”, “r”);

এখানে names.txt ফাইলটি থাকতে হবে। তাহলে আমরা এখন এই ফাইল থেকে পড়তে পারব।

 

File print:

এই ফাংশনটি printf এর মত তবে এটা ফাইলে লেখার জন্য ব্যবহার করা হয়।

যেমন আমরা যদি এভাবে লিখি

printf(“Hello, World!”);

তাহলে কনসোলে Hello, World! লেখা হবে।

fprintf এর ক্ষেত্রেও তাই- শুধু ফাইল handle টা দিয়ে দিতে হবে।

fprintf(fp, “Hello, World!”);

তাহলে ফাইলে Hello, World! লেখা হবে।

 

File scan:

এই ফাংশনটি scanf এর মত তবে এটা ফাইল থেকে পড়ার জন্য ব্যবহার করা হয়।

যেমন আমরা যদি এভাবে লিখি

int num;
scanf(“%d”, &num);

তাহলে কিবোর্ড থেকে একটা পুর্ণসংখ্যা ইনপুট নিয়ে num ভেরিয়েবলে রাখা হবে।

fscanf এর ক্ষেত্রেও তাই- শুধু ফাইল handle টা দিয়ে দিতে হবে।

int num;
fscanf(fp, “%d”, &num);

তাহলে ফাইল থেকে একটা পুর্ণসংখ্যা পড়ে নিয়ে num ভেরিয়েবলে রাখা হবে।

 

File close:

ফাইল ব্যবহার শেষে ফাইলটি বন্ধ করার জন্য এই ফাংশন ব্যবহার করতে হবে।

এভাবে লিখলে ফাইল বন্ধ হবেঃ

fclose(fp);

একটা সম্পুর্ণ উদাহরণ দেখিঃ

#include “stdio.h”

 

int main()

{

FILE *fp;

 

fp = fopen(“myfile.txt”, “w”);

 

fprintf(fp, “Hello, World!n”);

 

fclose(fp);

 

return 0;

}

এটা রান করলে একটা ফাইল তৈরি হবে এবং তাতে Hello, World! লেখা হবে। আপনারা ফাইলটি খুলে দেখতে পারেন ঠিকমত লেখা হল কিনা।

আরও কয়েকটি ফাংশনের নাম জেনে রাখুন যেগুলো দিয়ে ফাইল থেকে পড়া বা ফাইলে লেখা যায়।
fputc
fgetc
fread
fwrite
ftell
fseek
fflush

সি প্রোগ্রামিঙে typedef এর ব্যবহার

সি প্রোগ্রামিঙে typedef এর ব্যবহারঃ
রিদওয়ান বিন শামীম

সি প্রোগ্রামিং ল্যাঙ্গুয়েজ typedef নামের একটি কি-ওয়ার্ড ব্যবহার করতে দেয়, যা নতুন নাম টাইপ করতে দেয়, নিচের উদাহরণে BYTE টার্ম বিবৃত করা হয়েছে।
typedef unsigned char BYTE;
বিবৃত করার পর unsigned char এর ব্যাখ্যা হিসাবে BYTE identifier রূপে কাজ করে। যেমন,
BYTE b1, b2;
বড় হাতের অক্ষর দ্বারা নিশ্চিত করা হয় যে এটি symbolic abbreviation কিন্তু ছোট হাতের অক্ষরও ব্যবহার করা যায় যেমন,
typedef unsigned char byte;
ব্যবহারকারী নির্ধারিত ডাটা বিবৃতির জন্য typedef ব্যবহার করা যায়, যেমন নতুন ডাটা টাইপের জন্য typedef ব্যবহার করা যায়, এরপর কাঠামোগত চলক প্রকাশের জন্য সরাসরি নিচের কোড ব্যবহার করা যায়।
#include
#include

typedef struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;

int main( )
{
Book book;

strcpy( book.title, “C Programming”);
strcpy( book.author, “Nuha Ali”);
strcpy( book.subject, “C Programming Tutorial”);
book.book_id = 6495407;

printf( “Book title : %s\n”, book.title);
printf( “Book author : %s\n”, book.author);
printf( “Book subject : %s\n”, book.subject);
printf( “Book book_id : %d\n”, book.book_id);

return 0;
}
কোডগুলো ঠিকমত লিখা হলে তা যে ফলাফল দেখাবে তা হল,
Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
typedef vs #define
#define হল এক প্রকার C-directive যা যা বিভিন্ন ডাটা টাইপের aliases বোঝাতে ব্যবহার হয়। যা মূলত typedef এর মতই কিন্তু কিছু পার্থক্য আছে, typedef সিম্বোলিক নাম দেয়ার ক্ষেত্রে সীমাবদ্ধ কিন্তু #define সাধারণত alias এর ভ্যলু বোঝাতে পারে, typedef এর প্রভাব কম্পাইলার থেকে প্রকাশ পায় কিন্তু #define বিবৃতি প্রিপ্রসেসর থেকে প্রকাশ করা হয়। #define এর সবচে সহজ ব্যবহার নিচে দেখানো হল।
#include

#define TRUE 1
#define FALSE 0

int main( )
{
printf( “Value of TRUE : %d\n”, TRUE);
printf( “Value of FALSE : %d\n”, FALSE);

return 0;
}
উপরের কোড সঠিকভাবে লিখা হলে তা যে ফলাফল দেবে তা হল,
Value of TRUE : 1
Value of FALSE : 0

সি – বিট ক্ষেত্র (C – Bit Fields)

সি – বিট ক্ষেত্র (C – Bit Fields)
Md. Amirul Islam (ARIF)
Bogra

ধরুন আপনার সি প্রোগ্রামে একটি স্ট্রাচার নামক কয়েকটি TRUE/FALSE ভেরিয়াবল গ্রুপ ।
নিম্নরূপ:

struct
{
unsigned int widthValidated;
unsigned int heightValidated;
} status;

এই স্ট্রাচারের লাগে ৮ বাইট মেমোরি স্পেস কিন্তু আমরা প্রত্যেক ভেরিয়াবলে সংরক্ষণ করতে যাচ্ছি 0 অথবা 1 । সি প্রোগ্রামিং ল্যাঙ্গুয়েজ স্বল্প মেমোরি স্পেস ব্যবহার করতে একটি ভাল সুবিধা করে দিয়েছে । যদি আপনি এই ভেরিয়াবল ব্যাবহার করেন একটি স্ট্রাকচারের ভিতরে তারপর আপনি সংজ্ঞায়িত করতে পারবেন একটি ভেরিয়াবল এর প্রস্থ যা সি কম্পিলার বলে যে আপনি সুধুমাত্র সেই বাইট সংখ্যা ব্যাবহার করতে যাচ্ছেন ।
নিম্নে উদাহরণস্বরূপ, উপরোক্ত গঠন পুনরায় লেখা যেতে পারে:

struct
{
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status;

এখন, উপরোক্ত গঠনে 4 বাইট মেমোরি স্পেস স্ট্যাটাস ভেরিয়াবল এর জন্য লাগবে কিন্তু শুধুমাত্র 2 বিট ব্যাবহার হবে ভেলু গুলো জমা রাখতে । যদি আপনি প্রত্যেকটি একটি 1 বিটের প্রস্থে 32 ভেরিয়াবল ব্যাবহার করতে চান, তারপরেও স্ট্যাটাস স্ট্রাকচারে 4 বাইট হবে । কিন্তু যখনি আপনার ৩৩ ভেরিয়াবল থাকবে তখন এটি মেমোরির পরবর্তী স্লটে বরাদ্দ হবে । এবং এটাতে ৮ বাইট ব্যাবহার হবে।
আমাদের ধারণা বুঝতে নিম্নলিখিত উদাহরণে পরীক্ষা করা যাক:
#include
#include

/* define simple structure */
struct
{
unsigned int widthValidated;
unsigned int heightValidated;
} status1;

/* define a structure with bit fields */
struct
{
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status2;

int main( )
{
printf( “Memory size occupied by status1 : %d\n”, sizeof(status1));
printf( “Memory size occupied by status2 : %d\n”, sizeof(status2));

return 0;
}

যখন উপরের কোড গুলো প্রণীত ও অনুষ্ঠিত (compiled and executed) হয় তখন নিম্নলিখিত ফলাফল সৃষ্টি করে:
Memory size occupied by status1 : 8
Memory size occupied by status2 : 4

বিট ফিল্ড ঘোষণা (Bit Field Declaration)
একটি স্ট্রাকচারের ভিতর বিট ফিল্ডের ফর্ম ঘোষণা করা হয়ঃ

struct
{
type [member_name] : width ;
};

নিচে বিট ফিল্ডের ভেরিয়াবল উপাদানের বর্ণনা দেওয়া হলঃ

উপাদান বর্ণনা
type একটি ইন্টেগ্রা টাইপ (integer type) যেটা নির্ধারণ করে কিভাবে বিট ফিল্ডের এর মান ব্যাখ্যা করা হয়। টাইপ হতে পারেঃ int, signed int, unsigned int.
member_name বিট ফিল্ডের নাম।
width একটি বিট ফিল্ডের বিটের সংখ্যা। প্রস্থ (width) কে অবশ্যই নির্দিষ্ট প্রকারের বিট প্রস্থ এর সমান অথবা ছোট হতে হবে ।

একটি পূর্বনির্ধারিত প্রস্থ সঙ্গে সংজ্ঞায়িত ভেরিয়েবলকে বিট ফিল্ড বলা হয়। একটি বিট ক্ষেত্র একটি একক বিটের চেয়ে বেশি রাখা যাবে। উদাহরণস্বরূপ, যদি আপনার প্রয়োজন হয় একটি ভেরিয়াবল শুধুমাত্র ০ থেকে ৭ ভেলু জমা করতে তখন আপনি একটি বিট ফিল্ড সংজ্ঞায়িত করতে পারেন একটি ৩ বিটের প্রস্থের সাথে।
এরুপঃ

struct
{
unsigned int age : 3;
} Age;

উপরের গঠন সংজ্ঞা C কম্পাইলার নির্দেশ করে যে ভেলু জমা করতে এজ ভেরিয়াবল ব্যাবহার করছে শুধু ৩ বিট, যদি আপনি তিনের বেশি বিট ব্যাবহার করতে চেষ্টা করেন তখন এটা আপনাকে আনুমতি দেবে না ।
চলুন নিচের উধাহরন চেষ্টা করা যাকঃ

#include
#include

struct
{
unsigned int age : 3;
} Age;

int main( )
{
Age.age = 4;
printf( “Sizeof( Age ) : %d\n”, sizeof(Age) );
printf( “Age.age : %d\n”, Age.age );

Age.age = 7;
printf( “Age.age : %d\n”, Age.age );

Age.age = 8;
printf( “Age.age : %d\n”, Age.age );

return 0;
}

যখন উপরের কোড গুলো প্রণীত ও অনুষ্ঠিত (compiled and executed) হয় তখন নিম্নলিখিত ফলাফল সৃষ্টি করে:

Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0

The above structure definition instructs C compiler. that age variable is going to use only 3 bits to store the value, if you will try to use more than 3 bits then it will not allow you to do so. Let us try the following example:

সি প্রোগ্রামিং – স্ট্রাকচার

শেখ আবুল হাশিম
খুলনা খানজাহান আলী কলেজ
বাগেরহাট, খুলনা।

লেকচার ৯ – সি প্রোগ্রামিং – স্ট্রাকচার

C ল্যাংগুয়েজে একাধিক ভেরিয়েবল নিয়ে গ্রুপ ভেরিয়েবল ডিক্লেয়ার করা যায়। এই গুপটিকে বলা হয় স্ট্রাকচার। আমরা যদি কোন এক ব্যাক্তির নাম, বয়স এবং তার বেতন নিয়ে কাজ করতে চাই তাহলে সেগুলো একসাথে রাখা সুবিধাজনক।
সেজন্য আমরা এভাবে স্ট্রাকচার তৈরি করিঃ
struct [struct_name]
{
[structure fields]
};
যেমনঃ
struct Person
{
char name[20];
int age;
int salary;
};
এখানে স্ট্রাকচারে তিনটি ফিল্ড রয়েছে- name, age এবং salary । এই ফিল্ড তিনটিকে কোন আলাদা ভেরিয়েবল ধরার দরকার নেই। এগুলো সবসময় একসাথে থাকবে। তবে আলাদে ভাবে এদের মান দেখা বা পরিবর্তন করা যাবে।
এখন এই স্ট্রাকচারটিকে আমরা সাধারন একটা প্রাথমিক (primitive type) টাইপের ভেরিয়েবলের মত ব্যবহার করতে পারব।
যেমন এভাবে ভেরিয়েবল ডিক্লেয়ার করা হয়ঃ
Person p1;
[বিঃদ্রঃ আমরা বেশিরভাগ সময় C++ কম্পাইলার ব্যবহার করি। সেকারনে একেবারে শুদ্ধ C ল্যাংগুয়েজ ব্যবহার করার চেষ্টা করছি না এই লেকচারে।]

Initializing a Structure
ভেরিয়েবল ডিক্লেয়ার করার সময়ই অন্য টাইপের ভেরিয়েবলের যেমন প্রাথমিক মান ঠিক করে দেয়া যায় সেরকম স্ট্রাকচারের ক্ষেত্রেও করা যায়ঃ
Person p1 = {“”Kalam””, 38, 60000};
এক্ষেত্রে স্টাকচারের ফিল্ডগুলোর ক্রম ঠিক রাখতে হবে।
ক্রম উলটাপাল্টা করতে চাইলে ফিল্ডগুলোর নামসহ এভাবে লেখা যায়ঃ
Person p1 = { .age = 38, .name = “”Kalam””, .salary= 60000};
ফিল্ডের নামের আগে ডট (.) দিতে হবে। এক্ষেত্রে ইচ্ছা করলে এক বা একাধিক ফিল্ডের মান না দিলেও অসুবিধা নেই।
স্ট্রাকচারের ফিল্ডগুলো নিয়ে আলাদা ভাবে কাজ করতে চাইলে ডট (.) ব্যবহার করে করা যায়ঃ
int current_age;
Person p1;

p1.name = “”Kalam”;
p1.age = 38;
p1.salary = 60000;

current_age = p1.age
Assignment
Person p1 = {“”Kalam””, 38, 60000};

Person p2;

p2 = p1; /* copies the member values from p1 into p2. */
এখানে মনে রাখতে হবে এভাবে একটা ভেরিয়েবল থেকে আরেকটাতে মান কপি করলে দুইটা আলাদা ভেরিয়েবল হিসাবে কাজ করবে। একটাতে মান পরিবর্তন করলে আরেকটাতে কোন পরিবর্তন হবে না।
যেমন p2.age=56; লিখলে p1.age এর মানের কোন পরিবর্তন হবে না।
Functions and Structures
ফাংশনের প্যারামিটার বা রিটার্ন ভ্যালু হিসাবে অন্য যেকোন টাইপের ভেরিয়েবলের মতই স্ট্রাকচার ব্যবহার করা যায়।
নীচের প্রোগ্রামটি লক্ষ করুণঃ
#include “stdio.h”

void print_person(Person p)
{
printf(“Name: %sn”, p.name);
printf(“Age: %dn”, p.age);
printf(“Salary: %dn”, p.salary);
}

void main()
{
Person p1 = {“”Kalam””, 38, 60000};
print_person(p1);
}
এখানে ভ্যালু হিসাবে পাঠানো হচ্ছে স্ট্রাকচার। ফাংশনের মধ্যে কোন ফিল্ডের মান পরিবর্তন করলে সেটা ফাংশনের বাইরে কোন প্রভাব ফেলবে না বা মান পরিবর্তন হবে না।
রেফারেন্স হিসাবেও স্ট্রাকচার ভেরিয়েবল ব্যবহার করা যায় এভাবে (অন্য টাইপের ভেরিয়েবলের মতই ভরিয়েবলের নামের পূর্বে & ব্যবহার করে)
#include “stdio.h”

void test_person(Person &p)
{
if(p.age == 0)
{
p.age=18;
}
}

void main()
{
Person p1 = {“”Kalam””, 0, 60000};
test_person(p1);

printf(“Age: %d”, p1.age);
}
এখনে Age: 18 এভাবে আউটপুট পাব।
Arrays of Structure
অন্য টাইপের মতই স্ট্রাকচারের Array তৈরি ও ব্যবহার করা যায়ঃ
ডিক্লেয়ার করার জন্য এভাবে লিখতে হবেঃ
Person pn[10];
এখন অন্য টাইপের ভেরিয়েবলের মতই ইনডেক্স ব্যবহার করা যাবে এভাবেঃ
pn[0].age = 30;

pn[9].salary=50000;
Structure within a Structure (nested structure)
আমরা যদি্ ব্যক্তির ঠিকানাও রাখতে চাই একসাথে তাহলে আমরা nested structure ব্যবহার করে সেটা করতে পারিঃ
struct Person
{
char name[20];
int age;
int salary;
struct address
{
int house_no;
char street[30];
char post[30];
char district[30];
};
};
এক্ষেত্রে যেভাবে ব্যবহার করতে হবেঃ
Person p1;

p1.age = 34;
p1.address.house_no = 2543;

How To Process Data with Apache Pig

How To Process Data with Apache Pig

এইচটিএমএল রঙ (HTML Color codes chart)

এইচটিএমএল রঙ (HTML Color Names)

স্বর্ণা আখতার

 

স্বর্ণা আখতারআমরা জানি একেকটি কালার হলো লাল, নীল এবং সবুজ এর সমন্বিত রূপ। সাধারনত, ১৪০ টি কালার আছে যেগুলো সব ওয়েব ব্রাউজারেই সাপোর্ট করে। এই ১৪০ টি নাম এইচ টি এম এল ৫ এবং সিএসএস ৫ এ উল্লেখ আছে। যার মধ্যে ১৭ টি এসেছে এইচ টি এম এল থেকে এবং ১২৭ টি এসেছে সিএসএস থেকে। নিচে সেইসব ১৪০ টি কালারের নাম এবং তাদের হেক্সাডেসিমেল কোড দেয়া হল।

 

Color Name HEX Color Shades Mix
AliceBlue #F0F8FF Shades Mix
AntiqueWhite #FAEBD7 Shades Mix
Aqua #00FFFF Shades Mix
Aquamarine #7FFFD4 Shades Mix
Azure #F0FFFF Shades Mix
Beige #F5F5DC Shades Mix
Bisque #FFE4C4 Shades Mix
Black #000000 Shades Mix
BlanchedAlmond #FFEBCD Shades Mix
Blue #0000FF Shades Mix
BlueViolet #8A2BE2 Shades Mix
Brown #A52A2A Shades Mix
BurlyWood #DEB887 Shades Mix
CadetBlue #5F9EA0 Shades Mix
Chartreuse #7FFF00 Shades Mix
Chocolate #D2691E Shades Mix
Coral #FF7F50 Shades Mix
CornflowerBlue #6495ED Shades Mix
Cornsilk #FFF8DC Shades Mix
Crimson #DC143C Shades Mix
Cyan #00FFFF Shades Mix
DarkBlue #00008B Shades Mix
DarkCyan #008B8B Shades Mix
DarkGoldenRod #B8860B Shades Mix
DarkGray #A9A9A9 Shades Mix
DarkGreen #006400 Shades Mix
DarkKhaki #BDB76B Shades Mix
DarkMagenta #8B008B Shades Mix
DarkOliveGreen #556B2F Shades Mix
DarkOrange #FF8C00 Shades Mix
DarkOrchid #9932CC Shades Mix
DarkRed #8B0000 Shades Mix
DarkSalmon #E9967A Shades Mix
DarkSeaGreen #8FBC8F Shades Mix
DarkSlateBlue #483D8B Shades Mix
DarkSlateGray #2F4F4F Shades Mix
DarkTurquoise #00CED1 Shades Mix
DarkViolet #9400D3 Shades Mix
DeepPink #FF1493 Shades Mix
DeepSkyBlue #00BFFF Shades Mix
DimGray #696969 Shades Mix
DodgerBlue #1E90FF Shades Mix
FireBrick #B22222 Shades Mix
FloralWhite #FFFAF0 Shades Mix
ForestGreen #228B22 Shades Mix
Fuchsia #FF00FF Shades Mix
Gainsboro #DCDCDC Shades Mix
GhostWhite #F8F8FF Shades Mix
Gold #FFD700 Shades Mix
GoldenRod #DAA520 Shades Mix
Gray #808080 Shades Mix
Green #008000 Shades Mix
GreenYellow #ADFF2F Shades Mix
HoneyDew #F0FFF0 Shades Mix
HotPink #FF69B4 Shades Mix
IndianRed #CD5C5C Shades Mix
Indigo #4B0082 Shades Mix
Ivory #FFFFF0 Shades Mix
Khaki #F0E68C Shades Mix
Lavender #E6E6FA Shades Mix
LavenderBlush #FFF0F5 Shades Mix
LawnGreen #7CFC00 Shades Mix
LemonChiffon #FFFACD Shades Mix
LightBlue #ADD8E6 Shades Mix
LightCoral #F08080 Shades Mix
LightCyan #E0FFFF Shades Mix
LightGoldenRodYellow #FAFAD2 Shades Mix
LightGray #D3D3D3 Shades Mix
LightGreen #90EE90 Shades Mix
LightPink #FFB6C1 Shades Mix
LightSalmon #FFA07A Shades Mix
LightSeaGreen #20B2AA Shades Mix
LightSkyBlue #87CEFA Shades Mix
LightSlateGray #778899 Shades Mix
LightSteelBlue #B0C4DE Shades Mix
LightYellow #FFFFE0 Shades Mix
Lime #00FF00 Shades Mix
LimeGreen #32CD32 Shades Mix
Linen #FAF0E6 Shades Mix
Magenta #FF00FF Shades Mix
Maroon #800000 Shades Mix
MediumAquaMarine #66CDAA Shades Mix
MediumBlue #0000CD Shades Mix
MediumOrchid #BA55D3 Shades Mix
MediumPurple #9370DB Shades Mix
MediumSeaGreen #3CB371 Shades Mix
MediumSlateBlue #7B68EE Shades Mix
MediumSpringGreen #00FA9A Shades Mix
MediumTurquoise #48D1CC Shades Mix
MediumVioletRed #C71585 Shades Mix
MidnightBlue #191970 Shades Mix
MintCream #F5FFFA Shades Mix
MistyRose #FFE4E1 Shades Mix
Moccasin #FFE4B5 Shades Mix
NavajoWhite #FFDEAD Shades Mix
Navy #000080 Shades Mix
OldLace #FDF5E6 Shades Mix
Olive #808000 Shades Mix
OliveDrab #6B8E23 Shades Mix
Orange #FFA500 Shades Mix
OrangeRed #FF4500 Shades Mix
Orchid #DA70D6 Shades Mix
PaleGoldenRod #EEE8AA Shades Mix
PaleGreen #98FB98 Shades Mix
PaleTurquoise #AFEEEE Shades Mix
PaleVioletRed #DB7093 Shades Mix
PapayaWhip #FFEFD5 Shades Mix
PeachPuff #FFDAB9 Shades Mix
Peru #CD853F Shades Mix
Pink #FFC0CB Shades Mix
Plum #DDA0DD Shades Mix
PowderBlue #B0E0E6 Shades Mix
Purple #800080 Shades Mix
RebeccaPurple #663399 Shades Mix
Red #FF0000 Shades Mix
RosyBrown #BC8F8F Shades Mix
RoyalBlue #4169E1 Shades Mix
SaddleBrown #8B4513 Shades Mix
Salmon #FA8072 Shades Mix
SandyBrown #F4A460 Shades Mix
SeaGreen #2E8B57 Shades Mix
SeaShell #FFF5EE Shades Mix
Sienna #A0522D Shades Mix
Silver #C0C0C0 Shades Mix
SkyBlue #87CEEB Shades Mix
SlateBlue #6A5ACD Shades Mix
SlateGray #708090 Shades Mix
Snow #FFFAFA Shades Mix
SpringGreen #00FF7F Shades Mix
SteelBlue #4682B4 Shades Mix
Tan #D2B48C Shades Mix
Teal #008080 Shades Mix
Thistle #D8BFD8 Shades Mix
Tomato #FF6347 Shades Mix
Turquoise #40E0D0 Shades Mix
Violet #EE82EE Shades Mix
Wheat #F5DEB3 Shades Mix
White #FFFFFF Shades Mix
WhiteSmoke #F5F5F5 Shades Mix
Yellow #FFFF00 Shades Mix
YellowGreen #9ACD32 Shades Mix

How to Process Data with Apache Hive

How to Process Data with Apache Hive

সি – পয়েন্টার . C Pointers

সি – পয়েন্টার
নয়ন চন্দ্র দত্ত

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

নিম্নলিখিত উদাহরণ বিবেচনা করুন যা সংজ্ঞায়িত ভেরিয়েবল ঠিকানা মুদ্রণ করবেঃ

#include <stdio.h>

int main ()
{
int var1;
char var2[10];

printf(“Address of var1 variable: %x\n”, &var1 );
printf(“Address of var2 variable: %x\n”, &var2 );

return 0;
}

যখন উপরের কোড কম্পাইল এবং নির্বাহ করে তখন এর রিজাল্ট কিছুটা নিচের মত হয়ঃ

Address of var1 variable: bff5a400
Address of var2 variable: bff5a3f6

আশা করছি উপরের ধারণার উপর ভিত্তি করে আপনারা মেমরি ঠিকানা এবং কিভাবে এটি অ্যাক্সেস করে এটা বুঝতে পেরেছেন। চলুন এখন আমরা দেখব পয়েন্টার কি?

পয়েন্টার কি
একটি পয়েন্টার ভেরিয়েবল যার মান হল অন্য ভেরিয়েবল এর ঠিকানা, যেমন- মেমরি অবস্থানের সরাসরি ঠিকানা। কোনো ভেরিয়েবল বা ধ্রুবক মত, কোন ভেরিয়েবল ঠিকানা সংরক্ষণ এ এটি ব্যবহার করার পূর্বে
একটি পয়েন্টার ডিক্লেয়ার করতে হবে।
একটি পয়েন্টার ভেরিয়েবল এর সাধারণ ফর্ম নিম্নরূপঃ

type *var-name;

এখানে type হচ্ছে পয়েন্টার এর বেস টাইপ। এটি একটি বৈধ সি ডাটা টাইপ হতে হবে এবং পয়েন্টার ভেরিয়েবল এর নাম হবে var-name। তারকা চিহ্ন * একটি পয়েন্টার ডিকলার করতে হয় যে একই তারকা আপনি গুণ জন্য ব্যবহার করেন।
যাইহোক, এই বিবৃতিতে তারকা চিহ্ন একটি পয়েন্টার হিসাবে একটি ভেরিয়েবল নামকরণ করার জন্য ব্যবহার করা হচ্ছে।

কিছু বৈধ পয়েন্টার নিম্নরূপঃ

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 var = 20; /* actual variable declaration */
int *ip; /* pointer variable declaration */

ip = &var; /* store address of var in pointer variable*/

printf(“Address of var variable: %x\n”, &var );

/* address stored in pointer variable */
printf(“Address stored in ip variable: %x\n”, ip );

/* access the value using the pointer */
printf(“Value of *ip variable: %d\n”, *ip );

return 0;
}

যখন উপরের কোড কম্পাইল এবং নির্বাহ করে তখন এর রিজাল্ট কিছুটা নিচের মত হয়ঃ

Address of var variable: bffd8b3c
Address stored in ip variable: bffd8b3c
Value of *ip variable: 20

সি নাল পয়েন্টার
নিয়োগ করার মত সঠিক ঠিকানা যদি না থাকে সেক্ষেত্রে একটি পয়েন্টার ভেরিয়েবল এর একটি শূন্য মান নির্ধারণ সবসময় একটি ভাল অভ্যাস। এটি ভেরিয়েবল ঘোষণা সময় সম্পন্ন করা হয়। একটি পয়েন্টার যা শূন্য
নির্ধারিত তাকে নাল পয়েন্টার বলা হয়।
বিভিন্ন স্ট্যান্ডার্ড লাইব্রেরিতে সংজ্ঞায়িত শূন্য পয়েন্টার হচ্ছে একটি শূন্য মানের সঙ্গে একটি ধ্রুবক। নিচের উদাহরণটি দেখুনঃ

#include <stdio.h>

int main ()
{
int *ptr = NULL;

printf(“The value of ptr is : %x\n”, ptr );

return 0;
}

যখন উপরের কোড কম্পাইল এবং নির্বাহ করে তখন এর রিজাল্ট কিছুটা নিচের মত হয়ঃ

The value of ptr is 0

অধিকাংশ অপারেটিং সিস্টেমে প্রোগ্রাম ঠিকানা 0 এ মেমরি অ্যাক্সেস করার অনুমতি নেই, কারণ সেই মেমরি অপারেটিং সিস্টেম দ্বারা সংরক্ষিত। তবে, মেমরি ঠিকানা 0 এর বিশেষ তাৎপর্য রয়েছে।
এটা ইঙ্গিত দেয় যে, পয়েন্টার অ্যাক্সেসযোগ্য মেমরির অবস্থান নির্দেশ করার উদ্দেশ্যে নয়। কিন্তু কনভেনশন দ্বারা, একটি নাল পয়েন্টারের উপস্থিত (শূন্য) মান থাকে, তাহলে এটা কিছুই নির্দেশ যোগ্য হয়না।
নাল পয়েন্টার পরীক্ষা করার জন্য আপনি নিচের বিবৃতি অনুসরণ করতে পারেনঃ

if(ptr) /* succeeds if p is not null */
if(!ptr) /* succeeds if p is null */

বিস্তারিত সি পয়েন্টার
পয়েন্টার অনেক কিন্তু সহজ ধারণা এবং তারা C প্রোগ্রামিং এর জন্য খুবই গুরুত্বপূর্ণ। নিম্নলিখিত কয়েকটি গুরুত্বপূর্ণ পয়েন্টার ধারণা আছে যা একজন সি প্রোগ্রামারকে স্পষ্ট হতে হবেঃ

ধারণাঃ C – Pointer arithmetic
ব্যাখ্যাঃ চারটি গাণিতিক অপারেটর আছে যা পয়েন্টারে ব্যবহার করা যেতে পারেঃ ++, –, +, – ।

ধারণাঃ C – Array of pointers
ব্যাখ্যাঃ পয়েন্টারের একটি সংখ্যা ধরে রাখতে আপনি অ্যারে নির্ধারণ করতে পারবেন।

ধারণাঃ C – Pointer to pointer
ব্যাখ্যাঃ সি আপনাকে একটি পয়েন্টার এ পয়েন্টার করতে সক্ষম করবে।

ধারণাঃ Passing pointers to functions in C
ব্যাখ্যাঃ রেফারেন্স দ্বারা বা ঠিকানা দ্বারা একটি যুক্তি পাসিং উভয় পাশ যুক্তি নামক ফাংশন দ্বারা কলিং ফাংশন পরিবর্তন করা সম্ভব।

ধারণাঃ Return pointer from functions in C
ব্যাখ্যাঃ সি তে একটি ফাংশন হিসাবে ভাল স্থানীয় পরিবর্তনশীল, স্ট্যাটিক পরিবর্তনশীল এবং পরিবর্তনশীল বরাদ্দ মেমরির একটি পয়েন্টার প্রত্যাবর্তন করতে পারবেন।