PDA

توجه ! این یک نسخه آرشیو شده می باشد و در این حالت شما عکسی را مشاهده نمی کنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : آموزش پاسکال - نكاتي در مورد آرایه ها و فايل ها



TAHA
10-01-2009, 05:37 PM
مقایسه دو آرایه:



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 } : Integer) ;
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, 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 ;

پردازش آرایه ها:

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

1.دستیابی تصادفی
2.دستیابی ترتیبی

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

1.دستیابی تصادفی
2.دستیابی سطر یه سطر
3.دستیابی ستون به ستون

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



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 then
Begin
Temp:=a ;
A:=a ;
A:=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:=x ;
X:=min ;
End;
Writeln ( 'sorted numbers:' ) ;
For i:= 1 to n do
Writeln ( 'a[',I,']=',a ) ;
End .
[I][I][I][I][I]
مثال 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عمل مقایسه می توانیم کلید را پیدا کنیم.

فایل های متن ، فایل های داده و فایل های خروجی:

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

فایل داده:
یک فایل داده (یا فایل ورودی ) فایلی است که شامل اطلاعات ورودی برنامه است یک فایل داده می تواند از نوع متن دودویی باشد .

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


ساختار اطلاعات در یک فایل متن:

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

ساختار منطقی یک فایل متن:

از نظر منطقی فایل متن شامل خطوطی از کاراکتر ها است که این خطوط توسط کاراکتر< eoln> از یکدیگر جدا می شوند . با استفاده از یک ویراستار یا یک فرمان سیستم عامل (نظیر فرمان زیر ) می توان یک فایل متن را روی صفحه نمایش مشاهده کرد.



> type filename

خواندن اطلاعات از فایل متن:

می توان از رویه readln برای خواندن داده از یک فایل متن استفاده کرد. برنامه ای در نظر بگیرید که شامل تعریف متغیرهای زیر است :



Var
Salary : real ; { input – a salary }
First . last ; char; { input – initials }
Separator : char ; { input – blank between salary and first }
Mydata :Text ; { a text file used as data file }

عبارت :
Readln ( mydata, Salary, Separator, First, last )

رویه :read

رویه ورودی دیگر ، رویه read است که کار آن نیز خواندن اطلاعات از صفحه کلید یا فایل است . بر خلاف readln ، رویه read تنها کاراکتر های داده ای که در لیست ورودی اش مشخص شده را می خواند.
مثال :


دستورات :
Read ( mydata , salary ); { read salary from mydata. }
Read ( mydata , separator ) { read the balank character }
Read ( mydata , first , last ) { read initials from mydata }
Readln ( mydata ) { skip past < eoln > character in mydata. }

نتیجه یکسانی با دستور زیر دارند.



Readln ( mydata , salary , separator , first , last )

نوشتن نتایج در فایل متن :

برای نوشتن نتایج در فایل های متن از رویه های write و writeln استفاده می کنیم .این رویه ها درست مانند همان رویه های چاپ نتایج روی صفحه نمایش هستند اگر اولین پارامتر در فراخوانی write یا writeln ، متغیری از نوع text باشد خروجی به جای صفحه نمایش به فایل فرستاده می شود .

رويه هاي write , writeln:

شكل استفاده :



Write ( outfile , output list )
Writeln ( outfile , output list )

مثال :

Write ( myresult , salary )
Writeln ( myresult , hours : 3 :1 , ‘ s’ , salary :4 :2 )

نامهاي داخلي و خارجي فايل:

براي اینکه پاسكال قادر به بازيابي يك فايل ذخيره شده روي ديسك باشد ، بايد نام دايركتوري ديسك كه فايل در آنجا قرار مي گيرد را داشته باشيد.

رويه Reset:

شكل استفاده :



Reset ( infile )

مثال :



Reset ( mydata )

فايل mydata را به عنوان ورودي برنامه آماده مي كندو نشانگر موقعيت فايل نيز به ابتداي فايل منتقل مي شود. نشانگر موقعيت فايل همواره به كاراكتر بعدي كه قرار است پردازش شود ، اشاره مي كند.بعد از عمل reset ، كاراكتري كه خوانده مي شود ، اولين كاراكتر فايل است.

نکته :

عمل reset قبل از اينكه كاراكتري از فايل mydataخوانده شود ، انجام مي گيرد و اگر فايل mydata قبلاروي ديسك ذخيره نشده باشد ، اين عمل ناموفق است ، براي خواندن و پردازش فايل در بار دوم و در همان برنامه ، عمل reset بايد انجام شود.



رويه rewrite:

شكل استفاده :
Rewrite ( outfile )

مثال :

Rewrite( outdata )

فايل outdata را براي خروجي آماده مي كند .اين فايل در ابتدا خالي است.كليه داده هايي كه قبلا در فايل outdata ذخيره شده اند، از بين مي روند.


