Showing posts with label c programming language. Show all posts
Showing posts with label c programming language. Show all posts

সি প্রোগ্রামিং – সি ল্যাংগুয়েজের জন্য টুরিং কমপ্লিট প্রশ্নমালা

সি প্রোগ্রামিং – সি ল্যাংগুয়েজের জন্য টুরিং কমপ্লিট প্রশ্নমালা 



আমরা সর্বমোট ৮০-১০০ সমস্যার ২-৩ টি প্রশ্নমালা তৈরি করব যেটা অনুশীলন করলে সি ল্যাংগুয়েজ মোটামুটি শেখা হয়ে যাবে। মোটামুটি ১০০ ঘন্টা এই সমস্যাগুলো অনুশীলন করতে হবে। এখানে একটা জিনিস মনে রাখতে হবে যে কিভাবে করতে হবে সেটা শুধু মনে মনে ভাবলে বা খাতায় লিখলে হবে না। কম্পিউটারে লিখে রান করে দেখতে হবে। সেইজন্য ১০০ ঘন্টা শুধু অনুশীলনের জন্য রাখতে হবে। এমনকি একাধিকবার আরও বেশি সময় নিয়ে করলে ভাল হবে। প্রাথমিকভাবে প্রোগ্রামিং সাঁতার বা গিটার শেখার মত ব্যাপার। থিউরি দিয়ে খুব বেশিদূর আগানো যাবে না। একটা লগবুক রাখতে পারেন যেটাতে আপনি কত ঘন্টা প্রোগ্রামিং করলেন সেটার হিসাব রাখবেন।
এখানে দেয়া সমস্যাগুলো করে তারপর নিজি নিজে বিভিন্ন সমস্যা চিন্তা করে সেগুলো সমাধান করুন। একটা ল্যাংগুয়েজ ঠিকভাবে শেখা হয়ে গেলে অন্য ল্যাংগুয়েজ শেখা অনেক সহজ হয়ে যাবে। আরেকবার বলি আপনি কত ভাল প্রোগ্রামার সেটা আপনার লগবুক দেখে অনেকখানি বলে দেয়া যাবে। সুতরাং অনেক অনেক অনুশীলন করুন।
এবার আমরা প্রশ্নমালা ১ এর প্রশ্নগুলো দেখি।

ভেরিয়েবল

১১. সি ল্যাংগুয়েজে কিভাবে ভেরিয়েবল ডিক্লেয়ার করতে হয়।
১২. পূর্ণ সংখ্যা এবং দশমিক সংখ্যা কিভাবে ভেরিয়েবল ডিক্লেয়ার করতে হয়।
১৩. একলাইনে একই টাইপের ৩টি ভেরিয়েবল কিভাবে ভেরিয়েবল ডিক্লেয়ার করতে হয় তার উদাহরণ দিন।
১৪. একটি char ভরিয়েবল কিভাবে ভেরিয়েবল ডিক্লেয়ার করতে হয়।
১৫. একটি পূর্ণসংখ্যার array ডিক্লেয়ার করুন যেটাতে ১০টি সংখ্যা রাখা যাবে।

ইনপুট-আইটপুট

নীচের প্রশ্নগুলোর জন্য printf / scanf ফাংশন ব্যবহার করতে হবে।
২১. দুইটি পূর্ণ সংখ্যা ইনপুট নিয়ে তাদের যোগফল আউটপুটে দেখান।
২২. দুইটি দশমিক সংখ্যা ইনপুট নিয়ে তাদের যোগফল আউটপুটে দেখান।
২৩. একটি পূর্ণ সংখ্যা ইনপুট নিয়ে সেটা আবার আউটপুটে দেখান।
২৪. একটি দশমিক সংখ্যা ইনপুট নিয়ে সেটা আবার আউটপুটে দেখান।
২৫. একটি দশমিক সংখ্যা ইনপুট নিয়ে সেটা দুই দশমিক ঘর পর্যন্ত আউটপুটে দেখান।
২৬. দুইটি পূর্ণ সংখ্যা ইনপুট নিয়ে সংখ্যা দুইটি এবং তাদের যোগফল আউটপুটে দেখান।
২৭. দুইটি দশমিক সংখ্যা ইনপুট নিয়ে সংখ্যা দুইটি দুই দশমিক ঘর পর্যন্ত এবং তাদের যোগফল তিন দশমিক ঘর পর্যন্ত আউটপুটে দেখান।
২৮. একটি অক্ষর (char) ইনপুট নিয়ে সেটা আউটপুটে দেখান।
২৯. তিনটি অক্ষর (char) ইনপুট নিয়ে সেগুলো আউটপুটে দেখান।
৩০. প্রথমে একটি প‌ূর্ণসংখ্যা, তারপর একটি অক্ষর এবং শেষে একটি দশমিক সংখ্যা ইনপুট নিয়ে প্রথমে অক্ষর, তারপর দশমিক সংখ্যা এবং শেষে পূর্ণসংখ্যা আউটপুটে দেখান। এখানে একবার printf এবং একবার scanf ফাংশন ব্যবহার করতে হবে।

কন্ডিশন

৫১. দুইটি পূর্ণ সংখ্যা ইনপুট নিয়ে তাদের মধ্যে বড় সংখ্যাটি আউটপুটে দেখান।
৫২. তিনটি পূর্ণ সংখ্যা ইনপুট নিয়ে তাদের ছোট থেকে বড় এভাবে সাজিয়ে আউটপুটে দেখান।
৫৩. তিনটি পূর্ণ সংখ্যা ইনপুট নিয়ে তাদের বড় থেকে ছোট এভাবে সাজিয়ে আউটপুটে দেখান।
৫৪. দুইটি পূর্ণ সংখ্যা ইনপুট নিয়ে তাদের মধ্যে বড় সংখ্যাটি থেকো ছোট সংখ্যাটি বিয়োগ করে বিয়োগফল আউটপুটে দেখান।
৫৫. একজন ছাত্রের গনিতে প্রাপ্তসংখ্যা ইনপুট নিন (একটি পূর্ণসংখ্যা)। এবার প্রাপ্ত নম্বর ৪০ এর কম হলে FAIL, ৪০-৪৯ হলে D, ৫০-৬৯ হলে C, ৬০-৬৯ হলে B, ৭০-৭৯ হলে A এবং ৮০ এর উপরে হলে A+ প্রিন্ট করুন।

লুপ

৮১. লুপ ব্যবহার করে ১ থেকে ১০০ পর্যন্ত আউটপুটে দেখান।
৮২. লুপ ব্যবহার করে ১০০ থেকে ১ পর্যন্ত আউটপুটে দেখান।
৮৩. লুপ ব্যবহার করে ১ থেকে ১০০ পর্যন্ত জোড় সংখ্যাগুলো (২,৪,৬…) আউটপুটে দেখান।
৮৪. লুপ ব্যবহার করে ১ থেকে ১০০ পর্যন্ত বিজোড় সংখ্যাগুলো (১,৩,৫…) আউটপুটে দেখান।
৮৫. একটি পূর্ণসংখ্যার array ডিক্লেয়ার করুন যেটাতে ১০টি সংখ্যার রাখা যাবে। এখন লুপ ব্যবহার করে দশটি পূর্ণসংখ্যা ইনপুট নিন।
৮৬. লুপ ব্যবহার করে একটি array তে দশটি পূর্ণসংখ্যা ইনপুট নিন। এবার লুপ ব্যবহার করে সবচেয়ে ছোট সংখ্যাটি খুজে বের করে আউটপুটে দেখান।
৮৭. লুপ ব্যবহার করে একটি array তে দশটি পূর্ণসংখ্যা ইনপুট নিন। এবার লুপ ব্যবহার করে সবচেয়ে বড় সংখ্যাটি খুজে বের করে আউটপুটে দেখান।
৮৮. লুপ ব্যবহার করে একটি array তে দশটি পূর্ণসংখ্যা ইনপুট নিন। এবার লুপ ব্যবহার করে সবচেয়ে ছোট এবং সবচেয়ে বড় সংখ্যাটি খুজে বের করে তাদের বিয়োগফল আউটপুটে দেখান।
৮৯. একটি অক্ষর (char) ইনপুট নিন। অক্ষরটা যতক্ষন ‘x’ বা ‘X’ না হবে ততক্ষন ইনপুট নিতে থাকুন। এটা while লুপ দিয়ে করতে হবে।
৯০. একটি অক্ষর (char) ইনপুট নিন। অক্ষরটা যতক্ষন ‘x’ বা ‘X’ না হবে ততক্ষন ইনপুট নিতে থাকুন। প্রতিবার ইনপুট নেয়ার পর অক্ষরটি যদি ‘a’ বা ‘A’ হয় তবে আউটপুটে “ADD” লিখুন। আর যদি ‘s’ বা ‘S’ হয় তবে আউটপুটে “SUB” লিখুন। এটা while লুপ দিয়ে করতে হবে।
৯১. একটি অক্ষর (char) ইনপুট নিন। অক্ষরটা যতক্ষন ‘x’ বা ‘X’ না হবে ততক্ষন ইনপুট নিতে থাকুন। প্রতিবার ইনপুট নেয়ার পর অক্ষরটি ‘X’ না হলে দুইটি পূর্ণ সংখ্যা আনপুট নিন। এখন যদি অক্ষরটি ‘a’ বা ‘A’ হয় তবে আউটপুটে ইনপুট নেয়া সংখ্যাটির যোগফল লিখুন। আর যদি ‘s’ বা ‘S’ হয় তবে আউটপুটে তবে আউটপুটে ইনপুট নেয়া সংখ্যাটির বিয়োগফল লিখুন। এটা while লুপ দিয়ে করতে হবে।

লেকচার ১২ – সি প্রোগ্রামিং – মেমোরি অপারেশন এবং পয়েন্টার

লেকচার ১২ – সি প্রোগ্রামিং – মেমোরি অপারেশন এবং পয়েন্টার


আমরা জানি ভেরিয়েবলের মধ্যে কোন একটা মান জমা রাখা যায়। যেমন কোন একটি ভেরিয়েবল x যেটার টাইপ int সেটা আমরা ডিক্লেয়ার করি এভাবে-
int x;
এখন এই ভেরিয়েবলের মধ্যে যে কোন ইন্টেজার মান রাখতে পারব এভাবে-
x=100;
যদিও আমরা 100 মানটি রাখার জন্য x নামের একটি ভেরিয়েবল ডিক্লেয়ার করেছি কম্পিউটার যখন আমাদের প্রোগ্রামটি রান করবে তখন আসলে এর জন্য একটা নির্দিষ্ট স্থান মেমোরিতে নির্ধারন করা হবে্। ধরা যাক এই মেমোরির লোকেশন হচ্ছে 40000। তাহলে মেমোরির 40000 লোকেশনে 4 বাইট জুড়ে 100 সখখ্যাটি রাখা হবে। আমরা এখানে ধরে নিচ্ছি আমরা যে কম্পিউটার ব্যবহার করছি সেটা ইন্টাজার রা্খার জন্য 4 বাইট মেমোরি ব্যবহার করে। এটা যদি ধরে না নিয়ে আমরা বের করতে চাই তাহলে এভাবে বের করা যায় sizeof ব্যবহার করে-
int int_size = sizeof(int);
এখন আমরা x ভেরিয়েবলের লোকেশন যেটা আমরা 40000 ধরে নিয়েছি সেটা বের করতে চাই তাহলে আমরা & ব্যবহার করে সেটা করতে পারি। ভেরিয়েবলের নামের পূর্বে & দিলেই সেটার অ্যাড্রেস্‌ পাব-
printf("%d", &x);
এক্ষেত্রে লোকেশন কনসোলে 40000 (আসলে সত্যিকারের লোকেশন যেটা সেটা- কিন্তু সুবিধার জন্য আমরা 40000 ধরে নিচ্ছি) প্রিন্ট হবে।
এভাবে প্রিন্ট না করে যদি 40000 মানটি আমরা একটা ভেরিয়েবলের মধ্যে জমা রাখতে চাই তাহলে আমরা পয়েন্টার টাইপের একটা ভেরিয়েবলের মধ্যে রাখতে পারি। যেহেতু x একটি int টাইপের ভেরিয়েবল এটার লোকেশন রাখার জন্য আমরা সাধারনত int টাইপের পয়েন্টার ব্যবহার করব। অন্য লেরিয়েবলের মতই এটার জন্য একটা নাম ঠিক করে হবে। আমরা যদি ঠিক px করি তাহলে আমরা এভাবে সেই ভেরিয়েবলটি ডিক্লেয়ার করতে পারি-
int *px;
ভেরিয়েবলের নামের পূর্বে * চিহ্ন দিয়ে‌ আমরা বুঝিয়েছি যে এটা একটা পয়েন্টার টাইপের ভেরিয়েবল। এবং int দিয়ে বুঝিয়েছি আমরা ইন্টেজার টাইপের ভেরিয়েবলের অ্যাড্রেস রাখতে পারব।
এখন আমরা px ভেরিয়েবলের মধ্যে যদি x ভেরিয়েবলের লোকেশন রাখতে চাই তাহলে এভাবে লিখতে পারি-
px = &x;
এখন px এর মান যদি আমরা প্রিন্ট করি তাহলে আমরা 40000 পাব।
এখন যদি px ব্যবহার করে x এর মান পেতে চাই তাহলে আমরা এভবে লিখতে পারি-
int v = *px;
তাহলে v এর মধ্যে 100 মানটি জমা হবে যেটা আমরা x এর মধ্যে পূর্বে জমা রেখেছি। পয়েন্টার ভেরিয়েবলের নামের পূর্বে * ব্যবহার করে পয়েনটার যে লোকেশন পয়েন্ট করছে সেই লোকেশনে যে মান আছে সেটা পাওয়া যায়।
এখন আমরা উপরে শেখা বিষয়গুলো একটা প্রোগ্রামে ব্যবহার করিঃ
#include "stdio.h"

