برنامه نویسی جاوا – قسمت ششم

پنج شنبه, ۲۶ام آذر , ۱۳۸۸ | ۴ دیدگاه

آرایه ها : هر آرایهarray گروهی از متغیر های هم نوع است که ارجاع به آنها از طریق یک نام مشترک صورت می گیرد.در جاوا آرایه هایی از انواع مختلف را به صورت تک یا چند بعدی می توان ایجاد کرد.هریک از عناصر آرایه از طریق ایندکس خودشان قابل دسترسی هستند.آرایه ها روش بسیار مفیدی برای گروه بندی اطلاعات مرتبط به هم هستند.

نکته: عملکرد آرایه ها در جاوا با عملکردشان در زبانهای دیگر مانندC/C++ کاملا متفاوت است.

آرایه های تک بعدی

هر آرایه تک بعدیone-dimensional فهرستی از متغیر های هم نوع است. برای ایجاد یک آرایه باید یک متغیر آرایه ای از نوع مورد نظر ایجاد کنید.فرم کلی به این صورت است:

Type  var-name[ ];

Type در اینجا نوع آرایه است.نوع آرایه؛ نوع داده یکایک عناصر تشکیل دهنده آرایه را مشخص می کند.از این رو نوع آرایه مشخص می کند که چه نوع داده هایی در آرایه ذخیره خواهد شد.

Int  month_day[ ];

تعریف بالا گرچه موجب تثبیت متغیر آرایه ایmonth_day می شود اما در واقع هنوز هیچ آرایه ای وجود ندارد و در حقیقت این آرایه که با null مقداردهی می شود نمایانگر یک آرایه بدون مقدار است.برای اینکه این آرایه را با آرایه ای فیزیکی از مقادیر صحیح مرتبط سازید؛لازم است آرایه را با استفاده ازnew ایجاد و آنرا به month_dayتخصیص دهید.newعملگر ویژه ای برای تخصیص حافظه است.(درC++ هم newداریم که دقیقا این کارو انجام میده)

فرم کلی newبرای آرایه های تک بعدی به این صورت است:

Array-var=new type[size];

Typeمشخص کننده نوع داده ها؛sizeمشخص کننده تعداد عناصر آرایه وarray-varمتغیر آرایه ای است که با آن مرتبط می شود. یعنی برای اینکه از new برای تخصیص آرایه استفاده کنید؛باید نوع و تعداد عناصری که باید تخصیص داده شوند را مشخص نمایید. عناصری که به وسیلهnew به آرایه تخصیص می یابند به طور خودکار با صفر مقداردهی می شوند:

Month_day=new int[12];

Month_day به آرایه ای از۱۲ عدد صحیح اشاره خواهد داشت به علاوه تمام عناعر آرایه با صفر مقداردهی خواهند شد.

نکته:دوستان عزیز توجه کنید آرایه ها جز مواردی هستند که برای فهم بیشتر بهتره شکل فرضی اونا رو رسم کنید؛باز هم از این موارد در برنامه سازی داریم.نگران نباشید که کسی شما رو مورد تمسخر قرار بده؛قراره یاد بگیریم و بهترین شیوه یادگیری آرایه ها کشیدن شکل اوناست.مثلtrace کردنstackها.

حالا یه دور مطالبی که گفتیم رو مرور می کنیم: ایجاد هر آرایه نوعی فرآیند دو مرحله ای است.نخست اینکه باید متغیری از آرایه مورد نظرتعریف کنیم و دوم اینکه باید حافظه محل آرایه را با استفاده از new تخصیص دهید و آنرا به متغیر آرایه نسبت دهیم. از این رو تمام آرایه ها در جاوا به صورت پویا تخصیص می یابند(اگه در مورد تخصیص حافظه پویا چیزی نمی دونید نگران نباشید؛در آینده در موردش صحبت می کنیم اما اگه دوست دارید مطالعه داشته باشید باید بگم تخصیص حافظه پویا در جاوا نسبتا مشابه این مبحث درC++ است).

Month_day[1]=28;

سطر زیر سبب نمایش مقدار ذخیره شده در ایندکس شماره ۳(عنصر چهارم)می شود.

System.out.println(month_day[3]);

و این هم کل برنامه؛آرایه ای متشکل از تعداد روزهای هر ماه:

//demonstrate a one-dimensional array.
Class Array{
Public static void main(string args[]){
Int month_day[];
Month_day=new int[12];
Month_day[0]=31;
Month_day[1]=28;
Month_day[2]=31;
Month_day[3]=30;
Month_day[4]=31;
Month_day[5]=30;
Month_day[6]=31;
Month_day[7]=31;
Month_day[8]=30;
Month_day[9]=31;
Month_day[10]=30;
Month_day[11]=31;
System.out.println(“April has”+month_day[3]+”days.”);
}
}

وقتی این برنامه را اجرا می کنید تعداد روزهای ماه آوریل را نمایش می دهد.ایندکس آرایه های جاوا از صفر آغاز می شود بنابراین تعداد روزهای ماه آوریلmonth_day[3] یا ۳۰ است.

