ফাংশন হচ্ছে পুনরায় ব্যবহার যোগ্য কোড ব্লক। যা একটি নির্দিষ্ট কাজ করতে পারে। সি প্রোগ্রামিং এর সাথে এমন অনেক গুলো ফাংশন দেওয়া আছে। যে গুলোকে বলা হয় লাইব্রেরী ফাংশন। যেমন printf একটি ফাংশন, যার কাজ কোন কিছুর আউটপুট দেখা। আমাদের প্রতিটা প্রোগ্রামের শুরুতেই #include<stdio.h> লেখাটি যুক্ত করি। যার মানে আমরা এর আগেই জেনে এসেছি। মানে হচ্ছে Standard Library Functions টি যুক্ত করা। যেমন আমরা printf ব্যবহার করি, এটি হচ্ছে Standard I/O Functions এর একটা ফাংশন। Standard I/O এ আরো কিছু ফাংশন রয়েছে, যেমনঃ scanf(), getchar(), putchar() ইত্যাদি। এ গুলো সম্পর্কে পরবর্তী চ্যাপ্টার গুলো থেকে জানা যাবে।
নিচে কিচু include file এবং তাদের ফাংশন গুলো দেওয়া হলো। প্রতিটি include file এর ব্যবহার সম্পর্কে বিস্তারিত লেখা লিঙ্কে যুক্ত করা হয়েছে। লিঙ্ক থেকে বিস্তারিত উদাহরণ সহ দেখে নেওয়া যাবে।
কোন ফাংশনে যে মান পাস করা হয়, সে গুলোকে বলা হয় আর্গুমেন্ট/Argument। কোন কোন লাইব্রেরী ফাংশন কোন Argument ছাড়াই কাজ করে। কোন কোন ফাংশন একটি Argument নেয়। আবার কোন কোন ফাংশন একের অধিক Argument নিয়ে কাজ করে।
stdio.h: I/O functions:
- getchar() returns the next character typed on the keyboard.
- putchar() outputs a single character to the screen.
- printf() as previously described
- scanf() as previously described
scanf & printf
আমরা এর আগে আমরা একটি মাত্র ক্যারেক্টার কম্পিউটারে কিভাবে getchar এর সাহায্যে ইনপুট নেওয়া যায় তা দেখছি। এবার আমরা সিঙ্গেল ক্যারেক্টারের পাশা পাশি অন্যান্য ডেটা, যেমন স্ট্রিং, সংখ্যা, দশমিক সংখ্যা সহ অন্যান্য ডেটা কিভাবে কম্পিউটারে ইনপুট নিব তা দেখবো। ক্যারেক্টার, নাম্বার, স্ট্রিং ইত্যাদি যেকোন মান কম্পিউটারে নেওয়ার জন্য “scanf” ফাংশন ব্যবহার করা হয়। আবার putchar এর মত কোন মান কনসোলে দেখানোর জন্য “printf” ফাংশন ব্যবহার করা যায়। putchar দিয়ে একটি মাত্র ক্যারেক্টার কম্পিউটারে Output দেখানো যেত, কিন্তু “printf” ফাংশন দিয়ে একাদিক ডেটা একসাথে কনসোলে আউটপুট দেখানো যায়।
“scanf” ফাংশন ব্যবহারের নিয়মঃ
1 | scanf (control string, argument1, argument2,……..argumentn); |
এখানে control string দ্বারা কোন ধরনের ডেটা ইনপুট নিব তার ফরমেট বুঝায়। যাকে প্লেসহোল্ডারও বলা হয়। আর argument দ্বারা ইনপুট নেওয়ার পর ডেটা গুলো কম্পিউটারে কোথায় ( মেমরি এড্রেস এর কোন জাগায়) সংরক্ষন হবে তা বুঝায়।
যেমন একটি প্রোগ্রামে নিচের মত করে Scanf ব্যবহার করা হয়ঃ
1 2 | char name; scanf (“%c”,&amp;amp;amp;name); |
name নামে একটি variable নিয়েছি আমরা। ইনপুট ডিভাইস থেকে এ ভ্যারিয়েবলের মান কম্পিউটারে নিব। আর তার জন্য ব্যবহার করেছি scanf ফাংশন।
এখানে control string হচ্ছে c। প্রতিটি control string একটি % চিহ্ন দিয়ে শুরু করতে হয়। তাই এখানে control string টি %c দ্বারা লিখা হয়েছে। এখানে c দ্বারা বুঝানো হয় যে Data item একটি single character। এরকম আরো অনেক গুলো control string রয়েছে। একটু পরই আমরা সেগুলো সম্পর্কে জানব।
scanf নিয়ে সম্পুর্ণ একটা প্রোগ্রামঃ
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> int main( void ) { float gpa; printf ( "Enter your SSC GPA:" ); scanf ( "%f" ,&gpa); printf ( "You SSC GPA: %f \n" ,gpa); return 0; } |
“printf” ফাংশন ব্যবহারের নিয়মঃ
1 | printf (control string, argument1, argument2,……..argumentn); |
এখানে control string দ্বারা কোন ধরনের Data Output দিবে তার ফরমেট বুঝায়। আর argument দ্বারা প্রতিটি আউটপুট ডেটা প্রকাশ করে।
যেমন একটি প্রোগ্রামে নিচের মত করে “printf” ব্যবহার করা হয়ঃ
1 2 | char name; printf (“%c”, name); |
এখানে name নামে একটি Character variable নেওয়া হয়েছে। এখন মনে করি name এর মান কম্পিউটারে আছে আমরা তার Output বের করবো। তাই printf(“%c”, name); দ্বারা তা Output ডিভাইসে প্রকাশ করে। এখানে ও control string হচ্ছে c। scanf এর মর printf এ ও প্রতিটি control string একটি % চিহ্ন দিয়ে শুরু করতে হয়। তাই এখানে control string টি %c দ্বারা লিখা হয়েছে। এখানে c দ্বারা বুঝানো হয় যে ডেটা আইটেমটি একটি সিঙ্গেল কারেক্টার । scanf ও printf এর control string একই। scanf এর কন্ট্রোল স্ট্রিং বা প্লেসহোল্ডার দ্বারা কি ধরনের মান ইনপুট নিবে তা বুঝায়, আর printf এর কন্ট্রোল স্ট্রিং দ্বারা কি ধরনের মান আউটপুট দিবে তা বুঝায়।
printf ব্যবহার করে আমরা অনেক প্রোগ্রাম লিখেছি। আরেকটা লিখিঃ
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> int main( void ) { int roll; printf ( "Can you remember your roll no in class one?\nIf yes, please enter: " ); scanf ( "%d" ,&roll); printf ( "Your roll was: %d \n" ,roll); return 0; } |
ডেটা ইনপুট আউটপুটের সময় আমরা পারসেন্ট সাইন এর পর একটা ক্যারেক্টার লিখি একটি ভ্যারিয়েবলের প্লেস হোল্ডার হিসেবে। এগুলোকে Conversion Characters ও বলা হয়। নিচে সি প্রোগ্রামিং এ ব্যবহৃত কনভার্শন ক্যারেক্টার গুলোর একটা লিস্ট দেওয়া হলোঃ
কন্ট্রোল স্ট্রিং | Meaning |
%c | সিঙ্গেল ক্যারেক্টার ইনপুট বা আউটপুটের জন্য এটি ব্যবহার করা হয়। |
%d | Signed ডেসিম্যাল ইন্টিজার এর জন্য ব্যবহৃত হয়। |
%e | e নোটেশনে Signed ফ্লোটিং পয়েন্ট জন্য ব্যবহৃত হয়। |
%f | Signed ফ্লোটিং পয়েন্ট জন্য ব্যবহৃত হয়। |
%g | সাইন্টিফিক নোটেশনে Signed ফ্লোটিং পয়েন্ট জন্য ব্যবহৃত হয়। |
%i | Signed ডেসিম্যাল ইন্টিজার এর জন্য ব্যবহৃত হয়। |
%o | Unsigned অক্টাল ইন্টিজার ডেটার জন্য ব্যহৃত হয় |
%s | এটি ব্যবহার করলে String Data item আউটপুট দিবে। |
%u | Unsigned ডেসিম্যাল ইন্টিজার এর জন্য ব্যবহৃত হয়। |
%x | Unsigned Hexadecimal Data এর জন্য ব্যবহৃত হয়। |
একটি মান পজেটিভ হতে পারে, নেগেটিভ হতে পারে। নেগেটিভ হলে আমরা সধারনত মাইনাস সাইন আগে বসাই। একটা নাম্বার পজেটিভ নাকি নেগেটিভ, এটি উল্ল্যেখ করাকে বলে Signed ভ্যালু। আর উল্লেখ না করলে বলা হয় Unsigned ভ্যালু। সংখ্যার আগে কোন সাইন না থাকলে আমরা ধরে নেই ঐটা পজেটিভ সংখ্যা। উপরের কনভার্সেশন ক্যারেক্টার গুলো ছাড়াও আরো অনেক গুলো কনভার্সেশন ক্যারেক্টার রয়েছে। এগুলো এক এক একটা আবার অনেক ভাবে ব্যবহার করা যায়। যেমন e ছোট হাতে, বড় হাতে দুইভাবেই লেখা যায়। ছোট হাতে লিখলে প্রিন্ট করবে ছোট হাতের e, বড় হাতের E লিখলে প্রিন্ট করবে বড় হাতের ই। আবার রয়েছে lf, .5f, বা এমন। .5f এর মানে হচ্ছে দশমিকের পর ৫ ঘর পর্যন্ত প্রিন্ট করা। এগুলো আমরা আস্তে আস্তে শিখব।
এবার আমরা scanf ও printf এর ব্যবহারের উপর একটি ছোট্ট প্রোগ্রাম দেখিঃ
1 2 3 4 5 6 7 8 9 | #include <stdio.h> int main( void ) { char name[80]; scanf ( "%s" ,&name); printf ( "You enter: %s" ,name); return 0; } |
এখানে একটি name নামে একটি character array (array সম্পর্কে পরে আলোচনা করা হবে) নেওয়া হয়েছে, যা মোট ৮০ টি character ধারন করতে পারবে(আসলে ৭৯ টি আরেকটি Null Character, যা সম্পর্কে পরে আলোচনা করা হবে) । তার পর এর মান ইনপুট ডিভাইস হতে নেওয়া হবে scanf function দ্বারা। scanf এর ভিতর %s দ্বারা বুঝানো হয়েছে যে এটি একটি String Input নিবে। তার পর এ মান printf(“%s”,name); দ্বারা পর্দায় আউটপুট দেখানো হয়েছে।
এখন আমরা scanf এবং printf এর ব্যবহার বিস্তারিত জানব। চেষ্টা করব দুইটাই এক সাথে শিখে নিতে। কারণ দুইটার ব্যবহার প্রায় একই রকম। একটা দিয়ে ডেটা ইনপুট নেওয়া হয়, আরেকটা দিয়ে ডেটা আউটপুট দেওয়া হয়।
এর আগে আমরা একটি মাত্র ভ্যালু ইনপুট এবং আউটপুট দিয়েছি। আমরা চাইলে দুইটা মান একই সাথে ইনপুট বা আউটপুট দিয়ে পারি। ইনপুটের জন্য লিখব এভাবেঃ
1 | scanf ( "%d %d" , &amp;amp;amp;num1, &amp;amp;amp;num2); |
যেখানে দুইটা ইন্টিজার মান আমরা ইনপুট দিতে পারব। আউটপুটের জন্য লিখব এভাবেঃ
1 | printf ( "%d %d" , num1, num2); |
এখানে num1 এবং num2 নামক ভ্যারিয়েবল গুলোর মান প্রিন্ট করবে। মান গুলো যখন আউটপুট পাবো, তখন আমরা পাবো ইন্টিজার হিসেবে। সম্পুর্ণ একটি প্রোগ্রামঃ
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h> int main( void ) { int num1, num2; scanf ( "%d %d" , &num1, &num2); printf ( "%d %d/n" , num1, num2); return 0; } |
আমরা চাইলে এক সাথে ইন্টিজার, ক্যারেক্টার, ফ্লোট ভ্যালু ইনপুট নিতে পারি এবং আউটপুট হিসেবে প্রিন্ট করতে পারি। নিচের প্রোগ্রামটি দেখিঃ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h> int main( void ) { char name[50]; int id; float gpa; printf ( "Enter your name, id and gpa: \n" ); scanf ( "%s %d %f" , &name, &id, &gpa); printf ( "Name: %s ID: %d GPA: %f \n" , name, id, gpa); return 0; } |
getchar & putchar
এর আগ পর্যন্ত আমরা কিছু ডেটা কনসোলে দেখিয়েছি। যার জন্য ব্যবহার করেছি printf। printf ছাড়াও আরো কয়েকটা লাইব্রেরী ফাংশন রয়েছে যেগুলো দিয়ে আউটপুট দেখানো যায়। যেমন putchar, puts। এছাড়া আমাদের প্রোগ্রামে ইউজার থেকে কোন ডেটা ইনপুট নিতে হতে পারে। ইউজার থেকে প্রোগ্রামে কোন ডেটা ইনপুট নেওয়ার জন্য রয়েছে getchar, scanf, gets। এই অধ্যায় আমরা এগুলো কিভাবে ব্যবহার করা যায়, তা জানব।
getchar:
getchar Function দ্বারা single character কম্পিউটারে input নেওয়া হয়। এটি একটি লাইব্রেরী ফাংশন। এটি সাধারণত নিছের মত করে লিখা হয়।
1 | character variable = getchar ( ); |
প্রোগ্রামের মঝে এটি নিচের মত করে লিখা হয়ঃ
1 2 | char x; x = getchar (); |
এখানে char x; দ্বারা বুঝানো হয়েছে যে এটি একটি character type Variable. পরবর্তিতে x= getchar(); দ্বারা x এর মান ইনপুট ডিভাইস [ কীবোর্ড ] হতে নিবে। নিচের প্রোগ্রামটি দেখিঃ
1 2 3 4 5 6 7 8 9 | #include <stdio.h> int main() { char x; printf ( "Enter a character: " ); x = getchar (); return 0; } |
উপরের প্রোগ্রামটা রান করুন এবং কীবোর্ড হতে একটি বর্ণ টাইপ করে এন্টার কী প্রেস করুন। কোন আউটপুট পাচ্ছি না। কারণ আমরা ইনপুট নিয়েছি। আউটপুট দেই নি। আউটপুটের জন্য আরেকটা ফাংশন putchar ব্যবহার করব।
putchar Function:
putchar ফাংশন দ্বারা সিঙ্গেল কারেক্টার কনসোলে দেখানোর জন্য ব্যবহার করা হয়। এটি অনেকটা getchar ফাংশনের মত। এটি সাধারনত নিছের মত করে লিখা হয়।
1 | putchar (character variable ); |
প্রোগ্রামের মাঝে এটি নিচের মত করে লিখা হয়ঃ
1 2 | char x = 'x' ; putchar (x); |
getchar Function এর মত এখানে char x দ্বারা বুঝানো হয়েছে যে এটি একটি কারেক্টার ডেটা টাইপ ভ্যারিয়েবল। পরবর্তিতে putchar(x); দ্বারা x এর মান আউটপুট ডিভাইসে দেখাবে।
1 2 3 4 5 6 7 8 | #include <stdio.h> int main() { char x; x= getchar (); putchar (x); return 0; } |
উপরের প্রোগ্রামে একটি character variable x নিয়েছি। এখন প্রোগ্রামটি রান করার পর আপনি যাই ইনপুট দিবেন, putchar ফাংশন দ্বারা তা কনসোলে দেখাবে ।
ছোট অক্ষরকে বড় অক্ষরে পরিনত করাঃ
1 2 3 4 5 6 7 8 9 | #include <stdio.h> int main() { char x; x= getchar (); putchar ( toupper (x)); return 0; } |
এ প্রোগ্রাম এ যে Character ই input হিসেবে নিবে তার Uppercase মানে বড় হাতের অক্ষর আউটপুট দিবে। আর বড় হতের দিলে ও বড় হাতের অক্ষর আউটপুট দিবে। তবে কোন সংখা দিলে তাই আউটপুট দিবে।
এখানে আমরা toupper() নামক লাইব্রেরী ফাংশন ব্যবহার করেছি। নাম থেকেই তো এর কাজ বুঝা যায় তাই না?
বড় অক্ষরকে ছোট অক্ষরে পরিনত করাঃ
1 2 3 4 5 6 7 8 9 | #include <stdio.h> int main() { char x; x= getchar (); putchar ( tolower (x)); return 0; } |
এ প্রোগ্রাম এ যে Character ই input হিসেবে নিবে তার Lowercase মানে ছোট হাতের অক্ষর আউটপুট দিবে। আর ছোট হতের দিলে তাই আউটপুট দিবে। আর ব্যবহার করেছি tolower ফাংশন।
string.h: String functions
- strcat() concatenates a copy of str2 to str1
- strcmp() compares two strings
- strcpy() copys contents of str2 to str1
String কি, এর লাইব্রেরী ফাংশন গুলো নিয়ে বিস্তারিত-
স্ট্রিং হচ্ছে কারেকটার সেট। একটা ওয়ার্ড, একটা বাক্য, একটা প্র্যারাগ্রাফ, সব গুলোই স্ট্রিং। যেমন Hello World একটা স্ট্রিং। আবার hello ও একটা স্ট্রিং। world ও একটা স্ট্রিং। যখন শুধু একটা বর্ণ, তখন তা কারেকটার।
আগে বলেছি স্ট্রিং হচ্ছে কারেকটার সেট। হ্যা, একটা one-dimensional কারেকটার অ্যারে হচ্ছে স্ট্রিং। লেখাটি পড়ার আগে অ্যারে/Array সম্পর্কে ধারণা থাকা লাগবে। অ্যারে সম্পর্কে এ লেখা থেকে জানা যাবে। একটা স্ট্রিং নিচের মত করে ডিক্লেয়ার করা হয়ঃ
char string[50] = “This is a static string”;
আর প্রিন্ট করার জন্য লিখতে হয়ঃ
printf(“%sn”, string);
আমরা একটা স্ট্রিং ডিক্লেয়ার এবং তা প্রিন্ট করার জন্য একটা প্রোগ্রাম লিখে ফেলিঃ
1 2 3 4 5 6 7 8 9 | #include <stdio.h> #include <string.h> int main () { char string[50] = "Hello" ; printf ( "%s\n" , string); return 0; } |
Hello এ স্ট্রিংটা প্রিন্ট করার জন্য আমরা 50 সাইজের একটা কারেকটার অ্যারে ডিক্লেয়ার করেছি, কিন্তু আমাদের বর্ণ মাত্র ৫টা। তাই আমাদের এত বড় অ্যারে ডিক্লেয়ার করার দরকার নেই। তার জন্য আমরা 5 সাইজের একটা অ্যারে ডিক্লেয়ার করলেই হবে। এখানে বলে রাখা ভালো যে, আমরা যখন একটা স্ট্রিং ডিক্লেয়ার করব, তখন সব গুলো বর্ণের শেষে অটোমেটিক্যালি একটা null character ” যুক্ত হবে। নিচের ছবিটা দেখি।
Hello স্ট্রিং এর জন্য আমাদের টোটাল তাহলে ৬ সাইজের একটা অ্যারে দরকার। Hello এর পাঁচটা বর্ণ এবং একটা নাল কারেকটার। আবার আমরা জানি অ্যারে এর indexing শুরু হয় ০ থেকে। তাহলে আমাদের Hello স্ট্রিং নিচের মত করেও ডিক্লেয়ার করতে পারিঃ
char string[5] = “Hello”;
আবার আমরা চাইলে কত সাইজের অ্যারে ব্যবহার করব তা রান টাইমের উপর ছেড়ে দিতে পারি। প্রোগ্রাম অটোম্যাটিক্যালি একটা সাইজ এসাইন করে দিবে। তার জন্য লিখবঃ
char string[] = “Hello”;
এবার একটা প্রোগ্রাম লিখি, যেখানে ইউজার থেকে একটা ব্যাক্য ইনপুট নিবে, এবং পরে তা প্রিন্ট করবেঃ
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> #include <string.h> int main () { char string[100]; printf ( "Enter a sentance: " ); scanf ( " %[^\n]s" , &string); printf ( "%s\n" , string); return 0; } |
উপরের প্রোগ্রামে আমরা scanf এর ভেতর লিখছি %[^n]s। scanf দিয়ে স্পেস ইনপুট নেওয়া যায় না। তার জন্য স্পেশাল মডিফায়ার ব্যবহার করতে হয়। সে জন্য এভাবে লেখা। আর scanf ছাড়া আমরা gets দিয়ে স্ট্রিং ইনপুট নিতে পারি। gets দিয়ে উপরের প্রোগ্রাম লিখলে হবেঃ
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> #include <string.h> int main () { char string[100]; printf ( "Enter a sentance: " ); gets (string); printf ( "%s\n" , string); return 0; } |
সিম্পল, তাই না?
Strings Concatenation
Concatenation মানে হচ্ছে জোড়া দেওয়া। দুইটা আলাদা আলাদা স্ট্রিং এক সাথ করার জন্য Strings Concatenation ব্যবহার করা হয়। এর জন্য একটা লাইব্রেরী ফাংশন রয়েছে। strcat(), যা ব্যবহার করে দুইটা স্ট্রিং এক সাথ করা যায়। strcat() ইনপুট হিসেবে দুইটা স্ট্রিং নেয়। এভাবেঃ strcat(string1, string2) এরপর string2 এর ভেতরে থাকা স্ট্রিং string1 এর সাথে যুক্ত করে দেয়, নিচের প্রোগ্রামটি দেখিঃ
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> #include <string.h> int main () { char string1[] = "Hello " ; char string2[] = "World" ; strcat (string1, string2); printf ( "%s\n" , string1); return 0; } |
strcmp()
দুইটা স্ট্রিং কম্পেয়ার করার জন্য ব্যবহার করা হয় strcmp(string1, string2)। দুইটা স্ট্রিং এ ফাংশনে পাস করলে তিনটা মান রিটার্ন করেঃ
- রিটার্ন ভ্যালু ০ থেকে ছোট হবে যদি string1 থেকে string2 বড় হয়।
- রিটার্ন ভ্যালু ০ থেকে বড় হবে যদি string1 থেকে string2 ছোট হয়।
- রিটার্ন ভ্যালু ০ হবে, যদি দুইটা স্ট্রিং একই হয়।
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <stdio.h> #include <string.h> int main(){ int ret; char string1[50], string2[50]; printf ( "Enter string 1:" ); gets (string1); printf ( "Enter string 2:" ); gets (string2); ret = strcmp (string1, string2); if (ret < 0){ printf ( "string1 is less than string2" ); } else if (ret > 0){ printf ( "string2 is less than string1" ); } else { printf ( "string1 is equal to string2" ); } return 0; } |
strcpy()
strcpy() তে দুইটা স্ট্রিং পাস করলে দ্বিতীয় স্ট্রিং এর ভ্যালু প্রথম স্ট্রিং এ কপি করবে। যেমন strcpy(string1, string2) পাস করলে string2 এর ভেতরের স্ট্রিংটা string1 এ এসাইন হয়ে যাবে। নিচের প্রোগ্রামটি দেখিঃ
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> #include <string.h> int main () { char string1[] = "Hello " ; char string2[] = "World" ; strcpy (string1, string2); printf ( "%s\n" , string1); printf ( "%s\n" , string2); return 0; } |
এবার আমরা একটা প্রোগ্রাম লিখব, যেখানে একটা বাক্য থেকে কোন একটা বর্ণ কতবার আছে, তা বের করতে পারব। ইনপুট হিসেবে একটা বাক্য নিবে। তারপর নিবে কোন বর্ণটার সংখ্যা বের করতে হবে, তা। এবং পরে ঐ বর্ণটা কতবার রয়েছে, তা প্রিন্ট করবেঃ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> #include <string.h> int main(){ char sentence[1000]; char character; int i,count=0; printf ( "Enter a sentence: " ); gets (sentence); printf ( "Enter a character to find frequency: " ); scanf ( "%c" ,&character); for (i=0; sentence[i]!= '\0' ;++i) { if (character==sentence[i]) ++count; } printf ( "Frequency of %c = %d" , character, count); return 0; } |
উপরের প্রোগ্রামটাতে প্রথমে ইজার থেকে একটা বাক্য ইনপুট নিচ্ছে gets দিয়ে। এরপর ইনপুট নিচ্ছে কোন কারেকটার / বর্ণটি কত বার রয়েছে, তা। এরপর for লুপ চালিয়ে আমরা বর্ণটি কাউন্ট করেছি। এরপর শেষে বর্ণটি কতবার রয়েছে, তা প্রিন্ট করেছি। for লুপে আমরা sentence[i]!=’\0′ ব্যবহার করেছি। এর মানে হচ্ছে for লুপটি ততক্ষণ পর্যন্ত চলবে, যতক্ষণ না নাল কারেকটারটি পায়। আর আমরা জানি প্রত্যেকটা স্ট্রিং অ্যারের শেষে একটা নাল কারেকটার থেকে।
ctype.h: Character functions
- isdigit() returns non-0 if arg is digit 0 to 9
- isalpha() returns non-0 if arg is a letter of the alphabet
- isalnum() returns non-0 if arg is a letter or digit
- islower() returns non-0 if arg is lowercase letter
- isupper() returns non-0 if arg is uppercase letter
ASCII মানে American Standard Code for Information Interchange। এটি একটি character-encoding scheme। প্রত্যেকটা কারেকটারের জন্য একটা মান রয়েছে। যেখানে A এর মান হচ্ছে ৬৫। আবার ছোট হাতের a এর মান হচ্ছে ৯৭।শূন্য মানে 0 এর মান হচ্ছে 48. নিচের টেবিলটি দেখিঃ
প্রতেকটা কারেকটারের Decimal এবং Hexadecimal মান। বলা যায় প্রত্যেকটা কারেকটারের জন্য একটা ম্যাপ।
1 2 3 4 5 6 7 8 | #include <stdio.h> int main() { char ch = 'A' ; printf ( "%c" , ch); return 0; } |
উপরের প্রোগ্রামে কারেকটা A একটা ভ্যারিয়েবলের রেখেছি। এরপর তা প্রিন্ট করেছি।
এখন যদি A এর ASCII মান বের করতে চাই, তাহলে শুধু প্লেসহোল্ডারটা পরিবর্তন করে %d দিলেই A এর ASCII মান পেয়ে যাবোঃ
1 2 3 4 5 6 7 8 | #include <stdio.h> int main() { char ch = 'A' ; printf ( "%d" , ch); return 0; } |
আমরা আবার ৬৫ কে কারেকটারে কনভার্ট করলে পাবো A. নিচের প্রোগ্রামটি দেখিঃ
1 2 3 4 5 6 7 8 | #include <stdio.h> int main() { char ch = 65; printf ( "%c" , ch); return 0; } |
উপরের প্রোগ্রামে একটি কারেকটার ভ্যারিয়েবলের ৬৫ রেখেছি। পরে যখন তা প্রিন্ট করেছি, তা প্রিন্ট করেছি কারেকটার হিসেবে। এবং আমরা আউটপুট পেয়েছি A.
এভাবে অন্য কোন মান নিয়ে দেখতে পারি।
প্রশ্নঃ char ch = 116 দিয়ে প্রিন্ট করলে কি আউটপুট পাবো?
ctype.h: Character functions
আমরা এখন ctype.h এর মধ্যে যে ফাংশন গুলো রয়েছে, সে গুলো সম্পর্কে জানবো।
isdigit() ফাংশনটি দিয়ে একটা ইনপুট ০-৯ পর্যন্ত [0 1 2 3 4 5 6 7 8 9] সংখ্যা গুলো কিনা, তা পরীক্ষা করা হয়। নিচের প্রোগ্রামটি দেখি। নিচের প্রোগ্রামটি জানার আগে আমাদের if-else সম্পর্কে ধারণা থাকতে হবে।
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> int main() { int digit; printf ( "Enter a digit: " ); scanf ( "%c" ,&digit); if ( isdigit (digit)){ printf ( "You enter a digit and it is: %c" , digit); } else { printf ( "It was not a digit, digits are: 0 1 2 3 4 5 6 7 8 9" ); } return (0); } |
আমরা isdigit() এর ভেতরে আমাদের ইনপুট নেওয়া মানটি দিয়েছি। যদি আমরা একটা ডিজিট ইনপুট দি, তাহলে isdigit() সত্য রিটার্ন করে। এবং if কন্ডিশনের ভেতর ঢুকে। যদি ডিজিট ছাড়া অন্য কিছু ইনপুট দি, তাহলে isdigit() মিথ্যে রিটার্ন করে। এবং else এর ভেতর ঢুকে।
isalpha()
isalpha() দিয়ে একটা ভ্যালু পাস করি, তাহলে তা Alphabet কিনা তা চেক করে। Alphabet গুলো হচ্ছে A-Z এবং a-z. আমরা যদি এ গুলো যে কোন একটা পাস করি, তাহলে ফাংশনটি ০ ছাড়া অন্য যে কোন একটা মান রিটার্ণ করবে। মানে সত্য। যদি Alphabet না হয়, আহলে রিটার্ণ করবে ০। মানে মিথ্যে। নিচের কোড গুলো রান করে দেখিঃ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> int main() { char alph; printf ( "Enter a alphabet: " ); scanf ( "%c" ,&alph); if ( isalpha (alph)){ printf ( "You entered a alphabet and it is: %c" , alph); } else { printf ( "It was not a alphabet" ); } return (0); } |
isalnum()
isalnum() দিয়ে চেক করা হয়ে Alphabet অথবা Numeric কারেকটার কিনা। Alphabet অথবা Numeric কারেকটার গুলোকে বলা হয় Alphanumeric।
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> int main() { char alphanumeric; printf ( "Enter a Alphanumeric characters: " ); scanf ( "%c" ,&alphanumeric); if ( isalnum (alphanumeric)){ printf ( "You entered a Alphanumeric and it is: %c" , alphanumeric); } else { printf ( "It was not a Alphanumeric character" ); } return (0); } |
islower()
islower() দিয়ে কোন লেটার ছোট হাতের কিনা, তা টেস্ট করে। যদি ছোট হাতের হয়, তাহলে সত্য রিটার্ণ করে। না হয় মিথ্যে।
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> int main() { char ch; printf ( "Enter a character: " ); scanf ( "%c" ,&ch); if ( islower (ch)){ printf ( "You entered lower case character" , ch); } else { printf ( "It was not a lower case character" ); } return (0); } |
isupper()
isupper() দিয়ে কোন লেটার বড় হাতের কিনা, তা টেস্ট করে। যদি বড় হাতের হয়, তাহলে সত্য রিটার্ণ করে। না হয় মিথ্যে।
math.h: Mathematics functions
- acos() returns arc cosine of arg
- asin() returns arc sine of arg
- atan() returns arc tangent of arg
- cos() returns cosine of arg
- exp() returns natural logarithim e
- fabs() returns absolute value of num
- sqrt() returns square root of num
time.h: Time and Date functions
- time() returns current calender time of system
- difftime() returns difference in secs between two times
- clock() returns number of system clock cycles since program execution
stdlib.h:Miscellaneous functions
- malloc() provides dynamic memory allocation, covered in future sections
- rand() as already described previously
- srand() used to set the starting point for rand()