int main()
{
    int x;
    x=100;

    printf("Address of x = %dn", &x);

    int *px;

    px = &x;

    printf("px = %dn", px);

    printf("Value of x = %dn", *px);

    return 0;
}
এখন আমি প্রগ্রামটা প্রথমবার রান করে নিচের মত আউটপুট পাই।
Address of x = 13434088
px = 13434088
Value of x = 100
দ্বিতীয়বার রান করে নিচের মত আউটপুট পাই।
Address of x = 9959872
px = 9959872
Value of x = 100
সুতরাং দেখা যাচ্ছে প্রতিবার রান করার জন্য আমরা x এর ভিন্ন ভিন্ন লোকেশন পাচ্ছি যেটা আমরা শুরুতে 40000 ধরে নিয়েছিলাম। বাস্তবে্‌ আমরা কখনই একটা ভেরিয়েবলের অ্যাড্রেস আগে থেকে ধরে নিতে পারব না (অবশ্য আমরা যদি অপারেটিং সিস্টেম প্রোগ্রাম না লিখি। অপারেটিং সিস্টেম লেখার জন্য সি ল্যাংগুয়েজই ব্যবহার করা হয়। উইন্ডোজ, লিন্যাক্স ইত্যাদির মূল অংশ বা কার্নেল সি ল্যাংগুয়েজ ব্যবহার করে লেখা হয়েছে।)।
উপরের প্রগ্রামটা ভালভাবে বোঝার জন্য নিজে নিজে কয়েকবার রান করে দেখুন। কিছু পরিবর্তন করে পরীক্ষা নিরিক্ষা করতে পারেন।

পয়েন্টার এবং অ্যারে

প্রথমে আমরা একটা ইন্টেজার ভেরিয়েবলের অ্যারে নিয়ে একটা প্রোগ্রাম লিখি-
#include "stdio.h"

int main()
{
    /* Step 0 */
    int numbers[3];

    numbers[0] = 56;
    numbers[1] = 25;
    numbers[2] = 87;

    int *px;

    /* Step 1 */
    px = numbers;
    printf("First value of px = %dn", px);
    printf("First value of variable pointed by px = %dn", *px);

    /* Step 2 */
    px = &numbers[0];
    printf("Second value of px = %dn", px);
    printf("First value of variable pointed by px = %dn", *px);

    /* Step 3 */
    px = &numbers[1];
    printf("Third value of px = %dn", px);
    printf("Third value of variable pointed by px = %dn", *px);

    /* Step 4 */
    px = &numbers[2];
    printf("Last value of px = %dn", px);
    printf("Last value of variable pointed by px = %dn", *px);

    return 0;
}
এখানে প্রথমে (Seep 0) আমরা একটা ইন্টেজার অ্যারে numbers ডিক্লেয়ার করেছি এবং ৩ টা সংখ্যা অ্যারেটার তিনটা স্থানে রেখেছি।
এরপর (Step 1) আমরা numbers অ্যারে এর অ্যাড্রেস আমরা পয়েসটার টাইপ ভেরিয়েবল px এর মধ্যে রেখেছি। এখানে লক্ষ্য করুন numbers এর পূর্বে আমরা & চিহ্ন ব্যবহার করি নাই। এর কারন হচ্ছে অ্যারে টাইপ ভেরিয়েবল নিজেই ওই অ্যারে ভেরিয়েবলের লোকেশন জমা রাখে।
এরপর (Step 2) আমরা numbers[0] এর অ্যাড্রেস px এর মধ্যে রেখেছি। এক্ষেত্রে & চিহ্ন ব্যবহার করতে হয়েছে। মনে রাখার সুবিধার জন্য আপনি লক্ষ করবেন printf("%d", numbers[0]) এর আউটপুট হবে 56 কিন্তু printf("%d", numbers) এর আউটপুট হবে numbers এর অ্যাড্রেস। যেক্ষেত্রে মান প্রিন্ট হবে সেক্ষেত্রে & চিহ্ন ব্যবহার করতে হবে অ্যাড্রেস বের করার জন্য।
এরপর বাকি দুইটি মানের জন্য (Step 3,4) একইভাবে কোড লেখা হয়েছে।
এই প্রোগ্রামটি আমি দুইবার রান করেছি। প্রথমবারের আ্উটপুট হচ্ছে-
First value of px = 10222376
First value of variable pointed by px = 56
Second value of px = 10222376
Second value of variable pointed by px = 56
Third value of px = 10222380
Third value of variable pointed by px = 25
Last value of px = 10222384
Last value of variable pointed by px = 87
আমরা দেখতে পাচ্ছি numbers এবং &numbers[0] এর মান একই। সুতরাং আমরা বুঝতে পারছি যে, কোন একটি অ্যারে ভেরিয়েবল আসলে এর প্রথম আইটেম এর অ্যাড্রেস নিজের মধ্যে জমা রাখে- যেটা এক্ষেত্রে 10222376. এরপর আমরা ২য় আইটেম (numbers[1]) এর অ্যাড্রেস প্রিন্ট করে পাচ্ছি 10222380. এই অ্যাড্রেসটা আসলে numbers[0] এর অ্যাড্রেসের চেয়ে 4 বেশি। যেহেতু আমরা ইন্টেজার এর অ্যারে নিয়ে কাজ করছি এবং আমরা জানি ইন্টেজার সাধারনত 4 বাইট যায়গা নেয় সুতরাং প্রথম আইটেম রাখার জন্য 4 বাইট যায়গা লেগেছে এবং 10222376, 10222377, 10222378, 10222379 এই চারটা লোকেশন প্রথম সংখ্যাটা রাখার জন্য ব্যবহার করার পর ২য় সংখ্যাটা 10222380 থেকে রাথা শুরু হরা হয়েছে। অ্যাড্রেস হিসাবে শুরুটা জানলেই চলে। কারণ পরবর্তী লোকেশন আমরা সহজেই বের করতে পারি যেগুলো হবে- 10222381, 10222382 এবং 10222383.
এখন এটুকু বুঝে থাকলে আপনি সহজেই ৩য় সংখ্যাটির (numbers[2]) অ্যাড্রেস কত হবে বের করতে পারবেন – যেটা হবে 10222383 এর পরবর্তী লোকেশন 10222384। এবং প্রোগ্রামের আউটপুটে দেখুন সেটাই এসেছে।
এবার ২য়বার রান করার পর আউটপুট দেখুনঃ
First value of px = 7536156
First value of variable pointed by px = 56
Second value of px = 7536156
Second value of variable pointed by px = 56
Third value of px = 7536160
Third value of variable pointed by px = 25
Last value of px = 7536164
Last value of variable pointed by px = 87
প্রথম আইটেমের অ্যাড্রেস হচ্ছে 7536156. সুতরাং ২য় আইটেম এর লোকেশন হবে 7536156 + 4 = 7536160 এবং ৩য় আইটেম এর লোকেশন হবে 7536160 + 4 = 7536164.
এবার একটা ছোট পরীক্ষা হয়ে যাক।আমি প্রোগ্রামটা ৩য় বার রান করে আংশিক আউটপুট দিচ্ছি।
First value of px = 16054796

Last value of variable pointed by px = 87
আপনি এই দুই লাইনের মাঝের ৬ লাইন কি হবে বের করুন। উত্তর লেসনের শেষে দেয়া আছে মিলিয়ে নিন (প্রশ্ন ১)।

পয়েন্টার গনণা (pointer arithmetic)

উপরে আমরা দেখেছি পয়েন্টারের অ্যাড্রেস এর সাথে একটি সংখ্যা যোগ করে কিভাবে পরবর্তী আইটেম এর অ্যাড্রেসটি আমরা পেতে আরি। এখন এটা আমরা প্রোগ্রাম থেকে আরও সহজে করতে পারি।
প্রথমে আমরা অ্যারেটির অ্যাড্রেস px এর মধ্যে রাখি-
px = numbers;
এটা আমরা প্রথম আইটেম এর অ্যাড্রেস রেখেও করে পারি-
px = &numbers[0];
এবার যদি আমরা ২য় আইটেমটি পেতে চাই তাহলে লিখতে পারি-
px2 = px+1;
এখনে px2 এর মান হবে px এর মানের থেকে 4 বেশি। এক্ষেত্রে কম্পাইলার সয়ংক্রিয়ভাবে বুঝে নিবে যে তাকে 4 যোগ করতে হবে পরবর্তী আইটেম পাওয়ার জন্য। কারণ ইন্টেজার আইটেম 4 বাইট যায়গা নেয়।
এবার যদি আমরা ৩য় আইটেমটি পেতে চাই তাহলে লিখতে পারি-
px3 = px+2;
আমরা যদি px3 এর অ্যাড্রেস দেখি তাহলে দেখব সেটা px হতে 4×2=8 বেশি। এভাবে আমরা যেকোন আইটেমের অ্যাড্রেস পেতে পারি px এর সাথে যোত করে।
এবার প্রোগ্রাম এর কোড দেখুনঃ
#include "stdio.h"

int main()
{
    int numbers[3];

    numbers[0] = 56;
    numbers[1] = 25;
    numbers[2] = 87;

    int *px, *px2, *px3;

    px = numbers;
    printf("Value of px (numbers) = %dn", px);
    printf("Value of numbers[0] = %dn", *px);

    px2 = px+1;
    printf("Value of px (&numbers[0]) = %dn", px2);
    printf("Value of *px2 = %dn", *px2);

    px3 = px+2;
    printf("Value of px (&numbers[0]) = %dn", px3);
    printf("Value of *px2 = %dn", *px3);

    return 0;
}
এটা রান করার পর আমি নীচের আউটপুক পেয়েছিঃ
Value of px (&numbers[0]) = 14940932
Value of numbers[0] = 56
Value of px (&numbers[0]) = 14940936
Value of *px2 = 25
Value of px (&numbers[0]) = 14940940
Value of *px2 = 87
এখন আমরা জানি numbers হচ্ছে প্রথম অ্যারেটির প্রথম আইটেমের অ্যাড্রেস। তাহলে আমরা numbers[1] এভাবে না লিখে যদি numbers + 1 এভাবে লিখি তাহলে কি হবে? নিচের প্রগ্রামে আমরা সেটাই করেছি এবং কাংখিত ফলাফলও পেয়েছিঃ
#include "stdio.h"

int main(int argc, char* argv[])
{
    int numbers[3];

    numbers[0] = 56;
    numbers[1] = 25;
    numbers[2] = 87;

    int *px, *px2;

    px = numbers;
    printf("Value of px (&numbers[0]) = %dn", px);
    printf("Value of numbers[0] = %dn", *px);

    px2 = numbers+1;
    printf("Value of px [numbers+1] = %dn", px2);
    printf("Value of *px2 = %dn", *px2);

    printf("*(numbers+2) = %dn", *(numbers+2));

    return 0;
}
শেষ printf লক্ষ্য করলে দেখবেন আমরা প্রথমে numbers+2 লিখে ৩য় আইটেমের অ্যাড্রেস বের করেছি। তারপর তার পূর্বে * চিহ্ন দিয়ে সেই অ্যাড্রেসে যে মান আছে সেটা প্রিন্ট করতে বলেছি। সুতরাং এক্ষেত্রে 87 পিন্ট হওয়ার কথা। আউটপুট দেখুনঃ
Value of px (&numbers[0]) = 12908512
Value of numbers[0] = 56
Value of px [numbers+1] = 12908516
Value of *px2 = 25
*(numbers+2) = 87
আশা করি এ পর্যন্ত সবকিছু বুঝতে পেরেছেন। যদি প্রথমবার পয়েন্টার নিয়ে কাজ করেন তাহলে চুরো জিনিসটা বুঝতে একচু সময় লাগতে পারে। আমার প্রা্য় ১ বছর লেগেছিল এটা পুরোপুরি বুঝতে এবং মনে রাখতে – শেখা শুরু করার পর।

স্ট্রাকচার এবং অ্যারে

প্রথমে আমরা স্ট্রাকচার ব্যবহার করে একটা ছোট প্রোগ্রাম লিখিঃ
#include "stdio.h"

struct Student
{
    int roll;
    float cgpa;
};

int main(int argc, char* argv[])
{

    Student stu1;

    stu1.roll = 10;
    stu1.cgpa = 3.92;
    printf("Roll = %d, CGPA =  %0.2fn", stu1.roll, stu1.cgpa);

    return 0;
}
এখানে আমরা Student নামে একটা স্ট্রাকচার ডিফাইন করেছি এবং প্রোগ্রামে সেটা ব্যবহার করেছি। প্রথমে একটা ভেরিয়েবল ডিক্লেয়ার করে সেটার মধ্যে মান রেখেছি এবয় পরে সেটা প্রিন্ট করেছি।
আউটপুট হবে-
Roll = 10, CGPA =  3.92
এবার আমরা পয়েন্টার দিয়ে সেটা করতে চাই। পূর্বের মদই আমরা একটা পয়েনটার টাইপ ভেরিয়েবল ডিক্লেয়ার করব।
Student *pstu1;
এবার এই পয়েন্টারের মধ্যে পুর্বের ভেরিয়েবলের অ্যাড্রেস রাখব-
pstu1 = &stu1;
এবার যদি আমরা pstu1 ব্যবহার করে stu1 এর মানগুলো পেতে চাই তাহলে “.” এর পরিবর্তে “->” ব্যবহার করে মানগুলো পেতে পারি- মানগুলো হবে pstu1->roll এবং pstu1->cgpa । এবার পুরো প্রোগ্রাম দেখুনঃ
#include "stdio.h"

