مبانی کامپیوتر و برنامه سازی فصل چهارم : آرایه ها مدرس : نگین معروفی 4 متغیرهای اندیسدار یا آرایه ها در مثالهایی که در.
Download ReportTranscript مبانی کامپیوتر و برنامه سازی فصل چهارم : آرایه ها مدرس : نگین معروفی 4 متغیرهای اندیسدار یا آرایه ها در مثالهایی که در.
Slide 1
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 2
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 3
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 4
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 5
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 6
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 7
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 8
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 9
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 10
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 11
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 12
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 13
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 14
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 15
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 16
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 17
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 18
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 19
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 20
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 21
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 22
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 23
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 24
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 2
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 3
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 4
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 5
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 6
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 7
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 8
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 9
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 10
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 11
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 12
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 13
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 14
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 15
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 16
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 17
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 18
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 19
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 20
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 21
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 22
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 23
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1
Slide 24
مبانی کامپیوتر و برنامه سازی
فصل چهارم :آرایه ها
مدرس :نگین معروفی
4متغیرهای اندیسدار یا آرایه ها
در مثالهایی که در فصل قبل بیان گردید ،از متغیرهای معمولی استفاده گردید.
اما گاهی نیاز به تعداد زیادی متغیر برای نگاهداری داده ها داریم .درچنین
مواردی نه تنها برای نامگذاری این متغیرها دچار مشکل می شویم ،بلکه
دسترسی به تک تک آنها نیز مشکل است.
مثال ) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو
را بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس
بیشتر است را چاپ کند.
برای حل این مثال ابتدا باید مشخصات و معدل کلیه دانشجویان دریافت شود تا
بتوانیم میانگین معدل های آنان را محاسبه کنیم .سپس باید معدل تک تک
دانشجویان با میانگین کالس مقایسه گردد .مسلما نمی توانیم مجددا از کاربر
بخواهیم که همان اطالعات قبلی را مجددا وارد کند ،بلکه باید از قبل آنها را در
درون متغیرهایی ذخیره کرده باشیم تا اکنون بتوانیم مقایسه را انجام دهیم.
برای اینکار نیاز به تعدادی متغیر (به تعداد دانشجویان مثال 100عدد) داریم که
ما را دچار 2مشکل اساسی می کند :
این متغیرها را چگونه نامگذاری کنیم ؟
بر فرض نامگذاری متغیرها برطبق یک روش خاص ،چگونه تک تک آنها را با میانگین
کل مقایسه کنیم؟ آیا باید برای مقایسه هر کدام یک دستور مجزا بنویسیم ؟
4-1آرایه های یک بعدی
تعریف آرایه :مجموعه ای از داده های همنوع است که تحت یک نام
مشترک ذخیره می گردند.
برای دسترسی به هریک از اعضا یا عناصر آرایه از نام آرایه بعالوه یک
اندیس استفاده می شود .بنابراین هر عنصر آرایه درحقیقت یک متغیر
مستقل از همان نوع مورد نظر است.
یک آرایه پیش از آنکه استفاده گردد باید اعالن شود .اعالن آرایه شامل نام
آرایه و اندازه آن است .عناصر آرایه برای سهولت در دسترسی (معموال) در
خانه های پشت سرهم حافظه ذخیره می گردند.
مثال) آرایه Aرا با 100عضو درنظر بگیر
.....
.....
)A(100
)A(i
)A(1) A(2) A(3) A(4
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
مثال) الگوریتمی بنویسید که شماره دانشجویی ،نام و معدل تعدادی دانشجو را
بخواند و مشخصات دانشجویانی را که معدل آنها از میانگین معدل کالس بیشتر
است را چاپ کند
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
توقف کن
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
الگوریتمی بنویسید که تعدادی عدد را دریافت و سپس ابتدا اعداد مثبت و سپس اعداد منفی را بطور جداگانه چاپ
کند.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که دو مجموعه از اعداد را خوانده و در دو آرایه قرار دهد .سپس اشتراک آن دو را محاسبه و در
یک آرایه دیگر قرار دهد .در پایان اشتراک حاصل را چاپ کند.
n (1و mرا بخوان
(2آرایه Aرا با nعنصر و آرایه Bرا با mعنصر در نظر بگیر.
(3آرایه Cرا با ) min(n,mعنصر درنظر بگیر
(4آرایه های Aبا nعنصر و Bبا mعنصر را بخوان (البته نیاز به حلقه دارد)
aCount ← 1 (5و cCount ← 0
(6تا زمانیکه ( ) aCount ≤ nدستورات 7تا 11را تکرار کن
bCount ← 1 (7و sw ← 1
(8تازمانیکه ) ) bCount ≤ m and sw = 1دستورات 9تا 10را تکرار کن
(9اگر ) ) ( A(aCount) = B(bCountآنگاه
cCount ← cCount + 1و ) C(cCount) ← A(aCountو sw ← 0
bCount ← bCount + 1 (10
aCount ← aCount + 1 (11
(12چاپ کن "اشتراک دو مجموعه برابر است با ":
i ← 1 (13
(14تازمانیکه ( ) i ≤ cCountدستورات 15تا 16را تکرار کن
C(i) (15را چاپ کن
i ← i + 1 (16
(17توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم اشتراک
C
23
10
35
17
A
B
cCount
19
35
23
33
17
21
10
bCount
23
45
10
35
8
17
26
12
aCount
4-1آرایه های یک بعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
(21
(22
الگوریتمی مثال قبل را برای اجتماع دو مجموعه تکرار کنید.
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
توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست را گرفته و پس از حذف اعداد تکراری آن ،حاصل را
در یک لیست دیگر قرار دهد.
n (1را بخوان
(2آرایه Aو Bرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان
B(1) ← A(1) (4
i ← 2 (5و k ← 1
(6تا زمانیکه ( ) i ≤ nدستورات 7تا 11را تکرار کن
j ← 1 (7
(8تازمانیکه ( ( ) j ≤ k and A)i( ≠ B)jدستور 9را تکرار کن
j ← j + 1 (9
(10اگر ) ( j > kآنگاه
k ← k + 1و )B(k) ← A(i
i ← i + 1(11
(12لیست Bرا با kعضو چاپ کن (نیاز به حلقه دارد)
(13توقف کن
4-1آرایه های یک بعدی
الگوریتم مثال قبل را بگونه ای تغییر دهید که عملیات حذف داده های تکراری را درخود آرایه
اصلی (بدون کمک آرایه دیگر) انجام دهد.
n (1را بخوان
(2لیست Aرا با nعنصر در نظر بگیر
(3لیست Aرا با nعنصر بخوان (نیاز به حلقه دارد)
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 9را تکرار کن
j ← i + 1 (6
(7تازمانیکه ( ) j ≤ nدستور 8را تکرار کن
(8اگر ) ) ( A(i) = A(jآنگاه
) A(j) ← A(nو n ← n - 1
i ← i + 1 (9
(10لیست Aرا با nعضو چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد و یک عدد را از
کاربر دریافت و سپس بدنبال داده در لیست جستجو کند و آن را حذف نماید.
n (1را بخوان
(2آرایه Aرا با nعنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← 1 (5
(6تازمانیکه ( ( ) i ≤ n and x≠A)iدستور 7را تکرار کن
i ← i + 1 (7
(8اگر ) ( i > nچاپ کن "عدد پیدا نشد" و توقف کن
(9تازمانیکه ) ( i < nدستورات 10تا 11را تکرار کن
A(i) ← A(i + 1) (10
i ← i + 1(11
n ← n -1(12
(13آرایه Aرا با nعضو چاپ کن
(14توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم حذف از لیست مرتب
A
n=9
10
x = 38
12
18
21
35
38
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک لیست مرتب بصورت صعودی از اعداد را از کاربر
دریافت و سپس با دریافت یک عدد جدید از کاربر آن را درمکان مناسب لیست
درج کند بطوریکه ترتیب حفظ شود.
n (1را بخوان
(2آرایه Aرا با n + 1عنصر درنظر بگیر
(3آرایه Aرا با nعنصر بخوان (بصورت مرتب شده)
x (4را بخوان
i ← n (5
(6تازمانیکه ) ) ) i ≥ 1 and x < A(iدستورات 7تا 8را تکرار کن
A(i + 1) ← A(i) (7
i ← i – 1 (8
A(i + 1) ← x (9
n ← n + 1(10
(11آرایه Aرا با nعضو چاپ کن
(12توقف کن
4-1آرایه های یک بعدی
آزمایش الگوریتم درج در لیست مرتب
A
n = 10
11
x = 39
12
18
21
35
38
39
42
44
48
52
58
i
4-1آرایه های یک بعدی
الگوریتمی بنویسید که یک عدد را دریافت و عددی که بیشترین تکرار را دارد چاپ کند.
n (1را بخوان
(2آرایه های Aو swرا با nعضو درنظر بگیر
(3آرایه Aرا با nعضو بخوان
(4تمام عناصر آرایه swرا برابر 0قرار بده
mod ← 0 (5و modNo ← 0
i ← 1 (6
(7تازمانیکه ( ) i ≤ nدستورات 7تا 8را تکرار کن
(8اگر ) ( sw(i) = 0آنگاه
sw(i) ← 1 .a
j ← i + 1 .bو sum ← 0
.cتازمانیکه ( ) j ≤ nدستورات dتا eرا تکرار کن
.dاگر ) ) ( A(i) = A(jآنگاه
sum ← sum + 1و sw(j) ← 1
j ← j + 1 .e
.fاگر ) ( sum > modNoآنگاه
) mod ← A(iو modNo ← sum
i ← i + 1 (9
mod (10و modNoرا چاپ کن
(11توقف کن
4-1آرایه های یک بعدی
الگوریتمی بنویسید که برای تعداد دانشجو ،کد رشته (از 1تا )15را خوانده
و سپس تعداد دانشجویان هررشته را به تفکیک چاپ کند.
(1آرایه countرا با 15عضو درنظر بگیر
(2تمام عناصر آرایه countرا برابر 0قرار بده
n (3را بخوان
i ← 1 (4
(5تازمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
code (6را بخوان
count(code) ← count(code) + 1 (7
i ← i + 1 (8
(9آرایه countرا با 15عضو چاپ کن
(10توقف کن
4-2آرایه های چندبعدی
مسائلی که تاکنون حل شدند نیاز به آرایه های یک بعدی داشتند .هر
عنصر از این آرایه ها تنها با یک اندیس مشخص می گردد.
اما گاهی در مسائل پیچیده تر نیاز به آرایه هایی است که هر عضو آنها نیاز
به بیش از یک اندیس دارد ،که به آنها آرایه های چند بعدی گفته می شود.
چنانچه هر عنصر آرایه به 2اندیس نیاز داشته باشد ،به آن آرایه دو بعدی
می گوییم.
برای تعریف یک آرایه دوبعدی باید تعداد سطرها و ستونهای آن را مشخص
کنیم .معموال یک آرایه دو بعدی بصورت m × nاعالن می گردد که mتعداد
سطرها و nتعداد ستونها است.
4-2آرایه های چندبعدی
بعنوان مثال چنانچه آرایه Aرا بعنوان یک آرایه دوبعدی به ابعاد 5 × 8تعریف
کنیم ،آنگاه داریم :
ستون
8
7
6
5
4
3
2
1
1
)A(2,7
2
3
4
5
)A(3,4
سطر
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
الگوریتمی بنویسید که برای تعدادی دانشجو ،شماره دانشجویی و کد رشته (از 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
توقف کن
4-2آرایه های چندبعدی
50موضوع مختلف را به رای گذاشته ایم و هرکس می تواند آرای خود را
بشرح زیر اعالم کند:
-3ممتنع -4بی اطالع
-2مخالف
-1موافق
الگوریتمی بنویسید که تعداد افراد رای دهنده را دریافت و سپس پس از
دریافت آرای هریک از آنان برای هر 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چاپ کن (نیاز به حلقه دارد)
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که عناصر آرایه 4×5را خوانده ،بزرگترین عنصر هر
سطر را پیدا کرده ،به همراه شماره سطر در خروجی چاپ می کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
.11
.12
آرایه Aرا به ابعاد 4×5در نظر بگیر
آرایه Aرا بخوان
i←1
تازمانیکه ) ) i ≤ 4دستورات 5تا 12را تکرار کن
)M ← A(i,j
j←2
تازمانیکه ) )j ≤ 5دستورات 8تا 9را تکرار کن
اگر ) M > A(i,1آنگاه )M ← A(i,j
j←j+1
Mو iرا چاپ کن
i←i+1
توقف کن
4-2آرایه های چندبعدی
الگوریتمی بنویسید که جدول ضرب اعداد 1تا 10را تولید کرده ،در جدولی
قرار دهد وآنها را چاپ کند.
.1
.2
.3
.4
.5
.6
.7
.8
.9
.10
آرایه Aرا با ابعاد 10 × 10در نظر بگیر
i←1
تازمانیکه ) ) i ≤ 10دستورات 3تا 10را تکرار کن
j←1
تازمانیکه ) )j ≤ 10دستورات 6تا 8را تکرار کن
M(i,j) ← i * j
) M(i,jرا چاپ کن
j←j+1
i←i+1
توقف کن
4-2آرایه های چندبعدی
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
(20
الگوریتمی بنویسید که دو ماتریس را از کاربر دریافت و حاصلضرب آن دو را محاسبه و چاپ کند.
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چاپ کن
توقف کن
4-2آرایه های چندبعدی
دریک آزمون دانشجویان باید به 20سوال 4گزینه ای جواب بدهند .الگوریتمی بنویسید که ابتدا جواب درست سواالت را دریافت و
سپس برای تعدادی دانشجو برگه پاسخنامه را دریافت و نمره آنها را محاسبه و چاپ کند .پاسخنامه ها در یک آرایه دوبعدی 20
× 4است که در جاهایی که دانشجو عالمت زده است کاراکتر Xقرار گرفته است و سایر مکانها خالی است .هر پاسخ غلط ⅓ نمره
منفی دارد.
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
(18
(19
آرایه 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/3
j←j+1
چاپ کن "نمره این دانشجو برابر است با "grade ،
i←i+1
توقف کن
(20
(21
(22
(23
grade ← grade + 1