Session 10-Arrays.ppt

‫ساختمان داده ‪ :1‬آرایه‬
‫تهیه و تنظیم‪:‬‬
‫فاطمه قاسمی‬
‫دانشگاه صنعتی شریف – پاییز ‪86‬‬
‫‪1‬‬
‫مروری بر مطالب‬
‫‪‬‬
‫برای ذخیره کردن یک متغیر از نوع های ساده تنها از یک‬
‫سلول حافظه استفاده می شود‪.‬‬
‫‪‬‬
‫‪‬‬
‫نوع های ساده ‪Integer,real,char,boolean :‬‬
‫برای ذخیره کردن داده های وابسته باید از متغیرهای مجزا با‬
‫نام های مختلف استفاده کرد‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫مختصات یک نقطه ‪x,y :‬‬
‫مختصات ‪ 100‬نقطه ‪x1,y1,x2,y2,x3,…,x100,y100 :‬‬
‫؟ استفاده از ساختمان داده مرکب‬
‫‪2‬‬
‫آرایه‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫ساختمان داده ای است که تعدادی دادة هم نوع در آن ذخیره می‬
‫شود‪.‬‬
‫مجموعه ای از داده ها تحت یک نام مشترک استفاده می شوند‪.‬‬
‫می توان به تک تک اعضا دسترسی پیدا کرد و همانند‬
‫متغیرهای ساده مورد پردازش قرار داد‪.‬‬
‫‪‬‬
‫‪‬‬
‫برای دسترسی به هر یک از اعضای آرایه‪ ،‬از یک اندیس استفاده می‬
‫شود‪.‬‬
‫اندیس باید از نوع داده های قابل شمارش باشد‬
‫‪3‬‬
‫چگونگی تعریف یک آرایه‬
‫‪Var‬‬
‫; نوع داده ‪ ] of‬محدوده [ ‪ : Array‬نام آرایه‬
‫‪4‬‬
)‫چگونگی تعریف یک آرایه (ادامه‬
Var
a : Array [ 1 .. 100 ] of Integer ;
b : Array [ -10 .. 20 ] of Real;
x : Array [ 0 .. 10 ] of Boolean;
y : Array [ ‘a’ .. ‘z’ ] of Real;
5
‫چگونگی تعریف یک آرایه (ادامه)‬
‫نوع اندیس می تواند از انواع ‪ ،Boolean ،char‬نوع دادة‬
‫شمارشی و یا بازه ای از اعداد انتخاب شود‪.‬‬
‫‪‬‬
‫از نوع های ‪ real‬و ‪ Integer‬نمی توان به عنوان اندیس استفاده‬
‫کرد‪ .‬اما از بازه ای از اعداد صحیح می توان به عنوان اندیس استفاده‬
‫نمود‪.‬‬
‫‪ ‬برای هر یک از اندیس های آرایه‪ ،‬یک عنصر می توان در‬
‫نظر گرفت‪.‬‬
‫‪ ‬نوع داده همه عناصر یکسان است و در محل های پشت سر هم‬
‫در حافظه اصلی ذخیره می شوند‪.‬‬
‫‪6‬‬
‫دسترسی به اعضا‬
‫‪] :‬اندیس[نام آرایه‬
‫]‪a[100‬‬
‫]‪b[-9‬‬
‫]’‪x[‘x‬‬
‫‪‬‬
‫اندیس باید با نوعی که در قسمت تعیین نوع آرایه برای اندیس‬
‫تعیین شده سازگار باشد و در محدوده صدق کند‪.‬‬
‫‪7‬‬
)‫دسترسی به اعضا ( ادامه‬
Var
x : Array [1..5] of real;
sum : real;
Begin
writeln(x[1]);
x[4] := 25.6;
sun := x[2] +x[3];
x[2] := x[1+2]+x[1]/x[5];
End.
X[1]
X[2]
2.0
X[3]
12.5
28.6
8
X[4]
1.3
X[5]
54.4
‫خطاهای دسترسی‬
‫‪‬‬
‫‪Index expression out of bound‬‬
‫‪‬‬
‫‪‬‬
‫هنگامی رخ می دهد که اندیس دسترسی خارج از محدوده باشد‬
‫‪Index type is not compatible with declaration‬‬
‫‪‬‬
‫در صورتی که نوع داده عبارت‪ ،‬با اندیس همخوانی نداشته باشد‬
‫‪9‬‬
‫دسترسی ترتیبی‬
‫‪‬‬
‫می توان با تعریف و افزایش متغیری از نوع داده محدوده به‬
‫اعضای آرایه به ترتیب دسترسی پیدا کرد‪.‬‬
‫‪For i:=1 to n do‬‬
‫)]‪readln(x[i‬‬
‫‪10‬‬
‫بررسی مساوی بودن دو آرایه‬
Var
n : Integer;
x, y : array [ 1 .. 40 ] of Char;
Is_equal : Boolean;
Begin
…
...
Is_equal := True;
For n := 1 To 40 Do
If x[n] <> y[n] Then
begin
Is_equal := False;
break;
end;
If Is_equal Then Writeln ( ‘Equal‘)
Else Writeln ( ‘Not Equal‘);
End.
11
‫ رشته ای را دریافت کند و تعداد حروف‬: ‫مثال‬
‫تکراری آن را مشخص نماید (حروف کوچک و‬
)‫بزرگ فرقی با هم نداشته باشند‬
Var
s: string;
Num_chars : Array[‘A’..’Z’] of Integer; …
Begin
readln(s);
for i:=1 to length(s) do
Inc(Num_chars[upcase(s[i])]);
…
End
12
‫مثال‪ :‬لیستی از مختصات نقاط را دریافت کند و با‬
‫دریافت ’‪ ‘R‬آن ها را حول زاویه ای که از ورودی‬
‫دریافت می کند دوران دهد‪ ‘T’ ،‬آن ها را تحت‬
‫برداری که از ورودی دریافت می کند انتقال می‬
‫دهد و در نهایت با دریافت ’‪ ‘X‬مختصات نهایی را‬
‫‪Repeat‬‬
‫چاپ می کند‪.‬‬
‫;)‪readln(ch‬‬
‫;’‪Until upcase(ch)=‘D’ or upcase(ch)=‘R’ or upcase(ch)=‘X‬‬
‫‪Case ch of‬‬
‫‪‘D’,’d’ :‬‬
‫’‪‘R’,’r‬‬
‫;‪End‬‬
‫‪13‬‬
‫مثال ‪ :‬یک ماشین حساب ‪ 30‬رقمی که قادر به‬
‫انجام فقط جمع و تفریق است را شبیه سازی نمایید‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫دو عدد حداکثر ‪ 30‬رقمی را دریافت و ذخیره کند‬
‫دو عدد ذخیره شده را با یکدیگر جمع نماید‬
‫دو عدد ذخیره شده را از هم کم کند‬
‫‪14‬‬
‫ رقمی از ورودی‬30 ‫ یک عدد حداکثر‬: ‫مثال‬
‫دریافت کند و آن را ذخیره نماید‬
var
s: string;
num : array[1..30] of byte;
i: Integer;
begin
readln(s);
if length(s)>30 then exit;
for i:=length(s) downto 1 do
num1[length(s)-i+1] := ord(s[i])-ord('0');
for i:=1 to length(s) do
write(num[i]);
readln;
end.
15
‫ رقمی‬30 ‫ جمع دو عدد‬: ‫مثال‬
…
carry := 0;
for i:=1 to 30 do
begin
res[i] := (num1[i]+num2[i]+carry) mod 10;
carry := (num1[i]+num2[i]+carry) div 10;
end;
for i:=max+1 downto 1 do
write(res[i]);
16
‫ رقمی با فرض بزرگتر‬30 ‫ تفریق دو عدد‬: ‫مثال‬
‫بودن عدد اول‬
....
carry := 0;
for i:=1 to 30 do
begin
if (num1[i]-num2[i]-carry)<0 then
begin
res[i]:=(num1[i]+9-num2[i]);
carry:= 1;
end
else
begin
res[i] := num1[i]-num2[i]-carry;
carry := 0;
end;
end;
for i:=max downto 1 do
write(res[i]);
...
17
2 ‫ رقمی در مبنای‬n ‫ شمارنده‬: ‫مثال‬
Var
A : Array [1..6] of Integer;
Flag : boolean;
Begin
…
Inc(A[0]);
if (A[0]>1) then
for i:=0 to 5 do
if A[i]=0 then
begin
A[i] = 0; Inc(A[i+1]) …
18
‫ زیرمجموعه های ممکن یک مجموعه از‬: ‫مثال‬
‫کاراکتر را چاپ نماید‬
Const max = 100;
Var
chars : array [1..max] of char;
counter : array[1..max] of Integer; …
Begin
….
….
for i:=0 to length-1 do
if counter[i]=1 then write(chars[i]);
19
‫آرایه های ثابت‬
‫‪Const‬‬
‫= نوع داده ‪ ] of‬محدوده [ ‪ : Array‬نام آرایه‬
‫; ) مقدار آخر ‪ , … ,‬مقدار دوم ‪ ,‬مقدار اول (‬
‫مثال ‪:‬‬
‫‪Const‬‬
‫;) ‪a : Array [ 1 .. 4 ] of Integer = ( 2 , -5 , 17 , 0‬‬
‫;) ’?‘ ‪b : Array [ 0 .. 2 ] of Char = ( ‘a’ , ‘2’ ,‬‬
‫; ’?‪c : Array [ 0 .. 2 ] of Char = ‘a2‬‬
‫‪20‬‬
‫چاپ نام بر اساس شماره ردیف‬
Const
Name : Array [ 1 .. 5 ] of String = ( ‘Majedi’ ,
‘Rahnama’ , ‘Ganji’ , ‘Miran’ , ‘Nazari’ );
Var
n : Intger;
Begin
Readln ( n );
Writeln ( Name [ n ] );
End.
21
‫تعریف یک نوع داده‬
‫‪Type‬‬
‫; نوع داده جدید = نام دلخواه‬
‫‪Var‬‬
‫; همان نام دلخواه ‪ :‬نام متغیر‬
‫‪Type‬‬
‫; ‪Days = 1 .. 31‬‬
‫; ’‪Letters = ‘A’ .. ‘Z’ , ‘a’ .. ‘z‬‬
‫‪Var‬‬
‫;‪a, b : Days‬‬
‫;‪c : Letters‬‬
‫‪22‬‬
‫چند تابع بر روی ‪string‬‬
‫‪‬‬
‫)‪Upcase(s‬‬
‫‪‬‬
‫‪‬‬
‫حروف کوچک در رشته ورودی را به حروف بزرگ تبدیل می کند‪.‬‬
‫)‪Str (Integer or real, String‬‬
‫‪‬‬
‫یک نوع داده صحیح را به نوع داده رشته معادلش تبدیل می کند‪.‬‬
‫‪‬‬
‫‪‬‬
‫;)‪ Str(108765,s‬بعد از اجرا مقدار ‪ s‬برابر ’‪ ‘108765‬است‪.‬‬
‫)‪Val(String, Integer or real‬‬
‫‪‬‬
‫یک نوع داده رشته را به نوع داده صحیح با حقیقی معادلش تبدیل می‬
‫کند‬
‫‪23‬‬