آرایه ها در C

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

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

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

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

(طول آرایه) ضرب در (طول نوع آرایه) = میزان حافظه آرایه (برحسب بایت)

برای دسترسی به هر یک از خانه ها آدرس آن را لازم داریم. آدرس هر خانه از 0  تا n-1 است که در آن n  تعداد خانه های تعریف شده است . هر عضو آرایه به تنهایی می تواند در محاسبات شرکت کند .

مثال :

unsigned char a[5]={7,12,0,99,1};

a[0]=a[4]*a[2];

نکته 1 :
اندیس آرایه خود می تواند متغیر باشد و این قابلیت می تواند در برنامه ها کاربرد زیادی داشته باشد.
نکته 2 :
در صورتی که می خواهید آرایه به صورت دائمی ذخیره شود (مثلا وقتی که میخواهید لوگو شرکت خود را همیشه داشته باشید) باید به ابتدای تعریف کلمه کلیدی eeprom یا flash  را اضافه کنید تا در حافظه های دائمی ذخیره گردد.
نکته 3 :

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

int a[]={1,2,3,4,5,6};

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

در تعریف آرایه دو بعدی باید 2  اندیس و در تعریف آرایه سه بعدی باید . اندیس و در تعریف آرایه n  بعدی باید n اندیس را ذکر کرد .

آرایه های چند بعدی در نمایشگر های lcd کاربرد دارند . به عنوان مثال :

int table [10] [10];

یک آرایه دو بعدی بنام table  را تعریف میکند که دارای 10  سطر و 10 ستون است و نوع عناصر آن int است .

int k [5] [10] [15];

آرایه ای سه بعدی بنام k  را تعریف می کند که دارای .  سطر ، 10  ستون و 1. ارتفاع است و نوع عناصر آن int می باشد. نکته : تعریف آرایه ها با مجموعه عناصر زیاد در حافظه SRAM  به علت محدودیت در حجم حافظه ممکن  است باعث ایجاد مشکل شود. بنابراین معمولا آرایه های با حجم زیاد را در بخش خالی حافظه flash  ذخیره می کنند.

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

برای مقدار دهی اولیه به آرایه های دو بعدی سطر ها را به ترتیب پر می کنیم . مثال :

int a[2][3]={ {3,1,2} , {7,4,6} }

برای مقدار دهی اولیه به آرایه های سه بعدی ابتدا سطرهای طبقه اول و سپس سطرهای بقیه طبقات را مقدار دهی می کنیم. مثال :

int a[2][3][4]={ { {1,2,3,4} ,{5,4,3,2} , {2,3,4,5} } , { {7,6,5,4} , {9,0,8,7} , {6,7,4,1} } }

برای مقدار دهی ثانویه در حین برنامه میتوان به صورت زیر عمل کرد :

a[0][1][3]=2354;

نکته 1 :
برای مقدار دهی ثانویه اندیس ها از 0  تا n-1 میتواند باشد.
نکته 2 :
در مقدار اندیس آرایه های چند بعدی ، به جای عدد میتوان از متغیر استفاده کرد.

رشته ها  در C

در زبان سی برای نمایش کلمات و جملات از رشته ها استفاده می شود . رشته همان آرایه ای از کاراکتر ها است که حاوی اطلاعاتی می باشد. تمام کاراکتر ها شامل اعداد و حروف و برخی کاراکترهای دیگر که روی صفحه کلید کامپیوتر وجود دارند ، دارای کد شناسایی ASCII   ( مخفف American Standard Code For Information Interchange  ) می‌باشند. کدهای اسکی توسط استاندارد آمریکایی در سال 1967  ابداع شد و  در سال 1986 دست خوش تغییراتی شد .

