C++ Std::ঐচ্ছিক

C Std Aicchika



'std:: ঐচ্ছিক' বৈশিষ্ট্যটি C++17-এ প্রদান করা হয়েছে। 'std::ঐচ্ছিক' ঐচ্ছিক মানগুলির একটি টাইপ-নিরাপদ উপস্থাপনা বা একটি মান থাকার পছন্দকে অনুমতি দেয়৷ 'std::optional' নামক একটি টেমপ্লেট ক্লাসে একটি ঐচ্ছিক মান রয়েছে যা একটি বৈধ মান থাকতে পারে বা নাও থাকতে পারে। কাঁচা পয়েন্টার বা অন্যান্য কৌশলগুলির চেয়ে খালি বা ঐচ্ছিক মানগুলি উপস্থাপন করার জন্য এটি একটি আরও নিরাপদ বিকল্প। 'std:: ঐচ্ছিক' নাল পয়েন্টার ডিরেফারেন্স ত্রুটির সম্ভাবনা কমিয়ে দেয় যাতে ব্যবহারকারীকে একটি মান পুনরুদ্ধার করার আগে স্পষ্টভাবে যাচাই করতে হয়।

উদাহরণ 1:

'ঐচ্ছিক' এবং 'iostream' শিরোনাম ফাইল এই কোড আমদানি করা হয়. আমাদের অবশ্যই এই হেডার ফাইলগুলি আমদানি করতে হবে যাতে আমরা সহজেই তাদের মধ্যে সংজ্ঞায়িত ফাংশনগুলি অ্যাক্সেস করতে পারি। এর পরে, আমরা 'নেমস্পেস std' অন্তর্ভুক্ত করি তাই আমাদের আলাদাভাবে 'std::optional' এবং 'std::cout' এর মতো ফাংশন দিয়ে টাইপ করতে হবে না। আমরা এখানে 'namespace std' ব্যবহার করি। সুতরাং, এখন, আমরা তাদের সাথে 'std' টাইপ না করে 'ঐচ্ছিক' বা 'cout' রাখি।

তারপর, আমরা main() চালু করি এবং 'ঐচ্ছিক' রাখি এবং এটিকে 'int' এ সেট করি এবং 'myNum' ঘোষণা করি। এটি 'std::optional' ভেরিয়েবল ঘোষণা করার জন্য সিনট্যাক্স। তারপর, আমরা “value” নামে আরেকটি ভেরিয়েবল শুরু করি এবং value_or() ফাংশন ব্যবহার করে “myNum” ভেরিয়েবলে একটি মান নির্ধারণ করি। আমরা এই ফাংশনে '99' পাস করি, তাই এটি এই '99'টিকে 'muNum' ভেরিয়েবলে বরাদ্দ করে যদি কোনো মান উপস্থিত না থাকে এবং এটি 'মান' ভেরিয়েবলে সংরক্ষণ করে। তারপর, আমরা এটির নীচে 'cout' রাখি যা এটির উপরে ভেরিয়েবলের জন্য নির্ধারিত মান প্রদর্শন করতে সহায়তা করে।







কোড 1:

# অন্তর্ভুক্ত <ঐচ্ছিক>

# অন্তর্ভুক্ত করুন

নামস্থান std ব্যবহার করে ;

int প্রধান ( ) {

ঐচ্ছিক < int > myNum ;

int মান = myNum মান_বা ( 99 ) ;

cout << 'myNum এর মান হল:' << মান << endl ;

ফিরে 0 ;

}

আউটপুট:



এখানে, আমরা লক্ষ্য করতে পারি যে '99' প্রদর্শিত হয়েছে যার মানে হল যে মানটি উপরে উপস্থিত ছিল না এবং আমরা যে মানটি যোগ করেছি সেটি সেই ভেরিয়েবলের জন্য নির্ধারিত হয়েছে।







উদাহরণ 2:

আমরা প্রথমে হেডার ফাইলগুলি অন্তর্ভুক্ত করি এবং 'নেমস্পেস std' রাখি। এখন, এর নিচে, আমরা 'std::optional' ফাংশন ঘোষণা করি যা 'divideFunc()'। 'লভ্যাংশ' এবং 'ভাজক' এই ফাংশনের দুটি প্যারামিটার। তারপরে আমরা এটির নীচে 'if' ব্যবহার করি যেখানে আমরা একটি শর্ত যোগ করি যা বলে 'ভাজক!= 0'। এটি সন্তুষ্ট হলে, এটি এই বিভাগের উত্তর প্রদান করে কারণ আমরা এর ভিতরে 'রিটার্ন' যোগ করি। অন্যথায়, এটি 'nullopt' প্রদান করে যার অর্থ নিরাপদ-টাইপ মান নেই। এখন, আমরা main() ডাকি। 'std::optional' অনুমান করার জন্য, আমরা 'divideFunc()' রাখি এবং এতে '27, 3' যোগ করি এবং ফলাফলটি 'ভাগফল' ভেরিয়েবলে বরাদ্দ করি।

