تماس درباره   صفحه اصلی
  زبان ++C > آرايه ها و رشته ها  
 
 

آرايه ها و رشته ها


آرایه
مقداردهی اوليه آرايه
بيشترين اندازه آرايه
آرایه های کاراکتری (رشته)
نوع داده string
توابع رشته ای


در بعضی حالات داده های مرتبطی دارید که بطور منطقی تحت یک نام می توانند گروه بندی شوند. مثلا اگر بخواهید حرارت 20 روز متوالی را ذخیره کنید کلیه مقادیر منطقا با نام tempreture با‍يد اسمگذاری شوند. برای ذخیره چند مقدار با يک نام آرایه روش مناسبی است.


آرایه

يک آرايه (array) مجموعه ای از محل های پشت سرهم حافظه است که همگی دارای يک نام می باشند . یک آرایه نوعی متغیر است که بجای ذخیره یک مقدار یکسری از مقادیر هم نوع را ذخیره می کند. هر محل ذخيره سازی در آرا‍يه را يک عنصر آرايه می نامند.

شکل کلی تعريف آرايه به صورت زير است:

DataType array_name[size];

Size تعداد عناصر آرایه است که در کروشه ذکر می شود. DataType نوع عناصر آرايه است که از هر نوع داده ای می تواند باشد.

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

اسم آرايه اشاره گری به اولين عنصر آن است. به عناصر می توان به طور منفرد با اضافه کردن اندیس به اسم آرايه مراجعه کرد. انديس (index) باعث متمايز شدن عناصر آرايه از يکديگر می شود و تعيين می کند عنصر آرايه چندمين محل ذخيره سازی در آرايه است. در ++C انديس آرایه يک عدد صحيح است که از صفر شروع می شود.


مثال. آرايه A که به صورت زير تعريف شده است يک آرايه يک بعدی با 5 عنصر از نوع صحيح است. عناصر آن شامل A[3] , A[2] , A[1] , A[0] و A[4] است.

int A[5];


هنگام دسترسی به عناصر آرايه بعد از اسم آرايه بايد درون کروشه شماره انديس عنصر مورد نظر ذکر شود. عناصر آرايه را می توان توسط دستور انتساب مقداردهی کرد يا مقدار آن را از ورودی درياقت کرد.

A[0] = 10;

cout << "Enter a number:";
cin >> A[1];

با توجه به اينکه تعداد عناصر آرايه معين است برای کارکردن روی کليه عناصر آرايه حلقه های for روش مناسبی هستند.


مثال. در برنامه زير کليه عناصر يک آرايه از ورودی دريافت و سپس نمايش داده می شود.

#include <iostream.h>
int main() {
   int A[10];
   for (int k = 0; k < 10; k++) {
      cout << "Enter an integer: ";
      cin >> A[k];
      }
   for (int k = 0; k < 10; k++)
      cout << A[k] << endl;
   return 0;
}


بخاطر داشته باشيد انديس عناصر آرايه با n عنصر از 0 تا n-1 است. اگر به عنصری خارج از اين محدوده دسترسی پیدا کنید کامپایلر خطائی نمی گيرد ولی این می تواند به مشکلات جدی منجر بشود چون ممکن است روی داده برنامه های دیگر درون حافظه تاثير بگذارد.

اگر اندیس آرایه اعشاری باشد کامپايلر آن را به يک عدد صحيح گرد می کند.


مثال. در برنامه زير سعی شده به عنصری خارج از اندازه آرايه دسترسی شود. دستور myarray[10] باعث می شود مقدار 99 در محلی ذخيره شود که 6 خانه بعد از آرایه myarray است این حافظه ممکن است شامل داده لازم برای برنامه دیگر باشد.

#include <iostream.h>
int main() {
   int myarray[5];
   myarray[10] = 99;
   cout << myarray[10] << endl;
   return 0;
}


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

