همانطور که در آموزش های گذشته دیدیم، داده ها را در متغیر ها و سوابق ذخیره و در موقع لزوم بازیابی کردیم. اما اگر تعداد داده ها زیاد باشد، استفاده از متغیرها به روش هایی که تا کنون استفاده شد امکان پذیر نمی باشد.در برخی موارد نیازمند ذخیره تعداد زیادی داده هستیم. نمرات و معدل دانشجویان یک کلاس ,حقوق کارمندان یک شرکت, موجودی کالاهای یک انبار و بسیاری موارد دیگر از جمله مواردی هستند که نیازمند استفاده از تعداد زیادی متغیر برای ذخیره و بازیابی اطلاعات هستند.برای حل این گونه مسئله ها آرایه ها استفاده می کنیم.
آرایه ها مجموعهای از متغیرهای همنوع است که توسط نام مشترکی به آنها رجوع می شود. هر عنصر خاص از آرایه توسط یک شاخص یا همان اندیس مورد دسترسی قرار میگیرد. در زبان برنامه نویسی c تمام آرایه ها متشکل از مکان های مجاور حافظه هستند.در این بخش به آموزش آرایه های در زبان C می پردازیم. در ابتدا نحوه تعریف و دسترسی به عناصر آرایه ها، با مثال های ساده آموزش داده می شود و سپس با مثال های کمی پیچیده تر، کار با آرایه های یک بعدی و آرایه های چند بعدی را کاملا فرا خواهید گرفت.
۱- تعریف آرایه
آرایه یا Array در برنامه نویسی به نحوه ای از ایجاد داده ها ( عموماً متغیر ها ) می گویند که به تعداد تعیین شده و از نوع متغیر تعیین شده توسط برنامه نویس، خانه هایی را بر روی حافظه به صورت متوالی ایجاد می نماید ( که به هر یک از آنها عنصر آن آرایه می گوئیم ). تفاوت آرایه با ساختمان یا اجتماع، بر روی حافظه اینست که فضای خالی در بین خانه ها ایجاد نمی شود و از طرفی ایجاد آرایه بسیار راحت تر از تعریف ساختمان یا اجتماع می باشد.
- آرایه مجموعه ای از عناصر همنوع است.
- هر آرایه دارای نامی است که مانند متغیرهای معمولی نامگذاری میشود.
- آرایه یک مجموعه از محلهای متوالی حافظه است.
- هر محل یک عنصر آرایه به شمار می رود.
- برای دسترسی به عناصر آرایه از متغیری بنام اندیس استفاده میگردد. به همین دلیل، آرایه را متغیر اندیس دار میگویند.
- برای دسترسی به هر عنصر آرایه باید محل آنرا در آرایه بدانیم یعنی یک اندیس به محل آن داشته باشیم.
type name[number] = {value, value, ...};
ابتدا نوع داده خود را تعیین می نمائید که می تواند یک متغیر از نوع پایه یا یک نمونه از ساختمان یا اجتماع یا هر نوع داده دیگری باشد، سپس نام داده خود را می نویسید و درست در مقابل نام داده خود که فرض کنیم یک متغیر صحیح است، یک جفت کروشه به صورت باز و بسته می نویسیم که در داخل آن یک عدد قرار می گیرد که نشان دهنده تعداد آرایه ساخته شده و قابل استفاده برای برنامه نویس می باشد؛ به عدد نوشته شده در داخل کروشه ها که تعداد عناصر آرایه را تعیین می نماید اندیس گفته می شود. اندیس تعیین شده توسط شما هرگز نباید ۰ باشد. خانه های متوالی و پشت سرهم ذخیر شده برای شما از عنصر اول که همان اندیس ۰ آرایه می باشد، آغاز می گردد و تا عددی که شما تعیین کرده اید، منهای یکی ادامه می یابد. به عنصر آخر آرایه همواره مقدار تهی یا همان NULL تخصیص می یابد تا مشخص شود که آرایه به پایان رسیده.
مزایای استفاده از آرایه ها در برنامه نویسی C
- اعلان ساده تر (اعلان یک متغییر بجای ده ها و هزاران)
- سادگی کار با آنها ( عملیات ریاضی یکسانی بر روی آنها انجام می گیرد)
- انعطاف پذیری بیشتر (به روشهای مختلف می توان آنها را پردازش نمود)
- سهولت فهم برنامه
- کاهش اندازه برنامه نوشته شده
۱-۱- آرایه های یک بعدی
این آرایه ها را لیست نیز می نامند و به صورت زیر تعریف می شوند:
;[طول آرایه]نام آرایه نوع آرایه
- نوع آرایه یکی از انواع قابل قبول در c است.
- نام آرایه ,برای دسترسی به عناصر آرایه مورد استفاده قرار می گیرد.
- طول آرایه با یک عدد صحیح مثبت و در همان ابتدای تعریف آرایه مشخص می شود.
- اندیس آرایه ها در زبان c از صفر شروع می شود.
- اندیس آرایه ای به طول n از صفر شروع شده به n-1 ختم می شود.
- عناصر آرایه در محل های متوالی از حافظه ذخیره می شوند.
* مثال زیر با تابع Scanf میخواهیم اندیس ۰ آرایه ی T رو بخوانیم:
int T[3]; scanf("%d", &T[0]);
*مثال: برنامه ای که با تعریف یک آرایه به طول ۱۰، مقدار هر عنصر آن را برابر با اندیس آن قرار داده و سپس با محاسبه مجموع مربعات عناصر آرایه، آنها را در خروجی چاپ می کند.
#include <stdio.h> #include <conio.h> void main() { float list[5],max ; int i , j ; for(i=0 ; i<5 ; i++) { printf("\n enter moadel %d :",i+1); scanf("%f",&list[i]); } max=list[0] ; j=1 ; for(i=1 ;i<5 ; i++) { if(list[i]>max) { max=list[i] ; j=i+1 ; } } printf("\nmax=%f/position=%d",max,j); getch(); }
خروجی کد بالا:
enter moadel 1 :1.5 enter moadel 2 :5 enter moadel 3 :2 enter moadel 4 :3 enter moadel 5 :4 max=5.000000/position=1.5
*مثال: برنامه ای بنویسید که چند عدد از ورودی دریافت کند و سپس یک عدد خوانده و مشخص نماید که این عدد در لیست وجود دارد یا خیر (no , yes چاپ نماید). حداکثر اندازه لیست ۱۰ می باشد.
#include <stdio.h> #include <conio.h> main() { int a[10], number, n, i, j=0 ; printf("please enter count of number"); scanf("%d" ,&n) ; for (i = 0 ; i < n ; i++) { scanf("%d", &a[i]) ; } scanf("%d", &number) ; for (i = 0 ; i < n ; i++) { if (a[i] == number) { j=1; break; }} if (j == 0) printf("No") ; else printf("Yes") ; }
*مثال: معدل ۲۰ دانشجو را خوانده و آن را در یک آرایه قرار دهید سپس بیشترین معدل در آرایه و خانه ی اندیس انرا مشخص کند.
#include <stdio.h> #include <conio.h> main() { float avg[20], max ; int i, j=1; for (i = 0 ; i < 20 ; i++) { scanf("%f" , &avg[i]) ; } max = avg[0]; for (i = 1 ; i < 20 ; i++){ if (max < avg[i]){ max = avg[i] ; j=1+i; } } printf("%f %d" , max, j) ; return 0; }
۱-۲- آرایه های دو بعدی
آرایه ها را می توان به صورت دو و یا چند بعدی نیز تعریف نمود. استفاده از آن در کار با ماتریس ها کاملاً ملموس می باشد. برای این کار به جای تعیین یک اندیس، چند اندیس (به هر تعداد ابعادی که مورد نظر ماست) تعیین می نمائیم.
;[بعد ۲][بعد ۱]نام آرایه نوع آرایه
بعد اول تعداد سطرها را نشان میدهد و بعد دوم تعداد ستونها میباشد مثلاً در مثال زیر:
حافظه به صورت زیر تعریف میشود.
اگر بخواهیم این آرایه را در حافظه نمایش دهیم همانند شکل زیر میشود.
همانگونه که دیدید در ابتدا سطر اول بعد سطر دوم و بعد سطر … در حافظه ذخیره میشـود. پـس در C آرایـه هـا بصورت سطری در حافظه ذخیره میشوند.
*مثال : برنامه ای که با محاسبه جدول ضرب اعداد ۱ تا ۱۰، ضمن قرار دادن آنها در یک آرایه به خروجی نیز منتقل می کند.
#include <stdio.h> #include <conio.h> void main() { int table[10][10]; int i , j ; for(i=0 ; i<10 ; i++) for(j=0 ; j<10 ; j++) table[i][j]=(i+1)*(j+1 ); for(i=0 ; i<10 ; i++) { for(j=0 ; j<10 ; j++) printf("%4d",table[i][j]); printf("\n"); } getch(); }
خروجی کد بالا:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۲ ۴ ۶ ۸ ۱۰ ۱۲ ۱۴ ۱۶ ۱۸ ۲۰ ۳ ۶ ۹ ۱۲ ۱۵ ۱۸ ۲۱ ۲۴ ۲۷ ۳۰ ۴ ۸ ۱۲ ۱۶ ۲۰ ۲۴ ۲۸ ۳۲ ۳۶ ۴۰ ۵ ۱۰ ۱۵ ۲۰ ۲۵ ۳۰ ۳۵ ۴۰ ۴۵ ۵۰ ۶ ۱۲ ۱۸ ۲۴ ۳۰ ۳۶ ۴۲ ۴۸ ۵۴ ۶۰ ۷ ۱۴ ۲۱ ۲۸ ۳۵ ۴۲ ۴۹ ۵۶ ۶۳ ۷۰ ۸ ۱۶ ۲۴ ۳۲ ۴۰ ۴۸ ۵۶ ۶۴ ۷۲ ۸۰ ۹ ۱۸ ۲۷ ۳۶ ۴۵ ۵۴ ۶۳ ۷۲ ۸۱ ۹۰ ۱۰ ۲۰ ۳۰ ۴۰ ۵۰ ۶۰ ۷۰ ۸۰ ۹۰ ۱۰۰
۲- آرایه به عنوان آرگومان تابع
وقتی یک آرایه را به تابع میفرستیم از شکل فراخوانی با مرجع پیروی میکند. پس هرگونه تغییر در آرایـه در داخل یک تابع که به آن فرستاده شده است در جایی که آن را فراخوانی کرده است پایدار میماند. هنگامیکه یک آرایه به عنوان آرگومان به داخل تابع میرود میتواند یکی از ابعادش معرفی نشود ولی باید بقیه ابعادش معلوم باشد.
#include <iostream.h> #include <conio.h> int minFunction(int[], int); //------------------> اعلان تابع با پارامترهای نام آرایه و طول آن void main() { const int k=4; int array[k]; cout << "\nMinimum of array elements is " << minFunction(array, k); //------> فراخوانی تابع getch(); } int mainFunction(int arr[], int length) //------> تعریف تابع با تمامی متعلقات { for(count = 0 ; count < length ; count++) { cout << "Enter number [" << count+1 << "] :"; cin >> arr[cout] } int minNum = arr[0]; for(count = 1 ; count < length ; count++) { if (arr[count] < minNum) minNum = arr[cout] } return minNum; }
خروجی کد بالا:
Enter number 1 : 12 Enter number 2 : 3 Enter number 3 : 28 Enter number 4 : 109 Minimum of array elements is 3
۲-۱- آرایه های یک بعدی به عنوان آرگومان تابع
برای ارسال آرایه به تابع ، باید نام آرایه به عنوان آرگومان ذکر شود. اگر آرایه به عنوان آرگومان تابع باشد، پارامتر معادل آن می تواند به سه صورت تعریف شود.
- آرایه ای به طول مشخص
- آرایه ای با طول نا مشخص که در این صورت بهتر است طول آرایه به عنوان آرگومانی دیگر به تابع ارسال شود
- اشاره گر
*مثال: در برنامه زیر آرایه x بعنوان آرگومان تابع func() انتخاب شده و پارامتر معادل آن بصورت آرایه ای با طول معین در تابع تعریف شده است:
Int main() { Int x[10]; Func(x); Return 0; } Void func (int x[10]) { … }
۲-۲- آرایه های دو بعدی به عنوان آرگومان تابع
- برای ارسال آرایه های دو بعدی از تابعی به تابع دیگر باید نام آرایه را به عنوان آرگومان تابع ذکر کرد.
- برای تعریف پارامتر معادل آن ,مانند آرایه های یک بعدی عمل می شود.با این تفاوت که در حالتی که در آرایه های یک بعدی ,پارامتر به صورت آرایه بدون طول ذکر می شد.در آرایع دو بعدی ,طول سطر ذکر نمی شود ولی طول ستون ها حتما باید ذکر شود که در این صورت بهتر است طول سطر ,به عنوان آرگومان دیگری به تابع ارسال شود.
- به هنگام ارسال آرایه به عنوان پارامتر در آرایه های چند بعدی نیز تنها می توان اندیس اول را حذف کرد و عدد مربوط به بقیه اندیس ها صراحتا ذکر شود.
*مثال: مدیر یک شرکت تولید قطعات یدکی تراکتور می خواهد از مشتریان خود در مورد کیفیت محصولات تولیدی خود نظر سنجی نماید. تعداد محصولات ۲۰ عدد با کد از یک تا ۲۰ و کد اعمال نظر بصورت زیر می باشد: ۱- عالی ۲- متوسط ۳- ضعیف ۴- نخریده ام. بر نامه ای بنویسید که برای محصولات ۲۰ گانه برای هر یک از محصولات به تفکیک اراء مشتریان چاپ شود.
#include <stdio.h> const int productNo=20; void main(){ int votes[productNo][4]={{0}}; int voteCode; int i,j,n; printf(“enter number of customers:”); scanf(“%d”,&n); for (i=0; i<n; i++){ // حلقه دريافت اراء مشتريان printf(“ customer no %d:” i+1); // حلقه دريافت نظر مشتري براي هر محصول for (j=0; j<productNo; j++) { printf(“ enter vote for product no %d:” j+1); scanf(“%d”,&voteCode); if(voteCode>=1 && voteCode<=4) votes [j][voteCode-1]++; } } // حلقه چاپ اراي مشتريان for (i=0; i<productNo; i++) { printf (product no %d:”, i+1); printf( “ecllent=%d intermediate= %d bad= %d no purchase=%d\n”, votes{i][0], votes{i][1], votes{i][2], votes{i][3]); } }
*مثال: برنامه ای بنویسید که شماره دانشجویی، نام و معدل تعدادی دانشجو را دریافت و با دریافت شماره دانشجویی هر فرد اطلاعات او را جستجو و در صورت پیدا شدن چاپ نماید برنامه با شماره دانشجویی صفر خاتمه می یابد.
# include<stdio.h> Const int maxStudent=100; // حداکثر تعداد دانشجو Const int maxNameLen=20; // حداکثر طول نام هر دانشجو Void main () { Long int idList[maxStudent]; //ارایه حاوی شماره دانشجویی Float averageList[maxStudent]; // ارایه حاوی معدل دانشجویان Char nameList[maxStudent][maxNameLen]; // ارایه حاوی نام دانشجویان Long int searchId; Int i,n; Printf(“please enter number of students:’); Scanf(“%d”,&n); // در یافت اطلاعات دانشجویان For (i=0; I<n; i++) { printf(“student #%d:\n”,i+1); printf(“enter id:”); scanf(“%ld”, &idlist[i]); printf(“enter name:”); scanf(“%s”, nameList[i]; /// gets (nameList[i]) مشابه هم printf(“enter average:”); scanf(“%f”, &averageList[i]); } // حلقه جستجوی دانشجو While (1) { // حلقه ای بدون انتها Prinf(“enter student id (0 to exit):”); Scanf(“%ld”, &searchId); If (!searchId)break; For (i=0; i<n; i++) if (idList[i]==searchId) break; If(i<n) { printf(“student specification:\n); printf( “id=%ld name= %s average =%f\n”, idList[i], nameList[i], averageList[i]); } else printf (“student not found”); } }