سی‌شارپ/آرایه ها

' آرایه ها برنامه نویسی شی گرا
سی‌شارپ


متغیرهای اندیسدار یا آرایه هاویرایش

در مثالهایی که در فصل قبل بیان گردید، از متغیرهای معمولی استفاده گردید. اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم. درچنین مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم، بلکه دسترسی به تک تک آنها نیز مشکل است.

مثال ) الگوریتمی بنویسید که شماره دانشجویی، نام و معدل تعدادی دانشجو را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کلاس بیشتر است را چاپ کند.

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

این متغیرها را چگونه نامگذاری کنیم ؟

بر فرض نامگذاری متغیرها برطبق یک روش خاص، چگونه تک تک آنها را با میانگین کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟

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

تعریف آرایه : مجموعه ای از داده های همنوع است که تحت یک نام مشترک ذخیره می گردند.

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

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

مثال) آرایه A را با 100 عضو درنظر بگیر

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

مثال) الگوریتمی بنویسید که شماره دانشجویی، نام و معدل تعدادی دانشجو را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کلاس بیشتر است را چاپ کند

n را بخوان

آرایه های idList و nameList و aveList را با n عنصر درنظر بگیر.

i ← 1 و sum ← 0

تازمانیکه ( i ≤ n ) دستورات 5 تا 8 را تکرار کن

چاپ کن "مشخصات دانشجوی " ، i ، "را وارد کنید"

idList(i) و nameList(i) و aveList(i) را بخوان

sum ← sum + aveList(i)

i ← i + 1

totalAve ← sum / n

i ← 1

تازمانیکه ( i ≤ n ) دستورات 12 تا 13 را تکرار کن

اگر ( aveList(i) ≥ totalAve) آنگاه

idList(i) و nameList(i) و aveList(i) را چا پ کن

i ← i +1

توقف کن

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

الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ کند. n را بخوان

آرایه های positive و negative را با n عنصر درنظر بگیر i ← 1 و posCount ← 0 و negCount ← 0 تازمانیکه ( i ≤ n ) دستورات 5 تا 7 را تکرار کن adad را بخوان اگر ( adad ≥ 0 ) آنگاه posCount ← posCount + 1 و positive(posCount) ← adad در غیراینصورت negCount ← negCount + 1 و negative(negCount) ← adad i ← i + 1 چاپ کن "لیست اعداد مثبت" i ← 1 تازمانیکه ( i ≤ posCount ) دستورات 11 تا 12 را تکرار کن چاپ کن positive(i) i ← i + 1 چاپ کن "لیست اعداد منفی" i ← 1 تازمانیکه ( i ≤ negCount ) دستورات 16 تا 17 را تکرار کن چاپ کن negative(i) i ← i + 1 توقف کن 1-4 آرایه های یک بعدی الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد. سپس اشتراک آن دو را محاسبه و در یک آرایه دیگر قرار دهد. در پایان اشتراک حاصل را چاپ کند. n و m را بخوان آرایه A را با n عنصر و آرایه B را با m عنصر در نظر بگیر. آرایه C را با min(n,m) عنصر درنظر بگیر آرایه های A با n عنصر و B با m عنصر را بخوان (البته نیاز به حلقه دارد) aCount ← 1 و cCount ← 0 تا زمانیکه ( aCount ≤ n) دستورات 7 تا 11 را تکرار کن bCount ← 1 و sw ← 1 تازمانیکه ( bCount ≤ m and sw = 1) دستورات 9 تا 10 را تکرار کن اگر ( A(aCount) = B(bCount) ) آنگاه cCount ← cCount + 1 و C(cCount) ← A(aCount) و sw ← 0 bCount ← bCount + 1 aCount ← aCount + 1 چاپ کن "اشتراک دو مجموعه برابر است با : " i ← 1 تازمانیکه ( i ≤ cCount ) دستورات 15 تا 16 را تکرار کن C(i) را چاپ کن i ← i + 1 توقف کن 1-4 آرایه های یک بعدی آزمایش الگوریتم اشتراک 1-4 آرایه های یک بعدی الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید. n و m را بخوان آرایه A را با n عنصر و آرایه B را با m عنصر در نظر بگیر. آرایه C را با n+m عنصر درنظر بگیر آرایه های A با n عنصر و B با m عنصر را بخوان (البته نیاز به حلقه دارد) i ← 1 تا زمانیکه ( i ≤ n ) دستورات 7 تا 8 را تکرار کن C(i) ← A(i) i ← i + 1 bCount ← 1 و cCount ← n تا زمانیکه ( bCount ≤ m) دستورات 11 تا 16 را تکرار کن aCount ← 1 و sw ← 1 تازمانیکه ( aCount ≤ n and sw = 1) دستورات 13 تا 14 را تکرار کن اگر ( A(aCount) = B(bCount) ) آنگاه sw ← 0 aCount ← aCount + 1

