1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

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

شروع موضوع توسط hector2141 ‏15/10/12 در انجمن Pascal

  1. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,323
    تشکر شده:
    2,698
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    [​IMG]
    آرایه:

    آرایه یک نوع ساختمان داده است که تعدادی داده هم نوع در آن ذخیره می شوند. با استفاده از آرایه می توانیم برای مجموعه ای از داده ها ، نام یک متغیر ( مثلا 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عمل مقایسه می توانیم کلید را پیدا کنیم.