ParsX.com
پذیرش پروژه از دانشجویی ... تا سازمانی 09376225339
 
   ProfileProfile   Log in to check your private messagesLog in to check your private messages  |  FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups Log inLog in   RegisterRegister 

آرايه ها Arrays

 
Post new topic   Reply to topic    ParsX.com Forum Index -> C/C++ Programming
View previous topic :: View next topic  
Author Message
vahid
بي تو هرگز


Joined: 26 Nov 2004
Posts: 3067
Location: Tehran

PostPosted: Tue Dec 28, 2004 3:30 pm    Post subject: آرايه ها Arrays Reply with quote

آرايه
آرايه يك ساختمان داده است كه نامي براي چند متغير هم نوع است . آرايه داراي اعضايي است كه هر كدام از اين اعضا در خانه هاي حافظه مجاور يكديگر هستند . مسبب تشخيص اعضاي ارايه از يكديگر انديس انهاست .
انديس : انديس آرايه مقدار يا عبارتي است كه بعد از نام آرايه در كروشه باز و بسته قرار ميگيرد و مشخص ميكند به كدام عضو آرايه ميتوانيم دسترسي پيدا كنيم .
عددي كه در انديس آرايه قرار ميگيرد هنگام تعريف آرايه بايد از نوع صحيح باشد وگرنه خطاي كامپايلري زمان اجرا رخ ميدهد .
نكته حائز اهميت در استفاده از آرايه ها در زبان C انستكه هنگامي كه نام آرايه را تعريف ميكنيم و در واقع اين مجموعه متغير را به كامپايلر معرفي ميكنيم . بايد تعداد خانه هاي انرا نيز مشخص كنيم . تا مقدار لازمه براي ان مقدار از حافظه اشغال شود .
مثلا معرفي ارايه روبرو
int parsx[8];

دستور فوق به كامپايلر فرمان ميدهد 8 خانه از حافظه را از نوع int به ارايه اي بنام parsx تخصيص دهد .
براي دسترسي به تك تك عضوهاي ارايه بايد نام آرايه را بهمراه انديس ان بنويسيم .
[0]parsx خوانده ميشود ( parsx صفر يا parsx انديس صفر ) براي دسترسي به اولين عنصر يا عضو صفرام آرايه x بكار ميرود .
[1]parsx نام عنصر دوم ارايه است .
[7]parsx نام اخرين عنصر آرايه اي است كه در بالا تعريف كرده ايم .
نكته : انديس آرايه هميشه بين صفر است تا يك واحد كمتر از اندازه آرايه .
_____________________________
12|32|-12|-78|889|889|34|342

عنصر اول آرايه فوق كه براي كامپايلر c عنصر صفرام است مقدار 12 را دارد و عنصر هفتم يا اخرين عنصر ارايه فوق مقدار 342 را دارد .
نام گذاري آرايه ها از قانون نام گذاري متغيرها تبعيت ميكند . چون عناصر ارايه را با انديس انها ميشناسيم به ارايه متغير انديس دار نيز ميگوييم .
<نوع آرايه  >  < نام آرايه  > < طول آرايه >

هرگاه انديسي در آرايه باشد كه بيشتر از مقدار طول ارايه است خطايي رخ نميدهد اما به هر حال برنامه با مشكل واجه خواهد شد . در كامپايلر c خصلت bounds checking پاسكال وجود ندارد . كه البته در پاسكال نيز ميتوان اين خصلت را از بين برد .
در آرايه نيز ميتوان مانند ديگر متغيرها در زبان c به ان مقدار اوليه داد براي اينكار بايد به اينصورت عمل كنيم كه :
مقادير مورد نظر از نوع آرايه را داخل اكولاد ميگذاريم و با كاما انها را از يكديگر جدا ميكنيم . نكته اي كه در اين قسمت وجود دارد انستكه در صورتيكه به آرايه مقدار اوليه ميدهيد و نميخواهيد مقدار بيشتري به ان بدهيد ديگر لزومي ندارد كه انديس آرايه را بنويسيد :
int pars[3]={1,22,3}
int pars[]={1,22,3}