کاراکتر ست اسکی خود به دو نوع تقسیم می شود. نوع 7 بیتی که با نام اسکی استاندارد (Standard ASCII) شناخته شده و دارای 2  به توان 7  یعنی 128  کاراکتر مختلف است که از 0  تا 127 استفاده می  شوند. نوع  دیگر آن حالت 8 بیتی است که با نام اسکی توسعه یافته (Extended ASCII)  شناخته شده و دارای 2  به توان 8  یعنی 256  کاراکتر مختلف است که از 0  تا 255 استفاده می شود. حالت توسعه  یافته جدا از حالت استاندارد  نیست بلکه از 0  تا 127  کاراکتر اول آن درست مانند حالت استاندارد بوده و فقط بقیه کاراکترها (از 128  تا 255 ) به آن اضافه شده است. کاراکترهای اضافی دارای هیچ استانداردی نبوده و ممکن است در دستگاه  ها و کامپیوترهای مختلف فرق داشته باشد و به منظور ایجاد کاراکترهای زبان دوم ( مثلا زبان فارسی ) ایجاد شده  است . یعنی ممکن است در یک کامپیوتر کاراکتر اسکی 150 معادل حرف û  و در کامپیوتر دیگر که روی زبان  دوم فارسی تنظیم شده است ، معادل حرف ب باشد . اما کاراکترهای قبل از 128  همگی ثابت هستند.

در هر دو نوع ذکر شده (7 و 8 بیتی) تعداد 32  کاراکتر اول (یعنی از 0  تا 31 )و آخرین کاراکتر (127) با عنوان کاراکترهای کنترلی (Control Characters) شناخته می  شود. این کاراکترها غیرقابل چاپ بوده و فقط برای کنترل متن مورد استفاده قرار می گیرد (مثلاً مشخص کننده ابتدای هدر، حذف، کنسل و … )  بقیه  کاراکترها یعنی از 32  تا 126  قابل چاپ هستند. این کاراکترها شامل نمادها، حروف و اعداد انگلیسی هستند.  در حالت توسعه یافته، از کاراکترهای 128  تا 255 نیز قابل چاپ هستند.

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

تعریف یک کاراکتر

تعریف یک کاراکتر توسط نوع متغیر char  صورت می گیرد و مقدار اولیه آن داخل کوتیشن (‘ ‘ ) قرار می  گیرد . در زبان سی وقتی یک حرف بین ‘  و ‘ قرار می گیرد کد اسکی آن درون متغیر ذخیره می شود . مثال :

char c=’H’;

تعریف رشته ( آرایه ای از کاراکتر ها )

برای تعریف رشته از آرایه ای از کاراکترها استفاده می شود و مقدار اولیه آن داخل دابل کوتیشن( ” ” ) قرار می گیرد . به طور مثال برای کلمه Hello ، کدهای اسکی تمام حروف آن به همراه یک کاراکتر تهی که در انتهای آن ها قرار می گیرد، نیاز است.

char s[10]=”Hello”;

اگر تعداد خانه های آرایه ذکر شود ، آرایه سایز مشخصی دارد و در صورتی که تعداد کاراکترهای عبارت یا جمله ای که درون آن میریزیم بیشتر از سایز آرایه باشد ، عبارت ناقص ذخیره خواهد شد و در صورتی که تعداد کاراکترهای مورد نظر کمتر باشد بقیه آرایه خالی خواهد بود . اگر تعداد خانه های آرایه ذکر نشود یعنی سایز آرایه بر اساس مقداری که درون آن ریخته می شود محاسبه شود . مثال :

char str[]=”Hello!…”

کاراکترهای کنترلی

در محتویات یک رشته علاوه بر کاراکترهای قابل چاپ می توان کاراکترهای کنترلی قرارداد. این کاراکتر ها برای کنترل صفحه نمایش میباشند و به شکل جدول زیر میباشند:

عملگرها

با استفاده از عملگرها می توان روی اعداد ، متغیرها ، آرایه ها ، رشته ها و …  عملیات حسابی ، منطقی ، مقایسه ، بیتی ، بایتی و … انجام داد.

عملگرهای محاسباتی

عملگرهای محاسباتی، عملگرهایی هستند که اعمال محاسباتی را روی عملوندها انجام می دهند. عملگر % برای محاسبه باقی مانده تقسیم به کار می رود. این عملگر  عملوند اول را بر عملوند دوم تقسیم می  کند (تقسیم صحیح) و باقیمانده را برمی گرداند. در جدول های زیر، عملگرهای محاسباتی و تقدم آن  ها در یک معادله مشاهده می شود:

دو عملگر ++ و– همان طور که مشاهده می کنید در طرف چپ و راست متغیر قرارگرفته اند. اگر به تنهایی و در یک خط دستور به کاربرده شوند، فرقی نمی کند اما اگر در یک معادله به کاربرده شوند، اینکه طرف راست یا چپ قرار گیرند، متفاوت است. به مثال زیر توجه کنید:

x++;

++x;

y = ++x;

y = x++;

همان طور که در مثال مشاهده می کنید، در دو دستور اول به متغیر x یک واحد اضافه می  شود. در دستور سوم، ابتدا یک واحد به مقدار متغیر x اضافه شده و سپس درون متغیر y قرار می  گیرد. در دستور چهارم، ابتدا مقدار متغیر x درون متغیر y قرارگرفته و سپس یک واحد به آن اضافه می  شود. اگر تا قبل از رسیدن به دستور چهارم، مقدار x  برابر با 10 باشد، پس از گذشتن از دستور چهارم، مقدار y  برابر 10 و x  برابر با 11 است.

عملگرهای مقایسه ای و منطقی

عملگرهای مقایسه ای ارتباط بین عملوند ها را مشخص می کنند و عملگر های منطقی بر روی عبارات منطقی عمل می کنند. عبارات منطقی دارای دو ارزش درستی و نادرستی اند و زمانی که باید یک شرط مورد بررسی قرار بگیرد، استفاده می شوند. به طور مثال برای بررسی مساوی بودن دو متغیر از عملگر == استفاده می شود. در زبان c ، ارزش نادرستی با 0 و ارزش درستی با مقادیر غیر صفر مشخص می شود.

عملگرهای ترکیبی

این عملگر ها ترکیبی از عملگر مساوی و عملگرهای دیگر هستند. به طور مثال عملگر =+  در نظر بگیرید، اگر به شکل x += a نوشته شود، برابر با x = x+a است؛ یعنی هر بار متغیر x را با متغیر a  جمع می کند و درون متغیر x قرار می دهد. برای دیگر عملگر های ترکیبی نیز به همین  صورت است. این عملگر ها پایین ترین تقدم  را در بین عملگرهای دیگر دارند. این عملگر ها، عملگر های حسابی را شامل می شوند. در جداول زیر عملگرهای ترکیبی و تقدم آنها را میبینید.

تعریف عملگرهای بیتی

عملگر های بیتی بر روی هر بیت یک بایت اثر می گذارند . به طور مثال ، a  یک متغیر 8  بیتی با مقدار باینری 11100101 است ، اگر عملگر not را روی a اثر دهیم ، نتیجه معکوس شدن هر بیت هست .  a =~ a  برابر با  مقدار باینری 00011010  است . عملگرهای دیگر نیز به همین شکل اثر خود را اعمال می کنند

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

تقدم کلی در عملگرها

همانطور که مشاهده می شود عملگر پرانتز دارای بیشترین اولویت است . با استفاده از این عملگر میتوان انجام محاسبات را اولویت داد به طوری که اولویت اول همیشه با داخلی ترین پرانتز است و سپس به ترتیب تا پرانتز بیرونی اولویت دارند .مثال :

y=(x+(a/(3+g)))*2;

همان طور که در مثال بالا مشاهده می کنید، ابتدا g+3 انجام می  شود، در مرحله بعد ((a/(3+g) انجام می  شود، در مرحله بعدی (((x+(a/(3+g) انجام می شود و در انتها (x+(a/(3+g)))*2 انجام می شود.

تبدیل نوع در محاسبات

برای درک بهتر در مورد تبدیل نوع در محاسبات ، به مثال زیر توجه کنید.

int a=9,b=2;

float x,y,z;

x=a/b;

y=(float) a/b;

z=9.0/2.0;

در مثال بالا با اینکه متغیرهای x و y و z هر سه از نوع float هستند ولی مقدار x  برابر با 4 و مقدار y و z  برابر  با 5/4 است. اگر متغیر های a و b از نوع float بودند ، مقدار x  نیز برابر 5/4 می شد اما چون متغیر های a و b از نوع int هستند باید یک تبدیل نوع در محاسبه توسط عبارت (float) در ابتدای محاسبه انجام شود.