close
دانلود فیلم
آموزش پاسکال بخش پنجم : آموزش کارکردن با آرایه ها در Pascal

آرایه:

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



تعریف نوع آرایه ها:

شکل استفاده:

Type
Array type = array [ subscript type] of element type ;

مثال:

Type
SmallArray = array [1. . 5] of char ;

85 67 33 95 88

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

Type
RealArray = array [1 . . 8] of Real ; { array type declarati}

Var
X : RealArray ; { Allocate storage for array X }

برای مراجعه به اولین عضو آرایه ، از X[1 ] (بصورت X اندیس 1 خوانده شود)، برای مراجعه به دومین عنصر از از X[2 ] و برای مراجعه به هشتمین عنصر از X[8 ] استفاده می کنیم.

خواندن و نمایش دادن یک آرایه:

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

Const
Maxitems = 8 ;
Type
IndexRange = 1 . . MaxItems ;
RealArray = array [ IndexRange ]of Real ;
Var
X : RealArray ; { array of data }
I : IndexRange ; {loop-control variable}
For I : = 1 to MaxItems do
Read ( X ) ;

مثال:برنامه جدولی از تفاضل ها

Program table ;
Uses wincrt ;
Const
MaxItems = 8 ; { number of data items }
Type
IndexRange = 1 . . MaxItems ;
RwalArray = array [IndexRange] of Real ;
Var
X : RealArray ; { array of data }
I : IndexRange ; { loop-control variable }
Average , { average value of data }
Sum : Real ; { sum of the data }
Begin { ShowDiff }
{Enter the data}.
Write ( ‘Enter’ , MaxItems : 1, ‘ numbers<’ );
For I : =1 to MaxItems do
Read ( X ) ;
{Compute the average value . }
Sum : = 0.0 ;
For I := 1 to MaxItems do
Sum := Sum + X[1]; { Add each element to sum }
Average := Sum / MaxItems ; { Get average value }
Writeln ( ‘The average value is ‘ , Average : 3 : 1 );Writeln ;
{Display the difference between each item and the average}
WriteLn ( ‘ Table of difference between X and average’ ) ;
WriteLn ( ‘I’ :4 , ‘X ’ :8 , ‘Difference’ : 14 ) ;
For I := 1 to MaxItems do
WritLn ( I :4, X :8:1, X _ Average :14:1 )
End { ShowDiff }

اجرای برنامه جدولی از تفاضل ها:

Enter 8 numbers > 16.0 12.0 6.0 8.0 2.5 12.0 14.0 -54.5
The average value is 2.0
Table
I X Difference
1 16.0 14.0
2 12.0 10.0
3 6.0 4.0
4 8.0 6.0
5 2.5 0.5
6 12.0 10.0
7 14.0 12.0
8 -54.5 -56.5

پارامترهای آرایه مقدار یا متغیر:

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

مقایسه دو آرایه:

Function SameArray (A , B : TestArray ) : Boolean ;
Var
I : Integer ; { array subscript }
Begin
I := 1 ; { Start with first pair }
{Test corresponding elements of arrays A and B}
while (I < MaxSize) and( A = B) do
{invariant :
1 <=
I <= MaxSize and
A = B for all prior values of I
}
I := I + 1 ; { Advance to next pair }
SamArray := (A ) = B ) { Define result }
End ; { SameArray }

رویه برای مرتب کردن عناصر آرایه:

Procedure SelectSort (var Scores {input / output} : ScoreArray ;
ClassLength { input }: Intege ) ;
Ver
Fill , { index of element to contaion next smallest score }
IndexofMin : Integer ;
Begin {SelectSort}
For fill := 1 to ClassLength-1 do
Begin
IndexOfMin := FindMin( Scores, Fill, ClassLength ) ;
{Exchange elements at Fill and IndexofMin}
if IndexOfMin <> Fill then
Switch ( Scores[IndexOfMin], Scores[Fill] )
End { for Fill }
End ; { SelectSort }

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

تعریف آرایه های فشرده:
شکل استفاده :

