همه‌ی نوشته‌های احمدعلی شفیعی

همیشه آپدیت بودن خوب نیست!

داستان از این‌جا شروع می‌شه که ویندوز ۷ و ۸ در لپ‌تاپ من با یک مشکل کم‌یاب مواجه بودند. و اون هنگ (freez) کردن ناگهانی ویندوز بوده که حتی پس از ری‌استارت هم مشکل حل نمی‌شده و کمی بعد از بوت‌شدن سیستم‌عامل سیستم دوباره هنگ می‌کنه. فکر کنم اصطلاح واکنش‌های زنجیره‌ای مناسب باشه و در این‌جا زنجیره‌ی ما هنگ کردن سیستمه.

چندوقتی به فدورا مهاجرت کردن و واقعا ازش لذت بردم ولی نمی‌تونستم از سی‌شارپ دل بکنم و اصولا برنامه‌نویسی دات‌نتی هستم (اگر این تیکه رو نفهمیدید نتیجه‌ی کلی این که دات‌نت مال ویندوزه و برای برنامه‌نویسی‌ش هم باید ویندوز داشت) و حتی wine هم کمک نکرد (wine شبیه‌ساز ویندوز در سیستم‌عامل‌های لینوکسیه و تا حد خوبی هم جواب می‌ده ولی برای من جواب نداد!) و من دوباره به ویندوز بازگشتم (دقیقا روز قبل از انتشار فدورا ۱۸! باورتون می‌شه؟!؟)

خوب بعد از نصب دوباره‌ی ویندوز طبق عادت ویندوز آپدیت رو باز کردم و همه‌ی آپدیت‌های را برای دانلود و نصب انتخاب کردم. در همین حین واکنش‌های زنجیره‌ای هنگ سیستم‌م دوباره شروع شد و من مجبور شدم همون اول کاری دوباره ویندوز نصب کنم!

این دفعه به پیشنهاد مهدی آپدیت‌ها رو دونه به دونه نصب می‌کردم و قبل از نصب هم یه restore point می‌ساختم که اگر مشکلی پیش اومد بشه برگشت به مرحله‌ی قبلی. حدود ۲۰ تا آپدیت بود و از شانس خوب بنده  دقیقا آپدیت بیستم که آپدیت درایور Lan سیستم بود باعث این مشکل بود و پس از سرچ توی گوگل فهمیدم که مشکل ریشه داره و دلیل هنگ‌های زنجیره‌ی ویندوز ۷ من هم همین بوده!

خواستم بگم همیشه آپدیت بودن خوب نیست مخصوصا اگر آپدیت‌کننده‌تون باگ داشته باشه!

پی‌نوشت۱: هنوز دنبال راه فرارم که برم فدورا رو هم در کنار ویندوز نصب کنم!

پی‌نوشت۲: درایوری که مشکل داشته این بوده:

Qualcomm Atheros - LAN - Qualcomm Atheros AR8131 PCI-E Gigabit Ethernet Controller (NDIS 6.30)

و نکته‌ش اینکه که NIDS 6.30 هم به نظر می‌رسه برای ویندوز ۶.۳ باشه. یعنی ویندوز ۹! (ویندوز ویستا ویندوز ۶.۰ بوده، ۷ می‌شه ۶.۱ و ۸ هم ۶.۲)

پی‌نوشت۳: ای نوشته «باشد که عبرت گیرید از سرگذشت پدرانتان» بوده. (شاید یه دسته به این نام ساختم!)

پی‌نوشت۴: شما هم اگر این درایور رو دیدید آپدیت‌ش نکنید. مشکل واقعا ریشه داره. اطلاعات بیش‌تر

دیگر در گوگل مشکل نیم‌فاصله نداریم!

دیروز نوشته‌ای منتشر کردم و در آن افزونه‌ی خودم که برای رفع مشکل نیم‌فاصله در گوگل بود رو معرفی کردم. قبل از انتشار افزونه مخصوصا به چندتا سایت (که می‌دونستم از نیم‌فاصله استفاده می‌کنن مثل یک پزشک و ویکی‌پدیا فارسی) سر زدم و مطمئن شدم که مشکل حل نشده البته در جست‌وجو به یک مورد عجیب که نیم‌فاصله داشت برخوردم ولی اهمیتی ندادم و فکر کردم که شاید مشکل عمومی است و آن سایت از کارکتر دیگری استفاده می‌کند.

پس از انتشار افزونه نگاهی برای بازنویسی نوشته‌ی قبلی (به توصیه‌ی مهدی) به site:2barnamenevis.com در گوگل انداختم و در کمال تعجب دیدم که نام دو برنامه‌نویس در تعداد زیادی از نوشته‌ها با نیم‌فاصله نوشته می‌شه.

Capture10

 

Capture11

 

Capture12

پس از بررسی دوباره فهمیدم که هنوز نوشته‌های نیم‌فاصله دار یک پزشک بدون نیم‌فاصله نمایش داده می‌شن و برای همین در مورد کارکتر نیم‌فاصله‌ای که گوگل نمایش می‌دهد تحقیق کردم و به کارکتر زیر رسیدم.
‌
که به شکل زیر نیز نوشته می‌شود
‌
این کارکتر طبق گفته‌ی ویکی‌پدیا کارکتر نیم‌فاصله هستش و در حال حاضر توسط گوگل پشتیبانی می‌شه (این یعنی این درخواست من جواب داد! هورا!). ولی هنوز هم نوشته‌های یک پزشک بدون نیم‌فاصله میان و من فکر کنم مشکل از وردپرس جناب مجیدی یا قالب‌شون باشه. در هر صورت از شانس خوب بنده در همین روزهایی که افزونه منتشر شده گوگل این قابلیت رو اضافه کرده البته من بیش‌تر خوش‌حالم تا ناراحت چون سایت با نیم‌فاصله بهتر از سایت با فاصله هستش.

در ضمن اگر هنوز وردپرس‌تون مشکل داره پیشنهاد می‌کنم افزونه رو امتحان کنید شاید جواب داد در غیر این صورت مشکل از وردپرس یا قالب‌تون هست. البته کش گوگل هم مهمه و اهمیت سایت‌تون. یعنی ممکنه نوشته‌های قدیمی‌تر هیچ‌وقت کش‌شون تغییر نکنه و گوگل هم نیم‌فاصله رو تأثیر نده. پس تغییر رو باید توی نوشته‌های جدیدترتون مشاهده کنید.

ولی از همین الان نوشته‌ی قبلی رو از اعتبار ساقط می‌کنم چون دیگه نیازی بهش نیست.

موفق باشید و نمی‌دونید چقدر خوشحالم.

چون وردپرس با افزونه‌ی کمتر = سرعت بیش‌تر (حتی اگر آدم خودش افزونه رو نوشته باشه!)

رفع مشکل نمایش نیم‌فاصله در گوگل


این نوشته از اعتبار ساقط شده! (به این نوشته مراجعه کنید)

فقط در صورتی که هنوز کارکتر نیم‌فاصله‌ی شما در گوگل نمایش داده نمی‌شود از این افزونه استفاده کنید