Int month_day[ ]=new int [12];

روش بالا روشی است که عموما در برنامه های حرفه ای جاوا خواهید دید.

آرایه ها را می توان هنگام تعریف کردن؛مقداردهی کرد.فرآیند انجام این کار شباهت زیادی به روند انجام آن برای انواع داده های پایه و ساده دارد.برای این کار؛مقادیر  بین دو آکولادbrace نوشته شده و با کاما از یکدیگر جدا می شوند. کاما ها مقادیر عناصر آرایه را از یکدیگر جدا می کنند. آرایه به طور خودکار به گونه ای ایجاد می شود تا فضای کافی برای عناصری  که برای مقداردهی اولیه مشخص می کنید؛وجود داشته باشد.نیازی به استفاده ازnew نیست. به عنوان مثال برای آنکه تعداد روزها را برای هر ماه مشخص کنید ؛مثال زیر آرایه ای از نوع اعداد صحیح ایجاد و با تعداد روزها مقداردهی می کند:

//an improved version of the previous program.
Class AutoArray{
Public static void main(string args[]){
Int month_day[ ]= {31,28,31,30,31,30,31,31,30,31,30,31};
System.out.println(“April has”+month_day[3]+”days.”);
}
}

جاوا به شدت کنترل می کند که تصادفا اقدام به ذخیره مقادیر در خارج از محدوده آرایه نکنید و یا به آنها ارجاع نداشته باشید. سیستم زمان اجرای جاوا کنترل می کند تا اطمینان حاصل شود که تمام ایندکس های آرایه در محدوده آن قرار دارند. مثلا سیستم زمان اجرای جاوا مقدار هر یک  از ایندکس هایmonth_day را کنترل می کند تا اطمینان یابد که تمام آنها در بازه بسته صفر و ۱۱ قرار دارند. اگر بخواهید به عناصر خارج  از محدوده آرایه دستیابی داشته باشید(اعداد منفی یا اعداد بزرگتر از طول آرایه) ؛ با خطای زمان اجرا مواجه خواهید شد.

این برنامه میانگین مجموعه ای از اعداد را محاسبه می کند:

//average an array of value
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);
}
}

آرایه های چند بعدی

آرایه های چند بعدی multidimensional  در جاوا آرایه ای از آرایه ها است.این آرایه ها همچون آرایه های چند بعدی معمولی به

نظر می رسند اما همانگونه که در ادامه می بینید؛چند تفاوت جزیی خواهند داشت.برای آنکه متغیر آرایه چند بعدی را تعریف کنیم ؛ هر یک از ایندکس ها را بین دو کروشه می نویسیم:

Int twoD[ ]  [ ]=new  int[4]  [۵];

یک آرایه دو بعدی به نام two .ماتریس ۵*۴ بالا به ضورت آرایه ای از آرایه های نوع int پیاده سازی می شود.

یک آرایه دو بعدی به نام two .ماتریس ۵*۴ بالا به ضورت آرایه ای از آرایه های نوع int پیاده سازی می شود.

نمایی از یک آرایه دوبعدی۵*۴- ایندکس های سمت راست مشخص کننده ستون و ایندکس های سمت چپ مشخص کننده سطر هستند.

برنامه زیر هر یک از عناصر این آرایه را ازچپ به راست و از بالا به پایین شماره گذاری نمدره و سپس مقادیر آن را نمایش می دهد:

//demonstrate a two-dimensional array.
Class TwoDArray{
Public static void main(string args[]){
Int towD [ ] [ ] =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();
}
}
}

Out put:

۰  ۱  ۲  ۳  ۴

۵  ۶  ۷  ۸  ۹

۱۰  ۱۱  ۱۲  ۱۳  ۱۴

۱۵  ۱۶  ۱۷  ۱۸  ۱۹

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

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

در برنامه زیر یک ارایه دو بعدی ایجاد می کنیم که در آن اندازه های بعد دوم مساوی نیستند:

//manually allocate differing size second dimension.
Class TwoDgain{
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
twoD[i][j]=k;
k++;
}
For (i=0 ; i<4 ; i++){
For(j=0 ;j
System.out.print(twoD[i] [j] +” “);
System.out.println( );
}
}
}

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

مقدار دهی اولیه آرایه های چند بعدی هم میسر است. برای انجام این کار کافی است مقادیر اولیه هر یک از ابعاد را بین دو آکولاد بنویسید.

برنامه زیر ماتریسی را ایجاد می کند که مقدار هر عنصر؛ حاصل ضرب ایندکس های سطر و ستون است. توجه کنید که علاوه بر مقادیر لیترال؛ از جملات جبری هم برای مقداردهی می توان استفاده کرد:

//initialize a two-dimensionL array.
Class Natrix{
Public static void main(string args[ ] ){
Double m [ ] [ ] = {
{۰*۰,۱*۰,۲*۰,۳*۰},
{۰*۱,۱*۱,۲*۱,۳*۱},
{۰*۲,۱*۲,۲*۲,۳*۲},
{۰*۳,۱*۳,۲*۳,۳*۳}
};
Int I,j;
For(i=0 ; i<4 ;i++){
For(j=0 ;j<4 ; j++)
System.out.print(m [ i] [j] +” “);
Sytem.out.println();
}
}
}

برنامه را اجرا کنید و خروجی را مشاهده کنید.

روش دیگری برای تعریف کردن آرایه ها

Type [ ]  var-name;

در این روش؛کروشه ها پس از مشخصه نوع آرایه قرار می گیرند و نه نام متغیر آرایه.

تعاریف زیر معادل هستند:

Char  twod1 [ ] [ ] =new char[3] [4];

Char [ ] [ ] twod2=new char [3] [4];

این روش برای مواقعی مفید است که همزمان چندین آرایه همنوع تعریف می شوند.به عنوان مثال:

Int [ ] nums,nums2,nums3 ;   //creat three arrays

عبارت بالا سه متغیر آرایه ای از نوع int تعریف میکند.نتیجه مثال بالا همچون عبارت زیر است:

Int name [ ] ,name2[ ],name3[ ] ;    //creat three arrays

این روش همچنان برای مشخص کردن یک آرایه به عنوان مقدار حاصل از یک متد مفید است.

چند نکته در مورد رشته ها

همانطور که متوجه شدید در مباحث مربوط به انواع داده ها و آرایه ها هیچ اشاره ای به رشته ها  یا داده های نوع string نداشتیم. دلیل این امر آن است که جاوا از چنین نوعی پشتیبانی نمی کند-البته نه به شکل معمول.

داده های رشته ای جاوا که string نامیده می شوند؛ یکی از انواع داده های پایه و ساده به شمار نمی آیند و آرایه ای از کاراکتر ها( مانند C++ ) هم نیستند بلکه در عوض شی ء می باشند و ارائه شرح کاملی از این نوع داده ها؛ مستلزم آشنایی با برخی از ویژگی های اشیا است که در آینده در مورد آنها بحث خواهیم کرد.

با این وجود؛ برای آنکه بتوانید در برنامه های نمونه از رشته های ساده استفاده کنید شرح خلاصه ای را ارائه کرده ایم:

از string برای تعریف کردن متغیر های رشته ای استفاده می شود. همچنین می توانید آرایه های رشته ای تعریف کنید. ثابتهای رشته ای که بین دو علامت نقل قول colon  نوشته می شوند را می توان به متغیر های نوع string تخصیص داد. متغیر های نوع string را می توان به سایر متغیر های نوعstring تخصیص داد. شی ء های نوع string  را هم می توان به عنوان آرگومان در println() به کار برد.

نکاتی در مورد اشاره گر ها برای برنامه سازان C/C++

اگر از برنامه سازانC/C++ هستید می دانید که این زبان از اشاره گرهاpointer پشتیبانی می کند اما در این فصل ما هیچ اشاره ای به آنها نداشتیم.دلیلش این است که جاوا از اشاره گرها پشتیبانی نمی کند و استفاده از آنها مجاز نیست(به عبارت درست تر جاوا از اشاره گرهایی که توسط برنامه سازان قابل دستیابی یا تغییر باشند ؛ پشتیبانی نمی کند).

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

خوب این هم از unit6 . امیدوارم لذت برده باشید و سودمند واقع شده باشه

باز هم مثل همیشه از طریق آدرس e-mail برای پرسش های شما؛ در خدمتتون هستم

schoneDame2294@yshoo.com

شاد و موفق باشید

مینا هوشمند

Be Sociable, Share!


۴ دیدگاه


  1. علي
    ۲۳ تیر ۱۳۸۹

    با عرض سلام و خسته نباشید خدمت شما .یه سؤال داشتم که میخواستم جوابش رو برام بفرستید؟
    برنامه ای بنویسید که نمرات دانشجویان یک کلاس را گرفته و سپس در یک ماتریس قرار دهد و بالاترین نمره ی هر دانشجو را بدست آورد ؟

    با تشکر دانشجوی آی تی




  2. golnaz
    ۱۱ آبان ۱۳۸۹

    با سلام!
    دو تا برنامه هست که اگر پاسخ اش را برام بفرستید ممنون میشم:
    ۱-با استفاده از توابع و اشاره گرها برنامه ای بنویسید که ۲ عدد را از ورودی گرفته و جای آن دو را با هم عوض کند.
    ۲-برنامه پیدا کردن بزرگترین . ک.چکترین عنصر در یک آرایه با استفاده از اشاره گرها.
    با تشکر




  3. Mohammad
    ۲۳ شهریور ۱۳۹۰

    سلام می خواستم اگه می تونید درباره ی کار با رشته ها در جاوا صحبت کنید

    متشکرم




  4. جواد
    ۱۹ آبان ۱۳۹۰

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



دیدگاه خود را بنویسید