<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Educator - تمام انجمن‌ها]]></title>
		<link>http://www.forum.educator.ir/</link>
		<description><![CDATA[Educator - http://www.forum.educator.ir]]></description>
		<pubDate>Sun, 05 Sep 2010 02:21:38 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[شاهکارهای مینیاتوری روی نوک مداد]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=289</link>
			<pubDate>Sat, 04 Sep 2010 21:02:40 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=289</guid>
			<description><![CDATA[دالتون گتی نجار 49 ساله برزیلی مدت 25 سال است روی نوک مداد طراحی و مجسمه‌های مینیاتوری خلق می‌کند. او با استفاده از تیغ، چاقو و سوزن خیاطی این آثار را خلق کرده و ساخت برخی از آنها دو سال به طول انجامیده است... <br />
  <br />
<img src="http://up.iranblog.com/Files7/93b83bb0d7814f8f83b1.jpg" border="0" alt="[تصویر: 93b83bb0d7814f8f83b1.jpg&#93;" /><br />
<img src="http://up.iranblog.com/Files7/e076fc7f7d4d4deea031.jpg" border="0" alt="[تصویر: e076fc7f7d4d4deea031.jpg&#93;" /><br />
<img src="http://up.iranblog.com/Files7/8cdcd817430947d99524.jpg" border="0" alt="[تصویر: 8cdcd817430947d99524.jpg&#93;" /><br />
<img src="http://up.iranblog.com/Files7/e976ffa859b64576a15d.jpg" border="0" alt="[تصویر: e976ffa859b64576a15d.jpg&#93;" /><br />
<img src="http://up.iranblog.com/Files7/0eb7375c27a646b0bbd3.jpg" border="0" alt="[تصویر: 0eb7375c27a646b0bbd3.jpg&#93;" /><br />
<img src="http://up.iranblog.com/Files7/0cbbc47e9ef349cea0c9.jpg" border="0" alt="[تصویر: 0cbbc47e9ef349cea0c9.jpg&#93;" /><br />
<img src="http://up.iranblog.com/Files7/36da51522d234e28a523.jpg" border="0" alt="[تصویر: 36da51522d234e28a523.jpg&#93;" /><br />
<img src="http://up.iranblog.com/Files7/0e6ce5bb7f1d41a19d6f.jpg" border="0" alt="[تصویر: 0e6ce5bb7f1d41a19d6f.jpg&#93;" />]]></description>
			<content:encoded><![CDATA[دالتون گتی نجار 49 ساله برزیلی مدت 25 سال است روی نوک مداد طراحی و مجسمه‌های مینیاتوری خلق می‌کند. او با استفاده از تیغ، چاقو و سوزن خیاطی این آثار را خلق کرده و ساخت برخی از آنها دو سال به طول انجامیده است... <br />
  <br />
<img src="http://up.iranblog.com/Files7/93b83bb0d7814f8f83b1.jpg" border="0" alt="[تصویر: 93b83bb0d7814f8f83b1.jpg]" /><br />
<img src="http://up.iranblog.com/Files7/e076fc7f7d4d4deea031.jpg" border="0" alt="[تصویر: e076fc7f7d4d4deea031.jpg]" /><br />
<img src="http://up.iranblog.com/Files7/8cdcd817430947d99524.jpg" border="0" alt="[تصویر: 8cdcd817430947d99524.jpg]" /><br />
<img src="http://up.iranblog.com/Files7/e976ffa859b64576a15d.jpg" border="0" alt="[تصویر: e976ffa859b64576a15d.jpg]" /><br />
<img src="http://up.iranblog.com/Files7/0eb7375c27a646b0bbd3.jpg" border="0" alt="[تصویر: 0eb7375c27a646b0bbd3.jpg]" /><br />
<img src="http://up.iranblog.com/Files7/0cbbc47e9ef349cea0c9.jpg" border="0" alt="[تصویر: 0cbbc47e9ef349cea0c9.jpg]" /><br />
<img src="http://up.iranblog.com/Files7/36da51522d234e28a523.jpg" border="0" alt="[تصویر: 36da51522d234e28a523.jpg]" /><br />
<img src="http://up.iranblog.com/Files7/0e6ce5bb7f1d41a19d6f.jpg" border="0" alt="[تصویر: 0e6ce5bb7f1d41a19d6f.jpg]" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[ارسال پست :: سيستم مديريت محتوا قسمت 6]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=288</link>
			<pubDate>Sat, 04 Sep 2010 10:33:18 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=288</guid>
			<description><![CDATA[به نام خداوند بخشنده ي مهربان<br />
<br />
<br />
<span style="font-weight: bold;">سطح مقاله: متوسط-پیشرفته<br />
پیش نیاز: آشنایی با PHP و دستورات SQL SERVER<br />
</span><br />
تقريبا داريم كنترل پنل كاربر را مي نويسيم. ببخشيد اين قسمت يكم دير شد. امروز مي خواهم براي صفحاتمون يك روش جديد پيشنهاد بدهم. يادتان مي آيد وقتي ما مي خواستيم سيستم تغيير رمز عبور يا حذف اكانت را بنويسيم از دو صفحه استفاده مي كرديم مانند delacount.php ، delacount2.php يا changepass.php ، changepass2.php حالا مي خواهم صفحه ي sendpost.php كه براي ارسال پست براي كاربر استفاده مي شه از روش GET استفاده كنم كه عمليات ها را در يك صفحه مي ريزه مثل sendpost.php?action=sended . حالا صفحه ي sendpost.php كه توضيح داده مي شه:<br />
<div class="codeblock phpcodeblock"><div class="title">کد PHP:<br />
</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;</span><span style="color: #0000BB">form&nbsp;method</span><span style="color: #007700">=</span><span style="color: #DD0000">"POST"&nbsp;</span><span style="color: #0000BB">action</span><span style="color: #007700">=</span><span style="color: #DD0000">"sendpost.php?action=send"</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">input&nbsp;type</span><span style="color: #007700">=</span><span style="color: #DD0000">"text"&nbsp;</span><span style="color: #0000BB">size</span><span style="color: #007700">=</span><span style="color: #DD0000">"40"&nbsp;</span><span style="color: #0000BB">name</span><span style="color: #007700">=</span><span style="color: #DD0000">"title"&nbsp;</span><span style="color: #0000BB">maxlength</span><span style="color: #007700">=</span><span style="color: #DD0000">"38"</span><span style="color: #007700">&gt;&nbsp;&lt;</span><span style="color: #0000BB">p</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">textarea&nbsp;cols</span><span style="color: #007700">=</span><span style="color: #DD0000">"40"&nbsp;</span><span style="color: #0000BB">rows</span><span style="color: #007700">=</span><span style="color: #DD0000">"8"&nbsp;</span><span style="color: #0000BB">name</span><span style="color: #007700">=</span><span style="color: #DD0000">"post"</span><span style="color: #007700">&gt;&nbsp;&lt;/</span><span style="color: #0000BB">textarea</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">input&nbsp;type</span><span style="color: #007700">=</span><span style="color: #DD0000">"submit"&nbsp;</span><span style="color: #0000BB">value</span><span style="color: #007700">=</span><span style="color: #DD0000">"Send&nbsp;post"</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">form</span><span style="color: #007700">&gt;<br />&lt;?</span><span style="color: #0000BB">php<br />session_start</span><span style="color: #007700">();<br /></span><span style="color: #FF8000">//check&nbsp;the&nbsp;login<br /></span><span style="color: #007700">if(!isset(</span><span style="color: #0000BB">&#36;_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">"user"</span><span style="color: #007700">&#93;))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;die(</span><span style="color: #DD0000">'You&nbsp;are&nbsp;not&nbsp;login.'</span><span style="color: #007700">);<br />}<br /></span><span style="color: #FF8000">//end&nbsp;check<br /><br /><br /></span><span style="color: #007700">if(</span><span style="color: #0000BB">&#36;_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">"action"</span><span style="color: #007700">&#93;&nbsp;==&nbsp;</span><span style="color: #DD0000">"send"</span><span style="color: #007700">)&nbsp;{<br />if(!isset(</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">"title"</span><span style="color: #007700">&#93;))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;die(</span><span style="color: #DD0000">'the&nbsp;form&nbsp;not&nbsp;submited.'</span><span style="color: #007700">);<br />}<br />if(empty(</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">"title"</span><span style="color: #007700">&#93;))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;die(</span><span style="color: #DD0000">'The&nbsp;title&nbsp;field&nbsp;is&nbsp;empty.'</span><span style="color: #007700">);<br />}<br />if(empty(</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">"post"</span><span style="color: #007700">&#93;))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;die(</span><span style="color: #DD0000">'The&nbsp;post&nbsp;text&nbsp;is&nbsp;empty.'</span><span style="color: #007700">);<br />}<br />include(</span><span style="color: #DD0000">'config.php'</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">//connect&nbsp;to&nbsp;datebase&nbsp;by&nbsp;function&nbsp;connect&nbsp;in&nbsp;config.php<br /></span><span style="color: #0000BB">connect</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">&#36;title&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">"title"</span><span style="color: #007700">&#93;;<br /></span><span style="color: #0000BB">&#36;post&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">"post"</span><span style="color: #007700">&#93;;<br /></span><span style="color: #0000BB">&#36;sql&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">"INSERT&nbsp;INTO&nbsp;`posts`(title,&nbsp;post)&nbsp;values('&#36;title'&nbsp;,&nbsp;'&#36;post');"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">mysql_query</span><span style="color: #007700">(</span><span style="color: #0000BB">&#36;sql</span><span style="color: #007700">);<br />echo&nbsp;</span><span style="color: #DD0000">"The&nbsp;post&nbsp;with&nbsp;title:&nbsp;&#36;title&nbsp;inserted."</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></code></div></div></div>
حالا توضيح كد بالا كه مربوط به صفحه ي sendpost.php مي باشد:<br />
در ابتدا يك فرم داريم كه method آن POST مي باشد و action آن كه اطلاعات به آنجا ارسال مي شود آدرس sendpost.php?action=send مي باشد. همانطور كه توجه كرديد ما در method از GET استفاده نكرديم بلكه در قسمت action آدرسي را مشخص كرديم كه اين خصويت را دارد. پس تمامي مقادير فرم دوباره به همين صفحه فقط با يك روش GET ارسال كردم. سپس صفحه ي php را با پرچسب &lt;?php شروع كردم. در اين صفحه ابتدا چك كردم كه آيا كاربر لاگين كرده است يا نه به اين ترتيب كه با يك عبارت شرطي بررسي كردم كه آيا جلسه اي به نام user كه در صفحه ي  login ساخته بوديم وجود دارد يا نه؟ اگر وجود داشت كه هيچي و اگر وجود نداشتم برنامه را خاتمه مي دهيم و با دستور die پيام مي دهيم كه لاگين نشده است. حالا رسيده كه روش جديد را شروع كنيم در اينجا بررسي كردم كه آيا GET با نام action و محتويات send وجود دارد يا نه؟ اگر وجود داشت توي عبارت شرطي دستورات بعدي را مي نويسيم به اين ترتيب كه در اين شرط بررسي مي كنيم كه فرم ارسال شد و مقادير فرم خالي هستند يا نه و بعضي از كنترل ها. ما چنديدن شرط در اين شرط ايجاد كرده ايم. بعد از عبارت شرطي محتويات صفحه ي config.php را كه قبلا نوشته بوديم را توي صفحه مي ريزيم و سپس با تابع connect كه در آن صفحه نوشته بوديم با بانك اطلاعاتي ارتباط برقرار مي كنيم. سپس دو متغير جديد به نام هاي title و post ايجاد مي كنيم كه در برگيرنده ي مقادير فرم مي باشد. متغير جديد sql به ما كمك مي كند كه كوئري و پرس و جوي خود را در آن بنويسيم با دستور INSERT كه براي درج اطلاعات در بانك اطلاعاتي استفاده مي شود اطلاعات را در جدول posts درج مي كنيم. سپس با mysql_query دستورات را اجرا مي كنيم. در پايان به اين عنوان كه پيامي براي عمليات موفقيت آميز نشان بدهيم با دستور echo  چاپ مي كنيم كه اين مطلب با عنوان متغير title ارسال گرديد. سپس صفحه ي php را خاتمه مي دهيم.<br />
<br />
اگر مشكلي بود اطلاع دهيد چون تازه من اين روش ياد گرفتم.<br />
<br />
hadimir<br />
محمد هادي معصومي.]]></description>
			<content:encoded><![CDATA[به نام خداوند بخشنده ي مهربان<br />
<br />
<br />
<span style="font-weight: bold;">سطح مقاله: متوسط-پیشرفته<br />
پیش نیاز: آشنایی با PHP و دستورات SQL SERVER<br />
</span><br />
تقريبا داريم كنترل پنل كاربر را مي نويسيم. ببخشيد اين قسمت يكم دير شد. امروز مي خواهم براي صفحاتمون يك روش جديد پيشنهاد بدهم. يادتان مي آيد وقتي ما مي خواستيم سيستم تغيير رمز عبور يا حذف اكانت را بنويسيم از دو صفحه استفاده مي كرديم مانند delacount.php ، delacount2.php يا changepass.php ، changepass2.php حالا مي خواهم صفحه ي sendpost.php كه براي ارسال پست براي كاربر استفاده مي شه از روش GET استفاده كنم كه عمليات ها را در يك صفحه مي ريزه مثل sendpost.php?action=sended . حالا صفحه ي sendpost.php كه توضيح داده مي شه:<br />
<div class="codeblock phpcodeblock"><div class="title">کد PHP:<br />
</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;</span><span style="color: #0000BB">form&nbsp;method</span><span style="color: #007700">=</span><span style="color: #DD0000">"POST"&nbsp;</span><span style="color: #0000BB">action</span><span style="color: #007700">=</span><span style="color: #DD0000">"sendpost.php?action=send"</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">input&nbsp;type</span><span style="color: #007700">=</span><span style="color: #DD0000">"text"&nbsp;</span><span style="color: #0000BB">size</span><span style="color: #007700">=</span><span style="color: #DD0000">"40"&nbsp;</span><span style="color: #0000BB">name</span><span style="color: #007700">=</span><span style="color: #DD0000">"title"&nbsp;</span><span style="color: #0000BB">maxlength</span><span style="color: #007700">=</span><span style="color: #DD0000">"38"</span><span style="color: #007700">&gt;&nbsp;&lt;</span><span style="color: #0000BB">p</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">textarea&nbsp;cols</span><span style="color: #007700">=</span><span style="color: #DD0000">"40"&nbsp;</span><span style="color: #0000BB">rows</span><span style="color: #007700">=</span><span style="color: #DD0000">"8"&nbsp;</span><span style="color: #0000BB">name</span><span style="color: #007700">=</span><span style="color: #DD0000">"post"</span><span style="color: #007700">&gt;&nbsp;&lt;/</span><span style="color: #0000BB">textarea</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">input&nbsp;type</span><span style="color: #007700">=</span><span style="color: #DD0000">"submit"&nbsp;</span><span style="color: #0000BB">value</span><span style="color: #007700">=</span><span style="color: #DD0000">"Send&nbsp;post"</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">form</span><span style="color: #007700">&gt;<br />&lt;?</span><span style="color: #0000BB">php<br />session_start</span><span style="color: #007700">();<br /></span><span style="color: #FF8000">//check&nbsp;the&nbsp;login<br /></span><span style="color: #007700">if(!isset(</span><span style="color: #0000BB">&#36;_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">"user"</span><span style="color: #007700">]))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;die(</span><span style="color: #DD0000">'You&nbsp;are&nbsp;not&nbsp;login.'</span><span style="color: #007700">);<br />}<br /></span><span style="color: #FF8000">//end&nbsp;check<br /><br /><br /></span><span style="color: #007700">if(</span><span style="color: #0000BB">&#36;_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">"action"</span><span style="color: #007700">]&nbsp;==&nbsp;</span><span style="color: #DD0000">"send"</span><span style="color: #007700">)&nbsp;{<br />if(!isset(</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">"title"</span><span style="color: #007700">]))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;die(</span><span style="color: #DD0000">'the&nbsp;form&nbsp;not&nbsp;submited.'</span><span style="color: #007700">);<br />}<br />if(empty(</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">"title"</span><span style="color: #007700">]))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;die(</span><span style="color: #DD0000">'The&nbsp;title&nbsp;field&nbsp;is&nbsp;empty.'</span><span style="color: #007700">);<br />}<br />if(empty(</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">"post"</span><span style="color: #007700">]))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;die(</span><span style="color: #DD0000">'The&nbsp;post&nbsp;text&nbsp;is&nbsp;empty.'</span><span style="color: #007700">);<br />}<br />include(</span><span style="color: #DD0000">'config.php'</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">//connect&nbsp;to&nbsp;datebase&nbsp;by&nbsp;function&nbsp;connect&nbsp;in&nbsp;config.php<br /></span><span style="color: #0000BB">connect</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">&#36;title&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">"title"</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">&#36;post&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">"post"</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">&#36;sql&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">"INSERT&nbsp;INTO&nbsp;`posts`(title,&nbsp;post)&nbsp;values('&#36;title'&nbsp;,&nbsp;'&#36;post');"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">mysql_query</span><span style="color: #007700">(</span><span style="color: #0000BB">&#36;sql</span><span style="color: #007700">);<br />echo&nbsp;</span><span style="color: #DD0000">"The&nbsp;post&nbsp;with&nbsp;title:&nbsp;&#36;title&nbsp;inserted."</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></code></div></div></div>
حالا توضيح كد بالا كه مربوط به صفحه ي sendpost.php مي باشد:<br />
در ابتدا يك فرم داريم كه method آن POST مي باشد و action آن كه اطلاعات به آنجا ارسال مي شود آدرس sendpost.php?action=send مي باشد. همانطور كه توجه كرديد ما در method از GET استفاده نكرديم بلكه در قسمت action آدرسي را مشخص كرديم كه اين خصويت را دارد. پس تمامي مقادير فرم دوباره به همين صفحه فقط با يك روش GET ارسال كردم. سپس صفحه ي php را با پرچسب &lt;?php شروع كردم. در اين صفحه ابتدا چك كردم كه آيا كاربر لاگين كرده است يا نه به اين ترتيب كه با يك عبارت شرطي بررسي كردم كه آيا جلسه اي به نام user كه در صفحه ي  login ساخته بوديم وجود دارد يا نه؟ اگر وجود داشت كه هيچي و اگر وجود نداشتم برنامه را خاتمه مي دهيم و با دستور die پيام مي دهيم كه لاگين نشده است. حالا رسيده كه روش جديد را شروع كنيم در اينجا بررسي كردم كه آيا GET با نام action و محتويات send وجود دارد يا نه؟ اگر وجود داشت توي عبارت شرطي دستورات بعدي را مي نويسيم به اين ترتيب كه در اين شرط بررسي مي كنيم كه فرم ارسال شد و مقادير فرم خالي هستند يا نه و بعضي از كنترل ها. ما چنديدن شرط در اين شرط ايجاد كرده ايم. بعد از عبارت شرطي محتويات صفحه ي config.php را كه قبلا نوشته بوديم را توي صفحه مي ريزيم و سپس با تابع connect كه در آن صفحه نوشته بوديم با بانك اطلاعاتي ارتباط برقرار مي كنيم. سپس دو متغير جديد به نام هاي title و post ايجاد مي كنيم كه در برگيرنده ي مقادير فرم مي باشد. متغير جديد sql به ما كمك مي كند كه كوئري و پرس و جوي خود را در آن بنويسيم با دستور INSERT كه براي درج اطلاعات در بانك اطلاعاتي استفاده مي شود اطلاعات را در جدول posts درج مي كنيم. سپس با mysql_query دستورات را اجرا مي كنيم. در پايان به اين عنوان كه پيامي براي عمليات موفقيت آميز نشان بدهيم با دستور echo  چاپ مي كنيم كه اين مطلب با عنوان متغير title ارسال گرديد. سپس صفحه ي php را خاتمه مي دهيم.<br />
<br />
اگر مشكلي بود اطلاع دهيد چون تازه من اين روش ياد گرفتم.<br />
<br />
hadimir<br />
محمد هادي معصومي.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[ارسال ايميل با php]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=287</link>
			<pubDate>Fri, 03 Sep 2010 10:52:41 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=287</guid>
			<description><![CDATA[<span style="font-weight: bold;">ارسال ايميل با php</span><br />
ساختار :<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>bool mail&nbsp;&nbsp;( string &#36;to&nbsp;&nbsp;, string &#36;subject&nbsp;&nbsp;, string &#36;message&nbsp;&nbsp;[, string &#36;additional_headers&nbsp;&nbsp;[, string &#36;additional_parameters&nbsp;&nbsp;&#93;&#93; )</code></div></div>
كلمه bool قبل از تابع كه در ساختار اومده به اين معني هست كه تابع بد از اجرا يك مقدار bool رو بر مي گردونه<br />
يعني يا true يا false<br />
پارامتر ها<br />
<span style="font-weight: bold;">to :</span><br />
آدرس يا آدرس هايي كه قرار هست ايميل ارسال بشه<br />
بايد به صورت فرمت استاندارد باشه :<br />
<div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>
نمونه ها:<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>*&nbsp;&nbsp;[email&#93;user@example.com[/email&#93;<br />
&nbsp;&nbsp;&nbsp;&nbsp;* [email&#93;user@example.com[/email&#93;, [email&#93;anotheruser@example.com[/email&#93;<br />
&nbsp;&nbsp;&nbsp;&nbsp;* User &lt;user@example.com&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;* User &lt;user@example.com&gt;, Another User &lt;anotheruser@example.com&gt;</code></div></div>
<span style="font-weight: bold;">subject:</span><br />
موضوع نامه<br />
<span style="font-weight: bold;">message</span><br />
متن پيام<br />
<span style="font-weight: bold;">additional_headers</span><br />
اختياري هست ، هدر هاي نامه هست كه مثلا مشخص مي كنيم اين نامه رو به صورت html پردازش كن يا plain text<br />
يا utf پردازش كن و از اين قبيل...<br />
مثال ها :<br />
<div class="codeblock phpcodeblock"><div class="title">کد PHP:<br />
</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">//&nbsp;The&nbsp;message<br /></span><span style="color: #0000BB">&#36;message&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">"Line&nbsp;1&#092;nLine&nbsp;2&#092;nLine&nbsp;3"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">//&nbsp;In&nbsp;case&nbsp;any&nbsp;of&nbsp;our&nbsp;lines&nbsp;are&nbsp;larger&nbsp;than&nbsp;70&nbsp;characters,&nbsp;we&nbsp;should&nbsp;use&nbsp;wordwrap()<br /></span><span style="color: #0000BB">&#36;message&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">wordwrap</span><span style="color: #007700">(</span><span style="color: #0000BB">&#36;message</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">70</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">//&nbsp;Send<br /></span><span style="color: #0000BB">mail</span><span style="color: #007700">(</span><span style="color: #DD0000">'caffeinated@example.com'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'My&nbsp;Subject'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">&#36;message</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></code></div></div></div>
<div class="codeblock phpcodeblock"><div class="title">کد PHP:<br />
</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">&lt;?php<br />&#36;to&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'nobody@example.com'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">&#36;subject&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'the&nbsp;subject'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">&#36;message&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'hello'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">&#36;headers&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'From:&nbsp;webmaster@example.com'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"&#092;r&#092;n"&nbsp;</span><span style="color: #007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'Reply-To:&nbsp;webmaster@example.com'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"&#092;r&#092;n"&nbsp;</span><span style="color: #007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'X-Mailer:&nbsp;PHP/'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">phpversion</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">mail</span><span style="color: #007700">(</span><span style="color: #0000BB">&#36;to</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">&#36;subject</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">&#36;message</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">&#36;headers</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></code></div></div></div>
<div class="codeblock phpcodeblock"><div class="title">کد PHP:<br />
</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">//&nbsp;multiple&nbsp;recipients<br /></span><span style="color: #0000BB">&#36;to&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'aidan@example.com'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">',&nbsp;'</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//&nbsp;note&nbsp;the&nbsp;comma<br /></span><span style="color: #0000BB">&#36;to&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">'wez@example.com'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">//&nbsp;subject<br /></span><span style="color: #0000BB">&#36;subject&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'Birthday&nbsp;Reminders&nbsp;for&nbsp;August'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">//&nbsp;message<br /></span><span style="color: #0000BB">&#36;message&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'<br />&lt;html&gt;<br />&lt;head&gt;<br />&nbsp;&nbsp;&lt;title&gt;Birthday&nbsp;Reminders&nbsp;for&nbsp;August&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&nbsp;&nbsp;&lt;p&gt;Here&nbsp;are&nbsp;the&nbsp;birthdays&nbsp;upcoming&nbsp;in&nbsp;August!&lt;/p&gt;<br />&nbsp;&nbsp;&lt;table&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Person&lt;/th&gt;&lt;th&gt;Day&lt;/th&gt;&lt;th&gt;Month&lt;/th&gt;&lt;th&gt;Year&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;Joe&lt;/td&gt;&lt;td&gt;3rd&lt;/td&gt;&lt;td&gt;August&lt;/td&gt;&lt;td&gt;1970&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;Sally&lt;/td&gt;&lt;td&gt;17th&lt;/td&gt;&lt;td&gt;August&lt;/td&gt;&lt;td&gt;1973&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />&nbsp;&nbsp;&lt;/table&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br />'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">//&nbsp;To&nbsp;send&nbsp;HTML&nbsp;mail,&nbsp;the&nbsp;Content-type&nbsp;header&nbsp;must&nbsp;be&nbsp;set<br /></span><span style="color: #0000BB">&#36;headers&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'MIME-Version:&nbsp;1.0'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"&#092;r&#092;n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">&#36;headers&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">'Content-type:&nbsp;text/html;&nbsp;charset=iso-8859-1'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"&#092;r&#092;n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">//&nbsp;Additional&nbsp;headers<br /></span><span style="color: #0000BB">&#36;headers&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">'To:&nbsp;Mary&nbsp;&lt;mary@example.com&gt;,&nbsp;Kelly&nbsp;&lt;kelly@example.com&gt;'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"&#092;r&#092;n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">&#36;headers&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">'From:&nbsp;Birthday&nbsp;Reminder&nbsp;&lt;birthday@example.com&gt;'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"&#092;r&#092;n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">&#36;headers&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">'Cc:&nbsp;birthdayarchive@example.com'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"&#092;r&#092;n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">&#36;headers&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">'Bcc:&nbsp;birthdaycheck@example.com'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"&#092;r&#092;n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">//&nbsp;Mail&nbsp;it<br /></span><span style="color: #0000BB">mail</span><span style="color: #007700">(</span><span style="color: #0000BB">&#36;to</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">&#36;subject</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">&#36;message</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">&#36;headers</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></code></div></div></div>
منبع : <br />
<div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>
<span style="color: #FF0000;">پ.ن :</span> دوستان اگر مورد خاصي بود لطفا پ.خ بديد و حدالمكان در تاپيك پست نديد كه اگر بشه تو همين تاپيك آموزش يك فرم تماس با ما زيبا رو با استفاده از قالب html بذارم...<br />
سعي مي كنم با فايل ها كار كنم كه گريزي هم روي اين موارد داشته باشيم.]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;">ارسال ايميل با php</span><br />
ساختار :<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>bool mail&nbsp;&nbsp;( string &#36;to&nbsp;&nbsp;, string &#36;subject&nbsp;&nbsp;, string &#36;message&nbsp;&nbsp;[, string &#36;additional_headers&nbsp;&nbsp;[, string &#36;additional_parameters&nbsp;&nbsp;]] )</code></div></div>
كلمه bool قبل از تابع كه در ساختار اومده به اين معني هست كه تابع بد از اجرا يك مقدار bool رو بر مي گردونه<br />
يعني يا true يا false<br />
پارامتر ها<br />
<span style="font-weight: bold;">to :</span><br />
آدرس يا آدرس هايي كه قرار هست ايميل ارسال بشه<br />
بايد به صورت فرمت استاندارد باشه :<br />
<div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>
نمونه ها:<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>*&nbsp;&nbsp;[email]user@example.com[/email]<br />
&nbsp;&nbsp;&nbsp;&nbsp;* [email]user@example.com[/email], [email]anotheruser@example.com[/email]<br />
&nbsp;&nbsp;&nbsp;&nbsp;* User &lt;user@example.com&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;* User &lt;user@example.com&gt;, Another User &lt;anotheruser@example.com&gt;</code></div></div>
<span style="font-weight: bold;">subject:</span><br />
موضوع نامه<br />
<span style="font-weight: bold;">message</span><br />
متن پيام<br />
<span style="font-weight: bold;">additional_headers</span><br />
اختياري هست ، هدر هاي نامه هست كه مثلا مشخص مي كنيم اين نامه رو به صورت html پردازش كن يا plain text<br />
يا utf پردازش كن و از اين قبيل...<br />
مثال ها :<br />
<div class="codeblock phpcodeblock"><div class="title">کد PHP:<br />
</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">//&nbsp;The&nbsp;message<br /></span><span style="color: #0000BB">&#36;message&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">"Line&nbsp;1&#092;nLine&nbsp;2&#092;nLine&nbsp;3"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">//&nbsp;In&nbsp;case&nbsp;any&nbsp;of&nbsp;our&nbsp;lines&nbsp;are&nbsp;larger&nbsp;than&nbsp;70&nbsp;characters,&nbsp;we&nbsp;should&nbsp;use&nbsp;wordwrap()<br /></span><span style="color: #0000BB">&#36;message&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">wordwrap</span><span style="color: #007700">(</span><span style="color: #0000BB">&#36;message</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">70</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">//&nbsp;Send<br /></span><span style="color: #0000BB">mail</span><span style="color: #007700">(</span><span style="color: #DD0000">'caffeinated@example.com'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'My&nbsp;Subject'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">&#36;message</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></code></div></div></div>
<div class="codeblock phpcodeblock"><div class="title">کد PHP:<br />
</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">&lt;?php<br />&#36;to&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'nobody@example.com'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">&#36;subject&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'the&nbsp;subject'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">&#36;message&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'hello'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">&#36;headers&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'From:&nbsp;webmaster@example.com'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"&#092;r&#092;n"&nbsp;</span><span style="color: #007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'Reply-To:&nbsp;webmaster@example.com'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"&#092;r&#092;n"&nbsp;</span><span style="color: #007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'X-Mailer:&nbsp;PHP/'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">phpversion</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">mail</span><span style="color: #007700">(</span><span style="color: #0000BB">&#36;to</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">&#36;subject</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">&#36;message</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">&#36;headers</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></code></div></div></div>
<div class="codeblock phpcodeblock"><div class="title">کد PHP:<br />
</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">//&nbsp;multiple&nbsp;recipients<br /></span><span style="color: #0000BB">&#36;to&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'aidan@example.com'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">',&nbsp;'</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//&nbsp;note&nbsp;the&nbsp;comma<br /></span><span style="color: #0000BB">&#36;to&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">'wez@example.com'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">//&nbsp;subject<br /></span><span style="color: #0000BB">&#36;subject&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'Birthday&nbsp;Reminders&nbsp;for&nbsp;August'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">//&nbsp;message<br /></span><span style="color: #0000BB">&#36;message&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'<br />&lt;html&gt;<br />&lt;head&gt;<br />&nbsp;&nbsp;&lt;title&gt;Birthday&nbsp;Reminders&nbsp;for&nbsp;August&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&nbsp;&nbsp;&lt;p&gt;Here&nbsp;are&nbsp;the&nbsp;birthdays&nbsp;upcoming&nbsp;in&nbsp;August!&lt;/p&gt;<br />&nbsp;&nbsp;&lt;table&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;Person&lt;/th&gt;&lt;th&gt;Day&lt;/th&gt;&lt;th&gt;Month&lt;/th&gt;&lt;th&gt;Year&lt;/th&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;Joe&lt;/td&gt;&lt;td&gt;3rd&lt;/td&gt;&lt;td&gt;August&lt;/td&gt;&lt;td&gt;1970&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;Sally&lt;/td&gt;&lt;td&gt;17th&lt;/td&gt;&lt;td&gt;August&lt;/td&gt;&lt;td&gt;1973&lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />&nbsp;&nbsp;&lt;/table&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br />'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">//&nbsp;To&nbsp;send&nbsp;HTML&nbsp;mail,&nbsp;the&nbsp;Content-type&nbsp;header&nbsp;must&nbsp;be&nbsp;set<br /></span><span style="color: #0000BB">&#36;headers&nbsp;&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'MIME-Version:&nbsp;1.0'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"&#092;r&#092;n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">&#36;headers&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">'Content-type:&nbsp;text/html;&nbsp;charset=iso-8859-1'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"&#092;r&#092;n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">//&nbsp;Additional&nbsp;headers<br /></span><span style="color: #0000BB">&#36;headers&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">'To:&nbsp;Mary&nbsp;&lt;mary@example.com&gt;,&nbsp;Kelly&nbsp;&lt;kelly@example.com&gt;'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"&#092;r&#092;n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">&#36;headers&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">'From:&nbsp;Birthday&nbsp;Reminder&nbsp;&lt;birthday@example.com&gt;'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"&#092;r&#092;n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">&#36;headers&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">'Cc:&nbsp;birthdayarchive@example.com'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"&#092;r&#092;n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">&#36;headers&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #DD0000">'Bcc:&nbsp;birthdaycheck@example.com'&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"&#092;r&#092;n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">//&nbsp;Mail&nbsp;it<br /></span><span style="color: #0000BB">mail</span><span style="color: #007700">(</span><span style="color: #0000BB">&#36;to</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">&#36;subject</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">&#36;message</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">&#36;headers</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></code></div></div></div>
منبع : <br />
<div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>
<span style="color: #FF0000;">پ.ن :</span> دوستان اگر مورد خاصي بود لطفا پ.خ بديد و حدالمكان در تاپيك پست نديد كه اگر بشه تو همين تاپيك آموزش يك فرم تماس با ما زيبا رو با استفاده از قالب html بذارم...<br />
سعي مي كنم با فايل ها كار كنم كه گريزي هم روي اين موارد داشته باشيم.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[ارث بری]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=286</link>
			<pubDate>Fri, 03 Sep 2010 10:22:42 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=286</guid>
			<description><![CDATA[گاهی ناگذيريم کلاس جديدی ايجاد کنيم که شباهت هائی با کلاسی دارد که قبلا ايجاد شده است و می خواهيم عملکردهائی را به آن اضافه کنيم اين عمل توسط ارث بری (inheritance) امکان پذير است. وراثت يکی از پايه های برنامه نويسی شیء گرائی است.<br />
<br />
<span style="font-weight: bold;">کلاس های پايه و مشتق شده</span><br />
<br />
چند کلاس ممکن است خصوصيات و رفتارهای مشترکی داشته باشند اما هريک شامل خواص و توابع ديگری هم باشد. وراثت اجازه می دهد يک کلاس عمومی تعريف شود که اشيا درخصوصيات آن مشترک هستند و اين کلاس می تواند توسط ساير کلاس ها ارث برده شود و خواص جديدی به آن اضافه شود بدون اينکه تاثيری روی کلاس عمومی داشته باشد.<br />
<br />
توارث شباهت بين دو کلاس را با استفاده از مفاهيم کلاس پايه (base) و کلاس مشتق شده (derived) بيان می کند. کلاسی که از آن ارث بری می شود کلاس پايه يا مبنا و کلاس وارث که خصوصيات کلاس پايه را به ارث می برد را کلاس مشتق شده می نامند. کلاس پايه شامل کليه خواص و رفتارهائی است که بين کلاس های مشتق شده مشترک است.<br />
<br />
<div style="text-align: center;"><img src="http://hpkclasses.ir/Courses/cpp/cpp1201.JPG" border="0" alt="[تصویر: cpp1201.JPG&#93;" /></div>
<br />
مثال. کلاس پايه shape را درنظر بگيريد که دارای خاصيت های اندازه، رنگ و موقعيت است. هر شکل می تواند رسم شود، پاک شود، حرکت کند و رنگ شود. هر کدام از اشکال دارای خواص و رفتارهای اضافه تری هستند. برای يک شکل معين بعضی رفتارها ممکن است متفاوت باشد مثلا محاسبه مساحت.<br />
<br />
<div style="text-align: center;"><img src="http://hpkclasses.ir/Courses/cpp/cpp1202.JPG" border="0" alt="[تصویر: cpp1202.JPG&#93;" /></div>
<br />
نکته. يک کلاس متشق شده به نوبه خود می تواند کلاس پايه برای ساير کلاس ها باشد.<br />
نکته. اگر کلاس پايه تغيير کند کلاس مشتق شده نيز تحت تاثير اين تغييرات قرار می گيرد.<br />
<br />
<span style="font-weight: bold;">تعريف کلاس مشتق شده</span><br />
<br />
فرم کلی تعريف يک کلاس مشتق شده به صورت زير است:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>class derived : access base<br />
{<br />
&nbsp;&nbsp; //members of new class;<br />
}</code></div></div>
<br />
derived نام کلاس جديد است که از کلاس پايه base مشتق شده است. قسمت access اختياری است ولی می تواند public، private يا protected باشد و برای تعيين مجوز دسترسی اعضای کلاس پايه در کلاس جديد بکار می رود. اگر مجوز دسترسی ذکر نشود به اين معنی است که کليه اعضای عمومی کلاس پايه در کلاس مشتق شده به صورت خصوصی خواهند بود.<br />
<br />
مثال. کلاس جديد Derived از کلاس Base مشتق شده است. در برنامه اصلی تابع change از کلاس Derived فراخوانی شده که خود دو تابع set و read از کلاس Base را صدا می زند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
class Base {<br />
&nbsp;&nbsp; int i;<br />
protected:<br />
&nbsp;&nbsp; int read() { return i; }<br />
&nbsp;&nbsp; void set(int ii) { i = ii; }<br />
public:<br />
&nbsp;&nbsp; Base() { i=0; }<br />
&nbsp;&nbsp; int value(int m) { return m*i; }<br />
};<br />
class Derived : public Base {<br />
&nbsp;&nbsp; int j;<br />
public:<br />
&nbsp;&nbsp; Derived() { j=0; }<br />
&nbsp;&nbsp; void change(int x) { set(x); cout &lt;&lt; read(); }<br />
};<br />
int main() {<br />
&nbsp;&nbsp; Derived d;<br />
&nbsp;&nbsp; d.change(10);<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
<br />
<span style="font-weight: bold;">کنترل دسترسی به اعضای کلاس پايه</span><br />
<br />
کلاس مشتق شده کليه اعضای کلاس پايه را به ارث می برند اما اجازه دسترسی مستقيم به اعضای خصوصی کلاس پايه را ندارند و تنها از طريق توابع عمومی و سازنده به آنها دسترسی دارند.<br />
<br />
نحوه دسترسی به اعضای عمومی کلاس پايه در کلاس مشتق شده توسط يکی مجوزهای دسترسی زير که قبل از نام کلاس پايه ذکر می شود مشخص می شود:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>•&nbsp;&nbsp;&nbsp;&nbsp;public<br />
•&nbsp;&nbsp;&nbsp;&nbsp;private<br />
•&nbsp;&nbsp;&nbsp;&nbsp;protected</code></div></div>
<br />
<span style="font-weight: bold;">توارث عمومی</span><br />
<br />
با ذکر کلمه public قبل از نام کلاس پايه اعضای عمومی کلاس پايه به عنوان اعضای عمومی کلاس مشتق شده تلقی می شوند و در اختيار کاربر کلاس مشتق شده قرار می گيرد.<br />
<br />
مثال. در مثال قبل تابع value از کلاس Base به اعضای عمومی Derived اضافه می شود بنابراين در برنامه قابل دسترسی است.<br />
<br />
<span style="font-weight: bold;">توارث خصوصی</span><br />
<br />
با حذف کلمه public يا صريحا با ذکر کلمه private يک کلاس پايه می تواند به صورت خصوصی ارث گرفته شود. در توارث خصوصی کلاس مشتق شده کليه اعضای کلاس پايه را دارا خواهد بود اما به صورت مخفی و اعضای عمومی کلاس پايه اعضای خصوصی کلاس مشتق شده خواهند شد. بنابراين يک شی به عنوان يک نمونه از کلاس نمی تواند به اعضای کلاس پايه دسترسی پيدا کند.<br />
<br />
نکته. توارث خصوصی برای پنهان کردن لايه زيرين پياده سازی کلاس پايه مفيد است.<br />
نکته. در توارث خصوصی کليه اعضای عمومی کلاس پايه خصوصی می شوند. اگر می خواهيد عضوی قابل رويت شود کافی است نام آن را (بدون آرگومان و مقدار برگشتی) در بخش public کلاس مشتق شده ذکر کنيد. <br />
مثال. چون وراثت خصوصی است تابع speak از کلاس پايه Pet در برنامه قابل دسترس نيست درحاليکه توابع eat و sleep از کلاس پايه به صورت قابل دسترس درآمده اند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>class Pet {<br />
public:<br />
&nbsp;&nbsp; char eat() { return 'a'; }<br />
&nbsp;&nbsp; int speak() { return 2; }<br />
&nbsp;&nbsp; float sleep() { return 3.0; }<br />
&nbsp;&nbsp; float sleep(int) { return 4.0; }<br />
};<br />
class Goldfish : Pet {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Private inheritance<br />
public:<br />
&nbsp;&nbsp; Pet::eat;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Name publicizes member<br />
&nbsp;&nbsp; Pet::sleep;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Both overloaded members exposed<br />
};<br />
int main() {<br />
&nbsp;&nbsp; Goldfish bob;<br />
&nbsp;&nbsp; bob.eat();<br />
&nbsp;&nbsp; bob.sleep();<br />
&nbsp;&nbsp; bob.sleep(1);<br />
//! bob.speak();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Error: private member function<br />
}</code></div></div>
<br />
<span style="font-weight: bold;">توارث محافظت شده</span><br />
<br />
اعضای خصوصی هميشه خصوصی هستند اما گاهی می خواهيد اعضائی را از خارج مخفی کنيد ولی در کلاس مشتق شده قابل رويت باشند. کلمه protected می گويد که اعضای محافظت شده برای هر کسی که از اين کلاس ارث می برد قابل دسترس است و برای بقيه خصوصی است.<br />
<br />
مثال. توابع set و read از کلاس Base درمثال قبل در کلاس مشتق شده Derived قابل رويت هستند ولی در برنامه مخفی هستند.<br />
<br />
با قرار دادن کلمه protected قبل از نام کلاس مشتق شده اعضای محافظت شده و عمومی کلاس پايه به اعضای محافظت شده کلاس مشتق شده اضافه خواهند شد. بنابراين برای وارثين کلاس مشتق شده در دسترس است و برای بقيه پنهان باقی می ماند<br />
<br />
نکته. در کليه حالات اعضای خصوصی کلاس پايه در وراثت شرکت نمی کنند و خصوصی باقی می مانند. <br />
نکته. معمولا توارث عمومی است تا رابط کلاس پايه همچنان رابط کلاس مشتق شده باشد.<br />
نکته. توارث محافظت شده خيلی استفاده نمی شود و فقط برای تکميل زبان برنامه نويسی است. <br />
نکته. مناسب ترين روش اين است که اعضای داده ای کلاس را صورت خصوصی تعريف کنيد تا امکان تغيير پياده سازی زيرين حفظ شود. و به وارثين کلاس مجوز دسترسی کنترل شده ای به توابع عضو محافظت شده بدهيد. <br />
<br />
<span style="font-weight: bold;">وراثت چندگانه</span><br />
<br />
کلاس مشتق شده می تواند از بيش از يک کلاس پايه ارث بری داشته باشد. در توارث چندگانه (multiple inheritance) چند کلاس به عنوان کلاس پايه اضافه می شوند. نام کلاس های پايه توسط کاما از هم جدا می شود.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>class derived : access base1, access base2 ,.. { //...</code></div></div>
<br />
<span style="font-weight: bold;">سازنده ها و مخرب ها در وراثت</span><br />
<br />
کلاس پايه و مشتق شده هر يک می تواند شامل توابع سازنده و مشتق شده باشند. وقتی شیئی ايجاد می شود کامپايلر تضمين می کند که کليه سازنده ها فراخوانی می شوند. در سلسله مراتب وراثت فراخوانی سازنده ها از ريشه شروع می شود. در هر سطح ابتدا سازنده کلاس پايه سپس سازنده کلاس مشتق شده فراخوانی می شود. مخرب ها برعکس ترتيب فراخوانی سازنده ها فراخوانی می شوند.<br />
<br />
مثال. در برنامه زير کلاس Derived2 از کلاس Derived1 که خود از Base1 ارث بری دارد ارث می برد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
class Base1 {<br />
&nbsp;&nbsp; int x;<br />
public:<br />
&nbsp;&nbsp; Base1 () {cout &lt;&lt; "Base1 constructor&#92;n";}<br />
&nbsp;&nbsp; ~Base1() {cout &lt;&lt; "Base1 destructor&#92;n";}<br />
};<br />
class Derived1 : public Base1 {<br />
&nbsp;&nbsp; int y;<br />
public:<br />
&nbsp;&nbsp; Derived1() { cout &lt;&lt; "Derived1 constructor&#92;n";}<br />
&nbsp;&nbsp; ~Derived1() { cout &lt;&lt; "Derived1 destructor&#92;n";}<br />
};<br />
class Derived2 : public Derived1 {<br />
&nbsp;&nbsp; int z;<br />
public:<br />
&nbsp;&nbsp; Derived2() { cout &lt;&lt; "Derived2 constructor&#92;n";}<br />
&nbsp;&nbsp; ~Derived2() { cout &lt;&lt; "Derived2 destructor&#92;n";}<br />
};<br />
int main() {<br />
&nbsp;&nbsp; Derived2 d2;<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
خروجی برنامه به صورت زير است:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>Base1 constructor<br />
Derived1 constructor<br />
Derived2 constructor<br />
Derived2 destructor<br />
Derived1 destructor<br />
Base1 destructor</code></div></div>
نکته. ترتيب فراخوانی سازنده ها و مخرب ها در در توارث چندگانه هم صدق می کند. سازنده ها به ترتيبی که در ليست مشخص شده اند از چپ به راست فراخوانی می شوند. و مخرب ها برعکس.<br />
<br />
<span style="font-weight: bold;">ارسال پارامتر به سازنده کلاس پايه</span><br />
<br />
زمانی که تنها سازنده کلاس مشتق شده دارای آرگومان است می توان به سادگی و به صورت متعارف آرگومان را به سازنده ارسال نمود. اما برای ارسال آرگومان به سازنده کلاس پايه دچار مشکل می شويد چون سازنده کلاس مشتق شده به داده خصوصی کلاس پايه دسترسی ندارد و نمی تواند آنها را مقداردهی کند. برای اين کار C++ گرامری را در اختيار می گذارد که ليست مقداردهی سازنده (constructor initializer list) نام دارد. ليست مقداردهی سازنده امکان فراخوانی صريح سازنده ها از اشيای عضو را می دهد. فرم کلی آن برای سازنده کلاس مشتق شده به صورت زير است:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>Derived(arg_list) : Base1(arg_list), Base2(arg_list), ...<br />
{ //body of derived constructor}</code></div></div>
<br />
نام کلاس های پايه توسط کاما از هم جدا می شوند. Base1 و Base2 و ... نام کلاس های پايه هستند که توسط کلاس مشتق شده Derived به ارث برده می شوند. سازنده ها همگی قبل از اينکه وارد بدنه سازنده کلاس مشتق شده شويد فراخوانی می شوند.<br />
<br />
مثال. کلاس Circle از کلاس Point مشتق شده است. در سازنده کلاس Circle سازنده Coint فراخوانی می شود.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
class Point {<br />
&nbsp;&nbsp; int x,y;<br />
public:<br />
&nbsp;&nbsp; Point(int atx,int aty ) {x = atx; y = aty;}<br />
&nbsp;&nbsp; ~Point(){ cout &lt;&lt; "Point Destructor called&#92;n";}<br />
&nbsp;&nbsp; virtual void Draw() { cout &lt;&lt; "Draw point at " &lt;&lt; x &lt;&lt; " " &lt;&lt; y &lt;&lt; endl;}<br />
}; <br />
class Circle : public Point {<br />
&nbsp;&nbsp; int radius;<br />
public:<br />
&nbsp;&nbsp; Circle(int atx, int aty, int theRadius) ;<br />
&nbsp;&nbsp; ~Circle() ;<br />
&nbsp;&nbsp; virtual void Draw() ;<br />
};<br />
Circle::Circle(int atx,int aty,int theRadius) : Point(atx,aty) {<br />
&nbsp;&nbsp; radius = theRadius;<br />
}<br />
inline Circle::~Circle() {<br />
&nbsp;&nbsp; cout &lt;&lt; "Circle Destructor called" &lt;&lt; endl;<br />
}<br />
void Circle::Draw( void ) {<br />
&nbsp;&nbsp; Point::Draw();<br />
&nbsp;&nbsp; cout &lt;&lt; "circle::Draw point " &lt;&lt; " Radius " &lt;&lt; radius &lt;&lt; endl;<br />
}<br />
int main() {<br />
&nbsp;&nbsp; Circle ACircle(10,10,5) ;<br />
&nbsp;&nbsp; ACircle.Draw();<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
برخلاف اينکه اغلب نياز است سازنده ها به صورت مستقيم در ليست مقداردهی فراخوانی شوند، مخرب ها نيازی به فراخوانی صريح ندارند زيرا هر کلاس تنها يک مخرب بدون هيچ آرگومانی دارد. کامپايلر کليه مخرب ها را از آخرين کلاس مشتق شده به سمت ريشه در کل سلسله مراتب وارثت اجرا می کند.<br />
<br />
<br />
منبع: <div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>]]></description>
			<content:encoded><![CDATA[گاهی ناگذيريم کلاس جديدی ايجاد کنيم که شباهت هائی با کلاسی دارد که قبلا ايجاد شده است و می خواهيم عملکردهائی را به آن اضافه کنيم اين عمل توسط ارث بری (inheritance) امکان پذير است. وراثت يکی از پايه های برنامه نويسی شیء گرائی است.<br />
<br />
<span style="font-weight: bold;">کلاس های پايه و مشتق شده</span><br />
<br />
چند کلاس ممکن است خصوصيات و رفتارهای مشترکی داشته باشند اما هريک شامل خواص و توابع ديگری هم باشد. وراثت اجازه می دهد يک کلاس عمومی تعريف شود که اشيا درخصوصيات آن مشترک هستند و اين کلاس می تواند توسط ساير کلاس ها ارث برده شود و خواص جديدی به آن اضافه شود بدون اينکه تاثيری روی کلاس عمومی داشته باشد.<br />
<br />
توارث شباهت بين دو کلاس را با استفاده از مفاهيم کلاس پايه (base) و کلاس مشتق شده (derived) بيان می کند. کلاسی که از آن ارث بری می شود کلاس پايه يا مبنا و کلاس وارث که خصوصيات کلاس پايه را به ارث می برد را کلاس مشتق شده می نامند. کلاس پايه شامل کليه خواص و رفتارهائی است که بين کلاس های مشتق شده مشترک است.<br />
<br />
<div style="text-align: center;"><img src="http://hpkclasses.ir/Courses/cpp/cpp1201.JPG" border="0" alt="[تصویر: cpp1201.JPG]" /></div>
<br />
مثال. کلاس پايه shape را درنظر بگيريد که دارای خاصيت های اندازه، رنگ و موقعيت است. هر شکل می تواند رسم شود، پاک شود، حرکت کند و رنگ شود. هر کدام از اشکال دارای خواص و رفتارهای اضافه تری هستند. برای يک شکل معين بعضی رفتارها ممکن است متفاوت باشد مثلا محاسبه مساحت.<br />
<br />
<div style="text-align: center;"><img src="http://hpkclasses.ir/Courses/cpp/cpp1202.JPG" border="0" alt="[تصویر: cpp1202.JPG]" /></div>
<br />
نکته. يک کلاس متشق شده به نوبه خود می تواند کلاس پايه برای ساير کلاس ها باشد.<br />
نکته. اگر کلاس پايه تغيير کند کلاس مشتق شده نيز تحت تاثير اين تغييرات قرار می گيرد.<br />
<br />
<span style="font-weight: bold;">تعريف کلاس مشتق شده</span><br />
<br />
فرم کلی تعريف يک کلاس مشتق شده به صورت زير است:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>class derived : access base<br />
{<br />
&nbsp;&nbsp; //members of new class;<br />
}</code></div></div>
<br />
derived نام کلاس جديد است که از کلاس پايه base مشتق شده است. قسمت access اختياری است ولی می تواند public، private يا protected باشد و برای تعيين مجوز دسترسی اعضای کلاس پايه در کلاس جديد بکار می رود. اگر مجوز دسترسی ذکر نشود به اين معنی است که کليه اعضای عمومی کلاس پايه در کلاس مشتق شده به صورت خصوصی خواهند بود.<br />
<br />
مثال. کلاس جديد Derived از کلاس Base مشتق شده است. در برنامه اصلی تابع change از کلاس Derived فراخوانی شده که خود دو تابع set و read از کلاس Base را صدا می زند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
class Base {<br />
&nbsp;&nbsp; int i;<br />
protected:<br />
&nbsp;&nbsp; int read() { return i; }<br />
&nbsp;&nbsp; void set(int ii) { i = ii; }<br />
public:<br />
&nbsp;&nbsp; Base() { i=0; }<br />
&nbsp;&nbsp; int value(int m) { return m*i; }<br />
};<br />
class Derived : public Base {<br />
&nbsp;&nbsp; int j;<br />
public:<br />
&nbsp;&nbsp; Derived() { j=0; }<br />
&nbsp;&nbsp; void change(int x) { set(x); cout &lt;&lt; read(); }<br />
};<br />
int main() {<br />
&nbsp;&nbsp; Derived d;<br />
&nbsp;&nbsp; d.change(10);<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
<br />
<span style="font-weight: bold;">کنترل دسترسی به اعضای کلاس پايه</span><br />
<br />
کلاس مشتق شده کليه اعضای کلاس پايه را به ارث می برند اما اجازه دسترسی مستقيم به اعضای خصوصی کلاس پايه را ندارند و تنها از طريق توابع عمومی و سازنده به آنها دسترسی دارند.<br />
<br />
نحوه دسترسی به اعضای عمومی کلاس پايه در کلاس مشتق شده توسط يکی مجوزهای دسترسی زير که قبل از نام کلاس پايه ذکر می شود مشخص می شود:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>•&nbsp;&nbsp;&nbsp;&nbsp;public<br />
•&nbsp;&nbsp;&nbsp;&nbsp;private<br />
•&nbsp;&nbsp;&nbsp;&nbsp;protected</code></div></div>
<br />
<span style="font-weight: bold;">توارث عمومی</span><br />
<br />
با ذکر کلمه public قبل از نام کلاس پايه اعضای عمومی کلاس پايه به عنوان اعضای عمومی کلاس مشتق شده تلقی می شوند و در اختيار کاربر کلاس مشتق شده قرار می گيرد.<br />
<br />
مثال. در مثال قبل تابع value از کلاس Base به اعضای عمومی Derived اضافه می شود بنابراين در برنامه قابل دسترسی است.<br />
<br />
<span style="font-weight: bold;">توارث خصوصی</span><br />
<br />
با حذف کلمه public يا صريحا با ذکر کلمه private يک کلاس پايه می تواند به صورت خصوصی ارث گرفته شود. در توارث خصوصی کلاس مشتق شده کليه اعضای کلاس پايه را دارا خواهد بود اما به صورت مخفی و اعضای عمومی کلاس پايه اعضای خصوصی کلاس مشتق شده خواهند شد. بنابراين يک شی به عنوان يک نمونه از کلاس نمی تواند به اعضای کلاس پايه دسترسی پيدا کند.<br />
<br />
نکته. توارث خصوصی برای پنهان کردن لايه زيرين پياده سازی کلاس پايه مفيد است.<br />
نکته. در توارث خصوصی کليه اعضای عمومی کلاس پايه خصوصی می شوند. اگر می خواهيد عضوی قابل رويت شود کافی است نام آن را (بدون آرگومان و مقدار برگشتی) در بخش public کلاس مشتق شده ذکر کنيد. <br />
مثال. چون وراثت خصوصی است تابع speak از کلاس پايه Pet در برنامه قابل دسترس نيست درحاليکه توابع eat و sleep از کلاس پايه به صورت قابل دسترس درآمده اند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>class Pet {<br />
public:<br />
&nbsp;&nbsp; char eat() { return 'a'; }<br />
&nbsp;&nbsp; int speak() { return 2; }<br />
&nbsp;&nbsp; float sleep() { return 3.0; }<br />
&nbsp;&nbsp; float sleep(int) { return 4.0; }<br />
};<br />
class Goldfish : Pet {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Private inheritance<br />
public:<br />
&nbsp;&nbsp; Pet::eat;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Name publicizes member<br />
&nbsp;&nbsp; Pet::sleep;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Both overloaded members exposed<br />
};<br />
int main() {<br />
&nbsp;&nbsp; Goldfish bob;<br />
&nbsp;&nbsp; bob.eat();<br />
&nbsp;&nbsp; bob.sleep();<br />
&nbsp;&nbsp; bob.sleep(1);<br />
//! bob.speak();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Error: private member function<br />
}</code></div></div>
<br />
<span style="font-weight: bold;">توارث محافظت شده</span><br />
<br />
اعضای خصوصی هميشه خصوصی هستند اما گاهی می خواهيد اعضائی را از خارج مخفی کنيد ولی در کلاس مشتق شده قابل رويت باشند. کلمه protected می گويد که اعضای محافظت شده برای هر کسی که از اين کلاس ارث می برد قابل دسترس است و برای بقيه خصوصی است.<br />
<br />
مثال. توابع set و read از کلاس Base درمثال قبل در کلاس مشتق شده Derived قابل رويت هستند ولی در برنامه مخفی هستند.<br />
<br />
با قرار دادن کلمه protected قبل از نام کلاس مشتق شده اعضای محافظت شده و عمومی کلاس پايه به اعضای محافظت شده کلاس مشتق شده اضافه خواهند شد. بنابراين برای وارثين کلاس مشتق شده در دسترس است و برای بقيه پنهان باقی می ماند<br />
<br />
نکته. در کليه حالات اعضای خصوصی کلاس پايه در وراثت شرکت نمی کنند و خصوصی باقی می مانند. <br />
نکته. معمولا توارث عمومی است تا رابط کلاس پايه همچنان رابط کلاس مشتق شده باشد.<br />
نکته. توارث محافظت شده خيلی استفاده نمی شود و فقط برای تکميل زبان برنامه نويسی است. <br />
نکته. مناسب ترين روش اين است که اعضای داده ای کلاس را صورت خصوصی تعريف کنيد تا امکان تغيير پياده سازی زيرين حفظ شود. و به وارثين کلاس مجوز دسترسی کنترل شده ای به توابع عضو محافظت شده بدهيد. <br />
<br />
<span style="font-weight: bold;">وراثت چندگانه</span><br />
<br />
کلاس مشتق شده می تواند از بيش از يک کلاس پايه ارث بری داشته باشد. در توارث چندگانه (multiple inheritance) چند کلاس به عنوان کلاس پايه اضافه می شوند. نام کلاس های پايه توسط کاما از هم جدا می شود.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>class derived : access base1, access base2 ,.. { //...</code></div></div>
<br />
<span style="font-weight: bold;">سازنده ها و مخرب ها در وراثت</span><br />
<br />
کلاس پايه و مشتق شده هر يک می تواند شامل توابع سازنده و مشتق شده باشند. وقتی شیئی ايجاد می شود کامپايلر تضمين می کند که کليه سازنده ها فراخوانی می شوند. در سلسله مراتب وراثت فراخوانی سازنده ها از ريشه شروع می شود. در هر سطح ابتدا سازنده کلاس پايه سپس سازنده کلاس مشتق شده فراخوانی می شود. مخرب ها برعکس ترتيب فراخوانی سازنده ها فراخوانی می شوند.<br />
<br />
مثال. در برنامه زير کلاس Derived2 از کلاس Derived1 که خود از Base1 ارث بری دارد ارث می برد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
class Base1 {<br />
&nbsp;&nbsp; int x;<br />
public:<br />
&nbsp;&nbsp; Base1 () {cout &lt;&lt; "Base1 constructor&#92;n";}<br />
&nbsp;&nbsp; ~Base1() {cout &lt;&lt; "Base1 destructor&#92;n";}<br />
};<br />
class Derived1 : public Base1 {<br />
&nbsp;&nbsp; int y;<br />
public:<br />
&nbsp;&nbsp; Derived1() { cout &lt;&lt; "Derived1 constructor&#92;n";}<br />
&nbsp;&nbsp; ~Derived1() { cout &lt;&lt; "Derived1 destructor&#92;n";}<br />
};<br />
class Derived2 : public Derived1 {<br />
&nbsp;&nbsp; int z;<br />
public:<br />
&nbsp;&nbsp; Derived2() { cout &lt;&lt; "Derived2 constructor&#92;n";}<br />
&nbsp;&nbsp; ~Derived2() { cout &lt;&lt; "Derived2 destructor&#92;n";}<br />
};<br />
int main() {<br />
&nbsp;&nbsp; Derived2 d2;<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
خروجی برنامه به صورت زير است:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>Base1 constructor<br />
Derived1 constructor<br />
Derived2 constructor<br />
Derived2 destructor<br />
Derived1 destructor<br />
Base1 destructor</code></div></div>
نکته. ترتيب فراخوانی سازنده ها و مخرب ها در در توارث چندگانه هم صدق می کند. سازنده ها به ترتيبی که در ليست مشخص شده اند از چپ به راست فراخوانی می شوند. و مخرب ها برعکس.<br />
<br />
<span style="font-weight: bold;">ارسال پارامتر به سازنده کلاس پايه</span><br />
<br />
زمانی که تنها سازنده کلاس مشتق شده دارای آرگومان است می توان به سادگی و به صورت متعارف آرگومان را به سازنده ارسال نمود. اما برای ارسال آرگومان به سازنده کلاس پايه دچار مشکل می شويد چون سازنده کلاس مشتق شده به داده خصوصی کلاس پايه دسترسی ندارد و نمی تواند آنها را مقداردهی کند. برای اين کار C++ گرامری را در اختيار می گذارد که ليست مقداردهی سازنده (constructor initializer list) نام دارد. ليست مقداردهی سازنده امکان فراخوانی صريح سازنده ها از اشيای عضو را می دهد. فرم کلی آن برای سازنده کلاس مشتق شده به صورت زير است:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>Derived(arg_list) : Base1(arg_list), Base2(arg_list), ...<br />
{ //body of derived constructor}</code></div></div>
<br />
نام کلاس های پايه توسط کاما از هم جدا می شوند. Base1 و Base2 و ... نام کلاس های پايه هستند که توسط کلاس مشتق شده Derived به ارث برده می شوند. سازنده ها همگی قبل از اينکه وارد بدنه سازنده کلاس مشتق شده شويد فراخوانی می شوند.<br />
<br />
مثال. کلاس Circle از کلاس Point مشتق شده است. در سازنده کلاس Circle سازنده Coint فراخوانی می شود.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
class Point {<br />
&nbsp;&nbsp; int x,y;<br />
public:<br />
&nbsp;&nbsp; Point(int atx,int aty ) {x = atx; y = aty;}<br />
&nbsp;&nbsp; ~Point(){ cout &lt;&lt; "Point Destructor called&#92;n";}<br />
&nbsp;&nbsp; virtual void Draw() { cout &lt;&lt; "Draw point at " &lt;&lt; x &lt;&lt; " " &lt;&lt; y &lt;&lt; endl;}<br />
}; <br />
class Circle : public Point {<br />
&nbsp;&nbsp; int radius;<br />
public:<br />
&nbsp;&nbsp; Circle(int atx, int aty, int theRadius) ;<br />
&nbsp;&nbsp; ~Circle() ;<br />
&nbsp;&nbsp; virtual void Draw() ;<br />
};<br />
Circle::Circle(int atx,int aty,int theRadius) : Point(atx,aty) {<br />
&nbsp;&nbsp; radius = theRadius;<br />
}<br />
inline Circle::~Circle() {<br />
&nbsp;&nbsp; cout &lt;&lt; "Circle Destructor called" &lt;&lt; endl;<br />
}<br />
void Circle::Draw( void ) {<br />
&nbsp;&nbsp; Point::Draw();<br />
&nbsp;&nbsp; cout &lt;&lt; "circle::Draw point " &lt;&lt; " Radius " &lt;&lt; radius &lt;&lt; endl;<br />
}<br />
int main() {<br />
&nbsp;&nbsp; Circle ACircle(10,10,5) ;<br />
&nbsp;&nbsp; ACircle.Draw();<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
برخلاف اينکه اغلب نياز است سازنده ها به صورت مستقيم در ليست مقداردهی فراخوانی شوند، مخرب ها نيازی به فراخوانی صريح ندارند زيرا هر کلاس تنها يک مخرب بدون هيچ آرگومانی دارد. کامپايلر کليه مخرب ها را از آخرين کلاس مشتق شده به سمت ريشه در کل سلسله مراتب وارثت اجرا می کند.<br />
<br />
<br />
منبع: <div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[اشاره گرها]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=285</link>
			<pubDate>Fri, 03 Sep 2010 10:14:19 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=285</guid>
			<description><![CDATA[در این بخش مبحث مهم اشاره گرها در C معرفی می شود. اشاره گر متغيری است که آدرس متغير ديگری را نگه می دارد که اصطلاحا گفته می شود دارد به آن متغيری اشاره می کند. به دو عملگر * (address-of operator) و &amp; (indirection operator) با اشاره گرها نياز می شود. اشاره گرها روش قدرتمند و انعطاف پذیری برای کار با انواع داده ها در برنامه نظير آرايه ها، رشته ها و ساختمان ها است. کاربرد اشاره گرها برای استفاده از حافظه پویا هم در اینجا توضیح داده خواهد شد.<br />
<br />
<br />
اشاره گرها بخش قدرتمند و دشوار C و ++C هستند. اکثر مبتدیان در درک مناسب اشاره گرها مشکل دارند. متغیرهای استاندارد برچسب هایی هستند که برای تعیین بخش هائی از حافظه کنار گذاشته می شوند تا داده از نوع خاصی را ذخیره کنند درحاليکه یک اشاره گر به بخش هایی از حافظه که توسط متغیر دیگری اشغال شده اشاره می کند. یک متغیر استاندارد یک مقدار را ذخیره می کند اما یک اشاره گر آدرس محلی در حافظه را ذخیره می کند.<br />
<br />
<span style="font-weight: bold;">متغیر اشاره گر</span><br />
<br />
یک متغير اشاره گر (pointer variable) متغیری است که حاوی آدرس داده ، متغیر دیگر يا تابع است. برای ذخیره آدرس اولین مرحله اعلان متغیر اشاره گر است. اعلان متغير اشاره گر تقریبا مشابه متغيرهای ديگر است تنها باید قبل از نام متغیر علامت ستاره (*) برای نشان داده اینکه یک اشاره گر است اضافه شود. هنگام تعريف اشاره گر نوع داده ای که به آن اشاره می کند باید مشخص شود. اعلان اشاره گر از فرم کلی زیر تبعیت می کند:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>typename *ptrname;</code></div></div>
<br />
typename نوع داده است که اشاره گر به آن اشاره می کند. علامت (*) عملگری است که بیان می کند متغیر اشاره گری به داده ای از نوع typename است. اشاره گر می تواند همراه با متغیر های غیراشاره گری هم اعلان شود.<br />
<br />
مثال. متغیر ptr اشاره گری به یک داده صحیح است.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>int *ptr;<br />
int* ptr;</code></div></div>
<br />
مثال. در اعلان زیر age از نوع صحيح و ptr اشاره گری به داده صحيح است.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>int *ptr, age;</code></div></div>
<br />
بعد از اعلان متغیر اشاره گر باید آنرا به جائی اشاره داد يعنی آدرس مکانی از حافظه که حاوی داده مورد نظر است را به اشاره گر اختصاص داد. اگر یک اشاره گر فقط اعلان شود و مقداردهی نشود ممکن است به محل دلخواهی از حافظه اشاره کند و استفاده از آن بدون توجه به اين مسئله می تواند مشکلات مهمی روی سیستم تولید کند. یک تکنیک کلی مقداردهی اشاره گر با مقدار NULL يا صفر است.<br />
<br />
راه ديگر برای مقداردهی اشاره گر ذخیره آدرس متغیر دیگر در آن است. وقتی برنامه ای اجرا می شود کلیه اجزای آن در حافظه قرار می گیرد. بنابراین هر جز از برنامه از جمله متغیرها دارای آدرس هستند. عملگر &amp; (address-of operator) آدرس این اجزا را می دهد. عملگر &amp; آدرس عملوند خود را برمی گرداند که می توان این آدرس را درون یک متغیر اشاره گر ذخیره کرد.<br />
<br />
مقداردهی یک اشاره گر می تواند فرم کلی زیر را داشته باشد:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>pointer = &amp;variable;</code></div></div>
<br />
مثال. دستور زیر آدرس متغیر age را به اشاره گر ptr اختصاص می دهد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>ptr = &amp;age;</code></div></div>
<br />
مثال. در برنامه زير اشاره گر j آدرس متغیر i را نشان می دهد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
int main(){<br />
&nbsp;&nbsp; int i;<br />
&nbsp;&nbsp; int* j;<br />
&nbsp;&nbsp; j = &amp;i;<br />
&nbsp;&nbsp; i = 4;<br />
&nbsp;&nbsp; cout &lt;&lt; "i is " &lt;&lt; i;<br />
&nbsp;&nbsp; cout &lt;&lt; "&#92;n j is " &lt;&lt; j;<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
اشاره گرها نوعدار هستند یعنی باید به کامپایلر بگوئید که نوع متغیری که اشاره گر به آن اشاره می کند چیست. نوع اشاره گر و متغیری که به آن اشاره می کند باید یکسان باشد.<br />
<br />
مثال.. دستورات زير خطا تولید می کند چون نمی توان اشاره گر int را به نوع char اشاره داد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>char c='0';<br />
int *p=&amp;c;</code></div></div>
<br />
بعد از مقداردهی از طریق متغیر اشاره گر می توان با داده کار کرد. برای دسترسی به محلی که اشاره گر اشاره می کند از عملگر * استفاده می شود. عملگر* محتوای آدرسی از حافظه را برمی گرداند و عملگر مرجع (indirection operator) نامیده می شود چون در واقع یک ارجاع به آدرسی در حافظه است.<br />
<br />
مثال. متغیر اشاره گر ptr به داده صحیح اشاره می کند. توجه کنید چگونه از typedef برای نامگذاری نوع اشاره گر استفاده شده است.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>typedef *int IntPtr;<br />
IntPtr ptr;<br />
int pge;<br />
age =19;<br />
ptr = &amp;age; // get address of the AgeOfMary variable<br />
cout &lt;&lt; "ptr points to " &lt;&lt; *ptr &lt;&lt; endl;<br />
cout &lt;&lt; "age is " &lt;&lt; age &lt;&lt; endl;</code></div></div>
<br />
<div style="text-align: center;"><img src="http://hpkclasses.ir/Courses/cpp/cpp0901.JPG" border="0" alt="[تصویر: cpp0901.JPG&#93;" /></div>
<br />
برای اشاره گر ptr که به متغیر age اشاره کند موارد زیر صدق می کند:<br />
<br />
•	ptr* و age هردو به محتوای متغیر age ارجاع می کنند. <br />
•	ptr و age&amp; هر دو به آدرس متغیر age هستند. <br />
عملگر * هم به عنوان عملگر مرجع و هم عملگر ضرب استفاده می شود. کامپایلر از نحوه به کار بردن عملگر * در دستور تشخیص می دهد منظور کدام است. وقتی عملگر * بعد از اسم اشاره گری می آید منظور محلی که است که اشاره گر به آن دارد اشاره می کند.<br />
<br />
هر بایت حافظه دارای آدرس جداگانه ای است. بنابراین متغیرهائی مانند نوع int، float و ... که چندبایت در حافظه مصرف می کنند چند آدرس را اشغال می کنند. آدرس یک متغیر در حقیقت آدرس اولین بایت آن است.<br />
<br />
مثال. آدرس اولین بایت متغیر به اشاره گر اختصاص داده می شود بنابراین ptrint برابر با 1000، ptrchar برابر با 1003 و ptrfloat برابر با آدرس 1006 می شود.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>int i = 12252;<br />
char c = 90;<br />
float f = 1200.156004;<br />
int *ptrint;<br />
char *ptrchar;<br />
float *ptrfloat;<br />
...<br />
ptrint = &amp;i;<br />
ptrchar = &amp;c;<br />
ptrfloat = &amp;f;</code></div></div>
<div style="text-align: center;"><img src="http://hpkclasses.ir/Courses/cpp/cpp0902.JPG" border="0" alt="[تصویر: cpp0902.JPG&#93;" /></div>
<br />
<div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>
<br />
<span style="font-weight: bold;">حافظه پویا</span><br />
<br />
برای درک بهتر اشاره گرها نیاز است درباره نحوه ذخیره اطلاعات درحافظه بیشتر بدانید. حافظه RAM شامل مجموعه ای از محل های ذخیره سازی است که هر محل توسط یک آدرس منحصر بفرد مشخص می شود. وقتی برنامه ای را اجرا می کنید کد برنامه (دستورالعمل های زبان ماشین برنامه) و داده هائی که برنامه با آنها کار می کند در حافظه قرار می گیرند. اگر متغیری در برنامه تعریف شده باشد کامپایلر محلی از حافظه را برای آن کنار گذاشته آدرس آنرا به اسم متغیر مربوط می کند. بنابراین وقتی در برنامه از اسم متغیر استفاده می شود اتوماتیک به آدرس موردنظر مراجعه می شود.<br />
<br />
اشاره گرها وقتی نقش ایفا می کنند که بخواهیم از حافظه پویا (يا heap) استفاده کنیم. ناحيه Heap فضای آزاد حافظه است که در اخت‍يار هيچ برنامه ای نيست و می تواند به صورت پويا استفاده می شود، يعنی در حين اجرای برنامه در صورت نياز اختصاص داده می شود و هنگامی که ديگر به آن احتياج نباشد آزاد می شود.<br />
<br />
دستورات new و delete برای تخصيص و بازپس گيری حافظه هنگام کار با حافظه پويا استفاده می شوند.<br />
<br />
دستور new فضائی از حافظه آزاد را به برنامه اختصاص می دهد. میزان فضای موردنیاز توسط نوع داده ای که بعد از دستور ذکر می شود تعیین می شود. اگر دستور موفق باشد اشاره گری به فضای گرفته شده را برمیگرداند. اگر شکست بخورد مقدار NULL را برمیگرداند.<br />
<br />
بعد از اینکه کار با حافظه پویا باید حافظه گرفته شده توسط دستور delete پس داده شود. به این ترتیب حافظه می تواند مجدد توسط برنامه های دیگر استفاده شود.<br />
<br />
مثال.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>IntPtr = new int;<br />
if (IntPtr == NULL) {<br />
&nbsp;&nbsp; cerr &lt;&lt; "Could not allocate sufficient space" &lt;&lt; endl;<br />
&nbsp;&nbsp; exit(1);<br />
&nbsp;&nbsp; }<br />
*IntPtr = 55;<br />
delete IntPtr;<br />
IntPtr = 0;</code></div></div>
بعد از delete یک اشاره گر آترا با مقدار 0 پر کنید تا تصادفا آن را دوباره استفاده نکنید.<br />
<br />
اگر فضا های گرفته شده از حافظه آزاد پس داده نشود و برنامه خاتمه پیدا کند برنامه اصطلاحا دارای مشکل memory leak است. میزان حافظه موجود یعد از اجرای برنامه کمتر از قبل از اجرای آن است. مگراینکه کامپیوتر راه اندازی مجدد شود. بنابراین سعی کنید همیشه حافظه های گرفته شده را آزاد کنید.<br />
<br />
دستورات new و delete دو حالت دارند؛ برای آرا‍یه ها ا‍ن دو دستور به صورت زیر استفاده می شوند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>new[&#93;();<br />
delete[&#93;();</code></div></div>
<br />
مثال. برنامه زیر از حافظه پویا استفاده می کند. به آرایه a به اندازه 10 عدد صح‍یح حافظه اختصاص داد ه می شود. به b عددی صحیحی اختصاص می دهد با مقدار اولیه 89.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
int main() { <br />
&nbsp;&nbsp; int * a= new int[10&#93;;<br />
&nbsp;&nbsp; int * b=new int(89) ;<br />
&nbsp;&nbsp; cout &lt;&lt; "*b=" &lt;&lt; *b &lt;&lt; endl;<br />
&nbsp;&nbsp; *(a+5)=9;<br />
&nbsp;&nbsp; cout &lt;&lt; "a[5&#93;=" &lt;&lt; *(a+5) &lt;&lt; endl;<br />
&nbsp;&nbsp; delete [&#93; a;<br />
&nbsp;&nbsp; delete b;<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
نکته. برای هر دستور new یک دستور delete باید باشد.<br />
نکته. بررسی کنید دستور new خطا یا NULL برنگردانده باشد.<br />
نکته. برای آرایه ها [&#93; در دستورات new و delete لازم است.<br />
نکته. توابع ()malloc و ()free معادل دستورات new و delete هستند.<br />
<br />
<span style="font-weight: bold;">محاسبات روی اشاره گر</span><br />
<br />
عملیات جمع، تفریق، افزایش و کاهش را می توان روی متغيرهای اشاره گر انجام داد. چون اشاره گر آدرسی در حافظه است وقتی محاسباتی روی آن انجام می گیرد رفتار متفاوتی نشان می دهد. وقتی عمل جمع عددی با متغير اشاره گر صورت می گيرد اشاره گر به اندازه حاصلضرب عدد در تعداد بایت های نوع داده ای که اشاره می کند جلو می رود. همين برای عمل تفريق هم صدق می کند. اگر مقداری از متغير اشاره گر کم شود در محاسبات تعداد بايت های نوع داده محسوب می شود.<br />
<br />
عملگر افزایش (++) مقدار متغیر را یکی اضافه می کند در حالیکه متغير اشاره گر را به تعداد بایت های نوع داده آن حرکت می دهد. اگر یک اشاره گر به عدد float دارید چون نوع float چهار بایت دارد با افزایش اشاره گر 4 واحد به آن اضافه می شود. بنابراین به 4 بایت بعدی حافظه اشاره می کند و دیگر به همان 4 بایت قبلی اشاره نمی کند.<br />
<br />
مثال. اگر int را چهاربايت درنظر بگيريم، اشاره گر p هشت بايت به جلو حرکت می کند.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>int a;<br />
int p;<br />
p=&amp;a;<br />
p=p+2;</code></div></div>
عمل ديگری که روی اشاره گر ها انجام می شو تفاضل است. می توان مقدار دو اشاره گر را از هم کم کرد و فاصله بين آنها را بدست آورد.<br />
<br />
مثال. اگر ptr1 و ptr2‌ هر دو اشاره گر باشند عبارت زير اختلاف فاصله آنها را می دهد.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>ptr1 - ptr2</code></div></div>
<br />
نکته. اگر اشاره گر به محل ناشناخته ای از حافظه حرکت کند و عملی روی آن انجام دهید ممکن است عملیات برنامه های دیگر کامپیوتر را با اشکال مواجه کنید.<br />
<br />
مقايسه دو متغير اشاره گر با هم تنها زمانی معتبر است که هردو به يک نوع داده اشاره کنند.<br />
<br />
مثال. عبارت زير زمانی درست است که اشاره گر ptr1 به آدرسی قبل از ptr2 اشاره کند.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>ptr1 &lt; ptr2</code></div></div>
<br />
توجه کنيد که عمل‍يات ضرب و تقسیم روی یک اشاره گر انجام نمی گيرد و باعث بروز خطای کامپايلر می شود.<br />
<br />
<span style="font-weight: bold;">اشاره گر و آرايه</span><br />
<br />
ارتباط خاصی بين اشاره گرها و آرايه ها در ++C وجود دارد. از اشاره گرمی توان برای پيمايش آرايه ها استفاده کرد. در حقيقت اسم يک آرايه بدون هيچ انديسی اشاره گری به اولين خانه آن است. اگر آرايه ای به نام [&#93;array تعريف کرده باشيد array به اولين خانه آرايه اشاره می کند. بنابراين می توان به صورت غير مستقيم توسط عملگر * به عناصر آن دسترسی پيدا کرد. يعنی *array اولين خانه آرايه است و *(array+1) خانه دوم و به همين ترتيب الی آخر.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>*(array) == array[0&#93;<br />
*(array + 1) == array[1&#93;<br />
*(array + 2) == array[2&#93;<br />
...<br />
*(array + n) == array[n&#93;</code></div></div>
به عملگر &amp; برای بدست آوردن آدرس آرايه نياز نيست البته می توان توسط &amp;array[0&#93; هم آدرس اولين عنصر آرايه را بدست آورد يعنی array == &amp;array[0&#93;.<br />
<br />
مثال. برنامه زير عناصر آرايه A را توسط اشاره گر نمايش می دهد.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#define MAX 10<br />
int A[MAX&#93; = {100, 90, 80, 70, 60, 50, 40, 30, 20, 10};<br />
for (int i=0 ; i&lt;10 ; i++)<br />
&nbsp;&nbsp; cout &lt;&lt; *(A+i) &lt;&lt; endl;</code></div></div>
شکل زير ارتباط آرايه و آدرس های را نشان می دهد.<br />
<br />
<div style="text-align: center;"><img src="http://hpkclasses.ir/Courses/cpp/cpp0903.JPG" border="0" alt="[تصویر: cpp0903.JPG&#93;" /></div>
<br />
نکته. استفاده از اشاره گر برای آرايه روش سريع تری نبست نوشتن به انديس آرايه است.<br />
نکته. هنگام کار کردن با آرايه توسط اشاره گر کامپايلر شروع و پايان آرايه را چک نمی کند بنابراين خودتان بايد مواظب باشيد از محدوده عناصر آرايه عبور نکنيد. <br />
نکته. بخاطر داشته باشيد اسم آرايه يک ثابت اشاره گری است و نمی تواند تغيير کند و در طی اجرای برنامه ثابت می ماند. <br />
<br />
<span style="font-weight: bold;">اشاره گر و رشته</span><br />
<br />
رشته يک آرايه کاراکتری است که به کاراکتر null ختم می شود. مانند آرايه نام رشته اشاره گری به اولين کاراکتر آن است بنابراين برای کار با رشته ها يک اشاره گر به کاراکتر بکار می آيد.<br />
<br />
مثال. متغير Msg1 اشاره گری به کاراکتر است که با يک ثابت رشته ای مقداردهی اوليه شده است. 1Msg به اولين کاراکتر اين رشته اشاره می کند.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>char *Msg1 = "This is a message";</code></div></div>
<br />
راه ديگر برای استفاده اشاره گر برای رشته ها اختصاص فضای پويا به متغير اشاره گر است.<br />
<br />
مثال. Msg2 متغير اشاره گری است که در حافظه پويا ايجاد شده است.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>Msg2 = new char[16&#93;;<br />
if (Msg2 == NULL) {<br />
&nbsp;&nbsp; cerr &lt;&lt; "Could not allocate sufficient space" &lt;&lt; endl;<br />
&nbsp;&nbsp; exit(1);<br />
&nbsp;&nbsp; }<br />
strcpy(Msg2, "A new message");<br />
cout &lt;&lt; Msg2 &lt;&lt; endl;<br />
delete [&#93; Msg2;</code></div></div>
<br />
<span style="font-weight: bold;">اشاره گر به ساختمان</span><br />
<br />
مشابه هر نوع داده ديگری می توان اشاره گری به ساختمان در برنامه اعلان کرد. اشاره گر به ساختمان معمولا برای ارسال ساختمان به تابع استفاده می شود. علاوه براين برای پياده سازی ساختمان داده مهم ليست پيوندی هم بکار می رود.<br />
<br />
برای دسترسی به عناصر ساختمان از طريق اشاره گر باید از عملگر -&gt; (indirect membership operator) استفاده شود.<br />
<br />
مثال. استفاده از اشاره گر برای دسترسی به ساختمان<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
typedef struct account {<br />
&nbsp;&nbsp; float balance;<br />
}<br />
account *ptraccout;<br />
int main() {<br />
&nbsp;&nbsp; ptraccount = new account;<br />
&nbsp;&nbsp; ptraccount-&gt;balance=2000;<br />
&nbsp;&nbsp; cout &lt;&lt; ptraccount-&gt;balance;<br />
&nbsp;&nbsp; delete ptraccount;<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
راه ديگر برای دسترسی به اجزای ساختمان توسط اشاره گر استفاده از عملگر مرجع است. اشاره گر به همراه علامت * بايد درون پرانتز قرار گيرند زيرا عملگر (.) الويت بيشتری نسبت به (*) دارد.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>(*ptraccount).balance = 2000;</code></div></div>
<br />
<div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>
<br />
<div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>
<br />
<span style="font-weight: bold;">اشاره گر به اشاره گر</span><br />
<br />
C++ اجازه می دهد که اشاره گری به اشاره گر دیگر داشته باشید. چون یک اشاره گر یک روش غیر مستقیم دسترسی به یک متغیر است به همين دليل اشاره گر به اشاره گر غیر مستقیم چندگانه (multiple indirection) ناميده می شود. برای تولید اشاره گر به اشاره گر یک ستاره برای هر لایه از ارجاع اضافه می شود. بندرت اتفاق می افتد که اشاره گر به اشاره گر را در برنامه ای استفاده شود.<br />
<br />
مثال.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>char x;<br />
char *y;<br />
char **z;<br />
x='z';<br />
y=&amp;x;<br />
z=&amp;y;</code></div></div>
<br />
<div style="text-align: center;"><img src="http://hpkclasses.ir/Courses/cpp/cpp0904.JPG" border="0" alt="[تصویر: cpp0904.JPG&#93;" /></div>
<br />
<span style="font-weight: bold;">اشاره گر به تابع</span><br />
<br />
وقتی تابع کامپايل شده و در حافظه برای اجرا قرار می گيرد قسمتی از حافظه را اشغال می کند بنابراين دارای آدرس است که می توان آن را به اشاره گری اختصاص داد. اشاره گر به تابع راهی برای فراخوانی تابع به صورت غيرمستقيم است علاوه بر اين برای ارسال تابع به عنوان پارامتر به تابع دیگر هم بکار می آيد.<br />
<br />
اعلان و استفاده اشاره گر به تابع درنظر اول کمی متفاوت است ولی از همان قاعده تبعيت می کند. برای اعلان اشاره گر به تابع نام تابع درون پرانتز قرار می گيرد و قبل از آن علامت * قرار می گيرد. مشابه زير:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>datatype (*pointerToFunction) (pElement) = NULL ;</code></div></div>
<br />
*pointerToFunxtion اشاره گر به تابع است که درون پرانتز بايد باشد. سمت چپ آن نوع برگشتی و سمت راست آن پارامترهای تابع قرار می گيرند. سپس با NULL مقداردهی می شود.<br />
<br />
مثال. funcPtr اشاره گر به تابعی است که هيچ آرگومان و مقدار برگشتی ندارد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>void (*funcPtr)() = NULL ;</code></div></div>
<br />
مشابه آرايه ها، برای بدست آوردن آدرس تابع نيازی به عملگر آدرس &amp; نيست. فراخوانی تابع توسط اشاره گر مشابه فراخوانی عادی تابع است.<br />
<br />
مثال. متغير p اشاره گری به تابع square است. تابع به دو طريق فراخوانی شده است که خروجی هر دو فراخوانی يکسان است.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
double square(double x); // The function prototype.<br />
double (*p)(double x) = NULL; // The pointer declaration.<br />
main() {<br />
&nbsp;&nbsp; p = square; // Initialize p to point to square().<br />
&nbsp;&nbsp; Cout &lt;&lt; square(6) &lt;&lt; p(6));<br />
&nbsp;&nbsp; return(0);<br />
}<br />
double square(double x) {<br />
return x * x;<br />
}</code></div></div>
<br />
<span style="font-weight: bold;">اشاره گر وپارامتر مرجع<br />
</span><br />
<br />
همانطور که قبلا در بخش تابع گفته شد آرگومان به دو صورت مقداری و مرجع می تواند به تابع ارسال شود. در حالت مرجع آدرس آرگومان به تابع داده مي شود اين کار بسادگي با اضافه کردن علامت &amp; (عملگر ادرس) قبل از پارامتر در خط اعلان تابع انجام مي شود.<br />
<br />
<span style="font-weight: bold;">آرگومان های خط فرمان</span><br />
<br />
هنگامی که يک برنامه از خط فرمان سيستم عامل فراخوانی می شود آرگومان هائی را می توان به تابع main ارسال کرد. پارامترهای تابع main به شکل زير هستند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>int main(int argc, char* argv[&#93;) <br />
{<br />
...<br />
}</code></div></div>
argv هميشه آرايه ای رشته ای است که شامل دستوری است که در خط فرمان وارد می شود. فضای خالی، اجزای فرمان را از هم جدا و تبديل به آرگومان های جداگانه در آرايه می کند. argc تعداد عناصر درون آرايه پارامتر دوم است. argv[0&#93; شامل مسير و نام خود برنامه است.<br />
<br />
مثال. برنامه زير کليه آرگومان های خط فرمان را نمايش می دهد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>//CommandLineArgs.cpp<br />
#include &lt;iostream.h&gt;<br />
int main(int argc, char* argv[&#93;) {<br />
cout &lt;&lt; "argc = " &lt;&lt; argc &lt;&lt; endl;<br />
for(int i = 0; i &lt; argc; i++)<br />
cout &lt;&lt; "argv[" &lt;&lt; i &lt;&lt; "&#93; = " <br />
&lt;&lt; argv[i&#93; &lt;&lt; endl;<br />
}</code></div></div>
اسامی argv و argc برای آرگومان های خط فرمامن الزامی نيست و می توان از شناسه های ديگر استفاده کرد ولی اين دو اسم متعارف هستند و استفاده از اسامی ديگر باعث گيج شدن افراد ديگر می شود.<br />
<br />
منبع: <div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>]]></description>
			<content:encoded><![CDATA[در این بخش مبحث مهم اشاره گرها در C معرفی می شود. اشاره گر متغيری است که آدرس متغير ديگری را نگه می دارد که اصطلاحا گفته می شود دارد به آن متغيری اشاره می کند. به دو عملگر * (address-of operator) و &amp; (indirection operator) با اشاره گرها نياز می شود. اشاره گرها روش قدرتمند و انعطاف پذیری برای کار با انواع داده ها در برنامه نظير آرايه ها، رشته ها و ساختمان ها است. کاربرد اشاره گرها برای استفاده از حافظه پویا هم در اینجا توضیح داده خواهد شد.<br />
<br />
<br />
اشاره گرها بخش قدرتمند و دشوار C و ++C هستند. اکثر مبتدیان در درک مناسب اشاره گرها مشکل دارند. متغیرهای استاندارد برچسب هایی هستند که برای تعیین بخش هائی از حافظه کنار گذاشته می شوند تا داده از نوع خاصی را ذخیره کنند درحاليکه یک اشاره گر به بخش هایی از حافظه که توسط متغیر دیگری اشغال شده اشاره می کند. یک متغیر استاندارد یک مقدار را ذخیره می کند اما یک اشاره گر آدرس محلی در حافظه را ذخیره می کند.<br />
<br />
<span style="font-weight: bold;">متغیر اشاره گر</span><br />
<br />
یک متغير اشاره گر (pointer variable) متغیری است که حاوی آدرس داده ، متغیر دیگر يا تابع است. برای ذخیره آدرس اولین مرحله اعلان متغیر اشاره گر است. اعلان متغير اشاره گر تقریبا مشابه متغيرهای ديگر است تنها باید قبل از نام متغیر علامت ستاره (*) برای نشان داده اینکه یک اشاره گر است اضافه شود. هنگام تعريف اشاره گر نوع داده ای که به آن اشاره می کند باید مشخص شود. اعلان اشاره گر از فرم کلی زیر تبعیت می کند:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>typename *ptrname;</code></div></div>
<br />
typename نوع داده است که اشاره گر به آن اشاره می کند. علامت (*) عملگری است که بیان می کند متغیر اشاره گری به داده ای از نوع typename است. اشاره گر می تواند همراه با متغیر های غیراشاره گری هم اعلان شود.<br />
<br />
مثال. متغیر ptr اشاره گری به یک داده صحیح است.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>int *ptr;<br />
int* ptr;</code></div></div>
<br />
مثال. در اعلان زیر age از نوع صحيح و ptr اشاره گری به داده صحيح است.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>int *ptr, age;</code></div></div>
<br />
بعد از اعلان متغیر اشاره گر باید آنرا به جائی اشاره داد يعنی آدرس مکانی از حافظه که حاوی داده مورد نظر است را به اشاره گر اختصاص داد. اگر یک اشاره گر فقط اعلان شود و مقداردهی نشود ممکن است به محل دلخواهی از حافظه اشاره کند و استفاده از آن بدون توجه به اين مسئله می تواند مشکلات مهمی روی سیستم تولید کند. یک تکنیک کلی مقداردهی اشاره گر با مقدار NULL يا صفر است.<br />
<br />
راه ديگر برای مقداردهی اشاره گر ذخیره آدرس متغیر دیگر در آن است. وقتی برنامه ای اجرا می شود کلیه اجزای آن در حافظه قرار می گیرد. بنابراین هر جز از برنامه از جمله متغیرها دارای آدرس هستند. عملگر &amp; (address-of operator) آدرس این اجزا را می دهد. عملگر &amp; آدرس عملوند خود را برمی گرداند که می توان این آدرس را درون یک متغیر اشاره گر ذخیره کرد.<br />
<br />
مقداردهی یک اشاره گر می تواند فرم کلی زیر را داشته باشد:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>pointer = &amp;variable;</code></div></div>
<br />
مثال. دستور زیر آدرس متغیر age را به اشاره گر ptr اختصاص می دهد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>ptr = &amp;age;</code></div></div>
<br />
مثال. در برنامه زير اشاره گر j آدرس متغیر i را نشان می دهد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
int main(){<br />
&nbsp;&nbsp; int i;<br />
&nbsp;&nbsp; int* j;<br />
&nbsp;&nbsp; j = &amp;i;<br />
&nbsp;&nbsp; i = 4;<br />
&nbsp;&nbsp; cout &lt;&lt; "i is " &lt;&lt; i;<br />
&nbsp;&nbsp; cout &lt;&lt; "&#92;n j is " &lt;&lt; j;<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
اشاره گرها نوعدار هستند یعنی باید به کامپایلر بگوئید که نوع متغیری که اشاره گر به آن اشاره می کند چیست. نوع اشاره گر و متغیری که به آن اشاره می کند باید یکسان باشد.<br />
<br />
مثال.. دستورات زير خطا تولید می کند چون نمی توان اشاره گر int را به نوع char اشاره داد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>char c='0';<br />
int *p=&amp;c;</code></div></div>
<br />
بعد از مقداردهی از طریق متغیر اشاره گر می توان با داده کار کرد. برای دسترسی به محلی که اشاره گر اشاره می کند از عملگر * استفاده می شود. عملگر* محتوای آدرسی از حافظه را برمی گرداند و عملگر مرجع (indirection operator) نامیده می شود چون در واقع یک ارجاع به آدرسی در حافظه است.<br />
<br />
مثال. متغیر اشاره گر ptr به داده صحیح اشاره می کند. توجه کنید چگونه از typedef برای نامگذاری نوع اشاره گر استفاده شده است.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>typedef *int IntPtr;<br />
IntPtr ptr;<br />
int pge;<br />
age =19;<br />
ptr = &amp;age; // get address of the AgeOfMary variable<br />
cout &lt;&lt; "ptr points to " &lt;&lt; *ptr &lt;&lt; endl;<br />
cout &lt;&lt; "age is " &lt;&lt; age &lt;&lt; endl;</code></div></div>
<br />
<div style="text-align: center;"><img src="http://hpkclasses.ir/Courses/cpp/cpp0901.JPG" border="0" alt="[تصویر: cpp0901.JPG]" /></div>
<br />
برای اشاره گر ptr که به متغیر age اشاره کند موارد زیر صدق می کند:<br />
<br />
•	ptr* و age هردو به محتوای متغیر age ارجاع می کنند. <br />
•	ptr و age&amp; هر دو به آدرس متغیر age هستند. <br />
عملگر * هم به عنوان عملگر مرجع و هم عملگر ضرب استفاده می شود. کامپایلر از نحوه به کار بردن عملگر * در دستور تشخیص می دهد منظور کدام است. وقتی عملگر * بعد از اسم اشاره گری می آید منظور محلی که است که اشاره گر به آن دارد اشاره می کند.<br />
<br />
هر بایت حافظه دارای آدرس جداگانه ای است. بنابراین متغیرهائی مانند نوع int، float و ... که چندبایت در حافظه مصرف می کنند چند آدرس را اشغال می کنند. آدرس یک متغیر در حقیقت آدرس اولین بایت آن است.<br />
<br />
مثال. آدرس اولین بایت متغیر به اشاره گر اختصاص داده می شود بنابراین ptrint برابر با 1000، ptrchar برابر با 1003 و ptrfloat برابر با آدرس 1006 می شود.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>int i = 12252;<br />
char c = 90;<br />
float f = 1200.156004;<br />
int *ptrint;<br />
char *ptrchar;<br />
float *ptrfloat;<br />
...<br />
ptrint = &amp;i;<br />
ptrchar = &amp;c;<br />
ptrfloat = &amp;f;</code></div></div>
<div style="text-align: center;"><img src="http://hpkclasses.ir/Courses/cpp/cpp0902.JPG" border="0" alt="[تصویر: cpp0902.JPG]" /></div>
<br />
<div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>
<br />
<span style="font-weight: bold;">حافظه پویا</span><br />
<br />
برای درک بهتر اشاره گرها نیاز است درباره نحوه ذخیره اطلاعات درحافظه بیشتر بدانید. حافظه RAM شامل مجموعه ای از محل های ذخیره سازی است که هر محل توسط یک آدرس منحصر بفرد مشخص می شود. وقتی برنامه ای را اجرا می کنید کد برنامه (دستورالعمل های زبان ماشین برنامه) و داده هائی که برنامه با آنها کار می کند در حافظه قرار می گیرند. اگر متغیری در برنامه تعریف شده باشد کامپایلر محلی از حافظه را برای آن کنار گذاشته آدرس آنرا به اسم متغیر مربوط می کند. بنابراین وقتی در برنامه از اسم متغیر استفاده می شود اتوماتیک به آدرس موردنظر مراجعه می شود.<br />
<br />
اشاره گرها وقتی نقش ایفا می کنند که بخواهیم از حافظه پویا (يا heap) استفاده کنیم. ناحيه Heap فضای آزاد حافظه است که در اخت‍يار هيچ برنامه ای نيست و می تواند به صورت پويا استفاده می شود، يعنی در حين اجرای برنامه در صورت نياز اختصاص داده می شود و هنگامی که ديگر به آن احتياج نباشد آزاد می شود.<br />
<br />
دستورات new و delete برای تخصيص و بازپس گيری حافظه هنگام کار با حافظه پويا استفاده می شوند.<br />
<br />
دستور new فضائی از حافظه آزاد را به برنامه اختصاص می دهد. میزان فضای موردنیاز توسط نوع داده ای که بعد از دستور ذکر می شود تعیین می شود. اگر دستور موفق باشد اشاره گری به فضای گرفته شده را برمیگرداند. اگر شکست بخورد مقدار NULL را برمیگرداند.<br />
<br />
بعد از اینکه کار با حافظه پویا باید حافظه گرفته شده توسط دستور delete پس داده شود. به این ترتیب حافظه می تواند مجدد توسط برنامه های دیگر استفاده شود.<br />
<br />
مثال.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>IntPtr = new int;<br />
if (IntPtr == NULL) {<br />
&nbsp;&nbsp; cerr &lt;&lt; "Could not allocate sufficient space" &lt;&lt; endl;<br />
&nbsp;&nbsp; exit(1);<br />
&nbsp;&nbsp; }<br />
*IntPtr = 55;<br />
delete IntPtr;<br />
IntPtr = 0;</code></div></div>
بعد از delete یک اشاره گر آترا با مقدار 0 پر کنید تا تصادفا آن را دوباره استفاده نکنید.<br />
<br />
اگر فضا های گرفته شده از حافظه آزاد پس داده نشود و برنامه خاتمه پیدا کند برنامه اصطلاحا دارای مشکل memory leak است. میزان حافظه موجود یعد از اجرای برنامه کمتر از قبل از اجرای آن است. مگراینکه کامپیوتر راه اندازی مجدد شود. بنابراین سعی کنید همیشه حافظه های گرفته شده را آزاد کنید.<br />
<br />
دستورات new و delete دو حالت دارند؛ برای آرا‍یه ها ا‍ن دو دستور به صورت زیر استفاده می شوند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>new[]();<br />
delete[]();</code></div></div>
<br />
مثال. برنامه زیر از حافظه پویا استفاده می کند. به آرایه a به اندازه 10 عدد صح‍یح حافظه اختصاص داد ه می شود. به b عددی صحیحی اختصاص می دهد با مقدار اولیه 89.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
int main() { <br />
&nbsp;&nbsp; int * a= new int[10];<br />
&nbsp;&nbsp; int * b=new int(89) ;<br />
&nbsp;&nbsp; cout &lt;&lt; "*b=" &lt;&lt; *b &lt;&lt; endl;<br />
&nbsp;&nbsp; *(a+5)=9;<br />
&nbsp;&nbsp; cout &lt;&lt; "a[5]=" &lt;&lt; *(a+5) &lt;&lt; endl;<br />
&nbsp;&nbsp; delete [] a;<br />
&nbsp;&nbsp; delete b;<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
نکته. برای هر دستور new یک دستور delete باید باشد.<br />
نکته. بررسی کنید دستور new خطا یا NULL برنگردانده باشد.<br />
نکته. برای آرایه ها [] در دستورات new و delete لازم است.<br />
نکته. توابع ()malloc و ()free معادل دستورات new و delete هستند.<br />
<br />
<span style="font-weight: bold;">محاسبات روی اشاره گر</span><br />
<br />
عملیات جمع، تفریق، افزایش و کاهش را می توان روی متغيرهای اشاره گر انجام داد. چون اشاره گر آدرسی در حافظه است وقتی محاسباتی روی آن انجام می گیرد رفتار متفاوتی نشان می دهد. وقتی عمل جمع عددی با متغير اشاره گر صورت می گيرد اشاره گر به اندازه حاصلضرب عدد در تعداد بایت های نوع داده ای که اشاره می کند جلو می رود. همين برای عمل تفريق هم صدق می کند. اگر مقداری از متغير اشاره گر کم شود در محاسبات تعداد بايت های نوع داده محسوب می شود.<br />
<br />
عملگر افزایش (++) مقدار متغیر را یکی اضافه می کند در حالیکه متغير اشاره گر را به تعداد بایت های نوع داده آن حرکت می دهد. اگر یک اشاره گر به عدد float دارید چون نوع float چهار بایت دارد با افزایش اشاره گر 4 واحد به آن اضافه می شود. بنابراین به 4 بایت بعدی حافظه اشاره می کند و دیگر به همان 4 بایت قبلی اشاره نمی کند.<br />
<br />
مثال. اگر int را چهاربايت درنظر بگيريم، اشاره گر p هشت بايت به جلو حرکت می کند.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>int a;<br />
int p;<br />
p=&amp;a;<br />
p=p+2;</code></div></div>
عمل ديگری که روی اشاره گر ها انجام می شو تفاضل است. می توان مقدار دو اشاره گر را از هم کم کرد و فاصله بين آنها را بدست آورد.<br />
<br />
مثال. اگر ptr1 و ptr2‌ هر دو اشاره گر باشند عبارت زير اختلاف فاصله آنها را می دهد.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>ptr1 - ptr2</code></div></div>
<br />
نکته. اگر اشاره گر به محل ناشناخته ای از حافظه حرکت کند و عملی روی آن انجام دهید ممکن است عملیات برنامه های دیگر کامپیوتر را با اشکال مواجه کنید.<br />
<br />
مقايسه دو متغير اشاره گر با هم تنها زمانی معتبر است که هردو به يک نوع داده اشاره کنند.<br />
<br />
مثال. عبارت زير زمانی درست است که اشاره گر ptr1 به آدرسی قبل از ptr2 اشاره کند.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>ptr1 &lt; ptr2</code></div></div>
<br />
توجه کنيد که عمل‍يات ضرب و تقسیم روی یک اشاره گر انجام نمی گيرد و باعث بروز خطای کامپايلر می شود.<br />
<br />
<span style="font-weight: bold;">اشاره گر و آرايه</span><br />
<br />
ارتباط خاصی بين اشاره گرها و آرايه ها در ++C وجود دارد. از اشاره گرمی توان برای پيمايش آرايه ها استفاده کرد. در حقيقت اسم يک آرايه بدون هيچ انديسی اشاره گری به اولين خانه آن است. اگر آرايه ای به نام []array تعريف کرده باشيد array به اولين خانه آرايه اشاره می کند. بنابراين می توان به صورت غير مستقيم توسط عملگر * به عناصر آن دسترسی پيدا کرد. يعنی *array اولين خانه آرايه است و *(array+1) خانه دوم و به همين ترتيب الی آخر.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>*(array) == array[0]<br />
*(array + 1) == array[1]<br />
*(array + 2) == array[2]<br />
...<br />
*(array + n) == array[n]</code></div></div>
به عملگر &amp; برای بدست آوردن آدرس آرايه نياز نيست البته می توان توسط &amp;array[0] هم آدرس اولين عنصر آرايه را بدست آورد يعنی array == &amp;array[0].<br />
<br />
مثال. برنامه زير عناصر آرايه A را توسط اشاره گر نمايش می دهد.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#define MAX 10<br />
int A[MAX] = {100, 90, 80, 70, 60, 50, 40, 30, 20, 10};<br />
for (int i=0 ; i&lt;10 ; i++)<br />
&nbsp;&nbsp; cout &lt;&lt; *(A+i) &lt;&lt; endl;</code></div></div>
شکل زير ارتباط آرايه و آدرس های را نشان می دهد.<br />
<br />
<div style="text-align: center;"><img src="http://hpkclasses.ir/Courses/cpp/cpp0903.JPG" border="0" alt="[تصویر: cpp0903.JPG]" /></div>
<br />
نکته. استفاده از اشاره گر برای آرايه روش سريع تری نبست نوشتن به انديس آرايه است.<br />
نکته. هنگام کار کردن با آرايه توسط اشاره گر کامپايلر شروع و پايان آرايه را چک نمی کند بنابراين خودتان بايد مواظب باشيد از محدوده عناصر آرايه عبور نکنيد. <br />
نکته. بخاطر داشته باشيد اسم آرايه يک ثابت اشاره گری است و نمی تواند تغيير کند و در طی اجرای برنامه ثابت می ماند. <br />
<br />
<span style="font-weight: bold;">اشاره گر و رشته</span><br />
<br />
رشته يک آرايه کاراکتری است که به کاراکتر null ختم می شود. مانند آرايه نام رشته اشاره گری به اولين کاراکتر آن است بنابراين برای کار با رشته ها يک اشاره گر به کاراکتر بکار می آيد.<br />
<br />
مثال. متغير Msg1 اشاره گری به کاراکتر است که با يک ثابت رشته ای مقداردهی اوليه شده است. 1Msg به اولين کاراکتر اين رشته اشاره می کند.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>char *Msg1 = "This is a message";</code></div></div>
<br />
راه ديگر برای استفاده اشاره گر برای رشته ها اختصاص فضای پويا به متغير اشاره گر است.<br />
<br />
مثال. Msg2 متغير اشاره گری است که در حافظه پويا ايجاد شده است.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>Msg2 = new char[16];<br />
if (Msg2 == NULL) {<br />
&nbsp;&nbsp; cerr &lt;&lt; "Could not allocate sufficient space" &lt;&lt; endl;<br />
&nbsp;&nbsp; exit(1);<br />
&nbsp;&nbsp; }<br />
strcpy(Msg2, "A new message");<br />
cout &lt;&lt; Msg2 &lt;&lt; endl;<br />
delete [] Msg2;</code></div></div>
<br />
<span style="font-weight: bold;">اشاره گر به ساختمان</span><br />
<br />
مشابه هر نوع داده ديگری می توان اشاره گری به ساختمان در برنامه اعلان کرد. اشاره گر به ساختمان معمولا برای ارسال ساختمان به تابع استفاده می شود. علاوه براين برای پياده سازی ساختمان داده مهم ليست پيوندی هم بکار می رود.<br />
<br />
برای دسترسی به عناصر ساختمان از طريق اشاره گر باید از عملگر -&gt; (indirect membership operator) استفاده شود.<br />
<br />
مثال. استفاده از اشاره گر برای دسترسی به ساختمان<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
typedef struct account {<br />
&nbsp;&nbsp; float balance;<br />
}<br />
account *ptraccout;<br />
int main() {<br />
&nbsp;&nbsp; ptraccount = new account;<br />
&nbsp;&nbsp; ptraccount-&gt;balance=2000;<br />
&nbsp;&nbsp; cout &lt;&lt; ptraccount-&gt;balance;<br />
&nbsp;&nbsp; delete ptraccount;<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
راه ديگر برای دسترسی به اجزای ساختمان توسط اشاره گر استفاده از عملگر مرجع است. اشاره گر به همراه علامت * بايد درون پرانتز قرار گيرند زيرا عملگر (.) الويت بيشتری نسبت به (*) دارد.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>(*ptraccount).balance = 2000;</code></div></div>
<br />
<div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>
<br />
<div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>
<br />
<span style="font-weight: bold;">اشاره گر به اشاره گر</span><br />
<br />
C++ اجازه می دهد که اشاره گری به اشاره گر دیگر داشته باشید. چون یک اشاره گر یک روش غیر مستقیم دسترسی به یک متغیر است به همين دليل اشاره گر به اشاره گر غیر مستقیم چندگانه (multiple indirection) ناميده می شود. برای تولید اشاره گر به اشاره گر یک ستاره برای هر لایه از ارجاع اضافه می شود. بندرت اتفاق می افتد که اشاره گر به اشاره گر را در برنامه ای استفاده شود.<br />
<br />
مثال.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>char x;<br />
char *y;<br />
char **z;<br />
x='z';<br />
y=&amp;x;<br />
z=&amp;y;</code></div></div>
<br />
<div style="text-align: center;"><img src="http://hpkclasses.ir/Courses/cpp/cpp0904.JPG" border="0" alt="[تصویر: cpp0904.JPG]" /></div>
<br />
<span style="font-weight: bold;">اشاره گر به تابع</span><br />
<br />
وقتی تابع کامپايل شده و در حافظه برای اجرا قرار می گيرد قسمتی از حافظه را اشغال می کند بنابراين دارای آدرس است که می توان آن را به اشاره گری اختصاص داد. اشاره گر به تابع راهی برای فراخوانی تابع به صورت غيرمستقيم است علاوه بر اين برای ارسال تابع به عنوان پارامتر به تابع دیگر هم بکار می آيد.<br />
<br />
اعلان و استفاده اشاره گر به تابع درنظر اول کمی متفاوت است ولی از همان قاعده تبعيت می کند. برای اعلان اشاره گر به تابع نام تابع درون پرانتز قرار می گيرد و قبل از آن علامت * قرار می گيرد. مشابه زير:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>datatype (*pointerToFunction) (pElement) = NULL ;</code></div></div>
<br />
*pointerToFunxtion اشاره گر به تابع است که درون پرانتز بايد باشد. سمت چپ آن نوع برگشتی و سمت راست آن پارامترهای تابع قرار می گيرند. سپس با NULL مقداردهی می شود.<br />
<br />
مثال. funcPtr اشاره گر به تابعی است که هيچ آرگومان و مقدار برگشتی ندارد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>void (*funcPtr)() = NULL ;</code></div></div>
<br />
مشابه آرايه ها، برای بدست آوردن آدرس تابع نيازی به عملگر آدرس &amp; نيست. فراخوانی تابع توسط اشاره گر مشابه فراخوانی عادی تابع است.<br />
<br />
مثال. متغير p اشاره گری به تابع square است. تابع به دو طريق فراخوانی شده است که خروجی هر دو فراخوانی يکسان است.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
double square(double x); // The function prototype.<br />
double (*p)(double x) = NULL; // The pointer declaration.<br />
main() {<br />
&nbsp;&nbsp; p = square; // Initialize p to point to square().<br />
&nbsp;&nbsp; Cout &lt;&lt; square(6) &lt;&lt; p(6));<br />
&nbsp;&nbsp; return(0);<br />
}<br />
double square(double x) {<br />
return x * x;<br />
}</code></div></div>
<br />
<span style="font-weight: bold;">اشاره گر وپارامتر مرجع<br />
</span><br />
<br />
همانطور که قبلا در بخش تابع گفته شد آرگومان به دو صورت مقداری و مرجع می تواند به تابع ارسال شود. در حالت مرجع آدرس آرگومان به تابع داده مي شود اين کار بسادگي با اضافه کردن علامت &amp; (عملگر ادرس) قبل از پارامتر در خط اعلان تابع انجام مي شود.<br />
<br />
<span style="font-weight: bold;">آرگومان های خط فرمان</span><br />
<br />
هنگامی که يک برنامه از خط فرمان سيستم عامل فراخوانی می شود آرگومان هائی را می توان به تابع main ارسال کرد. پارامترهای تابع main به شکل زير هستند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>int main(int argc, char* argv[]) <br />
{<br />
...<br />
}</code></div></div>
argv هميشه آرايه ای رشته ای است که شامل دستوری است که در خط فرمان وارد می شود. فضای خالی، اجزای فرمان را از هم جدا و تبديل به آرگومان های جداگانه در آرايه می کند. argc تعداد عناصر درون آرايه پارامتر دوم است. argv[0] شامل مسير و نام خود برنامه است.<br />
<br />
مثال. برنامه زير کليه آرگومان های خط فرمان را نمايش می دهد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>//CommandLineArgs.cpp<br />
#include &lt;iostream.h&gt;<br />
int main(int argc, char* argv[]) {<br />
cout &lt;&lt; "argc = " &lt;&lt; argc &lt;&lt; endl;<br />
for(int i = 0; i &lt; argc; i++)<br />
cout &lt;&lt; "argv[" &lt;&lt; i &lt;&lt; "] = " <br />
&lt;&lt; argv[i] &lt;&lt; endl;<br />
}</code></div></div>
اسامی argv و argc برای آرگومان های خط فرمامن الزامی نيست و می توان از شناسه های ديگر استفاده کرد ولی اين دو اسم متعارف هستند و استفاده از اسامی ديگر باعث گيج شدن افراد ديگر می شود.<br />
<br />
منبع: <div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[ساختمان کامپيوتر]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=284</link>
			<pubDate>Fri, 03 Sep 2010 09:54:57 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=284</guid>
			<description><![CDATA[اين بخش شرح مختصری پيرامون اجزاي اصلی يک سيستم کامپيوتری (حافظه و پردازنده)می دهد، که باعث می شود کاربر درک بيشتری نسبت به مفاهيمی که در طی برنامه اسمبلی با آن ها سرو کار دارد پيدا کند.<br />
<br />
يک سيستم کامپيوتری ترکيب کاملي از سخت افزار و نرم افزارهای سيستمی است که باعث می شود ماشين مفيد و وظيفه مندي برای کار معينی بشود.<br />
<br />
اجزای اصلی سخت افزار يک ريز کامپيوتر شامل:<br />
<br />
•	پردازنده مرکزی<br />
•	حافظه<br />
•	صفحه کليد به عنوان ورودی<br />
•	صفحه نمايش به عنوان خروجی<br />
•	يک يا چند ديسک درايو برای ذخيره برنامه ها و داده ها<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">حافظه</span></div>
<br />
حافظه مکان ذخيره برنامه ها و داده ها با امکان دسترسی مجدد به آنها است. حافظه اصلی از ديد برنامه نويس از تعدادی بيت تشکيل شده است که قادر به نگهداری صفر يا يک است. مکانيسم دسترسی به اطلاعات درون حافظه آدرس دهی است. بيت هائی که دارای آدرس يکسان هستند را سلول حافظه (cell) می نامند. هر سلول تنها می تواند شامل يک مقدارعددی باشد. طول سلول(Lc) توسط تعداد بيت های سلول مشخص می شود. در ريز کامپيوترها طول سلول هشت بيت است که به آن بايت نيز گفته می شود. خاصيت مهم سلول آدرس پذيری است، يعنی هر سلول دارای يک آدرس منحصر بفرد است. بنابراين هر بايت درحافظه نيز دارای يک آدرس منحصر بفرد است.<br />
<br />
اغلب حافظه ها در اندازه های بزرگتراز بايت نظير کيلوبايت (1KB=210=1,024 bytes)، مگابايت (1MB=220= 1,048,576 bytes) و گيگابايت (1GB=230=1,073,741,824 bytes) بيان می شوند. يک کامپيوتر با 32 مگابايت حافظه قادر است تقريبا 32 ميليون بايت از اطلاعات را نگهداری کند.<br />
<br />
نکته. تعداد بيت های يک کلمه بستگی به سخت افزار دارد و با Lw نشان داده می شود. همواره رابطه Lw≥Lc برقرار است. آدرس هر کلمه آدرس اولين سلول آن است.<br />
<br />
<span style="font-weight: bold;">فضای آدرسی</span><br />
<br />
آدرس های حافظه از عدد صفر شروع می شوند. اگر حافظه ای دارای n سلول باشد آدرس های آن از 0 تا n-1 خواهد بود. کامپيوتری که سيستم عددی باينری را استفاده می کند برای بيان آدرس نيز همان روش را به کار می برد. تعداد بيت های آدرس تعداد سلول های قابل دسترس حافظه را نشان می دهد و ربطی به طول سلول ندارد. فضای آدرسی بيشترين ميزان حافظه است که يک پردازنده می تواند آدرس دهی کند.<br />
<br />
اگر آدرسی m بيت طول داشته باشد بيشترين تعداد سلول های قابل آدرس دهی 2m خواهد بود.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">واحد پردازش مرکزی</span></div>
<br />
پردازنده يا واحد پردازش مرکزی (Central Processing Unit) يا (CPU) از واحد کنترل و واحد محاسبات و منطق ساخته شده است. وظيفه آن خواندن و نوشتن محتويات سلول حافظه، انتقال داده بين سلول های حافظه و ثبات های خاص، رمزبرداری و اجرای دستورالعمل های ذخيره شده در حافظه اصلی است.<br />
<br />
CPU هر دستورالعمل را در يک سری مراحل اجرا می کند و برای همگام کردن سيکل اجرای دستورالعمل از يک ساعت (Clock) استفاده می کنند. ساعت در يک فرکانس ثابت پالس می زند که سرعت ساعت ناميده می شود. اين ساعت دقيقه و ثانيه را نگه نمی دارد بلکه فقط در نرخ ثابتی ضربان دارد. مدارهای الکترونيکی کامپيوتر از اين ضربان ها برای انجام صحيح عمليات خود استفاده می کنند. تعداد ضربه ها يا اصطلاحا سيکل های مورد نياز يک دستورالعمل بستگی به نسل و مدل CPU دارد.<br />
<br />
مثال. وقتی يک کامپيوتر 1.5GHz می خريد، 1.5 GHz فرکانس اين ساعت است. يعنی در هر ثانيه 1.5 ميليارد پالس می زند (گيگاهرتز GHz يا يک ميليارد سيکل در ثانيه است).<br />
<br />
<span style="font-weight: bold;">مجموعه دستورالعمل ها</span><br />
<br />
مجموعه ای از تمام دستورالعمل هائی که يک نوع پردازنده می تواند اجرا می کند مجموعه دستورالعمل (Instruction Set) ناميده می شوند که درواقع زبان ماشين آن نوع پردازنده را شکل می دهد. دستورالعمل های زبان ماشين به صورت اعداد رمز می شوند و عموما ساده هستند. زيرا زبان ماشين با اين هدف طراحی می شود که پردازنده قادر باشد مقصود دستورالعمل را سريع کشف کند تا بتواند به طور موثر آن را اجرا کند..<br />
<br />
هر پردازنده زبان ماشين منحصر بفرد خود را دارد. و مجموعه دستورالعمل از ماشينی به ماشين ديگر متفاوت است. به همين دليل مثلا برنامه های نوشته شده برای Mac نمی توانند روی يک IBM-PC اجرا شوند. برنامه های نوشته شده در زبان های ديگر بايد توسط کامپايلر به زبان ماشين پردازنده ای که روی آن اجرا می شود تبديل شود. معمولا عملکرد کامپايلرها بر روی ماشين با دستورالعمل کمتر آسان تر است.<br />
<br />
<span style="font-weight: bold;">مجموعه ثبات ها</span><br />
<br />
دستورالعمل ها ممکن است نياز به داده ای داشته باشند تا روی آن عمل کند. هر پردازنده دارای يکسری سلول های حافظه است که داده های دستورالعمل را در خود ذخيره می کنند. اين سلول ها ثبات (register) ناميده می شوند و درون خود پردازنده قرار دارند. پردازنده می تواند به داده درون ثبات سريع تر از داده درون حافظه دسترسی پيدا کند. اغلب کامپيوترها مجموعه ای از ثبات ها را برای ذخيره موقت داده دارند. البته تعداد ثبات های پردازنده اندک است، بنابراين برنامه نويس ناچار است تنها داده های جاری را در ثبات ذخيره نمايد.<br />
<br />
<span style="font-weight: bold;">انواع پردازنده ها</span><br />
<br />
پردازنده ها به گروه های زير دسته بندی می شوند:<br />
<br />
1. Complex Instruction Set Computers - CISC<br />
     •	پردازنده هائی که مجموعه دستورالعمل کاملی با پشتيبانی سخت افزاری برای انواع وسيعی ازعمليات را دارند. در عمليات علمی، مهندسی و رياضی معمولا اکثر کارها را در کوتاهترين زمان انجام می دهند.<br />
2. Reduced Instruction Set Computers - RISC <br />
     •	پردازنده هائی که مجموعه دستورالعمل فشرده و کوچکی دارند. در کاربردهای تجاری و برنامه هائی که توسط کامپايلر ايجاد شده اند معمولا اکثر کارها را در کوتاهترين زمان انجام می دهند.<br />
3. Hybrid <br />
     •	پردازنده هائی که ترکيبی از روش CISC و RISC هستند و سعی دارند تعادلی بين مزايای هر دو روش برقرار کنند. <br />
4. Special purpose <br />
     •	پردازند هائی که برای وظايف خاصی بهينه شده اند. Digital signal processors و انواع co-processors نوع متعارف اين دسته هستند.<br />
5. Hypothetical <br />
     •	پردازنده هائی که هنوز وجود ندارند يا هرگز وجود نداشته اند. پردازنده هائی که در فاز طراحی هستند يا برای کارهای نظری درنظر گرفته شده اند. معروف ترين آنها MIX است که يک پردازنده فرضی آموزش ساخته شده توسط Donald E. Knuth برای ارائه الگوريتم های کامپيوتری است.]]></description>
			<content:encoded><![CDATA[اين بخش شرح مختصری پيرامون اجزاي اصلی يک سيستم کامپيوتری (حافظه و پردازنده)می دهد، که باعث می شود کاربر درک بيشتری نسبت به مفاهيمی که در طی برنامه اسمبلی با آن ها سرو کار دارد پيدا کند.<br />
<br />
يک سيستم کامپيوتری ترکيب کاملي از سخت افزار و نرم افزارهای سيستمی است که باعث می شود ماشين مفيد و وظيفه مندي برای کار معينی بشود.<br />
<br />
اجزای اصلی سخت افزار يک ريز کامپيوتر شامل:<br />
<br />
•	پردازنده مرکزی<br />
•	حافظه<br />
•	صفحه کليد به عنوان ورودی<br />
•	صفحه نمايش به عنوان خروجی<br />
•	يک يا چند ديسک درايو برای ذخيره برنامه ها و داده ها<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">حافظه</span></div>
<br />
حافظه مکان ذخيره برنامه ها و داده ها با امکان دسترسی مجدد به آنها است. حافظه اصلی از ديد برنامه نويس از تعدادی بيت تشکيل شده است که قادر به نگهداری صفر يا يک است. مکانيسم دسترسی به اطلاعات درون حافظه آدرس دهی است. بيت هائی که دارای آدرس يکسان هستند را سلول حافظه (cell) می نامند. هر سلول تنها می تواند شامل يک مقدارعددی باشد. طول سلول(Lc) توسط تعداد بيت های سلول مشخص می شود. در ريز کامپيوترها طول سلول هشت بيت است که به آن بايت نيز گفته می شود. خاصيت مهم سلول آدرس پذيری است، يعنی هر سلول دارای يک آدرس منحصر بفرد است. بنابراين هر بايت درحافظه نيز دارای يک آدرس منحصر بفرد است.<br />
<br />
اغلب حافظه ها در اندازه های بزرگتراز بايت نظير کيلوبايت (1KB=210=1,024 bytes)، مگابايت (1MB=220= 1,048,576 bytes) و گيگابايت (1GB=230=1,073,741,824 bytes) بيان می شوند. يک کامپيوتر با 32 مگابايت حافظه قادر است تقريبا 32 ميليون بايت از اطلاعات را نگهداری کند.<br />
<br />
نکته. تعداد بيت های يک کلمه بستگی به سخت افزار دارد و با Lw نشان داده می شود. همواره رابطه Lw≥Lc برقرار است. آدرس هر کلمه آدرس اولين سلول آن است.<br />
<br />
<span style="font-weight: bold;">فضای آدرسی</span><br />
<br />
آدرس های حافظه از عدد صفر شروع می شوند. اگر حافظه ای دارای n سلول باشد آدرس های آن از 0 تا n-1 خواهد بود. کامپيوتری که سيستم عددی باينری را استفاده می کند برای بيان آدرس نيز همان روش را به کار می برد. تعداد بيت های آدرس تعداد سلول های قابل دسترس حافظه را نشان می دهد و ربطی به طول سلول ندارد. فضای آدرسی بيشترين ميزان حافظه است که يک پردازنده می تواند آدرس دهی کند.<br />
<br />
اگر آدرسی m بيت طول داشته باشد بيشترين تعداد سلول های قابل آدرس دهی 2m خواهد بود.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">واحد پردازش مرکزی</span></div>
<br />
پردازنده يا واحد پردازش مرکزی (Central Processing Unit) يا (CPU) از واحد کنترل و واحد محاسبات و منطق ساخته شده است. وظيفه آن خواندن و نوشتن محتويات سلول حافظه، انتقال داده بين سلول های حافظه و ثبات های خاص، رمزبرداری و اجرای دستورالعمل های ذخيره شده در حافظه اصلی است.<br />
<br />
CPU هر دستورالعمل را در يک سری مراحل اجرا می کند و برای همگام کردن سيکل اجرای دستورالعمل از يک ساعت (Clock) استفاده می کنند. ساعت در يک فرکانس ثابت پالس می زند که سرعت ساعت ناميده می شود. اين ساعت دقيقه و ثانيه را نگه نمی دارد بلکه فقط در نرخ ثابتی ضربان دارد. مدارهای الکترونيکی کامپيوتر از اين ضربان ها برای انجام صحيح عمليات خود استفاده می کنند. تعداد ضربه ها يا اصطلاحا سيکل های مورد نياز يک دستورالعمل بستگی به نسل و مدل CPU دارد.<br />
<br />
مثال. وقتی يک کامپيوتر 1.5GHz می خريد، 1.5 GHz فرکانس اين ساعت است. يعنی در هر ثانيه 1.5 ميليارد پالس می زند (گيگاهرتز GHz يا يک ميليارد سيکل در ثانيه است).<br />
<br />
<span style="font-weight: bold;">مجموعه دستورالعمل ها</span><br />
<br />
مجموعه ای از تمام دستورالعمل هائی که يک نوع پردازنده می تواند اجرا می کند مجموعه دستورالعمل (Instruction Set) ناميده می شوند که درواقع زبان ماشين آن نوع پردازنده را شکل می دهد. دستورالعمل های زبان ماشين به صورت اعداد رمز می شوند و عموما ساده هستند. زيرا زبان ماشين با اين هدف طراحی می شود که پردازنده قادر باشد مقصود دستورالعمل را سريع کشف کند تا بتواند به طور موثر آن را اجرا کند..<br />
<br />
هر پردازنده زبان ماشين منحصر بفرد خود را دارد. و مجموعه دستورالعمل از ماشينی به ماشين ديگر متفاوت است. به همين دليل مثلا برنامه های نوشته شده برای Mac نمی توانند روی يک IBM-PC اجرا شوند. برنامه های نوشته شده در زبان های ديگر بايد توسط کامپايلر به زبان ماشين پردازنده ای که روی آن اجرا می شود تبديل شود. معمولا عملکرد کامپايلرها بر روی ماشين با دستورالعمل کمتر آسان تر است.<br />
<br />
<span style="font-weight: bold;">مجموعه ثبات ها</span><br />
<br />
دستورالعمل ها ممکن است نياز به داده ای داشته باشند تا روی آن عمل کند. هر پردازنده دارای يکسری سلول های حافظه است که داده های دستورالعمل را در خود ذخيره می کنند. اين سلول ها ثبات (register) ناميده می شوند و درون خود پردازنده قرار دارند. پردازنده می تواند به داده درون ثبات سريع تر از داده درون حافظه دسترسی پيدا کند. اغلب کامپيوترها مجموعه ای از ثبات ها را برای ذخيره موقت داده دارند. البته تعداد ثبات های پردازنده اندک است، بنابراين برنامه نويس ناچار است تنها داده های جاری را در ثبات ذخيره نمايد.<br />
<br />
<span style="font-weight: bold;">انواع پردازنده ها</span><br />
<br />
پردازنده ها به گروه های زير دسته بندی می شوند:<br />
<br />
1. Complex Instruction Set Computers - CISC<br />
     •	پردازنده هائی که مجموعه دستورالعمل کاملی با پشتيبانی سخت افزاری برای انواع وسيعی ازعمليات را دارند. در عمليات علمی، مهندسی و رياضی معمولا اکثر کارها را در کوتاهترين زمان انجام می دهند.<br />
2. Reduced Instruction Set Computers - RISC <br />
     •	پردازنده هائی که مجموعه دستورالعمل فشرده و کوچکی دارند. در کاربردهای تجاری و برنامه هائی که توسط کامپايلر ايجاد شده اند معمولا اکثر کارها را در کوتاهترين زمان انجام می دهند.<br />
3. Hybrid <br />
     •	پردازنده هائی که ترکيبی از روش CISC و RISC هستند و سعی دارند تعادلی بين مزايای هر دو روش برقرار کنند. <br />
4. Special purpose <br />
     •	پردازند هائی که برای وظايف خاصی بهينه شده اند. Digital signal processors و انواع co-processors نوع متعارف اين دسته هستند.<br />
5. Hypothetical <br />
     •	پردازنده هائی که هنوز وجود ندارند يا هرگز وجود نداشته اند. پردازنده هائی که در فاز طراحی هستند يا برای کارهای نظری درنظر گرفته شده اند. معروف ترين آنها MIX است که يک پردازنده فرضی آموزش ساخته شده توسط Donald E. Knuth برای ارائه الگوريتم های کامپيوتری است.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[ابهام در منشاء تنها قمر زمين]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=283</link>
			<pubDate>Fri, 03 Sep 2010 07:32:34 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=283</guid>
			<description><![CDATA[هرچند سال گذشته مشخص شد كه ماه آب دارد، اما بررسي دوباره نمونه‌هاي جمع‌آوري شده در ماموريت‌هاي آپولو نشان داده كه زير پوسته ماه نيز مرطوب است و منشاء شكل گيري ماه نمي‌تواند برخورد جسمي با زمين باشد.<br />
<br />
لري تيلور همواره مي‌گفت كه اگر زماني در ماه آب پيدا شود، اسمش را عوض خواهد كرد! اما وي هيچ‌گاه انتظار نداشت كه تحقيقات خودش روزي اين حقيقت را برملا كند.<br />
<br />
به گزارش نيچر، سنگ‌شناس دانشگاه تنسي در اولين كنفرانس علوم سياره‌اي و قمري كه در سال 1970 / 1349 برگزار شد، تنها 32 سال سن داشت. در آن كنفرانس همكاران وي نتايج بررسي‌هاي خود را از صخره‌هاي ماه، كه در سال قبل از آن و طي ماموريت آپولو 11 جمع‌آوري شده بود، تشريح كردند. آنچه كه تيلور در نمونه‌ها ديد، تنها آهن فلزي خالص بود. اين نكته نشان مي‌داد كه هيچ آبي در محيط اطراف وجود ندارد كه باعث زنگ‌زدن آهن شود. ساير نتايج نيز منجر به شكل‌گيري يك مرز بين دانشمندان شد: ماه كاملا خشك است و هميشه هم همين‌طور بوده‌است.<br />
<br />
چهل سال بعد و در همان كنفرانس ساليانه كه اين دفعه در هيوستون تگزاس برگزار مي‌شد، تيلور و همكارانش اعلام كردند كه آنها تمام اين مدت را اشتباه مي‌كردند. در گردهمايي هفته گذشته، سه گروه مختلف شواهدي را عرضه كردند كه نشان مي‌داد بلور‌هاي موجود در صخره‌هاي آتشفشاني جمع‌آوري شده توسط فضانوردان آپولو، حاوي مقدار زيادي آب، در حد چند هزار قسمت در ميليون است.<br />
<br />
ماه خشك، ماه آبدار<br />
اين يافته‌ها هنگامي‌كه به آب يخ‌زده سطح ماه نگاه بياندازيم معناي بيشتري پيدا مي‌كند. وجود آب در سطح ماه در سال گذشته، توسط ماهواره ال‌كراس ناسا و سفينه چاندرايان1 هند كشف شد. مطالعات جديد بر روي نمونه‌هاي آپولو، نشانه‌هايي را از آنچه كه درون ماه به انتظار ما نشسته‌است فراهم مي‌كند.<br />
<br />
<img src="http://khabaronline.ir/images/2010/3/moon.jpg" border="0" alt="[تصویر: moon.jpg&#93;" /><br />
<br />
نتايج جديد نشان مي‌دهد كه درون ماه همواره حاوي آب بوده‌است. اين مطلب نظريه‌هايي را كه درباره شكل‌گيري ماه طي يك برخورد آتشين و سرد شدن يكباره جسم آن است، به چالش مي‌كشد. نتايج همچنين نشان مي‌دهد كه نقش دنباله‌دارها در انتقال آب به ماه، بسيار مهم‌تر از آن چيزي است كه دانشمندان در گذشته تصور مي‌كردند.<br />
<br />
ليندا الكينز از ماه‌شناسان انستيتو فناوري ماساچوست، MIT، مي‌گويد: «يافته‌هاي جديد يك انقلاب محسوب مي‌شود.»<br />
<br />
به گفته تيلور، نخستين شواهد درباره رطوبت درون ماه در سال 2008 / 1387 منتشر شد. در آن زمان محققان مقادير ناچيزي آب را در خرده‌هاي آبگينه آتشفشاني به‌دست آمده از ماموريت آپولو پيدا كردند. اين كار به كمك پيشرفت طيف‌نگارهاي يوني حاصل شد كه مي توانستند چنين حجم اندكي از آب را نمايان سازند.<br />
<br />
اگرچه نمونه‌هاي آتشفشاني شواهدي را دال بر وجود آب در داخل ماه ارائه مي‌كردند، اما اين شواهد محدوديت‌هايي داشتند. اين نمونه‌ها در فوران‌هاي آتشين شكل گرفته‌اند كه مشخصا شيمي آنها را تغيير داده‌است. در نتيجه آنها نماينده‌هايي نامطمئن براي صخره‌هاي درون ماه هستند.<br />
<br />
منبع آب چيست؟<br />
اما اكتشافات جديد درباره آب، مربوط به يك منبع كاملا متفاوت است. بلورهاي معدني ريز بازالت تيره، كه در درياهاي ماه پيدا شده است. اين بلورها در دشت‌هاي وسيع گدازه آتشفشاني كه زماني اين درياها را پر كرده بود، شكل گرفته‌اند و حاوي مقادير بسيار بيشتري آب نسبت به خرده‌هاي آبگينه هستند.<br />
<br />
به گفته تيلور، به دليل شكل‌گيري بازالت در شرايط آرام‌تر نسبت به فوران‌هاي آتشين ايجاد كننده آبگينه‌ها، برآورد مقدار آب موجود در زير پوسته ماه را با استفاده از اين صخره‌ها راحت‌تر و مطمئن‌تر است.<br />
<br />
سه گروه تحقيقاتي به نتايج متفاوتي درباره مقدار آب گذشته ماه رسيدند، اما همه آنها پيش‌بيني مي‌كنند كه آب درون ماه، ده‌ها هزار برابر بيشتر از مقداري است كه در گذشته تصور مي‌شد. با اين وجود، مقدار اين آب هنوز كمتر از زمين است.<br />
<br />
يك ماه با چنين رطوبتي مي‌تواند يك محيط فعال‌تر باشد. آب نقطه ذوب پوسته صخره‌اي را كاهش مي‌دهد و شكل‌گيري ماگما را آسان‌تر مي‌سازد. آب همچنين امكان جابه‌جايي صخره‌ها را درون ماه فراهم مي‌كند. اين نكته به ماه اجازه مي‌دهد كه سريع‌تر از آنچه كه دانشمندان در گذشته فكر مي‌كردند سرد شود و مي‌تواند پاسخي براي برخي از معماهاي زمين‌شناسي ماه باشد.<br />
<br />
يكي از گروه‌هاي تحقيقاتي مدركي از منشاء آب پيدا كرده‌است. جيمز گرين‌وود از دانشگاه وسليان كنتاكي كشف كرده‌است كه آب موجود در ماه، داراي نسبت دوتريم يا هيدروژن سنگين به مراتب بالاتري در مقايسه با آب موجود در زمين است. نسبت كشف شده براي ماه، مشابه اين نسبت براي دنباله‌دارها است.<br />
<br />
معماي پيچيده<br />
نسبت دوتريم موجود در آب ماه يك شگفتي محسوب مي‌شود. تصور مي‌شد كه ماه در اثر برخورد يك جسم با اندازه‌هاي مريخ به زمين، اندكي پس از شكل‌گيري آن به وجود آمده باشد. در اثر اين برخورد بخشي از سياره ذوب شد و صخره‌هاي گداخته‌اي را به فضا پرتاب كرد كه در نهايت به يكديگر پيوسته و در اثر سخت شدن، ماه را به‌وجود آوردند. اين تصوير به اين معنا است كه زمين و ماه بايد نسبت مشابهي از آب سنگين داشته باشند.<br />
<br />
اما تركيب به مراتب سنگين‌تر آب موجود در نمونه‌هاي ماه، محققان را مجبور كرده‌است كه به دنبال توضيحات جديدتري باشند. به گفته تيلور يك ايده اين است كه دسته‌اي از دنباله‌دارها، اندكي پس از برخورد اوليه كه باعث شكل‌گيري ماه شد، به آن برخورد كرده‌اند. دنباله‌دارها با زمين نيز برخورد كرده‌اند اما به دليل اينكه سياره جوان حاوي منابع آب بسيار بيشتري بود، آب سنگين موجود در دنباله‌دارها نتوانست تاثير زيادي بر تركيب آب زمين بگذارد.<br />
<br />
يك گزينه ديگر اين است كه گرماي حاصل از برخورد، آب سبك‌تر موجود در ماه را تبخير كرده و باعث غني شدن آب سنگين ماه شده است. شايد هم جسم برخورد كننده خود حاوي مقادير عظيمي از آب سنگين بوده‌است.<br />
<br />
الكينز مي‌گويد: «همه اينها ممكن است منجر به تجديد نظر در نظريه برخورد كننده غول‌پيكر شود.»<br />
<br />
اما هنوز براي چنين كاري زود است. نتايج مربوط به آب سنگين مي‌تواند تنها نشان‌دهنده يك غني‌شدگي نقطه‌اي باشد. چنين چيزي به عنوان مثال مي‌تواند مربوط به نمونه‌گيري از محل برخورد يك دنباله‌دار باستاني باشد. همچنين برخي از محققان هنوز متقاعد نشده‌اند كه آنطور كه نمونه‌هاي جديد اشاره مي‌كند، ماه يك محيط مرطوب باشد.<br />
<br />
چيپ شيرر از دانشگاه نيومكزيكو، كلرين موجود در صخره‌هاي آتشفشاني را آناليز كرده‌است. كلرين مي‌تواند اطلاعاتي درباره آب باستاني فراهم كند. به گفته وي، غلظت آب تخمين زده شده توسط سايرين بالاتر از حدي است كه نتايج آزمايشات وي نشان مي‌دهد.<br />
<br />
با تمام اين اوصاف به نظر مي‌رسد كه بايد منتظر باشيم و ببينيم كه در آينده چه اتفاقي مي‌افتد. آيا ماه واقعا آبدار است؟!<br />
<br />
منبع : خبرآنلاين]]></description>
			<content:encoded><![CDATA[هرچند سال گذشته مشخص شد كه ماه آب دارد، اما بررسي دوباره نمونه‌هاي جمع‌آوري شده در ماموريت‌هاي آپولو نشان داده كه زير پوسته ماه نيز مرطوب است و منشاء شكل گيري ماه نمي‌تواند برخورد جسمي با زمين باشد.<br />
<br />
لري تيلور همواره مي‌گفت كه اگر زماني در ماه آب پيدا شود، اسمش را عوض خواهد كرد! اما وي هيچ‌گاه انتظار نداشت كه تحقيقات خودش روزي اين حقيقت را برملا كند.<br />
<br />
به گزارش نيچر، سنگ‌شناس دانشگاه تنسي در اولين كنفرانس علوم سياره‌اي و قمري كه در سال 1970 / 1349 برگزار شد، تنها 32 سال سن داشت. در آن كنفرانس همكاران وي نتايج بررسي‌هاي خود را از صخره‌هاي ماه، كه در سال قبل از آن و طي ماموريت آپولو 11 جمع‌آوري شده بود، تشريح كردند. آنچه كه تيلور در نمونه‌ها ديد، تنها آهن فلزي خالص بود. اين نكته نشان مي‌داد كه هيچ آبي در محيط اطراف وجود ندارد كه باعث زنگ‌زدن آهن شود. ساير نتايج نيز منجر به شكل‌گيري يك مرز بين دانشمندان شد: ماه كاملا خشك است و هميشه هم همين‌طور بوده‌است.<br />
<br />
چهل سال بعد و در همان كنفرانس ساليانه كه اين دفعه در هيوستون تگزاس برگزار مي‌شد، تيلور و همكارانش اعلام كردند كه آنها تمام اين مدت را اشتباه مي‌كردند. در گردهمايي هفته گذشته، سه گروه مختلف شواهدي را عرضه كردند كه نشان مي‌داد بلور‌هاي موجود در صخره‌هاي آتشفشاني جمع‌آوري شده توسط فضانوردان آپولو، حاوي مقدار زيادي آب، در حد چند هزار قسمت در ميليون است.<br />
<br />
ماه خشك، ماه آبدار<br />
اين يافته‌ها هنگامي‌كه به آب يخ‌زده سطح ماه نگاه بياندازيم معناي بيشتري پيدا مي‌كند. وجود آب در سطح ماه در سال گذشته، توسط ماهواره ال‌كراس ناسا و سفينه چاندرايان1 هند كشف شد. مطالعات جديد بر روي نمونه‌هاي آپولو، نشانه‌هايي را از آنچه كه درون ماه به انتظار ما نشسته‌است فراهم مي‌كند.<br />
<br />
<img src="http://khabaronline.ir/images/2010/3/moon.jpg" border="0" alt="[تصویر: moon.jpg]" /><br />
<br />
نتايج جديد نشان مي‌دهد كه درون ماه همواره حاوي آب بوده‌است. اين مطلب نظريه‌هايي را كه درباره شكل‌گيري ماه طي يك برخورد آتشين و سرد شدن يكباره جسم آن است، به چالش مي‌كشد. نتايج همچنين نشان مي‌دهد كه نقش دنباله‌دارها در انتقال آب به ماه، بسيار مهم‌تر از آن چيزي است كه دانشمندان در گذشته تصور مي‌كردند.<br />
<br />
ليندا الكينز از ماه‌شناسان انستيتو فناوري ماساچوست، MIT، مي‌گويد: «يافته‌هاي جديد يك انقلاب محسوب مي‌شود.»<br />
<br />
به گفته تيلور، نخستين شواهد درباره رطوبت درون ماه در سال 2008 / 1387 منتشر شد. در آن زمان محققان مقادير ناچيزي آب را در خرده‌هاي آبگينه آتشفشاني به‌دست آمده از ماموريت آپولو پيدا كردند. اين كار به كمك پيشرفت طيف‌نگارهاي يوني حاصل شد كه مي توانستند چنين حجم اندكي از آب را نمايان سازند.<br />
<br />
اگرچه نمونه‌هاي آتشفشاني شواهدي را دال بر وجود آب در داخل ماه ارائه مي‌كردند، اما اين شواهد محدوديت‌هايي داشتند. اين نمونه‌ها در فوران‌هاي آتشين شكل گرفته‌اند كه مشخصا شيمي آنها را تغيير داده‌است. در نتيجه آنها نماينده‌هايي نامطمئن براي صخره‌هاي درون ماه هستند.<br />
<br />
منبع آب چيست؟<br />
اما اكتشافات جديد درباره آب، مربوط به يك منبع كاملا متفاوت است. بلورهاي معدني ريز بازالت تيره، كه در درياهاي ماه پيدا شده است. اين بلورها در دشت‌هاي وسيع گدازه آتشفشاني كه زماني اين درياها را پر كرده بود، شكل گرفته‌اند و حاوي مقادير بسيار بيشتري آب نسبت به خرده‌هاي آبگينه هستند.<br />
<br />
به گفته تيلور، به دليل شكل‌گيري بازالت در شرايط آرام‌تر نسبت به فوران‌هاي آتشين ايجاد كننده آبگينه‌ها، برآورد مقدار آب موجود در زير پوسته ماه را با استفاده از اين صخره‌ها راحت‌تر و مطمئن‌تر است.<br />
<br />
سه گروه تحقيقاتي به نتايج متفاوتي درباره مقدار آب گذشته ماه رسيدند، اما همه آنها پيش‌بيني مي‌كنند كه آب درون ماه، ده‌ها هزار برابر بيشتر از مقداري است كه در گذشته تصور مي‌شد. با اين وجود، مقدار اين آب هنوز كمتر از زمين است.<br />
<br />
يك ماه با چنين رطوبتي مي‌تواند يك محيط فعال‌تر باشد. آب نقطه ذوب پوسته صخره‌اي را كاهش مي‌دهد و شكل‌گيري ماگما را آسان‌تر مي‌سازد. آب همچنين امكان جابه‌جايي صخره‌ها را درون ماه فراهم مي‌كند. اين نكته به ماه اجازه مي‌دهد كه سريع‌تر از آنچه كه دانشمندان در گذشته فكر مي‌كردند سرد شود و مي‌تواند پاسخي براي برخي از معماهاي زمين‌شناسي ماه باشد.<br />
<br />
يكي از گروه‌هاي تحقيقاتي مدركي از منشاء آب پيدا كرده‌است. جيمز گرين‌وود از دانشگاه وسليان كنتاكي كشف كرده‌است كه آب موجود در ماه، داراي نسبت دوتريم يا هيدروژن سنگين به مراتب بالاتري در مقايسه با آب موجود در زمين است. نسبت كشف شده براي ماه، مشابه اين نسبت براي دنباله‌دارها است.<br />
<br />
معماي پيچيده<br />
نسبت دوتريم موجود در آب ماه يك شگفتي محسوب مي‌شود. تصور مي‌شد كه ماه در اثر برخورد يك جسم با اندازه‌هاي مريخ به زمين، اندكي پس از شكل‌گيري آن به وجود آمده باشد. در اثر اين برخورد بخشي از سياره ذوب شد و صخره‌هاي گداخته‌اي را به فضا پرتاب كرد كه در نهايت به يكديگر پيوسته و در اثر سخت شدن، ماه را به‌وجود آوردند. اين تصوير به اين معنا است كه زمين و ماه بايد نسبت مشابهي از آب سنگين داشته باشند.<br />
<br />
اما تركيب به مراتب سنگين‌تر آب موجود در نمونه‌هاي ماه، محققان را مجبور كرده‌است كه به دنبال توضيحات جديدتري باشند. به گفته تيلور يك ايده اين است كه دسته‌اي از دنباله‌دارها، اندكي پس از برخورد اوليه كه باعث شكل‌گيري ماه شد، به آن برخورد كرده‌اند. دنباله‌دارها با زمين نيز برخورد كرده‌اند اما به دليل اينكه سياره جوان حاوي منابع آب بسيار بيشتري بود، آب سنگين موجود در دنباله‌دارها نتوانست تاثير زيادي بر تركيب آب زمين بگذارد.<br />
<br />
يك گزينه ديگر اين است كه گرماي حاصل از برخورد، آب سبك‌تر موجود در ماه را تبخير كرده و باعث غني شدن آب سنگين ماه شده است. شايد هم جسم برخورد كننده خود حاوي مقادير عظيمي از آب سنگين بوده‌است.<br />
<br />
الكينز مي‌گويد: «همه اينها ممكن است منجر به تجديد نظر در نظريه برخورد كننده غول‌پيكر شود.»<br />
<br />
اما هنوز براي چنين كاري زود است. نتايج مربوط به آب سنگين مي‌تواند تنها نشان‌دهنده يك غني‌شدگي نقطه‌اي باشد. چنين چيزي به عنوان مثال مي‌تواند مربوط به نمونه‌گيري از محل برخورد يك دنباله‌دار باستاني باشد. همچنين برخي از محققان هنوز متقاعد نشده‌اند كه آنطور كه نمونه‌هاي جديد اشاره مي‌كند، ماه يك محيط مرطوب باشد.<br />
<br />
چيپ شيرر از دانشگاه نيومكزيكو، كلرين موجود در صخره‌هاي آتشفشاني را آناليز كرده‌است. كلرين مي‌تواند اطلاعاتي درباره آب باستاني فراهم كند. به گفته وي، غلظت آب تخمين زده شده توسط سايرين بالاتر از حدي است كه نتايج آزمايشات وي نشان مي‌دهد.<br />
<br />
با تمام اين اوصاف به نظر مي‌رسد كه بايد منتظر باشيم و ببينيم كه در آينده چه اتفاقي مي‌افتد. آيا ماه واقعا آبدار است؟!<br />
<br />
منبع : خبرآنلاين]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[درخت‌هاي روي خورشيد]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=282</link>
			<pubDate>Fri, 03 Sep 2010 07:29:36 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=282</guid>
			<description><![CDATA[<div style="text-align: justify;">[align=justify&#93;رصدخانه ديناميك خورشيدي، اس.دي.او كه هفته گذشته از نخستين تصاوير شگفت‌انگيز آن رونمايي شد، در تصاويري حيرت‌آور، شكل‌گيري يكي از زبانه‌هاي خورشيدي را مي‌بينيد كه به شكل يك درخت درمي‌آيد و صعود مي‌كند.<br />
اين ستون‌هاي از گازهاي فوق‌العاده داغي تشكيل شده‌اند كه الكترون‌ها از اتم‌هاي آن جدا شده‌اند و به يون‌هايي تبديل شده‌اند كه تحت تاثير ميدان مغناطيسي، به اين طرف و آن طرف كشيده مي‌شوند. دماي اين ابر به يك ميليون درجه كلوين بالغ مي‌شود.<br />
تنه درخت در ابتدا سرد است، اما با صعود به ارتفاع‌هاي بالاتر، به شدت داغ مي‌شود و فوران مي‌كند؛ تا آن‌كه دوباره خنك شود و به سطح خورشيد بازگردد.<br />
<br />
<img src="http://khabaronline.ir/images/2010/4/sun-1.jpg" border="0" alt="[تصویر: sun-1.jpg&#93;" /><br />
<br />
رنگ‌هايي كه در اين‌جا مي‌بينيد، رنگ‌هاي كاذبي است كه براي مشخص‌كردن نواحي داغ و سرد به كار رفته است. رنگ‌هاي قرمز مربوط به نواحي 60هزار تا 80هزار كلوين و نواحي آبي و سبز مربوط به نواحي داغ با دماي يك ميليون تا دو ميليون كلوين است.<br />
منبع : خبرانلاين</div>[/align&#93;]]></description>
			<content:encoded><![CDATA[<div style="text-align: justify;">[align=justify]رصدخانه ديناميك خورشيدي، اس.دي.او كه هفته گذشته از نخستين تصاوير شگفت‌انگيز آن رونمايي شد، در تصاويري حيرت‌آور، شكل‌گيري يكي از زبانه‌هاي خورشيدي را مي‌بينيد كه به شكل يك درخت درمي‌آيد و صعود مي‌كند.<br />
اين ستون‌هاي از گازهاي فوق‌العاده داغي تشكيل شده‌اند كه الكترون‌ها از اتم‌هاي آن جدا شده‌اند و به يون‌هايي تبديل شده‌اند كه تحت تاثير ميدان مغناطيسي، به اين طرف و آن طرف كشيده مي‌شوند. دماي اين ابر به يك ميليون درجه كلوين بالغ مي‌شود.<br />
تنه درخت در ابتدا سرد است، اما با صعود به ارتفاع‌هاي بالاتر، به شدت داغ مي‌شود و فوران مي‌كند؛ تا آن‌كه دوباره خنك شود و به سطح خورشيد بازگردد.<br />
<br />
<img src="http://khabaronline.ir/images/2010/4/sun-1.jpg" border="0" alt="[تصویر: sun-1.jpg]" /><br />
<br />
رنگ‌هايي كه در اين‌جا مي‌بينيد، رنگ‌هاي كاذبي است كه براي مشخص‌كردن نواحي داغ و سرد به كار رفته است. رنگ‌هاي قرمز مربوط به نواحي 60هزار تا 80هزار كلوين و نواحي آبي و سبز مربوط به نواحي داغ با دماي يك ميليون تا دو ميليون كلوين است.<br />
منبع : خبرانلاين</div>[/align]]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[سرعت نور شكسته شد]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=281</link>
			<pubDate>Fri, 03 Sep 2010 07:21:06 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=281</guid>
			<description><![CDATA[جام جم آنلاين: فيزيك اخترشناسان دانشگاه تگزاس با مطالعه بر روي پالسار يا تب اختري در فاصله 10 هزار سال نوري از زمين متوجه شدند امواج راديويي تابش يافته شده از اين تب اختر با سرعتي بيشتر از سرعت نور در فضا سفر مي كنند.<br />
تب اختران بقاياي ستاره اي مرده هستند كه بسيار مغناطيسي بوده و با سرعتي بالا در گردشند. عبور از سرعت نور و يا حركت با سرعتي بيش از سرعت نور نيز تا كنون يكي از غير ممكنهاي هميشگي بشر بوده است كه اين حصار با كشف چنين پديده هاي كيهاني به آرامي در هم شكسته مي شود.<br />
<br />
اينشتين در گذشته نظريه اي مبني بر امكان حركت سريعتر از نور ارائه كرده بود كه بر اساس آن درصورتي كه پديده اي خالي از اطلاعات باشد مي تواند سريعتر از نور حركت كند. اين قانون فيزيكي در آزمايشهايي كه بر روي زمين شكل گرفته اند به اثبات رسيده است.<br />
<br />
با اين حال تب اختر فوق سريع در نوع خود اولين نمونه اي است كه تا به حال در خارج از سياره ديده شده است. چه امواج آن حاوي اطلاعات باشند يا نه، اين پديده به موضوعي جدي براي مطالعه اخترشناسان تبديل شده است.<br />
بر اساس گزارش يونيورس تودي، اخترشناسان بر اين باورند گاهي اوقات سرعت امواج راديويي اين تب اختر در اثر عبور از ميان ابرهاي هيدروژني غني به دست به وجود مي آيد زيرا اين ابرها باعث افزايش طول موج الكترومغناطيسي امواج مي شوند.<br />
<br />
منبع : ch4.iribtv.ir]]></description>
			<content:encoded><![CDATA[جام جم آنلاين: فيزيك اخترشناسان دانشگاه تگزاس با مطالعه بر روي پالسار يا تب اختري در فاصله 10 هزار سال نوري از زمين متوجه شدند امواج راديويي تابش يافته شده از اين تب اختر با سرعتي بيشتر از سرعت نور در فضا سفر مي كنند.<br />
تب اختران بقاياي ستاره اي مرده هستند كه بسيار مغناطيسي بوده و با سرعتي بالا در گردشند. عبور از سرعت نور و يا حركت با سرعتي بيش از سرعت نور نيز تا كنون يكي از غير ممكنهاي هميشگي بشر بوده است كه اين حصار با كشف چنين پديده هاي كيهاني به آرامي در هم شكسته مي شود.<br />
<br />
اينشتين در گذشته نظريه اي مبني بر امكان حركت سريعتر از نور ارائه كرده بود كه بر اساس آن درصورتي كه پديده اي خالي از اطلاعات باشد مي تواند سريعتر از نور حركت كند. اين قانون فيزيكي در آزمايشهايي كه بر روي زمين شكل گرفته اند به اثبات رسيده است.<br />
<br />
با اين حال تب اختر فوق سريع در نوع خود اولين نمونه اي است كه تا به حال در خارج از سياره ديده شده است. چه امواج آن حاوي اطلاعات باشند يا نه، اين پديده به موضوعي جدي براي مطالعه اخترشناسان تبديل شده است.<br />
بر اساس گزارش يونيورس تودي، اخترشناسان بر اين باورند گاهي اوقات سرعت امواج راديويي اين تب اختر در اثر عبور از ميان ابرهاي هيدروژني غني به دست به وجود مي آيد زيرا اين ابرها باعث افزايش طول موج الكترومغناطيسي امواج مي شوند.<br />
<br />
منبع : ch4.iribtv.ir]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[مشکل در اتصال به DB]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=280</link>
			<pubDate>Thu, 02 Sep 2010 08:37:20 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=280</guid>
			<description><![CDATA[سلام<br />
من هم دارم یه cms خبری طراحی میکنم.<br />
یه توضیح کوچیک در مورد db اون:<br />
<br />
یه جدول کاربر دارم  که نام و فامیلی و نام کاربری و رمز و... تو اونه<br />
<br />
یه جدول role  هم دارم که نقش های مختلف رو در اون تعریف کردم.<br />
مثلا  id شماره 1 برای خبرنگار  id شماره 2 ویراستار و......<br />
<br />
حالا این کدها رو نوشتم ولی درست کار نمی کنه.<br />
می خوام وقتی ماربر login کرد  user , pass  از db بخونه و بعد هم با تشخیص role اون سطح<br />
دسترسی خاصی داشته باشه.<br />
میشه اطفا راهنمایی کنید که جرا این کد کار نمی کنه .<br />
<div class="codeblock phpcodeblock"><div class="title">کد PHP:<br />
</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">&lt;?php<br />session_start</span><span style="color: #007700">();<br />include&nbsp;</span><span style="color: #DD0000">"../includes/config.php"</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #0000BB">&#36;userneme</span><span style="color: #007700">=</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'username'</span><span style="color: #007700">&#93;;<br /></span><span style="color: #0000BB">&#36;password</span><span style="color: #007700">=</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'password'</span><span style="color: #007700">&#93;;<br /></span><span style="color: #0000BB">&#36;id</span><span style="color: #007700">=</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'id'</span><span style="color: #007700">&#93;;<br /></span><span style="color: #0000BB">&#36;_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'_u_username'</span><span style="color: #007700">&#93;=</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'username'</span><span style="color: #007700">&#93;;<br /></span><span style="color: #0000BB">&#36;_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'_u_password'</span><span style="color: #007700">&#93;=</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'password'</span><span style="color: #007700">&#93;;<br /></span><span style="color: #0000BB">&#36;_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'_u_id'</span><span style="color: #007700">&#93;=</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'id'</span><span style="color: #007700">&#93;;<br /><br /><br /></span><span style="color: #0000BB">&#36;user</span><span style="color: #007700">=</span><span style="color: #DD0000">"SELECT&nbsp;&nbsp;'u_user'&nbsp;FROM&nbsp;'tbl_user'&nbsp;&nbsp;where&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'u_user'='&#36;username';"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">&#36;result_user&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">mysql_query</span><span style="color: #007700">(</span><span style="color: #0000BB">&#36;user</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">//&#36;result&nbsp;=&nbsp;mysql_fetch_array(&#36;result_user);<br /><br /><br />//************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #0000BB">&#36;pass</span><span style="color: #007700">=&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">"SELECT&nbsp;&nbsp;'u_pass'&nbsp;from&nbsp;'tbl_user&nbsp;&nbsp;where&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'u_pass'='&#36;password';"</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #0000BB">&#36;result_pass&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">mysql_query</span><span style="color: #007700">(</span><span style="color: #0000BB">&#36;pass</span><span style="color: #007700">);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #FF8000">//&#36;result2&nbsp;=&nbsp;mysql_fetch_array(&#36;result_user);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />//***********************************************&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #0000BB">&#36;id</span><span style="color: #007700">=</span><span style="color: #DD0000">"SELECT&nbsp;&nbsp;'u_pass'&nbsp;from&nbsp;'tbl_user'&nbsp;&nbsp;whereh<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'u_id'='&#36;id';"</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #0000BB">&#36;result_id&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">mysql_query</span><span style="color: #007700">(</span><span style="color: #0000BB">&#36;id</span><span style="color: #007700">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #FF8000">//******************************************&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #007700">if&nbsp;(&nbsp;isset(</span><span style="color: #0000BB">&#36;userneme</span><span style="color: #007700">)&nbsp;&amp;&amp;&nbsp;isset(</span><span style="color: #0000BB">&#36;password</span><span style="color: #007700">)&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;(</span><span style="color: #0000BB">&#36;username&nbsp;</span><span style="color: #007700">==</span><span style="color: #0000BB">&#36;result</span><span style="color: #007700">[</span><span style="color: #DD0000">'username'</span><span style="color: #007700">&#93;)&nbsp;&amp;&amp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000BB">&#36;password&nbsp;</span><span style="color: #007700">==&nbsp;</span><span style="color: #0000BB">&#36;result2</span><span style="color: #007700">[</span><span style="color: #DD0000">'password'</span><span style="color: #007700">&#93;)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">&#36;_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'username'</span><span style="color: #007700">&#93;&nbsp;=&nbsp;</span><span style="color: #0000BB">&#36;username</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">&#36;_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'valid'</span><span style="color: #007700">&#93;=</span><span style="color: #0000BB">true</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">header&nbsp;</span><span style="color: #007700">(</span><span style="color: #DD0000">"Location:&nbsp;index.php"</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">"شما&nbsp;حق&nbsp;دسترسی&nbsp;ندارید."</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></code></div></div></div>
[/code&#93;<br />
<br />
<br />
من یه صفحه به نام login .php ساختم که یه فرم داره.<br />
و متد اون post خست و action اونم دادم به صفحه check_pass  <br />
محتویات صفحه check_pass هم می ذارم این جا:<hr />
و یه سوال دیگه :<br />
من به id که در جدول user هست احتیاج دارم.<br />
این روش دسترسی به id درسته؟<br />
<br />
ممنون]]></description>
			<content:encoded><![CDATA[سلام<br />
من هم دارم یه cms خبری طراحی میکنم.<br />
یه توضیح کوچیک در مورد db اون:<br />
<br />
یه جدول کاربر دارم  که نام و فامیلی و نام کاربری و رمز و... تو اونه<br />
<br />
یه جدول role  هم دارم که نقش های مختلف رو در اون تعریف کردم.<br />
مثلا  id شماره 1 برای خبرنگار  id شماره 2 ویراستار و......<br />
<br />
حالا این کدها رو نوشتم ولی درست کار نمی کنه.<br />
می خوام وقتی ماربر login کرد  user , pass  از db بخونه و بعد هم با تشخیص role اون سطح<br />
دسترسی خاصی داشته باشه.<br />
میشه اطفا راهنمایی کنید که جرا این کد کار نمی کنه .<br />
<div class="codeblock phpcodeblock"><div class="title">کد PHP:<br />
</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">&lt;?php<br />session_start</span><span style="color: #007700">();<br />include&nbsp;</span><span style="color: #DD0000">"../includes/config.php"</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #0000BB">&#36;userneme</span><span style="color: #007700">=</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'username'</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">&#36;password</span><span style="color: #007700">=</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'password'</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">&#36;id</span><span style="color: #007700">=</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'id'</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">&#36;_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'_u_username'</span><span style="color: #007700">]=</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'username'</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">&#36;_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'_u_password'</span><span style="color: #007700">]=</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'password'</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">&#36;_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'_u_id'</span><span style="color: #007700">]=</span><span style="color: #0000BB">&#36;_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'id'</span><span style="color: #007700">];<br /><br /><br /></span><span style="color: #0000BB">&#36;user</span><span style="color: #007700">=</span><span style="color: #DD0000">"SELECT&nbsp;&nbsp;'u_user'&nbsp;FROM&nbsp;'tbl_user'&nbsp;&nbsp;where&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'u_user'='&#36;username';"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">&#36;result_user&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">mysql_query</span><span style="color: #007700">(</span><span style="color: #0000BB">&#36;user</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">//&#36;result&nbsp;=&nbsp;mysql_fetch_array(&#36;result_user);<br /><br /><br />//************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #0000BB">&#36;pass</span><span style="color: #007700">=&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">"SELECT&nbsp;&nbsp;'u_pass'&nbsp;from&nbsp;'tbl_user&nbsp;&nbsp;where&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'u_pass'='&#36;password';"</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #0000BB">&#36;result_pass&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">mysql_query</span><span style="color: #007700">(</span><span style="color: #0000BB">&#36;pass</span><span style="color: #007700">);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #FF8000">//&#36;result2&nbsp;=&nbsp;mysql_fetch_array(&#36;result_user);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />//***********************************************&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #0000BB">&#36;id</span><span style="color: #007700">=</span><span style="color: #DD0000">"SELECT&nbsp;&nbsp;'u_pass'&nbsp;from&nbsp;'tbl_user'&nbsp;&nbsp;whereh<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'u_id'='&#36;id';"</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #0000BB">&#36;result_id&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">mysql_query</span><span style="color: #007700">(</span><span style="color: #0000BB">&#36;id</span><span style="color: #007700">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #FF8000">//******************************************&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #007700">if&nbsp;(&nbsp;isset(</span><span style="color: #0000BB">&#36;userneme</span><span style="color: #007700">)&nbsp;&amp;&amp;&nbsp;isset(</span><span style="color: #0000BB">&#36;password</span><span style="color: #007700">)&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;(</span><span style="color: #0000BB">&#36;username&nbsp;</span><span style="color: #007700">==</span><span style="color: #0000BB">&#36;result</span><span style="color: #007700">[</span><span style="color: #DD0000">'username'</span><span style="color: #007700">])&nbsp;&amp;&amp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000BB">&#36;password&nbsp;</span><span style="color: #007700">==&nbsp;</span><span style="color: #0000BB">&#36;result2</span><span style="color: #007700">[</span><span style="color: #DD0000">'password'</span><span style="color: #007700">])&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">&#36;_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'username'</span><span style="color: #007700">]&nbsp;=&nbsp;</span><span style="color: #0000BB">&#36;username</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">&#36;_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">'valid'</span><span style="color: #007700">]=</span><span style="color: #0000BB">true</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">header&nbsp;</span><span style="color: #007700">(</span><span style="color: #DD0000">"Location:&nbsp;index.php"</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">"شما&nbsp;حق&nbsp;دسترسی&nbsp;ندارید."</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></code></div></div></div>
[/code]<br />
<br />
<br />
من یه صفحه به نام login .php ساختم که یه فرم داره.<br />
و متد اون post خست و action اونم دادم به صفحه check_pass  <br />
محتویات صفحه check_pass هم می ذارم این جا:<hr />
و یه سوال دیگه :<br />
من به id که در جدول user هست احتیاج دارم.<br />
این روش دسترسی به id درسته؟<br />
<br />
ممنون]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[شی گرائی و کلاس]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=279</link>
			<pubDate>Tue, 31 Aug 2010 19:03:25 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=279</guid>
			<description><![CDATA[مهمترین تفاوت C و C++ اشيا هستند. این فصل مقدمه ای بر تئوری شیءگرائی است. شیءگرائی مفهوم کلاس ها را معرفی می کند که چهار ويژگی کلی را در شیءگرائی نشان می دهند: انتزاع، کپسوله کردن، توارث و چندريختی. تعريف کلاس و اجزای کلاس، نحوه تعريف تابع عضو و تابع دوست، سازنده ها و مخرب ها در اينجا توضيح داده خواهد شد.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">مفاهيم شی گرائی</span></div>
<br />
برنامه نویسی شیءگرائی (object oreinted programming) وسیله ای برای مدل کردن صحیح دنیای واقعی با استفاده از اشیا (objects) در برنامه و استفاده مجدد از کد است. یک شی در برنامه دقیقا همان طور تعريف می شود که در دنيای واقعی است؛ خواص معینی دارد که آن را توصیف می کند و متدهایی که می توانید برای انجام کار معینی روی شیء استفاده کنید.<br />
<br />
هدف کلی C++ اضافه کردن شیءگرائی به زبان برنامه نویسی C است. یک شیء برای نگهداری داده استفاده می شود. داده و توابعی که روی داده کار می کنند به هم مربوط هستند بنابراين داده و توابع هردو با هم دریک بسته قرار می گیرند. شیءگرائی بيشتر روی داده تاکيد دارد تا عمليات و توابعی که روی داده کار می کنند.<br />
<br />
مثال. ماشین یک شی است دارای خواصی مثل رنگ، تعداد درها و غیره است متدهای معینی دارد مانند سرعت گرفتن، ترمز کردن و غیره. می توان این شی را با استفاده از متدهایش استفاده کرد.<br />
<br />
شرحی از داده ها و توابعی که می توانند روی داده کار کنند را کلاس (class) می نامند. کلاس را به عنوان الگوئی برای توليد شیء می توان تصور کرد. کلاس در واقع يک نوع داده user-defined است . اشياء نمونه هائی از کلاس ها هستند که در زمان اجرا ايجاد می شوند.<br />
<br />
چهار مفهوم اصلی وجود دارند که اساس برنامه نویسی شیءگرائی را می سازند و توسط کلاس ها ارائه می شوند. این مفاهیم انتزاع (abstraction)، کپسوله کردن (encapsulation)، توارث (inheritance) و چندریختی (polymorphism) هستند.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">انتزاع</span></div>
<br />
شیء گرائی ابزاری را برای برنامه نویس فراهم می کند که اجزای فضای مسئله را توسط اشيا نمایش دهد. مسئله به بخش های تشکيل دهنده تجزيه می شود. هر مولفه يک شیء می شود که شامل داده های مرتبط و دستورالعمل های خود است. به اين ترتيب مسئله به همان صورتی که در دنيای واقعی هست توصیف می شود نه به روشی کامپیوتری که مسئله را حل می کند. یعنی می توانید با همه چيز در یک ترتیب کلی سروکار داشته باشید. پيچيدگی عمليات کاهش يافته و جزييات پياده سازی مخفی می ماند.<br />
<br />
مثال. درباره خصوصیات کلی وسيله نقليه بدون سروکارداشتن با یک وسيله و مدل خاص می توان بحث کرد. يک نمونه شیء MyVehicle از کلاس Vehicle که خواص کلی و توابع وسايل نقليه را در بر دارد می توان ايجاد کرد. تابع Print مشخصات کلی وسيله نقليه را نمايش می دهد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>Vehicle MyVehicle;<br />
MyVehicle.Print();</code></div></div>
<br />
<div style="text-align: center;"><span style="font-weight: bold;">کپسوله کردن</span></div>
<br />
قرار دادن داده و توابعی که روی داده کار می کنند را در یک بسته کپسوله کردن می گویند. در برنامه نویسی رویه گرا (مشابه آنچه تا کنون انجام می داديد) معلوم نیست چه تابعی روی چه متغیری کار می کند. در برنامه های پیچیده تر این روابط تیره تر می شوند. در برنامه نویسی شیءگرائی داده و توابع مربوط به آن- که اغلب متد (method) ناميده می شوند- با در يک بسته به نام کلاس قرار می گیرند بنابراین کاملا مشخص است چه تابعی روی چه داده ای کار می کند.<br />
<br />
کپسول کردن امکان پنهان کردن اطلاعات را نيز فراهم می کند. هر عضو کلاس را می توان به صورت عمومی، خصوصی یا محافظت شده مشخص کرد. شی ايجاد شده از کلاس به داده از طريق يک سری توابع عمومی دسترسی دارد و اجازه دسترسی مستقيم به اعضای خصوصی کلاس و خراب کردن آنها داده نمی شود. به اين صورت جزئيات پياده سازی هم مخفی می ماند و به طراح اجازه می دهد پياده سازی را اساسی بدون تغيير در واسطه ها عوض کند.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">وراثت</span></div>
<br />
یکی ديگر از جنبه های مفید برنامه نویسی شیءگرائی قابلیت استفاده مجدد از کد است. یک کلاس می تواند اعضای عمومی را از کلاس دیگر را به ارث ببرد. توارث اجازه می دهد کلاس جديدی شامل کليه داده ها و توابع کلاس (های) پياده سازی شود. کلاس موجود را کلاس پايه (base) و کلاس جديد که اعضای کلاس پايه را به ارث می گيرد را کلاس مشتق شده (derived) می نامند.<br />
<br />
مثال. فرض کنيد يک کلاس پايه به نام Vehicle برای وسايل نقليه داريم. وسيله نقليه می تواند ماشين، تراکتور، قايق و هواپيما را شامل شود که ممکن است هر يک از آنها احتياج به اطلاعات يا توابع اضافی داشته باشند. بنابراين می توان برای هر کدام کلاس های فرعی را تعريف کرد که خواص کلاس Vehicle را به ارث می برند علاوه براين که دارای فيلدهای جديد ديگری هم هستند.<br />
<br />
<div style="text-align: center;"><img src="http://hpkclasses.ir/Courses/cpp/cpp1101.JPG" border="0" alt="[تصویر: cpp1101.JPG&#93;" /></div>
<br />
اگر کلاس ويژگی های تنها يک کلاس را به ارث ببرد وارثت منفرد(single inheritance) و اگر از چند کلاس به ارث گرفته شود وارثت چندگانه (multiple inheritance) ناميده می شود.<br />
<br />
ارث از کلاس پایه ممکن است به صورت عمومی، خصوصی یا محافظت شده باشد. این مشخصه های دسترسی تعیین می کنند کلاس های مشتق شده می توانند به اعضای عمومی و محافظت شده کلاس پایه دسترسی پیدا کنند یا خیر. تنها وراثت عمومی است که با مفهوم توارث تطبیق دارد. دو فرم دیگر کمتر استفاده می شوند.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">چندریختی</span></div>
<br />
يک تابع در سلسله مراتب کلاس ها و زير کلاس ها می تواند به طرق مختلف پياده سازی شود و شکل های متعددی بگیرد. چندریختی یک رابط مشترک را برای پیاده سازی های مختلف از يک تابع در اختيار می گذارد که برای اشیا تحت شرایط مختلف متفاوت عمل کند. به عبارت ديگر فراخوانی تابعی که متعلق به کلاس است هميشه به شکل زير خواهد بود.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>object.function(parameter-list)</code></div></div>
<br />
مثال. در مثال قبل تابع نمايش برای قايق ممکن است متفاوت از نمايش يک وسيله نقليه باشد. دو تابع می توانند هم نام باشند ولی با کدهای متفاوت بسته به کلاس شیئی که تابع را فراخوانی می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>Vehicle MyVehicle;<br />
Boat YourBoat;<br />
MyVehicle.Print();<br />
YourBoat.Print();</code></div></div>
<br />
در مثال قبل کامپايلر نوع تابع print را برای دو نوع فراخوانی شده بر اساس نوع شیء می تواند پيدا کند. اما گاهی پيدا کردن آن تا زمان اجرای واقعی برنامه ممکن نيست. مشکل زمانی بروز می کند که به شیء از طريق اشاره گر دسترسی می شود و چون اشاره گرها می توانند بطور پويا به انواع مختلفی از اشيا اشاره کنند کلاس شیء تا زمان اجرا مشخص نمی شود. برای حل اين موضوع توابع عضو مجازی بکار می روند. توابع مجازی عضو (Virtual member functions) اجازه پياده سازی خاص تری از تابعی که فراخوانی می شود را مطابق با نوع شیء زمان اجرا می دهند.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">کلاس</span></div>
<br />
همانطور که قبلا دیدید ساختمان ها نوع داده جدیدی را ایجاد می کنند. کلاس ها به طور مشابه روش قدرتمند تری برای ایجاد يک نوع داده جدید هستند. وقتی یک کلاس تعریف می شود در اصل نوع داده جدیدی ساخته می شود که فيلدها و توابع خود را دارد. کلاس به عنوان قالبی برای تولید شی بکار می رود بنابراين از خود کلاس در برنامه استفاده نمی شود بلکه یک نمونه از آن که شیء ناميده می شود اعلان می شود. فرآیند تولید یک نمونه از کلاس یا ایجاد یک شی از کلاس به این معنا است که یک متغیر از نوع کلاس اعلان شود.<br />
<br />
کلاس مشابه ساختمان تعریف می شود فقط کافی است ابتدای آن کلمه کلیدی class ذکر شود. دقت کنید در انتهای بلاک علامت سمیکولن را فراموش نکنید.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>class classname<br />
{<br />
// members<br />
};</code></div></div>
<br />
وقتی یک کلاس ایجاد می کنید مانند هر متغیر دیگر می توانید یک نمونه از آن را بگیرید:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>classname object_variable;</code></div></div>
<br />
مثال.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>class myclass {<br />
&nbsp;&nbsp; int number;<br />
&nbsp;&nbsp; void greeting(); <br />
};</code></div></div>
<br />
<div style="text-align: center;"><span style="font-weight: bold;">حوزه اعضای کلاس</span></div>
<br />
هر عضو ساختمان یا کلاس می تواند عمومی(public)، خصوصی (private) یا محافظت شده (protected) باشد. به طور پيش فرض تمام اعضای کلاس خصوصی هستند و امکان دسترسی به آنها خارج از کلاس ممکن نیست مگر اینکه توسط حوزه های دسترسی به عنوان عموی یا محافظت شده تعریف شوند.<br />
<br />
حوزه های دسترسی (access modifiers) توسط کلمات زیر مشخص می شوند:<br />
<br />
•	private. اعضايی که به صورت خصوصی مشخص می شوند تنها درون کلاس توسط توابع عضو و توابع دوست قابل دسترسی هستند و نمی توانند خارج از کلاس دسترسی شود. <br />
•	public. اعضای عمومی از هر تابعی حتی خارج از کلاس قابل دستیابی هستند. <br />
•	protected. اعضای محافظت شده نمی توانند بیرون از کلاس دسترسی شوند اما توسط توابع عضو خودش و توابع دوست و از کلاسی که از آن مشتق شده قابل دسترسی هستند.<br />
نکته. در یک ساختمان همه اعضا عمومی هستند مگر اینکه آنرا به عنوان خصوصی یا محافظت شده تعریف کنید.<br />
<br />
مثال. متغير number عضو خصوصی و تابع greeting خضو عمومی کلاس زير هستند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>class myclass {<br />
&nbsp;&nbsp; int number;<br />
public:&nbsp;&nbsp;&nbsp;&nbsp;void greeting(); <br />
};</code></div></div>
<br />
نکته. در یک ساختمان همه اعضا عمومی هستند مگر اینکه آنرا به عنوان خصوصی یا محافظت شده تعریف کنید.<br />
<br />
مثال. در ساختمان A توابع عضو به صورت عمومی تعريف شده اند و فيلدها به صورت خصوصی هستند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>struct A {<br />
private:<br />
&nbsp;&nbsp; int i, j, k;<br />
public:<br />
&nbsp;&nbsp; int f() {return i + j + k;}<br />
&nbsp;&nbsp; void g() {i = j = k = 0;}<br />
};</code></div></div>
<br />
<div style="text-align: center;"><span style="font-weight: bold;">توابع عضو</span></div>
<br />
توابع عضو (member functions) توابعی هستند که درون کلاس تعريف می شوند و متعلق به کلاس هستند. توابع عضو می توانند به کلیه اعضای کلاس (اعم از عمومی، خصوصی و محافظت شده) بدون هیچ محودیتی دسترسی پیدا کنند.<br />
<br />
مثال. تابع greeting تابع عضو کلاس است که به متغير خصوصی عضو number دسترسی دارد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>class myclass {<br />
&nbsp;&nbsp; int number;<br />
public:<br />
&nbsp;&nbsp; void greeting() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i = 0; i&lt;= number;i++) cout &lt;&lt; "Hello World &#92;n";<br />
&nbsp;&nbsp; }<br />
};</code></div></div>
<br />
در مثال فوق کد تابع عضو به صورت درونی (inline) در کلاس قرار داده شده است. توابع درونی درنقطه فراخوانی به صورت خطی گسترش پيدا می کند به جای اينکه واقعا فراخوانی شود. توابع درونی درصورتی که بدنه تابع کوچک باشد روش کارآمدتری هستند. راه ديگر تعريف تابع عضو اين است که بدنه تابع بعد از بلاک کلاس قرار گيرد. سپس برای ارتباط تابع عضو با کلاس قبل از نام تابع نام کلاس بدنبال علامت (::) بايد ذکر شود. :: عملگر حوزه (scope operation) نام دارد و بيان کننده اين است که تابع متعلق به کلاس است.<br />
<br />
مثال. کلاس فوق را به صورت زير نيز می توان نوشت.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>class myclass {<br />
&nbsp;&nbsp; int number;<br />
public:<br />
&nbsp;&nbsp; void greeting();<br />
};<br />
void myclass::greeting(){<br />
&nbsp;&nbsp; for(int i = 0; i&lt;= number;i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "Hello World &#92;n";<br />
}</code></div></div>
<br />
<div style="text-align: center;"><span style="font-weight: bold;">توابع دوست</span></div>
<br />
توابع دوست (friend function) توابعی هستند که عضو کلاس نيستند اما به اعضای خصوصی کلاس دسترسی دارند. برای ايجاد يک تابع دوست در کلاس پروتوتايپ تابع را در بخش عمومی کلاس قرار داده و قبل از آن کلمه friend استفاده کنيد.<br />
<br />
مثال. دربرنامه زير پيغام سه بار نمايش داده می شود. تابع set يک تابع دوست است که برای مقداردهی متغير خصوصی عضو کلاس استفاده شده است.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream&gt;<br />
class myclass {<br />
&nbsp;&nbsp; int number;<br />
public:<br />
&nbsp;&nbsp; void greeting();<br />
&nbsp;&nbsp; friend void set(myclass, int);<br />
};<br />
void myclass::greeting(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i = 0; i&lt;= number;i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "Hello World &#92;n";<br />
}<br />
void set(myclass n, int value){<br />
&nbsp;&nbsp; n.number=value;<br />
}<br />
int main () {<br />
&nbsp;&nbsp; myclass myobject;<br />
&nbsp;&nbsp; set(myobject, 3); <br />
&nbsp;&nbsp; myobject.greeting();<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
<br />
نکته. يک تابع ممکن است دوست بيش از يک کلاس باشد.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">سازنده ها</span></div>
<br />
معمولا بعضی از اعضای کلاس قبل از استفاده نیاز به مقداردهی دارند. اين عمل توسط سازنده (constractor) انجام می گیرد که به شیء اين امکان را می دهد که هنگام ايجاد مقداردهی شود. سازنده تابعی است هم اسم کلاس که وقتی یک نمونه از کلاس گرفته می شود اتوماتیک فراخوانی می شود.<br />
<br />
تابع سازنده می تواند دارای پارامتر باشد بنابراين زمان ايجاد شیء می توان به متغيرهای عضو مقادير اوليه داد. برای ارسال آرگومان به تابع سازنده بايد هنگام تعريف شیء مقدار آرگومان بعد از نام شیء درون پرانتز قرار گيرد.<br />
<br />
یک کلاس می تواند دارای چند سازنده با پارامترهای مختلف باشد. بهتر است همیشه حداقل یک سازنده حتی اگر خالی باشد ساخته شود.<br />
<br />
برای تابع سازنده مقدار برگشتی ذکر نمی شود (حتی viod).<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">مخرب ها</span></div>
<br />
تابع مخرب کلاس (destructor) کم و بیش عکس سازنده عمل می کند. یک مخرب وقتی فراخوانی می شود که یک شی از بین می رود. یک مخرب مشابه سازنده ساخته می شود فقط قبل از اسم آن علامت مد (~)قرار می گیرد. تابع مخرب اتوماتیک وقتی متغیر شیء از حوزه دسترسی خارج می شود (برای متغیرهای سراسری وقتی از تابع اصلی خارج می شود و برای متغیر محلی هنگام خروج از بلاک تابع) فراخوانی می شود.<br />
<br />
مشابه سازنده ها تابع مخرب نيز نوع برگشتی ندارد.<br />
<br />
مثال. توابع myclass در کلاس زير سازنده هستند. تابع ~myclass يک مخرب است که در انتهای تابع اصلی فراخوانی می شود و فايل متن را می بندد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;fstream.h&gt;<br />
#include &lt;iostream.h&gt;<br />
#include &lt;string.h&gt;<br />
class myclass {<br />
private:<br />
&nbsp;&nbsp; char msg[20&#93;;<br />
&nbsp;&nbsp; int loopcounter;<br />
&nbsp;&nbsp; fstream myfile;<br />
public:<br />
&nbsp;&nbsp; void greeting(); <br />
&nbsp;&nbsp; myclass();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Constructor<br />
&nbsp;&nbsp; myclass(char greeting[20&#93;); // Constructor<br />
&nbsp;&nbsp; ~myclass()&nbsp;&nbsp;&nbsp;&nbsp;// Destructor<br />
};<br />
myclass::myclass(){<br />
&nbsp;&nbsp; myfile.open("input.txt",ios::in);<br />
&nbsp;&nbsp; myfile.getline(msg,20);<br />
}<br />
myclass::myclass(char greeting[20&#93;) {<br />
&nbsp;&nbsp; strcpy(msg,greeting);<br />
}<br />
myclass::~myclass(){<br />
&nbsp;&nbsp; myfile.close();<br />
}<br />
void myclass::greeting(){<br />
&nbsp;&nbsp; cout &lt;&lt; msg &lt;&lt; "&#92;n";<br />
}<br />
int main (){<br />
&nbsp;&nbsp; myclass myobject;<br />
&nbsp;&nbsp; myobject.greeting();<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
<br />
در برنامه فوق هنگام ايجاد شیء myobject تابع سازنده فراخوانی شده خطی را از فايل متن خوانده و به متغير عضو تابع اختصاص می دهد. اگر در برنامه اصلی شیء به صورت زير ايجاد شود سازنده دوم فراخوانی می شود و مقدار آرگومان را به متغير msg اختصاص می دهد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>myclass myobject("Howdy from Texas!");</code></div></div>
<br />
اغلب کلاس ها را در فایل های هدر تعریف می کنند. ترکیب کلاس و فایل هدر سطح بالاتری از قابلیت استفاده مجدد کد را فراهم می کند و می توان آن را در هر فایلی که به کلاس نیاز دارید ضمیمه کنید.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">آرايه ای از اشيا</span></div>
<br />
می توان به همان طريقی که آرايه ای از ساير انواع داده ايجاد می شود آرايه ای از اشيا تعريف کرد. اگر کلاس دارای تابع سازنده همراه با پارامتر باشد آرايه ای از اشيا را می توان مقداردهی کرد.<br />
<br />
مثال. myarray آرايه ای از اشيا است که در برنامه اصلی با چهار عدد مقداردهی شده و نمايش داده می شود.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
class display {<br />
&nbsp;&nbsp; int number;<br />
public:<br />
&nbsp;&nbsp; display(int n) {this-&gt;number=n;}<br />
&nbsp;&nbsp; int show() { cout &lt;&lt; this-&gt;number &lt;&lt; endl; }<br />
};<br />
int main() {<br />
&nbsp;&nbsp; display myarray[4&#93; = {1,2,3,4,};<br />
&nbsp;&nbsp; for (int i = 0; i &lt; 4 ;i++ )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myarray[i&#93;.show();<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
هر بار که تابع عضوی فراخوانی می شود به طور خودکار اشاره گری به نام this را به شیئی که آن را فراخوانی کرده است ارسال می کند. اشاره گر this يک پارامتر ضمنی برای تمام توابع عضو است و داخل تابع برای رجوع به شیء فراخواننده می تواند مورد استفاده قرار گيرد.]]></description>
			<content:encoded><![CDATA[مهمترین تفاوت C و C++ اشيا هستند. این فصل مقدمه ای بر تئوری شیءگرائی است. شیءگرائی مفهوم کلاس ها را معرفی می کند که چهار ويژگی کلی را در شیءگرائی نشان می دهند: انتزاع، کپسوله کردن، توارث و چندريختی. تعريف کلاس و اجزای کلاس، نحوه تعريف تابع عضو و تابع دوست، سازنده ها و مخرب ها در اينجا توضيح داده خواهد شد.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">مفاهيم شی گرائی</span></div>
<br />
برنامه نویسی شیءگرائی (object oreinted programming) وسیله ای برای مدل کردن صحیح دنیای واقعی با استفاده از اشیا (objects) در برنامه و استفاده مجدد از کد است. یک شی در برنامه دقیقا همان طور تعريف می شود که در دنيای واقعی است؛ خواص معینی دارد که آن را توصیف می کند و متدهایی که می توانید برای انجام کار معینی روی شیء استفاده کنید.<br />
<br />
هدف کلی C++ اضافه کردن شیءگرائی به زبان برنامه نویسی C است. یک شیء برای نگهداری داده استفاده می شود. داده و توابعی که روی داده کار می کنند به هم مربوط هستند بنابراين داده و توابع هردو با هم دریک بسته قرار می گیرند. شیءگرائی بيشتر روی داده تاکيد دارد تا عمليات و توابعی که روی داده کار می کنند.<br />
<br />
مثال. ماشین یک شی است دارای خواصی مثل رنگ، تعداد درها و غیره است متدهای معینی دارد مانند سرعت گرفتن، ترمز کردن و غیره. می توان این شی را با استفاده از متدهایش استفاده کرد.<br />
<br />
شرحی از داده ها و توابعی که می توانند روی داده کار کنند را کلاس (class) می نامند. کلاس را به عنوان الگوئی برای توليد شیء می توان تصور کرد. کلاس در واقع يک نوع داده user-defined است . اشياء نمونه هائی از کلاس ها هستند که در زمان اجرا ايجاد می شوند.<br />
<br />
چهار مفهوم اصلی وجود دارند که اساس برنامه نویسی شیءگرائی را می سازند و توسط کلاس ها ارائه می شوند. این مفاهیم انتزاع (abstraction)، کپسوله کردن (encapsulation)، توارث (inheritance) و چندریختی (polymorphism) هستند.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">انتزاع</span></div>
<br />
شیء گرائی ابزاری را برای برنامه نویس فراهم می کند که اجزای فضای مسئله را توسط اشيا نمایش دهد. مسئله به بخش های تشکيل دهنده تجزيه می شود. هر مولفه يک شیء می شود که شامل داده های مرتبط و دستورالعمل های خود است. به اين ترتيب مسئله به همان صورتی که در دنيای واقعی هست توصیف می شود نه به روشی کامپیوتری که مسئله را حل می کند. یعنی می توانید با همه چيز در یک ترتیب کلی سروکار داشته باشید. پيچيدگی عمليات کاهش يافته و جزييات پياده سازی مخفی می ماند.<br />
<br />
مثال. درباره خصوصیات کلی وسيله نقليه بدون سروکارداشتن با یک وسيله و مدل خاص می توان بحث کرد. يک نمونه شیء MyVehicle از کلاس Vehicle که خواص کلی و توابع وسايل نقليه را در بر دارد می توان ايجاد کرد. تابع Print مشخصات کلی وسيله نقليه را نمايش می دهد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>Vehicle MyVehicle;<br />
MyVehicle.Print();</code></div></div>
<br />
<div style="text-align: center;"><span style="font-weight: bold;">کپسوله کردن</span></div>
<br />
قرار دادن داده و توابعی که روی داده کار می کنند را در یک بسته کپسوله کردن می گویند. در برنامه نویسی رویه گرا (مشابه آنچه تا کنون انجام می داديد) معلوم نیست چه تابعی روی چه متغیری کار می کند. در برنامه های پیچیده تر این روابط تیره تر می شوند. در برنامه نویسی شیءگرائی داده و توابع مربوط به آن- که اغلب متد (method) ناميده می شوند- با در يک بسته به نام کلاس قرار می گیرند بنابراین کاملا مشخص است چه تابعی روی چه داده ای کار می کند.<br />
<br />
کپسول کردن امکان پنهان کردن اطلاعات را نيز فراهم می کند. هر عضو کلاس را می توان به صورت عمومی، خصوصی یا محافظت شده مشخص کرد. شی ايجاد شده از کلاس به داده از طريق يک سری توابع عمومی دسترسی دارد و اجازه دسترسی مستقيم به اعضای خصوصی کلاس و خراب کردن آنها داده نمی شود. به اين صورت جزئيات پياده سازی هم مخفی می ماند و به طراح اجازه می دهد پياده سازی را اساسی بدون تغيير در واسطه ها عوض کند.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">وراثت</span></div>
<br />
یکی ديگر از جنبه های مفید برنامه نویسی شیءگرائی قابلیت استفاده مجدد از کد است. یک کلاس می تواند اعضای عمومی را از کلاس دیگر را به ارث ببرد. توارث اجازه می دهد کلاس جديدی شامل کليه داده ها و توابع کلاس (های) پياده سازی شود. کلاس موجود را کلاس پايه (base) و کلاس جديد که اعضای کلاس پايه را به ارث می گيرد را کلاس مشتق شده (derived) می نامند.<br />
<br />
مثال. فرض کنيد يک کلاس پايه به نام Vehicle برای وسايل نقليه داريم. وسيله نقليه می تواند ماشين، تراکتور، قايق و هواپيما را شامل شود که ممکن است هر يک از آنها احتياج به اطلاعات يا توابع اضافی داشته باشند. بنابراين می توان برای هر کدام کلاس های فرعی را تعريف کرد که خواص کلاس Vehicle را به ارث می برند علاوه براين که دارای فيلدهای جديد ديگری هم هستند.<br />
<br />
<div style="text-align: center;"><img src="http://hpkclasses.ir/Courses/cpp/cpp1101.JPG" border="0" alt="[تصویر: cpp1101.JPG]" /></div>
<br />
اگر کلاس ويژگی های تنها يک کلاس را به ارث ببرد وارثت منفرد(single inheritance) و اگر از چند کلاس به ارث گرفته شود وارثت چندگانه (multiple inheritance) ناميده می شود.<br />
<br />
ارث از کلاس پایه ممکن است به صورت عمومی، خصوصی یا محافظت شده باشد. این مشخصه های دسترسی تعیین می کنند کلاس های مشتق شده می توانند به اعضای عمومی و محافظت شده کلاس پایه دسترسی پیدا کنند یا خیر. تنها وراثت عمومی است که با مفهوم توارث تطبیق دارد. دو فرم دیگر کمتر استفاده می شوند.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">چندریختی</span></div>
<br />
يک تابع در سلسله مراتب کلاس ها و زير کلاس ها می تواند به طرق مختلف پياده سازی شود و شکل های متعددی بگیرد. چندریختی یک رابط مشترک را برای پیاده سازی های مختلف از يک تابع در اختيار می گذارد که برای اشیا تحت شرایط مختلف متفاوت عمل کند. به عبارت ديگر فراخوانی تابعی که متعلق به کلاس است هميشه به شکل زير خواهد بود.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>object.function(parameter-list)</code></div></div>
<br />
مثال. در مثال قبل تابع نمايش برای قايق ممکن است متفاوت از نمايش يک وسيله نقليه باشد. دو تابع می توانند هم نام باشند ولی با کدهای متفاوت بسته به کلاس شیئی که تابع را فراخوانی می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>Vehicle MyVehicle;<br />
Boat YourBoat;<br />
MyVehicle.Print();<br />
YourBoat.Print();</code></div></div>
<br />
در مثال قبل کامپايلر نوع تابع print را برای دو نوع فراخوانی شده بر اساس نوع شیء می تواند پيدا کند. اما گاهی پيدا کردن آن تا زمان اجرای واقعی برنامه ممکن نيست. مشکل زمانی بروز می کند که به شیء از طريق اشاره گر دسترسی می شود و چون اشاره گرها می توانند بطور پويا به انواع مختلفی از اشيا اشاره کنند کلاس شیء تا زمان اجرا مشخص نمی شود. برای حل اين موضوع توابع عضو مجازی بکار می روند. توابع مجازی عضو (Virtual member functions) اجازه پياده سازی خاص تری از تابعی که فراخوانی می شود را مطابق با نوع شیء زمان اجرا می دهند.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">کلاس</span></div>
<br />
همانطور که قبلا دیدید ساختمان ها نوع داده جدیدی را ایجاد می کنند. کلاس ها به طور مشابه روش قدرتمند تری برای ایجاد يک نوع داده جدید هستند. وقتی یک کلاس تعریف می شود در اصل نوع داده جدیدی ساخته می شود که فيلدها و توابع خود را دارد. کلاس به عنوان قالبی برای تولید شی بکار می رود بنابراين از خود کلاس در برنامه استفاده نمی شود بلکه یک نمونه از آن که شیء ناميده می شود اعلان می شود. فرآیند تولید یک نمونه از کلاس یا ایجاد یک شی از کلاس به این معنا است که یک متغیر از نوع کلاس اعلان شود.<br />
<br />
کلاس مشابه ساختمان تعریف می شود فقط کافی است ابتدای آن کلمه کلیدی class ذکر شود. دقت کنید در انتهای بلاک علامت سمیکولن را فراموش نکنید.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>class classname<br />
{<br />
// members<br />
};</code></div></div>
<br />
وقتی یک کلاس ایجاد می کنید مانند هر متغیر دیگر می توانید یک نمونه از آن را بگیرید:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>classname object_variable;</code></div></div>
<br />
مثال.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>class myclass {<br />
&nbsp;&nbsp; int number;<br />
&nbsp;&nbsp; void greeting(); <br />
};</code></div></div>
<br />
<div style="text-align: center;"><span style="font-weight: bold;">حوزه اعضای کلاس</span></div>
<br />
هر عضو ساختمان یا کلاس می تواند عمومی(public)، خصوصی (private) یا محافظت شده (protected) باشد. به طور پيش فرض تمام اعضای کلاس خصوصی هستند و امکان دسترسی به آنها خارج از کلاس ممکن نیست مگر اینکه توسط حوزه های دسترسی به عنوان عموی یا محافظت شده تعریف شوند.<br />
<br />
حوزه های دسترسی (access modifiers) توسط کلمات زیر مشخص می شوند:<br />
<br />
•	private. اعضايی که به صورت خصوصی مشخص می شوند تنها درون کلاس توسط توابع عضو و توابع دوست قابل دسترسی هستند و نمی توانند خارج از کلاس دسترسی شود. <br />
•	public. اعضای عمومی از هر تابعی حتی خارج از کلاس قابل دستیابی هستند. <br />
•	protected. اعضای محافظت شده نمی توانند بیرون از کلاس دسترسی شوند اما توسط توابع عضو خودش و توابع دوست و از کلاسی که از آن مشتق شده قابل دسترسی هستند.<br />
نکته. در یک ساختمان همه اعضا عمومی هستند مگر اینکه آنرا به عنوان خصوصی یا محافظت شده تعریف کنید.<br />
<br />
مثال. متغير number عضو خصوصی و تابع greeting خضو عمومی کلاس زير هستند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>class myclass {<br />
&nbsp;&nbsp; int number;<br />
public:&nbsp;&nbsp;&nbsp;&nbsp;void greeting(); <br />
};</code></div></div>
<br />
نکته. در یک ساختمان همه اعضا عمومی هستند مگر اینکه آنرا به عنوان خصوصی یا محافظت شده تعریف کنید.<br />
<br />
مثال. در ساختمان A توابع عضو به صورت عمومی تعريف شده اند و فيلدها به صورت خصوصی هستند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>struct A {<br />
private:<br />
&nbsp;&nbsp; int i, j, k;<br />
public:<br />
&nbsp;&nbsp; int f() {return i + j + k;}<br />
&nbsp;&nbsp; void g() {i = j = k = 0;}<br />
};</code></div></div>
<br />
<div style="text-align: center;"><span style="font-weight: bold;">توابع عضو</span></div>
<br />
توابع عضو (member functions) توابعی هستند که درون کلاس تعريف می شوند و متعلق به کلاس هستند. توابع عضو می توانند به کلیه اعضای کلاس (اعم از عمومی، خصوصی و محافظت شده) بدون هیچ محودیتی دسترسی پیدا کنند.<br />
<br />
مثال. تابع greeting تابع عضو کلاس است که به متغير خصوصی عضو number دسترسی دارد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>class myclass {<br />
&nbsp;&nbsp; int number;<br />
public:<br />
&nbsp;&nbsp; void greeting() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i = 0; i&lt;= number;i++) cout &lt;&lt; "Hello World &#92;n";<br />
&nbsp;&nbsp; }<br />
};</code></div></div>
<br />
در مثال فوق کد تابع عضو به صورت درونی (inline) در کلاس قرار داده شده است. توابع درونی درنقطه فراخوانی به صورت خطی گسترش پيدا می کند به جای اينکه واقعا فراخوانی شود. توابع درونی درصورتی که بدنه تابع کوچک باشد روش کارآمدتری هستند. راه ديگر تعريف تابع عضو اين است که بدنه تابع بعد از بلاک کلاس قرار گيرد. سپس برای ارتباط تابع عضو با کلاس قبل از نام تابع نام کلاس بدنبال علامت (::) بايد ذکر شود. :: عملگر حوزه (scope operation) نام دارد و بيان کننده اين است که تابع متعلق به کلاس است.<br />
<br />
مثال. کلاس فوق را به صورت زير نيز می توان نوشت.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>class myclass {<br />
&nbsp;&nbsp; int number;<br />
public:<br />
&nbsp;&nbsp; void greeting();<br />
};<br />
void myclass::greeting(){<br />
&nbsp;&nbsp; for(int i = 0; i&lt;= number;i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "Hello World &#92;n";<br />
}</code></div></div>
<br />
<div style="text-align: center;"><span style="font-weight: bold;">توابع دوست</span></div>
<br />
توابع دوست (friend function) توابعی هستند که عضو کلاس نيستند اما به اعضای خصوصی کلاس دسترسی دارند. برای ايجاد يک تابع دوست در کلاس پروتوتايپ تابع را در بخش عمومی کلاس قرار داده و قبل از آن کلمه friend استفاده کنيد.<br />
<br />
مثال. دربرنامه زير پيغام سه بار نمايش داده می شود. تابع set يک تابع دوست است که برای مقداردهی متغير خصوصی عضو کلاس استفاده شده است.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream&gt;<br />
class myclass {<br />
&nbsp;&nbsp; int number;<br />
public:<br />
&nbsp;&nbsp; void greeting();<br />
&nbsp;&nbsp; friend void set(myclass, int);<br />
};<br />
void myclass::greeting(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i = 0; i&lt;= number;i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "Hello World &#92;n";<br />
}<br />
void set(myclass n, int value){<br />
&nbsp;&nbsp; n.number=value;<br />
}<br />
int main () {<br />
&nbsp;&nbsp; myclass myobject;<br />
&nbsp;&nbsp; set(myobject, 3); <br />
&nbsp;&nbsp; myobject.greeting();<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
<br />
نکته. يک تابع ممکن است دوست بيش از يک کلاس باشد.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">سازنده ها</span></div>
<br />
معمولا بعضی از اعضای کلاس قبل از استفاده نیاز به مقداردهی دارند. اين عمل توسط سازنده (constractor) انجام می گیرد که به شیء اين امکان را می دهد که هنگام ايجاد مقداردهی شود. سازنده تابعی است هم اسم کلاس که وقتی یک نمونه از کلاس گرفته می شود اتوماتیک فراخوانی می شود.<br />
<br />
تابع سازنده می تواند دارای پارامتر باشد بنابراين زمان ايجاد شیء می توان به متغيرهای عضو مقادير اوليه داد. برای ارسال آرگومان به تابع سازنده بايد هنگام تعريف شیء مقدار آرگومان بعد از نام شیء درون پرانتز قرار گيرد.<br />
<br />
یک کلاس می تواند دارای چند سازنده با پارامترهای مختلف باشد. بهتر است همیشه حداقل یک سازنده حتی اگر خالی باشد ساخته شود.<br />
<br />
برای تابع سازنده مقدار برگشتی ذکر نمی شود (حتی viod).<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">مخرب ها</span></div>
<br />
تابع مخرب کلاس (destructor) کم و بیش عکس سازنده عمل می کند. یک مخرب وقتی فراخوانی می شود که یک شی از بین می رود. یک مخرب مشابه سازنده ساخته می شود فقط قبل از اسم آن علامت مد (~)قرار می گیرد. تابع مخرب اتوماتیک وقتی متغیر شیء از حوزه دسترسی خارج می شود (برای متغیرهای سراسری وقتی از تابع اصلی خارج می شود و برای متغیر محلی هنگام خروج از بلاک تابع) فراخوانی می شود.<br />
<br />
مشابه سازنده ها تابع مخرب نيز نوع برگشتی ندارد.<br />
<br />
مثال. توابع myclass در کلاس زير سازنده هستند. تابع ~myclass يک مخرب است که در انتهای تابع اصلی فراخوانی می شود و فايل متن را می بندد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;fstream.h&gt;<br />
#include &lt;iostream.h&gt;<br />
#include &lt;string.h&gt;<br />
class myclass {<br />
private:<br />
&nbsp;&nbsp; char msg[20];<br />
&nbsp;&nbsp; int loopcounter;<br />
&nbsp;&nbsp; fstream myfile;<br />
public:<br />
&nbsp;&nbsp; void greeting(); <br />
&nbsp;&nbsp; myclass();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Constructor<br />
&nbsp;&nbsp; myclass(char greeting[20]); // Constructor<br />
&nbsp;&nbsp; ~myclass()&nbsp;&nbsp;&nbsp;&nbsp;// Destructor<br />
};<br />
myclass::myclass(){<br />
&nbsp;&nbsp; myfile.open("input.txt",ios::in);<br />
&nbsp;&nbsp; myfile.getline(msg,20);<br />
}<br />
myclass::myclass(char greeting[20]) {<br />
&nbsp;&nbsp; strcpy(msg,greeting);<br />
}<br />
myclass::~myclass(){<br />
&nbsp;&nbsp; myfile.close();<br />
}<br />
void myclass::greeting(){<br />
&nbsp;&nbsp; cout &lt;&lt; msg &lt;&lt; "&#92;n";<br />
}<br />
int main (){<br />
&nbsp;&nbsp; myclass myobject;<br />
&nbsp;&nbsp; myobject.greeting();<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
<br />
در برنامه فوق هنگام ايجاد شیء myobject تابع سازنده فراخوانی شده خطی را از فايل متن خوانده و به متغير عضو تابع اختصاص می دهد. اگر در برنامه اصلی شیء به صورت زير ايجاد شود سازنده دوم فراخوانی می شود و مقدار آرگومان را به متغير msg اختصاص می دهد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>myclass myobject("Howdy from Texas!");</code></div></div>
<br />
اغلب کلاس ها را در فایل های هدر تعریف می کنند. ترکیب کلاس و فایل هدر سطح بالاتری از قابلیت استفاده مجدد کد را فراهم می کند و می توان آن را در هر فایلی که به کلاس نیاز دارید ضمیمه کنید.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">آرايه ای از اشيا</span></div>
<br />
می توان به همان طريقی که آرايه ای از ساير انواع داده ايجاد می شود آرايه ای از اشيا تعريف کرد. اگر کلاس دارای تابع سازنده همراه با پارامتر باشد آرايه ای از اشيا را می توان مقداردهی کرد.<br />
<br />
مثال. myarray آرايه ای از اشيا است که در برنامه اصلی با چهار عدد مقداردهی شده و نمايش داده می شود.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
class display {<br />
&nbsp;&nbsp; int number;<br />
public:<br />
&nbsp;&nbsp; display(int n) {this-&gt;number=n;}<br />
&nbsp;&nbsp; int show() { cout &lt;&lt; this-&gt;number &lt;&lt; endl; }<br />
};<br />
int main() {<br />
&nbsp;&nbsp; display myarray[4] = {1,2,3,4,};<br />
&nbsp;&nbsp; for (int i = 0; i &lt; 4 ;i++ )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myarray[i].show();<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
هر بار که تابع عضوی فراخوانی می شود به طور خودکار اشاره گری به نام this را به شیئی که آن را فراخوانی کرده است ارسال می کند. اشاره گر this يک پارامتر ضمنی برای تمام توابع عضو است و داخل تابع برای رجوع به شیء فراخواننده می تواند مورد استفاده قرار گيرد.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[فارسي نويسي]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=278</link>
			<pubDate>Tue, 31 Aug 2010 09:01:05 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=278</guid>
			<description><![CDATA[مي خوام تو وب سايتم فارسي بنويسيم. اين كد را مي ذارم تا فارسي بنويسيم<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;<br />
&lt;meta http-equiv="Content-Language" content="fa"&gt;</code></div></div>
اما وفتي متن فارسي را مي نويسيم به جاي متن علامت سئوال مي ياد.<br />
نمي دانم چرا.<br />
از localhost در easyphp استفاده مي كنم.]]></description>
			<content:encoded><![CDATA[مي خوام تو وب سايتم فارسي بنويسيم. اين كد را مي ذارم تا فارسي بنويسيم<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;<br />
&lt;meta http-equiv="Content-Language" content="fa"&gt;</code></div></div>
اما وفتي متن فارسي را مي نويسيم به جاي متن علامت سئوال مي ياد.<br />
نمي دانم چرا.<br />
از localhost در easyphp استفاده مي كنم.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[theme.rashcms.com]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=277</link>
			<pubDate>Tue, 31 Aug 2010 06:40:23 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=277</guid>
			<description><![CDATA[قبلا سيستم مديريت محتواي راش از داميني داشت به نام theme.rashcms.com و در اين وب سايت هاي قالب هاي مختلف براي سيستم خودش را معرفي مي كرد. نمي دونم چرا يك دفعي تمامي فايل هاي راش پاك شد و يه مشكلاتي پيش آمد و اين سايت هم پاك شد. آيا آدرس ديگري براي اين وب سايت قرار گرفته است. اگر ميشه اين وب سايت را راه اندازي كنيد.ژ]]></description>
			<content:encoded><![CDATA[قبلا سيستم مديريت محتواي راش از داميني داشت به نام theme.rashcms.com و در اين وب سايت هاي قالب هاي مختلف براي سيستم خودش را معرفي مي كرد. نمي دونم چرا يك دفعي تمامي فايل هاي راش پاك شد و يه مشكلاتي پيش آمد و اين سايت هم پاك شد. آيا آدرس ديگري براي اين وب سايت قرار گرفته است. اگر ميشه اين وب سايت را راه اندازي كنيد.ژ]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[فايل ها]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=276</link>
			<pubDate>Mon, 30 Aug 2010 19:36:16 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=276</guid>
			<description><![CDATA[اکثر برنامه ها از فايل به منظورذخيره دائمی داده بر روی ديسک استفاده می کنند. فایل ها در ++C در شکل یک جریان (stream) ورودی/خروجی هستند. در اين بخش انواع فايل ها، نحوه بازکردن و بستن فايل، خواندن و نوشتن توضيح داده خواهد شد.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">فایل مسطح</span></div>
<br />
فایل های پایگاه داده دارای ساختار مشخصی هستند. روابط بین داده ها/ رکوردها و فایل های مختلف به روشنی در پایگاه داده تعریف می شود. برخلاف فايل های پايگاه داده، فایل مسطح (flat) ساختاری ندارد. داده در فايل به سادگی بدون ارتباط با داده های ديگر درون فايل يا فايل های ديگر ذخيره می شود. ممکن است تصور بشود که فایل های رابطه ای به دليل داشتن ساختار معين مناسب تر هستند اما حالت هایی وجود دارد که بهتر است داده در فایل های مسطح ذخيره شود تا پایگاه داده های رابطه ای پیچیده (مانند نوشتن log یا event یا exception ).<br />
<br />
نکته. فایل هائی که در notepad می سازید فایل مسطح هستند.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">جريان ها و فايل</span></div>
<br />
++C کليه عمليات ورودی و خروجی و فايل را به صورت جريانی از بایت ها انجام می دهد. یک جریان (stream) یک دنباله از بایت ها است که هر بایت نشان دهنده یک کاراکتر است. جریان ورودی بایت هایی را از دستگاه ورودی، معمولا صفحه کلید یا یک فایل روی دیسک دریافت می کند. جريان خروجی بايت هائی را به صفحه نمايش، چاپگر يا فايل می فرستد.<br />
<br />
برنامه بايد ارتباطی بين جريان و يک فايل معين روی ديسک برقرار کند. به عبارت ديگر يک جريان مربوط به فايل بايد قبل از استفاده باز شود. بعد از باز کردن فايل می توان اطلاعات را از فايل خواند يا درون فايل نوشت. هر فايل باز شده يک اشاره گر فايل دارد که بر اساس تعداد بايت هائی که از ابتدای فايل خوانده يا نوشته شده است موقعيت درون فايل را مشخص می کند. دسترسی به فايل باعث می شود اين اشاره گر بهنگام شود.<br />
<br />
دو نوع دسترسی به فايل وجود دارد: ترتيبی و تصادفی. در دسترسی ترتيبی (sequential access) داده ها از فايل به ترتيب از ابتدا تا انتها خوانده می شوند. فايل با دسترسی مستقيم يا تصادفی (random access) اجازه می دهد اشاره گر فايل به هر نقطه مورد نظر در فايل پرش کند.<br />
<br />
يک جريان فايل می تواند در دو مد متن (text) يا باينری (binary) باز شود. يک فايل متن شامل مجموعه ای از خطوط است. هر خط شامل مجموعه ای از کاراکترهاست که به کاراکتر انتهای خط (newline) ختم می شود (کاراکترهای با کد اسکی 10 و 13). ماکزيمم طول هر خط 255 کاراکتر است.<br />
<br />
نکته. بخاطر داشته باشيد هر خط يک رشته منتهی به کاراکتر NULL نيست بلکه به کاراکتر انتهای خط ختم می شود.<br />
<br />
فایل های مسطح متنی نوعی فایل ترتیبی هستند. ++C با این فایل ها به صورت دنباله ای از بایت ها برخورد می کند، فایل های ترتیبی ساختار اضافی ندارند هرساختار اضافی باید توسط برنامه تحمیل شود. راهی برای گردش در فایل های ترتيبی وجود ندارد، فايل هميشه بايد از ابتدا شروع شود.<br />
<br />
فايل باينری داده ها را به همان فرمتی که در حافظه اصلی نمايش داده می شوند روی ديسک ذخيره می کند. بنابراين مانند فايل های متن اعداد به کاراکتر تبديل نمی شوند. اگر فايل باينری در يک اديتور متن باز شود اعداد به صورت کاراکترهای نامفهوم نمايش داده می شوند. فايل های باينری از هيچ نشانه ای برای جدا کردن خطوط داده ای استفاده نمی کنند.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">اشيای ifstream و ofstream</span></div>
<br />
در ++C برای کار کردن با فايل از کلاس های ifstream، ofstream و fstream استفاده می شود که در کتابخانه fstream.h تعريف شده اند. اشيای ifstream و ofstream مشابه cin و cout هستند. این اشیا می تواند در برنامه برای نمایش فایل های مسطح و دستکاری آنها بکار رود.<br />
<br />
کلاس ifstream برای فايل های ورودی استفاده می شود. اگر می خواهيد فايلی را به منظور خواندن از آن باز کنيد یک نمونه از این کلاس را مانند زرر ایجاد کنید.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>ifstream fin();</code></div></div>
<br />
برای باز کردن فايلی به منظور نوشتن در آن بايد يک شیء ofstream ايجاد کرد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>ofstream fout();</code></div></div>
<br />
کلاس ifstream شامل گروهی از توابع مورد استفاده روی فايل های ورودی است و کلاس ofstream توابع خروجی در فایل را دارد. عملکرد هردو در fsream ترکیب می شود. متدهای اصلی در جدول زیر نشان داده شده اند.<br />
<br />
<div style="text-align: center;"><img src="http://up.iranblog.com/Files3/0fb99065cb47421fa010.jpg" border="0" alt="[تصویر: 0fb99065cb47421fa010.jpg&#93;" /><br />
</div>
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">نام فايل</span></div>
<br />
هر فايل روی ديسک دارای نامی است که هنگام کار کردن با آن مورد استفاده قرار می گيرد. نام فايل به صورت يک رشته کاراکتری است. قواعد نامگذاری فايل بسته به سيستم عامل دارد. در C++ نام فايل می تواند شامل اطلاعات مسير هم باشد. منظور از مسير دراويو و فولدری است که فايل در آنجا قرار دارد. اگر نام فايل بدون مسير مشخص شود محل فايل در موقعيت جاری درنظر گرفته می شود.<br />
<br />
مثال. فايل test.txt از مسير جاری را به منظور خواندن باز می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>ifstream myfile("test.txt");</code></div></div>
<br />
مثال. اگر فايل در فهرست دیگری باشد باید مسیر فایل کامل ذکر شود.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>ifstream myfile ("c:&#92;&#92;myfolder&#92;&#92;test.txt");</code></div></div>
<br />
در رشته ها کاراکتر \ بیان کننده کاراکتر escape است و دارای معنی خاص است به همين دليل برای جداکردن فولدر ها به جای \ باید از \\ استفاده شود. اگر نام فايل از ورودی دريافت می شود يک علامت \ کافی است.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">بازکردن فايل</span></div>
<br />
فرآيند ارتباط بين جريان با فايل را باز کردن فايل می نامند. هنگامی که فايلی باز می شود برای خواندن و نوشتن آماده است. متد open يک فايل متن يا باينری را باز می کند. بايد یک متغیر از نوع ofstream/ifstream بسته به احتیاج تعریف شود.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>ifstream infile;<br />
ofstream outfile;<br />
fstream myfile;</code></div></div>
<br />
سپس فایل را با استفاده از open باز شود. اسم/مسير فایل و مد مورد نظر را تعيين کنید. مد مشخص می کند فايل ورودی، خروجی یا هردو است.فرم کلی متد به صورت زير است:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>myfile.open(filename, mode)</code></div></div>
<br />
filename رشته ای است که نام خارجی فايل، يعنی نامی که توسط ديسک شناخته شده است، را مشخص می کند. mode مقداری است که توسط ios تعريف می شود و مشخص می کند فايل با چه مدی (متن/باينری) و به چه منظوری (خواندن/نوشتن/ايجاد) باز شود. با استفاده از عملگر | می توان چند مقدار را با هم تلفيق کرد. پيش فرض فايل در مد متن باز می شود.<br />
<br />
مثال. فايل متن myfile.txt را به منظور خواندن باز می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>infile.open("myfile.txt",ios::in);</code></div></div>
<br />
مثال. فايل باينری myfile.txt را به منظور خواندن باز می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>infile.open("myfile.txt",ios::in|ios::binary);</code></div></div>
<br />
مثال. فايل متن myfile.txt را به منظور نوشتن باز می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>outfile.open("myfile.txt",ios::out);</code></div></div>
<br />
مثال. فايل متن myfile.txt را به منظور خواندن باز می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>myfile.open("myfile.txt",ios::in|ios::out);</code></div></div>
<br />
مثال. فايل متن myfile.txt را به منظور اضافه کردن به انتهای آن خواندن باز می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>outfile.open("myfile.txt",ios::app);</code></div></div>
<br />
مثال. فايل متن myfile.txt را پاک می کند و برای نوشتن باز می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>outfile.open("myfile.txt",ios::trunc);</code></div></div>
<br />
تحت شرايطی ممکن است باز کردن فايل با عدم موفقيت روبرو شود نظير: استفاده از نام فايل غير مجاز، موجود نبودن فايل روی ديسک يا مسير ذکر شده، نداشتن اجازه دسترسی و .... اگر بازکردن فايل موفق نباشد تابع مقدار NULL را برمی گرداند که توسط متدهای is_open يا fail بررسی می شود و برنامه بايد پيغام خطای مناسب را با cerr نمايش دهد.<br />
<br />
مثال.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>if (!outfile.is_open()) {<br />
&nbsp;&nbsp; cerr &lt;&lt; "Could not create file." &lt;&lt; endl;<br />
&nbsp;&nbsp; exit(1);<br />
&nbsp;&nbsp; }</code></div></div>
<br />
<div style="text-align: center;"><span style="font-weight: bold;">خواندن و نوشتن فايل</span></div>
<br />
بعد از بازکردن فايل برنامه می تواند داده را از فايل بخواند يا مقداری را در فايل بنويسد. برای فايل های متن عملگرهای &lt;&lt; و &gt;&gt; مشابه cin و cout‌ عمل می کنند و می توانند برای خواندن و نوشتن استفاده شوند.<br />
<br />
تابع getline تابع خوبی است که اجازه می دهد يک خط از فايل متن (که به کاراکتر انتهای خط ختم شده است) را بخوانيد و در يک متغير رشته ای ذخيره کنيد. getline از فايل متن کاراکترها را تا رسيدن به کاراکتر انتهای خط می خواند. اما خود کاراکتر انتهای خط را در رشته ذخيره نمی کند.<br />
<br />
در فايل های باينری متدهای read و write برای خواندن و نوشتن بکار می روند.<br />
<br />
مثال. کپی کردن يک فايل در ديگری.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;string.h&gt;<br />
#include &lt;fstream.h&gt;<br />
int main() {<br />
&nbsp;&nbsp; ifstream in("Scopy.cpp"); // Open for reading<br />
&nbsp;&nbsp; ofstream out("Scopy2.cpp"); // Open for writing<br />
&nbsp;&nbsp; string s;<br />
&nbsp;&nbsp; while(getline(in, s)) // Discards newline char<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out &lt;&lt; s &lt;&lt; "&#92;n"; // ... must add it back<br />
}</code></div></div>
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">تشخيص انتهای فايل</span></div>
<br />
گاهی دقيقا می دانيد طول فايل چند بايت است بنابراين نيازی به تشخيص انتهای فايل نيست. ولی در اکثر مواقع از طول فايل اطلاعاتی نداريد. متد eof() زمانی که به انتهای فايل برسيد مقدار true را بر می گرداند.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">بستن فايل</span></div>
<br />
با ايجاد پيوند بين يک جريان و فايل ديسک اتوماتيک يک بافر ايجاد و به جريان مرتبط می شود. بافر بلاکی از حافظه است که به عنوان واسطه ای بين جريان و سخت افزار ديسک عمل می کند و برای ذخيره موقت داده هائی که از فايل خوانده يا نوشته می شوند بکار می رود. چون ديسک درايو به صورت بلاکی کار می کند، داده ابتدا در بافر ذخيره می شود تا بافر پر شود سپس کل بافر به صورت يک بلاک روی ديسک ذخيره می شود. همين فرآيند زمان خواندن داده از ديسک هم اتفاق می افتد.<br />
<br />
در طی اجرای برنامه داده هائی که برنامه روی فايل می نويسد ممکن است در بافر باقی بماند. اگر برنامه بدون بستن فايل خاتمه پيدا کند داده از بافر به درون فايل منتقل نمی شود و اطلاعات از دست می رود. بنابراين بعد از اينکه کارتان با فايل تمام شد بايد آنرا ببنديد. درصورت نياز مجددا فايل را باز کنيد.<br />
<br />
متد close() فايل را می بندد. اين متد کل جريان های بافر شده را به فايل منتقل می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>myfile.close();</code></div></div>
<br />
اگر برنامه دچار شکست شود داده ممکن است داده موجود در بافر از دست برود. برای جلوگيری از اين کار در صورت نياز با استفاده از متد flush() می توانيد محتويات بافر را بدون بستن فايل به فايل منتقل کنيد.<br />
<br />
مثال. يک فايل ممکن است در برنامه به منظور خواندن و نوشتن چندبار باز و بسته شود.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;fstream.h&gt;<br />
#include &lt;iostream.h&gt;<br />
int main () {<br />
&nbsp;&nbsp; char buffer[256&#93;;<br />
&nbsp;&nbsp; fstream myfile; // open it for output then write to it<br />
&nbsp;&nbsp; myfile.open("test2.txt",ios::out | ios::trunc);<br />
&nbsp;&nbsp; if (myfile.is_open()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfile &lt;&lt; "This outputting a line.&#92;n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfile.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; myfile.open("test.txt",ios::in); // open it for input and read in<br />
&nbsp;&nbsp; myfile.getline(buffer,100);<br />
&nbsp;&nbsp; cout &lt;&lt; "The file contains " &lt;&lt; buffer &lt;&lt; "&#92;n";<br />
&nbsp;&nbsp; myfile.close();<br />
&nbsp;&nbsp; myfile.open("test.txt",ios::app); //open for appending and append<br />
&nbsp;&nbsp; myfile &lt;&lt; " Hey this is another line &#92;n";<br />
&nbsp;&nbsp; myfile.close();<br />
&nbsp;&nbsp; myfile.open("test.txt",ios::in); // open it for input and read in<br />
&nbsp;&nbsp; myfile.getline(buffer,200);<br />
&nbsp;&nbsp; cout &lt;&lt; "The file contains " &lt;&lt; buffer &lt;&lt; "&#92;n";<br />
&nbsp;&nbsp; myfile.close();<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
<br />
نکته. مديريت بافر با سيستم عامل است.<br />
نکته. قبل از خواندن يا نوشتن فايل آن را باز کنيد.<br />
نکته. هميشه بعد از بازکردن فايل چک کنيد فايل بطور موفق باز شده است يا خير.<br />
نکته. موقعيت خود را درون فايل چک کنيد تا از انتهای فايل عبور نکنيد.<br />
نکته. در انتها حتما فايل را ببنديد.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">فایل های متنی</span></div>
<br />
فايل های متنی مورد استفاده بسياری دارند. يک فايل متنی (text file) جريانی از کاراکترهاست که دارای کاراکتر(های) خاصی برای نشانه گذاری انتهای هر خط است. فايل های متنی را با هر اديتورمتنی می توان توليد کرد يا محتويات آن را مشاهده کرد.<br />
<br />
مثال. ايجاد يک فايل متنی با نام test.txt.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;fstream.h&gt;<br />
int main() {<br />
&nbsp;&nbsp; ofstream myfile ("test.txt");<br />
&nbsp;&nbsp; if (myfile.is_open()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfile &lt;&lt; "This outputting a line.&#92;n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfile &lt;&lt; "Guess what, this is another line.&#92;n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfile.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
<br />
مثال. خواندن فايل متنی test.txt و نمايش آن روی صفحه.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;fstream.h&gt;<br />
#include &lt;iostream.h&gt;<br />
int main (){<br />
&nbsp;&nbsp; char buffer[256&#93;;<br />
&nbsp;&nbsp; ifstream myfile ("test.txt");<br />
&nbsp;&nbsp; while (! myfile.eof() ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfile.getline (buffer,100);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; buffer &lt;&lt; endl;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
<br />
در فايل های متنی می توانيم اعداد را هم ذخيره کنيم. اعداد به صورت متن ذخيره می شوند. برای مثال عدد 236 به صورت کاراکتر'2' ، کاراکتر '3' و کاراکتر '6' ذخيره می شود. اين تبديل زمان اضافه می برد اما فايل حاصل قابل خواندن است.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">فایل های باینری</span></div>
<br />
فایل های باینری هم نوعی فايل مسطح هستند که در حالت دودوئی ذخیره می شوند. در حالت باینری هر فایل یک فرمت بایت به بایت دارد که باعث می شود فايل در ادیتور اسکی خوانا نباشد و کاراکترهای عجیبی نشان داده شود.<br />
<br />
تابع write برای نوشتن داده در فايل باينری استفاده می شود. تابع دارای دو پارامتر است. اولی آدرس جائی که داده بايد نوشته شود و دومی تعداد بايت های داده است که نوشته می شود. تابع read برای خواندن از فايل باينری است.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">دسترسی تصادفی فايل</span></div>
<br />
هر فايل بازی يک انديکاتور موقعيت دارد که تعيين می کند عمل خواندن/نوشتن در کدام محل فايل انجام می شود. موقعيت هميشه برمبنای تعداد بايت ها از ابتدای فايل داده می شود. اگر فايل موجودی در مد اضافه کردن باز شود انديکاتور در انتهای فايل است در بقيه مدها انديکاتور در ابتدای فايل است و برابر صفر است.<br />
<br />
توابع خواندن/نوشتن روی فايل که در محل انديکاتور انجام می شود باعث تغيير موقعيت آن می شود. مثلا اگر فايلی باز شود و 10 بايت از آن خوانده شود انديکاتور روی موقعيت 10 فايل قرار می گيرد. عمل بعدی روی موقعيت 10 انجام می گيرد.<br />
<br />
C++ توابعی را در اختيار می گذارد (s<img src="http://www.forum.educator.ir/images/smilies/eek.gif" style="vertical-align: middle;" border="0" alt="eek" title="eek" />p و s<img src="http://www.forum.educator.ir/images/smilies/eek.gif" style="vertical-align: middle;" border="0" alt="eek" title="eek" />g) که امکان کنترل انديکاتور و دسترسی تصادفی به فايل را می دهند. يعنی می توانيد به هر نقطه ای درون فايل مراجعه کنيد بدون اينکه مجبور باشيد فايل را از ابتدا بخوانيد يا بنويسيد.<br />
<br />
مثال. نمايش اندازه يک فايل.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;fstream.h&gt;<br />
#include &lt;iostream.h&gt;<br />
int main () {<br />
&nbsp;&nbsp; long start,end;<br />
&nbsp;&nbsp; ifstream myfile (“test.txt”, ios::in|ios::binary);<br />
&nbsp;&nbsp; start = myfile.tellg();<br />
&nbsp;&nbsp; myfile.seekg (0, ios::end);<br />
&nbsp;&nbsp; end = myfile.tellg();<br />
&nbsp;&nbsp; myfile.close();<br />
&nbsp;&nbsp; cout &lt;&lt; "size of " &lt;&lt; “test.txt”;<br />
&nbsp;&nbsp; cout &lt;&lt; " is " &lt;&lt; (end-start) &lt;&lt; " bytes.&#92;n";<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
]]></description>
			<content:encoded><![CDATA[اکثر برنامه ها از فايل به منظورذخيره دائمی داده بر روی ديسک استفاده می کنند. فایل ها در ++C در شکل یک جریان (stream) ورودی/خروجی هستند. در اين بخش انواع فايل ها، نحوه بازکردن و بستن فايل، خواندن و نوشتن توضيح داده خواهد شد.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">فایل مسطح</span></div>
<br />
فایل های پایگاه داده دارای ساختار مشخصی هستند. روابط بین داده ها/ رکوردها و فایل های مختلف به روشنی در پایگاه داده تعریف می شود. برخلاف فايل های پايگاه داده، فایل مسطح (flat) ساختاری ندارد. داده در فايل به سادگی بدون ارتباط با داده های ديگر درون فايل يا فايل های ديگر ذخيره می شود. ممکن است تصور بشود که فایل های رابطه ای به دليل داشتن ساختار معين مناسب تر هستند اما حالت هایی وجود دارد که بهتر است داده در فایل های مسطح ذخيره شود تا پایگاه داده های رابطه ای پیچیده (مانند نوشتن log یا event یا exception ).<br />
<br />
نکته. فایل هائی که در notepad می سازید فایل مسطح هستند.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">جريان ها و فايل</span></div>
<br />
++C کليه عمليات ورودی و خروجی و فايل را به صورت جريانی از بایت ها انجام می دهد. یک جریان (stream) یک دنباله از بایت ها است که هر بایت نشان دهنده یک کاراکتر است. جریان ورودی بایت هایی را از دستگاه ورودی، معمولا صفحه کلید یا یک فایل روی دیسک دریافت می کند. جريان خروجی بايت هائی را به صفحه نمايش، چاپگر يا فايل می فرستد.<br />
<br />
برنامه بايد ارتباطی بين جريان و يک فايل معين روی ديسک برقرار کند. به عبارت ديگر يک جريان مربوط به فايل بايد قبل از استفاده باز شود. بعد از باز کردن فايل می توان اطلاعات را از فايل خواند يا درون فايل نوشت. هر فايل باز شده يک اشاره گر فايل دارد که بر اساس تعداد بايت هائی که از ابتدای فايل خوانده يا نوشته شده است موقعيت درون فايل را مشخص می کند. دسترسی به فايل باعث می شود اين اشاره گر بهنگام شود.<br />
<br />
دو نوع دسترسی به فايل وجود دارد: ترتيبی و تصادفی. در دسترسی ترتيبی (sequential access) داده ها از فايل به ترتيب از ابتدا تا انتها خوانده می شوند. فايل با دسترسی مستقيم يا تصادفی (random access) اجازه می دهد اشاره گر فايل به هر نقطه مورد نظر در فايل پرش کند.<br />
<br />
يک جريان فايل می تواند در دو مد متن (text) يا باينری (binary) باز شود. يک فايل متن شامل مجموعه ای از خطوط است. هر خط شامل مجموعه ای از کاراکترهاست که به کاراکتر انتهای خط (newline) ختم می شود (کاراکترهای با کد اسکی 10 و 13). ماکزيمم طول هر خط 255 کاراکتر است.<br />
<br />
نکته. بخاطر داشته باشيد هر خط يک رشته منتهی به کاراکتر NULL نيست بلکه به کاراکتر انتهای خط ختم می شود.<br />
<br />
فایل های مسطح متنی نوعی فایل ترتیبی هستند. ++C با این فایل ها به صورت دنباله ای از بایت ها برخورد می کند، فایل های ترتیبی ساختار اضافی ندارند هرساختار اضافی باید توسط برنامه تحمیل شود. راهی برای گردش در فایل های ترتيبی وجود ندارد، فايل هميشه بايد از ابتدا شروع شود.<br />
<br />
فايل باينری داده ها را به همان فرمتی که در حافظه اصلی نمايش داده می شوند روی ديسک ذخيره می کند. بنابراين مانند فايل های متن اعداد به کاراکتر تبديل نمی شوند. اگر فايل باينری در يک اديتور متن باز شود اعداد به صورت کاراکترهای نامفهوم نمايش داده می شوند. فايل های باينری از هيچ نشانه ای برای جدا کردن خطوط داده ای استفاده نمی کنند.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">اشيای ifstream و ofstream</span></div>
<br />
در ++C برای کار کردن با فايل از کلاس های ifstream، ofstream و fstream استفاده می شود که در کتابخانه fstream.h تعريف شده اند. اشيای ifstream و ofstream مشابه cin و cout هستند. این اشیا می تواند در برنامه برای نمایش فایل های مسطح و دستکاری آنها بکار رود.<br />
<br />
کلاس ifstream برای فايل های ورودی استفاده می شود. اگر می خواهيد فايلی را به منظور خواندن از آن باز کنيد یک نمونه از این کلاس را مانند زرر ایجاد کنید.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>ifstream fin();</code></div></div>
<br />
برای باز کردن فايلی به منظور نوشتن در آن بايد يک شیء ofstream ايجاد کرد.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>ofstream fout();</code></div></div>
<br />
کلاس ifstream شامل گروهی از توابع مورد استفاده روی فايل های ورودی است و کلاس ofstream توابع خروجی در فایل را دارد. عملکرد هردو در fsream ترکیب می شود. متدهای اصلی در جدول زیر نشان داده شده اند.<br />
<br />
<div style="text-align: center;"><img src="http://up.iranblog.com/Files3/0fb99065cb47421fa010.jpg" border="0" alt="[تصویر: 0fb99065cb47421fa010.jpg]" /><br />
</div>
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">نام فايل</span></div>
<br />
هر فايل روی ديسک دارای نامی است که هنگام کار کردن با آن مورد استفاده قرار می گيرد. نام فايل به صورت يک رشته کاراکتری است. قواعد نامگذاری فايل بسته به سيستم عامل دارد. در C++ نام فايل می تواند شامل اطلاعات مسير هم باشد. منظور از مسير دراويو و فولدری است که فايل در آنجا قرار دارد. اگر نام فايل بدون مسير مشخص شود محل فايل در موقعيت جاری درنظر گرفته می شود.<br />
<br />
مثال. فايل test.txt از مسير جاری را به منظور خواندن باز می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>ifstream myfile("test.txt");</code></div></div>
<br />
مثال. اگر فايل در فهرست دیگری باشد باید مسیر فایل کامل ذکر شود.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>ifstream myfile ("c:&#92;&#92;myfolder&#92;&#92;test.txt");</code></div></div>
<br />
در رشته ها کاراکتر \ بیان کننده کاراکتر escape است و دارای معنی خاص است به همين دليل برای جداکردن فولدر ها به جای \ باید از \\ استفاده شود. اگر نام فايل از ورودی دريافت می شود يک علامت \ کافی است.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">بازکردن فايل</span></div>
<br />
فرآيند ارتباط بين جريان با فايل را باز کردن فايل می نامند. هنگامی که فايلی باز می شود برای خواندن و نوشتن آماده است. متد open يک فايل متن يا باينری را باز می کند. بايد یک متغیر از نوع ofstream/ifstream بسته به احتیاج تعریف شود.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>ifstream infile;<br />
ofstream outfile;<br />
fstream myfile;</code></div></div>
<br />
سپس فایل را با استفاده از open باز شود. اسم/مسير فایل و مد مورد نظر را تعيين کنید. مد مشخص می کند فايل ورودی، خروجی یا هردو است.فرم کلی متد به صورت زير است:<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>myfile.open(filename, mode)</code></div></div>
<br />
filename رشته ای است که نام خارجی فايل، يعنی نامی که توسط ديسک شناخته شده است، را مشخص می کند. mode مقداری است که توسط ios تعريف می شود و مشخص می کند فايل با چه مدی (متن/باينری) و به چه منظوری (خواندن/نوشتن/ايجاد) باز شود. با استفاده از عملگر | می توان چند مقدار را با هم تلفيق کرد. پيش فرض فايل در مد متن باز می شود.<br />
<br />
مثال. فايل متن myfile.txt را به منظور خواندن باز می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>infile.open("myfile.txt",ios::in);</code></div></div>
<br />
مثال. فايل باينری myfile.txt را به منظور خواندن باز می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>infile.open("myfile.txt",ios::in|ios::binary);</code></div></div>
<br />
مثال. فايل متن myfile.txt را به منظور نوشتن باز می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>outfile.open("myfile.txt",ios::out);</code></div></div>
<br />
مثال. فايل متن myfile.txt را به منظور خواندن باز می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>myfile.open("myfile.txt",ios::in|ios::out);</code></div></div>
<br />
مثال. فايل متن myfile.txt را به منظور اضافه کردن به انتهای آن خواندن باز می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>outfile.open("myfile.txt",ios::app);</code></div></div>
<br />
مثال. فايل متن myfile.txt را پاک می کند و برای نوشتن باز می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>outfile.open("myfile.txt",ios::trunc);</code></div></div>
<br />
تحت شرايطی ممکن است باز کردن فايل با عدم موفقيت روبرو شود نظير: استفاده از نام فايل غير مجاز، موجود نبودن فايل روی ديسک يا مسير ذکر شده، نداشتن اجازه دسترسی و .... اگر بازکردن فايل موفق نباشد تابع مقدار NULL را برمی گرداند که توسط متدهای is_open يا fail بررسی می شود و برنامه بايد پيغام خطای مناسب را با cerr نمايش دهد.<br />
<br />
مثال.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>if (!outfile.is_open()) {<br />
&nbsp;&nbsp; cerr &lt;&lt; "Could not create file." &lt;&lt; endl;<br />
&nbsp;&nbsp; exit(1);<br />
&nbsp;&nbsp; }</code></div></div>
<br />
<div style="text-align: center;"><span style="font-weight: bold;">خواندن و نوشتن فايل</span></div>
<br />
بعد از بازکردن فايل برنامه می تواند داده را از فايل بخواند يا مقداری را در فايل بنويسد. برای فايل های متن عملگرهای &lt;&lt; و &gt;&gt; مشابه cin و cout‌ عمل می کنند و می توانند برای خواندن و نوشتن استفاده شوند.<br />
<br />
تابع getline تابع خوبی است که اجازه می دهد يک خط از فايل متن (که به کاراکتر انتهای خط ختم شده است) را بخوانيد و در يک متغير رشته ای ذخيره کنيد. getline از فايل متن کاراکترها را تا رسيدن به کاراکتر انتهای خط می خواند. اما خود کاراکتر انتهای خط را در رشته ذخيره نمی کند.<br />
<br />
در فايل های باينری متدهای read و write برای خواندن و نوشتن بکار می روند.<br />
<br />
مثال. کپی کردن يک فايل در ديگری.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;string.h&gt;<br />
#include &lt;fstream.h&gt;<br />
int main() {<br />
&nbsp;&nbsp; ifstream in("Scopy.cpp"); // Open for reading<br />
&nbsp;&nbsp; ofstream out("Scopy2.cpp"); // Open for writing<br />
&nbsp;&nbsp; string s;<br />
&nbsp;&nbsp; while(getline(in, s)) // Discards newline char<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out &lt;&lt; s &lt;&lt; "&#92;n"; // ... must add it back<br />
}</code></div></div>
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">تشخيص انتهای فايل</span></div>
<br />
گاهی دقيقا می دانيد طول فايل چند بايت است بنابراين نيازی به تشخيص انتهای فايل نيست. ولی در اکثر مواقع از طول فايل اطلاعاتی نداريد. متد eof() زمانی که به انتهای فايل برسيد مقدار true را بر می گرداند.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">بستن فايل</span></div>
<br />
با ايجاد پيوند بين يک جريان و فايل ديسک اتوماتيک يک بافر ايجاد و به جريان مرتبط می شود. بافر بلاکی از حافظه است که به عنوان واسطه ای بين جريان و سخت افزار ديسک عمل می کند و برای ذخيره موقت داده هائی که از فايل خوانده يا نوشته می شوند بکار می رود. چون ديسک درايو به صورت بلاکی کار می کند، داده ابتدا در بافر ذخيره می شود تا بافر پر شود سپس کل بافر به صورت يک بلاک روی ديسک ذخيره می شود. همين فرآيند زمان خواندن داده از ديسک هم اتفاق می افتد.<br />
<br />
در طی اجرای برنامه داده هائی که برنامه روی فايل می نويسد ممکن است در بافر باقی بماند. اگر برنامه بدون بستن فايل خاتمه پيدا کند داده از بافر به درون فايل منتقل نمی شود و اطلاعات از دست می رود. بنابراين بعد از اينکه کارتان با فايل تمام شد بايد آنرا ببنديد. درصورت نياز مجددا فايل را باز کنيد.<br />
<br />
متد close() فايل را می بندد. اين متد کل جريان های بافر شده را به فايل منتقل می کند.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>myfile.close();</code></div></div>
<br />
اگر برنامه دچار شکست شود داده ممکن است داده موجود در بافر از دست برود. برای جلوگيری از اين کار در صورت نياز با استفاده از متد flush() می توانيد محتويات بافر را بدون بستن فايل به فايل منتقل کنيد.<br />
<br />
مثال. يک فايل ممکن است در برنامه به منظور خواندن و نوشتن چندبار باز و بسته شود.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;fstream.h&gt;<br />
#include &lt;iostream.h&gt;<br />
int main () {<br />
&nbsp;&nbsp; char buffer[256];<br />
&nbsp;&nbsp; fstream myfile; // open it for output then write to it<br />
&nbsp;&nbsp; myfile.open("test2.txt",ios::out | ios::trunc);<br />
&nbsp;&nbsp; if (myfile.is_open()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfile &lt;&lt; "This outputting a line.&#92;n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfile.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; myfile.open("test.txt",ios::in); // open it for input and read in<br />
&nbsp;&nbsp; myfile.getline(buffer,100);<br />
&nbsp;&nbsp; cout &lt;&lt; "The file contains " &lt;&lt; buffer &lt;&lt; "&#92;n";<br />
&nbsp;&nbsp; myfile.close();<br />
&nbsp;&nbsp; myfile.open("test.txt",ios::app); //open for appending and append<br />
&nbsp;&nbsp; myfile &lt;&lt; " Hey this is another line &#92;n";<br />
&nbsp;&nbsp; myfile.close();<br />
&nbsp;&nbsp; myfile.open("test.txt",ios::in); // open it for input and read in<br />
&nbsp;&nbsp; myfile.getline(buffer,200);<br />
&nbsp;&nbsp; cout &lt;&lt; "The file contains " &lt;&lt; buffer &lt;&lt; "&#92;n";<br />
&nbsp;&nbsp; myfile.close();<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
<br />
نکته. مديريت بافر با سيستم عامل است.<br />
نکته. قبل از خواندن يا نوشتن فايل آن را باز کنيد.<br />
نکته. هميشه بعد از بازکردن فايل چک کنيد فايل بطور موفق باز شده است يا خير.<br />
نکته. موقعيت خود را درون فايل چک کنيد تا از انتهای فايل عبور نکنيد.<br />
نکته. در انتها حتما فايل را ببنديد.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">فایل های متنی</span></div>
<br />
فايل های متنی مورد استفاده بسياری دارند. يک فايل متنی (text file) جريانی از کاراکترهاست که دارای کاراکتر(های) خاصی برای نشانه گذاری انتهای هر خط است. فايل های متنی را با هر اديتورمتنی می توان توليد کرد يا محتويات آن را مشاهده کرد.<br />
<br />
مثال. ايجاد يک فايل متنی با نام test.txt.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;fstream.h&gt;<br />
int main() {<br />
&nbsp;&nbsp; ofstream myfile ("test.txt");<br />
&nbsp;&nbsp; if (myfile.is_open()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfile &lt;&lt; "This outputting a line.&#92;n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfile &lt;&lt; "Guess what, this is another line.&#92;n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfile.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
<br />
مثال. خواندن فايل متنی test.txt و نمايش آن روی صفحه.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;fstream.h&gt;<br />
#include &lt;iostream.h&gt;<br />
int main (){<br />
&nbsp;&nbsp; char buffer[256];<br />
&nbsp;&nbsp; ifstream myfile ("test.txt");<br />
&nbsp;&nbsp; while (! myfile.eof() ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfile.getline (buffer,100);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; buffer &lt;&lt; endl;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
<br />
در فايل های متنی می توانيم اعداد را هم ذخيره کنيم. اعداد به صورت متن ذخيره می شوند. برای مثال عدد 236 به صورت کاراکتر'2' ، کاراکتر '3' و کاراکتر '6' ذخيره می شود. اين تبديل زمان اضافه می برد اما فايل حاصل قابل خواندن است.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">فایل های باینری</span></div>
<br />
فایل های باینری هم نوعی فايل مسطح هستند که در حالت دودوئی ذخیره می شوند. در حالت باینری هر فایل یک فرمت بایت به بایت دارد که باعث می شود فايل در ادیتور اسکی خوانا نباشد و کاراکترهای عجیبی نشان داده شود.<br />
<br />
تابع write برای نوشتن داده در فايل باينری استفاده می شود. تابع دارای دو پارامتر است. اولی آدرس جائی که داده بايد نوشته شود و دومی تعداد بايت های داده است که نوشته می شود. تابع read برای خواندن از فايل باينری است.<br />
<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">دسترسی تصادفی فايل</span></div>
<br />
هر فايل بازی يک انديکاتور موقعيت دارد که تعيين می کند عمل خواندن/نوشتن در کدام محل فايل انجام می شود. موقعيت هميشه برمبنای تعداد بايت ها از ابتدای فايل داده می شود. اگر فايل موجودی در مد اضافه کردن باز شود انديکاتور در انتهای فايل است در بقيه مدها انديکاتور در ابتدای فايل است و برابر صفر است.<br />
<br />
توابع خواندن/نوشتن روی فايل که در محل انديکاتور انجام می شود باعث تغيير موقعيت آن می شود. مثلا اگر فايلی باز شود و 10 بايت از آن خوانده شود انديکاتور روی موقعيت 10 فايل قرار می گيرد. عمل بعدی روی موقعيت 10 انجام می گيرد.<br />
<br />
C++ توابعی را در اختيار می گذارد (s<img src="http://www.forum.educator.ir/images/smilies/eek.gif" style="vertical-align: middle;" border="0" alt="eek" title="eek" />p و s<img src="http://www.forum.educator.ir/images/smilies/eek.gif" style="vertical-align: middle;" border="0" alt="eek" title="eek" />g) که امکان کنترل انديکاتور و دسترسی تصادفی به فايل را می دهند. يعنی می توانيد به هر نقطه ای درون فايل مراجعه کنيد بدون اينکه مجبور باشيد فايل را از ابتدا بخوانيد يا بنويسيد.<br />
<br />
مثال. نمايش اندازه يک فايل.<br />
<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;fstream.h&gt;<br />
#include &lt;iostream.h&gt;<br />
int main () {<br />
&nbsp;&nbsp; long start,end;<br />
&nbsp;&nbsp; ifstream myfile (“test.txt”, ios::in|ios::binary);<br />
&nbsp;&nbsp; start = myfile.tellg();<br />
&nbsp;&nbsp; myfile.seekg (0, ios::end);<br />
&nbsp;&nbsp; end = myfile.tellg();<br />
&nbsp;&nbsp; myfile.close();<br />
&nbsp;&nbsp; cout &lt;&lt; "size of " &lt;&lt; “test.txt”;<br />
&nbsp;&nbsp; cout &lt;&lt; " is " &lt;&lt; (end-start) &lt;&lt; " bytes.&#92;n";<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[استثناها و خطاها]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=275</link>
			<pubDate>Mon, 30 Aug 2010 19:22:05 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=275</guid>
			<description><![CDATA[استثناها خطاهای درحال اجرا هستند. به طور معمول خطاها توسط دستور if تشخيص و در صورت برقرار بودن شرط عمل مناسب، که اغلب نمايش پيغام و اتمام برنامه بود، انجام می گرفت. راه ديگر هنگام مواجه شدن با خطا گير انداختن آن هنگام پيش آمدن شرايط خطاست. کدی که ممکن است باعث خطا شود اجرا می شود و هر خطائی که ايجاد می شود گرفته می شود و عمل مناسب انجام می گيرد. بلاک های try-catch بر اساس اين مفهوم عمل می کنند. مديريت خطاها به طور سطحی در اينجا معرفی می شود.<br />
<br />
مديريت خطاها از موضوعات مهم در برنامه نویسی است. حالات متعددی وجود دارند که ممکن است ایجاد خطا کند. مثلا باز کردن فایلی که وجود ندارد یا دريافت ورودی نادرست از کاربر. کنترل این خطاها هنگام اجرای برنامه اهمیت زیادی دارد. اگر برنامه این گونه خطاها را در دست نگیرد برنامه سقط می کند و نارضايتی کاربر را باعث می شود. روش قديمی بررسی خطا توسط if و دادن یک پیغام دوستانه به کاربر و اتمام برنامه بود. C++ راه ديگری را توسط بلاک های try-catch برای مديريت خطاهای در حال اجرا در اختيار مي گذارد.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">خطاها</span></div>
<br />
<span style="font-weight: bold;">خطاها را به سه دسته می توان تقسیم کرد:</span><br />
<br />
    • خطاهای گرامری (syntax error). خطاهائی که با رعايت نکردن قواعد زبان برنامه نويسی توسط کامپايلر تشخيص داده می شوند. مثلا بجای if(x!=y) بنویسید if(x&lt;&gt;y). کامپایلر کد برنامه را تا وقتی خطای گرامری وجود دارد کامپایل نمی کند.<br />
    • خطاهای زمان اجرا (runtime error). هر وقفه ای که در جریان عادی اجرای برنامه پیش آید که معمولا باعث سقط برنامه می شود. مثلا باز کردن فایلی که وجود ندارد یا تقسیم بر صفر. این خطاها استثنا (exception) نامیده می شوند.<br />
    • خطاهای منطقی (login error). وقتی برنامه کامپایل و اجرا می شود اما به دليل خطائی در منطق برنامه نتایج غلطی تولید می کند. سخت ترین نوع خطا است که معمولا به آن bug هم گفته می شود.<br />
<br />
برای رفع خطا ابتدائی ترین کاری که می شود کرد تست کلیه برنامه و کشف و برطرف سازی خطا است. کنترل مناسب خطاها از سقط برنامه جلوگيری می کند. کامپایلر خطاهای گرامری را مشخص می کند. مديريت استثناها خطاهای زمان اجرا را بر عهده دارند بنابراين خطاهای منطقی بزرگترین مشکل برنامه نویس خواهد بود.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">مديريت استثناها</span></div>
<br />
قبل از اينکه سيستم مديريت استثناها معرفی شود برنامه های کامپيوتری کاملا بدون خطا نبودند. البته برای گرفتن خطاها روش هائی وجود داشت که معمول ترين آن بررسی مقداری بود که توسط توابع برگردانده می شد و نحوه اجرای آن را بيان می کرد. کدی که تابع را فراخوانی می کرد مقدار بر گشتی را چک می کرد و مطابق با آن عمل می کرد (اگر با استفاده از Windows API برنامه نوشته باشيد با اين روش آشنا هستيد).<br />
<br />
مفهوم کلی مديريت استثناها ساده است. هر زمان که استثنائی شناسائی می شود يک فلگ فرضی خطا بالا می رود. سيستمی همواره مراقب اين فلگ خطاست. و درصورت بالا رفتن فلگ کد مديريت خطا فراخوانی می شود. بالا رفتن فلگ خطا را اصطلاحا گير انداختن (throwing) خطا می نامند. وقتی خطائی به دام انداخته می شود سيستم با گرفتن خطا (catching) عکس العمل نشان می دهد. محاصره کردن بلاکی از کد حساس به خطا و مديريت استثنا را سعی کردن (trying) به اجرای بلاک می نامند.<br />
<br />
دلايل خوبی برای استفاده از مديريت استثناها وجود دارد. مهمترين آن جداکردن کد مديريت خطا از کد برنامه است. وقتی استثنائی گرفته می شود مسيری موازی اجرا طی می شود و با اجرای نرمال کد برنامه تداخلی ندارد. اين باعث می شود نوشتن کد ساده تر شود چون مجبور نيستيد برای هر خطائی چک داشته باشيد. علاوه بر اين يک استثنا نمی تواند نديده گرفته شود و تضمين می کند که با خطا برخورد کند. و چون جلوی سقط ناخواسته برنامه را می گيرد اتکاپذيری برنامه را بالا می برد.<br />
<br />
از مزايای ديگر مديريت استثناها اين است که خطا می تواند خارج از محدوده تابع گيرانداخته شود. يعنی اگر درونی ترين تابع خطائی داشته باشد اين خطا می تواند تا تابع بالائی که دارای بلاک trying است منتشر شود که به برنامه نويس اجازه می دهد کد مديريت خطا را در هر جا مثل تابع اصلی قرار بدهد.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">بلاک های try-catch</span></div>
<br />
مديريت استثنا بر اساس مفاهيمی که گفته شد توسط سه دستور try، catch و throw‌ عمل می کند. بلاک کدی می خواهيم استثناهای آن را بگيريم با دستور try مشخص می شود. درون بلاک می توان هر خطائی با دستور throw گير افتاده و از بين می رود. بلاک catch که محلی برای کد مديريت خطا است بلافاصله بعد از بلاک try قرار می گيرد.<br />
<br />
فرم کلی به صورت زير است:<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>try {<br />
&nbsp;&nbsp; ...<br />
&nbsp;&nbsp; ...<br />
&nbsp;&nbsp; throw Exception;<br />
&nbsp;&nbsp; ...<br />
&nbsp;&nbsp; ...<br />
&nbsp;&nbsp; }<br />
catch( Exception e ) {<br />
&nbsp;&nbsp; ...<br />
&nbsp;&nbsp; ...<br />
&nbsp;&nbsp; }</code></div></div>
<br />
مثال. هر استثنائی که موقع دسترسی به فايل test.txt رخ دهد گرفته و پيغام مناسب نمايش داده می شود.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;fstream.h&gt;<br />
#include &lt;iostream.h&gt;<br />
int main () {<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char buffer[256&#93;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ifstream myfile ("test.txt");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (! myfile.eof() ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myfile.getline (buffer,100);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; buffer &lt;&lt; endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; catch(…) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; “There was an error !&#92;n”;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
<br />
سه نقطه درون پرانتز catch به معنی اینستکه کلیه خطاها توسط این بلاک مديريت می شود. می توان انواع مختلفی از خطاها را هندل کرد.<br />
<br />
وقتی استثنائی رخ می دهد کنترل به بلاک catch منتقل می شود بنابراين دستورات بعد از throw اجرا نخواهد شد. در بلاک catch کد بايد به نحوی باشد که اجرای برنامه را به صورت معمول ادامه يابد يا در صورت برطرف نشدن خطا با exit يا abort خاتمه پيدا کند. اگر بلاک catch اجرای برنامه را به پايان نرساند کنترل اجرا به دستور بعد از بلاک try-catch منتقل می شود.<br />
<br />
نکته. بین دو بلاک هیچ چیز نباید باشد.<br />
نکته. در صورت گير انداختن يک استثنا دستورات بعد از throw اجرا نخواهد شد.<br />
نکته. يک استثنا را می توان به تابعی که تابع جاری را صدا زده است انداخت تا مديريت شود .<br />
<br />
مثال. خطا در تابع گرفته می شود اما به برنامه اصلی برای مديريت ارسال می شود.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
float divide_number(float , float);<br />
int main() {<br />
&nbsp;&nbsp; float dividend,divisor,answer;<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "Please enter a number &#92;n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin &gt;&gt; dividend;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "Please enter a number &#92;n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin &gt;&gt; divisor;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;answer = divide_number(dividend,divisor);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; dividend &lt;&lt; " divided by ";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; divisor &lt;&lt; " is " &lt;&lt; answer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; catch(...) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "oops, there is an error!";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; return 1;<br />
}<br />
float divide_number(float num1, float num2) {<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float answer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;answer = num1/num2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return answer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; catch(...) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw;<br />
&nbsp;&nbsp; }<br />
}</code></div></div>
هر دستور try می تواند با چندين دستور catch در ارتباط باشد. هر کدام برای نوع مختلفی از استثنا. نوع داده ای که در دستور catch مشخص شده است با استثنای تطبيق داده می شود سپس بخش مربوطه به اجرا در می آيد و از بقيه صرفنظر می شود. هر نوع داده ای از جمله کلاس های تعريف شده در برنامه می تواند بدام انداخته شود.<br />
<br />
مثال. اعداد صحیح توسط catch گرفته می شود. اگر تقسیم بر صفر باشد یک عدد صحیح به بلاک catch داده می شود. بلاک catch استثنا از نوع صحيح را می گيرد.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
int main(){<br />
&nbsp;&nbsp; int answer, divisor, dividend;<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "Please enter an integer &#92;n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin &gt;&gt; divisor;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "Please enter another integer &#92;n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin &gt;&gt; dividend;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(dividend ==0) throw 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;answer = divisor/dividend;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; answer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; catch (int i) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "You cannot divide by zero";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</code></div></div>
<br />
مثال. کاربرد مديريت استثناها در استفاده از حافظه پويا.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>try {<br />
&nbsp;&nbsp; NodePtr = new ListNodeClass(Item, NextPtr);<br />
&nbsp;&nbsp; if (NodePtr == NULL) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw "Cannot allocate memory";<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; NodePtr = GetNode(Item, Front-&gt;Next);<br />
&nbsp;&nbsp; }<br />
catch(char * Str) {<br />
&nbsp;&nbsp; cout &lt;&lt; "Error: Could not insert at front " &lt;&lt; Str &lt;&lt; endl;<br />
&nbsp;&nbsp; throw;<br />
&nbsp;&nbsp; }<br />
<br />
مثال. مديريت استثنا با چند بلاک catch.<br />
<br />
<br />
try{<br />
&nbsp;&nbsp; cin &gt;&gt; test;<br />
&nbsp;&nbsp; if (test == 0 ) throw test;<br />
&nbsp;&nbsp; if (test == 1 ) throw 'a';<br />
&nbsp;&nbsp; if (test == 0 ) throw 123.5;<br />
&nbsp;&nbsp; }<br />
catch(float FloatNum){<br />
&nbsp;&nbsp; cout &lt;&lt; "Caught an exception with float value: " &lt;&lt; FloatNum &lt;&lt; endl;<br />
&nbsp;&nbsp; }<br />
catch(int IntNum) {<br />
&nbsp;&nbsp; cout &lt;&lt; "Caught an exception with int value: " &lt;&lt; IntNum &lt;&lt; endl;<br />
&nbsp;&nbsp; }<br />
catch(...){ // catch anything else<br />
&nbsp;&nbsp; cout &lt;&lt; "Caught an exception with type not int or float" &lt;&lt; endl;<br />
&nbsp;&nbsp; }</code></div></div>
<br />
وقتی چندین خطا را پاسخ می دهید سلسله مراتب خطاها اهمیت دارد. خطاها با ترتیبی که در سلسله مراتب نشان داده شده است باید در تله انداخته شوند یعنی اگر شما run-time-error را گیر انداختید نمی توانید عبارت catch دیگری برای file access error داشته باشید چون خطاهائی که در سلسله مراتب بالاتر هستند کلیه خطاهای پایینی را در بر دارند.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>Exception – the parent class for all exception class<br />
&nbsp;&nbsp; Login-error – the parent class of a variety of logic error<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invalid-argumet<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out-of-range<br />
&nbsp;&nbsp; Runtime-error – the parent of class for a variety of rumtime error<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;overflow-error<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileAccessError<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range-error</code></div></div>
]]></description>
			<content:encoded><![CDATA[استثناها خطاهای درحال اجرا هستند. به طور معمول خطاها توسط دستور if تشخيص و در صورت برقرار بودن شرط عمل مناسب، که اغلب نمايش پيغام و اتمام برنامه بود، انجام می گرفت. راه ديگر هنگام مواجه شدن با خطا گير انداختن آن هنگام پيش آمدن شرايط خطاست. کدی که ممکن است باعث خطا شود اجرا می شود و هر خطائی که ايجاد می شود گرفته می شود و عمل مناسب انجام می گيرد. بلاک های try-catch بر اساس اين مفهوم عمل می کنند. مديريت خطاها به طور سطحی در اينجا معرفی می شود.<br />
<br />
مديريت خطاها از موضوعات مهم در برنامه نویسی است. حالات متعددی وجود دارند که ممکن است ایجاد خطا کند. مثلا باز کردن فایلی که وجود ندارد یا دريافت ورودی نادرست از کاربر. کنترل این خطاها هنگام اجرای برنامه اهمیت زیادی دارد. اگر برنامه این گونه خطاها را در دست نگیرد برنامه سقط می کند و نارضايتی کاربر را باعث می شود. روش قديمی بررسی خطا توسط if و دادن یک پیغام دوستانه به کاربر و اتمام برنامه بود. C++ راه ديگری را توسط بلاک های try-catch برای مديريت خطاهای در حال اجرا در اختيار مي گذارد.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">خطاها</span></div>
<br />
<span style="font-weight: bold;">خطاها را به سه دسته می توان تقسیم کرد:</span><br />
<br />
    • خطاهای گرامری (syntax error). خطاهائی که با رعايت نکردن قواعد زبان برنامه نويسی توسط کامپايلر تشخيص داده می شوند. مثلا بجای if(x!=y) بنویسید if(x&lt;&gt;y). کامپایلر کد برنامه را تا وقتی خطای گرامری وجود دارد کامپایل نمی کند.<br />
    • خطاهای زمان اجرا (runtime error). هر وقفه ای که در جریان عادی اجرای برنامه پیش آید که معمولا باعث سقط برنامه می شود. مثلا باز کردن فایلی که وجود ندارد یا تقسیم بر صفر. این خطاها استثنا (exception) نامیده می شوند.<br />
    • خطاهای منطقی (login error). وقتی برنامه کامپایل و اجرا می شود اما به دليل خطائی در منطق برنامه نتایج غلطی تولید می کند. سخت ترین نوع خطا است که معمولا به آن bug هم گفته می شود.<br />
<br />
برای رفع خطا ابتدائی ترین کاری که می شود کرد تست کلیه برنامه و کشف و برطرف سازی خطا است. کنترل مناسب خطاها از سقط برنامه جلوگيری می کند. کامپایلر خطاهای گرامری را مشخص می کند. مديريت استثناها خطاهای زمان اجرا را بر عهده دارند بنابراين خطاهای منطقی بزرگترین مشکل برنامه نویس خواهد بود.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">مديريت استثناها</span></div>
<br />
قبل از اينکه سيستم مديريت استثناها معرفی شود برنامه های کامپيوتری کاملا بدون خطا نبودند. البته برای گرفتن خطاها روش هائی وجود داشت که معمول ترين آن بررسی مقداری بود که توسط توابع برگردانده می شد و نحوه اجرای آن را بيان می کرد. کدی که تابع را فراخوانی می کرد مقدار بر گشتی را چک می کرد و مطابق با آن عمل می کرد (اگر با استفاده از Windows API برنامه نوشته باشيد با اين روش آشنا هستيد).<br />
<br />
مفهوم کلی مديريت استثناها ساده است. هر زمان که استثنائی شناسائی می شود يک فلگ فرضی خطا بالا می رود. سيستمی همواره مراقب اين فلگ خطاست. و درصورت بالا رفتن فلگ کد مديريت خطا فراخوانی می شود. بالا رفتن فلگ خطا را اصطلاحا گير انداختن (throwing) خطا می نامند. وقتی خطائی به دام انداخته می شود سيستم با گرفتن خطا (catching) عکس العمل نشان می دهد. محاصره کردن بلاکی از کد حساس به خطا و مديريت استثنا را سعی کردن (trying) به اجرای بلاک می نامند.<br />
<br />
دلايل خوبی برای استفاده از مديريت استثناها وجود دارد. مهمترين آن جداکردن کد مديريت خطا از کد برنامه است. وقتی استثنائی گرفته می شود مسيری موازی اجرا طی می شود و با اجرای نرمال کد برنامه تداخلی ندارد. اين باعث می شود نوشتن کد ساده تر شود چون مجبور نيستيد برای هر خطائی چک داشته باشيد. علاوه بر اين يک استثنا نمی تواند نديده گرفته شود و تضمين می کند که با خطا برخورد کند. و چون جلوی سقط ناخواسته برنامه را می گيرد اتکاپذيری برنامه را بالا می برد.<br />
<br />
از مزايای ديگر مديريت استثناها اين است که خطا می تواند خارج از محدوده تابع گيرانداخته شود. يعنی اگر درونی ترين تابع خطائی داشته باشد اين خطا می تواند تا تابع بالائی که دارای بلاک trying است منتشر شود که به برنامه نويس اجازه می دهد کد مديريت خطا را در هر جا مثل تابع اصلی قرار بدهد.<br />
<br />
<div style="text-align: center;"><span style="font-weight: bold;">بلاک های try-catch</span></div>
<br />
مديريت استثنا بر اساس مفاهيمی که گفته شد توسط سه دستور try، catch و throw‌ عمل می کند. بلاک کدی می خواهيم استثناهای آن را بگيريم با دستور try مشخص می شود. درون بلاک می توان هر خطائی با دستور throw گير افتاده و از بين می رود. بلاک catch که محلی برای کد مديريت خطا است بلافاصله بعد از بلاک try قرار می گيرد.<br />
<br />
فرم کلی به صورت زير است:<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>try {<br />
&nbsp;&nbsp; ...<br />
&nbsp;&nbsp; ...<br />
&nbsp;&nbsp; throw Exception;<br />
&nbsp;&nbsp; ...<br />
&nbsp;&nbsp; ...<br />
&nbsp;&nbsp; }<br />
catch( Exception e ) {<br />
&nbsp;&nbsp; ...<br />
&nbsp;&nbsp; ...<br />
&nbsp;&nbsp; }</code></div></div>
<br />
مثال. هر استثنائی که موقع دسترسی به فايل test.txt رخ دهد گرفته و پيغام مناسب نمايش داده می شود.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;fstream.h&gt;<br />
#include &lt;iostream.h&gt;<br />
int main () {<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char buffer[256];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ifstream myfile ("test.txt");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (! myfile.eof() ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myfile.getline (buffer,100);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; buffer &lt;&lt; endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; catch(…) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; “There was an error !&#92;n”;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; return 0;<br />
}</code></div></div>
<br />
سه نقطه درون پرانتز catch به معنی اینستکه کلیه خطاها توسط این بلاک مديريت می شود. می توان انواع مختلفی از خطاها را هندل کرد.<br />
<br />
وقتی استثنائی رخ می دهد کنترل به بلاک catch منتقل می شود بنابراين دستورات بعد از throw اجرا نخواهد شد. در بلاک catch کد بايد به نحوی باشد که اجرای برنامه را به صورت معمول ادامه يابد يا در صورت برطرف نشدن خطا با exit يا abort خاتمه پيدا کند. اگر بلاک catch اجرای برنامه را به پايان نرساند کنترل اجرا به دستور بعد از بلاک try-catch منتقل می شود.<br />
<br />
نکته. بین دو بلاک هیچ چیز نباید باشد.<br />
نکته. در صورت گير انداختن يک استثنا دستورات بعد از throw اجرا نخواهد شد.<br />
نکته. يک استثنا را می توان به تابعی که تابع جاری را صدا زده است انداخت تا مديريت شود .<br />
<br />
مثال. خطا در تابع گرفته می شود اما به برنامه اصلی برای مديريت ارسال می شود.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
float divide_number(float , float);<br />
int main() {<br />
&nbsp;&nbsp; float dividend,divisor,answer;<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "Please enter a number &#92;n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin &gt;&gt; dividend;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "Please enter a number &#92;n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin &gt;&gt; divisor;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;answer = divide_number(dividend,divisor);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; dividend &lt;&lt; " divided by ";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; divisor &lt;&lt; " is " &lt;&lt; answer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; catch(...) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "oops, there is an error!";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; return 1;<br />
}<br />
float divide_number(float num1, float num2) {<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float answer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;answer = num1/num2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return answer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; catch(...) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw;<br />
&nbsp;&nbsp; }<br />
}</code></div></div>
هر دستور try می تواند با چندين دستور catch در ارتباط باشد. هر کدام برای نوع مختلفی از استثنا. نوع داده ای که در دستور catch مشخص شده است با استثنای تطبيق داده می شود سپس بخش مربوطه به اجرا در می آيد و از بقيه صرفنظر می شود. هر نوع داده ای از جمله کلاس های تعريف شده در برنامه می تواند بدام انداخته شود.<br />
<br />
مثال. اعداد صحیح توسط catch گرفته می شود. اگر تقسیم بر صفر باشد یک عدد صحیح به بلاک catch داده می شود. بلاک catch استثنا از نوع صحيح را می گيرد.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>#include &lt;iostream.h&gt;<br />
int main(){<br />
&nbsp;&nbsp; int answer, divisor, dividend;<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "Please enter an integer &#92;n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin &gt;&gt; divisor;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "Please enter another integer &#92;n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin &gt;&gt; dividend;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(dividend ==0) throw 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;answer = divisor/dividend;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; answer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; catch (int i) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "You cannot divide by zero";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</code></div></div>
<br />
مثال. کاربرد مديريت استثناها در استفاده از حافظه پويا.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>try {<br />
&nbsp;&nbsp; NodePtr = new ListNodeClass(Item, NextPtr);<br />
&nbsp;&nbsp; if (NodePtr == NULL) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw "Cannot allocate memory";<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; NodePtr = GetNode(Item, Front-&gt;Next);<br />
&nbsp;&nbsp; }<br />
catch(char * Str) {<br />
&nbsp;&nbsp; cout &lt;&lt; "Error: Could not insert at front " &lt;&lt; Str &lt;&lt; endl;<br />
&nbsp;&nbsp; throw;<br />
&nbsp;&nbsp; }<br />
<br />
مثال. مديريت استثنا با چند بلاک catch.<br />
<br />
<br />
try{<br />
&nbsp;&nbsp; cin &gt;&gt; test;<br />
&nbsp;&nbsp; if (test == 0 ) throw test;<br />
&nbsp;&nbsp; if (test == 1 ) throw 'a';<br />
&nbsp;&nbsp; if (test == 0 ) throw 123.5;<br />
&nbsp;&nbsp; }<br />
catch(float FloatNum){<br />
&nbsp;&nbsp; cout &lt;&lt; "Caught an exception with float value: " &lt;&lt; FloatNum &lt;&lt; endl;<br />
&nbsp;&nbsp; }<br />
catch(int IntNum) {<br />
&nbsp;&nbsp; cout &lt;&lt; "Caught an exception with int value: " &lt;&lt; IntNum &lt;&lt; endl;<br />
&nbsp;&nbsp; }<br />
catch(...){ // catch anything else<br />
&nbsp;&nbsp; cout &lt;&lt; "Caught an exception with type not int or float" &lt;&lt; endl;<br />
&nbsp;&nbsp; }</code></div></div>
<br />
وقتی چندین خطا را پاسخ می دهید سلسله مراتب خطاها اهمیت دارد. خطاها با ترتیبی که در سلسله مراتب نشان داده شده است باید در تله انداخته شوند یعنی اگر شما run-time-error را گیر انداختید نمی توانید عبارت catch دیگری برای file access error داشته باشید چون خطاهائی که در سلسله مراتب بالاتر هستند کلیه خطاهای پایینی را در بر دارند.<br />
<div class="codeblock">
<div class="title">کد:<br />
</div><div class="body" dir="ltr"><code>Exception – the parent class for all exception class<br />
&nbsp;&nbsp; Login-error – the parent class of a variety of logic error<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invalid-argumet<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out-of-range<br />
&nbsp;&nbsp; Runtime-error – the parent of class for a variety of rumtime error<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;overflow-error<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileAccessError<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range-error</code></div></div>
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[اشاره گر this]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=274</link>
			<pubDate>Mon, 30 Aug 2010 18:47:48 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=274</guid>
			<description><![CDATA[وفتی تابع عضوی فراخوانی می شود، یک آرگمان ضمنی به صورت خودکار به آن ارسال می شود که اشاره گری به شی فراخوانی کننده است (یعنی در شیئی که تابع فراخوانی می شود)<br />
این اشاره گر، this نام دارد. به عبارت دیگر هر شی از طریق اشاره گری به نام this به آدرس خود دسترسی دارد. این اشاره گر، جزئی از خود شی نیست. این اشاره گر به طور ضمنی برای مراجعه به اعضای داده ای و توابع عضو یک شی به کار می رود.<br />
به طور صریح هم قابل استفاده است. نوع اشاره گر this به نوع شی و اینکه آیا تابع عضوی که this در آن مورد استفاده قرار می گیرد به صورت const تعریف شده است یا خیر بستگی دارد. دقت داشته باشید که توابع عضو استاتیک، اشاره گر this ندارند، زیرا اعضای داده ای استاتیک و توابع عضو تابعی استاتیک مستقل از هر شیئی از کلاس وجود دارند]]></description>
			<content:encoded><![CDATA[وفتی تابع عضوی فراخوانی می شود، یک آرگمان ضمنی به صورت خودکار به آن ارسال می شود که اشاره گری به شی فراخوانی کننده است (یعنی در شیئی که تابع فراخوانی می شود)<br />
این اشاره گر، this نام دارد. به عبارت دیگر هر شی از طریق اشاره گری به نام this به آدرس خود دسترسی دارد. این اشاره گر، جزئی از خود شی نیست. این اشاره گر به طور ضمنی برای مراجعه به اعضای داده ای و توابع عضو یک شی به کار می رود.<br />
به طور صریح هم قابل استفاده است. نوع اشاره گر this به نوع شی و اینکه آیا تابع عضوی که this در آن مورد استفاده قرار می گیرد به صورت const تعریف شده است یا خیر بستگی دارد. دقت داشته باشید که توابع عضو استاتیک، اشاره گر this ندارند، زیرا اعضای داده ای استاتیک و توابع عضو تابعی استاتیک مستقل از هر شیئی از کلاس وجود دارند]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[کار با رجیستری در C#]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=273</link>
			<pubDate>Sun, 29 Aug 2010 12:38:21 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=273</guid>
			<description><![CDATA[<span style="font-weight: bold;">آموزش کار با رجیستری در C#</span><br />
<br />
<div style="text-align: center;">
<!-- start: postbit_attachments_attachment -->
<br /><img src="images/attachtypes/pdf.gif" border="0" alt=".pdf" />&nbsp;&nbsp;<a href="attachment.php?aid=25" target="_blank">registry_(www.hamkelasy.com).pdf</a> (اندازه: 349697 / دانلودها: 0)
<!-- end: postbit_attachments_attachment --></div>
<br />
<br />
منبع: <div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;">آموزش کار با رجیستری در C#</span><br />
<br />
<div style="text-align: center;">
<!-- start: postbit_attachments_attachment -->
<br /><img src="images/attachtypes/pdf.gif" border="0" alt=".pdf" />&nbsp;&nbsp;<a href="attachment.php?aid=25" target="_blank">registry_(www.hamkelasy.com).pdf</a> (اندازه: 349697 / دانلودها: 0)
<!-- end: postbit_attachments_attachment --></div>
<br />
<br />
منبع: <div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[تمیز کردن دوربین]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=272</link>
			<pubDate>Sun, 29 Aug 2010 11:48:50 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=272</guid>
			<description><![CDATA[اگر عکس هایتان همواره مات و محو میفتند ممکن است به این معنا باشد که لنز دوربینتان را باید پاک کنید. اکثر دوربین های دیجیتال ویژگی افزودن یک فیلتر فرابنفش UV را دارند که نه تنها لنز را در برابر کثیفی بلکه از خراش هم محافظت می کند. اما دوربین های ارزان تر این ویژگی را ندارند پس به یاد داشته باشید تا لنز آنرا در مواقعی که استفاده نمی کنید بپوشانید و آنرا لمس نکنید.<br />
<br />
بیش از حد لنز دوربین را تمیز نکنید. بسته به فاصله ی زمانی استفاده ی شما از دوربین، هر چند هفته یا چند ماه یک بار مناسب است. برای تمیز کردن لنز، کیت مخصوص پاک کردن لنز را برداشته و با استفاده از برس لنز هرگونه ذرات چسبنده را از سطح لنز پاک کنید. کمی مایع پاک کننده لنز را روی پارچه ی مخصوص بریزید و با حرکت دادن دایره وار بروی لنز، آن را تمیز کنید. با استفاده از يك دمنده هوا لنز را خشک کنید یا بگذارید به طور طبیعی خشک شود. از هرگونه ماده ی ساینده  همچون صابون یا محکم تمیز کردن لنز به مانند تمیز کردن بدنه دوربين خودداری کنید.<br />
<br />
مراقب باشید که با تمیز کردن مداوم در یک جهت روي لنز لک نیندازید. حرکت دایره وار را از بالا به پایین یا به  طرفین تغییر دهید.<br />
<br />
اگر می توانید لنزهای دوربینتان را تعویض کنید، اطمینان حاصل کنید که دوربین خاموش باشد و در محیطی با گرد و غبار کم باشید که اگر بروی حسگر تصویرتان گردی بنشیند، آنرا در تمام تصاویرتان نشان خواهد داد. گرچه می توانید خودتان حسگر را تمیز کنید اما پیش نهاد می کنم آنرا به یک عکاسی ببرید تا به طور تخصصی تمیزش کنند.<br />
<br />
از دیگر اجزای دوربینتان هم محافظت کنید خصوصا از اسلات های  کارت حافظه و باتری. هرگز چیزی را در اسلات کارت حافظه وارد نکنید که ممکن است باعث شکستن پین های کوچک آن شود. برای تمیز ماندن بهتر است که همواره یک کارت حافظه را داخلش بگذارید یا دست کم کاور آنرا ببندید.<br />
<br />
نوشته: ديويد پترسون<br />
<br />
ترجمه: ميلاد خراسانيان<br />
<br />
منبع: <div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>]]></description>
			<content:encoded><![CDATA[اگر عکس هایتان همواره مات و محو میفتند ممکن است به این معنا باشد که لنز دوربینتان را باید پاک کنید. اکثر دوربین های دیجیتال ویژگی افزودن یک فیلتر فرابنفش UV را دارند که نه تنها لنز را در برابر کثیفی بلکه از خراش هم محافظت می کند. اما دوربین های ارزان تر این ویژگی را ندارند پس به یاد داشته باشید تا لنز آنرا در مواقعی که استفاده نمی کنید بپوشانید و آنرا لمس نکنید.<br />
<br />
بیش از حد لنز دوربین را تمیز نکنید. بسته به فاصله ی زمانی استفاده ی شما از دوربین، هر چند هفته یا چند ماه یک بار مناسب است. برای تمیز کردن لنز، کیت مخصوص پاک کردن لنز را برداشته و با استفاده از برس لنز هرگونه ذرات چسبنده را از سطح لنز پاک کنید. کمی مایع پاک کننده لنز را روی پارچه ی مخصوص بریزید و با حرکت دادن دایره وار بروی لنز، آن را تمیز کنید. با استفاده از يك دمنده هوا لنز را خشک کنید یا بگذارید به طور طبیعی خشک شود. از هرگونه ماده ی ساینده  همچون صابون یا محکم تمیز کردن لنز به مانند تمیز کردن بدنه دوربين خودداری کنید.<br />
<br />
مراقب باشید که با تمیز کردن مداوم در یک جهت روي لنز لک نیندازید. حرکت دایره وار را از بالا به پایین یا به  طرفین تغییر دهید.<br />
<br />
اگر می توانید لنزهای دوربینتان را تعویض کنید، اطمینان حاصل کنید که دوربین خاموش باشد و در محیطی با گرد و غبار کم باشید که اگر بروی حسگر تصویرتان گردی بنشیند، آنرا در تمام تصاویرتان نشان خواهد داد. گرچه می توانید خودتان حسگر را تمیز کنید اما پیش نهاد می کنم آنرا به یک عکاسی ببرید تا به طور تخصصی تمیزش کنند.<br />
<br />
از دیگر اجزای دوربینتان هم محافظت کنید خصوصا از اسلات های  کارت حافظه و باتری. هرگز چیزی را در اسلات کارت حافظه وارد نکنید که ممکن است باعث شکستن پین های کوچک آن شود. برای تمیز ماندن بهتر است که همواره یک کارت حافظه را داخلش بگذارید یا دست کم کاور آنرا ببندید.<br />
<br />
نوشته: ديويد پترسون<br />
<br />
ترجمه: ميلاد خراسانيان<br />
<br />
منبع: <div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[دانلود کتاب آموزش کامل 3DSMAX]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=271</link>
			<pubDate>Sun, 29 Aug 2010 11:30:12 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=271</guid>
			<description><![CDATA[دانلود کتاب آموزش کامل 3DSMAX به زبان فارسی<br />
<br />
<br />
<div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div> با حجم 2 MB<br />
<br />
<br />
<br />
منبع: <div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>]]></description>
			<content:encoded><![CDATA[دانلود کتاب آموزش کامل 3DSMAX به زبان فارسی<br />
<br />
<br />
<div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div> با حجم 2 MB<br />
<br />
<br />
<br />
منبع: <div class=reglink>
فقط كاربران عضو قادر به مشاهده لينك ها مي باشند.براي عوضيت  <a href="member.php?action=register"><strong>اينجا</strong></a>را كليك كنيد.<br />
</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[لاگ اوت :: سیستم مدیریت محتوا قسمت 5]]></title>
			<link>http://www.forum.educator.ir/showthread.php?tid=270</link>
			<pubDate>Sun, 29 Aug 2010 09:13:04 +0000</pubDate>
			<guid isPermaLink="false">http://www.forum.educator.ir/showthread.php?tid=270</guid>
			<description><![CDATA[به نام خداوند بخشنده ی مهربان<br />
<br />
سطح مقاله: متوسط-پیشرفته<br />
پیش نیاز: آشنایی با PHP و دستورات SQL SERVER<br />
<br />
در جلسات قبلی چهار سیستم کاربردی ثبت نام، لاگین، تغییر رمز عبور، حذف اکانت را پیش بردیم و امروز یک کار خیلی کوچلو می کنیم که اصلا نیاز به یک قسمت نبود اما دیگه این بخش را خواستم بگذارم. آموزش صفحه ی logout.php که حداقل با چهار خط کد می شه آن را نوشت. خب در پایین کد کامل این صفحه را نوشتم:<br />
<div class="codeblock phpcodeblock"><div class="title">کد PHP:<br />
</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">Session_start</span><span style="color: #007700">();<br />If(!isset(</span><span style="color: #0000BB">&#36;_SESSION</span><span style="color: #007700">[</span><span style="color: #0000BB">“user”</span><span style="color: #007700">&#93;))&nbsp;{<br />Die(</span><span style="color: #0000BB">‘You&nbsp;are&nbsp;not&nbsp;login</span><span style="color: #007700">.</span><span style="color: #0000BB">’</span><span style="color: #007700">);<br />}<br /></span><span style="color: #0000BB">Session_destroy</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">Header</span><span style="color: #007700">(</span><span style="color: #0000BB">“location</span><span style="color: #007700">:</span><span style="color: #0000BB">index</span><span style="color: #007700">.</span><span style="color: #0000BB">php”</span><span style="color: #007700">);&nbsp;<br /></span></code></div></div></div>
در این جا توضیح صفحه ی logout.php را می نویسم:<br />
با تابع session_start(); کار جلسه ها را شروع می کنم.<br />
سپس با یک شرط و تابع isset بررسی می کنیم که کاربر لاگین کرده یا نه و اگر کاربر لاگین نکرده پیغام مناسب چاپ کنیم. سپس با تابع session_destroy(); جلسه ها را نابود می کنیم تا کاربر هم لاگینش از بین بره و در عبارتی لاگ اوت بشه. سپس با دستور header و location شما را به صفحه ی index.php که صفحه ی نخست می باشد هدایت می کنیم.<br />
<br />
محمد هادی معصومی<br />
hadimir]]></description>
			<content:encoded><![CDATA[به نام خداوند بخشنده ی مهربان<br />
<br />
سطح مقاله: متوسط-پیشرفته<br />
پیش نیاز: آشنایی با PHP و دستورات SQL SERVER<br />
<br />
در جلسات قبلی چهار سیستم کاربردی ثبت نام، لاگین، تغییر رمز عبور، حذف اکانت را پیش بردیم و امروز یک کار خیلی کوچلو می کنیم که اصلا نیاز به یک قسمت نبود اما دیگه این بخش را خواستم بگذارم. آموزش صفحه ی logout.php که حداقل با چهار خط کد می شه آن را نوشت. خب در پایین کد کامل این صفحه را نوشتم:<br />
<div class="codeblock phpcodeblock"><div class="title">کد PHP:<br />
</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">Session_start</span><span style="color: #007700">();<br />If(!isset(</span><span style="color: #0000BB">&#36;_SESSION</span><span style="color: #007700">[</span><span style="color: #0000BB">“user”</span><span style="color: #007700">]))&nbsp;{<br />Die(</span><span style="color: #0000BB">‘You&nbsp;are&nbsp;not&nbsp;login</span><span style="color: #007700">.</span><span style="color: #0000BB">’</span><span style="color: #007700">);<br />}<br /></span><span style="color: #0000BB">Session_destroy</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">Header</span><span style="color: #007700">(</span><span style="color: #0000BB">“location</span><span style="color: #007700">:</span><span style="color: #0000BB">index</span><span style="color: #007700">.</span><span style="color: #0000BB">php”</span><span style="color: #007700">);&nbsp;<br /></span></code></div></div></div>
در این جا توضیح صفحه ی logout.php را می نویسم:<br />
با تابع session_start(); کار جلسه ها را شروع می کنم.<br />
سپس با یک شرط و تابع isset بررسی می کنیم که کاربر لاگین کرده یا نه و اگر کاربر لاگین نکرده پیغام مناسب چاپ کنیم. سپس با تابع session_destroy(); جلسه ها را نابود می کنیم تا کاربر هم لاگینش از بین بره و در عبارتی لاگ اوت بشه. سپس با دستور header و location شما را به صفحه ی index.php که صفحه ی نخست می باشد هدایت می کنیم.<br />
<br />
محمد هادی معصومی<br />
hadimir]]></content:encoded>
		</item>
	</channel>
</rss>