struct Student
{
    int roll;
    float cgpa;
};

int main(int argc, char* argv[])
{

    Student stu1;

    stu1.roll = 10;
    stu1.cgpa = 3.92;

    Student *pstu1;

    pstu1 = &stu1;

    printf("Roll = %d, CGPA =  %0.2fn", pstu1->roll, pstu1->cgpa);

    return 0;
}
এখানে আমরা stu1 ব্যবহার করে মান অ্যাসাইন করে pstu1 ব্যবহার করে অ্যাক্সেস করেছি মানগুলো।
উল্টোটাও করতে পারেন। pstu1 ব্যবহার করে মান অ্যাসাইন করে stu1 ব্যবহার করে অ্যাক্সেস করতে পারেন। ফলাফল একই হবে। নিচের প্রোগ্রামটি দেখুনঃ
#include "stdio.h"

struct Student
{
    int roll;
    float cgpa;
};

int main(int argc, char* argv[])
{

    Student stu1;
    Student *pstu1;

    pstu1 = &stu1;

    pstu1->roll = 10;
    pstu1->cgpa = 3.92;

    printf("Roll = %d, CGPA =  %0.2fn", stu1.roll, stu1.cgpa);

    return 0;
}
স্ট্রাকচার এর অ্যারেও পয়েন্টার ব্যবহার করে অ্যাক্সের করা যায় পূর্বের মতই।
#include "stdio.h"

struct Student
{
    int roll;
    float cgpa;
};

int main(int argc, char* argv[])
{

    Student stu[2];

    stu[0].roll = 10;
    stu[0].cgpa = 3.92;

    stu[1].roll = 16;
    stu[1].cgpa = 3.57;

    Student *pstu1;
    pstu1 = stu;

    printf("Roll = %d, CGPA =  %0.2fn", pstu1->roll, pstu1->cgpa);

    pstu1 = stu + 1;

    printf("Roll = %d, CGPA =  %0.2fn", pstu1->roll, pstu1->cgpa);

    printf("stu = %d, stu+1=%dn", stu, stu+1);

    return 0;
}
আউটপুট হবে এরকমঃ
Roll = 10, CGPA =  3.92
Roll = 16, CGPA =  3.57
stu = 13499656, stu+1=13499664
যেহেতু ইন্টেজার ব্যবহার করে পুরো ব্যাপারটি একবার আলোচনা করেছি স্ট্রাকচার ব্যবহার করে আর আলোচনা করলাম না। শুধু একটা ব্যাপর লক্ষ করুন ২য় অ্যাড্রেসটি প্রথম অ্যাড্রেসের থেকে ৮ (আট) বেশি। কারণ Student স্ট্রাকচার এর জন্য মেমোরিতে ৮ বাইট যায়গা লাগে- চার বাইট ইন্টেজারের জন্য চার বাইট ফ্লোট নাম্বারের জন্য। যার কারনে ২য় আইটেমটির অ্যাড্রেস হবে প্রথম আইটেমের অ্যাড্রেসের থেকে ৮ বেশি। sizeof(Student) দিয়ে আপনি Student স্ট্রাকচারটির একটি আইটেম কত যায়গা নিচ্ছে সেটা ের করতে পারবেন।
পয়েন্টার নিয়ে আলোচনা এই পর্যন্তই। যারা প্রথমবার করছেন তারা সবগুলো উদাহরন ভালভাবে লক্ষ্য করুন এবং প্রতিটি বেশ কয়েকবার অনুশীলন করুন। বাইসাইকেল যেমন বই পড়ে শেখা যায় না শুধু কোনটা কি কাজ করে সেটা জানা যায় প্রোগ্রামিংও তেমনি পড়ে সামান্যই শেখা যায়। সি কোর্সটি আয়ত্ব করতে চাইলে মোটামুটি ১০০ থেকে ২০০ ঘন্টা সময় কোড লিখতে হবে। যে কোড দেখতে খুব সাধারণ মনে হয় সেটাও লেখার মাধ্যমে অনুশীলন করতে হবে।
আমার সাথে থাকার জন্য সবাইকে ধন্যবাদ। সবার প্রোগ্রামিং ক্যারিয়ারের সেকেন্ড ডিফারেন্সিয়াল নেগেটিভ হোক এই কামনায় সি কোর্স থেকে বিদায় নিচ্ছি।
প্রশ্ন ১ এর পুরো আউটপুট:
First value of px = 16054796
First value of variable pointed by px = 56
Second value of px = 16054796
Second value of variable pointed by px = 56
Third value of px = 16054800
Third value of variable pointed by px = 25
Last value of px = 16054804
Last value of variable pointed by px = 87
এই লেসনে কিছু বিষয় আমি ইচ্ছা করে একটু অন্যভাবে লিখেছি সহজভাবে বোঝার সুবিধার জন্য- রেফারেন্স হিসাবে ব্যবহারের জন্য না।

সি প্রোগ্রামিং – লেকচার ১১ – স্ট্রিং অপারেশন

সি প্রোগ্রামিং – লেকচার ১১ – স্ট্রিং অপারেশন


সি ল্যাংগুয়েজে আমরা বিভিন্ন সময় স্ট্রিং ব্যবহার করি। সি ল্যাংগুয়েজে স্ট্রিং বলতে সাধারনত বোঝায় এক বা একাধিক অক্ষরের সমন্বয়ে গঠিন একটা শব্দ বা বাক্য যার শেষে একটা NULL ক্যারেকটার (যেটা আসলে শূন্য) থাকে।
নিচে কয়েকটি স্ট্রিং এর উদাহরণ দেখি-
“আমার সোনার বাংলা”
“Hello World”
“Sirajganj”
“I”
একটা অক্ষর থাকলেও সেটা স্ট্রিং হতে পারে। সিংগেল কোট দিয়ে ‘I’ এভাবে লিখরে সেটা স্ট্রি হবে না।
এই স্ট্রিংগুলা আমরা সরাসরি কনসলে প্রিন্ট করতে পারি-
printf(“Hello World”);
ব্যবহারকারী থেকে একটা স্ট্রিং ইনপুট নেয়ার জন্য আমরা scanf বা gets ফাংশন দুটি ব্যবহার করি। একটা শব্দ ইনপুট নেয়ার জন্য scanf এবং পুরো লাইন ইনপুট নেয়ার জন্য gets ব্যবহার করা সুবিধাজনক। scanf ব্যবহার করে অবশ্য যে কোন ধরণের ইনপুট নেয়া সম্ভব। নীচে আমরা দুটি য়াংশনেরই কয়েকটি উদাহরণ দেখব।
প্রথমে আমরা দেখি স্টিং এর ইনপুট আউটপুট।
#include "stdio.h"

int main(int argc, char* argv[])
{
    char name[50];

    printf("Enter your name: ");
    scanf("%s", name);
    printf("Hello %sn", name);

    return 0;
}
নীচে প্রোগ্রিমটি ২ বার রান করে প্রথমবার Manir এবং দ্বিতীবার Maruf Maniruzzaman ইনপুট হিসাবে কিবোর্ডে টাইপ করা হয়েছে। দ্বিতীয় ক্ষেত্রে শুধু প্রথম শব্দটি ইনপুটে এসেছে।
Enter your name: Manir
Hello Manir

Enter your name: Maruf Maniruzzaman
Hello Maruf
এখন আমরা চাই পুরো লাইন ইনপুট নিতে-
#include "stdio.h"

int main(int argc, char* argv[])
{
    char name[50];

 printf("Enter your name: ");
 gets(name);
 printf("Hello %sn", name);

 return 0;
}
একবার রান করে আউটপুট দেখি
Enter your name: Maruf Maniruzzaman
Hello Maruf Maniruzzaman

stpcpy

একটা স্ট্রিংকে আরেকটা স্টিং ভেরিয়েবলের মধ্যে কপি করার জন্য আমরা stpcpy ব্যবহার করি
এই ফাংশনের প্রোটোটাইপ এরকমঃ
char *stpcpy (const char *dest,const char *src)
উদাহরণঃ
#include "stdio.h"
#include "string.h"

int main(int argc, char* argv[])
{
    char str1[50], str2[100];

    printf("Enter something: ");
    gets(str1);
    strcpy(str2, str1);
    printf("You entered: %sn", str2);
    return 0;
}
রান করে আউটপুট দেখি
Enter something: Hello world.
You entered: Hello world.

strcmp

দুইটা স্ট্রিং এর তুলনা করতে আমরা ব্যবহার strcmp করি
এই ফাংশনের প্রোটোটাইপ এরকমঃ
int strcmp(const char *string1,const char *string2)
উদাহরণঃ
#include "stdio.h"
#include "string.h"