اگر (sw = 1) آنگاه 

cCount ← cCount + 1 و C(cCount) ← B(bCount) bCount ← bCount + 1 چاپ کن "اجتماع دو مجموعه برابر است با :" i ← 1 تازمانیکه ( i ≤ cCount ) دستورات 15 تا 16 را تکرار کن C(i) را چاپ کن i ← i + 1 توقف کن 1-4 آرایه های یک بعدی الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن، حاصل را در یک لیست دیگر قرار دهد. n را بخوان آرایه A و B را با n عنصر درنظر بگیر آرایه A را با n عنصر بخوان B(1) ← A(1) i ← 2 و k ← 1 تا زمانیکه ( i ≤ n ) دستورات 7 تا 11 را تکرار کن j ← 1 تازمانیکه ( j ≤ k and A(i) ≠ B(j) ) دستور 9 را تکرار کن j ← j + 1 اگر ( j > k) آنگاه k ← k + 1 و B(k) ← A(i) i ← i + 1 لیست B را با k عضو چاپ کن (نیاز به حلقه دارد) توقف کن 1-4 آرایه های یک بعدی الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه اصلی (بدون کمک آرایه دیگر) انجام دهد. n را بخوان لیست A را با n عنصر در نظر بگیر لیست A را با n عنصر بخوان (نیاز به حلقه دارد) i ← 1 تازمانیکه ( i ≤ n ) دستورات 6 تا 9 را تکرار کن j ← i + 1 تازمانیکه ( j ≤ n ) دستور 8 را تکرار کن اگر ( A(i) = A(j) ) آنگاه A(j) ← A(n) و n ← n - 1 i ← i + 1 لیست A را با n عضو چاپ کن توقف کن 1-4 آرایه های یک بعدی الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید. n را بخوان آرایه A را با n عنصر درنظر بگیر آرایه A را با n عنصر بخوان (بصورت مرتب شده) x را بخوان

i ← 1

تازمانیکه ( i ≤ n and x≠A(i) ) دستور 7 را تکرار کن i ← i + 1 اگر ( i > n ) چاپ کن "عدد پیدا نشد" و توقف کن تازمانیکه ( i < n ) دستورات 10 تا 11 را تکرار کن A(i) ← A(i + 1) i ← i + 1 n ← n -1 آرایه A را با n عضو چاپ کن توقف کن 1-4 آرایه های یک بعدی آزمایش الگوریتم حذف از لیست مرتب 1-4 آرایه های یک بعدی الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست درج کند بطوریکه ترتیب حفظ شود. n را بخوان آرایه A را با n + 1 عنصر درنظر بگیر آرایه A را با n عنصر بخوان (بصورت مرتب شده) x را بخوان

i ← n