آرايه يک بعدی (1-dimensional array) برای نگهداری ليستی از مقادير استفاده می شود. هر عنصر آرايه يک بعدی از طريق يک انديس مشخص می شود.


مثال. آرايه زير 20 مکان پشت سرهم حافظه را برای مقادير ممیز شناور اختصاص می دهد. اولین مکان با tempreture[0] بعدی با tempreture[1] و.... . آخرین عنصر tempreture[19] است.

float tempreture[20];


برنامه ای برای ذخيره 10 نمره و محاسبه ميانگين نمرات

برنامه آرايه ای از ساختمان


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

می توان بعدهای بیشتری به آرایه داد. در يک آرايه چند بعدی (multidimensional) به بيش از يک عدد برای دسترسی به هر عنصر آرايه نياز است. يک آرايه دو بعدی به 2 انديس و يک آرايه سه بعدی به 3 انديس نياز دارد. محدوديتی برای تعداد ابعاد آرايه در ++C وجود ندارد اما بندرت آرایه بیشتر از دو يا سه بعد دیده شده است.


مثال. آرايه زير دارای دو بعد است که اندازه هر بعد آن 4 است. بنابراين آرايه 16=4×4 عدد صحيح را نگه می دارد. به هر عدد از طریق دو اندیس دسترسی می شود. مثلا عنصر اول myarray[0][0] است.

int myarray[4][4];

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

0,00,10,20,3
1,01,11,21,3
2,02,12,22,3
3,03,13,23,3

عناصر آرايه صرفنظر از تعداد بعدهای آن سطر به سطر در خانه های پشت سرهم حافظه ذخيره می شوند. برای مطالعه بيشتر درباره روش سطری می توان‍يد به بخش نمايش آرايه در درس ساختمان داده مراجعه نماييد.


برنامه پر کردن يک آرايه سه بعدی با اعداد تصادفی


مقداردهی اوليه آرايه

مانند يک متغير هنگام اعلان يک آرايه مقدار عناصر آنرا می توان تعيين کرد. آرایه های سراسری به طور پيش فرض توسط صفر مقداردهی می شوند. اما وقتی یک آرایه به صورت محلی تعریف می شود محتوایش نامعین است. بنابراين بهتر است آنرا مقداردهی اوليه کرد.

برای انجام اين کار در خط اعلان به دنبال اسم آرايه ليست مقادير عناصر آن به ترتيب درون يک آکولاد نوشته می شود.


مثال. دستور زير مقدار 100 را به array[0] و 200 را به array[1]و 300 را به array[2] و 400 را به array[3] اختصاص می دهد.

int array[4] = { 100, 200, 300, 400 };


اگر اندازه آرايه ذکر نشود کامپايلر اندازه کافی را برای ذخيره ليست مقادير ذکر شده درنظر می گيرد.


مثال. عبارت زير مشابه مثال قبل عمل می کند. اندازه آرايه توسط کامپايلر 4 درنظرگرفته می شود.

int array[] = { 100, 200, 300, 400 };


اگر تعداد مقادير درون آکولاد کمتر از تعداد عناصر آرايه باشد، بقيه عناصر بطورخودکار صفر درنظر گرفته می شوند. اگر مقادير بيشتر از اندازه آرايه باشد کامپايلر خطا می گيرد.


مثال. عناصر array[3] تا array[9] با صفر مقداردهی می شوند.

int array[10] = { 1, 2, 3 };


در آرايه های چندبعدی ليست مقادير به ترتيب سطری در عناصر قرار می گيرند.


مثال. در آرايه دو بعدی زير