int main(int argc, char* argv[])
{
    char str1[50], str2[100];

    printf("Enter first string: ");
    gets(str1);
    printf("Enter second string: ");
    gets(str2);

    int comp = strcmp(str1, str2);

    if(comp == 0)
    {
        printf("The strings are same.n");
    }
    else if(comp < 0)
    {
        printf("First string  < second string.n)
    }
    else
    {
        printf("First string > second string.n");
    }

    return 0;
}
রান করে আউটপুট দেখি।
দুইবার বার করা হয়েছে। প্রথমবার দুইবারই একই স্ট্রিং ইনপুট দিয়েছি। দ্বিতীয়বার দুাইটা আলাদা স্ট্রিং ইনপুট দিয়েছি-
Enter first string: test string
Enter second string: test string
The strings are same.
Enter first string: apple
Enter second string: banana
First string second string.

strlen

একটা স্ট্রিং এর দৈর্ঘ্য কত সেটা বের করার জন্য আমরা strlen ব্যবহার করি
এই ফাংশনের প্রোটোটাইপ এরকমঃ
int strlen(const char *string)
উদাহরণঃ
#include "stdio.h"
#include "string.h"

int main(int argc, char* argv[])
{
    char str1[50];

    printf("Enter something: ");
    gets(str1);

    int length = strlen(str1);

    printf("You entered a string of length %dn", length);

    return 0;
}
Enter something: I love Bangladesh.
You entered a string of length 18
একটা স্ট্রিংকে আরেকটা স্ট্রিং এর সাথে জোড়া লাগানোর জন্য আমরা ব্যবহার করি
এই ফাংশনের প্রোটোটাইপ এরকমঃ
char *strncat(const char *string1, char *string2, size_t n)
উদাহরণঃ
#include "stdio.h"
#include "string.h"

int main(int argc, char* argv[])
{
    char str1[150], str2[100];

    printf("Enter first string: ");
    gets(str1);
    printf("Enter second string: ");
    gets(str2);

    int len = strlen(str2);

    strncat(str1, str2, len);

    printf("%sn", str1);

    return 0;
}
Enter first string: Hello
Enter second string:  World!!
Hello World!!
আরও কিছু ফাংশন আছে যেগুলো আপনারা নিজেরা চেষ্টা করে দেখতে পারেন। প্রথমবার না করলেও সমস্যা নাই। তবে শুধো মনে রাখুন এরকম কয়েকটা ফাংশন আছে।
দুইটা স্ট্রিংকে তুলনা করার সময় প্রথম n অক্ষর তুলনা করার জন্য আমরা strncmp ব্যবহার করি
int strncmp(const char *string1, char *string2, size_t n)
একটা স্ট্রিংয়ের প্রথম n অক্ষর আরেকটা স্ট্রিং এর সাথে জোড়া লাগানোর জন্য আমরা strncpy ব্যবহার করি
char *strncpy(const char *string1,const char *string2, size_t n)
দুইটা স্ট্রিং এর তুলনা করতে আমরা strcasecmp ব্যবহার করি যখন আমরা ছোট বা বড় হাতের অক্ষরকে আলাদা করে বিবেচনা করতে চাই না
int strcasecmp(const char *s1, const char *s2)
দুইটা স্ট্রিংকে তুলনা করার সময় প্রথম n অক্ষর তুলনা করার জন্য আমরা strncasecmp ব্যবহার করি যখন আমরা ছোট বা বড় হাতের অক্ষরকে আলাদা করে বিবেচনা করতে চাই না
int strncasecmp(const char *s1, const char *s2, int n)

লেকচার ১০ – সি প্রোগ্রামিং – ফাইল ইনপুট আউটপুট

লেকচার ১০ – সি প্রোগ্রামিং – ফাইল ইনপুট আউটপুট


কম্পিউটার ব্যবহারকারী মাত্রই ফাইল বিষয়ে ধারণা রাখেন। এই ফাইলগুলো বিভিন্ন প্রগ্রাম তৈরি করে থাকে। আমারা আমাদের প্রোগ্রাম থেকে অনুরুপ ফাইল তৈরি এবং সেগুলো পরে ব্যবহার বা পরিবর্তন করতে পারি।
ফাইল আমরা মূলতঃ তিন ধাপে ব্যবহার করি-
১. ফাইল খোলা
২. ফাইল থেকে কোন কিছু পড়া বা ফাইলে কিছু লেখা
৩. ফাইল বন্ধ করা
ফাইল ব্যবহারের জন্য আমাদের একটা ফাইল handle দরকার। এটার মাধ্যমে আমরা একটা ফাইরকে চিহ্নিত করি। এটা FILE টাইপের একটা পয়েন্টার যেটাকে এভাবে ডিক্লেয়ার করতে হয়ঃ
FILE *fp;
fopen দিয়ে একটা ফাইল খুললে আমরা এটা রিটার্ন পাই।

fopen

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 ফাইলটি থাকতে হবে। তাহলে আমরা এখন এই ফাইল থেকে পড়তে পারব।

fprintf

এই ফাংশনটি printf এর মত তবে এটা ফাইলে লেখার জন্য ব্যবহার করা হয়।
যেমন আমরা যদি এভাবে লিখি
printf("Hello, World!");
তাহলে কনসোলে Hello, World! লেখা হবে।
fprintf এর ক্ষেত্রেও তাই- শুধু ফাইল handle টা দিয়ে দিতে হবে।
fprintf(fp, "Hello, World!");
তাহলে ফাইলে Hello, World! লেখা হবে।

fscanf

এই ফাংশনটি scanf এর মত তবে এটা ফাইল থেকে পড়ার জন্য ব্যবহার করা হয়।
যেমন আমরা যদি এভাবে লিখি
int num;
scanf(“%d”, &num);
তাহলে কিবোর্ড থেকে একটা পুর্ণসংখ্যা ইনপুট নিয়ে num ভেরিয়েবলে রাখা হবে।
fscanf এর ক্ষেত্রেও তাই- শুধু ফাইল handle টা দিয়ে দিতে হবে।
int num;
fscanf(fp, “%d”, &num);
তাহলে ফাইল থেকে একটা পুর্ণসংখ্যা পড়ে নিয়ে num ভেরিয়েবলে রাখা হবে।

fclose

ফাইল ব্যবহার শেষে ফাইলটি বন্ধ করার জন্য এই ফাংশন ব্যবহার করতে হবে।
এভাবে লিখলে ফাইল বন্ধ হবেঃ
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

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

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


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;

লেকচার ৮ – সি প্রোগ্রামিং – ফাংশন

লেকচার ৮ – সি প্রোগ্রামিং – ফাংশন


কিভাবে ফাংশন লিখতে হয়


আমরা এখন পর্যন্ত printf, scanf ইত্যাদি ফাংশন ব্যবহার করেছি। এখন আমরা ফাংশন নিজেরা বানানো শিখব।
ধরা যাক আমরা দুইটা লাইন প্রিন্ট করতে চাই-
#include "stdio.h"

void main()
{
    printf("Hello");
    printf(" Worldn");
}
এখন আমরা যদি এই দুইটা লাইন ৩ বার লিখতে চাই তাহলে আমরা ইচ্ছা করলে এই লাইন দুটো ৬ লা্নে লিখে সেটা করতে পারি। তা না করে আমরা ফাংশন ব্যবহার করলে অনেক পরিচ্ছন্ন হবে। ফাংশনের জন্য যেকোন একটা নাম ঠিক করতে হবে। আমরা printhello নামটা ঠিক কললাম। এরপরে ফাংশনের একটা স্টেটমেনট ব্লক থাকবে। সেই ব্লকে আমরা যত খুশি স্টেটমেন্ট লিখতে পারব।
void printhello()
{
    printf("Hello");
    printf(" Worldn");
}
এখন যদি আমরা এই ফাংশন যে কাজ করবে সেটা যে কোন সময় করাতে চাই শুধু ফাংশনটা call করলেই হবে। ফাংশন কলের জন্য আমরা শুধু ফাংশনের নামটা লিখব এভাবে-
printhello();
এখন আমরা পুরো প্রগ্রামটা দেখিঃ
#include "stdio.h"

void printhello()
{
    printf("Hello");
    printf(" Worldn");
}

void main()
{
    printhello();
    printhello();
    printhello();
}
এভাবে আমরা যেকোন কাজ যেটা বারবার করতে হয় সেটাকে একবার লিখে ফাংশন বানাতে পারি। পরে শুধু একলাইন লিখে সেই কাজটার পুণরাবৃত্তি করতে পারি।

ফাংশন return


এবার দেখি ফাংশন রিটার্ন। কোন একটি ফাংশন থেকে যে কোন সময় আমরা return কিওয়ার্ড ব্যবহার করে ফাংশন থেকে বের হয়ে যেতে পারি। এর ফলে প্রোগ্রামের কন্ট্রোল যেখান থেকে ফাংশন কল করা হয়েছিল সেখানে চলে যাবে।
ধরা যাক আমাদের একটা ফাংশন আছে f1 যেটা থেকে আমরা ৩৫ সংখ্যাটি রিটার্ণ করতে চাই-
int f1()
{
   //[do something]

    return  35;
}
এবার আমরা এই ফাংশনটা main থেকে কল করব। এই ফাংমনটা একটা সংখ্যা রিটার্ন করে। সেই রিটার্ন করা সংখ্যাটা যদি আমরা একাট ভেরিয়েবলে রাখতে চাই তাহলে আমরা একটা = চিহ্ন ব্যবহার হরে এভাবে লিখতে পারি-
r = f1();
এভাবে আমরা যেকোন ফাংশনের রিটার্ন করা মান একটা ভেরিয়েবলে রাখতে পারি।
এবার আমরা য্ররো প্রগ্রামটা দেখি-
int f1()
{
   //[do something]
    return  35;
}

void main()
{
    int r;
    r= f1();
}

ফাংশন প‌্যারামিটার


অংকে আমরা অনেক ফাংশন ব্যবহার করি। ধরি একটা ফাংশন এরকম-
f(x)=2x+3
এখন যদি x = 5 হয় তাহলে f(x)= 13 হবে। আবার যদি x = 3 হয় তাহলে f(x)= 9 হবে।
এখনে ফাংশনে একটা প‌্যারামিটার আছে, যেটা হচ্ছে x. আমরা আরেকটা ফাংশন দেখি যেটার ২টা প‌্যারামিটার x এবং y আছে-
f(x,y)=2x+3y
এখন যদি x = 2, y = 3 হয় তাহলে f(2,3)= 13 হবে। আবার যদি x = 1, y = 1 হয় তাহলে f(x,y)=5 হবে।
সুতরাং আমাদের ফাংশনে আমরা এক বা একাধিক প‌্যারামিটার ব্যবহার করতে পারি।
এখন আমরা দেখি উপরের ফাংশনগুলোকে কিভাবে সি প্রোগ্রামিং এর ভাষায় লিখতে পারি-
প্রথমে f(x)=2x+3 ফাংশনটা সি ল্যাংগুয়েজে অনুবাদ করি-
int f(int x)
{
    return 2*x+3;
}
আমরা দেখতে পাচ্ছি অংকের ফাংশন মেটামুটি একইভাবে সি ল্যাংগুয়েজে প্রকাশ করা যায়। = চিহ্নের জন্য আমরা return ব্যবহার করেছি। অংকে = চিহ্ন আসলে return ই বোঝায়। আর ফাংশনের রিটার্ন টাইপ আর প্যারামিটার গুলোর টাইপ দিতে হবে সি ল্যাংগুয়েজে।
এবার আমরা f(x,y)=2x+3y ফাংশনটা অনুবাদ করি-
int f(int x, int y)
{
    return 2*x+3y;
}
এভাবে আমরা যে কোন সংখ্যক প‌্যারামিটার ফাংশনে যোগ করতে পারি।

ফাংশন রিটার্ন আরেকবার


আমরা ফাংশন রিটার্ন আরেকবার দেখি-
int f1(int n)
{
    if(n == 0)
        return 0;

    if(n == 1)
        return 1;

    return n*n;
}

void main()
{
  int r=5;
  int q = f1(r);
}
এখানে f1 ফাংশনটা যদি আমরা 5 প‌্যারামিটার দিয়ে কল করি তাহলে দুইটা if এর কোনটাই কাজ করবে না এবং শেষ লাইন থেকে 25 রিটার্ন করবে এবং main ফাংশনে q এর মান 25 হবে।
কিন্তু যদি আমরা main এ r=0 দিয়ে f1 ফাংশন কল করি তাহলৈ প্রথম if এর কন্ডিশন TRUE হওয়ার কারণে 0 রিটার্ণ করবে এবং main ফাংশনে q এর মান 0 হবে। এখানে লক্ষ্য করি যে একবার রিটার্ন করলে প্রোগ্রাম ফাংশন থেকে বের হয়ে আসবে এবং যেখান থেকে কল করা হয়েছিল সেখানে প্রোগ্রামের কন্ট্রোল ফিরে আসবে।

ফাংশন byval প‌্যারামিটার


আমরা একটা ফাংশন লিখি যেটা একটা সংখ্যার square রিটার্ন করবে।
int square(int num)
{
    num = num*num;
    return num;
}

void main()
{
    int n=3;
    int r=square(n);
    printf("%d %d", n, r);
}
এখন এখানে main ফাংশনে একটা ভেরিয়েবল n এর মান 3 অ্যাসাইন করা হয়েছে। তারপর square ফাংশন কল করা হয়েছে। square ফাংশনের প‌্যারামিটার num এর মান প্রথম লাইন পরিবর্তন হয়ে 9 হয়েছে এবং সেই 9 রিটার্ন করা হয়েছে। এক্ষেত্রে main ফাংশনের r এর মান 9 হবে। কিন্তু n এর মানের কোন পরিবর্তন হবে না। এভাবে যখন একটা প্রারামিটার একটা ফাংশনে আমরা পাঠাব যেটার মান ফাংশনের মধ্যে পরিবর্তন করা হবে কিন্তু যেখান থেকে কল করা হয়েছিল সেখানে ব্যবহৃত ভেরিয়েবলের মানের কোন পরিবর্তন হবে না- এই ধরনের প্যারামিটারকে আমরা byval প‌্যারামিটার হিসাবে চিহ্নিত করি। কনসোলে 3 9 প্রিন্ট হবে।

ফাংশন byref প‌্যারামিটার


এখন আমরা যদি চাই যে main ফাংশনের n এর মান যখন প‌্যামিটার হিসাবে square ফাংশনে পাঠাব সেই প‌্যারামিটারের মান যদি square ফাংশনের মধ্যে পরিবর্তন করা হয় তাহলে main ফাংশনের n এর মানও পরিবর্তন হয়ে যাবে তাহলে আমরা প‌্যারামিটারটিকে byref প্যারামিটার হিসাবে ফাংশনে চিহ্নিত করে দেব। এটার জন্য প‌্যারামিটার ভেরিয়েবলের নামের আগে & (অ্যামপারস্যান্ড) চিহ্ন দিয়ে দিতে হবে।
int square(int <b>&amp;</b>num)
{
    num = num*num;
    return num;
}

void main()
{
    int n=3;
    int r=square(n);
    printf("%d %d", n, r);
}
এখন কনসোলে 9 9 প্রিন্ট হবে।

সি প্রোগ্রামিং – লেকচার ৭ : for লুপ

সি প্রোগ্রামিং – লেকচার ৭ : for লুপ


For loop

আমরা while লুপ এর ব্যবহার দেখেছি। এখন আমরা এর চেয়ে আরকটু বেশি ফিচারের for লুপ নিয়ে আলোচনা করব। সব ক্ষেত্রেই এই দুইটা লুপ একে অপরকে প্রতিস্থাপন করতে পারে সামান্য কিছু পরিবর্তন করে।

for লুপের সিনট্যাক্স

for( [init-stmt] ; [condition] ; [increment-stmt] )
{
[Block]
}
লুপের [init-stmt] এর স্থানে এক বা একাধিক ভেরিয়েবলের মান অ্যাসাইন করা যায়। [condition] একটি বুলিয়ান এক্সপ্রেশন। এই এক্সপ্রেশনের মান যতক্ষন True থাকবে ততক্ষন লুপ চলবে while লুপের মতই।
শেষের [increment-stmt] এর যায়গায় এক বা একাধিক ভেরিয়েবলের মান পরিবর্তন করা যাবে। এখানে সেমিকোলন দিয়ে তিনটি অংশ আলাদা করা হয়েছে। আমরা ইচ্ছা করলে যেকোন অংশ বাদ দিতে পারি বা সবগুলোও বাদ দিতে পারি। তবে সেমিকোলন গুলো আবশ্যিক। যেমন এভাবে লেখা যাবেঃ
for( ; ; )
{
    [Block]
}
এক্ষেত্রে লুপই কখনও থামবে না। লুপ থামাতে চাইলে break ব্যবহার করতে হবে। break ব্যবহার করে for বা while লুপ যেকোন সময় থামিয়ে দেয়া যায়।
এবার আমরা আগের while লুপটাকে পরিবর্তন করব for লুপ ব্যবহার করে।

১. int num;
২. num=0;
৩.
৪. while(num<4)
৫. {
৬.     printf("%d",num);
৭.     num=num+1;
৮. }
৯.
১০.
উপরের প্রোগ্রামটা for লুপ ব্যবহার করে এভাবে লেখা যায়ঃ
১. int num;
২. num=0;
৩.
৪. for( ; num<4 ; )
৫. {
৬.     printf("%d",num);
৭.     num=num+1;
৮. }
৯.
১০.
এখানে আমরা তেমন কোন পরিবর্তন করি নাই। শুধু for লুপ ব্যবহার করেছি এবং while লুপের কন্ডিশনটা for লুপের কন্ডিশন যেখানে লেখার কথা (একটা সেমিকোলনের পর) সেখানে লিখেছি। এটা হুবহু একই কাজ করবে – যদিও এক্ষেত্রে আমরা for লুপ ব্যবহার করেছি।
এবার আমরা num=0 অংশটা for লুপের মধ্যে নিয়ে যাই।
১. int num;
২.
৩.
৪. for(num=0 ; num<4 ; )
৫. {
৬.     printf("%d",num);
৭.     num=num+1;
৮. }
৯.
১০.
num=0 টাকে আমরা লুপের [init-stmt] এর স্থানে (প্রথম সেমিকোলনের আগে) লিখেছি। এক্ষেত্রেও প্রোগ্রামটা হুবহু প্রথম প্রোগ্রামের মত কাজ করবে।
এবারে সর্বশেষ কাজ হচ্ছে num=num+1 স্টেটমেন্টটাকে for লুপর মধ্যে নিয়ে যাওয়াঃ
১. int num;
২.
৩.
৪. for(num=0 ; num<4 ; num=num+1 )
৫. {
৬.     printf("%d",num);
৭.
৮. }
৯.
১০.
এবারেও প্রোগ্রামের কাজের কোন পরিবর্তন হল না তবে অনেক সংক্ষিপ্ত হয়ে গেল।
এবার নীচের ভিডিওতে for এবং while লুপ ব্যবহার করে লেখা দুইটা প্রোগ্রামের তুলনাশূলক আলোচনা দেখুন।

Convert while loop to a for loop


Compare for loop and while loop

লেকচার ৬ – সি প্রোগ্রামিং: while লুপ

লেকচার ৬ – সি প্রোগ্রামিং: while লুপ


আমরা যদি একই কাজ কম্পিউটার কে দিয়ে অনেক বার করাতে চাই তাহলে আমরা লুপ (চক্র?) ব্যবহার করি। বেশ কয়েক ধরনের লুপ আছে সি ল্যাংগুয়েজে – while, for, do-while ইত্যাদি। আজকে আমরা while লুপ নিয়ে আলোচনা করব।
নাম দেখেই নিশ্চয়ই বুঝতে পারছেন কম্পিউটারকে আমরা বলতে পারি “যতক্ষন” এই শর্ত পূরণ হবে “ততক্ষন” এই কাজ গুলো করতে থাক।
এটা কিভাবে লেখা হয় সেটা প্রথমে দেখে নেইঃ

While Loop Syntax

প্রথমে আমরা লুপ এর স্ট্রাকচার দেখি
while([expression])
{
    [Statement Block]
}
এখানে একটি বুলিয়ান এক্সপ্রেশন আছে যেটা ঠিক করে দিবে যে লুপের স্টেটমেন্ট ব্লকের স্টেটমেন্ট গুলো এক্সিকিউট হবে কিনা। লুপের শুরুতেই কম্পিউটার এক্সপ্রেশন এর মান বের করবে। এটা যদি True হয় তাহলে ব্লকের স্টেটমেন্ট গুলো এক্সিকিউট হবে। ব্লকের স্টেটমেন্ট গুলো এক্সিকিউট করে তারপর কম্পিউটার আবার এক্সপ্রেশনের মান নতুন করে বের করবে। মান যদি আবারও True হয় তাহলে ব্লকের স্টেটমেন্ট গুলো আবার এক্সিকিউট হবে। এভাবে যতক্ষন এক্সপ্রেশনের মান True হবে ততক্ষন এই লুপ বা চক্র চলবে। এক্সপ্রেশনের মান যখন False হবে তখন লুপ থেমে যাবে এবং কম্পিউটার লুপের পরে যা আছে সেটা নিয়ে কাজ শুরু করবে।

While loop example

এবারে লুপের একটা উদাহরণ দেখিঃ
১. int num;
২. num=0;
৩.
৪. while(num<4)
৫. {
৬.     printf("%d",num);
৭.     num=num+1;
৮. }
৯.
১০.
এখানে আমরা ২ নম্বর লাইনে num ভেরিয়েবলের মধ্যে 0 রাখছি। এর পর ৪ নম্বর লাইনে লুপ শুরু হয়েছে। এই লুপটি আমরা কয়েকটি ধাপে কিভাবে কাজ করবে তা দেখব।

১ম ধাপঃ

৪ নম্বর লাইনে num ভরিয়েবলের মান 0 সুতরাং (num<4) এক্সপ্রেশনের মান True. সুতরাং ৫-৮ লাইনগুলো এক্সিকিউট হবে।
৫ নম্বর লাইনে লুপের ব্লক শুরু
৬ নম্বর লাইনের জন্য আমরা 0 আউটপুট দেখতে পাব।
৭ নম্বর লাইনে num এর মান শূণ্য থেকে 1 বেড়ে num=1 হবে।
৮ নম্বর লাইনে while লুপের ব্লক শেষ সুতরাং কম্পিউটার ৪ নম্বর লাইনে ফিরে যাবে।

২য় ধাপঃ

৪ নম্বর লাইনে num ভরিয়েবলের মান 1 সুতরাং (num<4) এক্সপ্রেশনের মান True. সুতরাং ৫-৮ লাইনগুলো এক্সিকিউট হবে।
৬ নম্বর লাইনের জন্য আমরা 1 আউটপুট দেখতে পাব।
৭ নম্বর লাইনে num এর মান 1 থেকে 1 বেড়ে num=2 হবে।
৮ নম্বর লাইনে কম্পিউটার এসে দেখবে while লুপের ব্লক শেষ সুতরাং ৪ নম্বর লাইনে ফিরে যাবে।

৩য় ধাপঃ

৪ নম্বর লাইনে num ভরিয়েবলের মান 2 সুতরাং (num<4) এক্সপ্রেশনের মান True. সুতরাং ৫-৮ লাইনগুলো এক্সিকিউট হবে।
৬ নম্বর লাইনের জন্য আমরা 2 আউটপুট দেখতে পাব।
৭ নম্বর লাইনে num এর মান 2 থেকে 1 বেড়ে num=3 হবে।
৮ নম্বর লাইনে কম্পিউটার এসে দেখবে while লুপের ব্লক শেষ সুতরাং ৪ নম্বর লাইনে ফিরে যাবে।

৪র্থ ধাপঃ

৪ নম্বর লাইনে num ভরিয়েবলের মান 3 সুতরাং (num<4) এক্সপ্রেশনের মান True. সুতরাং ৫-৮ লাইনগুলো এক্সিকিউট হবে।
৬ নম্বর লাইনের জন্য আমরা 3 আউটপুট দেখতে পাব।
৭ নম্বর লাইনে num এর মান 3 থেকে 1 বেড়ে num=4 হবে।
৮ নম্বর লাইনে কম্পিউটার এসে দেখবে while লুপের ব্লক শেষ সুতরাং ৪ নম্বর লাইনে ফিরে যাবে।

৫ম ধাপঃ

৪ নম্বর লাইনে num ভরিয়েবলের মান 4 সুতরাং (num<4) এক্সপ্রেশনের মান False. সুতরাং ৫-৮ লাইনগুলো এবার আর এক্সিকিউট হবে না।
কম্পিউটার ৯ নম্বর লাইনে চলে যাবে পরবর্তী কাজগুলো (যদি থাকে) করার জন্য এবং লুপ এভাবে শেষ হল।

While example tracing/ debugging

এই ভিডিওতে আমরা উপরের ধাপগুলো কম্পিউটারে Visual Studio তে কিভাবে ডিবাগ করা যায় তা দেখি। আপনারা অন্য যেকোন IDE ব্যবহার করে এখইভাবে ডিবাগ করতে পারবেন। আপনারা ইচ্ছা করলে Visual C++ 2010 Express বিনামূল্যে মাইক্রোসফটের ওয়েবসাইট থেকে ডাউনলোড করতে পারবেন (সার্চ করলেই লিংক পাবেন)।

Infinite loop

আমরা দেখেছি while লুপের এক্সপ্রেশনের মান False হয়ে গেলে লুপ শেষ হয়। কিন্তু যদি আমরা এমনভাবে এক্সপ্রেশন লিছি যে এর মান কখনও False হবে না তাহলে while লুপ আসলৈ কখনও থামবে না। উপরের উদাহরণে আমরা দেখেছি num ভেরিয়েবলের মান পরিবর্তন করতে থাকার ফলে এক সময় লুপের এক্সপ্রেশনের মান False হয়ে লুপ থেমে যায়। কিন্তু আমরা যদি নীচের মত করে লিখি-
১. int num;
২. num=0;
৩.
৪. while(num<4)
৫. {
৬.     printf("%d",num);
৭.
৮. }
৯.
১০.
তাহলে এখন num ভেরিয়েবলের মান পরিবর্তন হওয়ার কোন সম্ভবনা নাই এবং লুপও থামবে না। এটা একটা সহজ উদাহরণ। কিন্তু অনেক সময় প্রোগ্রামে বাগ থাকার কারনে এরকম অবস্থার সৃষ্টি হতে পারে। বা অনেক সময় এরকম করার দরকার হতে পারে।

সি প্রোগ্রামিং – লেকচার ৫: if স্টেটমেন্ট

সি প্রোগ্রামিং – লেকচার ৫: if স্টেটমেন্ট



if স্টেটমেন্ট

আমরা দেখেছি কম্পিউটার একটার পর একটা কাজ ধারাবাহিকভাবে করে যায়। একটার পর একটা স্টেটমেন্ট এক্সিকিউট করা আমাদের সবসময় দরকার হবে। তেমনি ভাবে আমরা কোন একটি শর্তপূরণ স্বাপেক্ষে যদি এক বা একাধিক স্টেটমেন্ট এক্সিকিউট করাতে চাই তাহরে আমরা if স্টেটমেন্ট ব্যবহার করব।
if স্টেটমেন্ট আমরা এভাবে লিখি
if ([Boolean expression])
{
   [Code Block]
}

উদাহরণ

এবার একটা উদাহরণ দেখি। আমরা একটা ছোট প্রোগ্রাম লিখতে চাই যেখানে একটা ভেরিয়েবল score এর মধ্যে একটা সংখ্যা রাখব। এরপর এই ভেরিয়েবলের মান যদি ৩০ এর চেয়ে বেশি হয় তাহলে আমরা PASS শব্দটি লিখব। আর ৩০ এর চেয়ে যদি বেশি না হয় তাহরে কিছু করবে না।
int score;
score=35;

if(score>30)
{
  printf("PASS");
}
এখানে [Code Block] এ আমরা একটা printf স্টেটমেন্ট লিখেছি। এই স্টেটমেন্টটি কাজ করবে যদি আমাদের এক্সপ্রেশন score>30 এর মান True হয়। এক্সপ্রেশন এর মান False হলে স্টেটমেন্টটি কাজ করবে না।

কুইজ ১

বলতে হবে এই প্রোগ্রামটা রান করলে কনসোলে কোন কিছু প্রিন্ট হবে কিনা আর প্রিন্ট হরে কি প্রিন্ট হবেঃ
int number;
number = 20;

if(number >= 15)
{
    printf("%d", number);
}

কুইজ ১ এর উত্তর ভিডিওতে দেখে নিন


কুইজ ২

এবার আমরা ২০ এর পরিবর্তে 13 অ্যাসাইন করি number ভেরিয়েবলে তাহলে কি প্রিন্ট হবে কনসোলে?
int number;
number = 13;

if(number >= 15)
{
    printf("%d", number);
}

কুইজ ২ এর উত্তরভিডিওতে দেখে নিন


if-else

আমরা দেখেছি if ব্যবহার করে কিভাবে একটা এক্সপ্রেশন যদি True হয় তাহলে কিছু কাজ স্টেটমেন্ট এক্সিকিউট করানো যায়। এবার আমরা একটা এক্সপ্রেশন যদি True হয় তাহলে কিছু স্টেটমেন্ট আর False হলে অন্য কিছু স্টেটমেন্ট এক্সিকিউট করাতে চাই। এজন্য আমরা if-else ব্যবহার করব।
if([Boolean expression])
{
  [Code Block 1]
}
else
{
  [Code Block 2]
}
এখানে [Boolean expression] এর মান True হলে [Code Block 1] এক্সিকিউট হবে আর False হলে [Code Block 2] এক্সিকিউট হবে।

উদাহরণ

এবার একটা উদাহরণ দেখি।
int score = 35;

if(score > 40)
{
    printf("PASS");
}
else
{
    printf("FAIL");
}
এখানে বুলিয়ান এক্সপ্রেশন score > 40 এর মান যেহেতু False সুতরাং আমাদের else ব্লক কাজ করবে এবং FAIL প্রিন্ট হবে।

কুইজ ১

int num;
num=30;

if(num * 2 > 50)
{
    printf("A");
}
else
{
    printf("B");
}
বলতে হবে উপরের প্রোগ্রাম রান করলে কনসোলে A, B নাকি কিছু দেখাবে না।

কুইজ ১ এর উত্তরভিডিওতে দেখে নিন


কুইজ ২

এবার আমরা উপরের প্রোগ্রামটায় একটু পরিবর্তন করে num=20 লিখি। বলথে হবে এখন কি হবে।
int num;
num=20;

if(num * 2 > 50)
{
    printf("A");
}
else
{
    printf("B");
}

কুইজ ২ এর উত্তরভিডিওতে দেখে নিন

সি প্রোগ্রামিং – লেকচার ৪: ইনপুট, অ্যারে এবং বুলিয়ান এক্সপ্রেশন

সি প্রোগ্রামিং – লেকচার ৪: ইনপুট, অ্যারে এবং বুলিয়ান এক্সপ্রেশন



ইনপুট

ইউজারের থেকে ইনপুট নেয়ার জন্য আমরা scanf ফাংশনটা ব্যবহার করি। scanf ফাংশনে কমপক্ষে ২ টা প‌্যারামিটার দিতে হয়। একটা স্ট্রিং এবং একটা অন্য যে কোন ভেরিয়েবলের অ্যাড্রেস। ধরা যাক আমরা একটা প‌ূর্ণসংখ্যা ইনপুট নিতে চাই-
int num;
scanf("%d",&num);

এখানে “%d” আমরা বোঝাচ্ছি একটা integer ইনপুট নিতে চাই। এবং পরে কমা দিয়ে আমরা num ভেরিয়েবলের অ্যাড্রেস &num লিখেছি। এখন প্রোগ্রাম রান হওয়ার সময়ে এই লাইনটায় আসলে প্রোগ্রাম একটা প‌ূর্ণসংখ্যার জন্য অপেক্ষা করবে।
কিবোর্ড থেকে ধরা যাক একটা সংখ্যা 123 দিয়ে এন্টার দেয়া হল। তাহলে প্রোগ্রামটা 123 সংখ্যাটা num ভেরিয়েবলের মধ্যে রেখে দিবে।
এভাবে আমরা একটা দশমিক সংখ্যাও ইনপুট নিতে পারি। সেক্ষেত্রে আমাদের %f ব্যবহার করতে হবে এবং একটা float টাইপ ভেরিয়েবল প‌্যারামিটার হিসাবে দিতে হবে।
float price;
scanf("%f", &price);

আমরা যদি একবারে দুইটা মান নিতে চাই তাহলে এভাবে লিখতে পারি-
int num;
float price;
scanf("%d%f", &num, &price);

প্রথমে আমরা %d দিয়েছি সুতরাং প্রথমে একটা int ভেরিয়েবলের অ্যাড্রেস দিতে হবে যেটা হচ্ছে &num এক্ষেত্রে। তারপর আছে %f যেটার জন্য আমাদের float ভেরিয়েবলের অ্যাড্রেস দিতে হবে এক্ষেত্রে যেটা হচ্ছে &price.

অ্যারে – প্রাথমিক আলোচনা

আমাদের যদি একই ধরণের অনেকগুলো ভেরিয়েবল দরকার হয় তাহলে আমরা array ব্যবহার করি। ধরা যাক আমাদের ১০০ টা সংখ্যার জন্য ভেরিয়েবল লাগবে।
তাহলে আমরা ১০০ টা ভেরিয়েবল declare করতে পারি-
int number0, number1, number2, ......, number99;

এভাবে ভরিয়েবল declare করা এবং পরে ব্যবহার করা খুবই অসুবিধাজনক। সুতরাং আমরা সহজ করে লিখতে চাই।
int number[100];

এভাবে লিখলে আমরা ১০০ টা সংখ্যা রাখার যায়গা পাব। এবং সেগুলোর নাম হবে number[0], number[1], number[2], …. ,number[99] এভাবে। [] এর মধ্যে যে সংখ্যা লিখেছি সেটা হচ্ছে ইনডেক্স- এক্ষেত্রে কততম সংখ্যা সেটা বুঝাচ্ছে। ইনডেক্সিং শুরু হবে শূণ্য থেকে।
সুতরাং যদি ৩য় সংখ্যাটার মধ্যে 500 রাখতে চাই সেটার জন্য আমাদের লিখতে হবে,
number[2]=500;

১০০তম সংধ্যে যদি 170 লিখতে চাই তাহলৈ সেটা লিখতে হবে এভাবে-
number[99]=170;

আমরা ইনপুটও নিতে পারি যেকোন সংখ্যা। ধরা যাক ৫ম সংখ্যাটা ইনপুট নিতে চাই। সেটার অ্যাড্রেস হবে একইভাবে &number[4].
scanf("%d", &number[4]);

অ্যারে নিয়ে আপাতত এটুকুই আমরা আলোচনা করব।

বুলিয়ান এক্সপ্রেশন

আমরা জানি যে এক্সপ্রেশনের একটা মান থাকে। যেসব এক্সপ্রেশনের মান কোন সংখ্যা বা অন্য কিছু না হয়ে শুধু সত্য (true) বা মিথ্যা (false) এই দুইটা মান হতে পারে সেগুলোকে বলে বুলিয়ান এক্সপ্রেশন।
ধরা যাক আমরা একটা int ভেরিয়েবলে 35 অ্যাসাইন করেছি-
int score;
score=35;

এখন আমরা যদি লিখি
score>30
তাহলে আমরা একটা বুলিয়ার এক্সপ্রেশন পেলাম যেটার মান হবে true. আবার যদি আমরা লিখি
score>40
তাহলৈ এটার মান হবে false.
বুলিয়ান এক্সপ্রেশন আবার একাধিক ছোট ছোট এক্সপ্রেশনের সমন্বয়ে ঘঠন করা যায়, যেগুলকে OR বা AND দিয়ে সংযুক্ত করা যায়। সি ল্যাংগুয়েজে OR লেখা হয়
||
দিয়ে আর AND লেখা হয়
&&
দিয়ে।
যদি আমরা লিখি-
(score > 20) && (score < 33)

যেহেতু আমরা
&&
ব্যবহার করেছি এই এক্সপ্রেশন true হওয়ার জন্য দুইটা এক্সপ্রশন সত্য হতে হবে। তাহলে এক্ষেত্রে প্রোগ্রাম দুইটা এক্সপ্রেশনের মান আলাদাভাবে বের করে তারপর দেখবে দুইটাই true কিনা।
যেহেতু একটা এক্সপ্রশন
(score < 33)
এর মান false আমাদের পুরো এক্সপ্রশনের মানও false হবে।
আবার যদি আমরা
||
ব্যবহার করি-
(score > 20) || (score < 33)

তাহলে
(score > 20)
এর মান true এবং
(score < 33)
এর মান false হওয়ার কারণে প্ররো এক্সপ্রেশনের মান true হবে।
সুতরাং
&&
দিয়ে একাধিক সংযুক্ত এক্সপ্রেশনের মান true হওয়ার জন্য সবগুলো এক্সপ্রেশনের মান true হতে হবে।
||
দিয়ে একাধিক সংযুক্ত এক্সপ্রেশনের মান true হওয়ার জন্য যে কোন একটি এক্সপ্রেশনের মান true হলেই হবে।

Table of ASCII Characters


Table of ASCII Characters

This table lists the ASCII characters and their decimal, octal and hexadecimal numbers. Characters which appear as names in parentheses (e.g., (nl)) are non-printing characters. A table of the common non-printing characters appears after this table.
Char  Dec  Oct  Hex | Char  Dec  Oct  Hex | Char  Dec  Oct  Hex | Char Dec  Oct   Hex
-------------------------------------------------------------------------------------
(nul)   0 0000 0x00 | (sp)   32 0040 0x20 | @      64 0100 0x40 | `      96 0140 0x60
(soh)   1 0001 0x01 | !      33 0041 0x21 | A      65 0101 0x41 | a      97 0141 0x61
(stx)   2 0002 0x02 | "      34 0042 0x22 | B      66 0102 0x42 | b      98 0142 0x62
(etx)   3 0003 0x03 | #      35 0043 0x23 | C      67 0103 0x43 | c      99 0143 0x63
(eot)   4 0004 0x04 | $      36 0044 0x24 | D      68 0104 0x44 | d     100 0144 0x64
(enq)   5 0005 0x05 | %      37 0045 0x25 | E      69 0105 0x45 | e     101 0145 0x65
(ack)   6 0006 0x06 | &      38 0046 0x26 | F      70 0106 0x46 | f     102 0146 0x66
(bel)   7 0007 0x07 | '      39 0047 0x27 | G      71 0107 0x47 | g     103 0147 0x67
(bs)    8 0010 0x08 | (      40 0050 0x28 | H      72 0110 0x48 | h     104 0150 0x68
(ht)    9 0011 0x09 | )      41 0051 0x29 | I      73 0111 0x49 | i     105 0151 0x69
(nl)   10 0012 0x0a | *      42 0052 0x2a | J      74 0112 0x4a | j     106 0152 0x6a
(vt)   11 0013 0x0b | +      43 0053 0x2b | K      75 0113 0x4b | k     107 0153 0x6b
(np)   12 0014 0x0c | ,      44 0054 0x2c | L      76 0114 0x4c | l     108 0154 0x6c
(cr)   13 0015 0x0d | -      45 0055 0x2d | M      77 0115 0x4d | m     109 0155 0x6d
(so)   14 0016 0x0e | .      46 0056 0x2e | N      78 0116 0x4e | n     110 0156 0x6e
(si)   15 0017 0x0f | /      47 0057 0x2f | O      79 0117 0x4f | o     111 0157 0x6f
(dle)  16 0020 0x10 | 0      48 0060 0x30 | P      80 0120 0x50 | p     112 0160 0x70
(dc1)  17 0021 0x11 | 1      49 0061 0x31 | Q      81 0121 0x51 | q     113 0161 0x71
(dc2)  18 0022 0x12 | 2      50 0062 0x32 | R      82 0122 0x52 | r     114 0162 0x72
(dc3)  19 0023 0x13 | 3      51 0063 0x33 | S      83 0123 0x53 | s     115 0163 0x73
(dc4)  20 0024 0x14 | 4      52 0064 0x34 | T      84 0124 0x54 | t     116 0164 0x74
(nak)  21 0025 0x15 | 5      53 0065 0x35 | U      85 0125 0x55 | u     117 0165 0x75
(syn)  22 0026 0x16 | 6      54 0066 0x36 | V      86 0126 0x56 | v     118 0166 0x76
(etb)  23 0027 0x17 | 7      55 0067 0x37 | W      87 0127 0x57 | w     119 0167 0x77
(can)  24 0030 0x18 | 8      56 0070 0x38 | X      88 0130 0x58 | x     120 0170 0x78
(em)   25 0031 0x19 | 9      57 0071 0x39 | Y      89 0131 0x59 | y     121 0171 0x79
(sub)  26 0032 0x1a | :      58 0072 0x3a | Z      90 0132 0x5a | z     122 0172 0x7a
(esc)  27 0033 0x1b | ;      59 0073 0x3b | [      91 0133 0x5b | {     123 0173 0x7b
(fs)   28 0034 0x1c | <      60 0074 0x3c | \      92 0134 0x5c | |     124 0174 0x7c
(gs)   29 0035 0x1d | =      61 0075 0x3d | ]      93 0135 0x5d | }     125 0175 0x7d
(rs)   30 0036 0x1e | >      62 0076 0x3e | ^      94 0136 0x5e | ~     126 0176 0x7e
(us)   31 0037 0x1f | ?      63 0077 0x3f | _      95 0137 0x5f | (del) 127 0177 0x7f


ASCII Name Description C Escape Sequence
nul null byte \0
bel bell character \a
bs backspace \b
ht horizontal tab \t
np formfeed \f
nl newline \n
cr carriage return \r
vt vertical tab
esc escape
sp space

সি প্রোগ্রামিং

সি প্রোগ্রামিং



১) কোর্সের শিরোনাম  -কম্পিউটার প্রোগ্রামিং এর প্রাথমিক ধারণা


২) কাদের জন্য কোর্স? (স্কুল, কলেজ, বিশ্ববিদ্যালয়, সবার জন্য)

কোর্সটি মূলতঃ বিশ্ববিদ্যালয়ের প্রথম বর্ষের ছাত্রদের উপয়োগী। তবে হাইস্কুলের ছাত্ররাও এটি বুঝতে পারবে। Class IX বা তার পরের যে কেউ এটি করতে পারে। আরও ছোটরা যে করতে আরবে না তা নয়- কিন্তু তাদের জন্য প্রোগ্রামিং শেখার চেয়ে গণিত শেখা বেশি জরুরী বলে আমি মনে করি।

৩) কোর্সে কয়টি লেকচার থাকবে?

নীচে কোর্সটির সবগুলো টপিক দেয়া হল
লেকচার ১ – সি প্রোগ্রামিং – লেকচার ১: কম্পিউটার প্রোগ্রামিং এবং কম্পিউটারের ডাটা টাইপ
লেকচার ২ – সি প্রোগ্রামিং – লেকচার ২: এক্সপ্রেশন, ভেরিয়েবল ও এর নামকরণ এবং রিজার্ভ ওয়ার্ড  
 লেকচার ৩ – সি প্রোগ্রামিং: মেমোরিতে ভেরিয়েবলের অ্যাড্রেস, printf ফাংশন, প্রথম প্রোগ্রাম
লেকচার ৪ – সি প্রোগ্রামিং: ইনপুট, অ্যারে এবং বুলিয়ান এক্সপ্রেশন
লেকচার ৫ – সি প্রোগ্রামিং: if স্টেটমেন্ট
লেকচার ৬ – সি প্রোগ্রামিং: while লুপ
লেকচার ৭ – সি প্রোগ্রামিং: for লুপলেকচার ৮ – সি প্রোগ্রামিং – ফাংশন
লেকচার ৯ – সি প্রোগ্রামিং – স্ট্রাকচার
লেকচার ১০ – সি প্রোগ্রামিং – ফাইল ইনপুট আউটপুট
লেকচার ১১ – সি প্রোগ্রামিং – স্ট্রিং অপারেশন
লেকচার ১২ – সি প্রোগ্রামিং – মেমোরি অপারেশন এবং পয়েন্টার
সি ল্যাংগুয়েজের জন্য টুরিং কমপ্লিট প্রশ্নমালা


সি প্রোগ্রামিং – সি ল্যাংগুয়েজ bangla tutorial 125 video




সি প্রোগ্রামিং এর বই সমূহ পি ডি এফ- c programing books pdf

 সি প্রোগ্রামিং এর বই সমূহ পি ডি এফ- c programing books pdf
 লিঙ্ক সমুহঃ
http://www.mediafire.com/download/ty8x8smui82d8lr/C%2B%2B+eBooks+1.rar
http://www.mediafire.com/download/bbnvd6s1965kb7b/C%2B%2B+eBooks+2.rar



সি প্রোগ্রামিং শিখার জন্য কিছু বই.........।। দেখুন কাজে লাগে কিনা ...।
Addison Wesley - Accelerated C++ Practical Programming by Example.chm
Addison Wesley - Advanced CORBA Programming with C++.pdf Addison Wesley - Algorithms, Data Structures, and Problem Solving with C+ PDF
Addison Wesley - Applied C++ Techniques For Building Better Software.chm
Addison Wesley - C++ By Dissection.pdf
Addison Wesley - C++ Coding Standards - 101 Rules Guidelines.chm
Addison Wesley - C++ FAQs (1998) .chm
Addison Wesley - C++ Gotchas .chm
Addison Wesley - C++ Network Programming Vol 1.chm
Addison Wesley - C++ Network Programming Vol 2.chm
Addison Wesley - C++ Primer 3rd Ed.chm
Addison Wesley - C++ Standard Library. A Tutorial And Reference.chm
Addison Wesley - C++ Templates - The Complete Guide.chm Addison Wesley - Data Structures and Problem Solving with C++ (2003).pdf
Addison Wesley - Designing Components with the C++ STL.pdf Addison Wesley - Design Patterns Explained.chm
Addison Wesley - Effective C++ Third Edition 55 Specific Ways to Improve Your Programs and Designs.chm
Addison Wesley - Efficient C++ Performance Programming Techniques.chm
Addison Wesley - Essential C++.chm
Addison-Wesley - Exceptional C++ Style 40 New Engineering Puzzles, Programming P roblems and Solutions - Herb Sutter.chm Addison Wesley - Inside the C++ Object Model (1996).chm Addison Wesley - Modern C++ Design Generic Programming and Design Patterns Applied.chm Addison Wesley - More Exceptional C+ +.chm
Addison Wesley Professional - Beyond The C++ Standard Library - An Introduction To Boost (2005).chm Addison Wesley Professional - C++ Primer 4th Ed (2005).chm
Addison Wesley - The C++ Programming Language 3Rd Ed Bjarne Stroustrup.pdf
Addison Wesley - The C++ Programming Language (3rd) SPECIAL EDITION , B Stroustrup.pdf
Addison Wesley - The.C++ Standard Library - A Tutorial and Reference.chm
Addison Wesley - The Design And Evolution Of C++ Bjarne Stroustrup.pdf
Addison Wesley - UNIX Network Programming Volume 1.3rd Ed The Sockets Networking API-LiB.chm
Alavoor Vasudevan - Linux C++ Programming- Howto.pdf
Apress - Cryptography in C and C+ +(2001).chm
Bartosz Milewski - C++ In Action, Industrial Strength Programming.rar
Cambridge Press - The Elements of C++ Style.pdf
Chapman and Hall - C++ for Mathematicians - Edward Scheinerman - (2006).pdf
C++ Journal - Stroustrup's Guide To Learning C++ 1999.pdf Design Patterns - Elements of Reusable Object-Oriented Software.rar
InformIT - Stroustrup, Bjarne - C++ Programming Styles And Libraries (2002).pdf
Jones and Bartlett - C++ Plus Data Structures.pdf Just a brief introduction to C++ data types.pdf
Mcgraw Hill - C++ Demystified.chm
McGraw-Hill,Osborne - C++ Demystified A Self-Teaching Guide.chm Mcgraw Hill - The Art of C++.chm
Network Theory Ltd - An Introduction to GCC.pdf
No Starch Press - How Not To Program In C++.chm
No Starch Press - How Not to Program in C++.pdf
O'reilly - C++ Cookbook.chm O'reilly - C++ In A Nutshell.chm O'reilly - Practical C Programming. 3rd Ed.pdf O'reilly - Programming Embedded Systems in C and C++ (1999).pdf
O'reilly - Secure Programming Cookbook For C And C++.chm Osborn - C++ --Complete Reference (3rd Ed.).pdf
Premier Press C++ Programming for the Absolute Beginner 2001.chm
Premier Press - Game Programming All in One (2002) (C++ Win32).pdf
Prentice Hall - C++ for Business Programming, Second Edition.chm Prentice Hall - C++ GUI Programming with Qt4 (2006).chm
Prentice Hall - C++ How to Program, Fifth Edition.chm Prentice Hall - Core C++ - A Software Engineering Approach 2000.pdf
Prentice Hall - Thinking in C++ Volume 1, 2nd Edition.pdf
Prentice Hall - Thinking in C++ Volume 2, 2nd Edition.pdf Que - C++ Professional Programmer's Handbook.pdf
Que - Optimizing C++.chm Sams - C++.Primer Plus Fourth Edition.chm
Sams - C++ Unleashed.pdf Sams - Tricks of the Windows Game Programming Gurus (1999).pdf
Scott Meyers - Effective STL.pdf Thomson - Beginning C++ Game Programming.chm
Wiley Publishing - C++ for Dummies 5th [2004].pdf
Wiley Publishing - C++ Timesaving Techniques for Dummies.pdf Wiley Publishing - Modeling Derivatives in C++.pdf
Wiley Publishing - You Can Program in C ++ - A Programmer's Introduction (2006).pdf
Wordware Publishing - Memory.Management Algorithms and Implementation in C and C++ Wordware Pub. - C++ Advanced 3D Game Programming with DirectX 9.0 (2003).pdf Wrox - Professional C++.pdf Prentice Hall - C++ How to Program, Fifth Edition- Source Code Thinking in C++ TICPP-2nd-ed-Vol-one Thinking in C++ TICPP-2nd-ed-Vol-two Accelerated C++ Practical Programming by Example by Andrew Koenig and Barbara E. Moo Advanced CORBA® Programming with C++ by Michi Henning and Steve Vinoski Applied C++: Practical Techniques for Building Better Software by Philip Romanik and Amy Munt Beginning C++ Game Programming by Michael Dawson Beyond the C++ Standard Library: An Introduction to Boost by Björn Karlsson Advanced 3D Game Programming Using DirectX 9.0 by Peter Walsh C++ by Dissection by Ira Pohl C++ Coding Standards: 101 Rules, Guidelines, and Best Practices by Herb Sutter, Andrei Alexandrescu C++: The Complete Reference by Herbert Schildt C++ Cookbook by Jeff Cogswell, Christopher Diggins, Ryan Stephens, Jonathan Turkanis C++ Demystified: A Self-Teaching Guide by Jeff Kent Modern C++ Design: Generic Programming and Design Patterns Applied by Andrei Alexandrescu C++ for Business Programming, Second Edition by John C. Molluzzo C++ For Dummies 5th edition by Stephen Randy Davis БИБЛИОТЕКА ПРОГРАММИСТА (Programmers Library - Russian) by Джефф Элджер (Jeff Alger) C++ How to Program, Fifth Edition (sources included) by H. M. Deitel C++ In a Nutshell by Ray Lischner C++ In Action by Bartosz Milewski C++ Plus Data Structures (third edition) by Nell Dale UML C++ Reverse Engineering Tutorial - Windows Platform/C++ Reverse Engineering Overview C Primer 5th Edition by Stephen Prata

সি প্রোগ্রামিং – লেকচার ৩: মেমোরিতে ভেরিয়েবলের অ্যাড্রেস, printf ফাংশন, প্রথম প্রোগ্রাম

সি প্রোগ্রামিং – লেকচার ৩: মেমোরিতে ভেরিয়েবলের অ্যাড্রেস, printf ফাংশন, প্রথম প্রোগ্রাম





মেমোরিতে ভেরিয়েবলের অ্যাড্রেস

সি ল্যাংগুয়েজে আমরা যেসব ভেরিয়েবল ব্যবহার করি সেগুলো মেমোরির কোন লোকেশনে আছে তা বেশিরভাগ সময়ে জানার দরকার হয় না। তবে কিছু কিছু সময়ে সঠিক address জানার সরকার হয় না। তবে কিছু কিছু সময়ে দরকার হয়। যেমন scanf ফাংশনটা ব্যবহার করার সময় ভেরিয়েবলের address ব্যবহার করা হয়।
ধরা যাক আমাদের একটা ভেরিয়েবল আছে-
int prime;
এখন এটা থেকে বলার উপায় নেই যখর প্রোগ্রাম রান করবে তখন এটা মেমোরির কোন লোকেশনে থাকবে। আমরা একটা সংখ্যা ধরে নেই এখানে।
ধরা যাক address হচ্ছে 100.
এখন এই address পাওয়ার জন্য আমরা ভেরিয়েবলের নামের আগে অ্যামপারসেন্ড সাইন (&) ব্যবহার করি- যেমন &prime লিখলে আমরা পাব prime ভেরিয়েবলের লোকেশন।
এটা আমরা যখন pointer ব্যবহার করব তখন আরও ভালভাবে দেখব।

printf ফাংশন

আমরা জানি কম্পিউটার প্রোগ্রাম রেখার জন্য ৩ টি বিষয় জানতে হয়। ইনপুট, আউটপুট এবং প্রসেসিং। এখন আমরা আউটপুট দেখব।
আউটপুটের জন্য সি ল্যাংগুয়েজে আমরা printf ফাংশন ব্যবহার করি।
ফাংশনের একটা বা এর অধিক প‌্যারামিটার থাকে। প্রথমটা একটা স্ট্রিং যেটা আবশ্যিক। কোটেশন মার্ক দিয়ে স্ট্রিংটা লিখব।
printf(" ....write something here ...");
এর পরে কমা দিয়ে এক বা একাধিক expresssion লিখতে পারি। Expresssion এর মান কোথায় বসবে সেটা আমরা টাইপ অনুযায়ী প্রথম স্ট্রিং প‌্যারামিটারের মধ্যে লিখে দেব।
printf(" ....write something %d and %d and %d ...", a, 20, p+q-r);
এখানে আমরা তিনটা %d ব্যবহার করেছি যেটা নম্বর বুঝাতে ব্যবহার হয়- আমরা কম্পিউটারকে বলছি এই তিন যায়গায় আমরা তিনটা মান বসাতে চাই এবং পরে কমা দিয়ে তিনটা expresssion লিখেছি সেই মানগুলো কম্পিউটারকে দেয়ার জন্য।
এখন আমরা কিছু উদাহরণ দেখি-
ধরা যাক আমরা “Bangladesh” এই স্টিংটা প্রিন্ট করব। তাহলে আমাদের লিখতে হবে-
printf("Bangladesh");
আমরা যদি কোন একটা সংখ্যা লিখতে চাই যেটা একটা ভেরিয়েবলে সংরক্ষিত আছে তাহলে আমরা লিখতে পারি-
int x;
x=45;

printf("%d", x);
তাহলে কনোসোলে (কাল যে উইন্ডো আমরা মনিটরে দেখি সেটা করসোল) আমরা 45 লেখা হতে দেখব। এখানে %d দিয়ে আমরা বোঝাচ্ছি আমাদের একটা সংখা লিখতে হবে যেটা x ভেরিয়েবলের মধ্যে আছে।
সংখ্যা আমরা স্ট্রিং এর মধ্যেও লিখতে পারি। ধরা যাক আমরা লিখতে চাই Price = 475 যেখানে 475 মানটা আমাদের p ভেরিয়েবলে আছে, তহলে লিখব এভাবে
int p;
p=475;

printf("Price= %d", p);
আমরা যদি দুইটা সংখ্যার যোগফল লিখতে চাই তাহলে এভাবে লিখতে পারি-
int a,b;

a=10;
b=20;

printf("Sum of %d and %d is %d", a, b, a+b);
তাহলে মনিটরে দেখাবে
Sum of 10 and 20 is 30
এখানে আমাদের তিনটা %d আছে এবং সেগুলো কনসোলে দেখানোর সময়ে তিনটা মান দিয়ে রিপ্লেস হবে যেগুলো আরা পরপর কমা দিয়ে লিখেছি- a, b, a+b.
এখানে একটা বিষয় বুঝতে হবে আমরা যদি সঠিক মান কমা দিয়ে না দেই তাহলে ভুল জিনিসই কম্পিউটার দেখাবে।
যেমন
printf("Sum of %d and %d is %d", a+b, b, a);
এর আউটপুট হবে-
Sum of 30 and 20 is 10
প্রথম %d এর যায়গায় প্রথম মান (a+b), দ্বিতীয় %d এর যায়গায় দ্বিতীয় মান (b) এবং তৃতীয় %d এর যায়গায় তৃতীয় মান (a) বসবে। কারণ আমরা সেভাবেই বলে দিয়েছি।

প্রোগ্রাম

এখন আসুন আমরা একটা প্রোগ্রাম লিখি-
#include <stdio.h>

int main()
{
    printf("Hello, world!n");

    return 0;
}
এই প্রোগ্রামের প্রথম লাইনে আছে একটা include স্টেটমেনট। এটা কম্পাইলারকে বলে দিচ্ছে আমারা stdio লাইব্রেরি টা ব্যবহার করব। এই লাইবেরি এর মধ্যে printf ফাংশনটা আছে। এরপর আমরা একটা ব্লক লিখেছি। যেটা একটা ফাংশন এবং এর নাম সাধারণত main হতে হয় এবং () চিহ্ন দিতে হবে। এরপরে { } চিহ্ন দুটি আমাদের ব্লকের সীমানা নির্দেশ করবে। এই ব্লকের মধ্যে আমরা আমাদের printf ফাংশনটা লিখেছি। এরপরে শেষ লাইন হিসাবে return 0; লিখতে হবে। কেন সেটা আমরা ফাংশন শেখার সময় জানব। main এর আগে int কেন দিতে হবে সেটাও তখন জানব।
সি ল্যাংগুয়েজে small/capital letter গুরুত্বপূর্ণ। main এর যায়গায় Main লেখা যাবে না।
আপনারা এটা রান করে দেখুন।

সি প্রোগ্রামিং – লেকচার ২: এক্সপ্রেশন, ভেরিয়েবল ও এর নামকরণ এবং রিজার্ভ ওয়ার্ড

সি প্রোগ্রামিং – লেকচার ২: এক্সপ্রেশন, ভেরিয়েবল ও এর নামকরণ এবং রিজার্ভ ওয়ার্ড


]

 এক্সপ্রেশন (Expression)


কম্পিউটার প্রোগ্রামিং এর জন্য আমরা বিভিন্ন এক্সপ্রেশন ব্যবহার করি।
নীচে কয়েকটি এক্সপ্রেশন দেয়া হলঃ
1+3
5>9
এক্সপ্রেশনগুলোর সবসময় একটা মান থাকে। যেমন প্রথম এক্সপ্রেশনের মান 4. এটা একটা “Numerical Expression”. এই ধরণের এক্সপ্রেশনের মান সে কোন সংখ্যা হতে পারে।
দ্বিতীয় এক্সপ্রেশনটা একটা Boolean Expression. যে ধরণের এক্সপ্রেশনের মান হয় TRUE অথবা FALSE হবে। আমাদের দ্বিতীয় এক্সপ্রেশনের মান FALSE.
আমরা যদি 13 > 6 লিখি তাহলে সেটাও একটা Boolean Expression হবে যার মান TRUE.
আমাদের প্রোগ্রামে উভয় ধরণের এক্সপ্রেশনের বহুল ব্যবহার লক্ষ্য করব।

ভেরিয়েবল

আমরা আমাদের প্রোগ্রাম যে কম্পিউটারে run করব তাতে বিভিন্ন পরিমান RAM বা মেমোরি থাকতে পারে। আমরা 1GB, 2GB, 4GB, 8GB ইত্যাদি সাইজের মেমোরি ক্ষমতার কম্পিউটার দেখে থাকি (২০১২ সাল)। আমরা এখানে মেমোরি বলতে শুধু Random Access Memory বা RAM কেই বোঝাবো।
কম্পিউটারের মেমোরির প্রত্যেকটা বাইটকে একটা সংখ্যা দিয়ে চিহ্নিত করা হয়। একটা কম্পিউটারে 4 গিগাবাইট (4294967296 বাইট) মেমোরি থাকলে আমরা বাইটগুলোকে 0 থেকে 4294967295 পর্যন্ত সংখ্যা দিয়ে চিহ্নিত করি। এই সংখ্যাগুলোকে আমরা বলি মেমোরি অ্যাড্রেস (address)। প্রোগ্রাম চলার সময় মেমোরিতে বিভিন্ন মান রাখার দরকার হয়।
যেমন আমরা হয়ত 1000 অ্যাড্রেসে ‘A’ লিখতে চাই। তাহলে সেটা আমরা CPU কে বলতে পারি
[1000] <— ‘A’
কিন্তু এভাবে সংখ্যা ব্যবহার করে প্রোগ্রাম লেখা কুবই অসুবিধাজনক। সেজন্য আমরা মেমোরির বিভিন্ন অ্যাড্রেস না লিখে আমরা অ্যাড্রেসকে চিহ্নিত করার জন্য বিভিন্ন নাম ব্যবহার করি। যেমন 1000 অ্যাড্রেসকে আমরা হয়ত বলতে পারি grade.
তাহলে আমরা CPU কে বলতে পারি grade এর মধ্যে ‘A’ রাখতেঃ
grade <— ‘A’
এখানে একটা ব্যাপার মনে রাখতে হবে এভাবে অ্যাড্রেসকে নামকরণ করা হয় আমাদের মানুষদের বোঝার সুবিধার জন্য। কম্পাইলার এটাকে শেষ পর্যন্ত সংখ্যা দ্বারাই চিহ্নিত করে কিন্তু সেটা আমাদের না জানলেও চলে।
এইভাবে মেমোরি অ্যাড্রেসকে যেসব নাম দ্বারা চিহ্নিত করি সেগুলোকে আমরা বলি ভেরিয়েবল। যেগুলোর মধ্যে যেকোন সময় যেকোন মান রাখতে পারি।

ভেরিয়েবল declaration

সি ল্যাংগুয়েজে ভেরিয়েবল ব্যবহার করার জন্য প্রথমে সেটা declare করে নিতে হয়। Declare করা মানে হচ্ছে ভিরিয়েবলের নাম এবং এটার টাইপ প্রথমে লিখে নিতে হবে। কোন কোন ল্যাংগুয়েজে সেটা করকার হয় না।
যেমন:
int number;
এভাবে আমরা একটা পূর্ণ সংখ্যা বা ইন্টেজার ভেরিয়েবল declare করে নিলাম যেটার নাম হচ্ছে number।
একটা ভেরিয়েবলের টাইপ যদি int হয় তরে তার মধ্যে সবসময় (সাধারণত) পূর্ণ সংখ্যাই রাখা যায়।

এসাইনমেন্ট (Assignment)

আমরা কোন একটা ভেরিয়েবলের মধ্যে যে কোন সময় একটা মান রাখতে পারি বা assign করতে পারি।
এটা করার জন্য প্রথমে আমরা একটা ভেরিয়েবলের নাম লিখে তারপর = চিহ্ন দিয়ে পরে expression লিখব।
যেমন নীচে ২টা উদাহরণ দেয়া হলঃ
number = 5;
number = 3+5-1;
এখানে কম্পিউটার সবসময় প্রথমে ডানপাশের expression এর মান প্রথমে বের করে নিয়ে তারপর = চিহ্নের বামপাশের ভেরিয়েবল এর মধ্যে রাখবে।

Identifier এর নামকরণ

সি ল্যাংগুয়েজে ভেরিয়েবল, ফাংশন ইত্যাদির নামকরণের ক্ষেত্রে কিছু বিধিনিষেধ আছে।
আমরা এখানে ৪টি সেট তৈরি করি যেসব আমরা আমাদের identifier এর মধ্যে ব্যবহার করতে পারব।
১. _
২. a-z
৩. A-Z
৪. 0-9
শুরুতে ১,২ বা ৩ নম্বর সেট থেকে যেকোন একটা নিতে হবে তারপর ইচ্ছা করলে যেকোন সেট থেকে যেভাবে খুশি চিহ্ন নেয়া যাবে।
সুতরাং identifier এর শুরুতে সংখ্যা (1,2 ইত্যাদি) থাকতে পারবে না। তবে শুরুতে _ (underscore) দেয়া যাবে।
সঠিকঃ
a
abc
num1
CiTy
_salary
member_id
ভুলঃ
2ndcar
customer#

রিজার্ভ ওয়ার্ড

C ল্যাংগুয়েজে আমরা কিছু word আমাদের নিজেদের identifier হিসাবে ব্যবার করতে পারি না। যেগুলোকে রিজার্ভ ওয়ার্ড বলে। রিজার্ভ ওয়ার্ডগুলো শুধু তাদের জন্য নির্ধারিত নির্দিষ্ট কাজে ব্যবহার করা যায়।
নীচের লিষ্টে ১/২ বার চোখ বুলিয়ে নিন। এগুলো (বা এই কোর্সের অন্য কোন কিছু) মুখস্থ করার চেষ্টা করার দরকার নেই।
auto if break int case long char register continue return default short do sizeof double static else struct entry switch extern typedef float union for unsigned goto while enum void const signed volatile

সি প্রোগ্রামিং – লেকচার ১: কম্পিউটার প্রোগ্রামিং এবং কম্পিউটারের ডাটা টাইপ

সি প্রোগ্রামিং – লেকচার ১: কম্পিউটার প্রোগ্রামিং এবং কম্পিউটারের ডাটা টাইপ


কম্পিউটার প্রোগ্রামিং কি?

কম্পিউটার প্রোগ্রাম হচ্ছে CPU কে দেয়া একটা নির্দিষ্ট Instruction sequence. কম্পিউটার নিজে থেকে কোন কাজ করতে পারে না। কোন কাজের পর কোন কাজ করবে সেগুলো একটার পর একটা প্রোগ্রামে বলে দেয়া হয়। কম্পিউটার প্রোগ্রম কে আমরা রান্নার সাথে তুলনা করতে পারি। যেক্ষেত্রে অধ্যাপিকা সিদ্দিকা করিরের “রান্না খাদ্য পুষ্টি” বইটা হবে এ্কটা প্রোগ্রামিং এর বই। আর CPU হচ্ছে রাঁধুনি। একজন রাঁধুনি এই বইয়ের বিভিন্ন প্রোগ্রাম দেখে বিভিন্ন জিনিস রান্না করতে পারবেন। যেমন আমরা যদি রাঁধুনিকে বলি কাচ্চি বিরিয়ানি রান্না করতে তাহলে সে প্রথমে কাচ্চি বিরিয়ানি প্রগ্রামটা রান করবে। এই প্রগ্রামে বলে দেয়া আছে কিভাবে কাচ্চি বিরিয়ানি রান্না করতে হবে। প্রথমে মাংস ধুয়ে লবন মেখে ৩০ মিনিট রাখতে হবে। তারপর পেয়াজ ঘিয়ে বাদামি করে ভেজে ঠান্ডা হখে গুড়ো করতে হবে। এভাবে নয়টা ইন্সট্রাকশন পরপর দেয়া আছে। যখন একজন রাঁধুনি একটার পর একটা এই ইন্সট্রাকশন গুলো অনুযায়ী কাজ করে যাবে শেষে দেখা যাবে আউটপুট হিসাবে আমরা কাচ্চি বিরিয়ানি পাব। যদি ইন্সট্রাকশন গুলোতে কোন ভুল (আমরা যেটাকে বলব bug) খাকে তাহলে উল্টাপাল্টা রেজাল্ট পাব। ধরা যাক আমাদের রাঁধুনি শুধু ম্যান্ডারিন (চাইনিজ) ভাষা জানে, তাহলে হয় তাকে ম্যান্ডারিন ভাষায় ইন্সট্রাকশন দিতে হবে, নাহয় একজন দোভাষী অনুবাদক লাগবে (যেটাকে আমরা Compiler বলি)।

কম্পিউটারকে দিয়ে আমরা একইভাবে কোন একটা কাজ করাতে পারি। তার জন্য একটার পর একটা ইন্সট্রাকশন লিখে দিতে হবে। এই ইন্সট্রাকশন লিখে দেয়ার প্রক্রিয়াটা হচ্ছে কম্পিউটার প্রোগ্রামিং।
কম্পিউটার প্রোগামিং এর জন্য আমরা C ল্যাংগুয়েজ ব্যবহার করব। কম্পাইলার হিসাবে আপনারা http://ideone.com/ ঠিকানার IDE টা ব্যবহার করতে পারেন প্রাথমিকভাবে।

কম্পিউটারের ডাটা টাইপ


কম্পিউটার এ আমরা সাধারণত ৩ ধরনের ডাটা টাইপ ব্যবহার করি।

প্রথমটা নাম্বার- বিভিন্ন ধরনের সংখ্যা আমরা ব্যবহার করতে পারি।

15
23.8
-67
-13.78

এরপর আছে String (স্ট্রিং). এক বা একাধিক বর্ণ বা সংখ্যা বা চিহ্ন ব্যবহার করে কোন তথ্য উপস্থাপন করতে হরে আমরা String ব্যবহার করি।
নিচে কিছু String এর উদাহরণ দেয়া হলঃ

“Dhaka”
“বাংলাদেশ”
“সিরাজগঞ্জ-৭”
“১২৫৬”
“12387”
“আমার সোনার বাংলা আমি তোমায় ভালবাসি”

String বোঝানোর জন্য আমরা কোটেশন মার্ক (“) ব্যবহার করি। যেমন 12367 একটা নাম্বার কিন্তু “12367” একটা String।

আর এক ধরণের ডাটা টাইপকে আমরা বলি boolean (বুলিয়ান) বা সংক্ষেপে bool। এটাতে শুধুমাত্র True বা False এই দুইটা মান রাখা যায়।
০ থেকে ৯ ব্যবহার করে যেমন সব সংখ্যা লেখা যায় তেমনি এই তিন ধরনের ডাটা টাইপ ব্যবহার করে আমরা যে কোন ধরণের ডাটা কম্পিউটারে উপস্থাপন করতে পারি।


C ল্যাংগুয়েজে আমরা যেসব primitive ডাটা টাইপ ব্যবহার করি সেগুলো হলঃ
int, char, short, long, float, double
এই টাইপগুলো ব্যবহার করে সব ধরনের তথ্য উপস্থাপন করা যায়।