ফাইল (File) ও স্ট্রাকচার (Structure)

আমরা যখন কোড করি তখন দেখা যায় কোডে ভূল হয়, ভূল সংশোধন করে আবার আমরা চেক করে দেখি ঠিক আসে কিনা।  এজন্য আমরা সমস্যায় দেয়া স্যাম্পল টেস্ট দিয়ে যাচাই করে থাকি বা আমাদের নিজেদের কোনো কেইস (case) দিয়ে যাচাই করে থাকি। কিন্তু বার বার সেই কেইস লিখা খুবই বিরক্তিকর কাজ। যদি কেইসটি অনেক বড় হয় তাহলে তো কোনো কথাই নেই। মাঝে মাঝে কোনো কোনো OJ তে ফাইল ইনপুট আউটপুট করতে হয়। আমাদের ফাইলের কাজ সামান্য জানতে হবে। ফাইলে আসলে অনেক কিছু করা যায়, কিন্তু আমাদের বেশি কিছু পারার দরকার নেই। মনে করা যাক আমাদের input.txt ফাইলে ইনপুট নিতে হবে এবং output.txt ফাইলে অউটপুট দিতে হবে। আমরা যা করব তা হলো, পুরো কোডটা সাধারণ ভবে লিখবো তবে কোডের শুরুতে (মেইন ফাংশনের ভেতর ঢুকেই) দুটি লাইন লিখবঃ feopen("input.txt" , "r" , stdin) এবং freopen("output.txt" , "w" , stdout) দরকার মতো ফাইল নাম বসিয়ে দিলেই হবে। এবার যদি প্রোগ্রাম রান করা হয় তাহলে input.txt থেকে ইনপুট পড়ছে আর output.txt  থেকে আউটপুট পড়ছে। আরো একটি উপায় আছে তা হলো fopen ফাংশনের মাধ্যমে। বেশির ভাগ বইয়ে আসলে feopen লিখা থাকে। কিন্তু ইনপুট আউটপুট জন্য ব্যবহার করা সব ফাংশন পরিবর্তন করতে হবে। যেমন, scanf() এর পরিবর্তে লেখতে হবে fscanf() আর printf() এর পরিবর্তে লেখতে হবে fprintf()। কিন্তু এটা বেশ বিরক্তিকর। এছাড়া কেউ যদি terminal এ কম্পাইল ও রান করো তাহলে আরও সহজে ফাইল হতে ইনপুট অউটপুট করতে পারো। আমরা terminal হতে কম্পাইল করার জন্য লেখি "g++ code.cpp"। এরপর রান করার জন্য লেখি "./a.out" (লিনাক্স অপারেটিং সিস্টেমে ) বা "a.exe" (উইন্ডোজ অপারেটিং সিস্টেমে)। আমরা যদি এই রান করার সময় লেখি "a.exe <input.txt>output.txt"  তাহলে আমাদের ইনপুট আর অউটপুটের কাজ হয়ে যাবে। যদি শুধু ইনপুট নিতে চাও তাহলে অউটপুটের অংশটুকু মুছে ফেললেই হবে।

Image result for structure struct name

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

struct Student { char name[30], father[30], address[50]; int birth_date, birth_month, birth_year; int phone; }; Student s, student[50]; scanf("%s" , s.name); scanf("%s" , &student[10].phone); printf("%d\n" , student[5].birth_date);
code.cpp

এখানে প্রথমেই আমরা student নামে একটি স্ট্রাকচার ডিক্লেয়ার করেছি যার মধ্যে আমাদের প্রয়োজনীয় সব ভ্যারিয়েবল ডিক্লেয়ার  করা হয়েছে। এখন এই student নামটা এক রকমের ডেটা টাইপ হিসেবে ব্যবহার করা যাবে। কোডটি খেয়াল কর  একটি ভ্যারিয়েবল s এবং একটি Student টাইপের অ্যারে student তৈরি  করা হয়েছে। এখন ভ্যারিয়েবলের সঙ্গে dot(.) দিয়ে আমরা এর বিভিন্ন ভ্যারিয়েবলগুলো অ্যাক্সেস(access) করতে পারবো।  

কোন মন্তব্য নেই

Blogger দ্বারা পরিচালিত.