এখানে, আমরা 'স্বয়ংক্রিয়' কীওয়ার্ডটি ব্যবহার করি যাতে এটি স্বয়ংক্রিয়ভাবে তার ডেটা টাইপ সামঞ্জস্য করে। এর পরে, আমরা 'if' যোগ করি যেখানে আমরা 'has-value' ব্যবহার করি যা নির্ধারণ করে যে একটি টাইপ-মান গৃহীত হয়েছে কিনা। তারপর, আমরা 'cout' রাখি যা 'ভাগফল' ভেরিয়েবলে সংরক্ষিত ফলাফলকে রেন্ডার করে এবং 'অন্য' অংশে একটি বিবৃতি থাকে যা রেন্ডার করে যে ভাজক শূন্য।



কোড 2:

# অন্তর্ভুক্ত করুন

# অন্তর্ভুক্ত <ঐচ্ছিক>

নামস্থান std ব্যবহার করে ;

ঐচ্ছিক < int > divideFunc ( int লভ্যাংশ , int বিভাজক ) {

যদি ( বিভাজক != 0 ) {

ফিরে লভ্যাংশ / বিভাজক ;

}

ফিরে nullopt ;

}

int প্রধান ( ) {

স্বয়ংক্রিয় ভাগফল = divideFunc ( 27 , 3 ) ;

যদি ( ভাগফল আছে_মান ( ) ) {

cout << 'ভাগফল হল:' << ভাগফল মান ( ) << endl ;

} অন্য {

cout << 'ভাজক এখানে শূন্য' << endl ;

}

ফিরে 0 ;

}

আউটপুট:

আউটপুট বিভাজনের পরে ফলাফল রেন্ডার করে যার মানে ভাজক শূন্য নয়। এই দৃষ্টান্তে, 'std::optional' ব্যবহার করা হয় একটি মান বিদ্যমান কিনা তা নির্ধারণ করতে নিরাপদে টাইপ করা হয়।

উদাহরণ 3:

এখানে, আমরা 'std::optional' ভেরিয়েবল ঘোষণা করছি যা main() এর ভিতরে 'সংখ্যা'। তারপর, আমরা 'if' ব্যবহার করি যেখানে আমরা এই 'সংখ্যা' ভেরিয়েবলের সাথে has_value() ফাংশন রাখি। এটি এই 'সংখ্যা' ভেরিয়েবলে একটি মান আছে কি না তা পরীক্ষা করে। যদি 'সংখ্যা' ভেরিয়েবলে একটি মান থাকে, তবে এটি সেই বিবৃতিটি রেন্ডার করে যা আমরা 'if' এর পরে যোগ করেছি। অন্যথায়, এটি সেই বিবৃতিটি রেন্ডার করে যা আমরা 'অন্য' এর পরে রেখেছি।

এখন, আমরা '92' দিয়ে 'সংখ্যা' শুরু করি এবং এর নিচে আবার 'if' ব্যবহার করি যেখানে has_value() ফাংশনটি 'যদি শর্ত হিসাবে'-তে 'সংখ্যা' ভেরিয়েবলের সাথে যোগ করা হয়। এটি 'সংখ্যা' ভেরিয়েবলের একটি মান আছে কিনা তা নির্ধারণ করে। আমরা যে বাক্যটি 'if' এর পরে যোগ করি তা রেন্ডার করা হয় যদি 'সংখ্যা' ভেরিয়েবলের একটি মান থাকে। যদি না হয়, আমরা যে বিবৃতিটি 'অন্য' এর পরে রাখি তা রেন্ডার করা হয়।

কোড 3:

# অন্তর্ভুক্ত করুন

# অন্তর্ভুক্ত <ঐচ্ছিক>