int array[4][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

مقادير به صورت زير ذخيره می شوند:
array[0][0] برابر با 1
array[0][1] برابر با 2
array[0][2] برابر با 3
array[1][0] برابر با 4
array[1][1] برابر با 5
array[1][2] برابر با 6
...
array[3][1] برابر با 11
array[3][2] برابر با 12

برای خوانائی بيشتر مقادير هر سطر را می توان درون يک جفت آکولاد دسته بندی کرد.


مثال. نتيجه دستورزير مشابه مثال قبل است.

int array[4][3] = { { 1, 2, 3 } , { 4, 5, 6 } , { 7, 8, 9 } , { 10, 11, 12 } };


بيشترين اندازه آرايه

به دليل مدلی که حافظه کار می کند متغيری با بيشتر از 64KB فضای اشغالی نمی توان داشت. اگر هيچ متغير ديگری در برنامه وجود نداشته باشد يک آرايه يک بعدی حداکثر می تواند 64KB فضا اشغال کند. البته بعضی از سيستم عامل ها اين محدوديت را ندارند.

فضای مورد نياز برای ذخيره آرايه به تعداد کل عناصر و تعداد بايت های هر عنصر بستگی دارد. برای محاسبه فضای يک آرايه تعداد عناصر آن در تعداد بايت های نوع داده عناصر ضرب می شود.


مثال. ميزان فضائی که يک آرايه با 500 عنصر از نوع float اشغال می کند برابر با 500×4=2000 بايت است.


فضای يک آرايه را توسط عماگر ()sizeof هم می توان بدست آورد.


نکته. ارسال آرایه به توابع همیشه به صورت مرجع است.


آرایه های کاراکتری (رشته)

يکی از کاربرد های گسترده آرایه به صورت آرایه کاراکتری است. یک آرایه کاراکتری را به عنوان رشته ای از کاراکترها می توان در نظر گرفت. رشته (string)‌ به مجموعه ای از کاراکترها گفته می شود که برای ذخیره متن استفاده می شود.


مثال. دستور زير آرايه کاراکتری با اندازه 10 ايجاد می کند. اين آرايه می تواند رشته ای با حداکثر طول 9 را ذخيره کند.

char UserName[10];


C++ انتهای ‍يک رشته را با کاراکتر null می شناسد. کاراکتر null کاراکتر با کد اسکی صفر است که به صورت '\0' نوشته می شود. بنابراين يک محل از آرايه کاراکتری برای ذخيره کاراکتر null بايد کنار گذاشته شود.

مثال. برای ذخيره يک رشته 10 کاراکتری نياز به آرايه کاراکتری با اندازه 11 کاراکتر است.

چون رشته در آرايه به صورت کاراکتری ذخيره می شود که به null ختم می شود تمام چيزی که برای تعريف يک رشته نياز است اشاره گری به ابتدای آن است. همانطور که گفته شد اسم آرايه اشاره گری به اولين عنصر آن است. بنابراين تنها به اسم آرايه برای دسترسی به رشته ای که درون آرايه ذخيره شده نياز است. کتابخانه استاندارد ++C شامل توابعی برای کارکردن با رشته ها است. برای ارسال رشته ای به اين توابع بايد از نام آرايه استفاده شود. برای دريافت و نمايش متغيرهای رشته ای توسط دستورات cin و cout هم به همين صورت می توان عمل کرد.

cin >> UserName;
cout << UserName;

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

روش ديگر برای دريافت يک رشته از ورودی استفاده از متد getline شیء cin است. در اين حالت متن ورودی می تواند شامل فضاهای خالی هم باشد.


مثال. برنامه زير متنی با حداکثر طول 24 کاراکتر را از ورودی دريافت می کند و به متغير name اختصاص می دهد. کاراکتر NULL در انتها اضافه می شود.

#include <iostream.h>
int main() {
   char name[25];
   cout << "Please enter your name \n";
   cin.getline(name,25);
   cout << "Hello " << name << endl;
   return 0;
}


مقداردهی اولیه آرایه کاراکتری

مشابه آرايه های ديگر آرايه های کاراکتری را می توان هنگام اعلان مقداردهی اوليه کرد. می توان کاراکترها را مجزا درون آکولاد نوشت يا از يک ثابت رشته ای که درون علامت (") قرار دارد استفاده کرد. در حالت دوم کامپايلر اتوماتيک کاراکتر null را در انتهای رشته درج می کند.

char string[10] = { 'h', 'e', 'l', 'l', 'o', '\0' };
char string[10] = "hello";

وقتی آرايه توسط رشته "hello" مقداردهی می شود در حافظه به صورت زير ذخيره می شود:

آرايه کاراکتري

اگر اندازه آرايه ذکر نشود کامپايلر اندازه آرايه را با توجه به تعداد کاراکترهای رشته ای محاسبه می کند. در اعلان زير آرايه با اندازه 6 کاراکتر مقداردهی می شود.

char string[] = "hello";

توابع C++ که روی رشته ها کار می کنند طول رشته را با پيدا کردن کاراکتر null محاسبه می کنند. يکی از مشکلاتی است که ممکن است در برنامه بروز کند. اين است که کاراکتر null گم بشود در نتيجه برنامه رشته را تا رسيدن به کاراکتر با کد اسکی صفر در حافظه گسترش می دهد.


نوع داده string

برای ذخيره رشته ها غير از آرايه کاراکتری انتخاب های ديگری هم وجود دارد. ++C شیء string را برای متغير های رشته ای دارد که برای استفاده باید فایل هدر ضميمه شود. string متدها و خواص خود را دارد که می توانید استفاده کنید. خاصیت طول یکی از خواص string است.


مثال.

#include <iostream.h>
#include <string.h>
int main() {
   string stringA = "C++",
   string stringB = "Is Cool",
   cout << "Length of stringA = " << stringA.length() << endl;
   cout << "Length of stringB = " << stringB.length() << endl;
   return 0;
}


روش ديگر برای کارکردن با رشته ها استفاده از اشاره گرهاست. برای اين منظور کافی است فضائی در حافظه درنظر گرفته شده رشته ای که به null ختم می شود را در آن ذخيره کرد. اشاره گری به اولين کاراکتر اين رشته به عنوان شروع رشته مشابه وقتی که رشته درون آرايه ذخيره می شود کار می کند.


مثال. وقتی دستور زير اجرا می شود رشته جائی در حافظه ذخيره می شود و آدرس شروع آن در اشاره گر message قرار می گيرد.

char *message = "Great Caesar\'s Ghost!";

اعلان فوق مشابه تعريف زير است:

char message[] = "Great Caesar\'s Ghost!";


توابع رشته ای

++C شامل کتابخانه ای از توابع رشته ای است که برخی از آنها در جدول زير آمده است. برای استفاده از اين توابع فايل string.h بايد ضميمه شده باشد.

الگوی فراخوانی شرح تابع
char *strcpy(char *dest, char *src); کپی یک رشته در دیگری strcpy
size_t strlen(char *src); برگرداندن طول رشته strlen
char *strcat(char *dest, char *src, size_t num); اضافه کردن یک رشته در رشته دیگر strncat
char *strchr(char *str, char ch); پیدا کردن یک کاراکتر در رشته strchr
char *strstr(char *str1, char *str2); پیدا کردن یک رشته در رشته دیگر strstr
int strcmp(char *str1, char *str2); مقایسه دو رشته strcmp
char *gets(char *dest); دریافت یک رشته از ورودی gets
char *puts(const char *dest); نمایش یک رشته در خروجی puts

مثال. نحوه استفاده از تابع strlen و strcat.

#include <iostream.h>
#include <string.h>
int main() {
   char firststring[40],secondstring[40],thirdstring[40];
   int size;
   cout << "Please enter a word \n";
   cin.getline(firststring,40);
   cout << "Please enter another word \n";
   cin.getline(secondstring,40);
   size = strlen(firststring);    strcat(firststring,secondstring);
   cout << "The length of the first string you entered is" << size << endl;
   cout << "Both strings you entered are " << thirdstring << endl;
   return 0;
}


 


 


صفحه اصلی| PDF| درباره| تماس