الگوریتمستان

یادداشت‌های یک معلم علاقه‌مند به نوشتن از آنچه آموخته و یاد می‌دهد
 

نکات برنامه‌نویسی

نکته‌ای در مورد کلاس‌ها و مجموعه‌ها در ++C

زبان برنامه‌نویسی ++C دو کلاس set و unordered_set را برای پیاده‌سازی مفهوم مجموعه (ظرفی با عناصر غیرتکراری) دارد.

کلاس set علاوه بر بررسی تکراری نبودن عناصر، آنها را به صورت مرتب ذخیره می‌کند. پس اگر بخواهیم برای نگه داشتن عناصری از کلاس دلخواه خودمان از set استفاده کنیم، باید حداقل عملگر > را سربارگذاری کرده باشیم تا ظرف set قابلیت تشخیص ترتیب عناصر را داشته باشد. اما گاهی تعریف کوچکتر بودن برای کلاس مقدور نیست یا از لحاظ مفهومی معنی ندارد. در چنین شرایطی می‌توانیم از کلاس unordered_set استفاده کنیم.

sync_with_stdio در زبان ++C

زبان برنامه‌نویسی ++C علاوه بر ابزارهایی مانند cin و cout برای عملیات I/O، توابع scanf و printf را هم برای همین کارها از زبان برنامه‌نویسی C به ارث برده است. هر کدام از این دو دسته مزایایی دارند که ممکن است بخواهیم از هر دو در برنامه‌نویسی استفاده کنیم. مثلا printf فرمت‌بندی خروجی راحت‌تری نسبت به cout دارد. اما در مقابل استفاده از cout برای کاربری‌های عادی پیچیده‌گی کمتری دارد.

نکته‌ای در محاسبه‌ زمان اجرای کد

برای محاسبه زمان اجرای کد در ++C می‌توان از دو تابع clock یا time استفاده کرد. تابع clock، تعداد کلاک‌های در اختیار برنامه از CPU تا آن لحظه را برمی‌گرداند که با تقسیم بر CLOCKS_PER_SEC به ثانیه تبدیل می‌شود. تابع time، زمان سیستم را بر حسب ثانیه برمی‌گرداند. پس می‌توان از اختلاف دو clock و تقسیم آن بر CLOCKS_PER_SEC یا اختلاف دو time مدت زمان اجرای قطعه کد را به دست آورد.

هدر فایل bits/stdc++.h

هنگام شرکت در مسابقات برنامه‌نویسی تایپ اسم تک تک هدرفایل‌های مورد نیاز برای اجرای برنامه به زبان ++C زمان نیاز دارد. هدر فایل bits/stdc++.h این زحمت را کم می‌کند. زمانی که این هدر را include می‌کنیم، تمام فایل‌های سرآیند استاندارد به برنامه اضافه می‌شوند و اصولا نیاز به اضافه کردن هدرفایل جدیدی نیست. ممکن است به نظر بیاد این اضافه شدن دسته‌جمعی سربار زیادی داشته باشد. اما باید در نظر داشت که حتی اگه اینگونه باشد، برای ما زمان اجرا مهم هست و نه زمان کامپایل برنامه.

نکته‌ای از مسأله‌ Graphical Editor

برای حل سوال Graphical Editor باید هر خط از ورودی بررسی و اگه دستور معتبر بود اجرا شود. اما اگر دستور نامعتبر بود، باید کل خط نادیده گرفته شود. مشکل اینجاست که مشخص نیست چه داده‌هایی و به چه تعداد در اون خط وجود دارند. پس چاره‌ای نیست جز اینکه برای هر ورودی کل خط یکجا خوانده شه و بعد از بررسی معتبر بودن دستور، تصمیم گرفته شود که بقیه داده‌های روی خط تحلیل شوند یا نه. اینجاست که stringstream به کار می‌آید و می‌تواند به ما کمک کند خط رشته ورودی را در صورت نیاز خیلی ساده به عدد تبدیل کنیم یا از پردازش خط صرف‌نظر کنیم.

نکته‌ای از مسأله LC-Display

زمانی که ورودی مسأله از نوع عددی است لزومی ندارد داخل متغیر عددی ذخیره کنیم. گاهی ممکن ذخیره آن به صورت رشته بهتر باشد. مثلا برای مسأله LC-Display باید عدد را از چپ به راست و رقم به رقم پردازش کنیم. پس چه بهتر که به صورت رشته یا آرایه‌ای از کاراکترها ذخیره شود.

تابع popen در زبان ++C

گاهی لازم است یک برنامه خارجی را از برنامه خودمان اجرا و خروجی آن را استفاده کنیم. این برنامه می‌تواند یک برنامه اجرایی دیگر یا یکی از ابزارهای سیستم عامل مانند ping یا حتی اجرای یک برنامه java باشد. آنچه که مهم است اجرا شدن از خط فرمان و تولید خروجی متنی است.

زبان ++C برای این کار تابع popen را دارد که با خط فرمان به شکل فایل برخورد می‌کند. یعنی دستور مد نظرمان را به صورت اسم فایل می‌دهیم و خروجی اجرای آن را به صورت جریان فایلی می‌خوانیم.

نکته‌ای در استفاده از map

ساختمان داده map (یا dictionary) از ابزارهای مهم و کاربردی هر زبان برنامه‌نویسی است که برای برقراری نگاشت بین هر نوع کلید و مقدار متناظر استفاده می‌شود. آرایه‌های معمولی یک عدد صحیح را به عنوان کلید به یک مقدار از هر نوع کلاس یا نوع داده نگاشت می‌کنند. اما وقتی از map استفاده می‌کنیم، این امکان را داریم که از اشیاء کلاس‌ها و انواع داده‌های پیش‌فرض هر زبان برنامه‌نویسی به عنوان کلید استفاده کنیم. در نتیجه پیاده‌سازی بسیاری از عملیات‌ها ساده‌تر می‌شود که کمک بزرگی به حساب می‌آید.