int প্রধান ( ) {

std :: ঐচ্ছিক < int > সংখ্যা ;

যদি ( সংখ্যা আছে_মান ( ) ) {

std :: cout << 'সংখ্যাটি বর্তমান:' << সংখ্যা মান ( ) << std :: endl ;

} অন্য {

std :: cout << 'সংখ্যাটি উপস্থিত নয়।' << std :: endl ;

}

সংখ্যা = 92 ;

যদি ( সংখ্যা আছে_মান ( ) ) {

std :: cout << 'সংখ্যাটি বর্তমান:' << সংখ্যা মান ( ) << std :: endl ;

} অন্য {

std :: cout << 'সংখ্যাটি উপস্থিত নয়।' << std :: endl ;

}

ফিরে 0 ;

}

আউটপুট:

এটি প্রথমে 'অন্য' অংশটিকে রেন্ডার করে কারণ আমরা 'std::ঐচ্ছিক' ভেরিয়েবলের কোনো মান নির্ধারণ করি না। তারপর, পরের লাইনে সেই মানটি প্রদর্শন করার জন্য আমরা এই ভেরিয়েবলের একটি মান নির্ধারণ করি।

উদাহরণ 4:

এখন, আমরা তিনটি 'std::optional' ভেরিয়েবল ঘোষণা করি যা হল 'n1', 'n2', এবং 'n3'। এছাড়াও আমরা “n2” এবং “n3” ভেরিয়েবলের মান নির্ধারণ করি যা যথাক্রমে “29” এবং “45”। 'std::optional' ক্লাসের 'n1' ভেরিয়েবলটি এখানে খালি। এখন, আমরা 'বুলালফা' ব্যবহার করি যা '1' এবং '0' এর পরিবর্তে 'সত্য' বা 'মিথ্যা' আকারে রিটার্ন ফিরিয়ে দিতে সহায়তা করে।

এর পরে, আমরা এই 'std::optional' ভেরিয়েবলগুলির মধ্যে রিলেশনাল অপারেটর ব্যবহার করি এবং প্রতিটি স্টেটমেন্টকে 'cout' এর ভিতরে রাখি যাতে এটি আমাদের যোগ করা তুলনার ফলাফলও রেন্ডার করে। প্রথমে, এটি পরীক্ষা করে যে “n3 > n2”, তারপর “n3 < n2”, “n1 < n2”, “n1 == std::nullopt”। এখানে, 'nullopt' কোন নিরাপদ-টাইপ মান বা নাল তুলনা করার জন্য ব্যবহার করা হয়। তারপর, আমরা আলাদাভাবে 'cout' স্টেটমেন্টের ভিতরে 'n2 == 49' এবং 'n3 == 88' চেক করি।

কোড 4:

# অন্তর্ভুক্ত <ঐচ্ছিক>

# অন্তর্ভুক্ত করুন

int প্রধান ( )

{

std :: ঐচ্ছিক < int > n1 ;

std :: ঐচ্ছিক < int > n2 ( 29 ) ;

std :: ঐচ্ছিক < int > n3 ( চার পাঁচ ) ;

std :: cout << std :: আলফানিউমেরিক ;

std :: cout << 'The n3 > n2' << ( n3 > n2 ) << std :: endl ;

std :: cout << 'The n3 < n2' << ( n3 < n2 ) << std :: endl ;

std :: cout << 'এন1 < n2' << ( n1 < n2 ) << std :: endl ;

std :: cout << 'n1 == শূন্য' << ( n1 == std :: nullopt ) << std :: endl ;

std :: cout << 'দি n2 == 49' << ( n2 == 29 ) << std :: endl ;

std :: cout << 'এন৩ == ৮৮' << ( n3 == ৮৮ ) << std :: endl ;

}

আউটপুট:

C++ প্রোগ্রামটি যেটি আমরা আগে উল্লেখ করেছি সেটি আউটপুটে ফলাফল প্রিন্ট করার সময় 'std::optional' প্রকারের বিভিন্ন পরিবর্তনশীল মানের তুলনা করে।

উদাহরণ 5:

এই কোডে অন্তর্ভুক্ত হেডার ফাইলগুলি হল “iostream”, “fstream”, “ঐচ্ছিক” এবং “স্ট্রিং”। 'fstream' উভয় ফাংশনের সংজ্ঞা রয়েছে যা 'অফস্ট্রিম' এবং 'ifstream' যা আমাদের এই কোডে প্রয়োজন। এখন, আমরা 'নেমস্পেস std' অন্তর্ভুক্ত করি, তাই আমরা একে প্রতিটি ফাংশনের সাথে আলাদাভাবে রাখি না। তারপর, আমরা 'std:optional' ব্যবহার করি এবং 'ReadFileFunc' নামের একটি ফাংশন ঘোষণা করি যেখানে আমরা আর্গুমেন্ট হিসাবে 'const string& f_Name' পাস করি।