تازمانیکه ( i ≥ 1 and x < A(i) ) دستورات 7 تا 8 را تکرار کن A(i + 1) ← A(i) i ← i – 1 A(i + 1) ← x n ← n + 1 آرایه A را با n عضو چاپ کن توقف کن 1-4 آرایه های یک بعدی آزمایش الگوریتم درج در لیست مرتب 1-4 آرایه های یک بعدی الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند. n را بخوان آرایه های A و sw را با n عضو درنظر بگیر آرایه A را با n عضو بخوان تمام عناصر آرایه sw را برابر 0 قرار بده mod ← 0 و modNo ← 0 i ← 1 تازمانیکه ( i ≤ n) دستورات 7 تا 8 را تکرار کن اگر ( sw(i) = 0 ) آنگاه sw(i) ← 1 j ← i + 1 و sum ← 0 تازمانیکه ( j ≤ n ) دستورات d تا e را تکرار کن اگر ( A(i) = A(j) ) آنگاه sum ← sum + 1 و sw(j) ← 1 j ← j + 1 اگر ( sum > modNo) آنگاه mod ← A(i) و modNo ← sum i ← i + 1 mod و modNo را چاپ کن توقف کن 1-4 آرایه های یک بعدی الگوریتمی بنویسید که برای تعداد دانشجو، کد رشته (از 1 تا 15) را خوانده و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند. آرایه count را با 15 عضو درنظر بگیر تمام عناصر آرایه count را برابر 0 قرار بده n را بخوان i ← 1 تازمانیکه ( i ≤ n) دستورات 6 تا 8 را تکرار کن code را بخوان count(code) ← count(code) + 1 i ← i + 1 آرایه count را با 15 عضو چاپ کن توقف کن

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

مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند. هر عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد. اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز به بیش از یک اندیس دارد، که به آنها آرایه های چند بعدی گفته می شود. چنانچه هر عنصر آرایه به 2 اندیس نیاز داشته باشد، به آن آرایه دو بعدی می گوییم.

برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص کنیم. معمولا یک آرایه دو بعدی بصورت m × n اعلان می گردد که m تعداد سطرها و n تعداد ستونها است. 

2-4 آرایه های چندبعدی بعنوان مثال چنانچه آرایه A را بعنوان یک آرایه دوبعدی به ابعاد 5 × 8 تعریف کنیم، آنگاه داریم :

2-4 آرایه های چندبعدی برای آرایه های سه بعدی نیز مفاهیم مشابهی قابل طرح است. در این آرایه ها هر عنصر نیاز به 3 اندیس دارد و برای تعریف آنها را بصورت p × m × n اعلان می کنیم که p عمق، m تعداد سطرها و n تعداد ستونها است.

بعنوان مثال چنانچه آرایه B بعنوان یک آرایه سه بعدی به ابعاد 3 × 4 × 6  تعریف شود، خواهیم داشت :

