18 নাম্বার পয়েন্ট থেকে ম্যাট্রিক্স শুরু ।
introducing c++
c++ almost c language এঁর মতোই ।এটা object oriented programming language . এবং এটা standard template library (STL) সাপোর্ট করে ।
c++ নিয়ে কাজ করার জন্য আমাদের file extension দিতে হবে introduction.cpp এভাবে ।
basic difference between C and C++
আমরা যেমন c programming language এ #include <stdio.h> ইম্পোরট করে নিতে হয় ঠিক c++ এ কাজ করার জন্য আমাদের #include <iostream> ইম্পোরট করে নিতে হবে । iostream mean input output stream . এবং stream এঁর মানে প্রোগ্রামিং এঁর ভাষায় অনেকগুলো বাইটের একটা গ্রুপ ।
আমরা c programming language কিছু প্রিন্ট করার জন্য printf() ব্যাবহার করতাম কিন্তু c++ এ কিছু প্রিন্ট করার জন্য আমরা ব্যাবহার করব cout << "hello world " এমন সিনট্যাক্স
এটা করলে একটা এররর দিবে কারণ cout নামে সে কাওকে চিনে না । তাকে চিনাতে হবে std এঁর একটা প্রপার্টি হচ্ছে cout । এভাবে বললে সে বুঝতে পারবে ।
এখানে এক লাইনে কিভাবে মাল্টিপল কিছু প্রিন্ট করা যায় সেটাও দেখানো হয়েছে ।/ #include <iostream> int main(){ std::cout << "hello world " << "another text\n"; std::cout << 1 + 3; return 0; }
আমরা একটা কিছু নতুন লাইনে প্রিন্ট করার জন্য \n ব্যাবহার করতাম সেঁতা c++ এ endl এঁর মাধ্যমে বুঝানো হয় । এখানে \n দেওয়া যেই কথা এটা করাও সেই কথা । thats up to you .
int main(){ std::cout << "hello world " << std::endl << "another text"; return 0; }
c++ এ কিছু প্রিন্ট করার সময় format specifier দিতে হয় না । সে নিজেই বুঝেই নেয় ।
int a = 100; std::cout << a; std::cout << "there have a value. thats is " << a << std::endl;
এইযে বার বার std::cout তারপর std::endl এভাবে লেখতে হচ্ছে এটার ঝামেলা না করতে চাইলে । গ্লোবালি ডিক্লার করে রেখে দিতে পারি ।
#include <iostream> using namespace std; int main(){ cout <<"hi" << endl }
কিভাবে c++ এ float নাম্বার প্রিন্ট করব । c programming এ আমরা format specifier এঁর মাধ্যমে বলে দিতে পারতাম যে দ্শমিকের পর কত ঘর দেখবে । কিন্তু c++ এতো format specifier নেই । তার জন্য আমরা কি করতে পারি .
steps 1 : #include <iomanip> steps 2 : float a = 10.1289; cout << fixed << setprecision(2) << a << endl; // setprecision এঁর জন্য আলাদা একটা header অ্যাড করতে হচ্ছে <iomanip>
এই যে আমরা এত এত header আলাদা আলাদা করে অ্যাড করতেছি । এটা সব সময় মনে রাখা অনেক কঠিন । এঁর জন্য কি করা যেতে পারে ? সব header file একসাথে লোড করে নিতে পারি । এটা একটু মেমরি কমজিউমিং একটা ব্যাপার । তবে কাজ করতে করতে যে আটকে যাবে তেমন না । তাই আমরা এভাবে অ্যাড করতে পারি । এটার মাধ্যমে c programming এঁর header গুলো অ্যাড হয়ে যাবে । তখন আমরা c programming এঁর printf() ব্যাবহার করতে পারব ।
#include <bits/stdc++.h> 👈👈👈👈 এই হেডারটা অ্যাড করে নিব শুধু । using namespace std; int main() { float a = 10.1289; cout << fixed << setprecision(2) << a <<endl; return 0; }
c++ এ কিভাবে ইউজার থেকে ইনপুট নিতে হয় ।
#include <bits/stdc++.h> 👈👈👈👈 এই হেডারটা অ্যাড করে নিব শুধু । using namespace std; int main(){ int num, num2; char name[100] /* char ইনপুট নেওয়ার ক্ষেত্রে স্পেস পাইলে সে মনে করে এখানে char টা শেষ । আমরা c এঁর gets() ব্যাবহার করতে পারি । তাছাড়া c++ এ করতে চাইলে cin.getline(name, 100); ব্যাবহার করব */; cin >> num; // cin এঁর মাধ্যমে ইনপুট নেওয়া যায় cin >> num >> num2; // to take input multiple cin.getline(name, 100); // এঁর মাধ্যমে স্ট্রিং space সহ ইনপুট নেওয়া জায় return 0; }
typecasting
int double a = 12.13445; int x = int(a);
nameSpace
আমরা এগের উদাহরণ গুলোতে namespace নিয়ে কাজ করেছি । আসলে এই namespace কি ? namespace হচ্ছে একটা গ্রুপ । যেমন আমরা c তে struct ব্যাবহার করেছি । সেরকম এটা একটা জিনিস অনেক কিছুকে সে হোল্ড করে রাখে ।
#include <bits/stdc++.h> using namespace std; namespace one { void fun() { cout << "i am namespace 1";}} namespace two { void fun() { cout << "i am namespace 2";}} // namespace variable নিয়ে কাজ করা যায় using namespace one; // 👈👈👈👈👈👈👈 int main() { one::fun(); // অথবা fun() return 0; }
condition, switch statement
সব প্রোগ্রামিং ল্যাঙ্গুয়েজের মতোই . মনে রাখবে char প্রকাশ করা হয় single quatation দিয়ে ' '
loop
সব প্রোগ্রামিং ল্যাঙ্গুয়েজের মতোই . for, while, do while, etc etc
array
#include <iostream> using namespace std; int main(){ int n[5] = {3, 2, 3, 4, 5}; // for (int i = 0; i < sizeof(n) / sizeof(n[0]); i++){n[i] = i;} for (int i = 0; i < sizeof(n) / sizeof(n[0]); i++){ cout << n[i] << endl;} return 0; }
// string int main(){ char name[100] = "rash\0edul"; cout << name << endl; /* input নেওয়ার ক্ষেত্রে খেয়াল রাখতে হবে না cin কিন্তু স্পেস পাইলে সেখানে নাল ধরে সেখানেই স্ট্রিংটাকে শেষ করে দিবে । এঁর জন্য gets() বা একটু আগে যে মেথড দেখানো হয়েছে সেঁটা করতে পারেন । */ }
function and pointer in c++
c তে যেমন কনসেপ্ট ছিল ঠিক তেমনি c++ এও
#include <iostream> using namespace std; void withOutPointer(int x) { x = 10;} void withPointer(int *x) { *x = 100;} int main(){ int x = 1; withOutPointer(x); cout << "from main function -> value is " << x << " no effect " << endl; // no effect withPointer(&x); cout << "from main function -> value is " << x << " effected for pointer" << endl; // no effect return 0; }
pointer to/of pointer
c programming এর মতোই । যদি ভুলে যেয়ে থাক তাহলে এই লিঙ্ক এ ক্লিক করে দেখে নাও ।
Dynamic memory allocation
আমাদের কম্পিউটারে ২ ধরণের মেমরি থাকে একটা stack আর একটা heap,
stack কি করে ? আমরা যখন কোণ variable or array ডিক্লার করি তখন সেগুলোকে এই এখানে থাকে । বা কম্পাইল টাইমে যেগুলো পায় সেগুলোকে এখানে রেখে দেয় ।
heap কি? heap হচ্ছে আমরা যখন রান টাইমে ডাইন্যামিক্যালি এলোকেট করি সেগুলো heap এ আসে । heap, stack এঁর তুলনায় একটু বড় । যদি আমরা stack এ কোণ array ডিক্লার করি তাহলে সাইজের বাহিরে আমরা আর কিছু করতে পারব না । কিন্তু Heap এ চাইলেই পরবর্তীতে জাইগা বাড়ীয়ে নেওয়া যায় ।
প্রথমে c তে কিভাবে কাজ করতাম সেঁটা দেখে নেই ।
// malloc
int main(){
int *p = (int *)malloc(10 * sizeof(int));
for (int i = 0; i < 10; i++){
cout << p[i] << endl;
}
}
// calloc সব ইনডেক্স এ ০ বসিয়ে দিবে ডিফল্ট ভাবে । , দিতে হয় ।
int main(){
int *p = (int *)calloc(10, izeof(int));
for (int i = 0; i < 10; i++){
cout << p[i] << endl;
}
}
// free কি করে? heap e যে dynamic memory allocate হইছিল সেটা মুছে ফেলে ।
c++ এত কিছু করতে হয় না একটা জাস্ট keyword ব্যাবহার করলেই হয় । new নামে একটা keyword .
#include <iostream>
using namespace std;
int main(){
int *p = new int[10];
// int *p = new int[10]{0}; // with define value
for (int i = 0; i < 10; i++){
cout << p[i] << " " << endl;
}
delete p // for delete dynamic allocation
return 0;
}
built in functions
আমরা c programming language এ কিছু ফাংশনের কাজ ম্যানুয়ালি করতাম । যেমন swap(), min(), max(), sort(), ইত্যাদি । এগুলো c++ এ ম্যানুয়ালি করতে হবে না এঁর জন্য ইতিমধ্যেই ফাংশন বানানো আছে ।
swap()
#include <iostream> using namespace std; int main(){ int p[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; swap(p[0], p[1]); // swap function for (size_t i = 0; i < sizeof(p) / sizeof(p[0]); i++){ cout << p[i] << " ";} int a = 10; int b = 200; swap(a, b); cout << "a: " << a << " b: " << b << endl; return 0; }
min(), max()
int main(){ int a = 10, b = 20; int resultMin = min(a, b); int resultMax = max(a, b); cout << resultMin << resultMax << endl; // array তে min, max খুঁজে বের করতে চাইলে প্রথমে । array first index কে ছোট ধরে নিবে // তারপর লুপ চালাবে int max = max(firstIndex, arr[i]) int num[] = {2, 36, 12, 46, 46, 1, 1, 90, 10}; int mn = num[0]; for (int i = 0; i < sizeof(num) / sizeof(num[0]); i++){ mn = min(mn, num[i]); mx = max(mn, num[i]); }; cout << mn << endl; return 0; }
sort()
sort করার সময় ২ তা জিনিস তাকে দিতে হয় , starting point, ending point. , যদি ending point এমন হয় n+3 তাহলে ২ ইনডেক্স পরজন্তু সর্ট হবে ।
#include <iostream>
using namespace std;
int main(){
int num[] = {2, 36, 12, 46, 46, 90, 10};
sort(num,
(num + sizeof(num) / sizeof(num[0]))
);
for (int i = 0; i < sizeof(num) / sizeof(num[0]); i++){ cout << num[i] << endl;}
return 0;
}
Matrix
matrix এ row এবং col থাকে । row এবং col আমরা কোণ একটা ভেলুকে অ্যাক্সেস করতে পারব । ক্লাস ইন্টারে যেমনটা পরেছিলাম । ম্যাট্রিক্স এঁর অনেক প্রকার আছে । যেমন:
Square Matrix [ ex:3 by 3 ],
কর্ণ ম্যাট্রিক্স [diagonal]: কর্ণ বাদে ব্যাকই গুলো শুন্য হবে । (অবশ্যয় square matrix হতে হবে তাছাড়া কর্ণ মিলবে না ) . primary diagonal and secondary diagonal কাকে বলে দেখে নাও
স্কেলার ম্যাট্রিক্সঃ এটা এমন একটা কর্ণ ম্যাট্রিক্স যার সব গুলো কর্ণ সমান হয় ।
Identity Matrix: এটা একটা স্কেলার ম্যাট্রিক্স এঁর মতো কিন্তু এঁর কর্ণের সবগুলোর মান হবে ১
transpose matrix: row, column হবে আর column, row হবে
Symmetric Matrix: A = transpose of A সমান হবে (অবশ্যয় square matrix হতে হবে )
two dimensional matrix ( 2D )
এটা তেমন কিছুই না এটা একটা ম্যাট্রিক্স ।
#include <bits/stdc++.h> /* int a [row][col] [ 2 ] [ 4 ] 1 2 3 4 --> cols 1 -> 0 0 0 0 2 -> 0 0 0 0 */ using namespace std; int main() { int row = 4, col = 4; int a[row][col]; for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ // রো কলাম cin >> a[i][j]; } } // output for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ // রো কলাম cout << a[i][j]; } cout << endl; } return 0; }
4-3 Sum of Diagonal of a Matrix in C++
ইনপুট নিবে row, col, declare a matrix a[row][col] then nested loop, input নিবে a[i][j].
একটা সাম নামে ভেরিয়েবল ডিক্লার কর । সেখানে আগের মতো নেস্টেড লুপ চালাবে । যদি row ==col হয় তবেই সেটা diagonal। তখন তুমি sum+= a[i][j]
Get by Row or Colum from an array or matrix : নিচের ছবিটা দেখ এবং কিভাবে কি করতে হবে বুঝে নাও
এখানে দেখ কলাম সেম মানে অ্যাক্সেস এঁর সময় কলাম চেঞ্জ হচ্ছে না । কিন্তু রো চেঞ্জ হচ্ছে । তাহলে তুমি বুঝতেই পাচ্ছ তোমাকে আগে জানতে হবে কোন কলাম টার ভেলুগুলো দেখতে চাচ্ছে । তার জন্য তুমি একটা ইনপুট নিয়ে নিবে । তারপর row এঁর উপর লুপ চালাবে । তারপর সেগুলোর ভেলু আউটপুট দিবে ।
একই কাজ তুমি রোএঁর জন্যও করতে পার ।
কিভাবে একটা ম্যাট্রিক্স diagonal (কর্ণ বাদে সব মান শুন্য হবে ) কিনা সেটা সফটওয়্যার এঁর মাধ্যমে বুঝতে পারব ?
এই কয়টা ধাপ ঠিক থাকলেই আমরা বুঝতে পারব ।
suare matrix কিনা
row column same অ্যান হলে সেখান থেকেই বের করে দিব ,
i==j হলে continue করব
a[i][j]>0 হয় তাহলে বলব No
তারপর লুপের বাহিরে গিয়ে বলব YES
আরও কিছু কাজ করা যেতে পারি যেমনঃ এটা scalar or indentity matrix কিনা .