هر دوي موارد فوق صحيح است اگر اندازه ارايه را توسط انديس معين كنيد اما مقاديرتان كمتر از مقدار مورد نظر باشد مقدار صفر در باقي عناصر قرار ميگيرد . در ضمن اگر عناصر شما در اكولاد بيشتر از اندازه ارايه باشد خطاي كامپايلري رخ ميدهد .
آرايه داراي يك انديس را ارايه يك بعدي و آرايه داراي n انديس را ارايه چند بعدي ميگويند .
ارايه [3][3]op يك آرايه دو بعدي است .
نام آرايه بصورت يك اشاره گر است به اولين عنصر آرايه .
بنابراين دو دستور زير دقيقا مانند هم هستند يعني [0]arraye برابر است با arraye* انكه نام ارايه را بهمراه عملوند * مي اوريم روش ادرس دهي قديمي است .
[1]arraye برابر است با (arraye+1)* بنابراينarra
arraye[I] برابر است با  (arraye+I)*

بنابراين [3]arr& برابر است با arr+3
در هنگام رسيدن به عضوي از ارايه ميتوان داخل كروشه به جان انديس عبارت محاسباتي قرار داد اما يادتان باشد كه اين مقدار براي صحت خروجي بايد در بازه 0 تا n-1 باشد كه n اندازه آرايه است .
انديس آرايه ميتواند علاوه بر مقادير صحيح مقادير اعشاري باشد كه در نتيجه مقدار اعشار را ناديده ميگيرد . و يا مقدار كاراكتري باشد كه در نتيجه كد اسكي ان را مد نظر قرار ميدهد .
int list[‘A’] == int list[65]
list[‘A’]=4 == list[65]==4

براي بدست آوردن تعداد عناصر يك آرايه n بعدي ميتوانيد اندازه هر بعد را در يكديگر ضرب كنيد مثلا ارايه [parsx[3][4][4 داراي 3*4*4 عضو است . براي بدست آوردن فضاي اشغال شده توسط آرايه كافيست تعداد خانه هاي عناصر آرايه را در اندازه هر خانه (نوع آرايه ) ضرب كنيد .
اما كاربرد آرايه ها در توابع
همانطور كه قبلا نيز گفتيم نام آرايه اشاره گري است به اولين عنصر آرايه و چون اشاره گر است هر گاه ارايه اي در تابعي وارد شود بصورت يك اشاره گر وارد ميشود بنابراين هم بعنوان خروجي و هم بعنوان ورودي عمل ميكند و در واقع call by reference است . هنگام فراخواني تابع چون بايد ادرس ارايه را بدهيم تنها نام آرايه را بدون هيچ چيز اضافه اي مينويسيم مثلا computer(parsx) حال براي تعريف اين تابع بايد نام ارايه را بهمراه كروشه بنويسيم مثلا
  int computer(int parsx[])
كه اين دقيقا مانند اين عبارت است و هيچ فرقي با يكديگر ندارند
int computer(int *parsx)

در ضمن يادتان باشد كه نام آرگومانها و پارامترها ميتوانند همنام باشند يا نباشند و فرقي در نتيجه نخواهد داشت چرا كه دقيقا مانند تعريف متغير در توابع است .
براي كاراكتر دادن به مقادري يك ارايه به مثال زير توجه كنيد :
char parsx[]={‘P’,’a’,’r’,’s’,’X’};
Back to top
arash
مدير بخش سي
مدير بخش سي


Joined: 27 Nov 2004
Posts: 1232
Location: www.parsx.com

PostPosted: Fri Jan 07, 2005 8:26 pm    Post subject: Reply with quote

آرایه لیستی از آلمانی های هم نوع :
نکته Exclamation :
اندیس آرایه در زبان C با صفر شروع می شود .
نکته Exclamation :
در زبان C نام آرایه اشاره گریست که به خانه صفرام ( اولین آلمان آرایه ) اشاره می کند .
List[0]==*List

نکتهExclamation:
دسترسی به آدرس ومحتوای خانه های آرایه :

الف ) برای دسترسی به محتوای خانه های آرایه ها دو راه داریم اول روش بدین شکل است :
 نام تابع  [عدد آرایه];

و راه دیگر بدین شکل است :
*(نام تابع  + i)

که در رابطه i عدد آرایه می باشد .

ب) دسترسی به خانه آدرس هر آرایه :
برای دست یابی به آدرس خانه های آرایه ها دو روش داریم . یکی اینکه به شکل زیر عمل کنیم :

