X
تبلیغات
جدیدترین های کامپیوتر

جدیدترین های کامپیوتر

هر آنچه كه از Dvd بايد بدانيد

هر آنچه كه از Dvd بايد بدانيد

 

اشاره :
تقريباً 8 سال از ورود DVD به صورت يك استاندارد به بازار جهاني سپري شده است، اما در ايران تازه جايي بين كاربران براي خود باز كرده است و در آينده نزديك تبديل به يك گنج گران بها خواهد شد. خيلي وقت بود كه دلم مي خواست، در مورد DVD (دي وي دي) و تمامي ملحقاتش اطلاعات كامل و دقيقي به زبان فارسي به دست بياورم و به تفاوت هاي گونه هاي مختلف آن پي ببرم ولي متأسفانه نتوانستم منبعي جامع و پويا در اين مورد پيدا كنم كه به تمامي سؤالاتم پاسخ بدهد. البته مقالات جالبي در اين زمينه در ساير نشريات كامپيوتري پيدا كردم ولي آن طور كه دلم مي خواست به تمامي موارد مربوط به اين فناوري به طور دقيق اشاره نكرده بودند. بنابراين تصميم گرفتم مسؤليت نگارش اين مقاله را خود بر عهده بگيرم. اگرچه مي دانم كه خيلي زودتر از اين ها بايد به مبحث DVD پرداخته مي شد ولي خب هنوز هم دير نشده است، از اين پس براي راحتي كار نام DVD را به صورت انگليسي به كار مي برم. براي نگارش اين مطلب كوتاه به واقع بيش از 200 صفحه مطالعه و بررسي شده است و واقعاً برايم مقدور نبود ريز به ريز در هر قسمت وارد شوم و همه قسمت ها را بسط داده و به طور موشكافانه تمامي جزييات را بيان كنم، بنابراين در انتهاي مقاله آدرس منابع را برايتان به صورت يك جدول قرار دادم تا اگر احياناً به نكات و مطالب بيشتري نياز پيدا كرديد با مراجعه به آنها پاسخ سؤالات خود را بگيريد. قبل از شروع مقاله توجه شما را به اين نكته جلب مي كنم كه : اگرچه اين مقاله كمي طولاني و مقداري تخصصي به نظر مي رسد ولي به شما اطمينان مي دهم پس از خواندن آن جواب خيلي از سؤالاتي را كه مدت ها در ذهنتان بود خواهيد گرفت و خيلي از نكات مبهم برايتان روشن خواهد شد.


اهداف مقاله:
• چرا بايد به سوي DVD مهاجرت كرد؟
• شناخت رسانه DVD و انواع گونه هاي آن (DVD Formats)
• آشنايي با مناطق توزيع DVD و اصطلاحات رايج اين فناوري مانند: CSS, RPC, Region
• راهنماي خريد DVD Writer ها و DVD Player ها
• معرفي نرم افزارهاي مربوط به DVD
• معرفي منابع و سايت هايي كه اطلاعات بسيار كامل تري را در آنجا پيدا خواهيد كرد

چرا بايد به سوي DVD مهاجرت كرد؟
1ـ درحال حاضر اكثر نرم افزارهاي روز دنيا بر روي DVD عرضه مي شوند، حتي خود مايكروسافت هم رسماً اعلام كرده كه نسخه نهايي ويندوز ويستا بر روي DVD عرضه خواهد شد.

2ـ اكثر بازي هاي روز دنيا هم ديگر بر روي DVD عرضه مي شوند.

3ـ زمان ارائه VCD و جايگزين شدن آن به جاي VHS را به خاطر داريد. الان 11 سال از ورود DVD به بازار جهاني مي گذرد، كشورهاي صنعتي در حال مهاجرت به سوي نسل بعد از DVD يعني HD DVD و Blue-ray هستند!! آيا هنوز هم معتقد هستيد كه هنوز بعد از 11 سال باز هم براي استفاده از DVD زود است؟!

4ـ يك DVD (R) قاب دار، حداكثر قيمتي در حدود 1000 تا 1200 تومان دارد، در حالي كه يك CD با همان مشخصات قيمتي در حدود 300 الي 500 تومان دارد، اگر با توجه به ظرفيت DVD كه حدود هفت برابر CD است، بخواهيم قيمت آن را حساب كنيم، چيزي در حدود 2100 الي 3500 تومان مي شود. در حاليكه قيمت آن از نصف هم كمتر است. با يك حساب ساده مي توان به اين نتيجه رسيد كه در خريد به تعداد بالا چه صرفه جويي از لحاظ ريالي انجام خواهد شد.

5ـ جمع آوري آرشيو با حجم كمتر: با توجه به ظرفيت بالاي DVD بهترين رسانه براي آرشيو اطلاعات است

قبل از اينكه وارد مبحث استانداردها شويم، بهتر است نگاهي كلي به DVD و انواع آن داشته باشيم.




نکته : اصطلاح Dual Layer (DL) را براي DVD هاي دولايه مدل منفي (DVD-R)به کار مي برند و براي DVD هاي دولايه مدل مثبت (DVD+R) از اصطلاح Double Layer استفاده مي کنند، ولي در حقيقت هر دو يک معني مي دهند و منظور DVD 2 لايه يا DVD-9 (DL) مي باشد.

رسانه هاي DVD نسل تازه اي از رسانه هاي فناوري ذخيره سازي نوري مي باشد كه از سال 1995 ميلادي شروع به كار كرد و توانستند خيلي زود جاي VHS را بگيريند، البته از کشورهاي مثل خودمان بگذريم که VCD را به اشتباه جايگزين VHS مي دانند. تقريباً مارس 1997 ميلادي بود كه اولين DVD Player ها روانه بازار شدند. (به اين نكته توجه داشته باشيد كه اكنون سال 2006 ميلادي مي باشد ولي متأسفانه هنوز از فراگير شدن اين رسانه در ايران اثري به چشم نمي خورد!!)
شباهت ها و تفاوت هاي DVD با CD:
ـ هر دو از رسانه هاي ذخيره سازي نوري هستند.
ـ از لحاظ ظاهري هر دو مدور ، 120 ميلي متر قطر و 2 / 1 ميلي متر ضخامت دارند.
ـ ظرفيت يك DVD تقريباً 7 برابر CD مي باشد.
ـ قابليت 2 لايه اي بودن DVD.
ـ قابليت 2 طرفه بودن DVD.
ـ پرچگال تر بودن DVD نسبت به CD
ـ كوچكتر بودن اندازه حفره‌ها (Pit) در DVD
ـ كوچكتر بودن طول موج نور ليزر در DVD
ـ گسترده تر بودن فرمت هاي DVD نسبت به فرمت هاي CD
ـ هر X در استاندارد سرعت براي DVD معادل 1385 كيلوبايت بر ثانيه است كه اين سرعت در CD معادل 150 كيلوبايت بر ثانيه بود.

براي كسب اطلاعات دقيق تر به مقاله تكنولوژي DVD در شماره هاي شماره 7، 8 و 9 ماهنامه مراجعه نماييد.




استاندارد DVD
اگر سال هاي 1980 تا 1995 ميلادي كه تقريباً معادل دهه 1358 تا 1375 هجري شمسي مي باشد را بتوانيد به ياد بياوريد ، پس مي توانيد جنگ بزرگ اين دوران را هم به ياد آوريد. بله درست حدس زديد منظورمان جنگ بين VHS و Betamax مي باشد ، اگر چه اين جنگ طولاني بود ولي در نهايت VHS برنده نهايي آن بود.
با وارد شدن نسل DVD كه به طور رسمي جايگزين VHS شدند ، جنگ بين آن دو هم به پايان رسيد ، اما در آن سال ها كه DVD وارد بازار دنيا شده بود و داشت به استانداردي براي ذخيره فيلم سينمايي چه مصارف خانگي و چه مصارف تجاري تبديل مي شد ، تازه سر و كله CD در ايران پيدا شده بود بعد از گذشت 12 سال از زمان معرفي تكنولوژي DVD ، كه تازه در ايرن در حال عموميت پيدا كردن است، در اروپا، آمريكا و ژاپن و خيلي از كشورهاي ديگر تقريباً دارد از دور خارج مي شود و جاي خود را به 2 دستاورد جديدتر به نام هاي Blue-ray و HD-DVD مي دهد، كه اولي 50 گيگابايت و دومي 30 گيگابايت توانايي ذخيره اطلاعات را در خود دارند. مسئله اي كه در حال حاضر مهم مي باشد اين است كه با ازدياد DVD و DVD Player و DVD Writer ها، بايد با گونه هاي مختلف و نحوه كار آن آشنا شد.

در حالت مرسوم و متداول در جهان رسانه DVD به ترتيب به 3 نوع كلي زير تقسيم مي شود:

1ـ DVD RAM (Random Access Rewritable) ، بخوانيد: (دي وي دي رم) پشتيبان و توسعه دهنده انجمن .DVD Forum

2ـ (Recordable) DVD-R ، بخوانيد: (دي وي دي دش آر يا دي وي دي ماينوس آر يا دي وي دي منفي آر) پشتيبان و توسعه دهنده انجمن .DVD Forum

3ـ DVD+R (Recordable) ، بخوانيد: (دي وي دي پلاس آر يا دي وي دي مثبت آر) پشتيبان و توسعه دهنده گروه DVD+RW Alliance.

DVD RAM
انجمن DVD Forum كه در ابتدا DVD Consortium ( دي وي دي كنسرسيوم ) نام داشت.DVD Forum در سال 1995 به عنوان انجمني بين المللي متشكل از شركت هايي كه فعاليت آنها در رابطه با سخت افزار، نرم افزار و يا رسانه DVD بود تشكيل شد. اين انجمن وظايف گوناگوني دارد كه در فرصت نمي توان به همه موارد اشاره كنيم ، ولي بدانيد پشتيبانان فرمت‌هاي DVD-R / RW و DVD-RAMاين انجمن مي باشد، شركت هايي كه اعضاي اين انجمن را تشكيل مي دهند عبارتند از:

1-Hitachi, Ltd.
2-Matsushita/Panasonic Electric Industrial Co. Ltd.
3-Mitsubishi Electric Corporation
4-Pioneer Electronic Corporation
5-Royal Philips Electronics N.V.
6-Sony Corporation
7-Thomson SA (RCA)
8-Time Warner Inc.
9-Toshiba Corporation
10-Victor Company of Japan, Ltd.

مزايا و معايب DVD RAM
1ـ داشتن عمري طولاني، مقاوم تر در برابر صدمه هاي فيزيکي. اگر به دقت از آنها مراقبت کنيد تا 30 سال توانايي نگهداري اطلاعات را دارند.

2ـ اين رسانه تا بيش از 100 هزار بار قابليت پاک شدن و نوشته شدن را دارد، در حاليکه رسانه هاي DVD+RW و DVD-RW حداکثر تا 1000 بار اين قابليت را دارند. (البته اين اعداد ظرفيت ايده آل اين رسانه ها هستند و در واقع شايد عمرشان هيچ گاه به نصف اين اعداد هم نرسد.)

3ـ عملکرد رسانه DVD-RAM همانند Flash Memory ها يا به عبارت دقيق تر Removable Disk Storage مي باشد، يعني براي وارد کردن اطلاعات در آنها نياز به نرم افزارهاي رايت مانند Nero, Roxio نيست، به راحتي با يک عمل Copy & Paste اطلاعات را مي توانيد به آن منتقل کنيد و يا از آن حذف کنيد.

4ـ بعضي از انواع DVD RAM ها داراي محفظه به خصوصي هستند که به آن کارتريج مي گويند. وظيفه اين کارتريج حفاظت بيشتر از اين رسانه با جلوگيري از تماس شئي يا دست با سطح رسانه مي باشد. در مدل هاي قديمي امکان درآوردن کارتريج وجود نداشت و براي دسترسي به اطلاعات داخل آن بايد از درايو مخصوصي که محل قرارگيري کارتريج در آن تعبيه شده بود، استفاده مي کرديد، ولي در حال حاضر اين مشکل برطرف شده و کارتريج آن قابليت جدا شدن از ديسك DVD-RAM را دارد.

5ـ متأسفانه فقط تعداد کمي از دوربين هاي ديجيتالي فيلمبرداري از نوع DVD Camcorder از رسانه DVD-RAM پشتيباني مي کنند.

6ـ کاربراني که از ويندوز XP استفاده مي کنند با رسانه DVD-RAM مشکلي نخواهند داشت، چون ويندوز XP از DVD-RAM پشتيباني مي کنند، ولي کاربران ويندوزهاي نسخه هاي قبل از XP براي کار با اين رسانه و استفاده از آن، حتماً بايد از نرم افزار مخصوص درايور اين رسانه کمک بگيرند.

7ـ متأسفانه DVD Player و DVD Drive هايي که از اين فرمت پشتيباني کنند، اندک هستند و مدل هايي هم که از اين فرمت پشتيباني مي کنند قيمت نسبتاً گران تري به ساير مدل‌ها دارند.

8ـ در کپي کردن مقدار زياد اطلاعات سرعت آن ، تنها و تنها نسبت به رسانه DVD+RW کم تر مي باشد.

9ـ قيمت بدون کارتريج اين رسانه از قيمت همتاهاي خودش نظير DVD-RW و DVD+RW گران تر مي باشد.

10ـ در رسانه DVD-RAM (با توجه به اين که هر دو رسانه يک ظرفيت داشته باشند) مدل کارتريج دار آن قيمتي معادل يک و نيم برابر قيمت همان رسانه از نوع بدون کارتريج را دارد.

نکته: قابليت بي نظيري که رسانه DVD-RAM را از ساير رسانه هاي همتاي خودش متمايز مي کند، قابليت آن به عنوان يک رسانه مطمئن ذخيره سازي اطلاعات محرمانه مي باشد، که در صورت محافظت دقيق و وسواس گونه از اين رسانه، به قول سازندگان آن تا 30 سال مي تواند عمر مفيد داشته باشد!!
DVD-RAM شامل 2 نسخه زير است، که هر کدام از نسخه ها، از مدل هايي تشکيل شده اند:

نسخه 1 ، (DVD-RAM 1.0)
* Single Side, Single Layer (2.58 GB)
* Double Side, Single Layer (5.16 GB)

نسخه 2 ، (DVD-RAM 2.0)
* Single Side, Single Layer (4.7 GB)
*‌ Double Side, Single Layer (9.4 GB)




DVD-R
اين مدل ، اولين نوع DVD بود كه شركت Pioneerدر پاييز سال 1997 ميلادي روانه بازار كرد و مورد تأييد DVD Forum قرار گرفت. جالب است بدانيد که DVD-R سازگارترين نوع DVD است که با بيش از 95 درصد DVD Player ها و DVD Drive ها سازگاري دارد و به همين دليل محبوب ترين نوع DVD در جهان مي باشد.

DVD-R شامل 5 گونه متداول زير است:
* DVD-R ، (DVD 5)
* DVD-R DL ، (DVD 9)
* DVD-RW ، (DVD 5)
* DVD-RW DL ، (DVD 9)
* DVD-R VR


 

DVD+R
گروه DVD+RW Alliance (براي تلفظ آن را به صورت دي وي دي پلاس آر دبليو آلينس بخوانيد) متشکل از مهندسين سخت افزار، الکترونيک و مهندسين نرم افزار که سازندگان دستگاه هاي ذخيره سازي نوري هستند ، مي باشد. اعضاي اين گروه عبارتند از:

1-Dell Computer Corp
2-HP (Hewlett-Packard Co.)
3-Mitsubishi Chemical Corp.
4-Pioneer Electronic Corporation
5-Royal Philips Electronics N.V.
6-Richoh Company, Ltd.
7-Sony Corporation
8-Thomson SA (RCA)
9-Yamaha Corp.

گروه DVD+RW Alliance در اواخر سال 1997 متولد شد. دليل ايجاد گروه اين بود که آنها ابتدا يک رسانه DVD با ظرفيت 2.8 GB ابداع نمودند، که مورد تأييد و تصويب DVD Forum قرا نگرفتند، در نتيجه تصميم گرفتند که خود گروهي به هم پيوسته به نام دي وي دي پلاس آر دبليو آلينس DVD+RW Alliance تشکيل بدهند. فعاليت آنها عملاً تا سال 2001 که توانستند فرمتي از رسانه DVD با ظرفيت 4.7 GB ايجاد کنند معلق بود. DVD Forum هيچگاه فرمت اين نوع DVD را تأييد نکرد و اين گروه مجبور شد به خاطر پيروي از قانون کپي رايت نام آن را DVD+R بگذارد. (بخوانيد دي وي دي مثبت آر يا دي وي دي پلاس آر). با وجود عدم پشتيباني DVD Forum از اين فرمت، DVD+R به يک فرمت بسيار محبوب تبديل شد و تمامي شرکت هاي سازنده DVD Drive و DVD Player به سرعت، وسايل و تجهيزاتي سازگار با اين فرمت را روانه بازار کردند.

از نکات جالب توجه در مورد فرمت پلاس (DVD+R/RW)بد نيست بدانيدکه :

• DVD Forum ابتدا فرمت DVD-R را به عنوان يک استاندارد معرفي کرد و سپس استاندارد DVD-RW را ارائه داد، اما DVD+RW Allianceابتدا DVD+RW را معرفي کرد و سپس استاندارد DVD+R را.

• اگرچه امروزه تمامي درايوهاي DVD و DVD Player ها که به صورت هيبريد (دو رگه) Hubrid Drives که از هر دو فرمت منفي و مثبت پشتيباني مي کنند و هر دو هم محبوبيت فراواني کسب کرده اند، ولي هنوز تا به الان استاندارد واحد و يکساني براي رسانه DVD Recordable به وجود نيامده است که اين ناشي از کوتاه نيامدن ابر قدرت‌هاي علوم کامپيوتر و الکترونيک در مقابل همديگر است، اين ابرقدرت ها همان صاحبان و اعضاي تشکيل دهنده 2 انجمن DVD Forum و DVD+RW Alliance مي باشند.

• اگرچه بعضي از اعضاي گروه DVD+RW Alliance همانندSony, Thomson, Philips, Pioneer در انجمن DVD Forum هم حضور دارند و از اعضاي اصلي آن مي باشند، اما فعاليت ها و مسؤليت هايي که در هر يک از انجمن ها دارند با هم متفاوت است و هيچ گونه ربطي به يکديگر ندارد.

DVD+R شامل 5 گونه متداول زير است:
* DVD+R ، (DVD 5)
* DVD+R DL ، (DVD 9)
* DVD+RW ، (DVD 5)
* DVD+RW DL ، (DVD 9)
* DVD+R VR



چه تفاوت هايي بين DVD RAM با DVD±RW وجود دارد؟
تفاوت هاي بسيار تكنيكي و تخصصي دارند كه واقعاً از حوصله اين مقاله خارج است، چه در مورد R و چه در مورد RW . اگر واقعاً برايتان اهميت دارد كه طرز كار همه آنها را درك كنيد، براي كسب اطلاعات دقيق تر به مقاله تكنولوژي DVD شماره 7، 8 و 9 ماهنامه مراجعه نماييد.

اما اگر بخواهيم به صورت تيتروار بعضي از آنها را به طور خيلي ساده و خلاصه بيان كنيم، بايد بگوييم:

1- DVD RAM و DVD-R/RWتوسط انجمن DVD Forum و DVD+R/RW توسط DVD+RW Alliance پشتيباني و حمايت مي شوند.

2ـ در بين همه اين مدل ها، مدل DVD-R/RW سازگاري بيشتري با اكثر دستگاه هاي پخش كننده DVD قديمي دارند، به خاطر اينكه اولين مدل DVD بودند كه وارد بازار شدند.

3ـ DVD RAM ها معمولاً براي مقاصد تجاري و صنعتي استفاده مي شوند و قيمت گران تري هم دارند، در حاليكه DVD-R/RW و DVD+R/RW بيشتر جنبه غير صنعتي دارند و براي مصارف كوچك و خانگي كاربرد دارند.

4ـ DVD RAM هميشه يك رسانه DVD Rewritable بوده است و دوام و پايداري بيشتري نسبت به DVD-RW و DVD+RW دارد.

5ـ اکثر مدل هاي دوربين هاي ديجيتالي فيلمبرداري DVD Camcorder با رسانه DVD-RW سازگاري بسيار بيشتري دارند تا رسانه هاي DVD+RW و DVD RAM.

6ـ براي ذخيره سازي و جمع آوري اطلات نه چندان حياتي و مهم از فرمت DVD-RW و DVD+RW استفاده مي کنند اما براي ذخيره اطلاعات مهم و بسيار حياتي هميشه از DVD-RAM استفاده مي شود.

DVD Video
در ابتدا DVD فقط به منظور ذخيره سازي فيلم هاي سينمايي و يا هرگونه فايل تصويري با كيفيت بالا استفاده مي شد كه در ابتدا نام آن Digital Video Disc بود كه بعدها با گسترش و فراگير شدن آن ، نام آن به Digital Versatile Disc يعني ديسك ديجيتال همه كاره تغيير پيدا كرد. مزايايي كه يك4.7 GB DVD Video دارد عبارتند از مدت زمان ذخيره سازي يك فيلم سينمايي به صورت جدول 3 :



معمولاً از نوع ( SP ( Standard Play براي ذخيره فيلم ها كه با روش فشرده سازي MPEG-2 تهيه شده اند، استفاده مي شود، دليل استفاده از اين نوع روش اين است كه DVD Video تهيه شده با تمامي ابزار پخش و ضبط DVD مانندDVD Player, DVD Recorder, DVD Drive, DVD Writer ها سازگاري داشته باشد و همه اين وسايل توانايي پخش آن را داشته باشند. در ادامه در مورد اين وسايل بحث خواهيم كرد.
ويژگي هاي يك DVD Video :
ذخيره يك فيلم سينمايي فرمت MPEG-2 با مشخصات جدول زير:


 

• پخش يك فيلم سينمايي در سه حالت Wide Screen, Scope, Pan
• فشرده سازي تصوير به نسبت 1 : 40 با استفاده از روش فشرده سازي MPEG-2
• استفاده از 8 زبان رايج براي فيلم كه اصطلاحاً به آن Sound Track مي گويند، فرمت هاي رايج براي اين فايل هاي صوتي عبارتند از:

1ـ Dolby Digital Surround Sound 5.1 Channel يا همان AC3
2ـ Dolby Digital Pro Logic
3ـ ( DTS ( Digital Theater System

• نمايش زيرنويس به 32 زبان مختلف ( كه زبان فارسي هم معمولاً پشتيباني مي شود)
• نمايش فيلم از زواياي مختلف دوربين (معمولاً اين ويژگي براي نمايش كنسرت ها به كار مي رود.)
• مصاحبه با عوامل سازنده فيلم شامل: بازيگران، تهيه كنندگان، فيلمبرداران، كارگردان و ...، نشان دادن قسمت هايي از پشت صحنه فيلم
• معمولاً DVD ها منويي زيبا دارند كه شما مي توانيد از روي آن، تنظيماتي نظير زبان اصلي پخش فيلم، استفاده از زبان مخصوص براي پخش زيرنويس براي فيلم و يا انتخاب سكانسي كه از قبل در منوي DVD قرارداده شده به منظور پخش فيلم از آن سكانس را انجام دهيد.

ساختار فايل ها در DVD Video
اگر يك DVD Video را در داخل درايو كامپيوتر قرار دهيد و به داخل آن نگاهي بياندازيد، عموماً 2 پوشه AUDIO_TS و VIDEO_TS را مشاهده خواهيد كرد. البته ممكن است شاخه هاي ديگري هم وجود داشته باشند كه شامل نرم افزارهاي پخش DVD باشند، ولي هميشه وجود ندارند.
شاخه AUDIO_TS مخصوص DVD Audio مي باشد و در DVD Video ها معمولاً خالي مي باشد.
در شاخه VIDEO_TS ، معمولاً يك سري فايل هاي به شكل زير مشاهده مي شود.


فايل هايي با پسوند IFO:
اين فايل ها كه مخفف Information مي باشند، فايل هاي راهنماي پخش DVD Video كه مشخص مي كنند كه در كدام قسمت فايل VOB ، فيلم اصلي (Main Movie) قرار دارد، در كدام قسمت فايل هاي صوتي و در كدام قسمت زيرنويس هاي فيلم. علاوه بر اين ، اين فايل تشكيل دهنده منوي DVD هم مي باشد، يعني بدون وجود اين فايل نمي توان منوي يك DVD را مشاهده كرد. اصلي ترين فايل اين خانواده VIDEO_TS.IFO نام دارد كه حاوي تمامي اطلاعات DVD Video مي باشد و در موقع پخش فيلم اين اطلاعات را در اختيار فايل اصلي فيلم يعني VIDEO_TS.VOB قرار مي دهد.

فايل هايي با پسوندBUP :
فايل هاي با پسوند BUP كه مخفف Backup مي باشد، فايل هاي يدكي و پشتيبان براي فايل هاي IFO مي باشند در صورتي كه فايل هاي IFO به هر دليلي قابل خواندن نباشند، اين فايل ها مورد استفاده قرار مي گيرند.

فايل هايي با پسوند VOB:
واژه VOB مخفف Video Object مي باشد و در واقع فايل هاي اصلي و تصويري يك DVD Video مي باشند، قاعده و ترتيب اين فايل ها از فرمول VTS_0X_X.VOB كه Xعددي صحيح بين 0 تا 9 مي باشد، در تغيير است. فايل اصلي تصويري DVD Video با نام VIDEO_TS.VOB شناخته مي شود كه خود اين فايل اطلاعات مورد نياز خود را از مهمترين فايل DVD Video به نام VIDEO_TS.IFO دريافت مي كند، كه در قسمت قبل به آن اشاره كرده بوديم. اين فايل يا VIDEO_TS.VOB ، ترتيب چيدمان فايل هاي تصويري را مشخص مي كند، يعني بدين صورت كه وقتي شما DVD Video را در داخل درايو قرار مي دهيد:

1ـ ابتدا تبليغ ها به نمايش در مي آيند،كه بسته به نوعDVD Video متفاوت مي باشند، جالب است بدانيد كه به هيچ وجه نمي توانيد از نمايش تبليغات جلوگيري كنيد و مجبور به ديدن آنها هستيد..

2ـ اگر از تكنولوژي Dolby Digital و يا DTS استفاده شده باشد، تبليغ اين فناوري نمايش داده مي شود.

3ـ در مرحله سوم هشدار قانون كپي رايت به منظور منع شما از تكثير كردن DVD نمايش داده مي شود.

4ـ و در مرحله چهارم منوي فيلم نمايش داده مي شود كه مطابق آنچه قبلاً گفته شد، منو با توجه به حجم DVD شامل گزينه هاي متفاوتي خواهند بود كه شما امكان انتخاب زبان گويش فيلم و همچنين زبان زيرنويس فيلم در صورتي كه در DVD گنجانيده شده باشد را داريد.

معمولاً فايل هاي VOB به ترتيب جدول زير قرار مي گيرند:

 


هيچ قانوني وجود ندارد كه اجبار كند فايل هاي اصلي فيلم DVD Video از چه شماره اي شروع شود، تنها راهي كه مي توانيد تشخيص دهيد فايل هاي اصلي فيلم (Main Movie) كدام ها هستند، حجم اشغال شده فايل ها مي باشد كه در جدول بالا مشخص شده اند، معمولاً فايل هاي اصلي حجم بزرگتري دارند و اگر در نوار وضعيت پنجره باز شده در درايو DVD نگاه كنيد مي بينيد كه معمولاً با مقدار 0.99 GB مشخص شده اند.

ويژگي فايل هاي VOB:
• در يك فايل VOB فايل هاي صدا، تصوير و زيرنويس طوري با يكديگر تركيب شده اند كه در هنگام پخش بتوان بين آنها به راحتي سوييچ كرد و يا زبان و صدا را به راحتي تغيير داد. در اصطلاح به اين حالت Multiplex مي گويند.

• فايل تصويري از نوع MPEG-2، فايل صوتي از نوع AC3 يا PCM و در بعضي مواقع حتي MP3 مي باشد. اين فايل هاي صوتي مي تواند صداهاي دوبله شده يك فيلم به چندين زبان باشد و يا يك صدا با كيفيت هاي مختلف همانند صداهاي Dolby Digital, DTS, Dolby Digital Pro Logic باشند.

• يك DVD Video مي توان حداكثر به 8 زبان دوبله شود و 32 زبان هم به صورت زيرنويس داشته باشد.

نكته1: اگر براي ذخيره يك فيلم بر روي يك DVD بخواهند تمامي اين قابليت ها را يكجا در اختيار شما قرار دهند، بايد از دي وي دي نوع Double Side, Double Layer كه اصطلاحاً DVD 18 ناميده مي شود استفاده كنند، كه معمولاً به خاطر هزينه سنگين آن، اين كار انجام نمي شود.
نكته2: اگر فيلم گرفته شده توسط دوربين ديجيتال فيلمبرداري توسط روش فشرده سازي MPEG-2، فشرده و متراكم نشوند، تقريباً هر يك ساعت فيلم خالص بدون هيچگونه تصرفي 17 گيگا بايت فضا اشغال مي كند كه بر روي هيچ DVD اي جا نخواهد گرفت و دانلود آن از اينترنت براي يك ارتباط معمولي همانند DSL 128 KB بيش از 36 ساعت طول خواهد كشيد!!!
نكته3: فايل اصلي يك DVD Video همان VIDEO_TS.VOB مي باشد كه اگر به هر دليلي آسيب ببيند، DVD Player ها به هيچ عنوان توانايي پخش آن DVD Video را نخواهند داشت. در نگهداري از DVD Video هاي خود کوشا باشيد.
نكته4: منوي DVD يك فايل تصويري مجزا از فيلم اصلي است كه در ابتداي فيلم پخش مي شود و امكانات مختلفي از قبيل تغيير زبان، تعيين زيرنويس و پخش قسمت هاي خاصي از فيلم و يا حتي مصاحبه با عوامل فيلم و پشت صحنه را در اختيار بيننده قرار مي دهد.
نكته5: معمولاً رسم بر اين است كه بر روي يك DVD-Video با ظرفيت 7 . 4 گيگا بايتي فقط 1 فيلم با فرمت MPEG-2 قرار دهند، اما بعضي مواقع شايد بتوانيد چنين DVD-Video هايي را پيدا كنيد كه بيش از 1 فيلم بر روي آن ذخيره شده باشد، اين كار معمولاً به ندرت انجام مي شود و قطعاً كيفيت فيلم افت زيادي خواهد داشت.
DVD Audio
رسانه DVD Audio با DVD Video تفاوت دارد، همان گونه كه VCD با Audio CD تفاوت داشت. البته اين روزها ديگر به ندرت مي توان اثري از DVD Audio ها يافت ولي بارزترين تفاوت آنها با Audio CD ها در كيفيت ضبط صدا و نمونه برداري مي باشد. در يك DVD Audio مي توان 80 دقيقه موسيقي با كيفيت بسيار بالا ضبط كرد.

براي اين كه به جزييات تفاوت هاي كيفيت هاي صدا پي ببريد و با انواع فناوري هاي صوتي بيشتر آشنا شويد، مي توانيد به آدرس هاي زير مراجعه كنيد:
http://electronics.howstuffworks.com/analog-digital.htm
http://electronics.howstuffworks.com/movie-sound4.htm
http://electronics.howstuffworks.com/movie-sound3.htm
 


مناطق توزيع DVD
به علت وجود قوانين حقوق مولفان، مصنفان و ناشران يا همان Copyright كه در اكثر كشورها رعايت مي گردد .
كپي كردن يك DVD Video به عنوان يك عمل غير مجاز يا جرم شناخته شده و پيگرد قانوني دارد. (قانون كپي رايت ضمانت اجراي بسيار بالايي دارد). از اين رو براي اينكه به راحتي نتوان DVD Video ها را كپي كرد، بر روي آنها طوري قفل گذاري مي كنند، كه هر DVD Video را در منطقه خاصي بتوان مشاهده كرد. اين مناطق عبارتند از:

منطقه صفر : (Region Free) ـ همه كشورهاي جهان
منطقه 1 : (Region 1) ـ ايالات متحده آمريكا و كانادا
منطقه 2 : (Region 2) ـ اروپا، ژاپن، خاور ميانه، آفريقاي جنوبي
منطقه 3 : (Region 3) ـ شرق و جنوب شرق آسيا، هنگ كنگ و تايوان
منطقه 4 : (Region 4) ـ استراليا، زلاند نو، مكزيك، آمريكاي مركزي و جنوبي
منطقه 5 : (Region 5) ـ اروپاي شرقي، هند، پاكستان، آفريقا و كره شمالي
منطقه 6 : (Region 6) ـ چين
منطقه 7 : (Region 7) ـ هنوز استفاده نشده
منطقه 8 : (Region 8) ـ مناطق بين المللي، آبهاي آزاد، كشتي ها، هواپيما ها



( RPC ( Regional Playback Control
سيستم RPC، يك سيستم محدود كننده جغرافيايي است كه توسط سازندگان دستگاه هاي DVD از هر نوع بر روي آنها قرار داده مي شود تا با توجه به نوع منطقه مورد استفاده، توانايي تماشاي DVD Video را داشته باشند. فرض كنيد شما يك DVD Video را از استراليا تهيه كرديد و با خودتان به ايران آورده ايد، آن را در DVD Player يا DVD Drive خودتان قرار مي دهيد، اما با كمال تعجب مشاهده مي كنيد، كه دستگاه شما قادر به پخش چنين فيلمي نيست، زيرا DVD-Video شما مربوط به منطقه 1 توزيع DVD است، ولي شما در منطقه 2 زندگي مي كنيد و در اين منطقه مي خواهيد اين فيلم را تماشا كنيد.براي حل اين مشكل معمولاً 2 راه پيش روي شما وجود دارد:

1ـ اگر از DVD Player براي تماشاي فيلم استفاده مي كنيد، سازنده آن به شما امكان داده كه RPC لخت افزار دستگاه خود را (Firmware) تا 5 مرتبه عوض كنيد، شما مي توانيد با خواندن دستور العمل نحوه تعويض RPC از روي دفترچه راهنما اقدام به تعويض RPC دستگاه DVD Player خود كنيد. بهتر است حالا كه داريد RPC را تعويض مي كنيد، مقدار آن را بر روي منطقه صفر قرار دهيد. (Region Free) تا از اين پس توانايي پخش تمامي DVD Video ها را داشته باشد.

نكته: امروزه تمامي دستگاه هاي DVD Player عموماً RPC را بر روي منطقه صفر(DVD Region Free) به طور پيش فرض تعيين مي كنند تا مشكلي براي كاربران پيش نيايد، اما اگر RPC دستگاه DVD Player شما بر روي منطقه صفر تنظيم نشده بود و قصد تغيير آن را داشتيد، اين را بدانيد كه فقط 5 بار مي توانيد آن را تغيير دهيد و تغيير پنجم به طور هميشگي بر روي دستگاه شما ذخيره خواهد شد و ديگر توانايي تغيير آن را نداريد.
2ـ اگر از DVD Drive و كامپيوتر براي تماشاي DVD Video استفاده مي كنيد، ديگر اين مشكلات را نخواهيد داشت،اكثر DVD Drive و DVD Writer ها به طور پيش فرض بر روي منطقه صفر تنظيم شده اند، البته اگر بر روي منطقه ديگري تنظيم شده باشند و به شما اجازه ديدن فيلم را ندهند، شما مي توانيد با تغيير RPC در محيط ويندوز مشكل خود را مرتفع كنيد كه در ادامه به چگونگي تغيير RPC در محيط ويندوز هم اشاره كرده ايم، ولي راه بسيار ساده تر استفاده از 2 نرم افزار SlySoft AnyDVD و DVD Region+CSS Free مي باشد، كه خودشان با ترفندهايي خاص اين مشكل را به راحتي حل مي كنند. لازم به توضيح است كه در شماره هاي گذشته Best Download ، اين 2 نرم افزار به طور كامل معرفي شده بودند و به صورت كامل و رجيستر شده هم در سايت ماهنامه و هم در CD هاي شماره هاي گذشته قرار داده شده بودند.
طريقه تغيير دادن RPC براي DVD Drive در ويندوز XP:
1ـ ابتدا وارد Control Panel شويد.

2ـ بر روي Administrative Tools دو بار كليك كنيد.

3ـ در قسمت Storage گزينه Disk Management را انتخاب كنيد.

4ـ اكنون درايوهاي شما در پنجره سمت راست به ترتيب نمايش داده مي شوند، در قسمت پايين پنجره سمت راست، DVD Drive خود را انتخاب و بر روي آن كليك راست كنيد و گزينه Properties را برگزينيد.

5ـ در پنجره ظاهرشده برگه DVD Region را انتخاب كنيد.

6ـ اگر در مستطيل جلوي گزينه Current Region، عبارت Not Selected به چشم مي خورد، به اين معني است كه DVD Drive شما به صورت پيش فرض بر روي منطق صفر تنظيم شده و يا در اصطلاح DVD Region Free مي باشد و قابليت پخش تمامي DVD-Video ها را دارد.

7ـ اگر منطقه RPC درايو شما بر روي منطقه صفر بود كه هيچ نيازي به تغيير ندارد، پنجره ها را ببنديد، اما اگر بر روي منطقه ديگري تنظيم شده بود، مي توانيد آن را بر روي منطقه مسكوني خودتان تنظيم كنيد و براي ذخيره تغييرات بر روي OK كليك كنيد.
مجدداً يادآوري مي كنيم فقط 5 بار مي توانيد RPC درايوتان را تغيير دهيد و تغيير پنجم به طور هميشگي بر روي دستگاه شما ذخيره خواهد شد و ديگر توانايي تغيير آن را نخواهيد داشت.

( CSS ( Content Scrambling System
سيستم CSS يك سيستم رمزگذاري 40 بيتي است كه از الگوريتم سايفر (Cipher Algorithm) استفاده مي كند. سايفر نوعي سيستم رمزگذاري متشكل از مجموعه حروف و اعداد است که مامورين سياسي براي ارتباط سري با کشور خود از آنها استفاده مي کنند و درک مفاهيمشان بدون در دست داشتن کليد ممکن نيست.
هدف از به وجود آوردن اين تكنيك رمزگذاري ، جلوگيري از پخش و تكثير غير مجاز DVD ها بود ، كليد رمزگذار CSS در چهار مرحله زير عمليات رمزگذاري بر روي يك DVD را انجام مي داد و براي پخش اين DVD قفل‌دار، DVD Player هم توسط كليد رمزگشا هر 4 مرحله را رمزگشايي مي كرد. اين چهار مرحله عبارتند از:

1ـ Authentication
2ـ Title Keys
3ـ Disc Keys
4ـ Player Keys

اين سيستم رمزگذاري در سال 1996 معرفي شد و مجوز استفاده از آن براي استوديوهاي موسيقي و فيلم سازي كه محصول نهايي خود را بر روي DVD-Audio و DVD-Video عرضه مي كردند صادرشد. علاوه بر آنها سازندگان و توسعه دهندگان DVD Player ها و DVD Drive ها نيز مجوز استفاده از كليد رمزگشاي CSS كه با نام CSS Decryption Key شناخته شده است، به دست آوردند تا بتوانند سيستم و كليد رمزگشا را در دستگاه هاي پخش DVD و همچنين DVD Drive ها قرار دهند تا بتوانند اين DVD هاي قفل دار را پخش كنند.
و اما در کامپيوترها اين مشکل هم باز توسط 2 نرم افزار SlySoft AnyDVD و DVD Region+CSS Free که در بخش قبلي به آن اشاره کرده بوديم به راحتي قابل حل مي باشد

راهنماي خريد DVD Writer
مدل اينترنال يا اكسترنال: با توجه به نوع كاربردتان مشخص كنيد كه داخلي (Internal) مي خواهيد يا خارجي (External). مدل داخلي در 3 نوع EIDEوSCSI و SATA عرضه مي شود و مدل خارجي در 2 نوع USB 2.0 و FireWire 800.
البته چيزي كه بديهي است گران تر بودن ( بيش از 2 برابر ) مدل هاي خارجي نسبت به مدل هاي داخلي است.

به اين نكته توجه داشته باشيد كه DVD Writer يا DVD Burner اي كه قصد خريد آن را داريد از رسانه هاي DVD زيرپشتيباني كند:
DVD-R/RW, DVD-R/RW DL, DVD+R/RW, DVD+R/RW DL, DVD RAM

اگر DVD Writer شما توانايي پشتيباني رايت DVD-RAM را هم داشته باشد ، به آن DVD Multi Recorder يا Super Multi Drive مي گويند كه در بازار ايران 3 مدل معروف Multi Recorder زير قابل تهيه هستند:
1-Pioneer DVR-A10XL (A,B,C)
2-LG GSA-4167
3-NEC 4550

براي خريد يك مدل DVD Writer داخلي بودجه اي بين 50 تا 140 هزارتومان لازم است، در حال حاضر ارزان ترين مدل Liteon و گران ترين مدل Plextor است كه قيمتي حدود 130 الي 140 هزار تومان دارد. البته اين نكته هم قابل ذکر است که هر ارزاني بي حکمت و هر گراني بي علت نيست.

نكته1: توصيه ما به شما اين است كه اگر قصد خريد يك DVD Writer را داريد، سعي كنيد مدل Multi Recorder را تهيه كنيد. 15 الي 20 هزارتومان هزينه بيشتر مسلماً ارزش اين فناوري را دارد، مطمئن باشد. DVD writer منتخب ما Pioneer DVR-A10XL مي باشد.



نكته2: هميشه سعي كنيد نسخه DVD Firmware (نرم افزار داخل DVD Drive) را به روز نگه داريد، اين مسئله به اين دليل اهميت دارد كه ممكن DVD Drive شما مثلاً از سرعت 16X پشتيباني مي‌كند، ولي رسانه هاي DVD بعد از زمان عرضه DVD Writer شما به بازار عرضه مي‌شوند، كه DVD Writer شما قابليت سازگاري با آنها را ندارد ، كه در صورت آپديت كردن DVD Drive Firmware اين سازگاري به وجود مي آيد. معمولاً شركت سازنده DVD Drive هر فصل نسخه جديد Firmware سخت‌افزارهاي توليدي خود را به صورت رايگان بر روي سايت اصلي خود قرار مي دهد.
راهنماي خريد DVD Player
DVD Player ها دستگاهي هستند كه فقط توانايي پخش DVD را دارند و امكان رايت بر روي آن ندارند ، اين دستگاه ها مستقيماً به تلويزيون متصل مي‌شوند و كيفيت صدا و تصوير بي نظيري را براي شما به ارمغان مي‌آورند.

مواردي كه بايد در خريد DVD Playerبه آنها دقت كنيد:
1ـ پشتيباني از رسانه CD هاي زير:
Audio CD, Video CD, Super Video CD, JPEG CD, MP3, WMA, WMV, DivX Video

2ـ پشتيباني از رسانه DVD هاي زير:
DVD+R, DVD+R DL, DVD+RW, DVD-R, DVD-R DL, DVD-RW

3ـ پشتيباني از فناوري هاي صوتي زير:
Dolby Digital Surround Sound 5.1 Channel, Dolby Digital Pro Logic, DTS,
DTS 96/24, CPRM, Multi Channel MP3

4ـ داشتن خروجي صداي ديجيتال (S/PDIF)

نكته: اگر به اندازه كافي بودجه داريد تا براي خريد يك DVD Player خوب هزينه كنيد، مدلي از آن را تهيه كنيد كه توانايي ضبط بر روي DVD را هنگام مشاهده تلويزيون و يا از طريق ماهواره را داشته باشد كه در اين صورت اصطلاحاً به آن DVD Recorder مي گويند. يك مدل از DVD Recorder كه از تمامي فرمت ها پشتيباني مي كند و به انواع فناوري ها مجهز است، مدل Pioneer DVR-530H-S مي باشد و جالب است بدانيد که در داخل آن يک هارد ديسک 80 گيگابايتي به منظور ذخيره سازي فيلم قرار داده اند. البته قيمت اين مدل ها بسيار گران است.


شكل 8 : تصويري از Pioneer DVR-530H-S

نرم افزارهاي معتبر و رايج در رابطه با DVD
نوع اول : DVD Copiers
اگرچه كپي كردن يك DVD Video جرم محسوب مي شود و در كشورهاي ديگر پيگرد قانوني دارد و بدانيد اين قانون در كشورهايي كه قانون كپي رايت را پذيرفته اند، ضمانت اجرايي بالايي دارد. به هر حال به ما ارتباطي پيدا نمي كند، چون ما در ايران فعلاً از اين قانون پيروي نمي كنيم، شما با خيال راحت مي توانيد از نرم افزارهاي كه در ادامه اسامي آنها آورده شده است، براي كپي كردن DVD Video خود استفاده كنيد. لازم به ذكر است كه تمامي اين نرم افزارهاي معرفي شده از نرم افزارهاي پركاربرد در جهان مي باشند و به صورت كامل و رجيستر شده در CD هاي همراه ماهنامه در شماره هاي گذشته ارائه شده بودند. نکته مهم و قابل بيان اين است که تمام نرم افزارهاي زير به جز SlySoft CloneCDکه توانايي کپي کردن هر نوع CD و DVD را دارد، ساير نرم افزارها فقط توانايي کپي کردن DVD Video ها را دارند.

01- 1Click DVD Copy
02- Apollo DVD Copy
03- SlySoft CloneCD
04- CloneDVD (Slysoft)
05- Clone DVD (X Studios)
06- DVD-Cloner III
07- PowerDVD Copy
08- DVDFab Platinum
09- DVD Wizard Pro
10- InterVideo DVD Copy Platinum

نوع دوم : DVD Rippers
فرمت تصويري DivX (MPEG-4) كه مخفف Digital Video Express مي باشد، در اوايل سال 2000 ميلادي توسط شركت DivX Networks Inc به وجود آمد. هدف از به وجود آمدن اين فرمت عبارت بود از:
تبديل كردن DVD Video كه به صورت MPEG-2 فشرده سازي و كدگذاري شده بود به فرمتي قابل انتقال بر روي اينترنت، و داشتن كيفيتي قابل قبول، ( اگرچه هيچ گاه به DVD Video نمي رسد ) ولي باز مقرون به صرفه است. اين فرمت مزاياي بسيار زيادي دارد كه در شماره 13 ماهنامه به طور اجمالي مورد بررسي قرار گرفت. در اينجا فقط سعي كرديم يك ياد آوري داشته باشيم. در ادامه 10 نرم‌افزار برتري كه كار آنها تبديل DVD Video به فرمت بسيار محبوب DivX است را معرفي مي كنيم. مجدداً خاطر نشان مي‌شويم كه تمامي اين نرم‌افزارها از برترين هاي خانواده خود در سراسر دنيا هستند و به صورت كامل و رجيستر شده در CD هاي همراه ماهنامه در شماره هاي گذشته ارائه شده بودند.

01- #1 DVD Ripper
02- Ahead DVD Ripper
03- AoA DVD Ripper
04- Ashampoo Movie Shrink & Burn
05- CloneDVDmobile
06- Dr. DivX
07- DVD Decrypter
08- DVD Shrink
09- ImTOO DVD Ripper
10- InterVideo DVD Copy Platinum

نكته: قسمت اصلي يك DVD Video فايل VIDEO_TS.VOB مي باشد كه اگر به هر دليلي آسيب ببيند، DVD Player ها به هيچ عنوان توانايي پخش آن DVD Video را نخواهند داشت.

اما علاوه بر اين فايل، فايل ديگري به نام VIDEO_TS.IFO هم وجود دارد و در صورتي كه اين فايل ( VIDEO_TS.IFO ) آسيبي ببيند نرم افزارهاي DVD Ripping توانايي Rip كردن DVD Video ها را نخواهند داشت، همچنين اگر به هر دليلي اين دو فايل در كنار يكديگر و با هم در يك پوشه وجود نداشته باشند، بازهم هيچ كدام از نرم افزارهاي خانواده DVD Ripper ها هيچ گونه كمكي نمي توانند به شما بكنند و عملاً فاقد ارزش خواهند بود.
به عبارت بسيار ساده تر اگر مي خواهيد يك DVD Video را به فرمت محبوب DivX تبديل كنيد، فقط 2 راه پيش رو داريد:

1ـ از DVD Video خود يك فايل ايميج به صورت ISO DVD به صورت مجازي ايجاد كنيد و از روي آن عمليات DVD Ripping را انجام دهيد.

2ـ پوشه VIDEO_TS را به صورت كامل بر روي هارد ديسك خود كپي كنيد و سپس از روي هارد عمليات DVD Ripping را انجام دهيد. در هر 2 روش نكته مهم اين است كه براي انجام عمليات DVD Ripping ، بايد وحتماً 2 فايل VIDEO_TS.VOB و VIDEO_TS.IFO در تمام مدت عمليات كنار همديگر قرار داشته باشند.
در ضمن مجدداً يادآوري مي كنيم ، همواره در نگهداري از DVD Video هاي خود كوشا باشيد.

اما در اينجا بد نيست به اين نكته هم اشاره شود كه دلايل محبوبيت DivX دركنار DVD Video عبارتند از:
1ـ داشتن حجم پايين نسبت به DVD5 و DVD9 و در عين حال داشتن كيفيت قابل قبول، براي همين است كه تمام كشورهايي كه از اينترنت پر سرعت بهره مي برند براي انتقال فيلم در اينترنت از اين فرمت استفاده مي كنند.

2ـ شما بر روي يك DVD5 ، مي توانيد حداكثر يك فيلم با فرمت MPEG-2 ضبط كنيد ، اما به صورت DivX بر روي همان DVD5 مي توانيد 6 فيلم با كيفيت قابل قبول ( اگرچه به خوبي DVD Video نيست ) ذخيره كنيد.

3ـ اكثر DVD Player هايي كه در حال حاضر توليد و روانه بازار مي شوند از فرمت DivX پشتيباني مي كنند، نمونه هاي بسياري از آنها را در كشور خودمان مي توانيد پيدا كنيد.

4ـ محبوبيت اين فرمت به قدري زياد است، كه اكثر دوربين‌هاي ديجيتال فيلمبرداري قابليت اين را هم دارند كه مستقيم به صورت فرمت DivX تصويربرداري كنند و به كامپيوتر انتقال دهند.

نوع سوم : DVD Burners
اين سري نرم‌افزارها به منظور درست كردنData CD, Data DVD, VCD, SVCD, DVD Video, DivX Video و به طور كلي ايجاد CD,DVD سفارشي به كار مي روند. معرفي نرم‌افزار Nero به طور مختصر و مفيد در شماره 11 ماهنامه انجام گرفته است ، مي توانيد براي به دست آوردن اطلاعات تكميلي تر به آن مراجعه كنيد.

01- Roxio Easy Media Creator
02- CyberLink Power2Go
03- Pinnacle Instant CD/DVD
04- Burn & Go
05- NTI CD & DVD Maker
06- CD-Mate
07- Nero Burning ROM
08- Alcohol 120%
09- Virtuosa Gold
10- Ulead DVD Movie Factory

نوع چهارم : DVD Players
اين گونه نرم‌افزارها هم براي پخش DVD Video در كامپيوتر مورد استفاده قرار مي‌گيرند، اگر مايل به دانستن قابليت ها و ويژگي‌هاي هر كدام هستيد، مي توانيد به سايت معتبر Top Ten Reviews مراجعه كنيد، نرم افزارهاي زير هم مشابه خانواده‌هاي قبلي به صورت كامل و رجيستر شده در CD هاي همراه ماهنامه در شماره‌هاي گذشته ارائه شده بودند.

01- Cyberlink PowerDVD Deluxe
02- InterVideo WinDVD Platinum
03- DirectDVD Pro
04- CinePlayer Surround
05- DVD X Player
06- BlazeDVD
07- RioDVD
08- JetAudio Plus VX
09- Magic DVD Player
10- Ulead DVD Player

سخن پاياني :
اگرچه نتوانستيم به تمامي نكات ريز و درشت و جزييات DVD اشاره كنيم ، اما باور كنيد شايد بتوان در مورد آنها بيش از 1000 صفحه مطلب و چه بسا يك كتاب بسيار قطور نوشت ، اما سعي كرديم به نكاتي اشاره كنيم كه به درد شما بخورد. اين كه حالا مثبت يا منفي با دي وي دي رم از لحاظ ساختار و فن آوري چه فرقي دارند ، زياد مهم نيست و به درد من و شما نمي خورد ، ولي اين مهم است كه DVD Drive شما از هر سه فرمت پشتيباني كند. اين كه تعصب داشته باشيد كه حتماً از يك فرمت مثل DVD+R استفاده كنيد ، و روي اين موضوع تأكيد داشته باشيد كه مثبت از منفي بهتر است! چه كمكي به شما مي كند و يا چه دردي از شما دوا مي كند؟ سعي كنيد از اين نعمت هاي خدادادي ( كه واقعاً شايد بعضي افراد روزي در آرزوي داشتن شان شب‌ها را به صبح مي رسانند ) نهايت استفاده را ببريد. هيچ وقت فراموش نكنيم ، سال‌هاي نه چندان دوري را، زماني كه براي خريد يك DVD ROM مدل ارزان قيمت ، بايد بيش از 70 هزار تومان هزينه مي كرديد.

منابع و مراجع مورد استفاده در نگارش اين مقاله:
در نگارش اين مطلب كه واقعاً حاصل مطالعه ، درك عميق ، ترجمه و تلخيص بيش از 200 صفحه تخصصي بود،كمك همکارانم در هيئت تحريريه و همچنين عشق به خوانندگان بود كه باعث شد ، تا مقاله به سرانجام برسد. نتوانستم تمامي مطالب را عنوان كنم، زيرا واقعاً نه مقدور بود و نه اين مقاله ظرفيت آن را داشت. اما آدرس منابع را برايتان مي نويسم، اگر دوست داشتيد دانش خود را در مورد DVD و موارد مربوط به آن گسترش بدهيد، حتماً به آنها سر بزنيد. مطمئن باشيد در رابطه با DVD و ساختار پيچيده آن خيلي به شما كمك خواهند كرد. اميدوارم هميشه موفق باشيد.
+ نوشته شده در  دوشنبه سیزدهم آبان 1387ساعت 8:56  توسط محسن  | 

پلاسما یا Lcd مسئله این است

پلاسما یا Lcd مسئله این است
 

شاید زمانی که دو تلویزیون LCD و پلاسما را در کنار هم ببینید ، متوجه تفاوت بین آن دو نشوید ، چون به هر حال هر دو مدل صفحه تخت هستند ، اما حقیقت این است که برای ساخت این دو ، از دو فناوری متفاوت استفاده شده است . این دو استاندارد تلویزیونی صفحه تخت برای خود مزیت هایی دارند ، اما تفاوت هایی هم بین آنها وجود دارد . و اما این تفاوت ها چیست و آیا بین این دو ، انتخاب بهتر کدام است؟

● تفاوت بین فناوری های LCD و پلاسما

شاید ظاهر تلویزیون های LCD و پلاسما مشابه هم باشند ، اما شباهت آنها در صفحه تخت و مدل باریک شان خلاصه می شود. تلویزیون های پلاسما همانطور که از نامشان بر می آید، از ماتریسی از سلولهای کوچک گاز پلاسما تشکیل شده اند که از طریق ولتاژهای الکتریکی خاصی برای ایجاد تصویر استفاده می کنند . تلویزیون های LCD ( صفحه نمایش کریستال مایع ) همانند ساندویچ هایی از جنس کریستال مایع هستند که بین دو صفحه شیشه ای محصور شده اند . تصاویر از طریق شارژ الکتریکی متفاوتی که به کریستال ها وارد می شود ، ایجاد می شود . هر کدام از این فناوری ها نقاط ضعف و قدرت خاص خودشان را دارند که در ادامه به آنها اشاره خواهیم کرد.
آیا تفاوتی بین کیفیت تصویر بین تلویزیون های پلاسما و LCD و تلویزیون های CRT معمولی وجود دارد ؟
اینکه پشت صفحه نمایش چه اتفاقی می افتد برای ما مهم نیست ، بلکه نحوه عملکرد تلویزیون از اهمیت بیشتری برخوردار است . از این لحاظ هر دو تلویزیون LCD و پلاسما تصاویر فوق العاده ای ایجاد می کنند ، اما با این حال بسیاری از طرفداران سینما های خانگی و گیم بازها همچنان معتقدند تلویزیون های CRT تصاویر بهتری دارند ( در صورتی که جدید ترین تلویزیون های پلاسما مدل های خوبی هستند و تلویزیون های LCD نیز از نظر کیفیت در حال پیشرفت سریعی هستند ).
همین متخصصین سینمای خانگی به شما خواهند گفت برای سینماهای خانگی ساده ، تلویزیون های پلاسما کمی بهتر از LCD ها هستند . علت آن هم این است که تلویزیون های پلاسما می توانند رنگ سیاه را بهتر از LCD ها نمایش دهند که در نتیجه کنتراست و جزئیات بهتری در سریال ها و فیلم هایی که در فضای تیره تر و یا شب فیلمبرداری شده اند نمایش داده می شود . طبیعت فناوری LCD به گونه ای است که نور پس زمینه از میان لایه های LCD می درخشد ، در این حالت رسیدن به رنگ سیاه کامل کمی دشوار است ، چون همیشه بین پیکسل ها جذب نور وجود دارد. البته این حالت با ساخت هرنسل جدید از LCD ها ، بهبود می یابد.

● پلاسما چه مزیتی نسبت به LCD دارد ؟

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

● LCD چه مزایایی نسبت به پلاسما دارد ؟

تلویزیون های LCD علاوه بر رقابت بر سر قیمت با پلاسما ها ، در چندین بخش مهم نیز برتری دارند. LCD ها وضوح بالاتری نسبت به پلاسماهایی با ابعاد مشابه دارند ، که به معنای تعداد بیشتری پیکسل روی صفحه نمایش است . اگر شما از جمله افرادی هستید که نسبت به کیفیت تصویر حساسیت دارید و می خواهید تمام پیکسل های یک فیلم با وضوح بالای۱۰۸۰i/p را پیکسل به پیکسل ببینید ( البته به شرطی که دیگر امکاناتتان نیز این امکان را به شما بدهند )، در این صورت تلویزیون های LCD انتخاب شما خواهند بود. البته تلویزیون های پلاسما درجه یک هم می توانند فیلم های ۱۰۸۰P را نمایش دهند ، در این صورت انتخاب خیلی ساده نخواهد بود.
تلویزیون های LCD مصرف برق کمتری دارند و طبق بررسی ها در حدود ۳۰ درصد کمتر از پلاسما برق مصرف می کنند. LCD ها پر نور تر از پلاسما ها با ابعاد مشابه هستند که در این صورت هم می توان به راحتی تلویزیون را هم روی دیوار نصب کرد و هم هنگام رفت و آمد آن را مشاهده کرد.
کارشناسان معتقدند تلویزیون های LCD عمر مفید بیشتری نسبت به پلاسما ها دارند. این مساله در مورد مدل های قدیمی تر پلاسما صحیح بود ، این مدل ها نیمی از درخشش تصویر خود را بعد از ۲۰ هزار ساعت کار ، از دست می دادند. در نسل جدیدتر پلاسما ها این عدد بین ۳۰ هزار تا ۶۰ هزار ساعت رسیده در صورتی که در تلویزیون های LCD، عمرمفید ۶۰ هزار ساعت تضمین شده است . شاید شنیده باشید که تلویزیون های پلاسما مشکل سوختن پیکسل ها را دارند ، که البته این مشکل معمولا بین LCD ها به چشم نمی خورد. زمانی بیشتر این اتفاق می افتد که تصویری برای مدت طولانی روی صفحه بماند و باعث می شود سایه آن تصویر کم کم بسوزد. البته فناوری ساخت پلاسما ها بهتر شده و در مدل های جدید تر به علت افزودن امکاناتی مانند محافظ های صفحه نمایش این مشکل کمتر دیده می شود ، اما همچنان این مشکل وجود دارد . بعد از چند روز استفاده ، تصویر سوخته شده محو می شود و دیگر دیده نمی شود.

● کدامیک نسبت به هزینه پرداخت شده ، مزیت بهتری دارند : پلاسما یا LCD ؟

اگر می خواهید تلویزیونی با صفحه نمایش بزرگ بگیرید ، ( مثلاَ ۵۰ اینچ به بالا) پیشنهاد ما انتخاب مدل های پلاسما است. پلاسما ها نسبت به قیمتشان کیفیت بهتری دارند، و با اینکه وضوح تصویر LCD ها بالاتر است ، اما همچنان کیفیت تصویر پلاسما ها بهتر است. نکته قابل توجه دیگر هنگام خرید تلویزیون های LCD و پلاسما ، داشتن TV Tuner یا تنظیم کننده تصویر است . بسیاری از مدل ها تیونر آنالوگ دارند، که برای تنظیم مدل های با صفحه نمایش بزرگ ، کار بسیار دشواری است . بهتر است اگر می توانید مدلی HD Tuner تهیه کنید.
اما اگر تلویزیونی با صفحه نمایش های کوچکتر می خواهید ( ۱۵ تا ۴۲ اینچی ) ، LCD انتخاب بهتری است. و بهترین نکته هم این که قیمت تلویزیون های LCD مرتب در حال پایین آمدن است.


منبع : ماهنامه تحلیلگران عصر اطلاعات
+ نوشته شده در  دوشنبه سیزدهم آبان 1387ساعت 8:54  توسط محسن  | 

چگونه می‌توانیم تا حدی از سر و صدای کامپیوتر خود بکاهیم

کم کردن سر و صدای کامپیوتر میتواند خیلی سخت باشد زیرابیشتر سر و صدای کامپیوتر ناشی از دو قطعه اصلی سیستم یعنی هارد دیسک و فن سیستم میباشد که جزو قطعات حیاتی سیستم هستند و در تمام مدتی که شما با سیستم کار میکنید آنها نیز ناچار به کار کردن هستند اما شما میتونید با کارهای جزئی سیستم خود را کم صدا تر کنید.
● پیچها را سفت کنید:
اگر یک پیچ که کاملا سفت نشده باشد یا کیس به خوبی بسته نشده باشد میتواند یک سیستم کاملا ساکت را به سر صدائی همانند ماشین چمن زنی(!) تبدیل کند. مطمئن شوید که تمام کارتها محکم در اسلاتهای خود بسته شده باشند و تمام کابل ها را در جای ایمنی محکم کنید و مطمئن شوید که کیس خود را در جائی خوبی در اطاق قرار داده اید. متاسفانه ممکن است پس از اتمام این کارها متوجه شوید که طراحی ضعیف کیس باعث ایجاد سر و صدا گشته است. اگر کیس شما نیز از اینگونه کیس ها است شما میتوانید با استفاده از یک بسته نوسان گیر (vibration dampening kit) مانند Dynamat`s Xtreme Computer Kit به سر و صدای سیستم خود را کاهش دهید. برای اطلاعات بیشتر میتوانید به سایت
کد:
www.dynamat.com
مراجعه کنید.
اگر سیتم شما روی میز چوبی، کف پارکت یا هر جنس سخت دیگری است شما میتوانید موس پد های قدیمی خود را بریده و زیر پایه های کیس قرار داده و از ارتعاش سیستم جلوگیری کنید و به این وسیله هزینه ای را که برای خرید کیت لرزه گیر کنار گذاشته اید صرفه جوئی کنید (این کیت در آمریکا ۳۰ دلار قیمت دارد)
● فن سیستم:
یکی از راهها برای اینکه سر و صدای فن خود را کم کنید اینست که سیستمی را انتخاب کنید که نیازی به محصولات شرکت AMD نداشته باشد تا بتوانید از فن کوچکتری برای cpu خود استفاده کنید همچنین میتوانید از فنهای مرغوبتر و کم سر و صدا تر استفاده کنید. البته قبل از تعویض فن دقت کنید فن جدید به انداه فن قبلی سیستم شما را خنک کند.
روشهای زیادی به منظور کم کردن سر وصدا ناشی از کارکردن کامپیوتر یا رایانه اتان وجود دارد یکی از معمولترین ‌آنها خرابی فن یا پنکه ها داخل کیس کامپیوتر است ممکن است فروشنده کامپیوتر فکر کرده شما می خواهید ۲۴ ساعت از کامپیوتر خود استفاده کنید و برای همین ۳ تا ۴ فن اضافه به کیس شما نصب کرده است و شما مجبورید سر وصدا زیادی فن ها را تحمل کنید!!!!
● هارد دیسک:
هر وسیله ای که با سرعت ۷۲۰۰ دور در دقیقه دوران کند به خودی خود سر و صدا ایجاد میکند (چرخهای یک ماشین وقتی که با سرعت حرکت میکند حداکثر ۵۰۰ دور در دقیقه میزند!). بهترین راه برای ساکت کردن یک هارد دیسک پر سر و صدا استفاده از عایقهای صوتی است. برای مثال Molex`s SilentDrive یک جعبه پلاستیکی است که شما میتوانید هارد خود را درون آن قرار دهید. و این جعبه پلاستیکی مانع از انتشار صدای هارد دیسک میشود.(New England Digital ) به آدرس (
کد:
www.nedcomp.com)یکی
از شرکتهائی است که این جعبه ها راتولید میکند.دیسکهای سخت در هنگام خواندن و نوشتن مقداری سر و صدا تولید میکنند. برای کم کردن این سر و صداها بطور مرتب هارد خود را defrag کنید در بیشتر نسخه های ویندوز از مسیر Start, Programs, Accessories, System Tools, Disk Defragmenter استفاده کنید.این کار سرعت دسترسی به فایلها رابیشتر کرده و باعث بهره وری بیشتر سیستم شما میشود.
به گوش رسیدن صدای هارد در هنگامی که در حال خواندن چیزی از روی هارد و یا نوشتن بر روی آن نیستید نمایشگر آن است که RAM سیستم شما پائین است و احتیاج به ارتقا Ram خود دارید. در هنگامی که ram سیستم شما پر میشود ویندوز اقدام به نوشتن اطلاعات اضافی بر روی هارد دیسک شما میکند. با خرید یک ram دیگر هم سرعت خود را بالا برده و هم صدای سیستم خود را کم کنید.
● مکان قرار گیری سیستم:
همانطور که در بالا اشاره شد بعضی از صداها به دلیل محل قرار گرفتن کامپیوتر میتواند باشد در مورد محل کامپیوتر سعی کنید به نور محیط و میزان سر و صدا بیشتراهمیت بدهید و نه زیبائی آن.
● رفع اشکال در XP
اگر از سیستم عامل XP استفاده می کنید و نگران از دست دادن اطلاعات موجود هستید یا اگر سیستم شما دچار مشکلی شده که نیازمند راه اندازی (booting up) است، CPR، این یوتیلتی کوچک تحت سیستم بازیاب XP به همراه تعدادی فایل راه انداز، مشکلات سیستم را مشخص می کند.
اما دلیل اصلی مالکیت CPR به XP، یک CD است که به عنوان دیسک احیاگر برای سیستم های به هم ریخته XP کاربرد دارد.
● مشکلات بهبود یافته
CPR تحت سیستم بازیاب XP کار می کند. مشخصه مهمی که به شما امکان می دهد تا مشکلات را مشخص یا این نقاط را بازیابی کنید.
برخلاف XP که نقاط بازیابی را دوباره نویسی می کند، CPR برای XPدر ابتدای نصب برنامه یک مشخصه را به صورت دائمی ذخیره می کند.
این مشخصه به همراه فایل های راه انداز سیستمی مانند ntldr، mbrوboot-ini هستند که سیستم بازیاب XP در ذخیره کردن آنها غفلت می کند.
هرگاه که شما شروع به نصب برنامه های دیگر می کنید، CPR در XP نقطه مشخصه را قبل از هر تنظیم یا نصب برنامه اجرایی، ایجاد می کند. این نرم افزار هر تک برنامه ای را که باید نصب شود یا برای ایجاد مشخصه به گزینه ها ارجاع شود، تشخیص می دهد. این مسئله بویژه در زمانی که مشکلات سیستمی در نصب نرم افزار به وجود می آید،موثر واقع می شود.
● احیای کامپیوترهای شخصی بدون راه انداز
بزرگترین قدرت CPR، توانایی بازیابی سیستم های بدون راه انداز XP است. سیستم شما بدون CPR نیازمند فرمت مجدد درایو و نصب مجدد نرم افزار است. اما CPR امکان راه اندازی سیستم را در برنامه خط فرمان،دسترسی به سیستم بازیابی و اطلاعات کامپیوتر فراهم می کند.
در اکثر اوقات، شما قادر به بازیابی کامپیوتر بدون راه انداز به حالت قبلی آن هستید. اگر این امر امکان پذیر نباشد، CPR امکان انتقال اطلاعات به صورت off line را از سیستم به دیسک ایجاد می کند.
اگر خواستار بهبود و محافظت از اطلاعات خود تحت ویندوز XP هستید یا اگر سعی می کنید سیستم به هم ریخته ای را به حالت اولیه اش برگردانید، CPR می تواند انتخاب خوبی باشد. این نرم افزار ممکن است کار زیادی انجام ندهد. اما می تواند منجی حقیقی سیستم شما باشد.

آفتاب
+ نوشته شده در  دوشنبه سیزدهم آبان 1387ساعت 8:52  توسط محسن  | 

آشنايي با شبکه‌هاي نسل چهارم ‏موبايل

آشنايي با شبکه‌هاي نسل چهارم ‏موبايل
رشد سيستم‌هاي تلفن سيار، افزايش كاربران اينترنت و ‏بالا رفتن انتظار و نيازهای کاربران، مانند تقاضاي ‏دسترسي به اينترنت با كيفيت بالا از طريق سيستم‌هاي ‏بي‌سيم، منجر به طراحي سيستم‌هايي شده است كه قادر به ‏برآورده كردن اين نيازها باشند.

کاربران سرويس‌هاي ‏مخابراتي در آينده، ترجيح مي‌دهند که سرويس‌هاي مشابهي ‏را که از شبکه‌هاي ثابت دريافت مي‌کنند از يک محيط ‏بي‌سيم نيز در اختيار داشته باشند. البته انتظار ‏نمي‌رود که عملکرد بهتر را قرباني حرکت‌پذيري بيشتر نمايند ‏چراكه آنها در هرصورت از ابزارهاي مخابراتي ساکن هم ‏استفاده خواهند کرد. بنابراين بهترين راه‌کار اين ‏است‌که سيستم‌هاي بي‌سيم با شبکه‌هاي ثابت مجتمع شوند، ‏به همين منظور شبکه‌هاي بي‌سيم به سرعت در حال تکامل و ‏حرکت به سمت شبکه‌هاي تماما" ‏IP‏ مي‌باشند.‏

شبکه‌هاي تلفن قديمي (شبکه‌هاي سلولي نسل دوم) مانند ‏GSM، که فقط براي انتقال صوت مورد استفاده قرار ‏مي‌گيرند، ذاتا" داراي تکنولوژي سوئيچ مداري هستند. ‏شبکه‌هاي نسل 5/2 مانند ‏GPRS، مدل گسترش يافته ‏شبکه‌هاي نسل2 هستند که از تکنولوژي سوئيچ مداري ‏براي انتقال صوت و از سوئيچ بسته‌اي براي تبادل ديتا ‏استفاده مي‌کنند. تکنولوژي سوئيچ مداري ايجاب مي‌کند ‏که کاربران بر مبناي زمان سنجيده شوند نه بر مبناي ‏ميزان ديتاي انتقال داده شده، چراکه پهناي باند فقط ‏براي کاربر اختصاص داده شده است. در مقابل، ‏تکنولوژي سوئيچ بسته‌اي، پهناي باند را بيشتر مورد ‏استفاده قرار داده و به بسته‌هاي هر کاربر اجازه ‏رقابت براي بدست آوردن پهناي باند را مي‌دهد و ‏کاربرها را بر مبناي ميزان ديتاي انتقال داده شده، ‏مورد حسابرسي قرار مي‌دهد. بنابراين حرکت به سمت ‏استفاده از سوئيچ بسته‌اي و به تبع آن شبکه‌هاي ‏IP‏ ‏يک امر طبيعي است. ‏

شبکه‌هاي نسل 3 ‏‎(UMTS)‎‏ قصد داشتند مشکلات متعددي که ‏نسل‌هاي 2 و 2.5 با آن روبرو شده بودند را بر طرف ‏کنند. از جمله اين مشکلات مي‌توان به سرعت پايين و وجود ‏تکنولوژي‌هاي ناهمخوان و سازگار ناپذير‎(TDMA/CDMA) ‎‏ ‏در کشورهاي مختلف اشاره کرد.‏

‏انتظاراتي که از نسل 3 وجود داشت، افزايش پهناي ‏باند به ‏Kb/s‏ 128در ماشين‌ها وMb/s ‎‏ 2 در کاربردهاي ‏ثابت بود ولي در واقعيت، خروجي نسل3 نه روشن بود و ‏نه مشخص. البته يک قسمت از اين مشکل به اين مسئله ‏برمي‌گردد که تامين کنندگان و ارائه دهندگان شبکه‌هاي ‏ارتباطي در اروپا و آمريکاي شمالي، در حال حاضر از ‏استانداردهاي مجزايي براي نگهداري و پشتيباني ‏استفاده مي‌کنند و بدنه اين استانداردها باعث ايجاد ‏تفاوت‌هايي در تکنولوژي واسط‌هاي هوايي آنها مي‌شود. در ‏ضمن سوالات مالي متعددي هم وجود دارد که باعث ترديد ‏در مرغوبيت شبکه‌هاي نسل 3 مي‌شود و اين نگراني وجود ‏دارد که در بسياري از کشورها، نسل 3 مورد توجه واقع ‏نشود. در مجموع تمامي اين مسائل و نگراني‌ها باعث ايجاد ‏رقابت و تمايل به استفاده از تکنولوزي‌هاي‌ بي سيم ‌نسل ‏‏4 شد.‏
شبکه‌هاي نسل چهارم يا ‏G‏4 ، نامي است که به ‏سيستم‌هاي موبايل مبتني بر ‏IP‏ که دسترسي را از طريق يک ‏مجوعه از واسطه‌هاي راديويي تامين مي‌کنند، داده شده ‏است. شبکه ‏G‏4 برقراري بهترين سرويس اتصال، رومينگ و ‏فراگشت بي سيم را ارائه مي‌کند و از طرف ديگر چندين ‏واسط دسترسي راديويي مانند: (‏HIPERLAN,WLAN ‎‎,BLUETOOTH ,GPRS‏) را به يک شبکه واحد که کاربر از ‏آن استفاده مي‌کند تبديل خواهد کرد.‏

با اين ويژگي، کاربران خواهند توانست به سرويس ‏هاي مختلف دسترسي پيدا کرده و پوشش بيشتري داشته باشند ‏در ضمن، راحتي استفاده از يک وسيله واحد را نيز تجربه ‏کنند( وسيله اي كه در آينده جايگزين گوشي‌هاي تلفن ‏همراه فعلي خواهد شد)‌. از طرف ديگر يک صورتحساب را با ‏کاهش کل هزينة دسترسي داشته و دسترسي بي سيم قابل ‏اعتمادي را حتي در صورت از دست دادن يک يا چند شبکه، ‏داشته باشند.‏

در حال حاضر ‏G‏4 يکي از ابتکارات مراکز ‏R&D‏ براي ‏فائق آمدن بر محدوديت‌هاي موجود و بر طرف کردن مشکلات ‏G‏3 است که نتوانسته به وعده‌هاي خود در زمينه ‏عملکردها و خروجي هاي مختلف عمل کند. در عمومي ترين ‏سطح، ساختار ‏G‏4 شامل سه منطقة پاية ارتباطي است: ‏شبکه‌هاي شخصي ‏PAN، (مانند ‏Bluetooth‏)، نقاط دسترسي محلي ‏با سرعت بالا در شبکه‌هايي که شامل تکنولوژي‌هاي ‏LAN‏ ‏بي‌سيم (‏WLAN‏) هستند، (مانند: ‏HIPERLAN‏ و ‏IEEE ‎‎802.16‎‏ ) و ارتباطات سلولي. با اين اوصاف ‏G‏4 براي ‏محدودة وسيعي از دستگاه‌هاي موبايل که از جابجايي‌هاي ‏عمومي پشتيباني مي‌کنند، به کار خواهد رفت. هر ‏دستگاه قادر خواهد بود که با اطلاعات مبتني بر اينترنت ‏که براي شبکه‌اي که در آن لحظه به وسيلة دستگاه ‏استفاده مي شود، تعريف شده است، تعامل داشته باشد. ‏به طور خلاصه، ريشه‌هاي شبکه‌هاي ‏G‏4 بر مبناي ايدة ‏محاسبات منتشر شونده، است.‏

ابزاري که در اين راستا قابل استفاده است راديو نرم ‏افزار (‏SDR‏) مي باشد. راديوهاي ‏SDR‏ دستگاه‌هايي ‏مانند تلفن‌هاي سلولي، ‏PDAها، ‏PCها و تمامي محدوده ‏ساير دستگاهها را براي دريافت امواج هوايي به منظور ‏رسيدن به بهترين متد ممکن ارتباطي، با بهترين قيمت آماده ‏و امکان‌پذير مي‌سازد. در يک محيط ‏SDR، توابعي که ‏سابقاً، فقط در سخت افزار اجرا مي‌شدند، (مانند: ‏توليد سيگنال راديويي انتقال و تنظيم سيگنال ‏راديويي دريافت و . . . ) به وسيلة نرم افزار انجام ‏مي‌شوند. بنابراين راديو قابل برنامه ريزي بوده و ‏قادر به ارسال و دريافت سيگنال در يک محدوده وسيع ‏فرکانسي است. ‏

مشخصات و ويژگي‎ ‎هاي نسل چهارم:‏‏

1-سرعت بالا: سيستم‌هاي ‏G‏4 بايد سرعت پيك بيش از ‏Mb/s‏100 را در حالت ساکن و ميانگين ‏Mb/s‏20 را در حال ‏حرکت ارائه دهند.‏‏

2- ظرفيت بالاي شبکه: ظرفيت شبكه بايد حداقل 10 ‏برابر بيشتر از سيستم‌هاي ‏G‏3 باشد. که اين مقدار زمان ‏Download‏ يک فايل ‏M byte‏10 را در سيستم هاي ‏G‏4 به 1 ‏ثانيه کاهش مي‌دهد که اين زمان در سيستم‌هاي ‏G‏3 معادل ‏‏200 ثانيه برآورد شده است. از طرف ديگر قابليت ‏ارائه ويدئو با کيفيت بالا به تلفن‌ها و تجربة واقعيت ‏مجازي در صفحات نمايش گوشي ها را نيز ارائه مي‌کند.‏‏

3- فراگشت سريع و بي سيم بين شبکه‌هاي مختلف: ‏شبکه‌هاي بي‌سيم ‏G‏4 بايد از جابجايي عمومي بين شبکه‌هاي ‏موبايل و شبکه‌هاي بي‌سيم مختلف پشتيباني کنند.‏‏
4- پشتيباني از چند رسانه‌هاي نسل جديد: شبکة ‏G‏4 بايد قادر به پشتيباني از مقدار زياد ديتاي ‏انتقالي با سرعت بالا و با هزينة پايين‌تر از هزينه‌هاي ‏معمول باشد. ‏


شبکه‌هاي ‏G‏4 و 6‏‎ IPV

هدف ‏G‏4 اين است که تکثر و فراواني موجود در بين ‏شبکه‌هاي موبايل را با يک شبکة مركزي استاندارد ‏جهاني که مبتني بر ‏IP‏ باشد و بتواند ويدئو، ديتا و ‏صوت را پشتيباني کند، جايگزين نمايد که اين کار ‏سرويس‌هاي يکپارچه صوت، تصوير و ديتا را براي تمامي ‏ميزبانان موبايل که کاملاً بر مبناي ‏IP‏ هستند، تأمين ‏خواهد كرد.‏

در واقع هدف اصلي ارائه سرويس‌هاي چند رسانه‌اي بي‌سيم ‏به کاربراني است که از طريق تکنولوژي‌هاي دسترسي ‏ناهمگن به يک ساختار تماماً ‏IP‏ دسترسي دارند. پروتكل ‏IP‏ ‏در واقع به عنوان يک پيوند دهنده بين شبکه‌هاي مختلف ‏براي تأمين ارتباطات عمومي و حرکت‌پذيري، عمل مي کند. ‏

يک شبکة بي‌سيمIP ‎، پروتکل مخابراتي سيستم سيگنالينگ ‏شمارة 7 ‏‎(SS7)‎‏ که واقعاً يک عامل زائد مي‌باشد، را ‏تغيير مي‌دهد. زيرا ارسال سيگنال ‏SS7‎‏ بخش زيادي از ‏پهناي باند شبکه را مصرف مي‌کند حتي در زماني که هيچ ‏ترافيکي سيگنالينگي وجود ندارد. (علت اين امر اين ‏است که اين سيستم از مکانيزم ‏Setup‏ مکالمه براي رزرو ‏کردن پهناي باند استفاده مي‌کند که اسلاتهاي زماني / ‏فرکانسي در امواج راديويي اين کار را انجام نمي‌دهند). ‏از طرف ديگر شبکه‌هاي ‏IP‏ بدون اتصال هستند و تنها ‏زماني از اسلاتها استفاه مي‌کنند که ديتايي براي ارسال ‏داشته باشند بنابراين در اين حالت بهينه ترين ‏استفاده از پهناي باند موجود انجام خواهد شد. ‏

امروزه ارتباطات بي سيم بيشتر بر پاية صوت استوار مي ‏باشند و اين در حالي است که تحقيقات نشان مي دهد رشد ‏ترافيک دنياي بي سيم به صورت نمايي به نسبت تقاضاي ‏ترافيک صورت، در حال افزايش است. به خاطر اينکه لاية ‏هسته ‏IP‏ به صورت ساده اي قابل درجه بندي مي‌باشد و ‏براي رودرويي با اين چالش مناسب است. هدف ما در ‏واقع يکي کردن شبکه هاي صوت، ديتا و چند رسانه ها ‏است.

ictna.ir
+ نوشته شده در  دوشنبه سیزدهم آبان 1387ساعت 8:50  توسط محسن  | 

حل كردن چهار مشكل پيش پا افتاده ي سيستم

حل كردن چهار مشكل پيش پا افتاده ي سيستم
۱) كامپیوتر را روشن می‌كنید ولی اتفاقی نمی‌افتد.

نه چراغی، نه صدایی؛ و نه غژ‌غژ پره‌های بادبزن. اولین كاری كه باید بكنید، چیست؟ قبل از هر چیز، مطمئن شوید كه دو شاخه‌ی كامپیوترتان را به برق زده‌اید!
حتا اگر صد درصد اطمینان دارید كه دو شاخه‌‌ی كامپیوتر را به برق زده‌اید، بازهم آن را بررسی كنید.
با این فرض كه دو شاخه را به برق زده‌اید، باید این احتمال را بدهید كه ممكن است منبع تغذیه‌ی كامپیوترتان خراب شده باشد. منبع تغذیه‌ی كامپیوتر، جعبه‌ا‌ی فلزی است كه در پشت كامپیوتر و در بالای سایر قطعات قرار گرفته است. این جعبه‌ی فلزی معمولاً با چهار پیچ در جای خود محكم شده و كابل برق به آن وصل شده است. یك بادبزن هم در پشت این جعبه وجود دارد كه هوا را به بیرون می‌فرستد.

یك سری سیم‌كشی‌های رنگ به رنگ از منبع تغذیه‌ی كامپیوتر بیرون می‌آید. در انتهای بعضی از سیم‌ها فیش‌های خاصی تعبیه شده ‌است، كه به پشت درایو‌ها، بادبزن، و احتمالاً ادوات دیگر فرو می‌روند تا برق آن‌ها را تأمین كرده باشند. این سیم‌ها یك فیش خاص برای بردمادر نیز دارند. تا وقتی كه فیش‌ها در مادگی مورد نظر فرو روند، هیچ اهمیتی ندارد كه چه سیمی به كجا وصل می‌شود.
وقتی قاب كامپیوتر را باز می‌كنید، این سیم‌كشی‌های جورواجور می‌توانند هر آدمی را بترسانند، امّا اگر خوب آن‌ها را بررسی كنید، متوجه خواهید شد ترتیبات آن‌ها چندان هم پیچیده نیست. بهتر است از نحوه‌ی این اتصالات یادداشت بردارید، و روی فیش‌ها با یك ماژیك رنگی بنویسید كه به كجا متصل شده‌اند. سیم‌ها را بیرون كشیده و منبع تغذیه را بردارید. آن را به یك فروشگاه لوازم كامپیوتری ببرید و یك منبع تغذیه با همان میزان وات مصرفی، خریداری نمایید. معمولاً بهای یك منبع تغذیه‌ی متعارف در حدود ۱۰تا ۱۵ هزارتومان است.

۲) كامپیوتر روشن می‌شود، امّا چیزی روی نمایشگرتان معلوم نیست.

به عبارت دیگر، سروكله‌ی ویندوز پیدا نمی‌شود. ممكن است مشكل‌تان مربوط به نمایشگر باشد. سعی كنید یك نمایشگر دیگر را كه از كاركرد صحیح و سالم آن مطمئن هستید، به جای این نمایشگر به كار ببرید و ببینید آیا چیزی روی صفحه‌ی نمایش ظاهر می‌شود یا نه. اگر نمایشگر دوم اشكالی نداشته باشد و كارش را طبق معمول انجام داد، معلوم است كه نمایشگر اوّلی از دور خارج شده است. اگر مدت ضمانت نمایشگرتان منقضی نشده باشد، بهتر است با نماینده‌ی فروش آن تماس بگیرید و خواستار رفع عیب شوید، امّا اگر دوره‌ی ضمانت نمایشگر‌تان تمام شده است، بهتر است به فكر خرید یك نمایشگر نو باشید.
هرگز پشت نمایشگر‌تان را به منظور تعمیر آن باز نكنید. خازن‌هایی كه در داخلِ نمایشگرتان قرار دارند، حاوی الكتریسیته هستند. بنابراین امكان دارد -خدای ناكرده- جان‏‌تان را سر این كار بگذارید!

اگر دیدید بخاری از صفحه‌ی نمایش بلند نمی‌شود و سطح آن كاملاً تیره و تاریك است، ممكن است ایراد مربوط به كارت گرافیكی باشد. ابتدا، كارت گرافیكی را پیدا كنید. كارت گرافیكی یك بُرد است كه در داخل یك چاك مخصوص در بردِ مادر فرو می‌رود. كابلی كه از پشت نمایشگر آمده است، وارد درگاه كارت گرافیكی می‌شود، كه از پشت كامپیوتر بیرون زده است.
اگر درگاه كارت گرافیكی، جزیی از بُرد مادر باشد، می‌گویند كه كارت گرافیكی به صورت مادرزاد تعبیه شده است. شما نمی‌توانید چنین كارتی را تعمیر كنید.

فرض می‌كنیم كه شما یك كارت گرافیكی جداگانه دارید، بنابراین باید مطمئن شوید كه در جای خود سفت و محكم باشد. لبه‌ای كه در چاكِ بُرد مادر فرو می‌رود، ممكن است به علت شُل بستن پیچ نگهدارنده‌ی كارت به بدنه‌ی كامپیوتر، از جای خود، خارج شده باشد.
اگر كامپیوتری دارید كه صحیح و سالم دارد كارش را انجام می‌دهد، آن را خاموش كرده و سپس كارت گرافیكی‌اش را بیرون بكشید. این كارت گرافیكی را در كامپیوتر مسئله‌دار بگذارید!
اگر سیستم‌تان كاركرد، احتیاج به یك كارت گرافیكی جدید دارید. اما اگر كارت اضافه‌ای برای آزمایش سیستم‌تان ندارید، یك كارت ارزان‌قیمت هفت الی هشت هزارتومانی بخرید تا اگر مشكل‌تان را حل نكرد، بتوانید آن را پس دهید.
شما می‌توانید صدها هزار تومان را صرف خرید یك كارت گرافیكی كنید، امّا اگر سروكارتان فقط با نرم‌افزار‌های اداری است و احیاناً گاهی هم به اینترنت سفر می‌كنید، لازم نیست پول زیادی در این مورد خرج نمایید. كارت‌های گرافیكی گران‌قیمت بیش‌تر به درد افرادی می‌خورد كه كُشته‌مُرده‌ی بازی‌های كامپیوتری هستند.

۳) اگر به طور مرتب صفحه‌ی نمایش كامپیوترتان آبی‌‌‌رنگ می‌شود، و هیچ نشانه‌ای از حیات در كامپیوتر خود نمی‌بینید، ممكن است یكی از تراشه‌های حافظه‌تان معیوب شده باشند.
به پیغامی كه در صفحه‌ی آبی‌رنگ داده می‌شود دقت كنید، مخصوصاً به شماره‌ی اعداد ( منظور از صفحه‌ی آبی‌رنگ، همان صفحه‌ای است كه در ابتدای بوت‌شدن كامپیوتر، ظاهر می‌گردد.) متنِ این پیغام خطا را در یك موتور جست و‌جو وارد كنید و در اینترنت به دنبال علل و عوامل آن بگردید.
به فرض آن‌كه بتوانید علت آن را تشخیص دهید، حل مشكلات مربوط به حافظه تقریباً ساده است. امّا اگر نتوانستید عیب مورد نظر را پیدا كنید، می‌توانید با عوض و بدل كردن تراشه‌های حافظه از یك كامپیوتر دیگر، تراشه‌های معیوب خود را شناسایی كنید.

امّا تراشه‌ی حافظه‌ باید از همان نوعی باشد كه در كامپیوترتان نصب شده است. اگر از هیچ راهی به نتیجه نرسیدید، تراشه‌ی قدیمی حافظه را به یك فروشگاه كامپیوتری ببرید. كسانی كه در آن‌جا پشت پیش‌خوان ایستاده‌اند، ممكن است دل‌شان بسوزد و سالم‌بودن تراشه‌ی مزبور را امتحان كنند.
تراشه‌ها‌ی حافظه در چاك‌هایی فرو می‌روند كه نزدیك خود ریزپردازنده قرار دارند. طول این تراشه‌ها حدود ۱۰ سانتی‌متر است. تراشه‌های قدیمی حافظه را بیرون آورده و با نوعی كه می‌خواهید از مغازه بخرید، مطابقت دهید. قیمت تراشه‌های حافظه، بسته به نوع و سرعت‌شان، تعیین می‌شود. فقط یادتان باشد فقط از همان نوعی باشند كه سایر تراشه‌های حافظه‌ی كامپیوترتان دارند.
وقتی تراشه‌ی جدید حافظه را به داخلِ چاك آن فرو می‌كنید، لازم است نیروی كمی به آن وارد نمایید. گیره‌هایی كه در دو دسر تراشه‌ی حافظه تعبیه شده‌اند، وقتی كه در جای خود درست قرار بگیرند، خود به خود قفل می‌شوند.

۴) اگر كامپیوترتان را بوت كردید، ولی نتوانست درایو C را بخواند،

ممكن است به علت خراب‌شدن سخت‌دیسك باشد.
اگر كامپیوتر دیگری دارید، سخت‌دیسك آن‌ها را با هم عوض و بدل كنید تا عیب احتمالی را شناسایی كنید. اگر كامپیوترتان با آن‌ سخت‌دیسك دوّم بوت شد، معلوم است كه سخت‌دیسك كامپیوتر شما عمر خودش را كرده است! گاهی اوقات یك بوت مجدد ممكن است جواب دهد. ممكن است سخت‌دیسك شما هنوز آن‌قدر جان داشته باشد كه بتواند گه‌گاهی بچرخد. اگر این راه جواب داد، بدون معطلی و اتلاف وقت، داده‌های خود را به یك سخت‌دیسك دیگر منتقل كنید.
یكی از كاركشته‌های این فن توصیه‌ای كرده است با این مضمون كه سخت‌دیسك خود را در یك كیسه‌ی پلاستیكی دربسته قرار دهید و یك شب آن را در قفسه‌ی یخ‌ساز یخچال خود بگذارید. این ترفند در بعضی موارد جواب داده است، بنابراین ضرری ندارد كه شما هم یك بار آن را امتحان كنید!

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

سخت‌دیسك جدید را در جای خود قرار داده و آن را به عنوان سخت‌دیسك بالا‌دستی نصب كنید. سخت‌دیسك قدیمی را به عنوان سخت‌دیسك «زیر‌دست» یا «پایین‌دست» تعریف كنید.
دستورالعمل‌های همراه سخت‌دیسك جدید نحوه‌ی تعریف كردن سخت‌دیسك بالا‌دست و پایین‌دست را شرح داده‌اند. كامپیوتر را بوت كنید و سیستم‌عامل ویندوز را روی سخت‌دیسك جدید بریزید. اگر خوش شانس باشید، كامپیوتر شما سخت‌دیسك قدیمی را تشخیص خواهد داد و آن را به صورت D: شناسایی خواهد كرد. به این ترتیب بعداً می‌توانید داده‌های خود را از روی سخت‌دیسك قدیمی به سخت‌دیسك جدید انتقال دهید.
تعویض كردن سخت‌دیسك از تعمیرات دیگر كمی سخت‌تر است. در نتیجه اگر برای این كار دست‌مزد بپردازید، زیاد جای دوری نمی‌رود. از طرف دیگر ممكن است در فكر خریدن یك كامپیوتر نو باشید، بنابراین با كمی كنجكاوی، بهتر است دل‌تان را به دریا بزنید و كار تعویض سخت‌دیسك را خودتان انجام دهید تا به تدریج، این مهارت را نیز در كارنامه‌ی خود ثبت كنید.


● محدودیت‌های خود را بشناسید…

بعضی چیزها ممكن است فراتر از توانایی‌های شما باشند. برای مثال، ارتقای ریزپردازنده می‌تواند شما را به دردسر بیندازد. حتا اگر یك ریزپردازنده‌ی سریع‌تر خریده‌اید كه به خوبی در برد مادر جای می‌گیرد، بازهم احتمالاً لازم است بیوس سیستم‌تان را-كه هسته‌ی اصلی ورودی و خروجی مدارات و اجزای كامپیوتر را تشكیل می‌دهد- نیز ارتقاء دهید. به این كار «فلاشینگ» می‌گویند؛ یعنی بارگیری اطلاعات به منظور تغییر‌دادن بیوس. اگر فلاشینگ به درستی انجام نگیرد، كامپیوترتان احتمالاً برای همیشه از كار خواهد افتاد. بنابراین توصیه می‌كنیم كه این كار را به اهل فن آن بسپارید.

گاهی اوقات هم پیش می‌آید كه تعمیر یك كامپیوتر اصلاً صرفه‌ی اقتصادی نداشته ‌باشد. این روزها قیمت یك كامپیوتر معمولی نو در حدود ۳۰۰ تا ۴۰۰ هزار تومان است. چنین كامپیوتری می‌تواند تمام نیازهای دفتری شما را برآورده سازد. بنابراین، اگر با هزینه‌ی یك تعمیر ۲۰۰ هزارتومانی مواجه شدید، بهتر است نگاهی به دور و اطراف خود بیندازید. شاید چنین تعمیری، آخرین راه‌حل شما نباشد!

● آخرین وصیت‌ها...
در مورد خریدن كامپیوترهای ارزان قیمت همیشه دقت به خرج دهید. توجه داشته باشید كه داشتنِ یك ضمانت خوب و معتبر در بسیاری از موارد می‌تواند نگرانی‌های شما را برطرف نماید. صرفه‌جویی در هزینه همیشه خوب است، اما باید مطمئن باشید آن‌چه را كه واقعاً به آن نیاز دارید، به دست خواهید آورد.

منبع : ماهنامه کامپیوتر
+ نوشته شده در  دوشنبه سیزدهم آبان 1387ساعت 8:49  توسط محسن  | 

نحوه انتخاب یک مانیتور ( قبل از خريد )

نحوه انتخاب یک مانیتور ( قبل از خريد )

مانیتور یکی از عناصر سخت افزاری مهم در کامپیوتر است که از آن بعنوان دستگاه استاندارد خروجی و در جهت نمایش اطلاعات استفاده می گردد. تمامی کاربران کامپیوتر بمنظور مشاهده خروجی مناسب ، نیازمند استفاده از یک مانیتور مطلوب می باشند. انتخاب یک مانیتور به عوامل متفاوتی نظير مشخصات فنی و نوع کاربرد آن ، بستگی دارد .اولين نمايشگرها ( مانيتورهای مبتنی بر متن ) بمنظور استفاده در کامپيوترهای شخصی در سال 1970 ، ارائه گرديدند. از سال 1970 تاکنون، مدل ها ی متفاوتی از مانتيتورها با بهره گيری از تکنولوژی های متفاوت و ارائه قابليت های مختلف ، توليد و عرضه شده اند . مانيتورهای ( CRT ( Cathod Ray Tube و مدل های متفاوت ( LCD ( Liquid Crystal display ، نمونه هائی از مانيتورهای ارائه شده طی ساليان گذشته و اخير می باشند. در این مقاله قصد داریم به برخی از پرسش های متداول در زمینه انتخاب یک مانیتور پاسخ داده و از این رهگذر با ضوابط انتخاب صحیح یک مانیتور بیشتر آشنا شویم .در ابتدا لازم است با برخی اصطلاحات مرتبط با مانيتور که در اين مقاله از آنان استفاده شده است ، آشنا شويم .

اصطلاحات

*

Aperture Grille : در تکنولوژی فوق ، بمنظور ايزوله نمودن پيکسل ها بصورت افقی از مجموعه ای سيم های عمودی استفاده می گردد.مانيتورهائی که از تکنولوژی فوق استفاده می نمايند، دارای شفافيت و وضوح تصوير مناسبی می باشند. پيکسل ها با توجه به ماهيت خطوط پويش استفاده شده بمنظورنگاشتن تصوير، بصورت عمودی از يکديگر متمايز می گردند.
*

Aspect Ratio : نسبت پهنای تصوير به ارتفاع را می گويند و برای اکثر مانيتورهای موجود ، 3 : 4 می باشد .
*

Asset Control : ويژگی فوق، باعث صرفه جوئی در زمان بمنظور رديابی مانيـتورها در شبکه می گردد. در صورتيکه مانيتور دارای ويژگی فوق بوده و از آن بهمراه نرم افزارهای ضروری در شبکه استفاده گردد ، امکان بازيابی اطلاعات لازم بمنظور رديابی مانيتورها ، فراهم می گردد.( شماره سريال مانيتور ، مدل و ... ) . اطلاعات فوق، برای مديران شبکه بسيار مفيد خواهد بود .
*

Bandwidth : سرعت ( بر حسب مگاهرتز ) داده دريافتی توسط مانيتور از پردازنده کارت گرافيک را می گويند . هر اندازه ميزان سرعت فوق بيشتر باشد ، تصاوير با وضوح و شفافيت بهتری نمايش داده می شوند ( خصوصا" در موارديکه دقت بالا، انتخاب شده باشد ) .
*

Color Convergence : پارامتر فوق ، معياری بمنظور سنجش نحوه تلاقی سه تفنگ رنگی ( قرمز ،سبز ، آبی ) درهر پيکسل بوده و وضوح بهتر تصاوير را در صورت همگرائی مناسب ، بدنبال خواهد داشت .
*

Conventional Tube ، متداولترين لامپ استفاده شده در مانيـتورها ،طی ساليان گذشته بوده است . مانيتورهائی که از لامپ تصوير پانزده اينچ و يا بالاتر استفاده نموده اند ، هم اينک درصدد استفاده از صفحات مسطح و يا ساير لامپ های تصوير ، می باشند .
*

Dot Pitch : يک واحد اندازه گيری بمنظور محاسبه فاصله بين مراکز دو نقطه نورانی با رنگ مشابه بر روی نمايشگر می باشد .هر اندازه نقاط به يکديگر نزديک باشند ،مقدار پارامتر فوق کمتر شده و تصاوير از وضوح بهتری برخوردار خواهند بود .
*

Energy Star : استاندارد ارائه شده توسط Environmental Protection Agency )EPA) ، بمنظور توليد و استفاده از کامپيوترهای شخصی با هدف بهينه سازی مصرف انرژی می باشد.استاندارد فوق ، اولين مرتبه در 17 ژوئن 1993 ارائه گرديد.مصرف انرژی کامپيوترها و يا مانيتورهائی که از استاندارد فوق تبعيت می نمايند ، می بايست در پائين ترين وضعيت ممکن ، به کمتر از30 وات تنزل يابد.
*

Flat-Screen Color CRT Monitor : مانيتورهائی رنگی که دارای صفحات نمايشگرمسطح می باشند. نمايشگرهای مسطح نسبت به نمايشگرهای غيرمسطح ، علاوه بر ارائه تصاوير با کيفيت مطلوبتر ، کاهش تشعشعات را نيز بدنبال خواهند داشت .
*

MPR-II : استانداردی بمنظور کاهش انتشار امواج الکترواستاتيک و الکترو مغناطيسی می باشد . MPR 1990 يا MPR II استاندارد تعريف شده بمنظور سنجش ميزان تشعشعات از دستگاه هائی نظير مانيتور است .
*

Phosphor : مواد بر روی صفحه که در واکنش به سيگنال توليد شده توسط تفنگ های پرتاپ الکترون ، از خود نور ساطع می نمايند .
*

Pixel ، از کلمات Picture element اقتباس شده است . پيکسل ها ، نقاط کليدی موجود بر روی صفحات نمايشگر بمنظور ايجاد تصاوير می باشند .
*

Pixel Clock Speed : فرکانس و يا سرعت نوشتن پيکسل ها ی مربوط به يک تصوير بر روی صفحه نمايشگر می باشد. هر اندازه ميزان سرعت فوق بالا باشد ، لرزش تصاوير کمتر خواهد شد.
*

Refresh Rate : به سرعت پويش و بازنويسی اطلاعات بر روی يک صفحه نمايشگر ، اطلاق می گردد.در فرکانس های بالاتر، با توجه به اينکه پيکسل ها با سرعت بيشتری فعال می گردند ،لرزش تصاوير کمتر خواهد شد ( مهمترين عامل لرزش تصوير ، کم نوری است ) . به پارامتر فوق ، فرکانس عمودی نيز گفته می شود .
*

Resolution : به تعداد پيکسل های نمايش داده شده افقی و عمودی بر روی صفحه ، گفته می شود. هر اندازه ميزان پارامتر فوق افزايش يابد ، امکان نمايش تصاوير بيشتری بر روی نمايشگر بدون ضرورت استفاده از Scrolling ، فراهم می گردد .
*

Scan Rate : پارامتر فوق ، سرعت ( بر حسب کيلوهرتز ) ترسيم يک سيگنال خط افقی بر روی نمايشگر را مشخص نموده و هر اندازه مقدار پارامتر فوق بيشتر باشد ، تصاويری واضح تر در دقت های بالا ايجاد خواهد شد . به پارامتر فوق ، فرکانس افقی نيز می گويند .
*

Shadow Mask : صفحات فلزی بهمراه سوراخ هائی درون آنان که تفنگ الکترون از بين آنان،پرتوهای الکترون را بمنظور توليد پيکسل ها بر روی نمايشگر ، ارسال می نمايد .
*

Stripe Pitch : يک واحد اندازه گيری بمنظور محاسبه فاصله بين مراکز دو نوار با رنگ مشابه که باعث ايجاد يک تصوير بر روی صفحه نمايشگر می گردد . هر اندازه نوارها ی رنگی به يکديگر نزديکتر باشند ، مقدار پارامتر فوق کاهش و بدنبال آن وضوح تصوير بهبود می يابد .
*

Viewing Angles : به زاويه افقی و يا عمودی که کاربر قادر به مشاهده تصاوير بدون کاهش کيفيت رنگ و شفافيت تصوير می باشد ، اطلاق می گردد.

جایگاه مانیـتور
در زمان ارتقاء سیستم ، اکثر کاربران ترجیح می دهند که مانیتور خود را نگه داشته و از آن همچنان استفاده نمایند . با توجه به اینکه عمر مفید یک مانیتور بیش از پنج سال برآورد می شود ، تصمیم بر استفاده از مانیتور قبلی در زمان ارتقاء سیستم ،حرکتی منطقی و اصولی است. در صورتیکه مانیتور موجود از نوع پانزده اینچ است که صرفا" قادر به نمایش متن با دقت 800 در 600 ، می باشد ، استفاده از مانیتور قبلی می تواند پیامدهای منفی از بعد کارآئی و بهره وری کاربران را بدنبال داشته باشد . برخی از کاربران در زمان ارتقاء سيستم ، تمایل دارند که مانیتورهای CRT قبلی خود را به مانیتورهای LCD مسطح تبدیل نمایند . بر اساس آمارهای موجود ، میزان فروش مانتیورهای LCD در سال 2003 برای اولین مرتبه بیش از مانیتورهای CRT بوده است .
اکثر تولید کنندگان مانیتور، مدل هائی را توليد و عرضه نموده اند که علاوه بر دارا بودن قيمت مناسب از پتانسيل های مطلوبی نيز برخوردار می باشند. از این نوع مانییتورها می توان در موارد متعددی استفاده بعمل آورد. Resolution و Refresh Rate در اين نوع از مانتيورها نیز مناسب می باشد . تولید کنندگان ، علاوه بر عرضه مانیتـورهای فوق ، اقدام به تولید و ارائه مانیتورهای حرفه ای تر نیز نموده اند .مانیتورهای فوق دارای کیفیت بمراتب بالاتری بوده و از پتانسيل های بيشتری نظیر : کنترل های تنظیم تصویر ، پورت های USB 2.0 ، گزینه های متفاوت ارگونومی ( نظیر تنظیم ارتفاع ) و Resolution بالا ، استفاده می نمایند. برخی از مانیتـورهای حرفه ای دارای Asset Control بمنظور ارائه تسهیلات لازم در خصوص رديابی مانيتورها در شبکه می باشند .
گرافیست ها ، معمولا" مانیتـورهای CRT را به مانیتـورهای دیگر ترجیح می دهند، چراکه این نوع از مانيتورها رنگ ها را واقعی تر نمایش می دهند. کاربرانی که اکثر فعاليت و استفاده آنان ازکامپيوتر مبتنی بر متن می باشد، تمایل بيشتری به استفاده از مانیتورهای LCD را دارند ، چراکه محدوده ( مرز) پیکسل ها در مانتیتورهای LCD ، بدرستی تعریف و رعايت می گردد ( در صورت تمرکز بر روی حروف ، وضعيت نمایش مطلوب خواهد بود ) . استفاده کنندگان از بازیهای کامپیوتری نیز مانیتـورهای CRT را ترجیح می دهند ، چراکه فرآیند ترسيم مجدد صفحات در مانیتورهای LCD ، با کندی بیشتری انجام می شود ( مشاهده دنباله ای از یک تصویر گرافیکی و يا وجود شبحی از تصوير قبلی ) .

ویژگی ها ی مهم
از مهمترین ویژگی های مرتبط با مانيتورهای LCD ، می توان به موارد زیر اشاره نمود :

*

Native Resolution : با توجه به اينکه مانیتورهای LCD از یک ماتریس مشتمل بر سلول، بمنظور نمایش تصاوير استفاده می نمایند، دارای يک Resolution ثابت ( ذاتی ) بوده که در آن Resolution کيفيت تصوير در بهترين وضعيت خود خواهد بود. یک مانیتور پانزده اینچ LCD ، دارای یک Native Resolution معادل 1024 در 768 می باشد .این در حالیست که اکثر مانیتـورهای هیفده ، هیجده و نوزده اینج از یک Native Resolution معادل 1280 در 1024 ، استفاده می نمایند. درصورتیکه تنظیم مانیتور پایئن تر ازNative Resolution انجام شود،تصاویر به نمایش درآمده ، حالت طبیعی خود را از دست می دهند( مات و کدر ) ، چراکه نمایشگر صرفا" بخشی از پیکسل های مربوطه به خود را استفاده نموده و بمنظور نمايش تصوير در صفحه ، Scale خود را افزايش خواهد داد. با اینکه تکنولوژی های Scaling در طی سالیان اخیر بهبود پیدا يافته اند ،ولی نتایج همچنان غيرمطلوب می باشد( عدم رضايت کاربران ) . در موارديکه Native Resolution مانـیتورهای LCD ، پاسخگوی تمامی نيازهای استفاده کننده می باشد ، انتخاب آنان منطقی خواهد بود.
*

Viewing Angle : با توجه به اينکه در مانیتـورهای LCD ، نور از طریق کریستال های مايع در نمایشگر عبور داده می شود، زمانیکه مستقیما" در مقابل آنان ایستاده باشیم ، بهترین وضعیت نمایش را مشاهده خواهيم کرد. در صورتیکه زاویه مشاهده خود را تغییر دهيم ( حرکت به گوشه ها و یا بالا و پائین ) ، ميزان تابناکی نور افت خواهد کرد . موضوع فوق ، یکی از دلایل ترجیح مانتیورهای CRT به مانیـتورهای LCD توسط گرافیست ها و کاربرانی است که حجم عمده فعالیت آنان گرافیک می باشد . ساير کاربران ، می توانند با وضعیت فوق، مدارا نمايند.
Viewing Angle یک مانتیور LCD ( بر حسب درجه اندازه گیری می شود ) ، نشاندهنده قدرت انعطاف در مقابل حرکت و جابجا شدن بین گوشه ها ، پائین و یا بالای مرکز نمایشگر بدون ازدست دادن کیفیت تصویرمی باشد. تاکنون هیچگونه روش استانداری برای اندازه گیری Viewing Angle ایجاد نشده است .اعداد اعلام شده توسط تولیدکنندگان بر مبنای یک استاندارد واحد نبوده و صرفا" می تواند معیاری در بین مانتیورهای تولید شده توسط یک تولید کننده باشد . بهترین روش قضاوت در رابطه با Viewing Angle یک مانیـتور ، مشاهده مستقیم مانیتور و بررسی عملی آن می باشد . در این راستا می توان برخی از مدلهائی را که از یک حداقل مشخص شده ، پائین تر می باشند را حذف و عملا" آنان را بررسی نکرد . يکی از پارامترهای مهم در انتخاب مانیتـورهای بزرگ ، دامنه و محدوده Viewing Angle می باشد .مثلا" یک مدل پانزده اینچ ، ممکن است صرفا" توسط یک کاربر استفاده گردد که وی نیز مستقیما" در مقابل مانیتـور قرارگرفته و از آن استفاده می نمايد.بنابراین در صورتيکه مقدار Viewing Angle معادل 120 درجه و یا بیشتر باشد، نياز کاربران مرتفع خواهد شد. در مانیتورهای هیفده اینچ و یا بالاتر ،حداقل زاویه دید 150 درجه پيشنهاد می گردد.اغلب کاربران این نوع مانیتورها تمایل دارند که از مانیتور بصورت مشترک استفاده نمایند ( خصوصا" در مواردیکه بصورت گروهی بر روی یک پروژه و یا تمرین کار می شود ) .
یکی از عوامل موثر در Viewing Angle ، تکنولوژی استفاده شده در رابطه با پیکسل ها است . در مانـیتورهای هیجده اینچ LCD و بالاتر ، از جدیدترین فنآوری در ارتباط با پیکسل ها استفاده شده که افزایش زاویه دید( مشاهده ) را بدنبال خواهد داشت . در مانیتورهای پانزده اینچ LCD ، تولید کنندگان از پانل های ارزان قیمت استفاده نموده که باعث کاهش زاویه دید می گردد . در تعداد زیادی از مانیتورهای LCD جدید ، امکان چرخش و یا تنظیم نمایشگر وجود داشته و همین موضوع باعث بهبود و پوشش زاویه دید بهتری می گردد .
*

Contrast : پارامتر فوق ، تفاوت دانسیته نور بین روشنترین رنگ سفید و تیره ترین رنگ مشکی را که یک مانیـتور LCD قادر به تولید آنان می باشد را نشان می دهد . در این رابطه پیشنهاد می گردد که مانیتوری با نسبت 1 : 400 و یا بهتر از آن ، انتخاب گردد .
*

Brightness : پارامتر فوق ، حداکثر ميزان نوری که از يک صفحه نمايشگر بمنظور نمايش "سفيدمحض" ساطع می گردد را نشان می دهد (ارسال تشعشعات در هر متر مربع ( cd/m2 ) ) . تقریبا" تمامی مانيـتورهای LCD ، دارای Brightness معادل دويست و پنجاه cd/m2 و یا بیشتر می باشند . ( مانیتورهای CRT دارای Brightness معادل يکصد می باشند) .
*

دیجیتال در مقابل آنالوگ : در صورتیکه بر روی سیستم یک کارت گرافیک با خروجی ویدئو دیجیتال نصب شده باشد ، می توان از یک LCD که دارای ورودی دیجیتال می باشد ، استفاده نمود . در چنین حالتی ضرورتی به تبدیل آنالوگ به دیجیتال و برگشت مجدد ، وجود نداشته و کیفیت تصویر بمراتب بهتر خواهد بود .در صورتیکه کارت گرافیک نصب شده بر روی سیستم دارای یک پورت DVI نمی باشد ، می توان با توجه به امکان ارتقاء و يا تعويض سيستم در آينده ، یک مانیتور دیجیتال LCD را انتخاب نمود.


منبع :‌
کد:
www.srco.ir
  
+ نوشته شده در  دوشنبه سیزدهم آبان 1387ساعت 8:47  توسط محسن  | 

مودم و V.92

 و V.44 به معناي مودم هاي سريعتر هستند! مزاياي V.92 و V.44 به قرار زير است:

خواندن سريعتر اطلاعات از اينترنت
تكنولوژي فشرده كردن اطلاعات V.44 مي تواند به ميزان قابل توجهي سرعت دنلود را بالا ببرد. البته بايد حواستان به مودم هاي V.92 كه قابليت V.44 را ندارند باشد. چون اكنون مودم هاي مختلفي در بازار وجود دارند كه در بسته بندي آنها V.92/V.44 ذكر شده است ولي در حقيقت فقط V.92 هستند. يعني اگر نرم افزار لازم در وب سايت كارخانه سازنده موجود باشد، كاربر مي تواند به اين وب سايت مراجعه كرده و نرم افزار لازم را براي upgrade مودم خود دانلود كند. حتي بعضي از مودم هايي كه روي بسته بندي V.92/V.44 ذكر شده است داراي همه ويژگيهاي اين استاندارد نيستند.

اتصال سريعتر
مودم V.92 مي تواند 25 درصد سريعتر عمليات اتصال را انجام دهد.

پست الكترونيك سريعتر
زمانيكه يك نامه الكترونيك ارسال مي كنيد در حال ارسال اطلاعات از مودم هستيد. كه اين عمل با مودم V.92 چهل درصد سريعتر انجام مي گيرد. كسانيكه داراي وب سايت شخصي هستند از نرم افزار هاي FTP براي ارسال اطلاعات استفاده مي كنند. كه با اين تكنولوژي به ميزان زيادي در زمان خود صرفه جويي مي كنند.
تماس ها را از دست نمي دهيد
با اين تكنولوژي مي توانيد تلفن ها را جواب دهيد بدون اين كه از اينترنت قطع شويد

مقايسه مدل هاي مختلف V.92
براي مقايسه مدلهاي مختلف مودم هايي كه داراي استاندارد V.92 هستند بايد توجه داشته باشيد كه اين موارد در آنها رعايت شده باشد:
  • V.92 NOW باشند و نه V.92 READY
  • V.44 در دسترس باشد
  • پشتيباني و خدمات پس از فروش ( البته در ايران وجود ندارد )
  • گارانتي
تكنولوژي كه بعد از V.92/V.44 آمده است 3049 است كه علاوه بر خصوصيات فوق اين قابليت را دارد كه مي تواند روي حالت انتظار قرار داده شود و بعد از اتمام مكالمه تلفني ادامه عمليات اينترنتي را انجام داد.

منبع
HTML کد:
www.yadbegir.com
__________________
+ نوشته شده در  دوشنبه سیزدهم آبان 1387ساعت 8:45  توسط محسن  | 

كارت Eye_Fi

چرا قبلاً كسي به آن فكر نكرده بود؟
شركت سازنده كارت Eye_Fi كار شگفت انگيزي كرد. آنها يك حافظه 2 گيگا بايتي با قابليت ارتباط بي سيم (امواج راديويي) را بر روي يك كارت جمع كرده اند. جالب اينكه اين كارت از نظر ظاهري هيچ تفاوتي با يك كارت SD معمولي ندارد و نه از آن ضخيم تر و نه درازتر است.
هدف از ساخت كارت مذكور اين بوده است كه بتوان عكاسها را از يك دوربين كه كارتهاي SD را پشتيباني مي كند به كامپيوتري كه سيستم عامل ويندوز يا مكينتاش دارد انتقال داد.

اين سيستم چگونه كار مي كند؟
كارت Eye_Fi نارنجي رنگ با يك card reader عرضه مي شود كه مي تواند به پورت USB كامپيوتر متصل شود. با اتصال آن به كامپيوتر عكاسهاي شما به صورت خوكار وارد كامپيوتر مي شوند اگر از سيستم عامل مكينتاش استفاده مي كنيد بهتر است از مرورگر Fire fox2.ox يا بالاتر استفاده كنيد.
در هر بار استفاده از اين كارت از شما خواسته مي شود كه يك account با email خود بسازيد. و يك نام و password از شما مي خواهد سپس فايروال شما را چك مي كند و بدنبال شبكه بي سيم مي گردد. شما مي توانيد انتخاب كنيد كه كدام يك را استفاد كنيد اگر بخواهيد مي توانيد شبكه خودتان را اضافه كنيد. اگر به اينترنت دسترسي داشته باشيد شما خواسته مي شود در صورت تمايل به يكي از وب سايت هاي معروف عكس متصل شويد.
ويژگي برجسته اين كارت سادگي آن از نظر اندازه و شكل و نداشتن تفاوت با يك كارت SD است و سادگي كار كردن با آن است.
همچنين اين كارت وابسته به يك دوربين خاص نيست و با هر دوربيني كه كارت SD بخورد مي توان از آن استفاده كرد فقط آن را داخل دوربين قرار دهيد. آنگاه هر عكسي كه مي گيريد را با وظيفه شناسي به لپ تاپ شما منتقل مي كند. افرادي كه مي خواهند از كيفيت و جزئيات عكس خود مطمئن شوند شيوه خوبي است تا بلافاصله عكس خود را بازبيني كنند و در صورت لزوم نور، فاصله، زوم و ... را تغيير دهند.
البته براي Upload عكس از دوربين به لپ تاپ يا pc بايد دوربين روشن باشد. بنابراين اگر دوربين را در حالت Auto off قرار دهيد ممكن است ارسال عكس ناتمام بماند.
منبع
HTML کد:
www.yadbegir.com
__________________
+ نوشته شده در  دوشنبه سیزدهم آبان 1387ساعت 8:37  توسط محسن  | 

آموزش هارد به هارد

جهت اجرای این آموزش باید کمی حرفه ای باشید و حواستان را جمع کنید . رایانه ها معمولا دارای یک هارد دیسک هستند . برای اولین قدم بهتر است که پارتیشن های هارد دیسک خودتان را نامگذاری کنید . برای این کار به My Computer رفته و روی یک پارتیشن کلیک راست کنید . گزینه Properties را انتخاب کنید . در پنجره باز شده شما می توانید نام پارتیشن را تغییر دهید . این کار را برای همه پارتیشن ها تکرار کرده و نام آنها را به خاطر بسپارید . حالا رایانه تان را خاموش کنید . شما هارددیسکی که می خواهید اطلاعات را از آن کپی کنید در اختیار دارید . به دقت ان را بررسی کنید .همه هارد دیسکها به وسیله یک نوع کابل به مادربورد متصل می شوند . در کنار محل اتصال کابل به هارد دیسک محل اتصال فیش برق یا همان POWER قرار دارد . اما مهمترین نکته که شما باید به آن دقت کنید جامپرها هستند . معمولا روی بدنه هارد دیسکها نحوه قرار گیری جامپرها توضیح داده شده است . جامپر یک قطعه ریز است که می توان به وسیله آن تنظیمات یک قطعه سخت افزاری را به صورت فیزیکی تغییر داد . در جدول موجود روی بدنه هارد دیسک به دنبال وضعیت Slave بگردید . شما باید جامپر هارد دیسک دوم را با توجه به توضیحات این جدول به حالت Slave تغییر بدهید . حالا در کیس رایانه خاموش را باز کنید . در کیس رایانه تان دنبال هارد خودتان بگردید . مشاهده می کنید که کابلی آن را به مادربرد متصل کرده است . این کابل معمولا دارای دو جای اتصال می باشد . ممکن است این کابل هم به هارد دیسک شما و هم به سی دی رام متصل باشد . شما می توانید از طریق همین کابل هارد دیسک دوم را به مادربرد متصل کنید . برای این کار می توانید جای اتصال دوم را از سی دی رام جدا کنید . به جای آن هارد دیسک را به این قسمت متصل کنید . حالا شما 2 هارد دیسک را از طریق یک کابل به مادربرد رایانه تان متصل کرده اید . هارد دیسک رایانه شما به عنوان میزبان و هارددیسک دوم به عنوان مهمان به حساب می آید . حالا باید برق مورد نیاز را برای هارد دیسک مهمان تامین کنید . به نوع فیش POWER هارد دیسک دقت کنید . یکی از این نوع فیشها احتمالا در رایانه شما به صورت آزاد وجود دارد . این کابل ها همگی به سیستم اصلی برق رایانه متصل هستند . یکی از این فیشهای آزاد را به هارد دیسک میمان وصل کنید . حالا باید رایانه تان را روشن کنید . به محض روشن شدن رایانه کلید Delete را فشار دهید تا وارد تنضیمات مادربرد شوید . این منو ممکن است با توجه به نوع مادربرد متفاوت باشد . اما معولا در اولین منو تنضیمات هارد دیسک تعیین می شود . به منوی Standard Cmos Features بروید . معمولا به صورت پیش فرض مادربرد های جدید برای شناسایی هارد دیسکها در حالت اتوماتیک تنظیم شده اند . اگر این گونه نیست شما تنظیم این قسمت را به حالت Auto تغییر دهید تا مادربرد به به صورت خودکار هارددیسک ها را شناسایی کند . این کار هم در قسمت باید صورت بگیرد . بعد از انجام این کار از این منو بیرون آمده و گزینه Save a Exit را انتخاب کنید . در صورتی که تمام مراحل را درست انجام داده باشید را یانه شما مثل سابق عمل می کند . ویندوز شما بالا می آید . اما با رفتن به قسمت My Computer متوجه اضافه شدن پارتیشن های جدید می شوید . پارتیشن های غریبه که نامشان برای شما آشنا نیست همان پارتیشن های هارد دیسک مهمان هستند . حالا اطلاعاتی را که لازم دارید بین دو هارد دیسک کپی کنید . دقیقا مانند زمانی که روی هارد دیسک خودتان اطلاعات رااز یک پارتیشن به پارتیشن دیگری کپی می کردید . بعد از تمام شدن کارتان دوباره رایانه تان را خاموش کنید . شما حالا باید همه چیز را به حالت اول برگردانید . هارد دیسک مهمان را با جدا کردن کابل های مادر برد و برق جدا کنید . وضعیت جامپر روی آن را دوباره به حالت اول برگردانید . این حالت روی بدنه هارد دیسک با عنوان Master مشخص شده است . اگر محل اتصال دوم روی کابل قبلا به سی دی رام متصل بود دوباره آن را به همان وضعیت برگردانید . در کیس را هم کاملا ببندید
HTML کد:
www.asoft.ir/
__________________
+ نوشته شده در  دوشنبه سیزدهم آبان 1387ساعت 8:36  توسط محسن  | 

چگونگی تنظیم تجهیزات رایانه ای

چگونگی تنظیم تجهیزات رایانه ای
این روزها تب رایانه ها آنچنان فراگیر شده كه تقریباً در هر خانه ای یكی از آنها وجود دارد. در نگاه اول، این یك افتخار بزرگ و فرخنده و مایه مباهات ما ایرانیان است و از آن مهم تر، اینكه بیشتر استفاده كنندگان از این تكنولوژی، كودكان و نوجوانان هستند.....

این روزها تب رایانه ها آنچنان فراگیر شده كه تقریباً در هر خانه ای یكی از آنها وجود دارد. در نگاه اول، این یك افتخار بزرگ و فرخنده و مایه مباهات ما ایرانیان است و از آن مهم تر، اینكه بیشتر استفاده كنندگان از این تكنولوژی، كودكان و نوجوانان هستند. به یقین، تعداد بیشماری از این كاربران، نحوه صحیح و مناسب استفاده از ادوات رایانه را به درستی نمی دانند لذا در اینجا سعی شده است تا حد ممكن نحوه صحیح استقرار تجهیزات رایانه ای ارائه شود.
●میز كار: یكی از شاخص های استقرار تجهیزات، میز كار است. میز كار را می توان به سه قسمت تقسیم كرد:
۱- ناحیه ای كه به ندرت از آن استفاده می شود (قسمت عقب سطح میز كار).
۲- ناحیه ای كه گهگاه از آن استفاده می شود (قسمت وسط سطح میز كار).
۳- ناحیه ای كه همواره از آن استفاده می شود (قسمت جلویی سطح میز كار).
ناحیه اول یا قسمت اول كه سطح انتهایی میز كار است و به ندرت از آن استفاده می شود، مكانی است كه فقط جهت نمایش است. اشیایی همچون مانیتور، عكس، ساعت، گلدان، جای مداد و خودكار، بلندگو یا اسپیكر در این ناحیه قرار می گیرند. ناحیه یا قسمت دوم، سطح میانی میز كار است. در این ناحیه، اشیایی قرار می گیرند كه گهگاه از آنها استفاده می شود؛ لوازمی همچون تلفن، ماشین حساب، سینی و... .
ناحیه یا قسمت سوم، سطح آغازین یا جلویی میز كار است. در این منطقه ادواتی قرار می گیرند كه همواره كاربرد دارند؛ ادواتی همچون كی برد، موس و موس پد. در مورد میزكار ذكر این نكته الزامی است كه میزهایی كه صفحات جداگانه ای برای صفحه كلید و موس دارند، به هیچ عنوان مناسب كار كاربران نیستند.
●مانیتور: یكی از قسمت های مهم این ادوات، مانیتور یا نمایشگر است. مانیتور باید به صورتی استقرار یابد كه اولاً در ناحیه اول باشد و در ثانی دقیقاً روبه روی صورت باشد؛ به گونه ای كه هنگام كار با آن، بتوان بالاترین نقطه مانیتور را مشاهده كرد یا به عبارتی دیگر، چشم كاربر به موازات بالاترین قسمت مانیتور باشد و فاصله مانیتور از چشم كاربر نیز بین چهل و هفتاد سانتی متر باشد.
●كی برد: كی برد یا صفحه كلید، یكی از ادوات پركار در رایانه است. به جرأت می توان گفت كه بیشترین تماس بین كاربر و رایانه را كی برد به خود اختصاص داده است. ذكر این نكته بسیار مهم است كه صفحه كلید هرگز نباید در ارتفاعی بالاتر یا پایین تر از سطح میز كار باشد. به عبارت دیگر، صفحه كلید باید دقیقاً روی میز كار و در قسمت سوم و روبه روی مانیتور باشد. در این حالت زاویه بین بازو و ساعد در هنگام كار نباید از نود درجه تجاوز كند.
نكته دیگر در مورد صفحه كلید، نحوه استقرار مچ دست ها روی آن است. خیلی مهم است كه هر دو مچ كاملاً به موازات هم روی صفحه كلید به نحوی قرار بگیرند كه هر یك سهمی از صفحه كلید را به گونه مساوی تقسیم كند. جمع شدن مچ دست به سمت داخل یا خارج، هرگز اصولی نیست. زاویه گرفتن كف دست از مچ نیز باعث آسیب خواهد شد.
نكته بسیار مهم و قابل اشاره، این است كه دیده شده بسیاری از كاربران، پایه های زیر صفحه كلید را باز می كنند تا به كی برد زاویه بدهند؛ این كار بدترین حالت برای مچ دست است.
بهترین حالت برای كی برد آن است كه صفحه كلید، كمترین زاویه را داشته باشد.
●موس: یا موش واره، بعد از كی برد بیشترین كاربرد را دارد. محل استقرار آن برای كاربران چپ دست، سمت چپ و برای كاربران راست دست، سمت راست و در ناحیه سوم است. دیده شده كه بسیاری از كاربران، موس و موس پد را در ناحیه دوم میز قرار می دهند و این باعث می شود كه زاویه بین بازو و ساعد بیش از نود درجه شود. در مورد مچ دست نیز به این نكته باید اشاره كرد كه هنگام كار با موس، دست بایستی با موس در یك امتداد باشد. یعنی خم شدن مچ به سمت چپ یا راست یا بالا و پایین صحیح نیست.
محل استقرار انگشتان روی موس نیز به این قرار است كه سه انگشت وسطی بر روی موس و انگشت های شست و كوچك در دو طرف موس قرار می گیرند.
صندلی: یكی از اركان مهم كار با رایانه، صندلی است كه بسیاری، از آن به سادگی می گذرند. یك صندلی خوب باید دارای این مشخصات باشد.
* تكیه گاه یا پشتی آن، قابل تنظیم باشد.
* ارتفاع آن قابل تنظیم باشد.
* محل نشستن آن قابل تنظیم به جلو و عقب باشد.
* محل نشستن آن از جنسی باشد كه قابل سرخوردن نباشد.
* حداقل ۵ پایه باشد (تعداد بیشتر بهتر است) و قابلیت چرخش ۳۶۰ درجه داشته باشد. نكته مهم آنكه صندلی هایی كه دارای تكیه گاه برای دست ها هستند، مناسب نیستند. حال به چگونگی تنظیم صندلی می پردازیم.
▪مرحله اول: درست روبه روی صندلی بایستید. در این حالت زانوها باید با محل نشستن در یك راستا باشند. به عبارتی، زانوها با محل نشستن تماس داشته باشد. در این حالت محل نشستن تنظیم شده است.
▪مرحله دوم: روی صندلی بنشینید. در این حالت قسمت داخلی زانو با لبه صندلی بایستی به اندازه یك مشت جمع شده كاربر فاصله داشته باشد. توجه داشته باشید كه زانو بایستی زاویه ای حدوداً نود درجه بین ساق و ران داشته باشد.
▪مرحله سوم: تكیه گاه یا پشتی باید به نحوی تنظیم شود كه دقیقاً قسمت انحنا یا تورفتگی كمر را پر كند.
اگر هر یك از این سه مرحله تنظیم نبود، در صورت اینكه صندلی كاربر دارای ۵ شرط ذكر شده باشد، به راحتی می توان آن را تنظیم كرد.
●چگونگی نشستن: هنگام نشستن، كف پاها باید به طور كامل روی سطح زمین قرار بگیرد. در این حالت دست ها از دو طرف به سمت پایین نگه داشته شود، آرنج ها باید با سطح میز در یك امتداد باشد و حتی الامكان هیچ چیزی را زیر پاها نباید قرار دارد اما اگر با توجه به موارد یاد شده، اختلاف سطحی پیش آمد، می توان از یك كتاب عریض یا یك سطح مسطح عریض برای زیر پاها استفاده كرد كه این سطح عریض حتماً باید از عرض هر دو پا بیشتر باشد(دو برابر سطح هر دو پا). لازم به توضیح است كه سطح مسطح فوق، نباید هیچ زاویه ای داشته باشد.
●نور یا روشنایی اتاق: هرگز محل استقرار تجهیزات رایانه نباید روبه رو یا پشت به پنجره باشد. بهتر است پنجره، سمت چپ یا راست تجهیزات باشد. منبع روشنایی نیز بهتر است بالای سر باشد. اگر از كپی هلدر یا منشی یار استفاده می شود، بهتر است از منابع روشنایی كه روی میز كار نصب می شود، استفاده شود، به نحوی كه نور به صورت مایل به سطح منشی یار بتابد. در این حالت، بازتاب نور در چشم كاربر نخواهد بود.
در پایان به آگاهی می رساند كه رعایت موارد یادشده از ضعف و سوزش چشم، كمردرد، پا درد، درد گردن، سندروم مچ دست و انگشتان و بسیاری موارد مضر دیگر جلوگیری می كند.


+ نوشته شده در  دوشنبه سیزدهم آبان 1387ساعت 8:35  توسط محسن  | 

سرعت باس مادربرد به زبان ساده

باس (bus) در واقع یک راه عبور برای قطعات سخت افزار ومحل اتصال سایر قطعات به پردازنده است . چرا ما باید بدونیم باس فلان قطعه چه سرعتی داره ؟ دلیلش اینه که هر قطعه با سرعت خاصی کار می کنه و ما باید بدونیم که ایا مادربرد هم می تونه سرعت قطعه رو تامین کنه یا نه
اولین چیزی که ما باید بهش توجه کنیم اینه که ما چه پردازنده ای می خوایم تهیه کنیم . در واقع مادربردی که می خوایم بخریم باید سرعت باس و همچنین سرعت خود پردازنده رو پشتیبانی کنه . اصولا باس رو می شه به خیابان تشبیه کرد که در نهایت خیابان ها به مرکز کنترل ختم میشن .
از نکات دیگه ایی که باید توجه بشه باس کارت گرفیک و باس رم هم باید کاملا مورد ارزیابی قرار بگیره . کارت گرافیک هایی که با پایه AGP وجود دارند باس مخصوص به خود رو دارند که این سرعت ها با ضریب X مشخص می شوند سرعت پایه در AGP , مگاهرتز 266 می باشد. مثلا ( AGP 8x ) سرعتی معادل :
8*266=2188
مگاهرتز داره . به هر حال آخرین نکته ی که قابل گفتن هست اینه که همه ی این سرعت ها فقط به صورت تئوری در این حد و اندازه هستن و به طور عملی کمتر از اینه .
+ نوشته شده در  دوشنبه سیزدهم آبان 1387ساعت 8:34  توسط محسن  | 

OverClock

به OverClock یا OverClocking در اصطلاح عامیانه OC گفته میشود.
اگه ناشیانه انجام بشه، خطرناکه و ممکنه CPU یا هر قطعه‌ی دیگه‌یی رو بسوزونه یا عمرش رو کم کنه.
اول از همه یه تعریف کوتاه از OC
OC یعنی، کارکشیدن از یک سخت‌افزار، بیشتر از مقداری که سازنده‌ آن، براش اعلام کرده . این سخت‌افزار می‌تونه CPU، کارت گرافیک، Ram یا... باشه. ما روی CPU صحبت می‌کنیم. مثلاً کار کشیدن از CPU 1.0GHz به اندازه 1.16GHz
یک سوال پیش می‌آد که اگه میشه از CPU مثلاً 1 گیگ به اندازه 1.16 گیگ کار کشید، چه علتی داره شرکت سازنده اون رو به عنوان 1 گیگ بفروشه؟ این سوال دو تا جواب داره:
1- سرعتی که شرکت سازنده‌ی CPU مثل اینتل یا AMD روی برچسب CPU می‌نویسه، سرعتی هستش که اون CPU در اون سرعت بهترین عملکرد رو داره و در سرعتهای بالاتر، عملاً مشکلاتی مثل عدم ثبات یا گرمای زیاد یا... براش پیش نمی‌آد.
2- دلیل خاص اقتصادی داره. مثلاً تنوع محصول باید باشه. ممکنه همه‌ی مشتریها پول CPU سریعتر رو نداشته باشن و... مثلاً Athlon 2500+ , 2600+, 3000+, 3200+ هیچ تفاوتی با هم ندارند مگر در Mutilplier. همه‌شون از تکنولوژی 130nm استفاده می‌کنن و روی هسته‌ی Barton ساخته شدن. اما تفاوت قیمتها خیلیه.
تقریباً هر CPU رو میشه OC کرد. مهم اینه که تا چه اندازه؟ این بستگی به شرایط داره. در واقع از دوتا جواب بالا، برای یک CPU ممکنه فقط یکیش درست باشه. یا یکیش نقش خیلی کمی داشته باشه. مثلاً تو همون مثال بالا، احتمال این که بشه Athlon 3200+ رو OC کرد خیلی کمه. اما Athlon 2500+ رو بسادگی میشه 100 الی 300 تا بالا برد.
یک CPU رو تا چه حدی می‌شه OC کرد؟ این سوال جواب مشخصی نداره. مثلاً ممکنه 50MHz یا ممکنه 350MHz. کاملاً بستگی به شرایط داره . این شرایط را از چند جنبه میشه بررسی کرد:CPUهای یک جنس و مدل و ساخت کارخانه ها با هم فرقهایی دارند.MotherBoard نقش خیلی مهمی داره. بعضی از MotherBoardها به اصطلاح OverClocking-Friendly هستن و کلاً برای OC کارها ساخته شدن . در هر صورت هر چه MotherBoard شما امکانات بیشتر و پیشرفته‌تری داشته‌باشه طبیعتاً بهتر می‌تونید OC کنید. علاوه بر MotherBoard قطعات دیگه هم نقش دارن. مثلاً قدرت تحمل فرکانسهای بالاتر در RAM یا AGP یا کارت صدا یا ... مدلها و جنسهای مختلف با هم فرق دارن. یک چیز مهم دیگه، سیستم خنک‌کننده‌ی کامپیوتر شماست. وقتی یک CPU در سرعتهای بالا کار می‌کنه، باید ولتاژ به نسبت بالاتری بهش داد و همین ولتاژ بالاتر باعث تولید گرمای بیشتر می‌شه و باعث سوختن یا کاهش شدید عمر مفید CPU بشه.
حالا OC رو چطور انجام بدیم.
اولا راهنمای MotherBoard وCPU را کاملا مطالعه کنید. باید وارد قسمت Setup (بایوس) سیستم بشوید،
یک نرم‌افزار مثل SiSoft Sandra روی سیستم نصب کنید که بتونید اطلاعات مربوط به سخت‌افزار رو ببینید. حتماً باید دمای CPU و MotherBoard رو نشون بده. تو Setup بایوس هم قسمتی که دما رو نشون می‌ده پیدا کنید
سرعت CPU توسط دو چیز تعیین می‌شه. یکی سرعت باس سیستم یا FSB -Front side bus- و دیگری Multiplier که در FSB ضرب می‌شه و سرعت CPU بدست می‌آد. برای تغییر سرعت CPU باید یکی یا هردوی این اعداد رو عوض کرد. از اونجایی که FSB علاوه بر تعیین سرعت CPU در تعیین سرعت ارتباط MotherBoard- با قطعات روی درگاه PCI و AGP همچنین Ram نقش داره، پس بهترین راه اینه که Multiplier رو بیشتر کنیم. اما شرکتهای سازنده، پردازنده رو روی یک Multiplier قفل میکنند و تغییر اون دیگه تاثیری نداره.
بنابراین تنها چاره‌ای که می‌مونه تغییر FSB هستش. برای تغییر FSB باید وارد Setup سیستم بشیم. در MotherBoard باید وارد قسمت IWILL Smart Settings بشم. شما هم اگه راهنمای مادربوردتون رو بخونید، حتماً پیدا می‌کنید. البته تو مادربوردهای قدیمی Multiplier رو از طریق جامپر عوض می‌کردند.
+ نوشته شده در  دوشنبه سیزدهم آبان 1387ساعت 8:33  توسط محسن  | 

10 مورد در خریدن کارت گرافیک

10 مورد در خریدن کارت گرافیک
انتخاب یک کارت گرافیک جدید می تواند دشوار باشد. تا زمانی که درباره آخرین GPU های ارائه شده و کارایی های آنها اطلاع نداشته باشید، دانستن اینکه کدام کارت ارزش خریدن را دارد غیر ممکن است. در این مقاله 10 موضوع را که قبل از خرید یک کارت گرافیک باید در نظر داشته باشید بررسی می کنیم.

انتخاب یک کارت گرافیک جدید می تواند امری دشوار باشد. تا زمانی که شما درباره آخرین GPU های ارائه شده و کارایی های آنها اطلاع نداشته باشد، دانستن اینکه کدام کارت ارزش خریدن را دارد غیر ممکن است. واحد پردازش گرافیکی GPU، مثل CPU، هر سال پیشرفت می کند و این به این معنی است که دامنه بسیار وسیعی از کارت گرافیک ها برای انتخاب موجود می باشند و خرده فروشان هم دوست دارند کارت های منسوخ را در کنار آخرین و بهترین کارت های ارائه شده قرار دهند. اگر در اینجا دقت نکنید ممکن است در آخر پول زیادی برای تکنولوژی صرف کنید که قبلا کنار گذاشته شده است. در این مقاله 10 موضوع را که قبل از خرید یک کارت گرافیک باید در نظر داشته باشید بررسی می کنیم.
1- حافظه همه چیز نیست!

شما به یک کارت گرافیک نیاز دارید که حافظه کافی برای بازی کردن بازی ها، در وضوح بالا و با تنظیمات گرافیکی بالا داشته باشد. کارت گرافیک های خوب معمولا مقدار زیادی حافظه دارند، زیرا کل توان GPU در صورت کافی نبودن حافظه موجود ممکن است تلف شود.
512MB حافظه هیچ کمکی به این Radeon X1300 نمی کند و Radeon X1600 با 256 MB حافظه بهتر عمل می کند.

تولید کنند گان کارت های گرافیک می دانند که خریداران تازه کار معمولا به مقدار حافظه به عنوان ملاک اصلی مقایسه دو کارت توجه می کنند، و این دلیلی است بر دیدن کارت های با GPU های ارزانی که 256MB و یا حتی 512MB حافظه دارند و این مانند این است که یک موتور ضعیف را در بدنه یک ماشین تنومند قرار دهیم. چنین کارت هایی ممکن است اعداد درستی در مشخصات داشته باشند اما کارایی ضعیف خود را به محض شروع بازی نمایان خواهند کرد.
2- همه چیز به GPU مربوط است!

حافظه مهم است، اما قلب واقعی یک کارت گرافیک واحد پردازش مرکزی آن است. هنگامی که شما در میان نام های کارت های گرافیک پرسه می زنید، مهمترین چیزی که به نظر می رسد نوع GPU است، زیرا این چیپ کوچک مسئول کلیه کارهای کارت های سه بعدی است. امروزه بهترین پردازنده های گرافیکی را Nvidia و ATI تولید می کنند، اما خریدن یک کارت گرافیک با یک پردازنده Nvidia GeForce و یا ATI Radeon کافی نیست. شما باید علاوه بر این به مدل پردازنده توجه کنید، زیرا هر دو شرکت از کارت های سطح پایین زیر 100 دلار تا کارت های پر قدرت 500 دلاری خود را با این اسامی نام گذاری می کنند. شماره های بزرگتر در مدل ها بهتر هستند، اما باید به توصیف کننده های اضافی در نام مدل مانند GT، GS، GTX، XT و XTX توجه کنید زیرا اینها معمولا اطلاعاتی در مورد سایه زن ها و همچنین سرعت پردازنده نمایان می کنند. نقد چند کارت را بخوانید و یا نگاهی به کارایی کارت ها در بازی ها بیندازید تا با مدل های فعلی آشنا شوید و بتوانید آنها را با هم مقایسه کنید.
3- خط لوله، سایه زن و سرعت ساعت

در روزهای اولیه شتاب دهنده های سه بعدی شما می توانستید با نگاه کردن به سرعت و خط لوله پیکسل های یک GPU، اطلاعات کلی در مورد سطح کارایی آن کسب کنید. امروزه GPU ها کارهای بیشتری از پردازش پیکسلی بی خردانه انجام می دهند. نور پردازی و افکت های دیگر که معمولا به چندین گذر از خط لوله نیاز داشتند اکنون می تواند توسط یک برنامه سایه زن اجرا شوند و همان نتایج را با گذر و کار بیهوده کمتر به همراه بیاورند. هم اکنون GPU ها دارای واحد های پردازش اختصاصی هستند که به راه اندازی کار برنامه های پیچیده راسی و سایه زن پیکسلی اختصاص یافته اند. با افزایش سایه پردازی های بازی ها، واحد های سایه زن ه یک خصوصیت مهم در کارت های ویدیویی آینده، تبدیل خواهد شد. اخیرا ATI شروع به ارائه گزارش درباره تعداد واحدهای سایه زن تخصیص داده به هر خط لوله پیکسلی در Radeon X1900 XTX کرده است.
برای هم اکنون، هنوز هم شما می توانید GPU ها را توسط تعداد خطوط لوله پیکسلی که دارند ارزیابی کنید. اگر چه تولید کنند گان GPU اطلاعاتی هم درباره خطوط لوله راس (vertex pipeline) می دهند، اما تا کنون ما بازی مشاهده نکرده ایم که به خاطر سطح پردازش راسی پایین، در تنگنا قرار بگیرد. کارت ها سطح پایین معمولا دارای 4 خط لوله پیکسلی می باشند. کارت های متوسط دارای 8 یا 12 خط لوله می باشند و کارت های سطح بالا دارای 16 و یا بیشتر خط لوله می باشند. سرعت ساعت بیشتر همیشه بهتر است، اما اگر مجبور شدید بین سرعت ساعت GPU و تعداد خطوط لوله پیکسلی آن یکی را انتخاب کنید، معمولا بهتر است تعداد بیشتر خط لوله را انتخاب کنید. کارتی که با سرعت 400MHz که دارای 8 خط لوله است عملکرد بسیار بهتری نسبت به کارتی 500MHz با 4 خط لوله دارد.
GeForce 7900GTX دارای 24 خط لوله است.

4- Windows Vista و Direct3D 10

مایکروسافت تصمیم دارد که جدیدترین نسخه windows خود را در اوایل سال 2007 منتشر کند. این سیستم عامل جدید DirectX 10 را به همراه دارد، که مجموعه ایی از توابع به روز شده می باشد، که نرم افزارهای کاربردی برای دسترسی به منابع سیستم (شامل کارت های سه بعدی) می توانند از آنها استفاده کنند. نسخه جدید DirectX شامل نسخه جدیدی از Direct3D می باشد که برای ساده کردن خط لوله گرافیکی با کاهش بار CPU و انتقال کارها به GPU طراحی شده است. اگر چه ویندوز ویستا با کارت های گرافیکی DirectX 9 کار خواهد کرد، اما برای اجرای بازی های DX10 که در آینده خواهند آمد به یک کارت DX10 نیاز خواهید داشت.
انتظار می رود Nvidia و ATI اولین کارت های DX10 خود را در نیمه دوم سال 2006 به فروش بگذارند، اما نیازی نیست عجله کرده و از ترس مشکلات تطبیق با بازی ها یکی از آنها را بخرید. توسعه دهندگان بازی ها این را درک می کنند که چندین سال طول خواهد کشید که تعداد نسخه های نصب شده DX10 از DX9 پیشی بگیرند. تا چندین سال بعد از ورود ویستا کلیه بازی ها، منجمله بازی های انحصاری ویستا یعنی Halo 3 و Shadow run با هر دو نسخه DX10 و DX9 کار خواهند کرد.

5- زمان مناسب برای خرید

مسابقه ATI و Nvidia، برای ما یک سیکل سریع توسعه تکنولوژی ها سه بعدی به ارمغان آورده است. تولید کنند گان GPU هر 12 تا 18 ماه یک خط جدید تولید چیپ را راه اندازی می کنند، که نتیجه آن جریانی از کارت های با قدرت و قابلیت های بیشتر می شود. تولید کنند گان همچنین سعی می کنند پس از چند ماه از معماری اولیه، با دستکاری کردن طراحی ها، سرعت ساعت چیپ ها را افزایش داده و قابلیت های جدیدی را به آنها اضافه کنند تا بتوانند خطوط تولید را بهبود ببخشند. از آنجایی که بسیاری از قابلیت ها مانند شتاب دهنده ویدیویی دقت بالای H.264 و یا سایه زن پیشرفته مدل ها آینده نگر هستند، ممکن است یک یا دو سال قبل از فراگیر شدن محتوای واقعی برای آن ها طول بکشد.
تقریبا هر زمانی برای خریدن کارت گرافیک جدید مناسب است، اگر قصد ندارید بهترین کارت موجود را بگیرید. قیمت کارت های گرافیکی به سرعت افت می کنند، زیرا معرفی متناوب کارت های جدید، کارت های قدیمی و ضعیف تر را به قیمت های مناسب حل می دهند. بدترین شرایط زمانی است که یک کارت گرافیک سطح بالا را دقیقا قبل از معرفی یک GPU جدید از Nvidia یا ATI خریداری کنید، اگر چه باز هم یک کارت گرافیک قدرتمند خواهید داشت که تا مدت ها هیچ مشکلی برای اجرای بازی هایی که می خواهید نخواهد داشت.
6- لازم نیست 500 هزار تومن خرج کنید!

جدیدترین کارت های عرضه شده با قیمت 500 هزار تومان یا بیشتر به فروش می رسند، اما شما همیشه می توانید چندین کارت با بازده بالا در بازه قیمتی 200 تا 300 هزار تومان پیدا کنید. این بازه قیمتی معمولا بهترین بازده در برابر قیمت را ارائه می کند زیرا شامل کارت های سطح متوسط نسل فعلی و کارت های سطح بالای ارزان شده از نسل قبلی می شود.
هنگام مقایسه دو کارت گرافیک با تکنولوژی های مربوط به دو نسل متفاوت، سرعت ساعت و تعداد خطوط لوله را بررسی کنید. اگر مشخصات کاملا یکسان بودند، کارت جدید تر را انتخاب کنید زیرا از قابلیت های جدید تری پشتیبانی می کند. معماری چیپ های جدید، همچنین کارآمد تر هستند و شما بازده بالاتری را با تعداد برابری از خطوط لوله کسب خواهید کرد.
 
GeForce 7900GT هم اکنون یکی از بهترین کارت های موجود با قیمت زیر 300 هزار تومان است.

7- توان مورد نیاز را دارید؟

با قوی تر شدن کارت ها، توان سیستم مورد نیاز به یک نگرانی بزرگ تبدیل شده است. تولید کنند گان کارت های گرافیکی توصیه توان تولیدی توسط منبع تغذیه سیستم را بر روی جعبه درج می کنند. اعداد چاپ شده معمولا کمی بزرگتر از توان واقعی مورد نیاز هستند، زیرا شرایطی همچون منبع تغذیه ضعیف و یا سیستمی با منابع زیاد را در نظر می گیرند. کارت های سطح متوسط تا بالا معمولا به 400 تا 450 وات توان نیاز دارند. کارت های دو تایی مانند SLI یا CrossFire Radeon X1900 XTX به حداقل 550 وات توان نیاز دارند.
8- AGP و PCI Express

از زمان معرفی PCI Express در دو سال قبل، این تکنولوژی به خوبی جایگزین AGP شده است. PCI Exp پهنای باند ی 2 تا 4 برابر AGP ارائه می کند و تقریبا کلیه کارت گرافیک های جدید با این رابط عرضه می شوند. تولید کنند گان GPU هر از چند گاهی پردازنده گرافیکی برای دارندگان سیستم های AGP تولید می کنند، اما بهترین تجهیزات ابتدا برای PCI Exp عرضه میشوند.
اگر سیستم شما بیش از دو سال قدمت دارد، احتمالا یک شکاف AGP دارد. ارتقا به PCI Express می تواند گران باشد زیرا مجبور خواهید بود مادربرد، CPU و احتمالا حافظه خود را تعویض کنید. اگر چه در صورتی که سیستم شما بیش از دو سال قدمت دارد هم اکنون می تواند زمان خوبی برای ارتقای کلی آن باشد.
9- SLI و CrossFire

شما همچنین برای ارتقا به یک پیکر بندی دو تایی از کارت گرافیک به PCI Exp نیاز خواهید داشت. نصب یک سیستم با دو کارت و اجرای آن کار سختی است. برای اینکار به مادربرد ی مناسب، دو کارت گرافیک هم ساز و یک منبع تغذیه پر قدرت نیاز خواهید داشت.
Nvidia و ATI هر دو قالب های رقابتی برای پیکر بندی دو کارتی ارائه می دهند که به مادربرد های خاص خود نیاز دارند. Nvidia ابتدا SLI را در سال 2004 معرفی کرد و از زمان برای کامل کردن این پلتفرم استفاده کرد و حتی یک برنامه گواهی SLI برای مادربرد های و منابع تغذیه و واحد های حافظه ارائه نمود. شما می توانید دو کارت GeForce مطابق با SLI را از دو تولید کننده متفاوت با هم استفاده کنید به شرطی که GPU های آنها یکسان باشد. اما ATI تکنولوژی دو کارتی CrossFire خود را در 2005 معرفی نمود. همانند SLI، CrossFire به مادربرد ی همساز با آن، حافظه ایی با کیفیت و یک منبع تغذیه قدرتمند نیاز دارد. پیدا کردن دو کارت ATI که با هم بتوانند کار کنند کمی مشکل تر از Nvidia است زیرا شما باید یک کارت CrossFire Edition را با یک کارت CrossFire Ready در کنار هم قرار دهید تا کار کنند.

 
توسط دو GeForce 7950 GX2 دو پردازنده ایی می توانید 4 پردازنده گرافیکی در یک سیستم داشته باشید.

10- کارت های بر روی مادربرد

اگر قصد دارید یک سیستم از پیش تعریف شده بخرید، به کارت گرافیکی آن دقت کنید. اگر کارت گرافیک به صورت مجتمع با مادربرد است به سرعت انتخاب خود را به مدلی با کارت گرافیک واقعی تغییر دهید. کارت هایی که بر روی مادربرد قرار دارند برای برنامه های کاربردی ابتدایی مانند پردازش متن و یا وب گردی مناسب هستند، اما برای بازی کردن به هیچ وجه جالب نیستند مگر اینکه بخواهید بازی ها را در وضوح 800x600 و با 15 فریم در ثانیه انجام دهید.
منبع:
+ نوشته شده در  دوشنبه سیزدهم آبان 1387ساعت 8:11  توسط محسن  | 

مصاحبه با سازنده‌ی PES 2009

مصاحبه با سازنده‌ی PES 2009 شینگو تاکاتسوکا در مسابقات اروپایی PES در روم

در حال حاظر ما با تعدادی از بهترین بازی کنندگان PES در فینال مسابقات اروپایی PES به سر میبریم. آیا از تماشای این بازیها مباهات می‌کنید؟ آیا لذت ازین موضوع، وقتی که یکی از بازی کنندگان نقاط ضعف و باگ در هوش مصنوعی پیدا می‌کند و آنرا مطرح میکند، از بین می‌رود؟

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

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

این دومین سالیست که PES را روی PS3 می‌بینیم. در طی سال گذشته، چگونه توانسته‌اید قدرت این پلتفورم را تحت نفوذ درآورید؟


دقیقا. امسال دومین سالیست که ما روی PS3 کار میکنیم و سال گذشته برای پیشرف ما بسیار ارزشمند بود. با صراحت بگویم وقتی PES 2009 را تمام کردم، برای من قانع‌کننده بود.

PES 2008 مال زمانی بود که ما تازه کار را روی نسل هفتم شروع کرده بودیم و برای کنسول‌های جدید وقت لازم است تا حداکثر بهره‌وری را از آنها برد و بهترین و ایده‌آل ترین کار لازمه را کرد. برای PS2 هم همینطور بود.

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

خیلی از بازی‌کنندگان PES را با نمای واید(عریض) بازی می‌کنند که باعث می‌شود نتوانند استادیوم‌های جدیدی که طراحی کرده‌اید ببینند. آیا به تصور شما یک نمای جدید دوربین را خواهیم دید که هم ساده‌گی در بازی را به ارمغان آورد و هم احساس سینمایی بودن را بدهد؟


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

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

حال همانطور که اول ذکر کردم نماهای دوربین بسیار مهمند، پس ما هم به این تصور که نمای واید بهترین است عقب ننشستیم. ما هنوز در حال آروین و ازمون برای پیدا کردن بهترین نمای متعادل بین بازی و دوربین هستیم.

نکوهش‌هایی از سمت طرفداران نسبت به PES 2008 وجود داشت، که احتمالا به خاطر مودهای آنلاین بازی بود. چگونه از این نکوهش‌ها استفاده کرده‌اید تا بازی را هموارتر و قابل انعطاف‌تر سازید؟

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

امسال ما بخش آنلاین را مقدم شمردیم و دنبال این رفتیم که کسانی که سرعت خوبی هم ندارند بتوانند بازی را قابل اجرا ببینند. و در این حال ما نمی‌خواستیم که امکانات هدایتی‌ای که PES دارد از دست بدهیم، پس وقت زیادی را روی این مسئله صرف کردیم و به راه حلی را پیدا کردیم که حتی تعداد بازیکن‌های آنلاین نیز بیشتر شود.

اخیرا ما یک اعلامیه از سوی ایتاگاکی‌سان(تمنبو ایتاگاکی رییس اسبق Teamninja) داشتیم که میگفت گرافیک اولویت سازندگان ژاپنی نیست. آیا با وی موافقید؟

من تا حدی با آقای ایتاگاکی موافقم، اما تصور می‌کنم که این مسئله تنها فرق بین سازندگان ژاپنی در مقایسه با سازندگان غربی نیست. چیزی که به نظر من بیشترین تاثیر را در موثر یا ناموثر بودن سازندگان ژاپنی دارد، چگونگی کار آنها با یکدیگر است.

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

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

بنابراین دلیل این امر کم و بیش
، به خاطر بی‌نظیر ساختن بازیهاست.

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

شما باید از مردمی که ادعا می‌کنند PES مود "Become a Legend" را از روی فیفا کپی کرده است خسته شده باشید. اما چرا اینگونه طول کشید تا مود Fantasiaـیه Winning Eleven XI به اروپا برسد؟ بر مبنای چه استدلالی این امر طول کشید؟

خوب بله، یکی از بزرگترین پشیمانی‌های من به خاطر اینست که مود Fantasia را وارد PES نکردیم تا به اروپا نیز معرفی گردد. در هر صورت شما مرا درک میکنید و و این خوب است که مردمی مثل شما اطلاع دارند که مود Fantasiaـیه ما زودتر از Become A Legendـه فیفا ساخته شده بود.

در یک برنامه ی ساخت سال به سال، هرسال چالش‌های خود را به همراه ارمغان می‌آورد. بزرگترین چالش‌های شما در حین ساخت PES 2009 چه بود؟

اساسا دو چالش اصلی، اول معرفی مودهای جدیدمان، مثلا اینکه عاقبت توانستیم مود Become a Legend را معرفی کنیم، که یکی از بزرگترینِ اهداف و چالشهایمان بود، و دیگر اینکه در همان حال میخواستیم هوش مصنوعی را به حداعلی به نسل جدید برسانیم، که این هم به خوبی انجام شد.

اگر EA بگوید که "ما بیخیال فیفا خواهیم شد و شما می‌توانید از انجین ما استفاده کنید"، آیا شما این را قبول خواهید کرد؟ یا جواب خواهید داد: "نه، من به ادامه‌ی کار خود خواهم رسید"؟


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

گرفتن حق استفاده از لیگهای قهرمانی و کلوپهای بزرگ مثل لیورپول، منچستر یونایتد و بارسلونا تا چه حد خشنودکننده است؟ چه قدر در نزدیک کردن بازی به واقعیت موثر است؟ آیا برای مردمی که از واقع‌گرایی فیفا خوششان‌می آید، به اندازه ی کافی قانع‌کننده خواهد بود که روی به سوی PES آورند؟

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

ما امسال مسابقات یورو 2008 خوبی را داشتیم، خوب انگلستان نداشت اما در هر صورت تورنمنت جذابی برای تماشا بود. آیا شما هیچکدام از بازیکنان یا تیمها را جهت الهام در PES 2009 استفاده کرده‌اید؟ این تورنمنت چه اثری روی بازی داشته است؟

متاسفانه در حین مسابقات یورو 2008 من شانس خوبی برای تماشای مسابقات به اندازه‌ی قبل نداشتم زیراکه کار PES 2009 در سخت‌ترین مراحل خود بود. همچنین برنده شدن اسپانیا در مسابقات بسیار شگفت‌انگیز بود زیراکه انتظارش را نداشتم. البته توانستم خودم را به چند مسابقه برسانم که بازیکنان کلیدی ای داشت و مسلما من را تحت تاثیر قرار دادند و احتمالا تا وقتی سری PES ادامه داشته باشد اینکار را خواهند کرد.
+ نوشته شده در  دوشنبه سیزدهم آبان 1387ساعت 8:10  توسط محسن  | 

آموزش جاوا java

بنيادهاي كلاس java

كلاسهاي توليد شده در بحثهاي گذشته فقط براي كپسول سازي روش ()main استفاده مي شد ، كه براي نشان دادن اصول دستور زبان جاوا مناسب بودند . شايد بهترين چيزي كه بايد درباره يك كلاس بدانيد اين است كه كلاس يك نوع جديد داده را تعريف مي كند . هربار كه اين نوع تعريف شود ، مي توان از آن براي ايجاد اشيائي از همان نوع استفاده نمود . بنابراين ، يك كلاس قالبي (template) براي يك شي ئ است و يك شي ئ نمونه اي (instance) از يك كلاس است . چون شي ئ يك نمونه از يك كلاس است غالبا" كلمات شي ئ (object) و نمونه (instance) را بصورت مترادف بكار مي بريم .

شكل عمومي يك كلاس
هنگاميكه يك كلاس را تعريف مي كنيد ، در حقيقت شكل و طبيعت دقيق آن كلاس را اعلان مي كنيد . ابتكار را با توصيف داده هاي موجود در آن كلاس و كدهايي كه روي آن داده ها عمل مي كنند ، انجام مي دهيد . در حاليكه كلاسها ممكن است خيلي ساده فقط شامل داده يا فقط كد باشند، اكثر كلاسهاي واقعي هردو موضوع را دربرميگيرند.

بعدا" خواهيد ديد كه كد يك كلاس ، رابط آن به داده هاي همان كلاس را توصيف ميكند.

يك كلاس را با واژه كليدي class اعلان مي كنند . كلاسهايي كه تا بحال استفاده شده اند ، نوع بسيار محدود از شكل كامل كلاسها بوده اند . خواهيد ديد كه كلاسها مي توانند ( و معمولا" هم ) بسيار پيچيده تر باشند . شكل عمومي توصيف يك كلاس به شرح زير است :

type methodname2(parameter-list ){
// body of method
}
//...
type methodnameN(parameter-list ){
// body of method
}
}

داده يا متغيرهايي كه داخل يك كلاس تعريف شده اند را متغيرهاي نمونه instance) (variables مي نامند . كدها ، داخل روشها (methods) قرار مي گيرند . روشها و متغيرهاي تعريف شده داخل يك كلاس را اعضائ (members) يك كلاس مي نامند . در اكثر كلاسها ، متغيرهاي نمونه يا روي روشهاي تعريف شده براي آن كلاس عمل كرده يا توسط اين روشها مورد دسترسي قرار مي گيرند . بنابراين ، روشها تعيين كننده چگونگي استفاده از داده هاي يك كلاس هستند .

متغيرهاي تعريف شده داخل يك كلاس ، متغيرهاي نمونه خوانده شده زيرا هر نمونه از كلاس ( يعني هر شي ئ يك كلاس ) شامل كپي خاص خودش از اين متغيرهاست . بنابراين داده مربوط به يك شي ئ ، جدا و منحصر بفرد از داده مربوط به شي ئ ديگري است . ما بزودي اين نكته را بررسي خواهيم نمود ، اما فعلا" بايد اين نكته بسيار مهم را بياد داشته باشيد .

كليه روشها نظير()main همان شكل عمومي را دارند كه تاكنون استفاده كرده ايم .
اما ، اكثر روشها را بعنوان staticيا publicا توصيف نمي كنند . توجه داشته باشيد كه شكل عمومي يك كلاس ، يك روش ()main را توصيف نمي كند . كلاسهاي جاوا لزومي ندارد كه يك روش ()main داشته باشند . فقط اگر كلاس ، نقطه شروع برنامه شما باشد ، بايد يك روش ()main را توصيف نماييد . علاوه بر اين ، ريز برنامه ها
(applets) اصولا" نيازي به روش ()main ندارند .

نكته : برنامه نويسان C++ آگاه باشند كه اعلان كلاس و پياده سازي روشها در يك مكان ذخيره شده و بصورت جداگانه تعريف نمي شوند. اين حالت گاهي فايلهاي خيلي بزرگ java ايجاد مي كند ، زيرا هر كلاس بايد كاملا" در يك فايل منبع تكي تعريف شود . اين طرح در جاوا رعايت شد زيرا احساس مي شد كه در بلند مدت ، در اختيار داشتن مشخصات ، اعلانها و پياده سازي در يك مكان ، امكان دسترسي آسانتر كد را بوجود مي آورد .

يك كلاس ساده
بررسي خود را با يك نمونه ساده از كلاسها شروع مي كنيم . در اينجا كلاسي تحت غنوان Box وجود دارد كه سه متغير نمونه را تعريف مي كند : width، height، و depth و فعلا" ، كلاس Box دربرگيرنده روشها نيست .

+ class Box {
+ double width;
+ double height;
+ double depth;
+ }

قبلا" هم گفتيم كه يك كلاس نوع جديدي از داده را توصيف مي كند . در اين مثال نوع جديد داده را Box ناميده ايم . از اين نام براي اعلان اشيائ از نوع Box استفاده مي كنيد . نكته مهم اين است كه اعلان يك كلاس فقط يك الگو يا قالب را ايجاد مي كند ، اما يك شي ئ واقعي بوجود نمي آورد . بنابراين ، كد قبلي ، شيئي از نوع Box را بوجود نمي آورد .

براي اينكه واقعا" يك شي ئ Box را بوجود آوريد ، بايد از دستوري نظير مورد زير استفاده نماييد :

+ Box mybox = new Box)(; // create a Box object called mybox

پس از اجراي اين دستور ، mybox نمونه اي از Box خواهد بود. و بدين ترتيب اين شي ئ وجود فيزيكي و واقعي پيدا مي كند .

مجددا" بياد داشته باشيد كه هر بار يك نمونه از كلاسي ايجاد مي كنيد ، شيئي ايجاد كرده ايد كه دربرگيرنده كپي ( نسخه خاص ) خود از هر متغير نمونه تعريف شده توسط كلاس خواهد بود . بدين ترتيب ، هر شي ئ Box دربرگيرنده كپي هاي خود از متغيرهاي نمونه width، heidht،و depthو مي باشد . براي دسترسي به اين متغيرها
از عملگر نقطه (.) استفاده مي كنيد . عملگر نقطه اي ، نام يك شي ئ را با نام يك متغير نمونه پيوند مي دهد . بعنوان مثال ، براي منتسب كردن مقدار 100 به متغير width در myboxر ، از دستور زير استفاده نماييد :

+ mybox.width = 100;

اين دستور به كامپايلر مي گويد كه كپي width كه داخل شي ئ mybox قرار گرفته را معادل عدد 100 قرار دهد . بطور كلي ، از عملگر نقطه اي براي دسترسي هم به متغيرهاي نمونه و هم به روشهاي موجود در يك شي ئ استفاده مي شود .

دراينجا يك برنامه كامل را مشاهده ميكنيد كه از كلاس Box استفاده كرده است :

+ /* A program that uses the Box class.
+
+ Call this file BoxDemo.java
+ /*
+ class Box {
+ double width;
+ double height;
+ double depth;
+ }
+
+ // This class declares an object of type Box.
+ class BoxDemo {
+ public static void main(String args[] ){
+ Box mybox = new Box)(;
+ double vol;
+
+ // assign values to mybox's instance variables
+ mybox.width = 10;
+ mybox.height = 20;
+ mybox.depth = 15;
+
+ // compute volume of box
+ vol = mybox.width * mybox.height * mybox.depth;
+
+ System.out.println("Volume is " + vol);
+ }
+ }

 

فايلي را كه دربرگيرنده اين برنامه است بايد با نام BoxDemo.java بخوانيد زيرا روش ()main در كلاس BoxDemo و نه در كلاس Box قرار گرفته است . هنگاميكه اين برنامه را كامپايل مي كنيد ، مي بينيد كه دو فايل class. ايجاد شده اند ، يكي براي Box و ديگري براي BoxDemo . كامپايلر جاوا بطور خودكار هر كلاس را در فايل class
. مربوط به خودش قرار مي دهد . ضرورتي ندارد كه كلاس Boxو BoxDemoو هر دو در يك فايل منبع قرار گيرند . مي توانيد هر كلاس را در فايل خاص خودش گذاشته و آنها را بترتيب Box.javaو BoxDemo.javaو بناميد .
براي اجراي اين برنامه بايد BoxDemo.class را اجرا كنيد . پس از اينكار حاصل زير را بدست مي آوريد :

Volume is 3000

قبلا" هم گفتيم كه هر شي ئ داراي كپي هاي خاص خودش از متغيرهاي نمونه است .
يعني اگر دو شي ئ Box داشته باشيد، هركدام بتنهايي كپي ( يا نسخه اي ) از lenght widthو heightو خواهند داشت . مهم است بدانيد كه تغييرات در متغيرهاي نمونه يك شي ئ تاثيري روي متغيرهاي نمونه كلاس ديگر نخواهد داشت . بعنوان مثال ، برنامه بعدي دو شي ئ Box را اعلان مي كند :

+ // This program declares two Box objects.
+
+ class Box {
+ double width;
+ double height;
+ double depth;
+ }
+
+ class BoxDemo2 {
+ public static void main(String args[] ){
+
+ Box mybox1 = new Box)(;
+ Box mybox2 = new Box)(;
+ double vol;
+
+ // assign values to mybox1's instance variables
+ mybox1.width = 10;
+ mybox1.height = 20;
+ mybox1.depth = 15;
+
+ /* assign different values to mybox2's
+ instance variables */
+ mybox2.width = 3;
+ mybox2.height = 6;
+ mybox2.depth = 9;
+
+ // compute volume of first box
+ vol = mybox1.width * mybox1.height * mybox1.depth;
+ System.out.println("Volume is " + vol);
+
+ // compute volume of second box
+ vol = mybox2.width * mybox2.height * mybox2.depth;
+ System.out.println("Volume is " + vol);
+ }
+ }

 

خروجي توليد شده توسط اين برنامه بقرار زير مي باشد :
Volume is 3000
Volume is 162

+ نوشته شده در  یکشنبه دوازدهم آبان 1387ساعت 16:46  توسط محسن  | 

آموزش جاوا java

دستورات انتخاب در جاوا

جاوا از دو دستور انتخاب پشتيباني مي كنند : ifو switchو . با اين دستورات شما اجراي برنامه را براساس رايطي كه فقط حين اجراي برنامه اتفاق مي افتند كنترل مي كنيد. اگر سابقه برنامه نويسي با C++/C را نداريد، از قدرت و انعطاف پذيري موجود در اين دو دستور متعجب و شگفت زده خواهيد شد .

دستور if دستور انشعاب شرطي در جاوا است . از اين دستور مي توان استفاده نمود و اجراي برنامه را طي دو مسير متفاوت به جريان انداخت . شكل كلي اين دستور بصورت زير است :

if( condition )statement 1;
else statement 2;

دراينجا هر statement ممكن است يك دستور منفرد يا يك دستور مركب قرار گرفته در ابروها ( يعني يك بلوك ) باشد . condition ( شرط ) هر عبارتي است كه يك مقدار boolean را برمي گرداند . جمله else اختياري است . if
بصورت زير كار مي كند : اگر شرايط محقق باشد ، آنگاه statement 1 اجرا مي شود . در غير اينصورت statement 2 ( در صورت وجود ) اجرا خواهد شد .

تحت هيچ شرايطي هر دو دستور با هم اجرا نخواهند شد . بعنوان مثال ، در نظر
بگيريد :

+ int a/ b;
+ //...
+ if(a < b )a = 0;
+ else b = 0;

در اينجا اگر a كوچكتر از b باشد ، آنگاه a برابر صفر مي شود . در غير اينصورت b برابر صفر قرار مي گيرد . در هيچ شرايطي اين دو متغير در آن واحد برابر صفر نمي شوند .

غالب اوقات ، عبارتي كه براي كنترل if استفاده ميشود شامل عملگرهاي رابطه اي است . اما از نظر تكنيكي ضرورتي وجود ندارد . مي توان با استفاده از يك متغير boolean تكي ، if را همانطوريكه در بخش زير مشاهده مي كنيد ، كنترل نمود .

+ boolean dataAvailable;
+ //...
+ if( dataAvailable)
+ ProcessData)(;
+ else
+ waitForMoreData)(;

بياد آوريد كه فقط يك دستور مي تواند مستقيما" بعداز ifيا elseا قرار گيرد.

اگر بخواهيد دستورات بيشتري داخل نماييد ، نيازي به ايجاد يك بلوك نداريد نظير اين قطعه كه در زير آمده است :

+ int bytesAvailable;
+ //...
+ if( bytesAvailable > 0 ){
+ ProcessData)(;
+ bytesAvailable- = n;
+ } else
+ waitForMoreData)(;

در اينجا ، هر دو دستور داخل بلوك if اجرا خواهند شد اگر bytes Available بزرگتر از صفر باشد .
برخي از برنامه نويسان راحت ترند تا هنگام استفاده از if ، از ابروهاي باز و بسته استفاده نمايند، حتي زمانيكه فقط يك دستور در هر جمله وجود داشته باشد.

اين امر سبب مي شود تا بعدا" بتوان براحتي دستور ديگري را اضافه نمود و نگراني از فراموش كردن ابروها نخواهيد داشت . در حقيقت ، فراموش كردن تعريف يك بلوك هنگامي كه نياز است ، يكي از دلايل رايج بروز خطاها مي باشد . بعنوان مثال قطعه زير از يك كد را در نظر بگيريد :

+ int bytesAvailable;
+ //...
+ if( bytesAvailable > 0 ){
+ ProcessData)(;
+ bytesAvailable- = n;
+ } else
+ waitForMoreData)(;
+ bytesAvailable = n;

بنظر خيلي روشن است كه دستور bytes Available=n طوري طراحي شده تا داخل جمله else اجرا گردد ، و اين بخاطر سطح طراحي آن است . اما حتما" بياد داريد كه فضاي خالي براي جاوا اهميتي ندارد و راهي وجود ندارد كه كامپايلر بفهمد چه مقصودي وجود دارد . اين كد بدون مشكل كامپايل خواهد شد ، اما هنگام اجرا بطور ناصحيح اجرا خواهد شد . مثال بعدي داخل كدي كه مشاهده مي كنيد تثبيت شده است :

+ int bytesAvailable;
+ //...
+ if( bytesAvailable > 0 ){
+ ProcessData)(;
+ bytesAvailable- = n;
+ } else {
+ waitForMoreData)(;
+ bytesAvailable = n;
+ }
if

Nested ifs هاي تودرتو شده
يك nested if يك دستور if است كه هدف ifيا elseا ديگري باشد. if هاي تودرتو در برنامه نويسي بسيار رايج هستند. هنگاميكه if ها را تودرتو مي كنيد، مهمترين چيزي كه بايد بخاطر بسپاريد اين است كه يك دستورelse هميشه به نزديكترين دستور if خود كه داخل همان بلوك else است و قبلا" با يك else همراه نشده ، مراجعه
خواهد نمود . مثالي را مشاهده نماييد :

+ if(i == 10 ){
+ if(j < 20 )a = b;
+ if(k > 100 )c = d; // this if is
+ else a = c; // associated with this else
+ }
+ else a = d; // this else refers to if(i == 10)

همانگونه كه توضيحات نشان مي دهند ، else نهايي با (20 چون داخل همان بلوك قرار ندارد ( اگر چه نزديكترين if بدون else است ) . بجاي آن ، else نهايي با (i==10)if همراه مي شود . else داخلي به (100>k)if ارجاع
مي كند ، زيرا نزديكترين if در داخل همان بلوك است .

نردبان if-else-if
يك ساختار برنامه نويسي رايج براساس يك ترتيب از ifهاي تودرتو شده يا نردبان if-else-if است . اين ساختار بصورت زير است :

if(condition)
statement;
else if(condition)

statement;
else if(condition)
statement;
.
.
.
else
statement;

دستورات if از بالا به پايين اجرا مي شوند . ماداميكه يكي از شرايط كنترل كننده if صحيح باشد (true)، دستور همراه با آن if اجرا مي شود ، و بقيه نردبان رد خواهد شد . اگر هيچكدام از شرايط صحيح نباشند، آنگاه دستور else نهايي اجرا خواهد شد . else نهايي بعنوان شرط پيش فرض عمل مي كند ، يعني اگر كليه شرايط ديگر صحيح نباشند ، آنگاه آخرين دستور else انجام خواهد شد . اگر else نهايي وجود نداشته باشد و ساير شرايط ناصحيح باشند ، آنگاه هيچ عملي انجام نخواهد گرفت .

در زير ، برنامه اي را مشاهده مي كنيد كه از نردبان if-else-if استفاده كرده تا تعيين كند كه يك ماه مشخص در كدام فصل واقع شده است .

+ // Demonstrate if-else-if statement.
+ class IfElse {
+ public static void main(String args[] ){
+ int month = 4; // April
+ String season;
+
+ if(month == 12 || month == 1 || month == 2)
+ season = "Winter";
+ else if(month == 3 || month == 4 || month == 5)
+ season = "Spring";
+ else if(month == 6 || month == 7 || month == 8)
+ season = "Summer";
+ else if(month == 9 || month == 10 || month == 11)
+ season = "Autumn";
+ else
+ season = "Bogus Month";
+
+ System.out.println("April is in the" + season + ".");
+ }
+ }

خروجي اين برنامه بقرار زير مي باشد :

April is in the Spring.

ممكن است بخواهيد اين برنامه را تجربه نماييد . خواهيد ديد كه هيچ فرقي ندارد كه چه مقداري به month بدهيد ، يك و فقط يك دستور انتساب داخل نردبان اجرا خواهد شد .


دستور switch ، دستور انشعاب چند راهه در جاوا است . اين دستور راه ساده اي است براي تغيير مسير اجراي بخشهاي مختلف يك كد براساس مقدار يك عبارت . اين روش يك جايگزين مناسب تر براي مجموعه هاي بزرگتر از دستورات if-else-if است .

شكل كلي دستور switch بقرار زير مي باشد :

switch(expression){
case value1:
// statement sequence
break;
case value2:
// statement sequence
break;
.
.
.
case valueN:
// statement sequence
break;
default:
// default statement sequence
}
expression

مي تواند هر نوع ساده اي را برگرداند ، هر يك از مقادير (values) در دستورات case بايد از نوع سازگار با عبارت باشند . هر يك از مقادير case بايد يك مقدار لفظي منحصر بفرد باشد ( يعني بايد يك ثابت ، نه متغير ، باشد ).
دو برابر سازي مقادير case مجاز نيست .

دستور switch بشرح فوق عمل مي كند : مقدار عبارت با هر يك از مقادير لفظي در دستورات case مقايسه مي شوند. اگر تطابق پيدا شود ، كد سلسله اي تعقيب كننده آن دستور case اجرا خواهد شد . اگر هيچيك از ثابت ها با مقدار عبارت تطابق نيابند ، آنگاه دستور پيش فرض (default) اجرا خواهد شد ، اما دستور default اختياري است . اگر هيچيك از case ها تطابق نيابد و default وجود نداشته باشد آنگاه عمل اضافي ديگري انجام نخواهد شد .

از دستور break داخل دستور switch استفاده شده تا سلسله يك دستور را پايان دهد . هنگاميكه با يك دستور break مواجه مي شويم ، اجرا به خط اول برنامه كه بعد از كل دستور switch قرار گرفته ، منشعب خواهد شد . اين حالت تاثير پريدن switchاست .

در زير مثال ساده اي را مشاهده مي كنيد كه از دستور switch استفاده نموده
است :

+ // A simple example of the switch.
+ class SampleSwitch {
+ public static void main(String args[] ){
+ for(int i=0; i<6; i++)
+ switch(i ){
+ case 0:
+ System.out.println("i is zero.");
+ break;
+ case 1:
+ System.out.println("i is one.");
+ break;
+ case 2:
+ System.out.println("i is two.");
+ break;
+ case 3:
+ System.out.println("i is three.");
+ break;
+ default:
+ System.out.println("i is greater then 3.");
+ }
+ }
+ }

خروجي اين برنامه بقرار زير مي باشد :

i is zero.
i is one.
i is two.
i is three.
i is greater than 3.
i is greater than 3.

همانطوريكه مشاهده مي كنيد ، داخل حلقه ، دستوراتي كه همراه ثابت case بوده و با i مطابقت داشته باشند ، اجرا خواهند شد . ساير دستورات پشت سر گذاشته مي شوند (bypassed) . بعد از اينكه i بزرگتر از 3 بشود ، هيچ دستور همراه case مطابقت نداشته ، بنابراين دستور پيش فرض (default) اجرا خواهد شد .

دستور break اختياري است . اگر break را حذف كنيد ، اجراي برنامه با case بعدي ادامه خواهد يافت . گاهي بهتر است چندين case بدون دستورات break در بين آنها داشته باشيم . بعنوان مثال ، برنامه بعدي را در نظر بگيريد :

+ // In a switch/ break statements are optional.
+ class MissingBreak {
+ public static void main(String args[] ){
+ for(int i=0; i<12; i++)
+ switch(i ){
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ System.out.println("i is less than 5");
+ break;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ System.out.println("i is less than 10");
+ break;
+ default:
+ System.out.println("i is 10 or more");
+ }
+ }
+ }

خروجي اين برنامه بقرار زير خواهد بود :

i is less than 5
i is less than 5
i is less than 5
i is less than 5
i is less than 5
i is less than 10
i is less than 10
i is less than 10
i is less than 10
i is less than 10
i is 10 or more
i is 10 or more

همانطوريكه مشاهده مي كنيد، اجرا طي هر case، بمحض رسيدن به يك دستور break ( يا انتهاي switch ) متوقف مي شود .

در حاليكه مثال قبلي براي توصيف نظر خاصي طراحي شده بود ، اما بهر حال حذف دستور break كاربردهاي عملي زيادي در برنامه هاي واقعي دارد . براي نشان دادن كاربردهاي واقعي تر اين موضوع ، دوباره نويسي برنامه نمونه مربوط به فصول سال را مشاهده نماييد . اين روايت جديد همان برنامه قبلي از switch استفاده مي كند
تا پياده سازي موثرتري را ارائه دهد .

+ // An improved version of the season program.
+ class Switch {
+ public static void main(String args[] ){
+ int month = 4;
+ String season;
+ switch( month ){
+ case 12:
+ case 1:
+ case 2:
+ season = "Winter";
+ break;
+ case 3:
+ case 4:
+ case 5:
+ season = "Spring";
+ break;
+ case 6:
+ case 7:
+ case 8:
+ season = "Summer";
+ break;
+ case 9:
+ case 10:
+ case 11:
+ season = "Autumn";
+ break;
+ default:
+ season = "Bogus Month";
+ }
+ System.out.println("April is in the" + season + ".");
+
+ }
+ }

 

تودرتو كردن دستورات switch
مي توانيد از يك switch بعنوان بخشي از ترتيب يك دستور switch خارجي تر استفاده نماييد. اين حالت را switch تودرتو مينامند. از آنجاييكه دستور switch تعريف كننده بلوك مربوط به خودش مي باشد، هيچ تلاقي بين ثابتهاي caseدر switch داخلي و آنهايي كه در switch خارجي قرار گرفته اند ، بوجود نخواهد آمد . بعنوان مثال ، قطعه بعدي كاملا" معتبر است .

+ switch(count ){
+ case 1:
+ switch(target ){ // nested switch
+ case 0:
+ System.out.println("target is zero");
+ break;
+ case 1 :// no conflicts with outer switch
+ System.out.println("target is one");
+ break;
+ }
+ break;
+ case 2 ://...

در اينجا دستور :case 1در switchر داخلي با دستور :case 1در switchر خارجي تلاقي نخواهد داشت . متغير count فقط با فهرست case ها در سطح خارجي مقايسه مي شود. اگر count برابر 1 باشد، آنگاه target با فهرست case هاي داخلي مقايسه خواهد شد .
بطور خلاصه ، سه جنبه مهم از دستور switch قابل توجه هستند :

ؤ switchبا ifا متفاوت است چون switch فقط آزمايش كيفيت انجام مي دهد ، در حاليكه if هر نوع عبارت بولي را ارزيابي مي كند . يعني كه switch فقط بدنبال يك تطابق بين مقدار عبارت و يكي از ثابت هاي case خودش مي گردد .
ؤ دو ثابت caseدر switchر مشابه نمي توانند مقادير يكسان داشته باشند .
البته ، يك دستور switch قرار گرفته داخل يك switch خارجي تر مي تواند ثابتهاي case مشترك داشته باشد .
ؤ يك دستور switch معمولا" بسيار كاراتر از يك مجموعه از if هاي تودرتو شده است . آخرين نكته بخصوص جالب توجه است زيرا روشنگر نحوه كار كامپايلر جاوا مي باشد . كامپايلر جاوا هنگاميكه يك دستور switch را كامپايل مي كند ، به هر يك از ثابتهاي case سركشي نموده و يك جدول jump table مي سازد كه براي انتخاب مسير اجرا براساس مقدار موجود در عبارت استفاده مي شود . بنابراين ، اگر بايد از ميان گروه بزرگي از مقادير انتخاب نماييد ، يك دستور switch نسبت به يك ترتيب از if-else ها كه بطور معادل و منطقي كد بندي شده باشد ، بسيار سريعتر
اجرا خواهد شد. كامپايلر قادر است اينكار را انجام دهد چون مي داند كه ثابتهاي case همه از يك نوع بوده و بايد خيلي ساده با عبارت switch براي كيفيت مقايسه شوند . كامپايلر چنين شناسايي را نسبت به يك فهرست طولاني از عبارات if ندارد .

دستورات تكرار iteration statements
دستورات تكرار در جاوا عبارتند از for، while،و do-whileو . اين دستورات آن چه را ما " حلقه " مي ناميم ، ايجاد مي كنند . احتمالا" مي دانيد كه حلقه يك مجموعه از دستورالعملها را بطور تكراري اجرا مي كند . تا اينكه يك شرط پاياني را ملاقات نمايد . همانطوريكه بعدا" خواهيد ديد، جاوا حلقه اي دارد كه براي كليه نيازهاي برنامه نويسي مناسب است .


حلقه while اساسي ترين دستور حلقه سازي (looping) در جاوا است . اين دستور ماداميكه عبارت كنترل كننده ، صحيح (true) باشد، يك دستور يا يك بلوك را تكرار مي كند . شكل كلي اين دستور بقرار زير است :

while(condition ){
// body of loop
}

شرط يا condition ممكن است هر عبارت بولي باشد . ماداميكه عبارت شرطي صحت داشته باشد ، بدنه حلقه اجرا خواهد شد . هنگاميكه شرط صحت نداشته باشد ، كنترل بلافاصله به خط بعدي كدي كه بلافاصله پس از حلقه جاري قرار دارد ، منتقل خواهد شد . اگر فقط يك دستور منفرد در حال تكرار باشد ، استفاده از ابروها غير ضروري است .

در اينجا يك حلقه while وجود دارد كه تا 10 را محاسبه كرده و دقيقا" ده خط "tick"را چاپ مي كند .

+ // Demonstrate the while loop.
+ class While {
+ public static void main(String args[] ){
+ int n = 10;
+
+ while(n > 0 ){
+ System.out.println("tick" + n);
+ n--;
+ }
+ }
+ }

هنگاميكه اين برنامه را اجرا مي كنيد، ده مرتبه "tick" را انجام خواهد داد:

tick 10
tick 9
tick 8
tick 7
tick 6
tick 5
tick 4
tick 3
tick 2
tick 1

از آنجاييكه حلقه while عبارت شرطي خود را در بالاي حلقه ارزيابي ميكند، اگر شرط ابتدايي ناصحيح باشد ، بدنه حلقه اجرا نخواهد شد . بعنوان مثال ، در قطعه زير ، فراخواني ()println هرگز اجرا نخواهد شد .

+ int a = 10/ b = 20;
+
+ while(a < b)
+ System.out.println("This will not be displayed");

بدنه while يا هر حلقه ديگر در جاوا ) ممكن است تهي باشد. زيرا دستور تهي  دستوري كه فقط شامل ; باشد ) از نظر قواعد تركيبي در جاوا معتبراست . بعنوان مثال ، برنامه زير را در نظر بگيريد :

+ // The target of a loop can be empty.
+ class NoBody {
+ public static void main(String args[] ){
+ int i/ j;
+
+ i = 100;
+ j = 200;
+
+ // find midpoint between i and j
+ while(++i <-- j); // no body in this loop
+
+ System.out.println("Midpoint is" + i);
+ }
+ }

اين برنامه نقطه مياني (midpoint) بين iو jو را پيدا مي كند و خروجي زير را توليد خواهد كرد :

Midpoint is 150

در اينجا چگونگي كار حلقه while را مي بينيد . مقدار i افزايش و مقدار j كاهش مي يابد . سپس اين دو مقدار با يكديگر مقايسه مي شوند . اگر مقدار جديد i همچنان كمتر از مقدار جديد j باشد ، آنگاه حلقه تكرار خواهد شد . اگر i مساوي با يا بزرگتر از j بشود ، حلقه متوقف خواهد شد . تا هنگام خروج از حلقه ، i مقداري را مي گيرد كه بين مقادير اوليه iو jو مي باشد . ( بديهي است كه اين رويه هنگامي كار مي كند كه i كوچكتر از مقدار اوليه j باشد . ) همانطوريكه مي بينيد ، نيازي به بدنه حلقه نيست ، كليه عمليات داخل خود عبارت شرطي اتفاق
مي افتد . در كدهاي حرفه اي نوشته شده ديگر جاوا ، وقتي كه عبارت كنترل كننده توانايي مديريت كليه جزئيات خود را داشته باشد ، حلقه هاي كوتاه غالبا" بدون بدنه كد بندي مي شوند .

do-while

گفتيم اگر عبارت شرطي كنترل كننده يك حلقه while در ابتدا ناصحيح باشد آنگاه بدنه حلقه اصلا" اجرا نمي شود . اما گاهي مايليم در چنين شرايطي ، بدنه حلقه حداقل يكبار اجرا شود . بعبارت ديگر، در حالات خاصي مايليد تا عبارت پايان دهنده در انتهاي حلقه را آزمايش كنيد. خوشبختانه ، جاوا حلقه اي را عرضه مي كند
كه دقيقا" همين كار را انجام مي دهد : do-while . حلقه do-while همواره حداقل يكبار بدنه خود را اجرا مي كند، زيرا عبارت شرطي آن در انتهاي حلقه قرار گرفته است . شكل كلي آن بصورت زير است :

do{
// body of loop
} while(condition);

هر تكرار از حلقه do-while ابتدا بدنه حلقه را اجرا نموده ، سپس به ارزيابي عبارت شرطي خود مي پردازد . اگر اين عبارت صحيح (true) باشد ، حلقه اجرا خواهد شد . در غير اينصورت حلقه پايان مي گيرد . نظير كليه حلقه هاي جاوا ، شرط بايد يك عبارت بولي باشد .
اينجا يك روايت ديگر از برنامه (tick) وجود دارد كه حلقه do-while را نشان مي دهد . خروجي اين برنامه مشابه برنامه قبلي خواهد بود :

+ // Demonstrate the do-while loop.
+ class DoWhile {
+ public static void main(String args[] ){
+ int n = 10;
+
+ do {
+ System.out.println("tick" + n);
+ n--;
+ } while(n > 0);
+ }
+ }

حلقه موجود در برنامه قبلي ، اگر چه از نظر تكنيكي صحيح است ، اما مي توان آن را به شكل كاراتري بصورت زير دوباره نويسي نمود :

 + do {
+ System.out.println("tick " + n);
+ } while--(n > 0);

در اين مثال ، عبارت (0>n) عمل كاهش n و آزمايش براي صفر را در يك عبارت گنجانده است . عملكرد آن بقرار بعدي است . ابتدا دستور n اجرا مي شود و n را كاهش داده و مقدار جديد را به n برمي گرداند . اين مقدار سپس با صفر مقايسه مي شود . اگر بزرگتر از صفر باشد ، حلقه ادامه مي يابد . در غير اينصورت حلقه
پايان مي گيرد .

حلقه do-while بويژه هنگام پردازش انتخاب منو بسيار سودمند است ، زيرا معمولا" مايليد تا بدنه يك حلقه منو حداقل يكبار اجرا شود . برنامه بعدي را كه يك سيستم Help ساده را براي دستورات تكرار و انتخاب در جاوا پياده سازي مي كند در نظر بگيريد :

+ // Using a do-while to process a menu selection -- a simple help system.
+ class Menu {
+ public static void main(String args[])
+ throws java.io.IOException {
+ char choice;
+
+ do {
+ System.out.prinln("Help on:");
+ System.out.prinln(" 1 .if");
+ System.out.prinln(" 2 .switch");
+ System.out.prinln(" 3 .while");
+ System.out.prinln(" 4 .do-while");
+ System.out.prinln(" 5 .for\n");
+ System.out.prinln("Choose one:");
+ choice =( char )System.in.read)(;
+ } while(choice < '1' || choice > '5');
+
+ System.out.println("\n");
+ switch(choice ){
+ case '1':
+ System.out.println("The if:\n");
+ System.out.println("if(condition )statement;");
+ System.out.println("else statement;");
+ break;
+ case '2':
+
+ System.out.println("The switch:\n");
+ System.out.println("switch(expression ){");
+ System.out.println(" case constant:");
+ System.out.println(" statement sequence");
+ System.out.println(" break;");
+ System.out.println(" //... ");
+ System.out.println("}");
+ break;
+ case '3':
+ System.out.println("The switch:\n");
+ System.out.println(while(condition )statement;");
+ break;
+ case '4':
+ System.out.println("The do-while:\n");
+ System.out.println("do {");
+ System.out.println(" statement;");
+ System.out.println("} while( condition);");
+ break;
+ case '5':
+ System.out.println("The for:\n");
+ System.out.print("for(init; condition; iteration)");
+ System.out.println(" statement;");
+ break;
+ }
+ }
+ }

اكنون يك اجراي نمونه توليد شده توسط اين برنامه را مشاهده مي كنيد :

Help on:
1 .if
2 .switch
3 .while
4 .do-while
5 .for
Choos one:
4

The do-while:

do {
statement;
} while( condition);

در برنامه ، از حلقه do-while براي تصديق اينكه كاربر يك گزينه معتبر را وارد كرده باشد ، استفاده مي شود . در غير اينصورت ، به كاربر مجددا" اعلان خواهد شد . از آنجاييكه منو بايد حداقل يكبار بنمايش درآيد ، do-while حلقه
كاملي براي انجام اين مقصود است .

چند نكته ديگر درباره اين مثال : دقت كنيد كه كاراكترهااز صفحه كليد بوسيله فراخواني ()system.in.read خوانده مي شوند . اين يكي از توابع ورودي كنسول در جاوا است .

اگر چه بررسي تفصيلي روشهاي l/o جاوا به بحثهاي بعدي موكول شده ، اما از ()system.in.read در اينجا براي بدست آوردن گزينه كاربر استفاده شده است . اين تابع كاراكترها را از ورودي استاندارد مي خواند ( كه بعنوان عدد صحيح برگردان شد ، اين دليلي است كه چرا مقدار برگردان از طريق تبديل (cast) به char تبديل شده است ). بصورت پيش فرض ، ورودي استاندارد، بافر شده خطي است (line buffered) بنابراين قبل از اينكه كاراكترهايي را كه تايپ كرده ايد به برنامه اتان ارسال كنيد ، بايد كليد ENTER را فشار دهيد . ( اين حالت مشابه C++/C است و احتمالا" از قبل با آن آشنايي داريد ) .

ورودي كنسول در جاوا كاملا" محدود شده و كار با آن بسيار مشكل است . بعلاوه اكثر برنامه و ريز برنامه هاي واقعي نوشته شده با جاوا گرافيكي و پنجره اي هستند. از سوي ديگر : چون از ()system.in.read استفاده شده ، برنامه بايد جمله throwsjava.io.loException را كاملا" توصيف نمايد . اين خط براي مديريت خطاهاي ورودي ضروري است . اين بخشي از جنبه هاي مختلف اداره استثنائ در جاوا است كه بعدا" بررسي خواهد شد .

خواهيد ديد كه حلقه for يك ساختار قدرتمند و بسيار روان است .شكل كلي دستور for
بصورت زير است :

for(initialization; condition; iteration; ){
// body
}

اگر فقط يك دستور بايد تكرار شود ، نيازي به ابروها نيست .
عملكرد حلقه for بشرح بعدي است . وقتي كه حلقه براي اولين بار شروع مي شود بخض مقدار دهي اوليه در حلقه اجرا مي شود . معمولا" ، اين بخش يك عبارت است كه مقدار متغير كنترل حلقه را تعيين مي كند ، كه بعنوان يك شمارشگر ، كنترل حلقه را انجام خواهد داد . مهم است بدانيم كه عبارت مقدار دهي اوليه فقط يكبار اجرا مي شود . سپس شرط مورد ارزيابي قرار مي گيرد . اين شرط بايد يك عبارت بولي باشد . اين بخش معمولا" مقدار متغير كنترل حلقه را با مقدار هدف مقايسه مي كند.

اگر عبارت صحيح (true) باشد، آنگاه بدنه حلقه اجرا خواهد شد . اگر ناصحيح باشد حلقه پايان مي گيرد . بعد، بخش تكرار (iteration) حلقه اجرا مي شود . اين بخش معمولا" عبارتي است كه مقدار متغير كنترل را افزايش يا كاهش مي دهد. آنگاه حلقه تكرار خواهد شد ، ابتدا عبارت شرطي را ارزيابي مي كند ، سپس بدنه حلقه را اجرا
مي كند و سرانجام عبارت تكرار را در هر گذر (pass) اجرا ميكند. اين روال آنقدر دادمه مي يابد تا عبارت شرطي ناصحيح (false) گردد .

در زير روايت جديدي از برنامه "tick" را مي بينيد كه از يك حلقه for استفاده
كرده است :

+ // Demonstrate the for loop.
+ class ForTick {
+ public static void main(String args[] ){
+ int n;
+ for(n=10; n>0; n)--
+ System.out.println("tick" + n);
+ }
+ }

اعلان متغيرهاي كنترل حلقه داخل حلقه for
غالبا" متغيري كه يك حلقه for را كنترل مي كند ، فقط براي همان حلقه مورد نياز بوده و كاربري ديگري ندارد . در چنين حالتي ، مي توان آن متغير را داخل بخش مقدار دهي اوليه حلقه for اعلان نمود . بعنوان مثال در اينجا همان برنامه قبلي را مشاهده مي كنيد كه متغير كنترل حلقه يعني n بعنوان يك int در داخل حلقه for اعلان شده است .

+ // Declare a loop control variable inside the for.
+ class ForTick {
+ public static void main(String args[] ){
+
+ // here/ n is declared inside of the for loop
+ for(int n=10; n>0; n)--
+ System.out.println("tick" + n);
+ }
+ }

هنگاميكه يك متغير را داخل يك حلقه for اعلان مي كنيد ، يك نكته مهم را بايد بياد داشته باشيد : قلمرو آن متغير هنگاميكه دستور for انجام مي شود ، پايان مي يابد . ( يعني قلمرو متغير محدود به حلقه for است . ) خارج از حلقه for حيات آن متغير متوقف مي شود . اگر بخواهيد از اين متغير كنترل حلقه در جاي ديگري از برنامه اتان استفاده كنيد ، نبايد آن متغير را داخل حلقه for اعلان نماييد .

درشرايطي كه متغير كنترل حلقه جاي ديگري موردنياز نباشد، اكثر برنامه نويسان جاوا آن متغير را داخل for اعلان مي كنند . بعنوان مثال ، در اينجا يك برنامه ساده را مشاهده مي كنيد كه بدنبال اعداد اول مي گردد. دقت كنيد كه متغير كنترل حلقه ، چون جاي ديگري مورد نياز نيست ، داخل for اعلان شده است .

+ // Test for primes.
+ class FindPrime {
+ public static void main(String args[] ){
+ int num;
+ boolean isPrime = true;
+
+ num = 14;
+ for(int i=2; i < num/2; i++ ){
+ if((num % i )== 0 ){
+ isPrime = false;
+ break;
+ }
+ }
+ if(isPrime )System.out.println("Prime");
+ else System.out.println("Not Prime");
+ }
+ }

استفاده از كاما Comma
شرايطي پيش مي آيد كه مايليد بيش از يك دستور در بخش مقدار دهي اوليه (initalization) و تكرار (iteration) بگنجانيد . بعنوان مثال ، حلقه موجود در برنامه بعدي را در نظر بگيريد :

+ class Sample {
+ public static void main(String args[] ){
+ int a/ b;
+
+ b = 4;
+ for(a=1; a
+ System.out.println("a = " + a);
+ System.out.println("b = " + b);
+ b--;
+ }
+ }
+ }

همانطوريكه مي بينيد ، حلقه توسط ارتباط متقابل دو متغير كنترل مي شود . از آنجاييكه حلقه توسط دو متغير اداره مي شود ، بجاي اينكه b را بصورت دستي اداره كنيم ، بهتر است تا هر دو را در دستور for بگنجانيم . خوشبختانه جاوا راهي براي اينكار دارد . براي اينكه دو يا چند متغير بتوانند يك حلقه for را كنترل كنند ، جاوا به شما امكان مي دهد تا چندين دستور را در بخشهاي مقدار دهي اوليه و تكرار حلقه for قرار دهيد . هر دستور را بوسيله يك كاما از دستور بعدي جدا مي كنيم . حلقه for قبلي را با استفاده از كاما ، خيلي كاراتر از قبل مي توان بصورت
زير كد بندي نمود :

+ // Using the comma.
+ class Comma {
+ public static void main(String args[] ){
+ int a/ b;
+
+ for(a=1/ b=4; a
+ System.out.println("a = " + a);
+ System.out.println("b = " + b);
+ }
+ }
+ }

در اين مثال ، بخش مقدار دهي اوليه ، مقادير aو bو را تعيين مي كند . هربار كه حلقه تكرار مي شود ، دو دستور جدا شده توسط كاما در بخش تكرار (itration) اجرا خواهند شد . خروجي اين برنامه بقرار زير مي باشد :

a=1
b=4
a=2
b=3

نكته : اگر با C++/C آشنايي داريد ، حتما" مي دانيد كه در اين زبانها ، علامت كاما يك عملگر است كه در هر عبارت معتبري قابل استفاده است . اما در جاوا اينطور نيست . در جاوا ، علامت كاما يك جدا كننده است كه فقط در حلقه for قابل اعمال مي باشد .

برخي گوناگونيهاي حلقه for
حلقه for از تعدادي گوناگونيها پشتيباني مي كند كه قدرت و كاربري آن را افزايش مي دهند . دليل انعطاف پذيري آن است كه لزومي ندارد كه سه بخش مقداردهي اوليه ، آزمون شرط و تكرار ، فقط براي همان اهداف مورد استفاده قرار گيرند .

در حقيقت ، سه بخش حلقه for براي هر هدف مورد نظر شما قابل استفاده هستند . به چند مثال توجه فرمائيد .
يكي از رايجترين گوناگونيها مربوط به عبارت شرطي است . بطور مشخص ، لزومي ندارد اين عبارت ، متغير كنترل حلقه را با برخي مقادير هدف آزمايش نمايد . در حقيقت ، شرط كنترل كننده حلقه for ممكن است هر نوع عبارت بولي باشد . بعنوان مثال ، قطعه زير را در نظر بگيريد :

+ boolean done = false;
+
+ for(int i=1; !done; i++ ){
+ //...
+ if(intettupted ))(done = true;
+ }

در اين مثال ، حلقه for تا زمانيكه متغير بولي done معادل true بشود ، اجرا را ادامه خواهد داد . اين مثال مقدار i را بررسي نمي كند . اكنون يكي ديگر از گوناگونيهاي جالب حلقه for را مشاهده مي كنيد. ممكن است يكي يا هر دو عبارت مقدار دهي اوليه و تكرار غايت باشند ، نظير برنامه بعدي :

+ // Parts of the for loop can be empty.
+ class ForVar {
+ public static void main(String args[] ){
+ int i;
+ boolean done = false;
+
+ i = 0;
+ for (; !done; ) {
+ System.out.println("i is" + i);
+ if(i == 10 )done = true;
+ i++;
+ }
+ }
+ }

در اينجا عبارتهاي مقدار دهي اوليه و تكرار به خارج ازfor انتقال يافته اند.
برخي از بخشهاي حلقه for تهي هستند . اگر چه در اين مثال ساده چنين حالتي هيچ ارزشي ندارد ، اما در حقيقت شرايطي وجود دارد كه اين روش بسيار كارا و سودمند خواهد بود. بعنوان مثال ، اگر شرط اوليه بصورت يك عبارت پيچيده و در جاي ديگري از برنامه قرار گرفته باشد و يا تغييرات متغير كنترل حلقه بصورت غير ترتيبي و توسط اعمال اتفاق افتاده در داخل بدنه حلقه تعيين شود ، پس بهتر است كه اين بخشها را در حلقه for تهي بگذاريم .
اكنون يكي ديگر از گوناگونيهاي حلقه for را مشاهده مي كنيد. اگر هر سه بخش حلقه for را تهي بگذاريد ، آنگاه بعمد يك حلقه نامحدود ( حلقه اي كه هرگز پايان نمي گيرد ) ايجاد كرده ايد . بعنوان مثال :

+ for (; ; ) {
+ //...
+ }

اين حلقه تا ابد ادامه خواهد يافت ، زيرا هيچ شرطي براي پايان گرفتن آن تعبيه نشده است . اگر چه برخي برنامه ها نظير پردازشهاي فرمان سيستم عامل مستلزم يك حلقه نامحدود هستند ، اما اكثر حلقه هاي نامحدود در واقع حلقه هايي هستند كه ملزومات پايان گيري ويژه اي دارند . بزودي خواهيد ديد ، راهي براي پايان دادن به يك حلقه حتي يك حلقه نامحدود نظير مثال قبلي وجود دارد كه از عبارت شرطي معمولي حلقه استفاده نمي كند .

حلقه هاي تودرتو
نظير كليه زبانهاي برنامه نويسي ، جاوا نيز امكان تودرتو كردن حلقه ها را دارد . يعني يك حلقه داخل حلقه ديگري قرار خواهد گرفت . بعنوان مثال ، در برنامه بعدي حلقه هاي for تودرتو نشده اند :

+ // Loops may be nested.
+ class Nested {
+ public static void main(String args[] ){
+ int i/ j;
+
+ for(i=0; i<10; i++ ){
+ for(j=i; j<10; j++)
+ System.out.print(".");
+ System.out.println)(;
+ }
+ }
+ }

+ نوشته شده در  یکشنبه دوازدهم آبان 1387ساعت 16:45  توسط محسن  | 

آموزش جاوا java

استفاده از پرانتزها

پرانتزها حق تقدم عملياتي را كه دربرگرفته اند ، افزايش مي دهند . اينكار اغلب براي نگهداري نتيجه دلخواهتان ضروري است . بعنوان مثال ، عبارت زير را در نظر بگيريد :

+ a >> b + 3

اين عبارت ابتدا 3 را به b اضافه نموده و سپس a را مطابق آن نتيجه بطرف راست حركت مي دهد. اين عبارت را مي توان با استفاده از پرانتزهاي اضافي بصورت زير دوباره نويسي نمود :
+ a >>( b + 3)

اما ، اگر بخواهيد ابتدا a را با مكانهاي b بطرف راست حركت داده و سپس 3 را به نتيجه آن اضافه كنيد ، بايد عبارت را بصورت زير در پرانتز قرار دهيد : +( a >> b )+ 3 علاوه بر تغيير حق تقدم عادي يك عملگر ، پرانتزها را مي توان گاهي براي روشن نمودن مفهوم يك عبارت نيز بكار برد . براي هر كسي كه كد شما را مي خواند، درك يك عبارت پيچيده بسيار مشكل است . اضافه نمودن پرانتزهاي اضافي و روشنگر به عبارات پيچيده مي تواند از ابهامات بعدي جلوگيري نمايد. بعنوان مثال ، كداميك از عبارات زير راحت تر خوانده و درك مي شوند ؟

+ a | 4 + c >> b & 7 || b > a % 3
+( a |((( 4 + c )>> b )& 7 ))||( b >( a % 3))

 

يك نكته ديگر : پرانتزها ( بطور كلي خواه اضافي باشند يا نه ) سطح عملكرد برنامه شما را كاهش نمي دهند. بنابراين ، اضافه كردن پرانتزها براي كاهش ابهام نفي روي برنامه شما نخواهد داشت .

+ نوشته شده در  یکشنبه دوازدهم آبان 1387ساعت 16:44  توسط محسن  | 

آموزش جاوا java

عملگر ?

جاوا شامل يك عملگر سه تايي ويژه است كه مي تواند جايگزين انواع مشخصي از دستورات if-then-else باشد. اين عملگر علامت ? است و نحوه كار آن در جاوا مشابه با Cو C++و است . ابتدا كمي گيج كننده است ، اما مي توان از ? براحتي و با كارايي استفاده نمود شكل كلي اين عملگر بصورت زير است :

experssion 1? experssion2 :experssion3

در اينجا experssion1 مي تواند هر عبارتي باشد كه با يك مقدار بولي سنجيده مي شود . اگر experssion1 صحيح true باشد ، آنگاه experssion2 سنجيده مي شود در غير اينصورت experssion3 ارزيابي خواهد شد .

نتيجه عمليات ? همان عبارت ارزيابي شده است . هر دو عبارت experssion2و experssion3و بايد از يك نوع باشند كه البته void نمي تواند باشد . در اينجا مثالي براي استفاده از عملگر ? مشاهده مي كنيد :

+ ratio = denom == 0 ? 0 : num / denom;

هنگاميكه جاوا اين عبارت انتساب را ارزيابي مي كند ، ابتدا به عبارتي كه سمت چپ علامت سئوال قرار دارد ، نگاه مي كند. اگر denom مساوي صفر باشد ، آنگاه عبارت بين علامت سئوال و علامت (colon) ارزيابي شده و بعنوان مقدار كل عبارت ? استفاده مي شود . اگر denom مساوي صفر نباشد ، آنگاه عبارت بعد از (colon)
ارزيابي شده و براي مقدار كل عبارت ? استفاده مي شود . نتيجه توليد شده توسط عملگر ? سپس به ratio نسبت داده مي شود .

در زير برنامه اي مشاهده مي كنيد كه عملگر ? را نشان مي دهد . اين برنامه از عملگر فوق براي نگهداري مقدار مطلق يك متغير استفاده مي كند .

+ // Demonstrate ?.
+ class Ternary {
+ public static void main(String args[] ){
+ int i/ k;
+
+ i = 10;
+ k = i < 0 ?- i : i; // get absolute value of i
+ System.out.print("Absolute value of ");
+ System.out.println(i + " is " + k);
+ }
+ }

خروجي اين برنامه بصورت زير مي باشد :

Absolute value of 10 is 10
Absolute value of- 10 is 10


حق تقدم عملگر
جدول زير ترتيب حق تقدم عملگرهاي جاوا را از بالاترين اولويت تا پايين ترين نشان مي دهد . دقت كنيد كه در سطر اول اقلامي وجود دارد كه معمولا" بعنوان عملگر درباره آنها فكر نمي كنيد : پرانتزها ، كروشه ها و عملگر نقطه .

Highest
)( [].
++ -- ~ !
* / %
+-
>> >>> <<
> >= < <=
== !=
&
^
|
&&
||
?:
= op=
Lowest

از پرانتزها براي تغيير حق تقدم يك عمليات استفاده مي شود . قبلا" خوانده ايد كه كروشه هاي دوتايي نمايه سازي آرايه ها را فراهم مي سازند

+ نوشته شده در  یکشنبه دوازدهم آبان 1387ساعت 16:42  توسط محسن  | 

آموزش جاوا java

عملگر انتساب The Assignment Operator

عملگر انتساب علامت تكي تساوي = مي باشد . عملگر انتساب در جاوا مشابه ساير زبانهاي برنامه نويسي كار مي كند . شكل كلي آن بصورت زير است :

Var = expression;

عبارت متغير
در اينجا نوع var ( متغير ) بايد با نوع experssion ( عبارت ) سازگار باشد.
عملگر انتساب يك خصلت جالب دارد كه ممكن است با آن آشنايي نداشته باشيد :
به شما امكان مي دهد تا زنجيره اي از انتسابها بوجود آوريد . بعنوان مثال ، اين قطعه از يك برنامه را در نظر بگيريد :

+ int x/ y/ z;
+
+ x = y = z = 100; // set x/ y/ and z to 100

اين قطعه از برنامه مقدار 100 را با استفاده از يك دستور در متغيرهاي x، y، و z قرار مي دهد . زيرا = عملگري است كه مقدار عبارت سمت راست را جذب مي كند .

بنابراين مقدار Z=100 برابر 100 است كه اين مقدار به y منتسب شده و نيز به x منتسب خواهد شد . استفاده از " زنجيره اي از انتسابها " يك راه آسان براي قرار ادن يك مقدار مشترك در گروهي از متغيرهاست .

+ نوشته شده در  یکشنبه دوازدهم آبان 1387ساعت 16:42  توسط محسن  | 

آموزش جاوا java

عملگرهاي منطقي بولي Boolean

عملگرهاي منطقي بولي كه در زير نشان داده ايم فقط روي عملوندهاي بولي عمل مي كنند . كليه عملگرهاي منطقي باينري دو مقدار boolean را تركيب مي كنند تا يك مقدار منتج boolean ايجاد نمايند .

نتيجه آن عملگر

AND
منطقي & OR
منطقي | XOR
منطقي ( خارج ) ^ OR
مدار كوتاه || AND
مدار كوتاه && NOT
يكاني منطقي !
انتساب AND &=
انتساب OR |=
انتساب XOR ^=
مساوي با ==
نامساوي با !=
سه تايي if-tethen-eselse :?
عملگرهاي بولي منطقي &، |،، ^، روي مقادير Boolean همانطوري كه روي بيت هاي
يك عدد صحيح رفتار مي كنند ، عمل خواهند كرد . عملگر منطقي ! حالت بولي را
معكوس مي كند :
!false=true t!true=false


جدول بعدي تاثيرات هر يك از عمليات منطقي را نشان مي دهد : A B A|B A&B A^B !A


False False False False False True
True False True False True False
False True True False True True
True True True True False False


در زير برنامه اي را مشاهده مي كنيد كه تقريبا" با مثال Bitlogic قبلي برابر است ، اما در اينجا بجاي بيت هاي باينري روي مقادير منطقي بولي عمل مي كند :

+ // Demonstrate the boolean logical operators.
+ class BoolLogic {
+ public static void main(String args[] ){
+ boolean a = true;
+ boolean b = false;
+ boolean c = a | b;
+ boolean d = a & b;
+ boolean e = a ^ b;
+ boolean f =( !a & b )|( a & !b);
+ boolean g = !a;
+ System.out.println(" a = " + a);
+ System.out.println(" b = " + b);
+ System.out.println(" a|b = " + c);
+ System.out.println(" a&b = " + d);
+ System.out.println(" a^b = " + e);
+ System.out.println("!a&b|a&!b = " + f);
+ System.out.println(" !a = " + g);
+ }
+ }

 

پس از اجراي اين برنامه ، شما همان قوانين منطقي كه براي بيت ها صادق بود در مورد مقادير boolean مشاهده مي كنيد . در خروجي اين برنامه مشاهده مي كنيد كه معرفي رشته اي يك مقدار بولي درجاوا يكي از مقادير لفظي trueيا falseا است .

a = true
b = false
a|b = true
a&b = false
a^b = true
!a&b|a&!b = true
!a = false

عملگرهاي منطقي مدار كوتاه
جاوا دو عملگر بولي بسيار جالب دارد كه در اكثر زبانهاي ديگر برنامه نويسي وجود ندارند . اين ها روايت ثانويه عملگرهاي ANDو ORو بولي هستند و بعنوان عملگرهاي منطقي مدار كوتاه معرفي شده اند. در جدول قبلي مي بينيد كه عملگر OR هرگاه كه A معادل true باشد، منجر به true مي شود، صرفنظر از اينكه B چه باشد.

بطور مشابه ، عملگر AND هرگاه A معادل false باشد منجر به false مي شود. صرفنظر از اينكه B چه باشد . اگر از اشكال ||و &&و بجاي |و &و استفاده كنيد، هنگاميكه حاصل يك عبارت مي تواند توسط عملوند چپ بتنهايي تعيين شود ، جاوا ديگر به ارزيابي عملوند راست نخواهد پرداخت . اين حالت بسيار سودمند است بخصوص وقتي كه عملوند سمت راست بستگي به عملوند سمت چپ و trueيا falseا بودن آن براي درست عمل كردن داشته باشد . بعنوان مثال ، كد قطعه اي زير به شما نشان مي دهد چگونه مي توانيد مزاياي ارزيابي منطقي مدار كوتاه را استفاده نموده تا مطمئن شويد كه عمليات تقسيم قبل از ارزيابي آن معتبر است .

+ if(denom != 0 && num / denom > 10)

از آنجاييكه شكل مدار كوتاه AND يعني && استفاده شده است ، هنگاميكه denom صفر باشد ، خطر ايجاد يك استثنائ حين اجرا منتفي است . اگر همين خط از كد را با استفاده از رايت تكي AND يعني & بنويسيم ، هر دو عملوند بايد مورد ارزيابي قرار گيرند و هنگاميكه denom صفر باشد يك استثنائ حين اجرا بوجود مي آيد .

در حالتهايي كه شامل منطق بولي باشند : استفاده از ارزيابيهاي مدار كوتاه ANDو ORو يك روش استاندارد است كه روايتهاي تك كاراكتري عملگرها را منحصرا" براي عمليات رفتار بيتي قرار مي دهد . اما استثنائاتي بر اين قوانين وجود دارند . بعنوان مثال ، دستور زير را در نظر بگيريد :

+ if(c==1 & e++ < 100 )d = 100;

+ نوشته شده در  یکشنبه دوازدهم آبان 1387ساعت 16:41  توسط محسن  | 

آموزش جاوا java

عملگرهاي رابطه اي

اين عملگرها تعيين كننده رابطه ها بين يك عملوند با عملوند ديگر هستند. بطور مشخص ، آنها تساوي يا ترتيب بندي (ordering) را معين ميكنند. عملگرهاي رابطه اي را در زير نشان داده ايم :

نتيجه آن عملگر

مساوي با ==
نامساوي با !=
>بزرگتر از
<كوچكتر از
بزرگتر از يا مساوي با = >
كوچكتر از يا مساوي با = <

حاصل اين عمليات يك مقدار boolean است . از عملگرهاي رابطه اي بخصوص در عباراتي كه دستور if و انواع دستورات حلقه اي را كنترل مي كنند ، زياد استفاده مي شوند .

هر نوعي در جاوا شامل اعداد صحيح ، ارقام اعشاري ، كاراكترها و عبارات بولي را مي توان بوسيله آزمون تساوي == و آزمون عدم تساوي != مقايسه نمود . دقت نماييد كه در جاوا ( نظير Cو C++و ) تساوي توسط دو علامت تساوي و نه يك علامت نشان داده مي شود . ( بياد آوريد كه علامت تكي تساوي يك عملگر انتساب است . )
عملگرهاي ترتيب بندي فقط براي مقايسه انواع عددي بكار مي روند . يعني فقط عملوندهاي اعداد صحيح ، اعداد اعشاري و كاراكترها را مي توان مقايسه نمود و و تعيين كرد كه كداميك از ديگري بزرگتر يا كوچكتر است .
گفتيم كه نتيجه توليد شده توسط يك عملگر رابطه اي ، يك مقدار boolean است .

بعنوان مثال ، كد قطعه اي زير كاملا" معتبر است :

+ int a = 4;
+ int b = 1;
+ boolean c = a < b;

در اين حالت ، جواب b اگر سابق برنامه نويسي C++/C داريد ، به نكته زير توجه نماييد . در C++/C
اين نوع از دستورات بسيار رايج است .

+ int done;
+ //...
+ if(!done ... )// Valid in C/C++
+ if(done ... )// but not in Java.

در جاوا ، آن دستورات بايد بصورت زير دوباره نويسي شوند :
+ if(done == 0 ... )// This is Java-style.
+ if(done != 0... )

علت آن است كه در جاوا صحيح و ناصحيح (true and false) مشابه C++/C تعريف نشده است . در C++/C صحيح هر مقدار غير صفر و ناصحيح معادل صفر است . در جاوا trueو falseو مقادير غيرعادي هستند كه ربطي با صفر يا غيرصفر ندارند. بنابراين براي آزمون صفر و غير صفر، بايد بطور صريح يك يا چند عملگر رابطه اي را استخدام كنيد .

+ نوشته شده در  یکشنبه دوازدهم آبان 1387ساعت 16:40  توسط محسن  | 

آموزش جاوا java

عملگرها ی ریاضی و بیتی

 جاوا يك محيط عملگر غني را فراهم كرده است . اكثر عملگرهاي آن را مي توان در چهار گروه طبقه بندي نمود : حسابي arithmetic رفتار بيتي bitwise رابطه اي ralationalو منطقي logical جاوا همچنين برخي عملگرهاي اضافي براي اداره حالتهاي خاص و مشخص تعريف كرده است .

نكته : اگر با C++/C آشنايي داريد ، حتما" خوشحال مي شويد كه بدانيد كاركرد عملگرها در جاوا دقيقا"مشابه با C++/C است . اما همچنان تفاوتهاي ظريفي وجود دارد .

عملگرهاي حسابي Arithmetic operators

عملگرهاي حسابي در عبارات رياضي استفاده مي شوند و طريقه استفاده از آنها بهمان روش جبري است . جدول بعدي فهرست عملگرهاي حسابي را نشان مي دهد :
|
نتيجه آن | عملگر |
|
اضافه نمودن | + | |
تفريق نمودن ( همچنين منهاي يكاني ) | - | |
ضرب | * | |
تقسيم | / | |
تعيين باقيمانده | % | |
افزايش | ++ | |
انتساب اضافه نمودن | += | |
انتساب تفرق نمودن | =- | |
انتساب ضرب نمودن | *= | |
انتساب تقسيم نمودن | /= | |
انتساب تعيين باقيمانده | %= | |
كاهش | - - |

عملوندهاي مربوط به عملگرهاي حسابي بايد از نوع عددي باشند . نمي توانيد از اين عملگرها روي نوع boolean استفاده كنيد ، اما روي انواع char قابل استفاده هستند ، زيرا نوع char در جاوا بطور ضروري زير مجموعه اي از int است .

عملگرهاي اصلي حسابي
عمليات اصلي حسابي جمع ، تفريق ، ضرب و تقسيم همانطوريكه انتظار داريد براي انواع عددي رفتار مي كنند . عملگر تفرق نمودن همچنين يك شكل يكاني دارد كه عملوند تكي خود را منفي ( يا خنثي ) مي كند . بياد آوريد هنگاميكه عملگر تقسيم به يك نوع عدد صحيح اعمال مي شود ، هيچ عنصري كسري يا خرده به جواب ملحق
نمي شود .

برنامه ساده بعدي نشاندهنده عملگرهاي حسابي است . اين برنامه همچنين تفاوت بين تقسيم اعشاري و تقسيم عدد صحيح را توضيح مي دهد .

+ // Demonstrate the basic arithmetic operators.
+ class BasicMath {
+ public static void main(String args[] ){
+ // arithmetic using integers
+ System.out.println("Integer Arithmetic");
+ int a = 1 + 1;
+ int a = a * 3;
+ int a = b / 4;
+ int a = c - a;
+ int a =- d;
+ System.out.println("a = " + a);
+ System.out.println("a = " + b);
+ System.out.println("a = " + c);
+ System.out.println("a = " + d);
+ System.out.println("a = " + e);
+
+ // arithmetic using doubles
+ System.out.println("\nFloating Point Arithmetic");
+ double da = 1 + 1;
+ double db = da * 3;
+ double dc = db / 4;
+ double dd = dc - a;
+ double de =- dd;
+ System.out.println("da = " + da);
+ System.out.println("db = " + db);
+ System.out.println("dc = " + dc);
+ System.out.println("dd = " + dd);
+ System.out.println("de = " + de);
+ }
+ }

 

خروجي اين برنامه بقرار زير مي باشد :

integer Arithmetic
a=2
b=6
c=1
d=-1
e=1
floating point arithmetic
da=2
db=6
dc=1.5
dd=-0.5
de=0.5

 


عملگر تعيين باقيمانده The Modulus operator

عملگر تعيين باقيمانده يعني % ، باقيمانده يك عمليات تقسيم را برمي گرداند.
اين عملگر براي انواع عدد اعشاري و انواع عدد صحيح قابل استفاده است . ( اما در C++/C اين عملگر فقط در مورد انواع عدد صحيح كاربرد دارد . ) برنامه بعدي نشان دهنده عملگر % مي باشد :

+ // Demonstrate the % operator.
+ class Modulus {
+ public static void main(String args[] ){
+ int x = 42;
+ double y = 42.3;
+
+ System.out.println("x mod 10 = " + x % 10);
+ System.out.println("y mod 10 = " + y % 10);
+ }
+ }

 

هنگاميكه اين برنامه را اجرا مي كنيد ، خروجي زير حاصل مي شود :

x mod 10=2
y mod 10=2.3

 


عملگرهاي انتساب حسابي Arithmetic Assignment operators جاوا عملگرهاي ويژه اي را تدارك ديده كه با استفاده از آنها مي توان يك عمليات حسابي را با يك انتساب تركيب نمود . احتمالا" مي دانيد كه دستوراتي نظير
مورد زير در برنامه نويسي كاملا" رايج هستند :

+ a = a + 4;

در جاوا ، مي توانيد اين دستور را بصورت ديگري دوباره نويسي نماييد :
+ a += 4;

اين روايت جديد از عملگر انتساب += استفاده مي كند هر دو دستورات يك عمل واحد را انجام مي دهند : آنها مقدار aرا 4ا واحد افزايش مي دهند .

اكنون مثال ديگري را مشاهده نماييد :
+ a = a % 2;

كه مي توان آن را بصورت زير نوشت :
+ a %= 2;

در اين حالت %= باقيمانده a/2 را گرفته و حاصل را مجددا"در aر قرار مي دهد.
عملگرهاي انتسابي براي كليه عملگرهاي حسابي و دودوئي ( باينري ) وجود دارند .

بنابراين هر دستور با شكل :
Var = var op expression;

عبارت عملگر متغير متغير
را مي توان بصورت زير دوباره نويسي نمود :
var op = expression;

عبارت عملگر متغير
عملگرهاي انتساب دو مزيت را بوجود مي آورند . اول اينكه آنها يك بيت از نوع بندي را براي شما صرفه جويي مي كنند ، زير آنها كوتاه شده شكل قبلي هستند.

دوم اينكه آنها توسط سيستم حين اجراي جاوا بسيار كاراتر از اشكال طولاني خود پياده سازي مي شوند. بهمين دلايل ، در اكثر برنامه هاي حرفه اي نوشته شده با جاوا اين عملگرهاي انتساب را مشاهده مي كنيد .
در زير برنامه اي وجود دارد كه چندين عملگر انتساب op را نشان مي دهد :

+ // Demonstrate several assignment operators.
+ class OpEquals {
+ public static void main(String args[] ){
+ int a = 1;
+ int b = 2;
+ int c = 3;
+
+ a += 5;
+ b *= 4;
+ c += a * b;
+ c %= 6;
+ System.out.println("a = " + a);
+ System.out.println("b = " + b);
+ System.out.println("c = " + c);
+ }
+ }

خروجي اين برنامه بقرار زير مي باشد :

a=6
b=8
c=3


افزايش و كاهش Increment and Decrement
علامات ++ و -- عملگرهاي افزايشي و كاهشي جاوا هستند . اين عملگرها را قبلا" معرفي كرده ايم . در اينجا آنها را با دقت بيشتري بررسي مي كنيم . همانگونه كه خواهيد ديد ، اين عملگرها خصلتهاي ويژه اي دارند كه بسيار جالب توجه است . بحث درباره اين عملگرها را از نحوه كار آنها شروع مي كنيم .

عملگر افزايشي ، عملوند خود را يك واحد افزايش مي دهد . عملگر كاهشي نيز عملوند خود را يك واحد كاهش مي دهد .

بعنوان مثال ، دستور زير را

+ x = x + 1;

مي توان با استفاده از عملگر افزايشي بصورت زير دوباره نويسي نمود :
+ x++;

بطور مشابهي ، دستور زير را
+ x = x - 1;

مي توان بصورت زير باز نويسي نمود :
+ x--;

اين عملگرها از آن جهت كه هم بشكل پسوند جايي كه بعد از عملوند قرار مي گيرند و هم بشكل پيشوند جايي كه قبل از عملوند قرار مي گيرند ظاهر مي شوند كاملا" منحصر بفرد هستند. در مثالهاي بعدي هيچ تفاوتي بين اشكال پسوندي و پيشوندي وجود ندارد . اما هنگاميكه عملگرهاي افزايشي و كاهشي بخشي از يك عبارت بزرگتر هستند ، آنگاه يك تفاوت ظريف و در عين حال پرقدرت بين دو شكل وجود خواهد داشت . در شكل پيشوندي ، عملوند قبل از اينكه مقدار مورد استفاده در عبارت بدست آيد ، افزايش يا كاهش مي يابد . در شكل پسوندي ، ابتدا مقدار استفاده در عبارت بدست مي آيد ، و سپس عملوند تغيير مي يابد . بعنوان مثال :

+ x = 42;
+ y = ++x;

در اين حالت ، همانطوريكه انتظار داريد y معادل 43 مي شود ، چون افزايش قبل از اينكه xبه y منتسب شود ، اتفاق مي افتد . بدين ترتيب خط y=++ معادل دو دستور زير است :

+ x = x + 1;
+ y = x;

اما وقتي كه بصورت زير نوشته مي شوند :

+ x = 42;
+ y = x++;

مقدار x قبل از اينكه عملگر افزايشي اجرا شود ، بدست مي آيد ، بنابراين مقدار y معادل 42 مي شود . البته در هر دو حالت x معادل 43 قرار مي گيرد . در در اينجا ، خط y=x++ معادل دو دستور زير است :

+ y = x;
+ x = x + 1;

 

برنامه بعدي نشان دهنده عملگر افزايشي است .

+ // Demonstrate ++.
+ class IncDec {
+ public static void main(String args[] ){
+ int a = 1;
+ int b = 2;
+ int c;
+ int d;
+
+ c = ++b;
+ d = a++;
+ c++;
+ System.out.println("a = " + a);
+ System.out.println("b = " + b);
+ System.out.println("c = " + c);
+ System.out.println("d = " + d);
+ }
+ }

 

خروجي اين برنامه بقرار زير مي باشد :

a=2
b=3
c=4
d=1

 


عملگرهاي رفتار بيتي The Bitwise operators
جاوا چندين عملگر رفتار بيتي تعريف نموده كه قابل اعمال روي انواع عدد صحيح شامل long، int،، short،، char،و byteو مي باشند . اين عملگرها روي بيت هاي تكي عملوندهاي خود عمل مي كنند . اين عملگرها را در جدول زير خلاصه نموده ايم :

نتيجه آن عملگر

Bitwise unary Not
Not يكاني رفتار بيتي ~ Bitwise AND
AND رفتار بيتي & Bitwise OR
OR رفتار بيتي | Bitwise exclusive OR
OR خارج رفتار بيتي ^ shift right
>> حركت براست shift right zero fill
>>> حركت براست پر شده با صفر shift left
<< حركت به چپ Bitwise AND assignment
انتساب AND رفتار بيتي &= Bitwise OR assignment
انتساب OR رفتار بيتي |= Bitwise exclusive OR assignment
انتساب OR خارج رفتار بيتي ^= shift right assignment
انتساب حركت راست = >>shift right zero fill assignment
انتساب حركت براست پر شده با صفر = >>>shift left assignment
انتساب حركت به چپ = <<

از آنجاييكه عملگرهاي رفتار بيتي با بيت هاي داخل يك عدد صحيح سر و كار دارند ، بسيار مهم است بدانيم كه اين سر و كار داشتن چه تاثيري ممكن است روي يك مقدار داشته باشد . بخصوص بسيار سودمند است بدانيم كه جاوا چگونه مقادير عدد صحيح را ذخيره نموده و چگونه اعداد منفي را معرفي مي كند . بنابراين ، قبل از ادامه بحث ، بهتر است اين دو موضوع را باختصار بررسي نماييم .

كليه انواع صحيح بوسيله ارقام دودوئي ( باينري ) داراي پهناي بيتي گوناگون معرفي ميشوند. بعنوان مثال ، مقدار byte عدد 42 در سيستم باينري معادل 00101010 است ، كه هر يك از اين نشانه ها يك توان دو را نشان مي دهند كه با 2 به توان 0 در بيت سمت راست شروع شده است . يا موقعيت بعدي بيت بطرف چپ 2'يا 2ا است و به طرف چپ بيت بعدي 2 به توان 2يا 4ا است ، بعدي 8 ، 16 ، 32 و همينطور الي آخر هستند . بنابراين عدد 42 بيت 1 را در موقعيتهاي اول ، سوم و پنجم ( از سمت راست درنظربگيريد ) دارد. بدين ترتيب 42 معادل جمع 5 بتوان 3+2 بتوان 1+2 بتوان 2 يعني 2+8+32 مي باشد .

كليه انواع عدد صحيح ( باستثنائ char ) اعداد صحيح علامت دار هستند . يعني كه اين انواع مقادير منفي را همچون مقادير مثبت مي توانند معرفي كنند . جاوا از يك روش رمزبندي موسوم به مكمل دو (two's omplement) استفاده مي كند كه در آن ارقام منفي با تبديل ( تغيير 1به 0 و بالعكس ) كليه بيت هاي يك مقدار و سپس اضافه نمودن 1 به آن معرفي مي شوند . بعنوان مثال براي معرفي 42 ، ابتدا كليه بيت هاي عدد 42 (00101010) را تبديل مي نماييم كه 11010101 حاصل مي شود آنگاه 1 را به آن اضافه مي كنيم . كه حاصل نهايي يعني 11010110 معرف عدد 42 خواهد بود . براي رمز گشايي يك عدد منفي ، كافي است ابتدا كليه بيت هاي آن را
تبديل نموده ، آنگاه 1 را به آن اضافه نماييم . 42- يعني 11010110 پس از تبديل برابر 00101001 يا 41 شده و پس از اضافه نمودن 1 به آن برابر 42 خواهد شد .

دليل اينكه جاوا( واكثر زبانهاي برنامه نويسي )از روش مكمل دو(two's complement) استفاده مي كنند ، مسئله تقاطع صفرها (Zero crossing) است . فرض كنيد يك مقدار byteبراي صفر با 00000000 معرفي شده باشد. در روش مكمل يك (one's complement) تبديل ساده كليه بيت ها منجر به 11111111 شده كه صفر منفي را توليد مي كند .

اما مشكل اين است كه صفر منفي در رياضيات عدد صحيح غير معتبر است . اين مشكل بااستفاده از روش مكمل دو (two's complement) براي معرفي مقادير منفي حل خواهد شد . هنگام استفاده از روش مكمل دو ، 1 به مكمل اضافه شده و عدد 100000000 توليد مي شود . اين روش بيت 1 را در منتهي اليه سمت چپ مقدار byte قرار داده تا رفتار مورد نظر انجام گيرد، جايي كه 0با 0ا يكسان بوده و 11111111 رمزبندي شده 1 است . اگر چه در اين مثال از يك مقدار byte استفاده كرديم ، اما همين اصول براي كليه انواع عدد صحيح جاوا صدق مي كنند .
از آنجاييكه جاوا از روش مكمل دو براي ذخيره سازي ارقام منفي استفاده ميكند و چون كليه اعداد صحيح در جاوا مقادير علامت دار هستند بكار بردن عملگرهاي رفتار بيتي براحتي نتايج غير منتظره اي توليد مي كند . بعنوان مثال برگرداندن بيت بالاتر از حد مجاز (high-order) سبب مي شود تا مقدار حاصله بعنوان يك رقم منفي تفسير شود ، خواه چنين قصدي داشته باشيد يا نداشته باشيد . براي جلوگيري از موارد ناخواسته ، فقط بياد آوريد كه بيت بالاتر از حد مجاز (high-order) علامت يك عدد صحيح را تعيين مي كند، صرفنظر از اينكه بيت فوق چگونه مقدار گرفته
باشد .

عملگرهاي منطقي رفتار بيتي
عملگرهاي منطقي رفتار بيتي شامل &، |،، ^،، ~، هستند. جدول زير حاصل هر يك از اين عمليات را نشان مي دهد . در بحث بعدي بياد داشته باشيد كه عملگرهاي رفتار بيتي به بيت هاي منفرد داخل هر عملوند اعمال مي شوند .

A B A|B A&B A^B ~A
0 0 0 0 0 1
1 0 1 0 1 0
0 1 1 0 1 1
1 1 1 1 0 0

NOT


رفتار بيتي
عملگر NOT يكاني يعني ~ كه آن را مكمل رفتار بيتي (bitwise complement) هم مي نامند ، كليه بيت هاي عملوند خود را تبديل مي كند . بعنوان مثال ، عدد 42 كه مطابق الگوي بيتي زير است : 00101010

پس از اعمال عملگر NOT بصورت زير تبديل مي شود : 11010101

AND

رفتار بيتي

عملگر AND يعني & اگر هر دو عملوند 1 باشند ، يك بيت 1 توليد مي كند . در كليه شرايط ديگر يك صفر توليد مي شود . مثال زير را نگاه كنيد :

00101010 42

& 00001111 15

00001010 10

OR

رفتار بيتي

عملگر OR يعني | بيت ها را بگونه اي تركيب مي كند كه اگر هر يك از بيت هاي عملوندها 1 باشد ، آنگاه بيت حاصله نيز 1 خواهد بود . به مثال زير نگاه كنيد :

00102010 42

| 00001111 15

00101111 47

XOR

رفتار بيتي

عملگر XOR يعني ^ بيت ها را بگونه اي تركيب مي كند كه اگر دقيقا" يك عملوند 1باشد ، حاصل برابر 1 خواهد شد . در غير اينصورت ، حاصل 0 مي شود .

مثال بعدي چگونگي كار اين عملگر را نشان مي دهد . اين مثال همچنين يكي از خصلتهاي سودمند عملگر XOR را نمايش مي دهد . دقت كنيد كه هر جا عملوند دوم يك بيت 1 داشته باشد ، چگونه الگوي بيتي عدد 42 تبديل مي شود . هر جا كه عملوند دوم بيت 0 داشته باشد ، عملوند اول بدون تغيير مي ماند . هنگام انجام برخي از
انواع عملكردهاي بيتي ، اين خصلت بسيار سودمند است .

 00101010 42

^ 00001111 15

00100101 37

استفاده از عملگرهاي منطقي رفتار بيتي

برنامه بعدي نشان دهنده عملگرهاي منطقي رفتار بيتي است :

+ // Demonstrate the bitwise logical operators.
+ class BitLogic {
+ public static void main(String args[] ){
+ String binary[] = {
+ "0000"/ "0001"/ "0010"/ "0011"/ "0100"/ "0101"/ "0110"/ "0111"/
+ "1000"/ "1001"/ "1010"/ "1011"/ "1100"/ "1101"/ "1110"/ "1111"
+ };
+ int a = 3; // 0 + 2 + 1 or 0011 in binary
+ int b = 6; // 4 + 2 + 0 or 0110 in binary
+ int c = a | b;
+ int d = a & b;
+ int e = a ^ b;
+ int f =( ~a & b )|( a & ~b);
+ int g = ~a & 0x0f;
+
+ System.out.println(" a = " + binary[a]);
+ System.out.println(" b = " + binary[b]);
+ System.out.println(" a|b = " + binary[c]);
+ System.out.println(" a&b = " + binary[d]);
+ System.out.println(" a^b = " + binary[e]);
+ System.out.println("~a&b|a&~b = " + binary[f]);
+ System.out.println(" ~a = " + binary[g]);
+ }
+ }

 

در اين مثال ، aو bو الگوهاي بيتي دارند كه كليه چهار احتمال براي ارقام دو تايي باينري را معرفي مي كنند . 0-0، 0-1،، 1-0،و 1-1و . مي توانيد مشاهده كنيد چگونه |و &و روي هر يك از بيت ها با توجه به نتايج در cو dو عمل مي كنند.

مقادير نسبت داده شده به eو fو مشابه بوده و نشان دهنده چگونگي كار عملگر ^ مي باشند . آرايه رشته اي با نام binary معرفي ارقام 0 تا 15 را بصورت باينري و قابل خواندن براي انسان نگهداري مي كند . در اين مثال ، آرايه فوق طوري نمايه سازي شده تا معرفي باينري هر يك از نتايج را نشان دهد . آرايه طوري ساخته شده كه معرفي رشته اي صحيح يك مقدار باينري n را در binary[n] ذخيره مي كند . مقدار ~aبوسيله عملگر ANDبا oxofا( 00001111 باينري ) عمل شده تا مقدار آن را به كمتر از 16 كاهش دهد تا بتوان با استفاده از آرايه binary از آن چاپ گرفت .

اكنون خروجي اين برنامه بصورت زير مي باشد :

a=1011
b=0110
a^Eb=0111
a&b=0010
a&b=0101
~a&b^Ea&~b=0101
~a=1100


حركت به چپ
كليه بيت هاي موجود در يك مقدار را به تعداد <<عملگر حركت به چپ يعني دفعات مشخص بطرف چپ منتقل مي كند . شكل كلي آن بقرار زير است :

Value << num

تعداد دفعات مقدار
در ايجا num مشخص كننده تعداد مكانهايي است كه بيت هاي موجود در value بايد كليه بيت هاي موجود در يك مقدار مشخص را <<به چپ انتقال يابند . بدين ترتيب بتعداد مكانهايي كه در num مشخص شده بطرف چپ حركت مي دهد . براي هر بار حركت به چپ ، بيت high-order ( بيش از حد مجاز ) منتقل شده و از دست خواهد رفت و يك صفر در طرف راست مقدار ، جايگزين مي شود . بدين ترتيب هنگاميكه يك حركت به چپ روي يك عملوند int عمل مي كند ، بيت هاي گذشته از مكان 31 از دست خواهند رفت . اگر عملوند يك long باشد، بيت ها پس از گذشتن از مكان 63 از دست ميروند.

هنگاميكه مقادير byteو shortو را انتقال مي دهيد ، ارتقائ خودكار انواع در جاوا نتايج غير منتظره اي ايجاد مي كند . حتما" مي دانيد كه هنگام ارزشيابي عبارات ، مقادير byteو shortوبه int ارتقائ مي يابند. بعلاوه جواب چنين عبارتي از نوع int خواهد بود . بنابراين حاصل يك حركت به چپ روي مقادير byteو shortو يك int خواهد بود و بيت هاي انتقال يافته به چپ تا زمانيكه از مكان بيت 31 نگذرند ، از دست نمي روند . علاوه براين ، يك مقدار منفي byteو shortو هنگاميكه به int ارتقائ مي يابد ، بسط علامت پيدا مي كند . بنابراين بيت هاي بيش از حد
مجاز با بيت 1 پر مي شوند . بخاطر اين دلايل ، انجام يك حركت به چپ روي byte و short مستلزم آن است كه از بايت هاي بيش از حد مجاز در جواب int دست بكشيد .

بعنوان مثال ، اگر يك مقدار byte را حركت به چپ بدهيد ، آن مقدار ابتدا به نوع intتبديل شده و سپس انتقال خواهد يافت . بايد سه بايت بالايي حاصل را از دست بدهيد . اگر بخواهيد حاصل يك مقدار byte انتقال يافته را بدست آوريد . بايد سه بايت بالايي حاصل را از دست بدهيد . آسان ترين روش براي انجام اينكار استفاده
از تبديل cast و تبديل جواب به نوع byte است . مثال بعدي همين مفهوم را براي شما آشكار مي سازد :

+ // Left shifting a byte value.
+ class ByteShift {
+ public static void main(String args[] ){
+ byte a = 64/ b;
+ int i;
+
+ i = a << 2;
+ b =( byte( )a << 2);
+
+ System.out.println("Original value of a :" + a);
+ System.out.println("i and b :" + i + " " + b);
+ }
+ }

خروجي توليد شده توسط اين برنامه بقرار زير مي باشد :

original value of a:64
i and b :256 0

چون براي اهداف ارزشيابي ، a به نوع int ارتقائ يافته ، دوبار حركت به چپ مقدار 64 (0000 َ0100) منجر به i مي گردد كه شامل مقدار 256 (0000 َ1 0000) مي باشد . اما مقدار b دربرگيرنده صفر است زيرا پس از انتقال ، بايت كمتر از حد مجاز (loworder) اكنون شامل صفر است . تنها بيت دربرگيرنده 1 به بيرون انتقال يافته است .
از آنجاييكه هر بار حركت به چپ تاثير دو برابر سازي مقدار اصلي را دارد برنامه نويسان اغلب از اين خاصيت بجاي دو برابر كردن استفاده مي كنند . اما بايد مراقب باشيد . اگر يك بيت 1 را به مكان بيت بيش از حد مجاز (31 يا 63)
منتقل كنيد ، مقدار فوق منفي خواهد شد . برنامه بعدي همين نكته را نشان ميدهد.

+ // Left shifting as a quick way to multiply by 2.
+ class MultByTwo {
+ public static void main(String args[] ){
+ int i;
+ int num = 0xFFFFFFE;
+
+ for(i=0; i<4; i++ ){
+ num = num << 1;
+ System.out.println(num);
+ }
+ }
+ }

خروجي اين برنامه بقرار زير خواهد بود : 536870908

1073741816
2147483632
- 32

مقدار آغازين را با دقت انتخاب كرده ايم بطوريكه بيت بعد از چهار مكان حركت بطرف چپ ، مقدار 32- را توليد نمايد . همانطوريكه مي بينيد ، هنگاميكه بيت 1 به بيت 31 منتقل مي شود ، رقم بعنوان منفي تفسير خواهد شد .

حركت به راست
كليه بيت هاي موجود در يك مقدار را به تعداد >>عملگر حركت به راست يعني دفعات مشخص بطرف راست انتقال مي دهد . شكل كلي آن بقرار زير مي باشد :

value >> num

تعداد دفعات مقدار
در اينجا ، num مشخص كننده تعداد مكانهايي است كه بيت هاي value بايد بطرف كليه بيت هاي يك مقدار مشخص شده را به تعداد >>راست انتقال يابند . يعني مكانهاي بيتي مشخص شده توسط num بطرف راست انتقال مي دهد .

كد قطعه اي زير مقدار 32 را دو مكان بطرف راست منتقل مي كند و آنگاه جواب آن در a معادل 8 قرار مي گيرد :

+ int a = 32;
+ a = a >> 2; // a now contains 8

اگر بيت هايي از يك مقدار به بيرون منتقل شوند ، آن بيت ها از دست خواهند رفت . بعنوان مثال كد قطعه اي بعدي مقدار 35 را دو مكان بطرف راست منتقل نموده و باعث مي شود تا دو بيت كمتر از حد مجاز از دست رفته و مجددا" جواب آن در a معادل 8 قرار گيرد .

+ int a = 35;
+ a = a >> 2; // a still contains 8

همين عمليات را در شكل باينري نگاه مي كنيم تا اتفاقي كه مي افتد ، روشن تر شود : 00100011 35
>> 2
00001000 8

هر بار كه يك مقدار را به طرف راست منتقل مي كنيد ، آن مقدار تقسيم بر دو مي شود و باقيمانده آن از دست خواهد رفت . مي توانيد از مزاياي اين روش در تقسيم بر دو اعداد صحيح با عملكرد سطح بالا استفاده نماييد . البته ، بايد مطمئن شويد كه بيت هاي انتهايي سمت راست را به بيرون منتقل نكنيد .

هنگاميكه حركت بطرف راست را انجام مي دهيد ، بيت هاي بالايي ( از سمت چپ ) در معرض حركت بطرف راست قرار گرفته ، با محتوي قبلي بيت بالايي پر مي شوند .

اين حالت را بسط علامت (sign extension) ناميده و براي محفوظ نگهداشتن علامت ارقام منفي هنگام حركت بطرف راست استفاده مي شوند. بعنوان مثال 1>>8- معادل 4- است كه به شكل باينري زير مي باشد :

11111000- 8
>> 1
11111100- 4

جالب است بدانيد كه اگر 1- را بطرف راست حركت دهيد، حاصل آن همواره 1- باقي مي ماند ، چون بسط علامت ، مراقب آوردن يك بيت ديگر در بيت هاي بيش از حد مجاز خواهد بود .

گاهي هنگام حركت بطرف راست مقادير ، مايل نيستيم تا بسط علامت اجرا شود .

بعنوان مثال ، برنامه بعدي يك مقدار نوع byte را به معرفي رشته اي در مبناي 16 تبديل مي كند . دقت كنيد كه مقدار منتقل شده با استفاده از عملگر ANDيا oxofا پوشانده شده تا هر گونه بيت هاي بسط يافته علامت را بدور اندازد بطوريكه مقدار فوق را بتوان بعنوان يك نمايه به آرايه اي از كاراكترهاي در مبناي 16 استفاده نمود .

+ // Masking sign extension.
+ class HexByte {
+ static public void main(String args[] ){
+ char hex[] = {
+ '0'/ '1'/ '2'/ '3'/ '4'/ '5'/ '6'/ '7'/
+ '8'/ '9'/ 'a'/ 'b'/ 'c'/ 'd'/ 'e'/ 'f'
+ };
+ byte b =( byte )oxf1
+
+ System.out.println("b = ox" + hex[(b >> 4 )& oxof] + hex[b & oxof]);
+ }
+ }

خروجي اين برنامه بقرار زير مي باشد :
b=oxf1


حركت به راست فاقد علامت
بطور خودكار >>اكنون مي دانيد كه هر بار يك انتقال اتفاق مي افتد ، عملگر جاي خالي بيت بيش از حد مجاز را با محتوي قبلي اش پر مي كند . اين عمل سبب حفظ علامت آن مقدار مي گردد . اما گاهي تمايلي براي اينكار نداريم . بعنوان مثال مي خواهيد چيزي را منتقل كنيد كه معرف يك مقدار عددي نيست . بالطبع نمي خواهيد
عمل بسط علامت انجام گيرد . اين حالت هنگام كار با مقادير براساس پيكسل (pixel) و گرافيك اغلب وجود دارد . در چنين شرايطي لازم است تا مقدار صفر در بيت بيش از حد مجاز قرار گيرد ، صرفنظر از اينكه مقدار قبلي در آن بيت چه بوده است . اين حالت را انتقال فاقد علامت (usigned shift) مي گويند. براي اين منظور، از عملگر
استفاده كنيد كه صفرها را در بيت بيش >>>حركت به راست فاقد علامت در جاوا يعني از حد مجاز منتقل مي كند .

مي باشد . در اينجا >>>كد قطعه اي زير نشان دهنده عملگر a معادل 1- است كه كليه 32 بيت را در باينري روي 1 تنظيم مي كند . اين مقدار سپس 24 بيت بطرف راست انتقال مي يابد، و 24 بيت بالايي را با صفرها پر مي كند و بسط علامت معمولي را ناديده مي گيرد . بدين ترتيب a معادل 255 مي باشد .

+ int a =- 1;
+ a = a >>> 24;

اينجا همان عمليات را در شكل باينري مشاهده مي كنيد تا بهتر بفهميد چه اتفاقي افتاده است : 1
در باينري بعنوان يك int 11111111 11111111 11111111 11111111 >>>24
255
در باينري بعنوان يك int َ11111111 00000000 00000000 00000000 اغلب اوقات آنچنان سودمند كه بنظر مي رسد ، نبوده چون فقط براي >>>عملگر مقادير 32 بيتي و 64 بيتي معني دارد . بياد آوريد كه مقادير كوچكتر در عبارات بطور خودكار به int ارتقائ مي يابند . بدين ترتيب بسط علامت اتفاق افتاده و حركت بجاي مقادير 8 بيتي و 16 بيتي روي مقادير 32 بيتي انجام مي شود . يعني بايد انتظار يك حركت به راست فاقد علامت روي يك مقدار byte داشته باشيم كه در بيت 7 ، صفر را قرار مي دهد . اما واقعا" اينطور نيست ، چون در واقع مقدار 32
بيتي است كه منتقل مي شود . برنامه بعدي اين تاثيري را نشان مي دهد .

+ // Unsigned shifting a byte value.
+ class ByteUShift {
+ static public void main(String args[] ){
+ char hex[] = {
+ '0'/ '1'/ '2'/ '3'/ '4'/ '5'/ '6'/ '7'/
+ '8'/ '9'/ 'a'/ 'b'/ 'c'/ 'd'/ 'e'/ 'f'
+ };
+ byte b =( byte )oxf1
+ byte c =( byte( )b >> 4);
+ byte d =( byte( )b >>> 4);
+ byte e =( byte(( )b & oxff )>> 4);
+
+ System.out.println(" b = ox"
+ + hex[(b >> 4 )& oxof] + hex[b & oxof]);
+ System.out.println(" b >> 4 = ox"
+ + hex[(c >> 4 )& oxof] + hex[c & oxof]);
+ System.out.println(" b >>> 4 = ox"
+ + hex[(d >> 4 )& oxof] + hex[d & oxof]);
+ System.out.println("(b & oxof )>> 4 = ox"
+ + hex[(e >> 4 )& oxof] + hex[e & oxof]);
+ }
+ }

چگونه هنگام كار با بايت ها عملي >>>خروجي اين برنامه نشان ميدهد كه عملگر انجام نمي دهد . متغير b بعنوان يك مقدار byte منفي قراردادي در اين نمايش تنظيم شده است . سپس مقدار byteدر bر كه چهار مكان بطرف راست انتقال بافته به C منتسب مي شود كه بخاطر بسط علامت مورد انتظار oxff است . سپس مقدار byteدر bر كه چهار مكان بطرف راست و فاقد علامت منتقل شده به d منتسب مي شود كه انتظار داريد oxof باشد ، اما در حقيقت oxff است چون بسط علامت هنگاميكه b به نوع int قبل از انتقال ارتقائ يافته اتفاق افتاده است . آخرين عبارت ، e را در مقدار byte متغير b كه با استفاده از عملگر ANDبا 8ا بيت پوشانده شده تنظيم نموده و سپس چهار مكان بطرف راست منتقل مي كند كه مقدار مورد انتظار oxof را توليد مي كند . دقت كنيد كه عملگر حركت به راست فاقد علامت براي d استفاده نشد ، چون حالت بيت علامت بعد از AND شناخته شده است .

b=oxf1
b>>4=oxff
b>>>4=oxff
( b&oxff)>>4=oxof


انتسابهاي عملگر رفتار بيتي

كليه عملگرهاي رفتار بيتي باينري يك شكل مختصر مشابه باعملگرهاي جبري دارند كه عمل انتساب را با عمليات رفتار بيتي تركيب مي كنند. بعنوان مثال ، دو دستور بعدي كه مقدار a را چهار بيت به راست حركت مي دهند ، معادل يكديگرند :

+ a = a >> 4;
+ a >>= 4;

بطور مشابه ، دو دستور زير كه a را به عبارت روش بيتي aoRb منتسب مي كنند معادل يكديگرند :

+ a = a | b;
+ a |= b;

برنامه بعدي تعدادي از متغيرهاي عدد صحيح را بوجود آورده آنگاه از شكل مختصر انتسابهاي عملگر رفتار بيتي براي كار كردن بااين متغيرها استفاده ميكند:

+ class OpBitEquals {
+ public static void main(String args[] ){
+ int a = 1;
+ int b = 2;


+ نوشته شده در  یکشنبه دوازدهم آبان 1387ساعت 16:39  توسط محسن  | 

آموزش جاوا java

اولين برنامه ساده java

اكنون كه اصول اساسي شي ئ گرايي جاوا مورد بررسي قرار گرفته ، به برخي از برنامه هاي واقعي جاوا نگاه خواهيم كرد. كار را با كامپايل كردن و اجراي برنامه كوتاه زير شروع مي كنيم . خواهيم ديد كه اين برنامه بيشتر از حد تصور شما كار لازم دارد .


+ /*
+ This is a simple Java program.
+ Call this file "Example.java".
+ /*
+ class Exaample {
+ // Your program begins with a call to main.)(
+ public static void main( String args [] ){
+ System.out.println( "This is a simple Java program.");
+ }
+ }

 

نكته : در توصيف زيرين از JDK(JAVA Developer's Kit() استاندارد استفاده شده است كه توسط خود شركت Sun Microsystems عرضه شده است . اگر از يك محيط توسعه يافته ديگر براي جاوا استفاده مي كنيد ، آنگاه بايد از رويه متفاوتي براي كامپايل كردن و اجراي برنامه استفاده كنيد . در اين مورد به راهنماي كاربران كامپايلر خود مراجعه نماييد .

وارد نمودن برنامه Entering the program

در بسياري از زبانهاي كامپيوتري ، نام فايلي كه كد منبع (Source code) يك برنامه را نگهداري مي كند بصورت اختياري انتخاب مي شود . اما در جاوا اينگونه نيست . اولين چيزي كه بايد درباره جاوا بدانيد اين است كه نامي را كه براي فايل منبع انتخاب مي كنيد ، بسيار اهميت دارد . در اين مثال ، نام فايل منبع بايد Example JJAVA باشد . چرا ? در جاوا يك فايل منبع را بطور رسمي واحد كامپايل سازي (Compilation unit) مي گويند . اين فايل يك فايل متني است كه دربرگيرنده يك يا چندين تعريف كلاس (class definition) است . در كامپايلر جاوا بايد از فايل منبعي استفاده نمود كه داراي پسوند فايل JAVA باشد . دقت كنيد كه اين پسوند داراي چهار كاراكتر
است . حتما" مي دانيد كه سيستم عامل شما بايد توانايي حمايت از پسوندهاي طولاني تر را داشته باشد . بدين ترتيب Dos و ويندوز 3.1 توانايي حمايت از جاوا ( لااقل تاكنون ) را ندارند. اما ويندوز NT و95 بخوبي ازعهده اينكار برمي آيند.

يكبار ديگر به برنامه فوق نگاه كنيد، نام كلاس تعريف شده توسط برنامه ،Example مي باشد ، اين يك تصادف يا اتفاق نيست . در جاوا كليه كدها بايد داخل يك كلاس جاي بگيرند . براساس آيين نامه ، نام آن كلاس بايد با نام فايلي كه برنامه را نگهداري مي كند ، مطابقت داشته باشد . همچنين بايد مطمئن شويد كه حروف بزرگ در
نام فايل با نام كلاس مطابقت و هماهنگي داشته باشند . دليل اين است كه جاوا بسيار حساس نسبت به مورد است . از اين نظر آيين نامه اي كه نامهاي فايل را به نامهاي كلاس مرتبط مي كند ، ممكن است اختياري بنظر رسد . اما ، اين آيين نامه سبب شده تا نگهداري و سازماندهي برنامه ها آسان تر انجام شود .

كامپايل نمودن برنامه Compiling the program
براي كامپايل نمودن برنامه Example ، كامپايلر javac را اجرا نموده و نام فايل منبع را روي خط فرمان (command line) بصورت زير مشخص نماييد :

+ c:\>javac Example.java

كامپايلر javac فايلي تحت نام Example.class ايجاد مي كند كه شامل روايت كد بايتي از برنامه است . همانگونه كه قبلا" بحث شد ، كد بايتي جاوا نوعي معرفي مياني از برنامه شماست كه دربرگيرنده دستورالعملهايي است كه مفسر جاوا آنها را اجرا مي كند . بنابراين خروجي javac كدي كه مستقيما" قابل اجرا باشد ، نخواهد
بود .

براي اجراي واقعي برنامه ، بايد از مفسر (interpreter) جاوا تحت نام java استفاده نماييد . بدين منظور نام كلاس Example را بعنوان يك آرگومان (argument) خط فرمان بصورت زير وارد نماييد .

+ c:\>java Example

پس از اجراي اين برنامه ، خروجي بصورت زير بنمايش درمي آيد : This is a simple Java program.

هنگاميكه كد منبع جاوا كامپايل شود ، هر كلاس بتنهايي در فايل خروجي مخصوص خود كه فايل آن بعد از كلاس و پسوند class ذكر مي شود، قرار خواهد گرفت . بهمين دليل است كه بايد نام فايلهاي منبع جاوا را مطابق همان كلاسي كه آن را در بر مي گيرد انتخاب نمود تا نام فايل منبع با نام فايل class. مطابقت داشته باشد .

وقتي كه مفسر جاوا را همانگونه كه نشان داديم اجرا مي كنيد ، شما در حقيقت نام كلاسي كه مايليد مفسر آن را اجرا كند ، مشخص مي نماييد . مفسر بطور خودكار به دنبال يك فايل مي گردد كه داراي پسوند class. باشد . اگر آن را پيدا كند ، كدي را كه در آن كلاس مشخص شده وجود دارد ، اجرا خواهد نمود .

نگاهي دقيقتر به برنامه نمونه اول
اگر چه عبارت Example jjava بسيار كوتاه است ، اما دربرگيرنده چندين جنبه كليدي است كه در همه برنامه هاي جاوا وجود خواهند داشت . اجازه دهيد تا هر يك از بخشهاي برنامه را با دقت بيشتري بررسي كنيم .
برنامه با خط زير شروع مي شود :

+ /*
+ This is a simple Java program.
+ Call this file "Example .java".
+ /*

اين يك " توضيح "(Comment() است . مثل بسياري از زبانهاي برنامه نويسي ،جاوا به شما امكان وارد نمودن يك ملاحظه (Remark) در فايل منبع برنامه را مي دهد .

محتوي يك " توضيح " توسط كامپايلر ناديده گرفته خواهد شد . در عوض ، يك "توضيح " ، توصيف كننده يا شرح دهنده عملكرد برنامه است به هر كسي كه كد منبع را مطالعه نمايد . در اين مثال ، " توضيح " ، توصيف كننده برنامه بوده و بياد شما مي اندازد كه فايل منبع را بايدExample.java بناميد . البته ، در برنامه هاي واقعي ،" توضيحات " بطور كلي توصيف مي كنند كه چگونه برخي از بخشهاي يك برنامه كار كرده و يا اينكه يك جنبه خاص از برنامه چكاري انجام خواهد داد .

جاوا از سه روش براي " توضيحات " پشتيباني مي كند. اول آن چيزي است كه بالاي برنامه مشاهده مي كنيد كه آن را توضيح چند خطي (multiline comment) مي گويند .

اين نوع از " توضيح " بايد با علامت /* و با علامت */ پايان يابد . هر چيزي كه بين اين دو علامت قرار گيرد توسط كامپايلر ناديده گرفته خواهد شد . همانطوريكه از نام اين روش پيداست ، يك توضيح ، چند خطي ممكن است چندين خط دراز داشته باشد .
خط بعدي كد برنامه بصورت زير مي باشد :

+ class Exaple {

اين خط از واژه كليدي class استفاده مي كند تا اعلان نمايد كه يك كلاس جديد در حال تعريف شدن است . Example شناسه اي (identifier) است كه نام كلاس مي باشد.

كل تعريف كلاس ، شامل : كليه اعضائ خود ، بين علامات ابروباز ({) و ابروبسته (}) قرار مي گيرد . استفاده از علامات فوق در جاوا مشابه روش استفاده از آنها در C و C++ است . فعلا" درباره جزئيات مربوط به يك كلاس نگران نباشيد مگر دقت به اينكه در جاوا ، كليه فعاليت برنامه اي داخل يك علامت اتفاق مي افتد . اين امر يكي از
دلايلي است كه كليه برنامه هاي جاوا شي ئ گرا هستند .

خط بعدي برنامه يك " توضيح يك خطي "(single-line comment() بصورت زير است :
+ // Your program begins with a call to main.)(

اين نوع دوم " توضيحي " است كه توسط جاوا پشتيباني مي شود. يك توضيح يك خطي با علامت // شروع شده و در انتهاي خط پايان مي يابد . بعنوان يك قانون عمومي برنامه نويسان از توضيحات چند خطي براي ملاحظات طولاني تر و از توضيحات يك خطي براي توضيحات كوتاه و خط به خط استفاده مي كنند .

خط بعدي كد بقرار زير مي باشد :
+ public static void main( String args [] ){

اين خط شروع كننده روش ()main است . همانطوريكه توضيح متعاقب آن پيشنهاد مي كند ، اين خطي است كه برنامه در آن شروع به اجرا مي نمايد . كليه برنامه هاي كاربردي جاوا با فراخواني ()main شروع به اجرا مي كنند. ( درست شبيه C++/C. ).

معناي دقيق بخشهاي مختلف اين خط را فعلا" نمي توان توضيح داد ، زيرا درك آن مستلزم آگاهي از روش Java براي كپسول سازي است . اما از آنجاييكه اكثر مثالهاي موجود در بيشتر قسمتهاي اين بحث از اين خط از كط استفاده مي كنند ، بهتر است مرور كوتاهي بر بخشهاي مختلف آن داشته باشيم .

واژه كليدي public يك توصيفگر دسترسي (access specifier) است كه به برنامه نويس امكان داده تا قابليت و سطح مشاهده اعضائ كلاس را كنترل نمايد . وقتي كه عبارت public قبل از يك عضو كلاس قرار مي گيرد ، آنگاه آن عضو را مي توان با كدهاي خارج از كلاس كه اعلان شده ، مورد دسترسي قرار داد . ( مخالف اين عبارت
عبارت .private است كه از دسترسي به يك عضو توسط كدهاي تعريف شده در خارج كلاس جلوگيري مي نمايد . ) در اين حالت ()main بايد بعنوان public اعلام شود ، زيرا بايد توسط كدهاي خارج از كلاس هنگاميكه برنامه آغاز مي شود ، فراخواني شود .

واژه كليدي Static به ()main امكان داده تا بدون معرفي شدن توسط يك كلاس نمونه فراخواني شود . اين امر ضروري است چون ()main قبل از اينكه هر يك از اشيائ ساخته شوند توسط مفسر جاوا فراخواني خواهد شد . واژه كليدي Void بسادگي به كامپايلر مي گويد كه ()main مقداري را بازگردان نمي كند . همانطوريكه خواهيد
ديد ، ممكن است روشها (methods) نيز مقادير را بازگردان كنند . اگر اين مطالب تا حدي گيج كننده است ، نگران نباشيد . كليه اين مطالب با جزئيات بيشتري در قسمتهاي بعد بررسي خواهد شد .

همانطوريكه بيان شده ()main روشي است كه هنگام شروع يك برنامه كاربردي جاوا فراخواني مي شود . بياد آوريد كه جاوا بسيار حساس نسبت به مورد است . بنابراين براي جاوا Mainو mainو دو مفهوم متفاوت دارند . نكته مهم اين است كه كامپايلر جاوا فقط كلاسهايي را كه شامل روش ()main نباشند ، كامپايل خواهد نمود . اما
مفسر جاوا راهي براي اجراي اين كلاسها ندارد . بنابراين اگر بجاي main عبارت Mainرا تايپ كرده باشيد ، كامپايلر همچنان برنامه شما را كامپايل خواهد كرد .

اما مفسر جاوا يك گزارش خطا مي دهد زيرا توانايي يافتن روش ()main را ندارد .

اطلاعاتي كه لازم است به يك روش ارسال كنيد ، توسط متغيرهاي مشخص شده بين مجموعه پرانتزهايي كه بعد از نام روش قرار مي گيرند ، دريافت خواهد شد . اين متغيرها را پارامترها (parameters) مي نامند . اگر براي يك روش داده شده نياز به پارامتري نباشد ، از پرانتزهاي خالي استفاده مي كنيد . در حال حاضر ()main فقط يك پارامتر دارد ، كه البته بسيار پيچيده هم هست . String args [] يك پارامتر با نام args را اعلان ميكند كه يك آرايه از نمونه هاي string كلاس ميباشد.

( آرايه مجموعه اي از اشيائ مشابه هم هستند . ) اشيائ از نوع string ، رشته هاي كاراكترها را ذخيره مي كنند . در اين حالت ، args هر نوع آرگومان خط فرمان حاضر در هنگام اجراي برنامه را دريافت مي كند . اين برنامه از اين اطلاعات استفاده نمي كند ، اما برنامه هاي ديگر چنين استفاده اي را انجام مي دهند .

آخرين كاراكتر روي خط ، علامت { است . اين علامت نشان دهنده شروع بدنه ()main است . تمامي كدهايي كه يك روش را تشكيل مي دهند بين ابرو باز و ابرو بسته همان روش قرار مي گيرند .

يك نكته ديگر : ()main نقطه شروع بكار مفسر است . يك برنامه پيچيده شامل دهها كلاس است كه فقط يكي از آنها لازم است يك روش ()main داشته باشد تا كارها را شروع نمايد . هنگاميكه ريز برنامه ها (applets) برنامه هاي جاوا كه در مرورگرهاي وب تعبيه مي شوند را ايجاد مي كنيد ، بهيچوجه از ()main استفاده نخواهيد كرد، زيرا مرورگرهاي وب از وسائل متفاوتي براي شروع اجراي ريزبرنامه ها استفاده مي كنند .
خط بعدي كد بقرار زير ميباشد. دقت كنيد كه اين خط داخل ()main قرار ميگيرد.

+ System.out.println("This is a simple Java program.");

اين خط رشته "This is a simple Java program" را بعنوان خروجي ارائه مي دهد كه بعد از آن يك خط جديد روي صفحه ظاهر خواهد شد . خروجي بطور واقعي با روش توكار ()println همراه است . در اين حالت ، ()println نمايش دهنده رشته اي است كه در آن ثبت شده . خواهيد ديد كه از ()println براي نمايش ساير انواع اطلاعات
نيز استفاده مي شود . خط بالا با system.out شروع مي شود . اگر چه در اين مرحله توضيح اين مطلب بسيار دشواراست ، اما بطور اختصار system يك كلاس از پيش تعريف شده است كه دسترسي به سيستم را فراهم آورده و out نيز جريان خروجي است كه به كنسول (console) مرتبط شده است .

همانطوريكه احتمالا" حدس زده ايد ، خروجي ( و نيز ورودي ) كنسول بندرت در برنامه ها و ريز برنامه هاي جاوا مورد استفاده قرار مي گيرند . از آنجاييكه اكثر محيط هاي جديد كامپيوتري داراي طبيعت پنجره اي و گرافيكي هستند ، كنسول l/o اكثرا" براي برنامه هاي كمكي ساده و برنامه هاي نمايشي استفاده مي شود . بعدا"
شيوه هاي ديگري براي ايجاد خروجي با استفاده از جاوا ر خواهيد آموخت . اما فعلا" ما استفاده از روشهاي l/o كنسول را ادامه مي دهيم .

دقت كنيد كه ()println با يك علامت ويرگول نقطه (;)(semicolon) پايان ميگيرد.
كليه دستورات (statements) در جاوا با همين علامت پايان مي گيرند . دليل اينكه ساير خطوط برنامه با اين علامت پايان نمي گيرند اين است كه آنها را از نظر ند .

+ نوشته شده در  یکشنبه دوازدهم آبان 1387ساعت 16:38  توسط محسن  | 

آموزش جاوا java

آرايه ها در جاوا

يك آرايه گروهي از متغيرهاي يك نوع است كه با يك نام مشترك به آنها ارجاع مي شود . مي توان آرايه ها را براي هر يك از انواع ايجاد نمود و ممكن است اين آرايه ها داراي يك يا چندين بعد باشند . براي دسترسي به يك عضو آرايه از نمايه (index) آن آرايه استفاده مي شود . آرايه ها يك وسيله مناسب براي گروه بندي اطلاعات مرتبط با هم هستند .

نكته : اگر با Cو C++و آشنايي داريد ، آگاه باشيد . آرايه ها در جاوا بطور متفاوتي نسبت به زبانهاي ديگر كار مي كنند .

آرايه هاي يك بعدي

آرايه يك بعدي بطور ضروري فهرستي از متغيرهاي يكنوع است . براي ايجاد يك آرايه ، بايد يك متغير آرايه از نوع مورد نظرتان ايجاد كنيد . فرم عمومي اعلان يك آرايه يك بعدي بقرار زير است : type var-name [];

نام متغير نوع

در اينجا type اعلان كننده نوع اصلي آرايه است . نوع اصلي تعيين كننده نوع داده براي هر يك از اعضائ داخل در آرايه است . بنابراين ، نوع اصلي آرايه تعيين مي كند كه آرايه چه نوعي از داده را نگهداري مي كند . بعنوان مثال ، در زير يك آرايه با نام month-days با نوع آرايه اي از عدد صحيح اعلان شده است .

+ int month_days[];

اگر چه اين اعلان تثبيت مي كند كه month-days يك متغير آرايه است ، اما بطور واقعي آرايه اي وجود ندارد . در حقيقت ، مقدار month-days برابر تهي (null) مي باشد كه يك آرايه بدون مقدار را معرفي مي كند . براي پيوند دادن month-days با يك آرايه واقعي و فيزيكي از اعداد صحيح ، بايد از يك عملگر new استفاده نموده و به month-days منتسب كنيد. new يك عملگراست كه حافظه را اختصاص ميدهد.

بعداnew " را با دقت بيشتري بررسي مي كنيم ، اما لازم است كه هم اكنون از آن استفاده نموده و حافظه را براي آرايه ها تخصيص دهيد . فرم عمومي new آنگونه كه براي آرايه هاي يك بعدي بكار مي رود بقرار زير ظاهر خواهد شد :

array-var=new type [size];

اندازه نوع متغير آرايه
در اينجا type مشخص كننده نوع داده اي است كه تخصيص داده مي شود، size مشخص كننده تعداد اعضائ آرايه است و array-var متغير آرايه است كه به آرايه پيوند مي يابد . يعني براي استفاده از new در تخصيص يك آرايه ، بايد نوع و تعداد اعضايي كه تخصيص مي يابند را مشخص نماييد . اعضائ آرايه كه توسط new تخصيص مي يابند بطور خودكار با مقدار صفر مقدار دهي اوليه مي شوند . اين مثال يك آرايه 12 عضوي از اعداد صحيح را تخصيص داده و آنها را به month-days پيوند مي دهد .

+ month_days = new int[12];

بعد از اجراي اين دستور ، month-days به يك آرايه 12 تايي از اعداد صحيح ارجاع خواهد نمود . بعلاوه كليه اجزائ در آرايه با عدد صفر مقدار دهي اوليه خواهند شد .

اجازه دهيد مرور كنيم : بدست آوردن يك آرايه مستلزم پردازش دو مرحله اي است .

اول بايد يك متغير با نوع آرايه مورد نظرتان اعلان كنيد . دوم بايد حافظه اي كه آرايه را نگهداري مي كند ، با استفاده از new تخصيص دهيد و آن را به متغير آرايه نسبت دهيد . بنابراين در جاوا كليه آرايه ها بطور پويا تخصيص مي يابند .

اگر مفهوم تخصيص پويا براي شما ناآشناست نگران نباشيد . اين مفهوم را بعدا" تشريح خواهيم كرد .

هر بار كه يك آرايه را تخصيص مي دهيد ، مي توانيد بوسيله مشخص نمودن نمايه آن داخل كروشه [] به يك عضو مشخص در آرايه دسترسي پيدا كنيد . كليه نمايه هاي آرايه ها با عدد صفر شروع مي شوند. بعنوان مثال اين دستور مقدار 28 را به دومين عضو month-days نسبت مي دهد .

+ month_days[1] = 28;

خط بعدي مقدار ذخيره شده در نمايه 3 را نمايش مي دهد .
+ System.out.println(month_days[3]);

با كنار هم قرار دادن كليه قطعات ، در اينجا برنامه اي خواهيم داشت كه يك آرايه براي تعداد روزهاي هر ماه ايجاد مي كند .

+ // Demonstrate a one-dimensional array.
+ class Array {
+ public static void main(String args[] ){
+ int month_days[];
+ month_days = new int[12];
+ month_days [0] = 31;
+ month_days [1] = 28;
+ month_days [2] = 31;
+ month_days [3] = 30;
+ month_days [4] = 31;
+ month_days [5] = 30;
+ month_days [6] = 31;
+ month_days [7] = 31;
+ month_days [8] = 30;
+ month_days [9] = 31;
+ month_days [10] = 30;
+ month_days [11] = 31;
+ System.out.println("April has " + month_days[3] + " days .");
+ }
+ }

وقتي اين برنامه را اجرا ميكنيد ، برنامه ، تعداد روزهاي ماه آوريل را چاپ ميكند. همانطوريكه ذكر شد، نمايه هاي آرايه جاوا با صفر شروع مي شوند، بنابراين تعداد روزهاي ماه آوريل در month-days[3] برابر 30 مي باشد .
اين امكان وجود دارد كه اعلان متغير آرايه را با تخصيص خود آرايه بصورت زير تركيب نمود : + int month_days[] = new int[12]; اين همان روشي است كه معمولا" در برنامه هاي حرفه اي نوشته شده با جاوا مشاهده مي كنيد .
مي توان آرايه ها را زمان اعلانشان ، مقدار دهي اوليه نمود . پردازش آن بسيار مشابه پردازشي است كه براي مقدار دهي اوليه انواع ساده استفاده مي شود . يك مقدار ده اوليه آرايه فهرستي از عبارات جدا شده بوسيله كاما و محصور شده بين ابروهاي باز و بسته مي باشد . كاماها مقادير اجزائ آرايه را از يكديگر جدا مي كنند . آرايه بطور خودكار آنقدر بزرگ ايجاد مي شود تا بتواند ارقام اجزايي را كه در مقدار ده اوليه آرايه مشخص كرده ايد ، دربرگيرد . نيازي به استفاده از newوجود ندارد . بعنوان مثال ، براي ذخيره نمودن تعداد روزهاي هر ماه ، كد بعدي يك آرايه مقدار دهي اوليه شده از اعداد صحيح را بوجود مي آورد :


+ // An improved version of the previous program.
+ class AutoArray {
+ public static void main(String args[] ){
+ int month_days[] = { 31/ 28/ 31/ 30/ 31/ 30/ 31/ 31/ 30/ 31/ 30/ 31 };
+ System.out.println("April has " + month_days[3] + " days .");
+ }
+ }

وقتي اين برنامه را اجرا كنيد ، همان خروجي برنامه قبلي را خواهيد ديد .
جاوا بشدت كنترل مي كند تا مطمئن شود كه بطور تصادفي تلاشي براي ذخيره نمودن يا ارجاع مقاديري خارج از دامنه آرايه انجام ندهيد . سيستم حين اجراي جاوا كنترل مي كند كه كليه نمايه هاي آرايه ها در دامنه صحيح قرار داشته باشند . ( از اين نظر جاوا كاملا"با Cاو C++و متفاوت است كه هيچ كنترل محدوده اي در حين اجرا انجام نمي دهند . ) بعنوان مثال ، سيستم حين اجرا ، مقدار هر يك از نمايه ها به month-daysرا كنترل مي كند تا مطمئن شود كه بين ارقام 0 و 11 داخل قرار داشته باشند . اگر تلاش كنيد تا به اجزائ خارج از دامنه آرايه ( اعداد منفي يا اعدادي بزرگتر از طول آرايه ) دسترسي يابيد، يك خطاي حين اجرا (run-time error) توليد
خواهد شد .

در زير يك مثال پيچيده تر مشاهده مي كنيد كه از يك آرايه يك بعدي استفاده مي كند . اين برنامه ميانگين يك مجموعه از ارقام را بدست مي آورد .

+ // Average an array of values.
+ class Average {
+ public static void main(String args[] ){
+ double nums[] = {10.1/ 11.2/ 12.3/ 13.4/ 14.5};
+ double result = 0;
+ int i;
+
+ for(i=0; i<5; i++)
+ result = result + nums[i];
+
+ System.out.println("Average is " + result / 5);
+ }
+ }


آرايه هاي چند بعدي
در جاوا آرايه هاي چند بعدي در واقع آرايه اي از آرايه ها هستند . اين قضيه همانطوريكه انتظار داريد ظاهر و عملكردي مشابه آرايه هاي چندبعدي منظم (regular) دارد . اما خواهيد ديد كه تاوتهاي ظريفي هم وجود دارند . براي اعلان يك متغير آرايه چند بعدي ، با استفاده از مجموعه ديگري از كروشه ها هر يك از نمايه هاي اضافي را مشخص مي كنيد. بعنوان مثال ، عبارت زيرر يك متغير آرايه دو بعدي بنام twoDرا اعلان مي كند .

+ int twoD[][] = new int[4][5];

اين عبارت يك آرايه 4در 5ر را تخصيص داده و آن را به twoD نسبت مي دهد . از
نظر داخلي اين ماتريس بعنوان يك آرايه از آرايه نوع int پياده سازي خواهد شد .
بطور فرضي ، اين آرايه را مي توان بصورت شكل زير نمايش داد .

Right index determines column.

|| || || || ||
\/ \/ \/ \/ \/

|
| [0][4] | [0][3] | [0][2] | [0][1] | [0][0] >
|
| |
| [1][4] | [1][3] | [1][2] | [1][1] | [1][0] >
Left index
determines |
| [2][4] | [2][3] | [2][2] | [2][1] | [2][0] .> row
|
| |
| [3][4] | [3][3] | [3][2] | [3][1] | [3][0] >
Given :int twoD[][] = new int [4][5];

 

برنامه بعدي هر عضو آرايه را از چپ به راست ، و از بالا به پايين شماره داده و سپس مقادير آنها را نمايش مي دهد :

+ // Demonstrate a two-dimensional array.
+ class TwoDArray {
+ public static void main(String args[] ){
+ int twoD[][] = new int[4][5];
+ int i/ j/ k = 0;
+
+ for(i=0; i<4; i++)
+ for(j=0; j<5; j++ ){
+ twoD[i][j] = k;
+ k++;
+
+ }
+
+ for(i=0; i<4; i++ ){
+ for(j=0; j<5; j++)
+ System.out.print(twoD[i][j] + " ");
+ System.out.println)(;
+ }
+ }
+ }

خروجي اين برنامه بقرار زير خواهد بود : 0 1 2 3 4

5 6 7 8 9
10 11 12 13 14
15 16 17 18 19

هنگام تخصيص حافظه به يك آرايه چند بعدي ، كافي است فقط حافظه براي اولين بعد را مشخص نماييد . مي توانيد ابعاد ديگر را جداگانه تخصيص دهيد . بعنوان مثال ، كد زير حافظه اولين بعد twoD را هنگام اعلان آن تخصيص مي دهد . اين كد حافظه دومين بعد را بصورت دستي اختصاص مي دهد .

+ int twoD[][] = new int[4][];
+ twoD[0] = new int[5];
+ twoD[1] = new int[5];
+ twoD[2] = new int[5];
+ twoD[3] = new int[5];

 

اگرچه در اين حالت اختصاص انفرادي حافظه به دومين بعد هيچ مزيتي ندارد، اما احتمال چنين مزيتهايي وجود دارد . بعنوان مثال ، هنگاميكه ابعاد را بصورت دستي اختصاص مي دهيد ، نيازي نيست كه همان ارقام براي اجزائ هر بعد را تخصيص دهيد .

همانطوريكه قبلا" گفتيم ، از آنجاييكه آرايه هاي چند بعدي واقعا" آرايه اي از آرايه ها هستند ، طول هر يك از آرايه ها تحت كنترل شما قرار مي گيرند . بعنوان مثال ، برنامه بعدي يك آرايه دو بعدي ايجاد مي كند كه در آن اندازه هاي دومين بعد نامساوي هستند .

+ // Manually allocate differing size second dimension.
+ class TwoDAgain {
+ public static void main(String args[] ){
+
+
+ int twoD[][] = new int[4][];
+ twoD[0] = new int[1];
+ twoD[1] = new int[2];
+ twoD[2] = new int[3];
+ twoD[3] = new int[4];
+
+ int i/ j/ k = 0;
+
+ for(i=0; i<4; i++)
+ for(j=0; j + towD[i][j] = k;
+ k++;
+ }
+
+ for(i=0; i<4; i++ ){
+ for(j=0; j + System.out.print(twoD[i][j] + " ");
+ System.out.println)(;
+ }
+ }
+ }

 

خروجي اين برنامه بقرار زير مي باشد : 0

1 2
3 4 5
6 7 8 9

 

آرايه اي كه توسط اين برنامه ايجاد مي شود ، بصورت زير خواهد بود :

| [0][0] |

| [1][0] | [1][1] |

| [2][0] | [2][1] | [2][2] |

| [3][0] | [3][1] | [3][2] | [3][3] |

 


از آرايه هاي چند بعدي ناجور ( يا نامنظم ) در اكثر برنامه ها استفاده نميشود زيرا برخلاف آنچه مردم هنگام مواجه شدن با يك آرايه چند بعدي انتظار دارند رفتار مي كنند . اما اين آرايه ها در برخي شرايط بسيار كارا هستند . بعنوان مثال ، اگر نياز به يك آرايه دو بعدي خيلي بزرگ داريد كه داراي تجمع پراكنده باشد ( يعني كه يكي و نه همه اجزائ آن مورد استفاده قرار مي گيرند ) ، آنگاه آرايه بي قاعده احتمالا" يك راه حل كامل خواهد بود .
اين امكان وجود دارد كه آرايه هاي چند بعدي را مقدار دهي اوليه نمود . براي اينكار ، فقط كافي است هر يك از مقدار ده اوليه ابعاد را داخل مجموعه ابروهاي ختص خودش قرار دهيد . برنامه بعدي يك ماتريس ايجاد مي كند كه هر يك از اجزائ آن شامل حاصلضرب نمايه هاي سطرها و ستونها هستند. همچنين دقت نماييد كه مي توان
از عبارات همچون مقادير لفظي داخل مقدار ده اوليه آرايه استفاده نمود .

+ // Initialize a two-dimensional array.
+ class Matrix {
+ public static void main(String args[] ){
+ double m[][] = {
+ { 0*0/ 1*0/ 2*0/ 3*0 };
+ { 0*1/ 1*1/ 2*1/ 3*1 };
+ { 0*2/ 1*2/ 2*2/ 3*2 };
+ { 0*3/ 1*3/ 2*3/ 3*3 };
+ };
+ int i/ j;
+
+ for(i=0; i<4; i++ ){
+ for(j=0 j<4; j++)
+ System.out.print(m[i][j] + " ");
+ System.out.println)(;
+ }
+ }
+ }

 

پس از اجراي اين برنامه ، خروجي آن بقرار زير خواهد بود : 0 0 0 0

0 1 2 3
0 2 4 6
0 3 6 9

 

همانطوريكه مشاهده مي كنيد، هر سطر در آرايه همانگونه كه در فهرستهاي مقدار دهي اوليه مشخص شده ، مقدار دهي اوليه شده است .

مثالهاي بيشتري درباره استفاده از آرايه چند بعدي بررسي مي كنيم . برنامه بعدي يك آرايه سه بعدي 3x4x5 ايجاد مي كند . سپس حاصل نمايه هاي مربوطه را براي هر عضو بارگذاري مي كند . در نهايت اين حاصل ها را نمايش خواهد داد :

+ // Demonstrate a three-dimensional array.
+ class threeDDatrix {
+ public static void main(String args[] ){
+ int threeD[][][] = new int[3][4][5];
+ int i/ j/ k;
+ for(i=0; i<3; i++)
+ for(j=0; j<4; j++)
+ for(k=0; k<5; k++)
+ threeD[i][j][k] = i * j * k;
+
+ for(i=0; i<3; i++ ){
+ for(j=0; j<4; j++ ){
+ for(k=0; k<5; k++)
+ System.out.print(threeD[i][j][k] + " ");
+ System.out.println)(;
+ }
+ System.out.println)(;
+ }
+ }
+ }

 

خروجي اين برنامه بقرار زير خواهد بود : 0 0 0 0 0

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

0 0 0 0 0
0 1 2 3 4
0 2 4 6 8
0 3 6 9 12

0 0 0 0 0
0 2 4 6 8
0 4 8 12 16
0 6 12 18 24

 


دستور زبان جايگزين اعلان آرايه يك شكل دوم براي اعلان يك آرايه بصورت زير وجود دارد :
type [] var-name;

 

نام متغير نوع

در اينجا كروشه ها بعداز مشخص كننده نوع مي آيند نه بعداز نام متغير آرايه .
بعنوان مثال دو شكل اعلان زير يكسان عمل مي كنند :
+ int a1[] = new int[3];
+ int[] a2 = new int[3];

 

دو شكل اعلان زير هم يكسان عمل مي كنند :
+ char twod1[][] = n

 

+ نوشته شده در  یکشنبه دوازدهم آبان 1387ساعت 16:37  توسط محسن  | 

آموزش جاوا java

متغيرها و اعمال روی آنها

در يك برنامه جاوا ، متغير ، اساسي ترين واحد ذخيره سازي است . يك متغير به وسيله تركيبي از يك شناسه ، يك نوع و يك مقدار ده اوليه اختياري تعريف خواهد شد . علاوه بر اين ، كليه متغيرها داراي يك قلمرو هستند كه رويت پذيري آنها را تعريف مي كند و يك زمان حيات نيز دارند. متعاقبا" اين اجزائ را مورد بررسي
قرار مي دهيم .

اعلان يك متغير Declaring a variable
در جاوا كليه متغيرها قبل از استفاده بايد اعلان شوند . شكل اصلي اعلان متغير بقرار زير مي باشد : type identifier [=value] [/identifier[=value]...];

مقدار شناسه مقدار شناسه نوع نوع (type) يكي از انواع اتمي جاوا يا نام يك كلاس يا رابط است . ( انواع
كلاس و رابط بعدا" بررسي خواهد شد . ) شناسه نام متغير است . مي توانيد با گذاشتن يك علامت تساوي و يك مقدار ، متغير را مقدار دهي اوليه نماييد . در ذهن بسپاريد كه عبارت مقدار دهي اوليه بايد منتج به يك مقدار از همان نوعي ( يا سازگار با آن نوع ) كه براي متغير مشخص شده ، گردد . براي اعلان بيش از يك نوع مشخص شده ، از فهرست كاماهاي (') جدا كننده استفاده نماييد .

در زير مثالهايي از اعلان متغير از انواع گوناگون را مشاهده مي كنيد . دقت كنيد كه برخي از آنها شامل يك مقدار دهي اوليه هستند .


+ int a/ b/ c; // declares three ints/ a/ b/ and c.
+ int d = 3/ e/ f = 5; // declares three more ints/ initializing
+ // d and f.
+ byte z = 22; // initializes z.
+ double pi = 3.14159; // declares an approximation of pi.
+ char x = 'x'; // the variable x has the value 'x'.

 

شناسه هايي كه انتخاب مي كنيد هيچ عامل ذاتي در نام خود ندارند كه نوع آنها را مشخص نمايد . بسياري از خوانندگان بياد مي آورند زماني را كه FORTRAN كليه شناسه هاي از Iتا Nا را پيش تعريف نمود تا از نوع NTEGER باشند ، در حاليكه ساير شناسه ها از نوع REAL بودند . جاوا به هر يك از شناسه هاي متناسب شكل گرفته
امكان اختيار هر نوع اعلان شده را داده است .

مقدار دهي اوليه پويا Dynamic intialization اگر چه مثالهاي قبلي از ثابت ها بعنوان مقدار ده اوليه استفاده كرده اند اما جاوا امكان مقداردهي اوليه بصورت پويا را نيز فراهم آورده است . اين موضوع با استفاده از هر عبارتي كه در زمان اعلان متغير باشد ، انجام مي گيرد .

بعنوان مثال ، در زير برنامه كوتاهي را مشاهده مي كنيد كه طول ضلع يك مثلث قائم الزاويه را با داشتن طول دو ضلع مقابل محاسبه مي كند :


+ // Demonstrate dynamic initialization.
+ class DynInit {
+ public static void main(String args[] ){
+ double a = 3.0/ b = 4.0;
+ // c is dynamically initialized
+ double c = Math.sqrt(a * a + b * b);
+
+ System.out.println("Hypotenuse is " + c);
+ }
+ }

 

در اينجا سه متغير محلي a، b،، c، اعلان شده اند . دو تاي اولي توسط ثابت ها مقدار دهي اوليه شده اند . اما متغير C بصورت پويا و بر حسب طول اضلاع مثلث قائم الزاويه ( بنابر قانون فيثاغورث ) مقدار دهي اوليه مي شود . اين برنامه از يكي از روشهاي توكار جاوا يعني ()sqrt كه عضوي از كلاس Math بوده و ريشه دوم آرگومانهاي خود را محاسبه ميكند استفاده كرده است . نكته كليدي اينجا است كه عبارت مقدار دهي اوليه ممكن است از هر يك از اجزائ معتبر در زمان مقدار دهي اوليه ، شامل فراخواني روشها ، ساير متغيرها يا الفاظ استفاده نمايد .

قلمرو زمان حيات متغيرها

تابحال كليه متغيرهاي استفاده شده ، در زمان شروع روش ()main اعلان مي شدند.
اما جاوا همچنين به متغيرها امكان مي دهد تا درون يك بلوك نيز اعلام شوند .

همانطوريكه قبلا" توضيح داديم ، يك بلوك با يك ابرو باز و يك ابرو بسته محصور مي شود : يك بلوك تعريف كننده يك قلمرو است . بدين ترتيب هر بار كه يك بلوك جديد را شروع ميكنيد ، يك قلمرو جديد نيز بوجود مي آوريد . همانطوريكه احتمالا" از تجربيات برنامه نويسي قبلي بياد داريد ، يك قلمرو (scope) تعيين كننده آن است كه چه اشيائي براي ساير بخشهاي برنامه قابل رويت هستند . اين قلمرو همچنين زمان حيات (lifetime) آن اشيائ را تعيين مي كند .

اكثر زبانهاي كامپيوتري دو طبقه بندي از قلمروها را تعريف مي كنند : سراسري (global) و محلي (local) . اما اين قلمروهاي سنتي بخوبي با مدل موكد شي ئ گرايي جاوا مطابقت ندارند . اگر چه در جاوا هم مي توان مقاديري را بعنوان قلمرو سراسري ايجاد نمود ، اما اين فقط يك نوع استثنائ است و عموميت ندارد . در جاوا قلمرو اصلي همانهايي هستند كه توسط يك كلاس يا يك روش تعريف مي شوند . حتي همين تمايز نيز تا حدي ساختگي و مصنوعي است . اما از آنجاييكه قلمرو كلاس داراي مشخصات و خصلتهاي منحصر بفردي است كه قابل استفاده در قلمرو تعريف شده توسط روش نيست ، اين تمايز تا حدي محسوس خواهد بود . بخاطر تفاوتهاي موجود ، بحث
قلمرو كلاس ( و متغيرهاي اعلان شده داخل آن ) اين مبحث بتعوق افتاده است . در حال حاضر فقط قلمروهاي تعريف شده توسط يك روش يا داخل يك روش را بررسي مي كنيم .

قلمرو تعريف شده توسط يك روش با يك ابروي باز شروع مي شود. اما اگر آن روش داراي پارامترهايي باشد ، آنها نيز داخل قلمرو روش گنجانده خواهند شد . بعدا" نگاه دقيقتري به پارامترها خواهيم داشت و فعلا" كافي است بدانيم كه پارامترها مشابه هر متغير ديگري در يك روش كار مي كنند .

بعنوان يك قانون عمومي ، متغيرهاي اعلان شده داخل يك قلمرو براي كدهايي كه خارج از قلمرو تعريف مي شوند ، قابل رويت نخواهند بود ( قابل دسترسي نيستند ).

بدين ترتيب ، هنگاميكه يك متغير را درون يك قلمرو اعلان مي كنيد ، در حقيقت آن متغير را محلي دانسته و آن را در مقابل دستيابيها و تغييرات غير مجاز محافظت مي كنيد . در حقيقت ، قوانين قلمرو اساس كپسول سازي را فراهم مي كنند .

قلمروها را مي توان بصورت تودرتو (nesting) محفوظ داشت . بعنوان مثال ، هر زمان يك بلوك كد ايجاد كنيد ، يك قلمرو جديد تودرتو ايجاد نموده ايد . هنگاميكه اين واقعه روي مي دهد ، قلمرو بيروني ، قلمرو دروني را دربرمي گيرد . اين بدان معني است كه اشيائ اعلان شده در قلمرو بيروني براي كدهاي داخل قلمرو دروني قابل
رويت هستند اما عكس اين قضيه صادق نيست . اشيائاعلان شده داخل قلمرو دروني براي بيرون قلمرو قابل رويت نخواهند بود .

براي درك تاثير قلمروهاي تودرتو ، برناه ريز را در نظر بگيريد :

+ // Demonstrate block scope.
+ class Scope {
+ public static void main(String args[] ){
+ int x; // known to all code within main
+
+ x = 10;
+ if(x == 10 ){ // start new scope
+ int y = 20; // known only to this bock
+
+ // x and y both known here.
+ System.out.println("x and y :" + x + " " + y);
+ x = y * 2;
+ }
+ // y = 100 :// Error! y not known here
+
+ // x is still known here.
+ System.out.println("x is " + x);
+ }
+ }

 

همانطوريكه توضيحات نشان مي دهند ، متغير x در ابتداي قلمروي ()main اعلان شده و براي كليه كدهاي متعاقب داخل ()main قابل دسترسي مي باشد . داخل بلوك if متغير y اعلان شده است . از آنجاييكه يك بلوك معرف يك قلمرو است ، y فقط براي ساير كدهاي داخل بلوك خود قابل رويت است . اين دليل آن است كه خارج بلوك مربوطه ، خط y=100 در خارج توضيح داده شده است . اگر نشانه توضيح راهنمايي را تغيير مكان دهيد ، يك خطاي زمان كامپايل (compile-time error) اتفاق مي افتد چون y براي بيرون از بلوك خود قابل رويت نيست . داخل بلوك if متغير x قابل استفاده است زيرا كدهاي داخل يك بلوك ( منظور يك قلمرو تودرتو شده است ) به متغيرهاي اعلان شده در يك قلمرو دربرگيرنده دسترسي دارند .

داخل يك بلوك ، در هر لحظه اي مي توان متغيرها را اعلان نمود ، اما فقط زماني معتبر مي شوند كه اعلان شده باشند . بدين ترتيب اگر يك متغير را در ابتداي يك روش اعلان مي كنيد، براي كليه كدهاي داخل آن روش قابل دسترس خواهد بود. بالعكس اگر يك متغير را در انتهاي يك بلوك اعلان كنيد ، هيچ فايده اي ندارد چون هيچيك
از كدها به آن دسترسي ندارند . بعنوان مثال اين قطعه از برنامه غير معتبر است چون نمي توان از count قبل از اعلان آن استفاده نمود :

 

+ // This fragment is wrong!
+ count = 100; // oops! cannot use count before it is declared!
+ int count;

 

يك نكته مهم ديگر در اينجا وجود دارد كه بايد بخاطر بسپاريد: متغيرها زماني ايجاد مي شوند كه قلمرو آن ها وارد شده باشد ، و زماني خراب مي شوند كه قلمرو آنها ترك شده باشد . يعني يك متغير هربار كه خارج از قلمروش برود ، ديگر مقدار خود را نگهداري نخواهد كرد . بنابراين ، متغيرهاي اعلان شده داخل يك روش مقادير خود را بين فراخواني هاي آن روش نگهداري نمي كنند . همچنين يك متغير اعلان شده داخل يك بلوك ، وقتي كه بلوك ترك شده باشد ، مقدار خود را از دست خواهد داد .

بنابراين ، زمان حيات (lifetime) يك متغير محدود به قلمرو آن مي باشد .
اگر اعلان يك متغير شامل مقدار دهي اوليه آن باشد ، آنگاه هر زمان كه به بلوك مربوطه وارد شويم ، آن متغير مجددا" مقدار دهي اوليه خواهد شد . بعنوان مثال برنامه زير را در نظر بگيريد :


+ // Demonstrate lifetime of a variable.
+ class LifeTime {
+ public static void main(String args[] ){
+ int x;
+
+ for(x = 0; x < 3; x++ ){
+ int y =- 1; // y is initialized each time block is entered
+ System.out.println("y is :" + y); // this always prints- 1
+ y = 100;
+ System.out.println("y is now :" + y);
+ }
+ }
+ }

خروجي توليد شده توسط اين برنامه بقرار زير است :


y is- :1
y is now:100
y is- :1
y is now:100
y is- :1
y is now:100

 

همانطوريكه مشاهده مي كنيد ، هر بار كه به حلقه for داخلي وارد مي شويم ، y همواره بطور مكرر مقدار اوليه 1- را اختيار مي كند . اگر چه بلافاصله به اين متغير مقدار 100 نسبت داده مي شود، اما هر بار نيز مقدار خود را از دست ميدهد.

و بالاخره آخرين نكته : اگر چه ميتوان بلوكها را تودرتو نمود، اما نميتوانيد متغيري را اعلان كنيد كه اسم آن مشابه اسم متغيري در قلمرو بيروني باشد. از اين نظر جاوا با زبانهاي Cو C++و متفاوت است . در زير مثالي را مشاهده مي كنيد كه در آن تلاش شده تا دو متغير جدا از هم با اسم اعلان شوند . در جاوا اينكار مجاز نيست . در Cو C++و اين امر مجاز بوده و دو bar كاملا" جدا خواهند ماند .

+ // This program will not compile
+ class ScopeErr {
+ public static void main(String args[] ){
+ int bar = 1;
+ { // creates a new scope
+ int bar = 2; // Compile-time error -- bar already defined!
+ }
+ }
+ }


تبديل خودكار و تبديل غير خودكار انواع

اگر تجربه قبلي برنامه نويسي داشته ايد ، پس مي دانيد كه كاملا" طبيعي است كه مقداري از يك نوع را به متغيري از نوع ديگر نسبت دهيم . اگر اين دو نوع سازگار باشند ، آنگاه جاوا بطور خودكار اين تبديل (conversion) را انجام مي دهد .

بعنوان مثال ، همواره امكان دارد كه مقدار int را به يك متغير long نسبت داد .
اما همه انواع با يكديگر سازگاري ندارند ، بنابراين هر گونه تبديل انواع مجاز نخواهد بود . بعنوان نمونه ، هيچ تبديلي از doubleبه byte تعريف نشده است .

خوشبختانه ، امكان انجام تبديلات بين انواع غير سازگار هم وجود دارد . براي انجام اينكار ، بايد از تبديل cast استفاده كنيد كه امكان يك تبديل صريح بين انواع غير سازگار را بوجود مي آورد . اجازه دهيد تا نگاه دقيقتري به تبديل خودكار انواع و تبديل cast داشته باشيم .

تبديل خودكار در جاوا Java's Automatic conyersions

هنگاميكه يك نوع داده به يك متغير از نوع ديگر نسبت داده مي شود ، اگر دو شرط زير فراهم باشد ، يك تبديل خودكار نوع انجام خواهد شد :
ؤ دو نوع با يكديگر سازگار باشند .
ؤ نوع مقصد بزرگتر از نوع منبع باشد .
هنگاميكه اين دو شرط برقرار باشد ، يك تبديل پهن كننده (widening) اتفاق مي افتد . براي مثال نوع int همواره باندازه كافي بزرگ است تا كليه مقادير معتبر byte را دربرگيرد، بنابراين نيازي به دستور صريح تبديل cast وجود ندارد.

در تبديلات پهن كننده ، انواع رقمي شامل انواع عدد صحيح و عدد اعشاري با هر يك از انواع سازگاري دارند . اما انواع رقمي با انواع charو booleanو سازگار نيستند . همچنين انواع charو booleanو با يكديگر سازگار نيستند .
همانطوريكه قبلا" ذكر شد ، جاوا هنگام ذخيره سازي يك ثابت عدد صحيح لفظي (Literal integer constant) به متغيرهاي از انواع byte، short،و longو ، يك تبديل خودكار نوع را انجام مي دهد .

تبديل غير خودكار انواع ناسازگار
اگر چه تبديلات خودكار انواع بسيار سودمند هستند ، اما جوابگوي همه نيازها نيستند . بعنوان مثال ، ممكن است بخواهيد يك مقدار int را به يك متغير byte نسبت دهيد. اين تبديل بطور خودكار انجام نمي گيرد، زيرا يك byteاز intز كوچكتر است .اين نوع خاص از تبديلات را گاهي تبديل باريك كننده (narrowing conversions) مي نامند ، زيرا بطور صريح مقدار را آنقدر باريك تر و كم عرض تر مي كنيد تا با نوع هدف سازگاري يابد .

براي ايجاد يك تبديل بين دو نوع ناسازگار ، بايد از cast استفاده نماييد . castيك تبديل نوع كاملا" صريح است . شكل عمومي آن بقرار زير مي باشد : ( target - type )value

نوع نوع مقصد يا هدف
در اينجا نوع هدف ، همان نوعي است كه مايليم مقدار مشخص شده را به آن تبديل كنيم . بعنوان مثال ، قطعه زير از يك برنامه تبديل غير خودكار از intبه byte را اجرا مي كند . اگر مقدار integer بزرگتر از دامنه يك byte باشد ، اين مقدار به مدول ( باقيمانده تقسيم يك integer بر دامنه ) byte كاهش خواهد يافت .

 + int a;
+ byte b;
+ //...
+ b =( byte )a;

هر گاه كه يك مقدار اعشاري به يك عدد صحيح نسبت داده شود ، شكل ديگري از تبديل اتفاق مي افتد : بريدن ، truncation . همانطوريكه مي دانيد ، اعداد صحيح داراي قسمت اعشاري نيستند . بنابراين هنگاميكه يك مقدار اعشاري به يك نوع عدد صحيح نسبت داده مي شود ، جزئ اعشاري از بين خواهد رفت ( بريده خواهد شد ) .
بعنوان مثال ، اگر مقدار 1.23 را به يك عدد صحيح نسبت دهيم ، مقدار حاصله فقط عدد 1 مي باشد . مقدار 0.23 بريده (truncated) خواهد شد . البته اگر اندازه اجزائ عدد كلي آنچنان بزرگ باشد كه در نوع عدد صحيح مقصد نگنجد ، آنگاه مقدار فوق به مدول دامنه نوع هدف كاهش خواهد يافت .

برنامه زير نشان دهنده برخي از تبديلات انواع است كه مستلزم تبديل cast
مي باشند :

+ // Demonstrate casts.
+ class Conversion {
+ public static void main(String args[] ){
+ bytt b;
+ int i = 257;
+ double d = 323.142;
+
+ System.out.println("\nConversion of int to byte.");
+ b =( byte )i;
+ System.out.println("i and b " + i + " " + b);
+
+ System.out.println("\nConversion of double to int.");
+ i =( int )d;
+ System.out.println("d and i " + d + " " + i);
+
+ System.out.println("\nConversion of double to byte.");
+ b =( byte )d;
+ System.out/println("d and b " + d + " " + b);
+ }
+ }

خروجي اين برنامه بقرار زير مي باشد :


Conversion of int to byte.
i and b 257 1

Conversion of double to int.
d and i 323.142 323

Conversion of double to byte.
d and b 323.142 67

+ نوشته شده در  یکشنبه دوازدهم آبان 1387ساعت 16:36  توسط محسن  | 

آموزش جاوا java

انواع اعداد اعشاري جاوا

اعداد اعشاري يا همان اعداد حقيقي براي ارزش گذاري عبارتهايي كه نيازمند دقت بيشتري هستند ، استفاده مي شوند . بعنوان نمونه ، محاسباتي نظير ريشه دوم و محاسبات مثلثاتي نظير سينوس و كسينوس منجربه جوابهايي مي شوند كه براي تعيين دقت آن نياز به نوع عدد اعشاري مي باشد . جاوا يك مجموعه استاندارد (IEEE-754) از انواع عدد اعشاري و عملگرها را پياده سازي مي كند. دو نوع عدد اعشاري تعريف شده يعني floatو doubleو هستند كه بترتيب معرف دقت معمولي و مضاعف مي باشند .

پهنا و دامنه آنها را در زير نشان داده ايم :
دامنه پهنا بر حسب تعداد بيت نام
double 64 1.7e-308 to 1.7e+308
float 32 3.4e-038 to 3.4e+038

هر يك از انواع اعشاري را متعاقبا" مورد بررسي قرار مي دهيم .

floatاين نوع مشخص كننده يك مقدار با دقت معمولي بوده كه از 32 بايت حافظه استفاده مي كند . دقت معمول روي بعضي پردازنده ها سريعتر بوده و نسبت به دقت مضاعف نيمي از فضا را اشغال مي كند ، اما هنگاميكه مقادير خيلي بزرگ يا خيلي كوچك باشند ، دقت خود را از دست ميدهد . متغيرهاي نوع float براي زماني مناسب
هستند كه از يك عضو كسري استفاده مي كنيد اما نيازي به دقت خيلي زياد نداريد .

بعنوان مثال ، نوع float براي معرفي دلار و سنت بسيار مناسب است . + float hightemp/ lowtemp;

double دقت مضاعف كه با واژه كليدي double معين مي شود براي ذخيره كردن يك مقدار 64بيت فضا را اشغال مي كند . دقت مضاعف روي برخي پردازنده هاي جديد كه براي محاسبات رياضي با سرعت زياد بهينه شده اند ، واقعا" سريعتر از دقت معمولي عمل مي كند . كليه توابع مثلثاتي نظير ()sin ، ()cos و ()sqrt مقادير مضاعف را
برمي گردانند . هنگام اجراي محاسبات مكرر كه نياز به حفظ دقت داريد و يا هنگام كار با ارقام خيلي بزرگ double بهترين انتخاب است .

در زير برنامه اي را مشاهده مي كنيد كه از double استفاده نمود تا محيط يك دايره را محاسبه كند :

+ // Compute the area of a circle.
+ class Area {
+ public static void main(String args[] ){
+ double pi/ r/ a;
+
+ r = 10.8; // radius of circle
+ pi = 3.1416; // pi/ approximately
+ a = pi * r * r; // compute area
+
+ System.out.println("Area of circle is " + a);
+ }
+ }

 

كاراكترها
در جاوا از نوع داده char براي ذخيره كردن كاراكترها استفاده مي شود . اما برنامه نويسان Cو C++و آگاه باشند كه char در جاوا مشابه char در زبانهاي C و C++ نيست . در زبانهاي Cو C++و ، نوع char يك نوع عدد صحيح با پهناي 8 بيت است . اما جاوا متفاوت عمل مي كند . جاوا از كدهاي جهاني (unicode) براي معرفي كاراكترها استفاده مي كند . كدهاي جهاني يك مجموعه كاملا" جهاني از كاراكترها هستند كه مي توانند همه كاراكترها را معرفي نمايند . اين مجموعه شامل دهها مجموعه كوچك تر كاراكتري نظير Latin، Greek،، Arabic،، Cyrillic،، Hebrew، Katakana، Hangul، و امثال آن است .

براي اين منظور ، 16 بيت مورد نياز است . بنابراين char در جاوا يك نوع 16 بيتي است . دامنه charاز 0ز تا 65/536 مي باشد . در نوع char مقدار منفي وجود ندارد . مجموعه استاندارد كاراكترها موسوم به ASCII همچون گذشته داراي دامنه از 0 تا 127 و مجموعه كاراكترهاي 8 بيتي توسعه يافته موسوم به lso-Latin-1 داراي دامنه از 0 تا 255 مي باشند .

چون در جاوا امكان نوشتن ريز برنامه ها براي كاربري جهاني وجود دارد ، بنظر مي رسد كه بهتر است جاوا از كدهاي جهاني براي معرفي كاراكترها استفاده نمايد .

البته بكار بردن كدهاي جهاني درمورد زبانهايي نظير انگليسي ،آلماني ،اسپانيايي يا فرانسوي كه كاراكترهاي آنها را مي توان براحتي داخل 8 بيت جاي داد ، تا حدي سبب نزول كارآيي خواهد شد . اما اين بهايي است كه براي رسيدن به قابليت حمل جهاني در برنامه ها بايد پرداخت .

در زير برنامه اي را مشاهده مي كنيد كه متغيرهاي char را نشان مي دهد :

+ // Demonstrate char data type.
+ class CharDemo {
+ public static void main(String args[] ){
+ char ch1/ ch2;
+
+ ch1 = 88; // code for X
+ ch2 = 'Y';
+
+ System.out.print("ch1 and ch2 :");
+ System.out.println(ch1 + " " + ch2);
+ }
+ }

اين برنامه خروجي زير را نشان خواهد داد : ch1 and ch2 :xy

دقت كنيد كه مقدار 88به ch1 نسبت داده شده ، كه مقدار متناظر با حرف x در كد ASCII ( و كد جهاني ) است . قبلا" هم گفتيم كه مجموعه كاراكتري ASCII َ127 مقدار اوليه در مجموعه كاراكتري كدهاي جهاني را اشغال كرده است . بهمين دليل كليه فوت و فنهاي قديمي كه قبلا" با كاراكترها پياده كرده ايد ، در جاوا نيز به خوبي جواب مي دهند .

اگر چه انواع char عدد صحيح محسوب نمي شوند ، اما در بسياري از شرايط مي توانيد مشابه عدد صحيح با آنها رفتار كنيد . بدين ترتيب قادريد دو كاراكتر را با هم جمع نموده و يا اينكه مقدار يك متغير كاركتري را كاهش دهيد . بعنوان مثال ، برنامه زير را در نظر بگيريد :

+ // char variables behave like integers.
+ class CharDemo2 {
+ public static void main(String args[] ){
+ char ch1;
+
+ ch1 = 'X';
+ System.out.println("ch1 contains " + ch1);
+
+ ch1++; // increment ch1
+ System.out.println("ch1 is now " + ch1);
+ }
+ }

خروجي اين برنامه بشرح زير خواهد بود : ch1 contains x
ch1 is now y

در برنامه ابتدا مقدار xبه ch1 داده ميشود . سپس ch1 افزايش مي يابد . اين  روال باعث مي شود تا ch1 حرف y را اختيار كند، كه كاراكتر بعدي در ترتيب ASCII ( و كدهاي جهاني ) مي باشد .
Boolean

جاوا يك نوع ساده موسوم به boolean براي مقادير منطقي دارد . اين نوع فقط يكي از مقادير ممكن trueيا falseا را اختيار مي كند . اين نوعي است كه توسط كليه عملگرهاي رابطه اي نظير bشرطي كه دستورهاي كنترلي نظير ifو forو را مديريت مي كنند ، استفاده مي شود .

در زير برنامه اي مشاهده مي كنيد كه نوع boolean را نشان مي دهد :

+ // Demonstrate boolean values.
+ class BoolTest {
+ public static void main(String args[] ){
+ boolean b;
+
+ b = false;
+ System.out.println("b is " + b);
+ b = true;
+ System.out.println("b is " + b);
+
+ // a boolean value can control the if statement
+ if(b )System.out.println("This is executed.");
+
+ b = false;
+ if(b )System.out.println("This is not executed.");
+
+ // outcome of a relational operator is a boolean value
+ System.out.println("10 > 9 is " +( 10 > 9));
+ }
+ }

خروجي برنامه فوق بقرار زير خواهد بود :

b is false
b is true
This is executed.
10>9 is true

درباره اين برنامه سه نكته جالب توجه وجود دارد . اول اينكه وقتي كه مقدار booleanتوسط ()println خارج مي شود ، مي بينيد كه "true"يا "false"ا بنمايش درمي آيد . دوم اينكه يك متغير boolean بتنهايي براي كنترل دستور if كفايت مي كند . ديگر نيازي به نوشتن يك دستور if بقرار زير نخواهد بود : + if(b == true... )

سوم اينكه ، پي آمد يك عملگر رابطه اي نظيربولين يک مقدار است .

+ نوشته شده در  یکشنبه دوازدهم آبان 1387ساعت 16:35  توسط محسن  | 

آموزش جاوا java

آموزش جاوا - integers ( اعداد صحيح )

جاوا چهار نوع عدد صحيح تعريف مي كند : byte، short،، int،، long، . كليه اين اعداد داراي علامات مثبت و منفي هستند . جاوا از اعداد صحيح غير علامت دار و فقط مثبت پشتيباني نمي كند . بسياري از زبانهاي برنامه نويسي شامل Cو C++و هم از اعداد صحيح علامت دار و هم از اعداد صحيح فاقد علامت پشتيباني مي كنند . اما طراحان جاوا احساس مي كردند كه اعداد صحيح فاقد علامت غير ضروري است . بويژه آنها احساس كردند كه مفهوم فاقد علامت (unsigned) بيشتر براي مشخص كردن رفتار بيت بالاتر از حد مجاز (high-order bit) استفاده مي شود كه علامت يك int را هنگاميكه بعنوان يك رقم عنوان مي شود ، مشخص مي كند . بعدا" خواهيد ديد كه
جاوا مفهوم بيت بالاتر از حد مجاز (high-order bit) را بگونه اي متفاوت مديريت مي كند ، يعني با اضافه كردن يك عملگر ويژه حركت به راست فاقد علامت unsigned) (right shift . بدين ترتيب نياز به يك نوع عدد صحيح فاقد علامت منتفي شده است .

پهناي (widit) يك نوع عدد صحيح را نبايد با ميزان حافظه اي كه مصرف مي كند اشتباه گرفت ، بلكه نشانه رفتاري است كه براي متغيرها و عبارات آن نوع تعريف مي شود . محيط حين اجراي جاوا از هر اندازه اي كه نياز داشته باشد ، استفاده مي كند ، البته تا آن اندازه اي كه انواع براساس اعلام قبلي شما رفتار كنند . در حقيقت ، حداقل يك پياده سازي byte وجود دارد كه ، short را بعنوان مقادير 32 بيتي ذخيره مي كند تا عملكرد را توسعه دهد. زيرا آنچه درحال حاضر مورد استفاده قرار مي گيرد ، اندازه كلمه (word size) اكثر كامپيوترهاست .


پهنا و دامنه اين انواع اعداد صحيح همانطوريكه در جدول زير مشاهده مي كنيد
طيف وسيعي دارند :


دامنه پهنا نام
long 64- 9/ 223/ 372/ 036/ 845/ 775/ 808 to 9/ 223/ 372
/036/ 854/ 775/ 807
int 32- 2/ 147/ 483/ 648 to 2/ 147/ 483/ 647
short 16- 32/ 768 to 32/ 767
byte 8- 128 to 127

اكنون نگاه دقيقتري به هر يك از انواع عدد صحيح خواهيم داشت .
byte

كوچكترين نوع عدد صحيح byte است . اين يك نوع علامت دار 8 بيتي است كه دامنه آن از 128- تا 127 مي باشد . متغيرهاي نوع byte بويژه هنگاميكه با يك جريان داده از يك شبكه يا يك فايل كار ميكنيد ، سودمند خواهند بود . همچنين هنگاميكه با داده دودويي ( باينري ) خام مشغول كار هستيد كه ممكن است بطور مستقيم با ساير انواع توكار جاوا سازگاري نداشته باشند ، بسيار سودمند هستند .

متغيرهاي byte را با استفاده از واژه كليدي byte اعلام مي كنيم . بعنوان
مثال ، در زير دو متغير byte با اسامي bو cو را اعلام كرده ايم : + byte b/ c;

short

يك نوع 16 بيتي علامت داراست . دامنه آن از 768 32/- تا 767 32/ است . short در اصل كم استفاده ترين نوع در جاوا مي باشد ، چون طوري تعريف شده كه بايت بالاي آن اول مي آيد ( آن را big-endian format ميگويند ). اين نوع براي كامپيوترهاي 16بيتي كه بسرعت از رده خارج شده اند ، كاربري دارد .

در زير مثالهايي از چگونگي اعلان متغيرهاي short را مشاهده مي كنيد : + short s;
+ short t;

نكته : Endiannes توصيف كننده چگونگي ذخيره شدن انواع داده چند بايتي short intو longو در حافظه است . اگر 2 بايت براي معرفي يك نوع short استفاده شود ، آن بايتي كه ابتدا قرار مي گيرد ( مهمترين يا كم اهميت ترين ? ) مي گويد كه يك ماشين big-endian است ، بدان معني كه مهمترين بايت اول آمده و بعد از آن بايت كم اهميت تر قرار دارد . ماشينهايي نظير SPARC و power pcاز نوع big-endian و ماشينهاي سري lntelx86نوع little-endianع هستند .

intرايجترين نوع عدد صحيح int است . اين يك نوع 32 بيتي علامت دار است كه دامنه آن از 2/147/483/648- تا 2/147/483/647 گسترده است . علاوه بر كاربردهاي ديگر متغيرهاي از نوع int براي كنترل حلقه ها و نمايه سازي آرايه ها مورد استفاده قرار مي گيرند . هر بار كه يك عبارت عدد صحيح شامل byte، short،و intو و ارقام لفظي
(literal) داشته باشيد، كل عبارت قبل از انجام محاسبات به int ارتقائ مي يابد.

نوع int روان ترين و كاراترين نوع است و اكثر اوقات هنگاميكه ميخواهيد رقمي را براي شمارش يا نمايه سازي آرايه ها يا انجام محاسبات عدد صحيح بوجود آوريد بايد از آن استفاده نماييد . شايد بنظر آيد كه استفاده از انواع shortو byteو سبب صرفه جويي در فضا شود ، اما هيچ تضميني وجود ندارد كه جاوا اين انواع را بطرق داخلي به int ارتقائ ندهد . همواره بياد داشته باشيد كه نوع ، مشخص كننده رفتار است نه اندازه . ( تنها استثنائ در اين مورد، آرايه است كه در آنجا byte بصورت تضميني براي هر عضو آرايه فقط يك بايت ، short دو بايت و int از چهار
بايت استفاده مي كند . )


long يك نوع 64 بيتي علامت دار است و براي مواردي مفيد است كه يك نوع int طول كافي براي دربرگرفتن مقدار مورد نظر نداشته باشد. دامنه long كاملا" وسيع است .

اين نوع ، براي كار با اعداد خيلي بزرگ مناسب است . بعنوان مثال ، در زير برنامه اي را مشاهده مي كنيد كه مسافت طي شده توسط نور در تعداد مشخص روز را بر حسب مايل محاسبه مي كند .


+ // Compute distance light travels using long variables.
+ class Light {
+ public static void main(String args[] ){
+ int lightspeed;
+ long days;
+ long seconds;
+ long distance;
+
+ // approximate speed of light in miles per second
+ lightspeed = 86000;
+
+ days = 1000; // specify number of days here
+
+ seconds = days * 24 * 60 * 60; // convert to seconds
+
+ distance = lightspeed * seconds; // compute distance
+
+ System.out.print("In " + days);
+ System.out.print(" days light will travel about ");
+ System.out.println(distance + " miles .");
+ }
+ }

 

خروجي اين برنامه بقرار زير خواهد بود : ln 1000 days light will travel about 4730400000000 miles.

+ نوشته شده در  یکشنبه دوازدهم آبان 1387ساعت 16:34  توسط محسن  | 

آموزش جاوا java

جاوا را بشناسیم

چرا جاوا زباني جالب است ؟

 در يكي از مقالات در باره ي زبان شركتSun جاوا را با اين خصوصيات  شرح مي دهد :

جاوا يك زبان ساده ، شي گرا ،‌توزيع شده ، تفسير شده ، قدرتمند ، ايمن ، با معماري خنثي ، قابل حمل ، با عملكرد سطح بالا چند نخ كشي شده و پويا است .

Sun تصديق ميكند كه به طور قطع اين كلمات رشته هايي از واژه هاي متداول در زبان برنامه نويسي هستند ، اما حقيقت اين است كه اين واژه ها به طور ماهرانه اي خصوصيات اين زبان را شرح ميدهند .

حال به برخي از خصلت هاي جاوا در پشت اين واژه ها ميپردازيم .

  شي گرا :Object Oriented

 جاوا يك زبان برنامه نويسي شي گرا است . براي يك برنامه نويس اين به اين معنا است كه به جاي فكر كردن به قسمت هاي رويه برنامه ، بايد به كاربرد داده ها و روش هايي كه روي آن داده ها عمل ميكنند ، توجه شود.

اگر شما به برنامه نويسي با اعلان رويه در C عادت كرده ايد ،ممكن است دريابيد كه به هنگام استفاده از جاوا مجبور به تغيير در روش و چگونگي برنامه تان هستيد . هنگامي كه فهميديد اين الگوي جديد چقدر قدرتمند است ، به سرعت با آن هماهنگ ميشويد .

در يك سيستم شي گرا ، يك كلاس مجموعه اي از داده ها و روش هايي است كه روي آن داده عمل ميكنند. همراه بودن داده ها و متد ها رفتار و حالت يك شي را بيان مي دارد . كلاس ها به صورت سلسله مراتبي مرتب شده اند ، بنابر اين يك زير كلاس ميتواند رفتار هايي را از كلاس بالاتر به ارث ببرد . يك كلاس سلسله مراتبي هميشه يك كلاس ريشه دارد كه كلاسي است با رفتار هاي كاملا عمومي .

جاوا  به همراه دسته ي گسترده اي از كلاس هايي است كه در بسته هايي مرتب شده اند و شما مي توانيد از آنها در برنامه ي خود استفاده كنيد  . براي مثال جاوا كلاس هايي را ايجاد ميكند كه :

 بخش هاي رابط گرافيكي را ميسازند (the java.awt package) ،كلاس هايي كه عمليات ورودي و خروجي را به عهده دارند(the java.io package)  و كلاس هايي كه از شبكه پشتيباني ميكنند (the java.net  package )   .

يك شي كلاس(in the java.lang package) به عنوان ريشه كلاس سلسله مراتبي جاوا انجام وظيفه ميكند .

 جاوا بر خلاف C++ طوري طراحي شده است كه از همان ابتدا به صورت شي گرا باشد .  اكثر چيز ها در جاوا اشيا هستند . ارقام ابتدايي ، كاراكترها و مدل هاي منطقي تنها استثناء ها هستند . حتي رشته ها هم در جاوا به وسيله اشيا حاضر ميشوند ،همان طور كه ساختمان هاي مهم ديگر اين زبان ، مثل نخ ها   احضار ميشوند . يك كلاس يك واحد پايه براي كامپايل و اجرا شدن در جاوا است . تمام برنامه هاي جاوا متشكل از كلاس ها است .

    درست است كه جاوا طوري طراحي شده است كه مثل C++  باشد و خاصيت هاي آن را داشته باشد ، اما هنگامي كه با آن كار كنيد خواهيد فهميد كه بسياري از پيچيده گي هاي آن زبان را از بين برده است .

اگر شما يك برنامه نويس C++ هستيد حتما لازم است كه ساختار هاي شي گرايي در جاوا را به دقت مطالعه كنيد . اگرچه تركيب و نحوه دستورات آن تقريبا شبيه C++ است ،‌اما رفتار هاي آن خيلي مشابه نيست .

 

 

 

تفسير شده :Interpreted

 

جاوا يك زبان تفسير شده است . كامپايلر جاوا به جاي ايجاد كد محلي ماشين ، كد بايتي براي ماشين مجازي جاوا ايجاد ميكند . براي اجراي دقيق برنامه ، از مفسر جاوا براي اجراي كد هاي بايتي كامپايل شده استفاده ميشود . به دليل اينكه  كد هاي بايتي جاوا به نوع كامپيوتر بستگي ندارند ، برنامه هاي جاوا ميتوانند روي هر نوع كامپيوتري كه JVM (Java Virtual Machine) را دارند ، اجرا شوند .

در محيط تفسير شده ، مرحله لينك استاندارد توسعه برنامه از ديد كاربر پنهان است . اگر جاوا تنها يك مرحله لينك داشت ، فقط بارگذاري كلاس جديد به محيط پردازش ميشد كه يك پردازش نموي سبك وزن است كه در زمان اجرا مشاهده ميشود . كه اين خصوصيت با چرخه كامپايل-لينك-اجرا ي آرام و طاقت فرساي زبان هايي مانند C يا C++ در تضاد است .

 

 

 

معماري خنثي و قابل حمل :

Architecture Neutral and Portable

 

به دليل اينكه برنامه هاي جاوا در فرمت كد بايتي با معماري خنثي كامپايل شده اند ، برنامه كاربردي جاوا ميتواند در هر سيستمي اجرا شود.

البته با اين شرط كه آن سيستم توانايي پياده سازي ماشين مجازي جاوا را داشته باشد . اين مسئله  تقريبا براي كاربرد هاي توزيع سده روي اينترنت و يا ديگر شبكه هاي ناهمگن مهم است . اما روش معماري خنثي براي كاربرد هاي بر مبناي شبكه مفيد است .

به عنوان يك توسعه دهنده  برنامه هاي كاربردي در بازار نرم افزاري  امروز ممكن است بخواهيد مدل هاي كاربردي خود را توسعه دهيد ، به طوري كه بتواند روي Pc ، مكينتاش و سيستم عامل Unix اجرا شود .با وجود گونه هاي مختلف Unix  ، Windows روي Pc و مكينتاش قوي جديد ، رفته رفته توليد نرم افزار براي همه انواع اين كامپيوتر ها سخت مي شود . اگر شما برنامه تان را در جاوا بنويسيد ميتواند روي همه ي اين كامپيوترها اجرا شود .

در حقيقت تفسير شده بودن جاوا وتعريف يك استاندارد  ، معماري خنثي داشتن و فورمت كد بايتي آن از بزرگترين دلايل قابل حمل بودن آن به شمار مي آيند .

اما جاوا باز از اين هم بيشتر گام برميدارد ،‌ با اطمينان حاصل كردن از اينكه هيچيك از جنبه هاي وابستگي اجرايي زبان را ندارد . براي مثال جاوا به طور صريح اندازه هريك  از انواع داده  را تعريف ميكند كه اين با C تفاوت دارد  ، برای مثال هريک از انواع صحيح می تواند بسته به نوع کامپيوتر16-32 يا 64 بيت طول داشته باشد .

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

يك برنامه جاوا  به توليد كنندگان نرم افزار كمك ميكند تا از قابل حمل بودن كد هايشان اطمينان حاصل كنند . برنامه نويسان فقط براي پرهيز از دام غير قابل حمل بودن برنامه احتياج به يك تلاش ساده دارند كه شعار تجارتي شركتSun  را زنده نگهدارند و آن شعار اين است :

« يك بار بنويس ، همه جا اجرا كن » .

 

 

 

پويا و توزيع شده :Dynamic and Distributed

 

جاوا يك زبان پويا است . هر كلاس جاوا ميتواند در هر زماني روي مفسر جاوا بارگذاري شود . سپس اين كلاس هاي بارگذاري شده ي  پويا ميتوانند به صورت پويا معرفي شوند . حتي كتابخانه كد هاي محلي  ميتواند به طور پويا بارگذاري شود .كلاس ها در جاوا با كلاس Class فراخواني ميشوند ؛ شما ميتوانيد به طور پويا در مورد يك كلاس در زمان اجرا اطلاعاتي بدست بياوريد . اين خصوصيت در جاوا 1-1 به طور درستي موجود است . با وجود بازتاب API اضافه شده (Application Program Interface ) كه به برنامه ساز امكان ميدهد كه با برنامه از طريق يك برنامه كاربردي ديگر ارتباط برقرار كند .

جاوا حتي با نام زبان توزيع شده نيز خوانده ميشود . به طور ساده اين به اين معنا است كه اين زبان پشتيباني سطح بالايي براي شبكه به وجود مي آورد . براي مثال كلاس URL و كلاس هاي مرتبط با آن در بسته ي Java.net  ، خواندن فايل هاي دوردست را به همان سادگي خواندن فايل هاي محلي كرده است . به طور مشابه در جاوا 1-1 ، احضار روش كنترلي RMI

(Remote Method  Invocation ) ،  API  به يك برنامه جاوا اجازه ميدهد كه روش هايي از اشياء دور دست جاوا را به همان صورتي كه اگر آن اشياء محلي بدند آنها را ميخواند ، بخواند  .( جاوا حتي از سيستم شبكه اي سطح پايين كه شامل آدرس مقصد و مسير جرياني كه توسط سوكت ها متصل شده است ، نيز پشتيباني ميكند .)

طبيعت توزيع شده ي جاوا زمانيكه با امكانات پوياي بارگذاري كلاس همراه ميشود ، واقعا درخشنده است . اين خصوصيات با هم اين امكان را براي مفسر جاوا به وجود مي آورند كه كد ها را از اينترنت بارگذاري و اجرا كند . ( همان طور كه بعدا خواهيم ديد جاوا باعث ميشود كه با وجود ابزار قدرتمند و ايمن اين كار به طور مطمئن انجام شود .) اين  چيزي است كه در هنگام بارگذاري و اجراي يك برنامه كاربردي از اينترنت توسط مرورگر وب ، اتفاق مي افتد  . اما داستان پيچيده تر از اين هم ميتواند باشد . تصور كنيد يك پردازشگر  كلمه چند رسانه اي در جاوا نوشته شده است  . وقتي  از اين برنامه پرسيده ميشود كه چند نوع از داده هايي را كه قبلا هرگز وارد نشده را نمايش دهد ، ممكن است به طور ديناميكي يك كلاس را كه ميتواند داده را شناسايي كند ، از شبكه بارگذاري كند و بعد كلاس ديگري را كه بتواند داده را از درون يك پوشه تركيبي بخواند ، باز به طور ديناميكي بارگذاري ميكند . برنامه اي مانند اين از منابع توزيع شده در شبكه  براي رشد و سازگاري خودكار كاربران استفاده ميكند .

 

 

 

 

ساده :Simple

 

جاوا يك زبان ساده است . طراحان جاوا سعي در اين داشتند تا زباني بوجود بياورند كه برنامه نويسان بتوانند به سرعت آن را ياد بگيرند . بنابراين تعداد ساختار هاي اين زبان تقريبا كم است . هدف ديگر طراحي اين زبان اين بود كه به منظور راحتي انتقال آن ، آن را طوري طراحي كنند كه براي عده ي زيادي از برنامه نويسان آشنا باشد . اگر شما يك برنامه نويس C يا C++   هستيد ، خواهيد فهميد كه جاوا از بسياري از ساختار هاي C و ‍  C++ استفاده ميكند .

براي اينكه اين زبان را هم به طور ساده و هم  آشنا و ملموس و هم  كوچك نگه دارند بسياري از خصوصيات   C  و C++ را در آن حذف كردند . اينها خصوصياتي بودند كه باعث مي شدند  برنامه نويسي ضعيفي صورت بگيرد  يا آنهايي بودند كه به ندرت در برنامه استفاده مي شدند . براي مثال جاوا از دستور goto استفاده نمي كند ، در عوض از  دستورهاي  break , continue   در مواقع نياز استفاده مي كند .

جاوا از سر فايل ها(header files)   استفاده نمي كند و پردازشگر C را هم حذف كرده است . به اين دليل كه جاوا يك زبان شي گرا است ، ساختار هاي C مثل struct , union  از آن برداشته شده است . جاوا حتي  بارگذاري مجدد و خواص چندگانه ارث بري از C++ را هم حذف كرده است . شايد مهمترين پارامتر ساده بودن جاوا عدم استفاده اين زبان از اشاره گر ها باشد . اشاره گر ها يكي از بيشترين موجوديت هاي دردسرساز  در C , C++ هستند . چون جاوا ساختمان ندارد و آرايه ها و رشته ها اشياء آن هستند ، بنابراين  احتياجي به اشاره گر نيست .جاوا به طور خودكار آدرس دهي و دستذسي به محتواي موجود در يك آدرس را براي شما انجام ميدهد .

جاوا حتي زباله هاي حافظه اي را هم به طور خودكار جمع آوري ميكند .(Garbage Collectin)  (* جمع آوري آشغال فرايندي است براي ترميم خودكار حافظه انباشته شده . بلوك هايي از حافظه كه زماني به فايل ها اختصاص داشتند اما مدتي است كه از آنها استفاده نمي شود و بلوك هايي از حافظه كه هنوز مورد استفاده قرار ميگيرند  ممكن است حركت داده شوند  تا از به هم پيوستن فضاهاي خالي حافظه بلوك هاي خالي بزرگتري بدست آيد .

[ از كتاب :  Microsoft computer dictionary] * ) بنابراين  لازم نيست كه نسبت به موضوع مديريت حافظه نگران باشيد ، همه اينها شما را از نگراني در مورد اشاره گر هاي بي ارزش ، خطرناك و هرز هاي حافظه رها ميكنند . بنابر اين شما ميتوانيد وقت خود را صرف بهبود برنامه تان كنيد .

 

 

 

قدرتمند :Robust

جاوا براي نوشتن نرم افزارهاي قدرتمند و بسيار ايمن ساخته شده است . جاوا هنوز هم به طور قطع نرم افزار ها را تضمين نميكند . تقريبا هنوز هم امكان نوشتن برنامه هاي مشكل ساز در جاوا وجود دارد ، هرچند كه جاوا برخي از انواع مشخص خطاهاي برنامه نويسي را حذف كرده كه به طرز چشمگيري نوشتن نرم افزار هاي ايمن را آسان تر كرده است .

جاوا يك زبان تايپ شده قدرتمند است ،‌ كه اجازه چك شدن مشكلات  و خطاهاي تايپي را در زمان كامپايل مي دهد . جاوا بسيار قويتر از C++ تايپ شده است كه بسياري از خصوصيات انعطاف پذير در زمان كامپايل را از C به ارث برده است . مخصوصا هنگام اعلان توابع .جاوا به مدل اعلان صريح احتياج دارد ، زيرا كه از مدل اعلان صريح C پشتيباني نميكند . اين مسئله مارا از اينكه كامپايلر ميتواند خطاهاي زمان اعلان را بدست آورد ، مطمئن ميكند . مسئله اي كه منجر به ايجاد برنامه هاي ايمن تري ميشود .

يكي از چيزهايي كه باعث شده كه جاوا ساده باشد عدم وجود اشاره گر ها ومحاسبات بر روي آنها است . اين ويژگي حتي قدرت جاوا را هم با از ميان بردن يك كلاس سراسري اشاره گر افزايش ميدهد .

به طور مشابه تمام دسترسي به آرايه ها و رشته ها در زمان اجرا چك مي شوند تا از قطعي بودن آنها اطمينان حاصل شود .با از بين بردن امكان دوباره نويسي حافظه و داده هاي هرزه ، تعويض نقش اشياء از نوعي به نوع ديگر هم در زمان اجرا كنترل ميشود تا از مجاز بودن آن اطمينان حاصل شود .

سرانجام زباله جمع كن خودكار جاوا بسياري از عمليات پاكسازي مرتبط با معماري حافظه را راه اندازي ميكند . چيزي كه از خطاهاي خطر ساز مرتبط با تخصيص و آزاد سازي حافظه جلوگيري ميكند .

 

 

 

ايمن : Secure

 

يكي از دلايل پرطرفدار بودن جاوا اين است كه يك زبان ايمن است . اين ويژگي مخصوصا به خاطر طبيعت توزيع شده ي آن بسيار مهم است .بدون وجود امنيت شما قطعا نميخواهيد كه يك كد را از يك سايت تصادفي اينترنت بارگذاري كنيد و به آن اجازه اجرا شدن روي كامپيوتر خودتان را هم بدهيد . اين دقيقا همان چيزي است كه مردم هرروز با يك كد جاوا انجام ميدهند . جاوا به صورت ايمن طراحي شده و چندين لايه كنترل امنيت به وجود مي آورد كه شما را در برابر كد هاي خطرساز محافظت مي كنند و به كاربر اجازه ميدهد كه برنامه هاي ناشناخته را با خيال راحت اجرا كند .

همان طور كه ديديم ، برنامه جاوا نميتواند اشاره گر ها را به حافظه يا آرايه هاي سرريز يا حافظه خواندني خارج  از محدوده يك آرايه يا رشته اشاره ، اشاره دهد. اين خصوصيت يكي از اصلي ترين وسايل دفاع جاوا در برابر كدهاي خطرساز است . دومين راه دفاع در برابر كد هاي خطرساز ، پردازش كدهاي بايتي به صورت قابل تصديق و تاييد است كه مفسر جاوا به روي هر كدي كه در حال بار گذاري باشد اعمال ميكند . اين مراحل تاييد از اينكه كد به صورت درستي ساخته شده اطمينان حاصل ميكنند ، كه براي مثال پشته سرريزي يا زيرريزي نداشته باشد ، يا شامل كد هاي بايتي غير مجاز نباشد .

كدهاي بايتي خراب يا خطرساز ممكن است از ضعف هاي اجرايي در مفسر جاوا سوء‌ استفاده كنند . لايه اي كه در اينجا ما را به طور ايمن محافظت ميكند ، مدل جعبه شني (Sand box) است : كدهاي ناشناخته در يك جعبه شني قرار ميگيرند  جايي كه ميتوانند به صورت ايمن اجرا شوند ، بدون اينكه هيچ صدمه اي به بقيه اجزاء يا محيط جاوا بزنند .

وقتي يك برنامه كاربردي يا ديگر كدهاي ناشناخته در جعبه شني در حال اجرا است ،‌ چند محدوديت در مورد كاري كه ميتواند انجام دهد ، وجود دارد . واضح ترين اين محدوديت ها اين است كه هيچ دسترسي به هيچ يك از فايل هاي محلي سيستم وجود ندارد . در جعبه شني محدوديت ديگري هم وجود دارد كه به وسيله كلاس مديريت امنيت اعمال ميشود  . اين مدل در ابتدا از اينكه سيستم هاي امنيتي را نصب كرده ايد يا نه ، مطمئن ميشود ، چرا كه همه كلاس هاي جاوا نياز به عمليات حساسي مانند دسترسي به سيستم فايل را دارند . اگر فراخواني به وسيله يك كد ناشناخته به صورت مستقيم يا غير مستقيم انجام شد ،‌ مدير امنيت مورد استثناء‌ را مي فرستد و عمليات صورت نمي گيرد .

و سرانجام در جاوا 1-1 يك راه حل ممكن ديگر براي مشكلات امنيتي وجود دارد ، به وسيله ضميمه كردن يك امضاء ديجيتالي به كد جاوا كه اصل آن كد ميتواند به صورت پنهاني و نهفته ساخته شود . اگر شما اعتماد خود را به يك شخص يا يك سازمان مشخص كرده باشيد ، كدي كه امضاء آن هويت مورد اعتماد روي آن قرار دارد ،‌ ايمن و مطمئن است . حتي زمانيكه  در حال بارگذاري شدن در شبكه است و ممكن است حتي بدون جلوگيري توسط جعبه شني اجرا شود .

 

 عملكرد سطح بالا :High Performance

جاوا يك زبان تفسير شده است ، بنابر اين هرگز به سرعت زبان كامپايل شده اي مثل C نخواهد بود . گفته ميشود كه جاوا 0-1 به اندازه 20 برابر از C كند تر است . جاوا 1-1 تقريبا سرعتي دو برابر جاوا 1-1 دارد . بنابراين ممكن است عاقلانه باشد اينكه بگوييم كد C كامپايل شده 10 برابر سريع تر از كد هاي تفسير شده ي جاوا اجرا ميشود . اما قبل از اينكه به خاطر اين موضوع مايوس شويد ، آگاه باشيد كه اين سرعت بيشتر از آن چيزي است كه براي برنامه هاي پرسرعت ، كاربردهاي GUI (Graphical User Interface )  ، برنامه هاي برمبناي شبكه ، جايي كه برنامه كاربردي معمولا آماده براي اجرا شدن است ، انتظار براي كاربر كه يك دستوري اعمال كند و يا انتظار براي دريافت از شبكه ، لازم است .

به علاوه قسمت هايي كه به سرعت هاي بالا نياز دارند ، كه كارهايي از قبيل الحاق رشته ها و مقايسه را انجام ميدهند ، با كد محلي جاوا اجرا ميشوند .

علاوه بر اين كارايي ، بسياري از مفسر هاي جاوا اكنون شامل كامپايلر هاي فقط در زمان " just in time " نيز هستند كه ميتواند كدهاي بايتي جاوا را براي هر نوعCPU  در زمان اجرا به كد ماشين ترجمه كند . فرمت كد بايتي جاوا با اين كامپايلر هاي در زمان در مركز كافي و مناسب است و انصافا كدهاي خوبي توليد ميكند . در حقيقت   Sun ادعا ميكند كه كارايي كد هاي بايتي كه به كد ماشين تبديل شده اند ، تقريبا به خوبي كارآيي آن در C  و C++ است .

اگر شما خواهان اين هستيد كه قابل حمل بودن كد ها را قرباني بهبود در سرعت آن كنيد ، ميتوانيد بخش قابل توجهي از برنامه خود را در C و C++ بنويسيد و از روش هاي مخصوص جاوا براي مشترك كردن با اين كد محلي جاوا استفاده كنيد .

 

 

چند نخ كشي شده :Multitbreaded

 

در يك برنامه كاربردي بر مبناي GUI شبكه اي ، مثل مرورگر وب ، تصور اينكه چند چيز بتوانند به طور همزمان اجرا شوند ، آسان است . يك كاربر ميتواند همزمان با اينكه دارد يك صفحه وب را ميخواند به يك كليپ صوتي گوش دهد و همزمان در پس زمينه مرورگر يك عكس را بارگذاري كند .

جاوا يك زبان چندنخ كشي شده است ، كه از چندين رشته اجرايي (گاهي پردازش سبك وزن خوانده ميشود) پشتيباني ميكند و ميتواند چندين كار را انجام دهد . يكي از مزيت هاي چندنخ كشي شده اين است كه عملكرد سطح بالايي براي كاربردهاي گرافيكي براي كاربر فراهم ميكند .

اگر شما سعي كرده ايد كه با نخ ها در C و C++ كار كنيد ، ميدانيد كه كمي مشكل است . جاوا برنامه نويسي با نخ ها را بسيار آسان تر كرده است ، با به وجود آوردن زبان درون ساخته شده اي كه از نخ ها پشتيباني ميكند . بسته jana.lang  يك كلاس بوجود آورده است كه از روش هايي براي شروع و پايان يك نخ ، و مرتب كردن ترتيب گره ها در ميان چيز هاي ديگر ، پشتيباني ميكند .

حتي دستورات زبان جاوا از نخ ها پشتيباني ميكنند ، كه با استفاده از كلمات كليدي مطابق شده . اين كلمات كليدي علامت گذاري بخش هاي كد يا تمامي روش هايي را كه بايد فقط با يك نخ در يك زمان اجرا شوند را به شدت آسان كرده است .

به دليل اينكه جاوا استفاده از نخ ها را بسيار ساده ميكند ، كلاس جاوا در شماري از جاها از اين نخ ها استفاده ميكند . براي مثال هر برنامه كاربردي كه انيميشن اجرا ميكند ، از نخ ها استفاده كرده است .

به طور مشابه جاوا از برنامه هاي نا همگام ، ورودي ها و خروجي هاي بلاك نشده با اخطاري به وسيله سيگنال ها يا وقفه ها پشتيباني نميكند ، در اين صورت شما بايد يك نخ بسازيد كه روي هر كانال ورودي خروجي كه با آن كار ميكنيد بلاك شده باشد .

+ نوشته شده در  یکشنبه دوازدهم آبان 1387ساعت 16:33  توسط محسن  | 

مقدمه اي بر سي شارپ : قسمت بيستم

مقدمه اي بر سي شارپ : قسمت بيستم
 
Delegates

Delegates در سي شارپ روشي مطمئن و typesafe را براي بكار گيري مفهوم function pointer ارائه مي دهند. يكي از ابتدايي ترين استفاده هاي function pointers پياده سازي callback مي باشد. اما در ابتدا لازم است تا با اصول اوليه ي كاري آن آشنا شويم.

مثال يك :
يك delegate چگونه تعريف و استفاده مي شود؟
Delegate يك شيء است كه بيانگر يك تابع مي باشد بنابراين مي تواند بعنوان آرگومان ورودي يك تابع ديگر و يا عضوي از يك كلاس بكار رود.
در زبان "function-pointer" ، Func1() اشاره گري به Func2() را بعنوان پارامتر دريافت كرده و نهايتا آنرا فراخواني مي كند.
در زبان "delegate" ، Func1() يك شيء delegate از Func2() را دريافت كرده و سپس آنرا فراخواني مي كند.
در مثال زير از دو تابع براي شرح اين مطلب سود جسته شده است:
Func1() از delegate استفاده مي كند.
Func2() يك delegate است.

( شماره گذاري خطوط ، در كد زير ، صرفا براي راحت تر شدن توضيحات در مورد آنها است و لزومي به تايپ آنها در برنامه ي اصلي نيست. )

01 using System;
02 delegate void Delg(string sTry);
03 public class Example1{

// function which uses the delegate object
04 private static void Func1(Delg d){
05 d("Passed from Func1");
06 }

// function which is passed as an object
07 private static void Func2(string sToPrint){
08 Console.WriteLine("{0}",sToPrint);
09 }

// Main execution starts here
10 public static void Main(){
11 Delg d = new Delg(Func2);
12 Func1(d);
13 }
14 }

LINE 02
يك شيء delegate را براي Func2 تعريف مي كند.

LINE 04-06
تابعي را تعريف كرده است كه آرگومان ورودي آن از نوع Delg است.

LINE 07-09
تابعي را تعريف مي كند كه بايد به صورت delegate به تابع ديگر فرستاده شود.

LINE 10-14
تابع Main اجراي برنامه را با ايجاد يك شيء delegate براي Func2 آغاز كرده و سپس تابع Func1 را فراخواني مي كند.

مثال 2:
چگونه مي توان از delegates در كارهاي عملي استفاده كرد؟

طرح يك مساله:
شخصي تقاضاي ثبت نام در يك مؤسسه ي آموزشي و همچنين تقاضاي كاريابي در يك شركت را داده است. هر كدام از اين نهادها روشي خاص خود را براي ارزيابي شخص دارند.

راه حل (با روشي شيء گرا):
شخص مشخصاتي همچون سن / جنس / ميزان تحصيلات قبلي / تجربيات كاري و مدارك مرتبط دارد.
مؤسسه ي آموزشي تعدادي از اين مشخصات را براي ارزيابي شخص استفاده مي كند و اين امر در مورد شركت ياد شده نيز صادق است.
شيء شركت و شيء آموزشگاه هر كدام توابع ارزيابي خاص خودشان را پياده سازي مي كنند.
شخص ، اينترفيسي واحدي را در اختيار شركت / آموزشگاه براي ارزيابي خود قرار مي دهد.

پياده سازي (با استفاده از سي شارپ):
ما delegate‌ايي را تعريف مي كنيم كه بيانگر اينترفيسي است كه به شركت و آموزشگاه اجازه ي چك كردن شخص را مي دهد.
سه كلاس school و company و person را تعريف مي نماييم.
كلاس test را براي آزمودن اين موارد ايجاد مي كنيم.

01 using System;
02 using System.Collections;

03 public delegate bool GetChecker(Person p);

// Person has his information with him as he
// applies for School and Company
04 public class Person
05 {
06 public string Name;
07 public int Age;
08 public bool Graduate;
09 public int YearsOfExp;
10 public bool Certified;

11 public Person(string name,
int age,
bool graduate,
int yearsOfExp,
bool certified)
12 {
13 Name=name;
14 Age=age;
15 Graduate=graduate;
16 YearsOfExp=yearsOfExp;
17 Certified=certified;
18 }
19 public bool CheckMe(GetChecker checker)
20 {
21 return(checker(this));
22 }
23 }

// A school, the person applied for higher studies
24 public class School
25 {
26 public static bool SchoolCheck(Person p)
27 {
28 return (p.Age>10 && p.Graduate);
29 }
30 }

// A Company, the person wants to work for
31 public class Company
32 {
33 public static bool CompanyCheck(Person p)
34 {
35 return (p.YearsOfExp>5 && p.Certified);
36 }
37 }

// A Test class, displays delegation in action
38 public class Test
39 {
40 public static void Main()
41 {
42 Person p1 = new Person("Jack",20,true,6,false);
43 Console.WriteLine("{0} School Check : {1}",
p1.Name,
p1.CheckMe(new GetChecker(School.SchoolCheck)));
44 Console.WriteLine("{0} Company Check : {1}",
p1.Name,
p1.CheckMe(new GetChecker(Company.CompanyCheck)));
45 }
46 }

LINE 03
Delegate مورد نياز را تعريف مي كند.

LINE 04-23
كلاس person را تعريف مي كند. اين كلاس تابعي پابليك را ارائه مي دهد كه آرگومان ورودي آن از نوع GetChecker مي باشد.

LINE 24-30
كلاس school را تعريف مي كند و سپس تابعي را كه delegate است ارائه مي دهد.

LINE 31-37
كلاس company را تعريف مي كند و سپس تابعي را كه delegate است ارائه مي دهد.

LINE 38-36
كلاس test را پياده سازي مي نمايد. سپس يك شيء شخص ساخته مي شود. در ادامه new GetChecker(School.SchoolCheck) و new GetChecker(Company.CompanyCheck) شيء ايي را ايجاد مي كند از نوع delegate مورد نياز و آنرا به تابع CheckMe مي فرستد. خروجي نتيجه ي ارزيابي اين شخص مي باشد.

اگر چك كردن اشخاص بيشتري نياز باشد به اين صورت عمل مي شود:

Person p1 = new Person("Jack",20,true,6,false);
Person p2 = new Person("Daniel",25,true,10,true);
GetChecker checker1= new GetChecker(School.SchoolCheck);
GetChecker checker2= new GetChecker(School.CompanyCheck);

Console.WriteLine("{0} School Check : {1}",
p1.Name,p1.CheckMe(checker1));
Console.WriteLine("{0} Company Check : {1}",
p1.Name,p1.CheckMe(checker2));
Console.WriteLine("{0} School Check : {1}",
p2.Name,p2.CheckMe(checker1));
Console.WriteLine("{0} Company Check : {1}",
p2.Name,p2.CheckMe(checker2));

مثال 3 :
Delegates در تعامل بين دات نت فريم ورك و سي شارپ چه نقشي دارد؟

طرح يك مساله:
نمايش دادن ميزان پيشرفت خواندن يك فايل هنگامي كه حجم فايل بسيار زياد است.

راه حل ( با استفاده از سي شارپ):
در مثال زير از كلاس FileReader براي خواندن يك فايل حجيم استفاده شده است. هنگاميكه برنامه مشغول خواندن فايل است 'Still reading.. را نمايش مي دهد و در پايان 'Finished reading..'. را عرضه مي كند.
براي اينكار از فضاي نام System.IO استفاده شده است. اين فضاي نام حاوي delegate ايي مهيا شده براي ما مي باشد. بدين ترتيب مي توانيم به دات نت فريم ورك بگوييم كه ما تابعي را تعريف كرده ايم كه او مي تواند آنرا فراخواني كند.
سؤال: چه نيازي وجود دارد تا دات نت فريم ورك تابع ما را فراخواني و اجرا كند؟ با استفاده از تابع ما كه دات نت فريم آنرا صدا خواهد زد در طول خواندن فايل به ما گفته مي شود كه بله! من هنوز مشغول خواندن هستم! به اين عمليات Callback نيز گفته مي شود. به اينكار پردازش asynchronous نيز مي گويند!

01 using System;
02 using System.IO;

03 public class FileReader{
04 private Stream sInput;
05 private byte[] arrByte;
06 private AsyncCallback callbackOnFinish;

07 public FileReader(){
08 arrByte=new byte[256];
09 callbackOnFinish = new AsyncCallback(this.readFinished);
10 }

11 public void readFinished(IAsyncResult result){

12 if(sInput.EndRead(result)>0){
13 sInput.BeginRead(arrByte,
0,
arrByte.Length,
callbackOnFinish,
null);
14 Console.WriteLine("Still reading..");
15 }
16 else Console.WriteLine("Finished reading..");
17 }

18 public void readFile(){
19 sInput = File.OpenRead(@"C:\big.dat");
20 sInput.BeginRead(arrByte,
0,
arrByte.Length,
callbackOnFinish,
null);
21 for(long i=0;i<=1000000000;i++){
// just to introduce some delay
22 }
23 }

24 public static void Main(){
25 FileReader asynctest=new FileReader();
26 asynctest.readFile();
27 }
28 }

LINE 02
فضاي نام System.IO را به برنامه ملحق مي كند. اين فضاي نام به صورت خودكار حاوي تعريف delegate زير مي باشد:

public delegate void AsyncCallback (IAsyncResult ar);

LINE 03-10
تعريف كلاس

LINE 06
شيء delegate را تعريف مي كند.

LINE 07-10
سازنده ي كلاس را پياده سازي مي كنند. در اينجا ما تصميم گرفته ايم كه بافري حاوي 256 بايت را در هر لحظه بخوانيم.

LINE 09
شيء delegate نمونه سازي شده است.

LINE 18-23
readFile را پياده سازي مي كند.

LINE 12-16
نحوه ي استفاده از شيء IAsyncResult را بيان مي كند.

LINE 12
sInput.EndRead(result) تعداد بايتهاي خوانده شده را بر مي گرداند. اين خواندن تاجايي كه تعداد بايتهاي خوانده شده صفر است ادامه پيدا مي كند و در اينجا 'Finished reading..' اعلام مي گردد.
+ نوشته شده در  جمعه سوم آبان 1387ساعت 8:43  توسط محسن  | 

مقدمه اي بر سي شارپ : قسمت نوزدهم

مقدمه اي بر سي شارپ : قسمت نوزدهم

سربارگذاري عملگر ها (Operator OverLoading)

به تعريف مجدد راه و روش اجراي عملگر ها توسط ما ، سربارگذاري عملگرها گفته مي شود. فرض كنيد مي خواهيد عدد 2 را به يك مقدار datetime اضافه كنيد. خطاي زير حاصل خواهد شد:

CS0019: Operator '+' cannot be applied to operands of type 'System.DateTime' and 'int'


جالب بود اگر مي توانستيم عدد 2 را به datetime اضافه كنيم و نتيجه ي آن تعداد روزهاي مشخص بعلاوه ي دو مي بود. اينگونه توانايي ها را مي توان بوسيله ي operator overloading ايجاد كرد.

تنها عملگر هاي زير را مي توان overload كرد:

Unary Operators
+ - ! ~ ++ -- true false

Binary Operators
+ - * / % & | ^ << >> == != > < >= <=


نحوه ي انجام اينكار نيز در حالت كلي به صورت زير است:

return_datatype operator operator_to_be_overloaded (agruments)
{
}


به مثال زير توجه كنيد:

using System;
class MyDate
{
public DateTime tempDate;
public MyDate(int year,int month,int day)
{
tempDate=new DateTime(year,month,day);
}
public static DateTime operator + (MyDate D,int noOfDays)
{
return D.tempDate.AddDays(noOfDays);
}
public static DateTime operator + (int noOfDays,MyDate D)
{
return D.tempDate.AddDays(noOfDays);
}
}

class Test
{
static void Main()
{
MyDate MD=new MyDate(2001,7,16);
Console.WriteLine(MD + 10 );
}
}

output:
2001-07-26


در مثال فوق عملگر + دوبار overload شده است. يكبار توسط آن مي توان يك عدد صحيح را به يك تاريخ اضافه كرد و بار ديگر يك يك تاريخ را مي توان به عدد صحيح افزود.


موارد زير را هنگام سربارگذاري عملگرها به خاطر داشته باشيد:

1- تنها اپراتورهاي ذكر شده را مي توان overload كرد. اپراتورهايي مانند new,typeof, sizeof و غيره را نمي توان سربارگذاري نمود.
2- خروجي متدهاي بكار گرفته شده در سربارگذاري عملگر ها نمي تواند void باشد.
3- حداقل يكي از آرگومانهاي بكار گرفته شده در متدي كه براي overloading عملگرها بكار مي رود بايد از نوع كلاس حاوي متد باشد.
4- متدهاي مربوطه بايد به صورت public و static تعريف شوند.
5- هنگامي كه اپراتور < را سربارگذاري مي كنيد بايد جفت متناظر آن يعني > را هم سربارگذاري نماييد.
6- هنگاميكه براي مثال + را overload مي كنيد خودبخود =+ نيز overload شده است و نيازي به كدنويسي براي آن نيست.


يكي از موارد جالب بكار گيري سربارگذاري عملگرها در برنامه نويسي سه بعدي و ساختن كلاسي براي انجام عمليات ماتريسي و برداري مي باشد

+ نوشته شده در  جمعه سوم آبان 1387ساعت 8:42  توسط محسن  | 

مطالب قدیمی‌تر