تمام فايل ها به طور اتوماتيك با كاراكتر< eof > خاتمه مي يابند.و تابع از پیش ساخته شده EOF در پاسكال (مخفف ENDOF FILE ׂ( تست مي كند كه آيا كاراكتر بعدي فايل eof است يا خير؟

نکته :

در صورتي كه كليه كاراكتر هاي فايل infile پردازش شده باشند (يعني كاراكتر بعدي ، كاراكتر < eof > باشد)، true را بر مي گرداند و اگر هنوز کاراکتر هایی برای خواندن وجود داشته باشند false را بر می گرداند .



تست انتهای خط : تابع EOLN :

شكل استفاده :
EOLN( filename )

مثال :
EOLN ( infile )



پاسکال تابعی به نام EOLN ( END OF LINE )دارد که قادر به تشخیص کاراکتر < eoln > است. در صورتی که کاراکتر بعدی < eoln > باشد , تابع EOLN مقدار true و در غیر این صورت false را بر می گرداند.
نکته :
1.اگر کاراکتر بعدی فایل , < eoln > باشد ,نتیجه تابع true و در غیر این صورت false خواهد بود .


2.اگر file name حذف شود ,فایل سیستم input (صفحه کلید ) ، فایل ورودی است. در پاسکال استاندارد , فراخوانی تابع EOLN در صورتی که EOF( filename ) ، True باشد ،خطا است.

استفاده از فایل های متن:

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

Assign( ):

این تابع شناسه فایل را به فایل خارجی منسوب می کند در اگر فایل وجود نداشته باشد آن را می سازد.
نحوه کاربرد: .
نکته:
1.اگر قبل از خاتمه برنامه تمامی فایل ها را نبندید ،هیچ کدام از اعمالی که بر فایل اعمال نموده اید ،اجرا نخواهد شد.
2.قبل از این که بتوانید بین عملیات ها سوئیچ کنید، باید فایل را ببندید، به عنوان نمونه ،بعد از نوشتن اقلامی در فایل، باید آن را ببندید و مجددا قبل
ازخواندن اقلام دوباره آن را باز کنید.



نحوه کاربرد:
Close( file_name ) ;
دستیابی تصادفی به فایل ها-seek( ):

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



نحوه کاربرد:
Seek( file_name,position_number ) ;


حال چند مثال جالب از فایل ها را حل میکنیم:

مثال1.برنامه ای بنویسید که نام،تاریخ تولد، شماره تلفن فردی را گرفته و در فایلی ذخیره کند؟


Program file_ex ;
Uses wincrt ;
Type rec_type=record
Name:string ;
Date_of_brith:string ;
Telephone_number:string ;
End ;
Var
My_file:file of rec_type ;
Rec_var: rec_type ;
Ch:char ;
Begin
Clrscr ;
Assign( my_file,'file_1.dat' ) ;
Rewrite ( my_file ) ;
Repeat
Write( 'enter a name:' ) ;
Readln( rec_var.name ) ;
Write( 'enter a date of brith:' );
Readln( rec_var.date_of_brith ) ;
Write( 'enter a telephone number:' ) ;
Readln( rec_var.telephone_number ) ;
Write( my_file,rec_var ) ;
Write( 'continue? Reply y/n: ' ) ;
Readln( ch ) ;
Until ( ch='n') or(ch='N') ;
Close( my_file ) ;
End .

مثال 2. برنامه بالا را برای افزودن رکورد جدید تغییر دهید؟



Program file_ex ;
Uses wincrt ;
Type rec_type=record
Name:string ;
Date_of_brith:string ;
Telephone_number:string ;
End ;
Var
My_file:file of rec_type ;
Rec_var: rec_type ;
Ch:char ;
Begin
Clrscr ;
Assign( my_file,'file_1.dat' ) ;
Reset ( my_file ) ;
Seek( my_file,filesize( my_file) ) ;
Write( 'enter a name:' ) ;
Readln( rec_var.name ) ;
Write( 'enter a date of brith:' );
Readln( rec_var.date_of_brith ) ;
Write( 'enter a telephone number:' ) ;
Readln( rec_var.telephone_number ) ;
Write( my_file,rec_var ) ;
Close( my_file ) ;
End .

مثال3. برنامه ای کامل برای جستجوی قلم داده ای خاص در درون فایل بنویسید؟



Program file_ex ;
Uses wincrt ;
Type rec_type=record
Name:string ;
Date_of_brith:string ;
Telephone_number:string ;
End ;
Var
My_file:file of rec_type ;
Rec_var: rec_type ;
Sought_name: string ;
Found:Boolean ;
Found_ind, counter:integer ;
Begin
Clrscr ;
Assign( my_file,'file_1.dat' ) ;
Reset ( my_file ) ;
Counter:=0 ;
Write( 'enter a name to be Found :' ) ;
Readln (Sought_name ) ;
Repeat
Seek( my_file,counter) ;
Read(my_file,rec_var ) ;
Found:=rec_var.name= Sought_name ;
If Found then