2-4 آرایه های چندبعدی الگوریتمی بنویسید که برای تعدادی دانشجو، شماره دانشجویی و کد رشته (از 1 تا 15) را خوانده و سپس دانشجویان هررشته را به تفکیک چاپ کند. n را بخوان آرایه دوبعدی student را به ابعاد 15 × n در نظر بگیر آرایه count را با 15 عنصر در نظر بگیر و تمام عناصر آن را برابر 0 قرار بده i ← 1 تازمانیکه ( i ≤ n ) دستورات 6 تا 9 را تکرار کن id و code را بخوان count(code) ← count(code) + 1 student( code , count(code) ) ← id i ← i + 1 چاپ کن "لیست دانشجویان" i ← 1 تازمانیکه ( i ≤ 15) دستورات 13 تا 18 را تکرار کن چاپ کن "رشته "، i j ← 1 تازمانیکه ( j ≤ count(i) ) دستورات 16 تا 17 را تکرار کن student( i , j ) را چاپ کن j ← j + 1 i ← i + 1 توقف کن 2-4 آرایه های چندبعدی الگوریتمی بنویسید که برای تعدادی دانشجو، شماره دانشجویی و کد محل تحصیل (از 1 تا 10) و کد رشته (از 1 تا 15) را خوانده و سپس دانشجویان هر رشته را به تفکیک چاپ کند. n را بخوان آرایه سه بعدی student را به ابعاد 10 × 15 × n در نظر بگیر آرایه count را با 1510 × عنصر در نظر بگیر و تمام عناصر آن را برابر 0 قرار بده i ← 1 تازمانیکه ( i ≤ n ) دستورات 6 تا 9 را تکرار کن id و cityCode و studyCode را بخوان count(cityCode,studyCode) ← count(cityCode,studyCode) + 1 student( cityCode , studyCode , count(cityCode , studyCode) ) ← id i ← i + 1 چاپ کن "لیست دانشجویان" i ← 1 تازمانیکه ( i ≤ 10) دستورات 13 تا 22 را تکرار کن چاپ کن "محل "، i j ← 1 تازمانیکه ( j ≤ 15 ) دستورات 16 تا 21 را تکرار کن چاپ کن "کد رشته "، j k ← 1 تازمانیکه ( k ≤ count(i,j) ) دستورات 19 تا 20 را چاپ کن student( i , j , k) را چاپ کن k ← k + 1 j ← j + 1 i ← i + 1 توقف کن 2-4 آرایه های چندبعدی 50 موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را بشرح زیر اعلام کند: 1- موافق 2- مخالف 3- ممتنع 4- بی اطلاع الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از دریافت آرای هریک از آنان برای هر 50 موضوع، تعداد آرای مختلف هر موضوع را به تفکیک چاپ کند. n را بخوان i ← 1 تازمانیکه ( i ≤ n ) دستورات را 5 تا 11 تکرار کن j ← 1 تازمانیکه ( j ≤ 50 ) دستورات 7 تا 10 را تکرار کن چاپ کن "موضوع " ، j vote را بخوان count(j , vote) ← count(j , vote) + 1 j ← j + 1 i ← i + 1 آرایه count را به ابعاد 50 × 4 چاپ کن (نیاز به حلقه دارد) توقف کن 2-4 آرایه های چندبعدی الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند. m و n را بخوان (ابعاد ماتریس اول m × n) p و q را بخوان (ابعاد ماتریس دوم p × q) اگر ( n ≠ p ) آنگاه چاپ کن "ماتریسها قابل ضرب نیستند" و توقف کن آرایه A را به ابعاد m × n و آرایه B را به ابعاد p × q درنظر بگیر آرایه C را به ابعاد m × q درنظر بگیر آرایه A را به ابعاد m × n بخوان آرایه B را به ابعاد p × q بخوان i ← 1 تازمانیکه ( i ≤ m) دستورات 10 تا 18 را تکرار کن j ← 1 تازمانیکه ( j ≤ q) دستورات 12 تا 17 را تکرار کن sum ← 0 و k ← 1 تازمانیکه (k ≤ n) دستورات 14 تا 15 را تکرار کن sum ← sum + A(i,k) × B(k,j) k ← k + 1 C(i,j) ← sum j ← j + 1 i ← i + 1 آرایه C را به ابعاد m × q چاپ کن توقف کن 2-4 آرایه های چندبعدی دریک آزمون دانشجویان باید به 20 سوال 4 گزینه ای جواب بدهند. الگوریتمی بنویسید که ابتدا جواب درست سوالات را دریافت و سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند. پاسخنامه ها در یک آرایه دوبعدی 20 × 4 است که در جاهایی که دانشجو علامت زده است کاراکتر X قرار گرفته است و سایر مکانها خالی است. هر پاسخ غلط ⅓ نمره منفی دارد. آرایه correct را با 20 عضو درنظر بگیر آرایه answers را به ابعاد 20 × 4 در نظر بگیر i ← 1 تازمانیکه (i ≤ 20) دستورات 5 تا 7 را تکرار کن چاپ کن "پاسخ درست سوال"، i correct(i) را بخوان i ← i + 1 n را بخوان i ← 1 تازمانیکه ( i ≤ n) دستورات 11 تا 22 را تکرار کن آرایه answers را بخوان (از داخل فایل یا ورودی صفحه کلید) grade ← 0 j ← 1 تازمانیکه ( j ≤ 20) دستورات 15 تا 20 را تکرار کن k ← 1 و count ← 0 تازمانیکه (k ≤ 4) دستورات 17 تا 18 را تکرار کن اگر ( answers(j , k) = ‘X’ ) آنگاه count ← count + 1 k ← k + 1 اگر ( count > 1) آنگاه grade ← grade – 1/3 درغیراینصورت اگر (count = 1) آنگاه اگر ( answers(j , correct(j) ) = ‘X’) grade ← grade + 1 درغیراینصورت grade ← grade – 1/3 j ← j + 1 چاپ کن "نمره این دانشجو برابر است با "، grade i ← i + 1 توقف کن