তারপর, আমাদের কাছে 'ifstream' রয়েছে যা ফাইলটি পড়তে সাহায্য করে যার নাম 'f_name' ভেরিয়েবলে যুক্ত করা হবে। তারপর, আমরা 'if' ব্যবহার করি যার মধ্যে আমরা শর্তটি অন্তর্ভুক্ত করি যা বলে যে ফাইলটি খোলা না হলে, এটি 'nullopt' প্রদান করে কারণ আমরা এটি 'if' বিবৃতির নীচে যুক্ত করেছি। তারপর, আমরা আরেকটি ফাংশন তৈরি করি যা হল 'ফাইল কনটেন্ট' যা ফাইলটি খোলা হলে ফাইলটিতে বিষয়বস্তু লিখতে সহায়তা করে। এখানে, আমরা আবার 'রিটার্ন ফাইল কনটেন্ট' রাখি যা ওপেন করার পর ফাইলে যোগ করা বিষয়বস্তুও ফিরিয়ে দেয়।

এখন, আমরা এখানে 'main()' কে কল করি যেখানে আমরা 'F_Name' ভেরিয়েবলটিকে 'Sample.txt' ফাইলের নাম দিয়ে আরম্ভ করি যা আমরা খুলতে চাই। তারপরে, আমরা এখানে 'ReadFileFunc()' কল করি এবং এই ফাংশনে 'f_Name' ভেরিয়েবলটি পাস করি যা ফাইলটি পড়ার চেষ্টা করে এবং এর বিষয়বস্তু 'f_content' ভেরিয়েবলে সংরক্ষণ করে। এর নিচে, আমরা 'f_content' ভেরিয়েবলের সাথে 'if'-এ 'has_value()' ব্যবহার করি। যদি এই ভেরিয়েবলে একটি মান থাকে, তবে এটি এটিকে রেন্ডার করে যেমন আমরা 'if' এর নিচে 'cout' যোগ করেছি যেখানে আমরা 'f_content'ও রেখেছি। অন্যথায়, এটি সেই ত্রুটি দেখায় যা আমরা 'অন্য' এর পরে যোগ করেছি।

কোড 5:

# অন্তর্ভুক্ত করুন

# অন্তর্ভুক্ত করুন

# অন্তর্ভুক্ত <ঐচ্ছিক>

#include

নামস্থান std ব্যবহার করে ;

ঐচ্ছিক < স্ট্রিং > ReadFileFunc ( const স্ট্রিং এবং f_নাম ) {

ifstream myFile ( f_নাম ) ;

যদি ( ! আমার কাগজপত্র. খোলা ( ) ) {

ফিরে nullopt ;

}

স্ট্রিং ফাইল সামগ্রী ( ( isstreambuf_iterator < চর > ( আমার কাগজপত্র ) ) , isstreambuf_iterator < চর > ( ) ) ;

ফিরে ফাইল সামগ্রী ;

}

int প্রধান ( ) {

const স্ট্রিং f_Name = 'Sample.txt' ;

স্বয়ংক্রিয় f_content = ReadFileFunc ( f_নাম ) ;

যদি ( f_content আছে_মান ( ) ) {

cout << 'ফাইলের বিষয়বস্তু হল: \n ' << f_content মান ( ) << endl ;

} অন্য {

সের << 'ত্রুটি: এখানে ফাইল খোলা হয়নি' << f_নাম << endl ;

}

ফিরে 0 ;

}

আউটপুট:

এখানে, এটি ত্রুটি বিবৃতি দেখায় যা আমরা প্রদত্ত কোডের ফলাফল হিসাবে 'অন্য' অংশে যোগ করেছি।

উপসংহার

এই টিউটোরিয়ালে, আমরা শক্তিশালী C++ বৈশিষ্ট্যটি অন্বেষণ করেছি যা 'std::optional' এবং ব্যাখ্যা করেছি যে এটি ঐচ্ছিক মানগুলিকে উপস্থাপন করার একটি প্রমিত পদ্ধতি অফার করে, শূন্য রেফারেন্সের প্রয়োজনীয়তা দূর করে এবং স্বচ্ছতা এবং কোড নিরাপত্তা বৃদ্ধি করে। আমরা শিখেছি যে এটি জটিল সমস্যাগুলি ব্যাখ্যা করার এবং অনুগ্রহের সাথে ভুলগুলি মোকাবেলা করার ক্ষমতাও উন্নত করে।