type string type = packed array [1 . . size] of char ;

مثال:

type string10 = packed array [1 . . 10] of char ;

تذکر :
نوع اندیس برای string type باید از1 شروع شود.

تذکر:
هنگام نمایش یک متغیر رشته ای ، می توان از یک قالب مشخص استفاده کرد.
دستورات :

Write ( ‘Hello’ , FirstName :4) ;
writeLn ( ‘ ! Good to see you. ‘ )
Hello A.C. ! Good to see you .

کاراکتر های یک رشته درست مثل هر متغیر از نوع char می توانند مورد استفاده قرار گیرند.

مثال 1 :
در صورتی که FirstName حاوی رشته ‘A.C. Jones ’ باشد،
دستورات

FirstName [1] := ‘D ’ ;
FirstName [6] := ‘B ;’

محتویات FirstName را به ‘D.C . Bones ’ تغییر می دهند.

تذکر:
یک عنصر رشته ای برای یک پارامتر متغیر از نوع Char نمی تواند ارسال شود. ولی یک کاراکتر مستقیما می تواند به عنوان عنصری ازیک متغیر رشته ای خوانده شود.

دستور :

Read ( FirstName [1 ] )

اولین کاراکتر موجود در رشته FirstName را با کاراکتر داده خوانده شده جایگزین می کند.

مثال :
برنامه نوشتن نامه فرم :

Const
StringLength = 40
Type
StringType = packed array [1 . . StringLength] of Char ;
Var
BodyFile , { input – body of letter }
Letter : Text ; { output – completed letter file }
begin { FormLetter }
Reset ( BodyFile ) ;
Rewrite ( Letter ) ;
WriteLn (Output , ‘writing job application letter. ‘ ) ;
Preamble ( Letter ) ;
WriteBody ( BodyFile, Letter ) ;
WriteLn ( Output, ‘Letter copied to output file. ‘ )
End . { FormLetter }

 

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

آرایه های چند بعدی:
شکل استفاده :

Type
Multidim = array [ subscript1 , subscript2 , . . . , subscriptn ]
Of element type ;
Type
Multidim = array [subscrip1] of array [ subscript2 ] . . .
Of array [subscript n] of element type ;

پردازش آرایه ها:
دو روش برای دستیابی به عناصر یک آرایه یک بعدی داریم:

دستیابی تصادفی

دستیابی ترتیبی

برای هر یک از آرایه دو بعدی یا یک جدول، سه روش دستیابی داریم:

دستیابی تصادفی

دستیابی سطر یه سطر

دستیابی ستون به ستون

 

روش دستیابی سطر به سطر یک آرایه:

For row_subscript . . . do . }{ Specify the row
For column_subscript . }. . . do { Access each column of row
Process Table {row_subscript , column_subscript}

روش دستیابی ستون به ستون یک آرایه:

For column_subscript . . . do [Specify the column]
For row_subscript . . . Do [Access each row of column]
Process Table [row_subscript , column_subscrip]

مقدار اولیه دادن به یک آرایه:

رویه، Initialize به هر عضو از پارامتر آرایه خود یعنی Sales مقدار اولیه Invalue را می دهد. این رویه به عناصر آرایه به روش سطر به سطر دستیابی می کند.

Procedure Initialize (var Sales { output }: SalesArray ;
InValue { input }: Real ; )
var
NextPerson : Pepole ; { Row subscript }
NextQuarter : Quarter; { Column subscript }
Begin { Initialize }
For NextPerson : = 1 to NumberSalesPeopel do
For NextQuarter := Fall to Summer do
Sales[NextPerson, NextQuarter] := InValue
End ; { Initialize

آرایه سه بعدی:
پاسکال تعداد ابعاد ممکن برای یک آرایه را محدود نمی کند، ولی بیشتر آرایه های با ابعاد دو و سه متداولتر هستند.
حال چند مثال جالب را حل می کنیم:

مثال1:
برنامه ای بنویسید که نمره ریاضی تعدادی از دانشجو را در آرایه ای ذخیره کند.سپس بیشترین و کمترین نمره و محل آن را در آرایه چاپ کند؟

Progam min_max ;
Uses wincrt ;
Var a:array [1..100] of real ;
Max,min:real ;
I, locmax,locmin,n:integer ;
Begin
Write ( 'please enter number of students:’ ) ;
Readln ( n ) ;
For i:= 1 to n do
Readln ( a ) ;
Max:= a[0] ; min:= a[0] ;
Locmax:=1 ; locmin:=1 ;
For i:=2 to n do
Begin
If ( a >max ) then
Begin
Max:=a ; locmax:=I ;
End ;
If a
Begin
Min:=a ; locmin:=I ;
End ;
End ;
Writeln ( 'max=',max,'position=' , locmax ) ;
Writeln ( 'min=',min,'position=' , locmin ) ;
End .

مثال2: هشت عدد را خوانده و در آرایه ای ذخیره کنید.سپس به روش حبابی آن را به صورت صعودی مرتب کرده و چاپ کنید؟

Program bubble_sort ;
Uses wincrt ;
Const n:=8 ;
Var
A:array [1..n] of integer ;
I,j,temp:integer ;
Begin
Write ( 'please enter 8 integer numbers:’ ) ;
For i:=1 to n do
Readln ( a ) ;
For j:=1 to n-1 do
For i:=1 to n-j do
If a >a[i+1] then
Begin
Temp:=a ;
A :=a[i+1] ;
A[i+1]:=temp ;
End ;
Writeln ( 'sorted numbers:’ ) ;
For i:= 1 to n do
Writeln ( 'a[',I,']=',a ) ;
End .

مثال3: هشت عدد را خوانده و در آرایه ای ذخیره کنید.سپس به روش انتخابی آن را به صورت صعودی مرتب کرده و چاپ کنید؟

Program selection_sort ;
Uses wincrt ;
Const n:=8 ;
Var
x:array [1..n] of integer ;
I,j,min,index :integer ;
Begin
Write ( 'please enter 8 integer numbers:’ ) ;
For i:=1 to n do
Readln ( a ) ;
For j:=1 to n-1 do
Begin
Min:=x ; index:=I ;
For j:=i+1 to n do
If x[j]
Begin
Min:=x[j] ;
Index:=j ;
End ;
X[index]:=x ;
X :=min ;
End ;
Writeln ( 'sorted numbers:’ ) ;
For i:= 1 to n do
Writeln ( 'a[',I,']=',a ) ;
End .

مثال 4 :فرض کنید آرایه x با n خانه از قبل مرتب باشد. متغیر k حاوی کلیدی است که می خواهیم دنبال آن بگردیم. متغیر های low,high,mid از نوع صحیح می باشند. تکه برنامه زیر آرایه x را جهت یافتن k جستجو می کند . (جستجوی دودویی)

Low:=1 ; high:=n ;
While low <=high do
Begin
Mid:=( low+high ) div 2 ;
If k
High:=mid-1
Else
If k >x[mid] then
Low:=mid+1
Else
Begin
Write( 'the number',k,'exist in array ‘) ;
Halt ;
End ;
End ;
Write( 'the number',k,'not exist in array ‘ ) ;

نکته:در روش جستجوی دودویی ، در بدترین حالت با [ logn ]+1عمل مقایسه می توانیم کلید را پیدا کنیم.



لینک کوتاه پست
مطالب مرتبط با پست جاری
  • نکات مهم
    1- لطفا نظر خود را با زبان فارسی بیان کنید
    2- رایتم نظرات اسپم و تبلیغی شما را تایید نمی کند
    3- لطفا نظرات شما بدون ابهام و واضح باشد
  • نام
    ایمیل (منتشر نمی‌شود) (لازم)
    وبسایت
    :):(;):D;)):X:?:P:*=((:O@};-:B/:):S
    نظر خصوصی
    مشخصات شما ذخیره شود ؟[حذف مشخصات] [شکلک ها]
    کد امنیتی
به کانال تلگرام سایت ما بپیوندید