کیبورد غیر استاندارد فارسی نسخه‌ای ویرایش‌شده از کیبورد QWERTY عربی بوده و در ماشین‌های تایپ (و نه در کیبوردهای نوین) کاربرد داشته. متأسفانه این کیبورد به ویندوز راه یافت و در نسخه‌های قبلی ویندوز (تا قبل از ویندوز  ۸) این کیبورد به عنوان کیبورد فارسی استفاده می‌شده. یکی از مهم‌ترین مشکلات این کیبورد این بوده که در عربی مفهومی به اسم نیم‌فاصله وجود نداره در صورتی که در زبان فارسی ما از نیم‌فاصله زیاد استفاده می‌کنیم و همان‌طور که از اسم‌ش پیداست قراره جایگزین فاصله در بعضی از ترکیب‌ها باشه. مثلا در جمله‌ی قبل ترکیب و ها یک واژه به حساب می‌شن و نباید آن‌ها را جدا نوشت (و سرهم نویسی هم منسوخ شده) و در این ترکیب‌ها از نیم‌فاصله استفاده می‌شه.

اگر یادتون باشه در این نوشته توضیح دادم که گوگل کارکتر نیم‌فاصله رو در نتایج جست‌وجو حذف می‌کنه و این که در یکی از بخش‌های پشتیبانی گوگل از گوگل درخواست کردم که کارکتر نیم‌فاصله رو جزو کارکترهایی که نمایش می‌دن اضافه کنند ولی این اتفاق نیافتاد و من به این نتیجه رسیدم که خودم باید دست به کار بشم و برای حل مشکل کاری انجام بدم.

اگر جدیدا توی گوگل دو برنامه‌نویس یا site:2barnamenevis.com رو سرچ کرده باشید (عمرا!) متوجه می‌شید که نوشته‌های جدیدتر و یک‌سری از نوشته‌های قدیمی‌تر ما مشکل نیم‌فاصله رو ندارند (در واقع جای نیم‌فاصله، فاصله گزاشتیم در نسخه‌ی جدید افزونه که در انتشار آن در مخازن وردپرس هستیم، نیم‌فاصله در گوگل به شکل صحیح نشان داده می‌شود) ولی توی نوشته‌ی اصلی همون نیم‌فاصله هستش.

برای این کار من یک افزونه برای وردپرس نوشتم که اگر user-agent بازدیدکننده‌ی سایت، user-agent خزنده‌ی گوگل بود، توی عنوان صفحه، دیدگاه‌ها، توضیحات دسته‌ها، اطلاعات سایت و اسم سایت اگر کارکتر نیم‌فاصله بود، به‌جای اون فاصله بزاره. اول آموزش نصب و استفاده از افزونه رو می‌گم و بعد بخش علمی ماجرا برای افرادی که دوست دارند بیش‌تر بدونن. برای استفاده از افزونه باید:

  1. فایل افزونه رو دانلود کنید (حجم: ۲ کیلوبایت)
  2. افزونه رو فعال کنید.
  3. اگر از افزونه‌ی کش استفاده می‌کنید باید توی تنظیمات اون user-agentهای گوگل رو جدا کنید. (لازم نیست همه‌ی user-agentها رو بنویسید. در ادامه توضیح می‌دیم!)

user-agentهای گوگل اون‌هایی هستند که این‌جا گفته و توی افزونه ما به همه‌ی اون‌ها حساسیم (یعنی اگر user-agent یکی از اون‌ها بود نیم‌فاصله می‌شه فاصله) ولی افزونه‌های کش معمولا یک واژه‌ی کلیدی می‌خوان و اگر اون user-agent اون واژه‌ی کلیدی رو شامل می‌شد دیگه سایت رو کش‌شده (به اون user-agent) نشون نمی‌دن. اگر از افزونه‌ی Hyper cache E استفاده می‌کنید توی صفحه‌ی تنظیمات افزونه Agents to reject رو پیدا کنید و توی اون کادر متنی روبه‌روش این مقادیر رو وارد کنید:

Googlebot
(compatible; Mediapartners-Google/2.1; +http://www.google.com/bot.html)
Mediapartners-Google
(+http://www.google.com/adsbot.html)

و اگر هر افزونه‌ی کش دیگه‌ای دارید باید خودتون ببینید چجوری user-agentها رو جدا کنید. پیشنهاد من اینه که توی گوگل اسم افزونه و user agent exclude رو جست‌وجو کنید؛ حتما به جواب‌تون می‌رسید و یا می‌تونید به ما اطلاع بدید تا ما این نوشته رو آپدیت کنیم. در هر صورت user-agentهایی که باید جدا بشن همین‌هایی هستند که گفتم. و کار تمام است. حالا نوشته‌های جدیدتر شما (و به تدریج نوشته‌های قدیمی‌تر) دیگر مشکل نیم‌فاصله نخواهند داشت.


و حالا بحث علمی (که نمی‌شه دقیقا بهش گفت علمی!) user-agent: هر مرورگری یک‌سری از اطلاعات خودش رو به سایتی که ازش بازدید می‌کنه می‌ده تا اون سایت بتونه تشخیص بده که کاربر داره با چه مرورگری سایت رو نگاه می‌کنه. مثلا برای تشخیص این که بازدیدکننده داره از گوشی موبایل، تبلت یا کامپیوتر سایت رو نگاه می‌کنه از user-agent استفاده می‌شه. برای این‌که بفهمید که user-agentتون چیه می‌تونید به سایت whatsmyuseragent مراجعه کنید. مثلا user-agent فعلی من اینه:

 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17 AlexaToolbar/alxg-3.1

و این user-agent نشون می‌ده که مثلا من از ویندوز ۶.۲ یا همون ویندوز ۸ استفاده می‌کنم و موتور ساخت صفحات وب من (توضیحات بیش‌تر رو در این‌جا بخونید) webkit هستش و یا

AlexaToolbar/alxg-3.1

می‌گه که من دارم از تولبار alexa استفاده می‌کنم. و خوب معلومه Chrome/24 یعنی مرورگر من گوگل کرومه. اصولا هر چیزی که توی وب هست یک user-agent داره. حالا ما توی این افزونه از user-agentهای خزنده‌های گوگل استفاده کردیم. در واقع user-agentها رو چک می‌کنیم و اگر خزنده‌ی گوگل بود، به‌جای متن نیم‌فاصله‌دار، متن فاصله‌دار به اون نشون می‌دیم. مثلا توی مرورگر کروم می‌تونید user-agent خودتون رو تغییر بدید و مثلا بکنیدش

Googlebot-Image(Googlebot)

و دو برنامه‌نویس رو ریفرش کنید اون‌وقت همه‌ی نیم‌فاصله‌ها می‌شن فاصله!


این افزونه چجوری کار می‌کنه وردپرس در افزونه‌هاش قابلیتی داره یه اسم filters که این اختیار رو به شما می‌ده که محتوایی رو فیلتر کنید. برای اطلاعات بیش‌تر به این‌جا مراجعه کنید. حالا این افزونه یک فیلتر اضافه می‌کنه و اگر user-agent بازدیدکننده user-agent گوگل بود اون‌وقت توی نوشته همه‌ی نیم‌فاصله‌ها رو با فاصله جایگزین می‌کنه. واقعا کار ساده‌ایه. و این رو هم بگم که این افزونه حدود یک ماه و نیمه که آماده‌ست ولی مشکل ما کش گوگل بوده و همین‌طور مشکلاتی که قبلا داشته. پی‌نوشت: یک‌سری از جست‌وجوهام توی گوگل به سایت‌هایی ختم شدند که نیم‌فاصله داشتند (یعنی گوگل نیم‌فاصله‌شون رو نشون می‌داد) ولی وقتی نوشته‌های یک پزشک رو چک کردم دیدم گوگل نیم‌فاصله‌های اون رو هم حذف می‌کنه و خوب این دلیلی شد که افزونه رو عمومی کنیم. من که ترجیح می‌دم گوگل نیم‌فاصله رو نشون بده تا این‌که این افزونه استفاده بشه ولی فعلا شرایط (حداقل برای ما) حکم می‌کنه که از همین افزونه استفاده کنیم چون گوگل که کاری نکرده. در هر صورت اگر مشکلی در استفاده از این افزونه دیدید حتما در این نوشته گزارش کنید.

تغییرات بخش آموزش برنامه‌نویسی دو برنامه‌نویس

چون یکی از دوستان در شماره‌ی اول آموزش برنامه‌نویسی دیدگاهی گذاشته بودند و درخواست کرده بودند که این بخش را حذف نکنیم؛ تصمیم گرفتم که در این زمینه کمی شفاف‌سازی کنم!

بهتر دونستم که اول از همه دلیل این قضیه رو بگم. تقریبا دو هفته پیش داشتم روی بخش سوم آموزش کار می‌کرد که توی اون در مورد آرایه‌ها و توابع و چندتا چیز دیگه توضیح بدم و طبق معمول توی تلفن‌هام با مهدی هم این موضوع بیان شد و خوب مهدی گفتش که «به نظر من این آموزش‌ها نباید این‌جا باشه» و یادآوری کرد دوران شیرین راهنمایی رو که آموزش برنامه‌نویسی ما رو هم با الگوریتم شروع کردند و نه با برنامه‌نویسی یا در واقع «کد نویسی»!

و خوب فقط کمی تفکر لازم بود که آدم متوجه بشه که راه رو اشتباه اومده و بهتره تا قضیه رو خراب‌ترش نکرده راه‌ش رو کج کنه تا به راه راست هدایت شه. توی نوشته‌ی قبلی هم منظورم این بود که از حرف‌های مهدی این‌طور به نظر می‌رسید که تقریبا از اول ماجرا می‌دونسته که راه ما غلطه ولی به من چیزی نگفته!

در هرصورت برنامه‌ی آینده‌ی من برای ادامه‌ی آموزش برنامه‌نویسی «یک شروع نو» هستش که اول با الگوریتم شروع کنم تا برنامه‌نویسی رو مفهمومی یاد بگیریم.

و تا اون‌جایی که می‌دونم مهدی منتظر بوده تا من آموزش‌های اولیه رو تموم کنم تا اون دوره‌ی آموزشی برنامه‌نویسی برای ویندوز ۸ رو شروع کنه (پیش خودمون باشه فکر کنم فعلا حوصله نداره شروع کنه و ترجیح می‌ده این‌جوری کارش رو توجیه کنه چون ما خیلی راه در پیش داریم تا به سی‌شارپ برسیم که پیش‌نیاز آموزش‌های مهدیه درصورتی که می‌تونه برای اون‌هایی که سی‌شارپ تا حد خوبی بلندند این آموزش رو شروع کنه و در کل ما که از آموزش پاسکال تا این‌جاش خیری ندیدیم!)

فکر کنم خیلی حرف زدم بهتر باشه یه مقدار بهشون عمل کنم!

تا نوشته‌ی بعد خدانگهدار

پی‌نوشت: دلم می‌سوزه که سال دیگه کنکور داریم و یک سال باید بیخیال سایت شم!

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

دو برنامه‌نویس در روزهای گذشته با مشکلاتی بنیادی مواجه بوده. مشکلاتی خارجی (مانند امتحانات ترم!) و داخلی (در این دل‌نوشته کمی به آن اشاره کردم) که دمار از روزگار ما در آوردند! در این چند روز به گذشته‌ی خود نگاهی انداختیم. از اول تا کنون تلاش کرده بودیم که خانه‌ی خود (دو برنامه‌نویس!) را از چیزهایی پر کنیم که از خودمان نبود یا به عبارت دیگر خودمان نبودیم و شاکی بودیم که چرا موفق نیستیم (البته از نظر من وب‌نویسی شخصی کلا سود است چون شخصی یعنی برای خودمان و وقتی حتی یک کاربر داشته باشیم پس سود کرده‌ایم!) در هر صورت به این نتیچه رسیدیم که با توجه به مشکلات بنیادی، تغییرات‌مان نیز باید بنیادی باشد (در این حد بنیادی که کار به نامه‌ی خداحافظی هم کشیده بود ولی خوشبختانه به خیر گذشت!) ولی باید بنیاد دو برنامه‌نویس را زیر و رو کنیم و نه این‌که صورت مسأله را پاک کنیم (ری‌برندیگ) و تغییرات بنیادی خود را تا آن‌جایی که به خاطرمان باشد بیان می‌کنیم:

 

اول از همه (و شاید مهم‌ترین آن‌ها) لحن نوشتاری: همان طور که گفتیم دو برنامه‌نویس قرار بود خانه‌ی باشد (و هست) و مطمئنا کسی توی خانه‌ی خوش مثل عصا قورت داده‌ها حرف نمی‌زند. پس لحن نوشته‌ها را خودمانی‌تر می‌کنیم. و از همین‌جا هم شروع می‌کنیم!

اهم اهم

نوع محتوا

دو برنامه‌نویسی ترکیبی از وبگاه‌هایی مثل یک پزشک و نارنجی و زومیت بعلاوه‌ی برداشت شخصی خودمون از وب‌نوشت‌های شخصی بود (کلماتی مثل وب‌نوشت جزو تغییر لحن حساب نمی‌شن!) که ترکیبی مثل شترگاوپلنگ از آب درآمد و کارایی خوبی نداشت. حالا سعی می‌کنیم بیش‌تر نوشته‌هایی خودمان نوشته باشیم منتشر کنیم و نه نوشته‌هایی که حاصل جوگیری باشد (این پیش‌نوشت دوم این پاراگراف است و حوصله ندارم دوباره پاک‌ش کنم و دوباره بنویسم. خودتون متوحه شید. قراره خودمون باشیم و نه دیگران و نه حتی یک وبگاه تازه‌کار!)

مثلا خودمون هم سر در نیاوردیم که چرا ولی با توجه به آمار گوگل آنالینیکس ترفند انتقال دانلود‌های آی‌دی‌ام پس از صفحه‌ی اصلی سایت با حدود ۲۰۰ بازدید در ماه گذشته پربازدیدترین نوشته‌ی ما بوده که به نظر من خبر از وخامت اوضاع می‌ده (البته من با این قضیه مشکلی ندارم چون توی وب فارسی نبود همچین ترفندی و توی وب انگلیسی هم فقط سایت آی‌دی‌ام یه توضیح کوچیک داده بود و خارجی‌ها هم مثل ما محدودیت زمانی نداره اینترنت‌شون!) ولی مطمئنا ترجیح می‌دم که نوشته‌های دیگه‌ای از دو برنامه‌نویس نقش نوشته‌ی برتر رو بازی می‌کرد (این‌جاست که عاقل می‌گه آخه شما مگه نوشته‌ی دیگه‌ای هم داشتید که به درد بخور باشه! واللا به خدا!)

آموزش‌های برنامه‌نویسی کلا تغییر می‌کنند چون مهدی جان که از اول می‌دونستند راه درستی رو نمی‌ریم تذکر نداند و پس از چهار نوشته از زیر زبون‌شون کشیدم بیرون که چرا نوشته‌ها مشکل دارند. در هر صورت از ابتدا باید از الگوریتم شروع می‌کردیم که در اولین فرصت آموزش‌ها را دوباره شروع خواهیم کرد (Reloaded!)

نوشته‌های خودمانی بیش‌تری نیز در سایت خواهیم داشت.

در کل ترجیح می‌دهیم به جای نوشته‌هایی مثل نارنجی و زومیت، نوشته‌هایی به سبک جادی داشته باشیم (یعنی خودمانی‌تر و همین‌طور از نظر موضوع)

ظاهر سایت

چندوقتی که نبودیم واقعا غایب هم نبودیم. یعنی اگر کمی دقت می‌کردید تغییراتی در قالب سایت داشته‌ایم. مثلا پس‌زمینه‌ی خاکستری از نظر من دلگیر را حذف کرده و رنگ سفید را جایگزین آن کرده ایم و همین‌طور رنگ قرمز لینک‌ها به آبی تغییر کرده است. (البته مهدی از این رنگ خوشش نمی‌آید. اگر دوستان رنگ آبی زیبا‌تری سراغ دارید لطفا معرفی کنید.) منو‌ی اصلی سایت تغییر کرده و دارم تلاش می‌کنم یه جایگزین برای منوی بالایی پیدا کنم ( «خانه» که توی منوی اصلی وجود داره. «پیوند» بخش به درد نخوریه و «آرشیو» رو هم به منوی اصلی منتقل می‌کنیم.) و مطمئنا از نظرهاتون استقبال می‌شه.

یک‌سری تغییرات کوچیک‌تر هم بوده که امیدوارم خودتون متوجه شده باشید.

سرور دو برنامه‌نویس

چندهفته‌ی پیش که دو برنامه‌نویس خاموش بود، مشکل ما از سرورمان بود. قضیه اینه که دو برنامه‌نویس اول روی سرویس میزبانی اشتراکی یکی از شرکت‌های بلاد کفر بوده ولی چون آزینیوم بار زیادی روی سرور اشتراکی می‌زاشت به ما اخطاریه دادند که یا پروژه‌تون (پروژه‌ی مهدی در اصل) رو جمع کنید یا با پروژه‌تون جمع‌تون می‌کنیم و یا برید یه سرور مجازی اختصاصی بخرید و ما هم از روی اجبار برای پروژه‌ی آزینیوم (و پروژه‌های احتمالی دیگر در آینده) به یک سرور مجازی ویندوزی (ویندوز سرور ۲۰۰۸) با ۲ گیگابایت رم و ۵۰ گیگابایت هارددیسک اشتراکی و همین‌طور ۲.۴ گیگاهرتز سی‌پی‌یو مهاجرت کردیم. و جالب است بدانید بیش‌تر از این که وقت‌مان را روی نوشته‌های دو برنامه‌نویس بگذاریم؛ روی سرور و سرعت بخشیدن به آن گزاشتیم و البته تا حدودی هم موفق شدیم!

در کل دو برنامه‌نویس قراره تغییرات‌ش بنیادی باشه البته از یک نطر قبلا بنیادی نداشته ولی الان داره و سعی می‌کنیم این بنیاد حسابی قوی باشه.

مظمئن نیستم که مهدی هم می‌خواد نوشته‌ای در این مورد بنویسه یا نه ولی در کل از دیدگاه‌هاتون بسیار شادمان خواهم شد. مخصوصا این که دل دوتا نوجوون رو شاد کردید!

مگه چقدر طول می‌کشه؟!؟

فکر کنم امروز که تموم شه ۱۰۹ روز از سال تحصیلی‌مون می‌گذره. یعنی نصف بیش‌تر ترم. تازه این سومه و سال بعد چهارمیم ولی به چهارم‌ها هم که نگاه‌ می‌کنم می‌بینم اونا حدود ۲۰۹ روز از سال تحصیلی‌شون گذشته.

مگه چقدر طول می‌کشه؟ تا به کنکور برسیم.

دانشگاه‌مون تموم شه.

سی‌ سال‌گی‌مون رو رد کنیم.

پنجاه سال‌مون بشه و به گذشته نگاه کنیم.

مگه چقدر طول می‌کشه که ببینیم ۸۰ – ۹۰ سال‌مونه و داریم نفس‌های آخر رو می‌کشیم؟

مگه این زندگی چقدر طول می‌کشه؟!؟

یک لحظه؟ دو لحظه؟

مگه تا الان‌ش وقتی به عقب نگاه می‌کنیم انگار برامون یک لحظه نمیاد؟

پس فوق فوقش زندگی‌مون می‌شه ۳ لحظه!

پی‌نوشت۱: زمان کش می‌آید و فشرده می‌شود!

پی‌نوشت۲: در حین نگارش این نوشته، نویسنده قرار بوده خیر سرش ادبیات بخواند!

پی‌نوشت۳: می‌گفت زمانی پیر شدن ما شروع می‌شود که افسوس‌های‌مان از آرزوهای‌مان بیش‌تر شود!

پی‌نوشت۴: نویسنده خیلی خوشحال است و بی‌خیال نوشتن نمی‌شود!

پی‌نوشت۵: آیا ری‌برندینگ لازم است؟!؟

پی‌نوشت۶: دو برنامه‌نویس چیست؟!؟

پی‌نوشت۷: آیا دو برنامه‌نویس در دسته‌بندی‌های معمول وب‌نوشت‌ها جای می‌گیرد؟!؟

پی‌نوشت۸: بیخیال پی‌نوشت‌های آخری شوید؛ به دل‌نوشته توجه کنید

پی‌نوشت۹: نویسنده می‌رود که درس بخواند، فعلا خدانگهدار!

پی‌نوشت۱۰: نویسنده به این همه چیز که نوشته نگاه می‌کند و افسوس می‌خورد که ۲۰۵ کلمه بیش‌تر نشده!

پشتیبان‌گیری و بازگردانی تنظیمات، دانلودها و درصد فایل دانلودشده توسط Internet Download Manager فقط با یک کلیک

اگر یادتان باشد حدود نه ماه پیش (۲۳ اردیبهشت ۹۱) ترفندی برای انتقال دانلودها و مقدار فایل‌های دانلودی نرم‌افزار IDM نوشته بودم که خوشبختانه با استقبال خوبی مواجه شد. جالب است بدانید که بر طبق آمار Google Analytics بعد از صفحه‌ی اصلی وب‌نوشت، این نوشته با ۱۹۲ بازدید در ماه گذشته پربازدیدترین نوشته‌ی دو برنامه‌نویس بوده (نمی‌دانم که این خوشحال‌کننده است یا ناراحت‌کننده!)

اما پس از ۹ ماه به این فکر افتادم که کار انتقال را برای شما (و مطمئنا برای خودم!) راحت‌تر کنم و به همین دلیل هم امشب دست‌به‌کار شدم و نرم‌افزار IDMBackupper را نوشتم و پس از تست، تصمیم گرفتم آن را برای شما در این‌جا قرار دهم.

توجه داشته‌باشید که برای اجرای این نرم‌افزار نیاز به دات‌نت فریم‌ورک ۲ دارید (اگر ویندوزتون ۷ به بالاست مشکلی نیست ولی اگر XP دارید و تا الان نصب نکردید اون رو باید نصب کنید)

این برنامه از دو دکمه‌ی ساده تشکیل شده است که یکی (Backup Download and Registry Data) برای پشتیبان‌گیری و یکی (Restore Download and Registry Data) برای بازگردانی تنظیمات کلی IDM و صف‌های دانلود و فایل‌های موجود در آن‌ها بعلاوه‌ی مقدار فایل‌هایی که دانلود شده‌اند است.

فقط باید به این نکته توجه داشته‌باشید که برنامه باید حتما Run as administrator شود (روی آن راست‌کلیک کنید و Run as administrator را بزنید. در ویندوز XP از این آموزش استفاده کنید) چون برای پشتیبانی از رجیستری (مرحله‌ی سوم تا ششم آموزش قبلی) باید دست‌رسی مدیر به کامپیوتر داشته باشیم.

پس از پشتیبان‌گیری (پس از زدن دکمه‌ی Backup Download and Registry Data و پایان کار) توجه‌ داشته‌باشید که باید فایل idm.reg و پوشه‌ی IDMBackup را در جای مطمئنی نگه‌داری کنید و برای بازگرداندن نیز idm.reg و پوشه‌ی IDMBackup نیز باید در کنار فایل اجرایی برنامه باشد (یعنی در همان پوشه‌ای که برنامه در آن قرار دارد).

دانلود این برنامه با حجم ۳۵ کیلوبایت

پی‌نوشت اگر مشکلی با برنامه دارید (مثلا فکر می‌کنید که جاسوسی می‌کند یا ویروس است) کد آن را درخواست کنید تا در این نوشته قرار گیرد.

آیا از این نرم‌افزار استفاده کرده‌اید؟ آیا مشکلی با این نرم‌افزار مشکلی دارید؟ دیدگاه خود را بیان کنید!

آموزش برنامه‌نویسی – بخش دوم – چند قدم جلوتر در راستای یادگیری مفاهیم!


سری جدیدی از آموزش‌های برنامه‌نویسی آغاز شده است. این سری منقضی شده است. پیشنهاد می‌کنیم این سری را ادامه ندهید!


در بخش قبلی در مورد برنامه‌، متغیرها و چند تابع از پاسکال چیزهایی یادگرفتیم. حال می‌خواهیم سراغ فیلترکردن اطلاعات برویم.

شرط‌ها در پاسکال

در بیش‌تر مواقع ما نیاز به تصمیم‌گیری در مورد اطلاعات ورودی کاربر داریم. مثلا یک ماشین‌حساب ساده نیاز دارد بداند که در حال حاضر کدام عملگر را بین دو عدد ورودی اعمال کند. یعنی نیاز است که بررسی کنیم که کاربر کدام علامت (+ – / ×) را وارد کرده است؛ این کار با اعمال شروط امکان‌پذیر است.

ساختار کلی شرط‌ها

در پاسکال شرط‌ها به شکل زیر نوشته می‌شوند:

if {} then
	{Do something};

که پس از if باید شرط خود را قرار دهیم و پس از then نیز دستوری قرار می‌گیرد که اگر شرط درست بود باید اجرا شود.


کامنت‌ها

در بیش‌تر مواقع در برنامه‌نویسی شما نیاز خواهید داشت که توضیحاتی برای کدهای خود بنویسید. بزارید این‌طور توضیح دهم که فرض کنید شما برنامه‌ای با ۱۸۰۰۰ خط نوشته‌اید و در هنگام اجرا در خط ۱۵۴۳۶ام آن مشکلی پیش آمده است. مطمئنا انرژی خیلی‌خیلی‌خیلی زیادی باید صرف کنید تا بفهمید که قرار بوده در خط ۱۵۴۳۶ چه اتفاقی بیافتد (در این حد که در زبانی مثل پاسکال شاید مجبور باشید ۱۰۰۰ خط قبل و بعد از آن را بررسی کنید تا بفهمید! ولی نگران نباشید، قرار نیست شما برنامه‌نویس پاسکال باشید!). ولی در هنگام برنامه‌نویسی کافی است ۱ میلیونیم آن انرژی را صرف کتید و جلوی آن خط کامنتی بگذارید که قرار است چه اتفاقی بیافتد (به همین سادگی!‌ در مورد انرژی زیاد اغراق نمی‌کنم. در پروژه‌ی خامه‌عسل ما با همین مشکل روبرو هستیم و هنوز هم نتوانستیم خودمان را از این باتلاق بیرون بکشیم!)

در پاسکال کامنت‌ها به دو صورت در کدهای شما قرار می‌گیرند:

(*your comment line 1
Line 2
Line 3
Line 4*)

یا

{your comment line 1
Line 2
Line 3
Line 4}

که تا آن‌جایی که ما فهمیدیم هیچ فرقی با یکدیگر ندارند!


خوب برگردیم سراغ شرط‌های خودمان.

فرض کنید که می‌خواهیم سن کاربرمان را بپرسیم. در مرحله‌ی اول لازم است چک کنیم که کاربر سن‌ش را غلط وارد نکند. پس با فرض این موضوع که در زمان نوح (ع) زندگی نمی‌کنیم بیش‌ترین سن را ۲۰۰ سال و کم‌ترین را ۰ در نظر می‌گیریم. پس برنامه به شکل زیر خواهد بود:

var
age: integer;
ageOK: boolean;
begin
	writeln('plz enter you age:');
	readln(age);
	ageOK:= false;
	if a>0 then
		if a<200 then
			ageOK:= true;
	{do another things}
end.

خوب در برنامه‌ی بالا ما دو شرط را درون هم قرار دادیم. یعنی در کل به این صورت می‌شود که اگر شرط اول درست باشد، پاسکال دستور درون شرط را اجرا می‌کند که از قضا این‌جا یک شرط دیگر است و آن هم اجرا می‌شود و پس از پایان شروط نیز پاسکال به انجام دستورات بعدی ادامه می‌دهد.

دورزدن پاسکال با begin و end; !

اگر متوجه شده‌باشید در دستور پس از if شما اجازه دارید فقط یک دستور را اجرا نمایید و این موضوع مطمئنا مشکل‌زا خواهد بود. برای همین هم ما می‌توانیم با یک «تکه‌‌برنامه» این محدودیت را دور بزنیم. مثلا فرض کنید در برنامه‌ی بالا به کاربر بگوییم که شما که سن‌تان از ۰ کم‌تر است در زمان سفر کرده‌اید یا اگر سن‌شان از ۲۰۰ بیش‌تر است می‌توانند خودشان را به کتاب رتبه‌های سالیانه‌ی گینس معرفی کنند!

پس برنامه به شکل زیر تغییر می‌کند:

var
age: integer;
ageOK: boolean;
begin
	writeln('plz enter you age:');
	readln(age);
	ageOK:= false;
	if a>0 then
	begin
		if a<200 then
		begin
			ageOK:= true;
		end;
		if ageOK=false then
			writeln('The Guinness Book should know you!');
	end;
	if ageOK=false then
	writeln('Did you do time travelling?!? Or did you see Karim Khan Zand?!? ');
	{do another things}
end.

پس ما به‌جای قرار دادن یک دستور، چند دستور را در قالب یک «تکه‌برنامه» قرار دادیم. توجه داشته باشید که طریقه‌ی نوشتن تکه‌برنامه‌ها به صورت خطی است یعنی هر begin با اولین end; پایان می‌یابد و تکه‌برنامه‌ها یکدیگر را قطع نمی‌کنند (یعنی نمی‌شود یک تکه‌برنامه (پسر) داخل یک تکه‌برنامه‌ی دیگر (پدر) آغاز شود ولی پدر قبل از پسر به اتمام برسد {احترامی چیزی گفتن!})

البته این برنامه، برنامه‌ی بزرگی شد چون هنوز مبحث بعدی را نیاموخته‌ایم!

انجام کاری در صورت درست نبودن شرط

در برنامه‌ی بالا برای این‌که بفهمیم که شرط غلط انجام شده یا نه مجبور شدیم چک کنیم که دستوری که درون شرط بوده انجام شده یا نه ولی همیشه از این شانس‌ها نداریم که بتوانیم انجام‌شدن دستور را چک کنیم (مثلا فرض کنید درون دستور فقط نوشته‌ای چاپ می‌کردیم. در آن‌صورت بعید می‌دانم با پاسکال می‌توانستیم چک کنیم که چیزی در کنسول چاپ شده است یا نه!)

برای انجام کاری در صورت درست نبودن شرط باید از کلیدواژه‌ی else استفاده کرد. ساختار کلی if – else به شکل زیر است:

if {if statement} then
begin
	{do something}
end;
else
begin
	{do something}
end;

پس حالا برنامه‌ای که نوشتیم به شکل زیر در می‌آید:

var
	age: integer;
	ageOK: boolean;
begin
	writeln('plz enter you age:');
	readln(age);
	ageOK:= false;
	if a>0 then
	begin
		if a<200 then
		begin
			ageOK:= true;
		end;
		else
			writeln('The Guinness Book should know you!');
	end;
	else
		writeln('Did you do time travelling?!? Or did you see Karim Khan Zand?!?');
	{do another things}
end.

که از برنامه‌ی قبلی جمع‌وجورتر است.

خوب با این اوصاف ما می‌توانیم برنامه‌ای چندمنظوره برای کاربر بسازیم. یعنی در ابتدا یک منو چاپ کنیم و به کاربر اجازه دهیم تا از بین گزینه‌های موجود یکی را انتخاب کند. مثلا برنامه‌ی زیر می‌تواند مثال مناسب و انعطاف‌پذیری باشد {برنامه‌ای جامع برای همه‌ی سلیقه‌ها!}

var
	menu: integer;
begin
	writeln('Hi, Welcome to my beautiful user friendly application designed for 2013 uesrs!');
	writeln('Please chose one the items below:');
	writeln('- Press 1 for Do job 1');
	writeln('- Press 2 for Do job 1');
	writeln('- Press 3 for Do job 1');
	writeln('- Press 4 for Do job 1');
	writeln('- or Press anything else to close this beautiful application');
	writeln('I"m waiting …');
	readln(menu)
	if menu=1 then
	begin
		{Do Job 1}
	end;
	if menu=2 then
	begin
		{Do Job 2}
	end;
	if menu=3 then
	begin
		{Do Job 3}
	end;
	if menu=4 then
	begin
		{Do Job 4}
	end;
	writeln('I"m Happy you used my beautiful user friendly application!');
	writeln('Have a good time');
	writeln('Good Bye!');
	readln();
end.

خوب فکر نمی‌کنم نیازی به توضیح داشته‌باشید {اگر در مورد نوشته‌های انگلیسی نیاز به توضیح دارید در دیدگاه بیان کنید!} پس بهتر است تا دیر نشده به سراغ مبحث بعدی برویم {الان ساعت ۲:۱۳ بامداد!}

کدهای چرخشی

در مواقعی شما نیاز دارید تا کاری را چندبار انجام دهید. مثلا بخواهید نمره‌ی ۲۰ نفر را از کاربر بگیرید و میانگین آن‌ها را برای آن‌ها چاپ کنید {این مثال واقعا تکراری بود! فکر کنم هر کتاب آموزشی را که باز کنید این مثال را بتوانید تویش پیدا کنید!} یا کارهای جالب‌تر مثلا چاپ یک مثلث متساوی‌الساقین ستاره‌ای به ساق ۲۰ خط {از این کارها هم انجام می‌دهیم! کمی صبر کنید} مطمئنا استفاده از کپی و پیست {مثلا ۲۰ تا readln بنویسیم!} ، روش جالبی برای گرفتن ورودی (نمرات) یا چاپ خروجی (یک مثلث نسبتا بزرگ!) نخواهد بود.

 این‌جاست که چرخش‌ها یا Loopها به کمک شما می‌آیند.

for

می‌توان گفت for معمول‌ترین دستور چرخشی در زبان‌های برنامه‌نویسی است. در دستور for ما یک شمارنده داریم و یک هدف و از مقدار اولیه‌ی شمارنده یکی‌یکی به آن اضافه می‌کنیم و در هر بار اضافه‌کردن به شمارنده، یک بار دستوری که قرار است اجرا شود را اجرا می‌کنیم {نگران نباشید. ما قرار نیست این کار را انجام دهیم. پاسکال خودش این کار را برای ما انجام می‌دهد!}

چون در دستور for ما نیاز به یک متغیر به عنوان شمارنده داریم، فرض می‌کنیم که متغیر i در ابتدای برنامه تعریف شده است. پس ساختار for به شکل زیر خواهد بود:

for i:=0 to 100 do
	{do something}

یا اگر بخواهیم پاسکال را دور بزنیم به شکل زیر در خواهد آمد:

for i:=0 to 100 do
begin
	{do something}
end;

ساختار چینش درختی برنامه

اگر دقت کرده باشید در برنامه‌هایی که در بالا مثال زدیم هروقت که دستورات به‌عنوان فرزند دستورات دیگری بودند از یک Tab (یا ۸ تا اسپیس) استفاده کردیم. این ساختار به خواناتر شدن کد کمک بسیاری می‌کند و به کسی که کد را می‌خواند کمک می‌کند تا راحت‌تر آن را درک کنند. به شما پیشنهاد می‌کنیم که شما هم در کدهایتان از این ساختار استفاده کنید.

البته زیاد لازم نیست زحمت بکشید. فقط محیط ویرایشگر پاسکال بلد نیست خودش کدها رو مرتب کنه. چند وقت دیگه که وارد سی‌پلاس‌پلاس و سی‌شارپ شدیم دیگه در این مورد مشکلی نخواهیم داشت چون هزار ماشاالله همه‌ی محیط‌های جدید در جهت راحتی و تنبلی برنامه‌نویس‌ها کار می‌کنند و کم مونده ازشون درخواست کنیم که کد رو برامون بنویسند! البته الانش هم همین کامپایلرها یه‌جورایی دارن برامون کدها رو می‌نویسن. {داستان اسمبلی رو که یادتون نرفته؟!؟}


خوب بهتره بحث for رو ادامه بدیم.

به رسم اکثر آموزش‌ها اول برنامه‌ی میانگین رو به عنوان مثال در این‌جا قرار می‌دیم:

var
	now: integer;
	avg: real;
	i: integer;
begin
	readln(now);
	avg:=now;
	for i:=1 to 19 do
	begin
		readln(now);
	end;
	avg:=avg/20;
	writeln(avg);
end.

خوب در برنامه‌ی بالا for را تا ۱۹ رفتیم چون یکی از نمره‌ها را قبلا از کاربر گرفته‌بودیم. توجه داشته باشید که حتی می‌توان تعداد ورودی‌ها را نیز از کاربر گرفت. یعنی لزومی ندارد که نقاط شروع و پایان for را از قبل تعیین کنیم و می‌توانیم آن‌ها را نیز به کاربر بسپاریم.

حالا می‌خواهیم مثلثی مثل مثلث زیر چاپ کنیم

*
**
***
****
*****
******

برای این‌کار لازم است از یک for تو در تو استفاده کنیم. به این معنی که درون یک for، یک for دیگر قرار دهیم.

برای جالب‌تر شدن نیز تعداد خطوط را به کاربر می‌سپاریم {در هنگام نگارش این سطور یعنی ساعت ۲:۵۱ بامداد نویسنده کمی خوابش میاید. اگر برنامه کم‌نمک یا پرنمک بود ببخشید!}

var
	i,j,n: integer;
begin
	writeln('Welcome to my wonderful mathematical application.');
	writeln('You are here and want me to draw a triangle for you!');
	writeln('So I"m waiting for you to give me length of it"s leg …');
	readln(n);
	for i:=1 to n do
	begin
		for j:=1 to I do
			write('*');
		writeln();
	end;
	writeln('I finished drawing. Don"t forget to pay me otherwise I will not draw any other things for you! :X');
	writeln('Honestly there are a lot of consumers waiting for me to draw things for them!');
end.

و خوب فکر می‌کنم برنامه نیاز به توضیح ندارد. فقط این‌که for  پدر در برنامه‌ی ما نقش اشاره‌گر خط را بازی می‌کرد و با هر حرکت آن یک خط رسم می‌شد و به همین دلیل نیز در انتهای دستورات آن writeln() مشاهده می‌شود (برای این‌که در خروجی به خط بعدی برویم!). {ساعت ۳ بامداد است. ادامه‌اش برای فردا!}

تا نشده‌ست آن تمام

{صبح بخیر!} بعد از for پرکاربرد ترین دستور چرخشی while است. مفهوم کلی آن این است که تا وقتی که یک شرط صحیح است کاری را انجام بده. مثلا منوی کاربرپسند (User Friendly!) که با if نوشتیم اگر تنها یک بار اجرا شود کاربردی ندارد (برای هر ابزار برنامه باید دوباره اجرا شود. مثل این‌که کاربر برنامه‌های جداگانه‌ی مختلف را اجرا کند) ولی اگر کاربر بتواند ابزارهای مختلف را استفاده کند و هروقت که خواست خارج شود مثلا ۰ را بزند، برنامه‌ی ما کاربرپسندتر می‌شود!

 پس برنامه‌ی کاربرپسندمان را این‌طور ویرایش می‌کنیم:

var
	menu: integer;
	mCheck: integer;
begin
	writeln('Hi, Welcome to my beautiful user friendly application designed for 2013 uesrs!');
	mCheck:= true;
	while mCheck do
	begin
		writeln('Please chose one the items below:');
		writeln('- Press 1 for Do job 1');
		writeln('- Press 2 for Do job 1');
		writeln('- Press 3 for Do job 1');
		writeln('- Press 4 for Do job 1');
		writeln('- or Press anything else to close this beautiful application');
		writeln('I"m waiting …');
		readln(menu)
		if menu=1 then
		begin
			{Do Job 1}
			continue;
		end;
		if menu=2 then
		begin
			{Do Job 2}
			continue;
		end;
		if menu=3 then
		begin
			{Do Job 3}
			continue;
		end;
		if menu=4 then
		begin
			{Do Job 4}
			continue;
		end;
		mCheck:= false;
	end;
	writeln('I"m Happy you used my beautiful user friendly application!');
	writeln('Have a good time');
	writeln('Good Bye!');
	readln();
end.

continue و break، دو دستور کاربردی برای کنترل چرخش‌ها

گاهی اوقات لازم است که ما اجرای دستورات چرخش را متوقف کنیم و به چرخش ادامه دهیم و یا کلا از چرخش بیرون بیاییم. مثلا در برنامه‌ی بالا لازم است که پس از این‌که کاری که کاربر تعیین کرده‌است را انجام دادیم، دیگر به کارمان ادامه ندهیم (وگرنه mCheck برابر false می‌شود و حلقه ادامه نمی‌یابد!) برای همین از دستور continue استفاده‌ کردیم.

اما در برنامه‌ی بالا می‌توانستیم به‌جای تعریف یک متغیر اضافی از دستور break استفاده کنیم که نتیجه‌ی نهایی می‌شود برنامه‌ی پایین:

var
	menu: integer;
begin
	writeln('Hi, Welcome to my beautiful user friendly application designed for 2013 uesrs!');
	while true do
	begin
		writeln('Please chose one the items below:');
		writeln('- Press 1 for Do job 1');
		writeln('- Press 2 for Do job 1');
		writeln('- Press 3 for Do job 1');
		writeln('- Press 4 for Do job 1');
		writeln('- or Press anything else to close this beautiful application');
		writeln('I"m waiting …');
		readln(menu)
		if menu=1 then
		begin
			{Do Job 1}
			continue;
		end;
		if menu=2 then
		begin
			{Do Job 2}
			continue;
		end;
		if menu=3 then
		begin
			{Do Job 3}
			continue;
		end;
		if menu=4 then
		begin
			{Do Job 4}
			continue;
		end;
		break;
	end;
	writeln('I"m Happy you used my beautiful user friendly application!');
	writeln('Have a good time');
	writeln('Good Bye!');
	readln();
end.

اعمال منطقی پاسکال

اگر تا حالا فکر می‌کردید که کامپیوتر دنیای درهم و برهمی است اشتباه می‌کردید! بلکه کامپیوتر منطقی‌ترین موجود جهان است {البته از مجموع همه‌ی منطق‌ها چیزهای درهم و برهمی ساخته می‌شوند مثل ویندوز، اینترنت و کلی چیز دیگر! اشتباه نکنید! کامیپوتر منطقی است، اما ما کاملا منطقی نیستیم و این باعث آشوب می‌شد!}

اما خیلی وقت‌ها لازم است که در یک شرط چند گزاره‌ی منطقی را باهم چک کنیم. مثلا در مثالی که برای if آوردیم، خیلی بهتر می‌شد اگر آن شرط تو در تو را در یک شرط بزرگ‌تر جمع آوری کنیم. اما مانند دنیای منطق، این‌جا هم چند عمل‌گر منطقی برای گزاره‌ها وجود دارد که آن‌ها را بررسی می‌کنیم:

and

اگر لازم باشد که هر دو (یا چند) شرط در یک زمان برقرار باشند باید از and استفاده کرد. مثلا برنامه‌ی مثال را می‌توان به شکل زیر نوشت:

var
	age: integer;
	ageOK: boolean;
begin
	writeln('plz enter you age:');
	readln(age);
	ageOK:= false;
	if (a>0) and (a<200) then
		ageOK:= true;
	{do another things}
end.

توجه دقت کنید که حتما از پرانتز () برای جداکردن گزاره‌ها استفاده کنید.

or

گاهی اوقات درست بودن یکی از شروط کافی است. مثلا می‌خواهیم نمرات دانش‌آموز را از طریق ایمیل برای پدر یا مادر او ارسال کنیم {فرستادن ایمیل در پاسکال؟!؟ عمرا!} و ما لیستی داریم که شامل ایمیل دانش‌آموز، ایمیل پدر و ایمیل مادر اوست. پس لازم است که فردی که ایمیل براش ارسال می‌شود پدر یا مادر دانش‌آموز باشد. در این حالت شرط ما به شکل زیر خواهد آمد (فرض می‌کنیم متغیر type مقادیر s (دانش آموز)، f (پدر) و m (مادر) را داشته باشد)

if (type='f') or (type='m') then
	{send mail!}

یا می‌توان از یک راه بهتر استفاده کرد و آن این است که چک کنیم که فرد دانش‌آموز نباشد. پس if ما به شکل زیر خواهد آمد:

if type<>'s' then
	{send email!}

not

اگر بخواهیم برعکس یک گزاره‌ی شرطی را چک کنیم، باید از عملگر not استفاده کنیم. مثلا در مثال بالا «اگر فرد دانش‌آموز نبود» را به شکل زیر هم می‌توان نوشت

if not (type='s') then
	{send email!}

البته در برنامه‌نویسی کاربردی پیشنهاد می‌شود که از حالت اول استفاده کنید. چون در حالت دوم شما دو عمل منطقی روی گزاره انجام می‌دهید (اول گزاره‌ی منطقی true یا false را برمی‌گرداند و سپس آن‌را برعکس می‌کنیم!) که در کارهای واقعی همین باعث مشکلاتی در ساختار برنامه می‌شود {اندک، اندک جمع گردد وانگهی دریا شود. همینا جمع می‌شه بعد برنامه‌تون نیم‌ساعت طول می‌کشه تا یه جمع ساده رو انجام بده!}

عمل‌گرهای مقایسه‌ای

در مثال‌های این بخش از عمل‌گرهای مختلفی در شرایط مختلف استفاده کردیم که بد نیست آن‌ها را نیز توضیح دهیم {در اصل در یک جا جمع‌آوری کنیم برای شب امتحان!} (چون مثال در بالا وجود دارد دیگر آن‌ها را تکرار نمی‌کنیم}

  • تساوی: اگر بخواهیم تساوی بین دو متغیر (یا یک متغیر و یک چیز ثابت) را چک کنیم از علامت = استفاده می‌کنیم.
  • کوچکتر، بزرگتر: برای بررسی کوچکتری و بزرگ‌تری مانند ریاضیات شیرین دوره‌ی ابتدایی {از ابتدایی شروع و تا کنون ادامه دارد!} از < و > استفاده می‌کنیم و اگر بخواهیم بزرگتر مساوی یا کوچکتر مساوی را چک کنیم از <= یا >= استفاده می‌کنیم.
  • نامساوی: برای این چک کنیم که دو عبارت مساوی نباشند باید از <> استفاده کنیم.

خوب در این بخش شروط و چرخش‌ها (حلقه‌ها) را آموختیم. بخش بعدی مفاهیم برنامه‌نویسی به اتمام می‌رسد و وارد برنامه‌نویسی سی‌پلاس‌پلاس می‌شویم {بخش بعدی پاسکال تمام می‌شود! هورا!} تا کمی عملی‌تر برنامه‌نویسی یاد بگیریم.

تمرین‌ها

با تشکر از این‌که تمارین بخش قبلی را حل کردید برای این بخش هم تعدادی تمرین در نظر گرفته‌ایم. اگر احیانا کسی زحمت کشید و هر کدام از تمارین را حل کرد ما هم کمی انگیزه پیدا می‌کنیم و جواب تمرین‌ها را در نوشته‌ای منتشر می‌کنیم {به قول استاد خوب حسابان‌مان :نمی‌خواهید یاد بگیرید اصلا چرا میاد نوشته رو می‌خونید. برید به مامانتون بگید من نمی‌خوام یاد بگیرم برید سیگار فروش شید چرا هی وقت‌تون رو با خوندن این چرت‌وپرت‌ها تلف می‌کنید؟ :دی}

  1. ب.ب.ک (برنامه‌ای بنویسید که) قد دانش‌آموزان را بگیرد (تعداد دانش‌آموزان را نیز کاربر تعیین می‌کند) و میانگین، کوتاه‌ترین و بلند‌ترین قد آن‌ها را چاپ کند.
  2. ب.ب.ک ابتدا دو عدد از کاربر بگیرد و سپس با یک محیط کاربرپسند از او بپرسد که قرار است با آن عددها چه کاری بکند (جمع، صرب، تقسیم، تفریق) و نتیجه را چاپ کند.
  3. برنامه‌ای بنویسید که یک‌سری آدرس صفحات بگیرد و تعداد آن‌هایی که از سایت دو برنامه‌نویس هستند را چاپ کند.

پی‌نوشت: اگر مشکلی دارید می‌توانید در دیدگاهی مشکل خود را بیان کنید و یا اگر بخشی از این آمورش نادرست است لطفا اطلاع دهید {متشکرم!}

یک نکته‌ی مهم {سوال انحرافی}: در مثال‌های بالا (در کدهای بالا) اشتباه در دو مثال تکرار شده (راهنمایی یک کلید‌واژه اشتباها به‌عنوان متغیر استفاده شده) آیا می‌توانید آن را بیابید؟