&List[0] , &list[1] , &List[2] , … , &List[i]


روش دوم فقط نام تابع را می نویسیم :

List        ,  List+1   , List+2    , … , List+i

نکتهExclamation:
آدرس هر خانه از آرایه ها به صورت زیر است .
آدرس آفست + آدرس پایه
که در آن آدرس آفست برابر اندیس آن خانه ضرب در سایز نوع یک آلمان آرایه است .

مثال : برنامه ای بنویسید که 10 عدد صحیح از ورودی دریافت نموده و ماکزیمم و مینیمم و معدل آنها را بدست آورد ؟

#include<stdio.h>
#include<conio.h>
int List[10];
main(){
int i,max,min;
float ave=0;
clrscr();
printf("\n\n\t Enter 10 value : ");
for(i=0;i<10;++i)
scanf("%d" , List + i );//scanf("%d" , &List[i] );
min=List[0];//min=*List;
for(i=1;i<10;i++)
if(*(List+i)<min)min=*(List+i);
max=*list;
for(i=1;i<10;i++)
if(List[i]>max)max=List[i];
for(i=0;i<10;i++)
ave+=*(List+i);
ave/=10;
printf("\n min=%d , max=%d , average=%f ",min,max,ave);
getch();
return 0;
}

نکته Exclamation:
عملگر جمع و تفریق برای اشاره گرها در زبان C با روش متفاوتی به صورت زیر اعمال می گردد .
اگر اشاره گر Ptr به شکل eletype«Prt تعریف شده باشد در اینصورت عملگر جمع در عبارت Prt+k به صورت زیر عمل می کند .
الف )در ( sizeof(eletypeضرب می شود .
ب )حاصل فوق با آدرس پایه Prt جمع می شود .
طرز استقرار آلمانهای یک آرایه چند بعدی در خانه های حافظه :
طرز تعریف آرایه چند بعدی

Eletype List[m][n];

و طرز بازیابی آن به شکل زیر است :

 نوع آلمانها  نام ارایه   [1 بعد] [2 بعد ] [3بعد] … ;

برای مثال :
 int List[3][5]
&List[0][0]   ,    &List[0][1]   ,  …  ,  &List[0][j]  ,  …  ,   &List[0][5]
list                ,         List+j

&List[1][0]  ,  … ,   List[i][j]
List+1*5+0   ,    ,     List+i*5+j

اگر آرایه List به شکل [int List[3][5 تعریف شده باشد آدرس سطر i و آدرس ستون j به صورت زیر بدست می آید List+i*n+j که در اینجا n از روی [List[m][n تعیین می شود .

تمرین : اگر آرایه K بعدی List به شکل زیر تعریف شده باشد آدرس هر آلمان از این آرایه را تعیین کنید ؟
eletype List[n1][n2][n3]  …  [nk];
&List [i1][i2] … [ik] = ?
List +i1*n2*n3* … *nk
         +i2*n3*n4* … *nk
         +i3*n4*n5* … *nk
         .
         .
         .
         .
         +ik-1*nk
         +ik

Back to top
Display posts from previous:   
Post new topic   Reply to topic    ParsX.com Forum Index -> C/C++ Programming All times are GMT + 3.5 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum