رکوردها
تاکنون توانستیم اطلاعات مورد نیاز خود را در متغیرهای معمولی مثل sum,y,x وآرایه ها مثل m[1..20] ذخیره کنیم و آنها را پردازش کنیم.
آرایه، نامی برای مجموعه ای از داده های همنوع بود، مثل آرایه ای از 50 عدد اعشاری
حال اگر بخواهیم مجموعه ای داده های غیر همنوع داشته باشیم، استفاده از رکورد ممکن نیست.
می خواهیم اطلاعات مربوط به یک دانشجو را که شامل نام دانشجو(رشته ای) معدل(اعشاری)شماره دانشجویی(صحیح) جنسیت(منطقی یا صحیح)است، تحت یک نام تعریف و استفاده کنیم .برای این کار از ساختمان داده ی جدیدی به نام رکورد استفاده می کنیم.
رکورد: مجموعه ای از عناصر همنوع یا غیر همنوع است.
نکته: می توانیم آرایه ای تعریف کنیم که عناصر آن رکورد باشد.
تعریف نوع رکورد
برای استفاده از ساختمان داده رکورد، ابتدا باید نوع رکورد را ایجاد کرد و سپس متیرهایی از نوع رکورد تعریف و استفاده کرد.
فیلد: هر نوع رکورد اجزایی به نام فیلد دارد.
برای تعریف رکورد به این صورت می نویسیم:
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
type نام نوع رکورد= record
نوع:فیلد1;
...
nنوع:فیلد;
end;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
نام نوع رکورد از قانون نامگذاری برای سایر شناسه ها تبعیت می کند.
نکته: تعریف نوع رکورد با record شروع می شود و با end خاتمه می یابد.
مثال:
Name : نام دانشجو 200 کاراکتر
Id : شماره دانشجویی عددی صحیح
Ave : معدل دانشجو عددی اعشاری
نام نوع رکورد را student در نظر گرفتیم.
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
type
student = record
name : string[20];
id : integer;
ave : real;
end;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
با این دستورات نوع رکوردی با نام student ایجاد شد که فیلدهای آن عبارتند از : ave,id,name
تعریف متغیر رکورد
برای تعریف متیر نوع رکورد باید اینگونه نوشت:
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
var نوع رکورد : متغیر رکورد ;
var st : student;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
نکته: متغیر رکورد مثل متغیرهای معمولی نامگذاری می شود و نوع رکورد باید از قبل تعریف شده باشد.
بدین ترتیب اجزای st عبارتند از : ave,id,name
نکته: برای تعریف چند متغیر از نوع رکورد باید آنها را با کاما از هم جدا کرد.
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
var nbsp; st1,st2,st3 :student;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
دسترسی به فیلدهای رکورد
برای دسترسی به اجزای رکورد باید به این صورت نوشت:
نام فیلد.متغیر نوع رکورد
بدین ترتیب برای دسترسی به اجزای متغیر st که قبلا از نوع student تعریف شد، اینچنین می نویسیم:
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
st.name نام دانشجو
st.id شماره دانشجویی
st.ave مدل دانشجو
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
انتساب رکوردها
متغیرهای رکوردی که از یک نوع باشند، مثل متغیرهای معمولی می توانند به یکدیگر نسبت داده شوند.
مثال: متغیرهای s1,s2 را از نوع student تعریف کرده، پس از مقدار دادن به متغیر s1 آنرا به s2 نسبت می دهیم:
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
var s1,s2:student;
s1.name='ali';
s1.id=1025;
s1.ave-15.5;
s2:=s1;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
با دستور انتساب s2:=s1 محتویات هر یک از فیلدهای متغیر s1 در فیلدهای متناظر آن در s2 قرار می گیرد.
پس s2.name برابر ali و همینجور تا آخر ...
مثال: برنامه ای که معدل دانشجو را می گیرد و دانشجویی که بیشترین معدل را دارد به خروجی می دهد.
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
program iuss;
uses crt;
type
student=record
name:string[20];
no:integer;
ave:real;
end;
var st,maxst:student;
n,i:integer;
begin{iuss{
clrscr;
maxst.ave:=0;
write('Enter number of students:');
readln(n);
for i:=1 to n do
begin
write('stno,ave,name for student',i,':'):
readln(st.no,st.ave,st.name);
if st.ave>maxst.ave then
maxst := st;
end;{for}
writeln('student with maximum average is:');
write('name is:',maxst.name,',ave=',maxst.ave: 5 : 2);
write(',stno=',maxst.no);
end.
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
رکوردها به عنوان پارامتر زیر برنامه
هر یک از فیلدها رکورد یا ک رکورد را می توان به عنوان پارامتر به زر برنام ها فرستاد و در زیر برنامه ها از آنها استفاده کرد.
نکته: انتقال هر یک از فیلدهای رکورد مانند متغیرهای معمولی انجام می شود.
نکته: برای انتقال کلی رکورد، باید نام متغیر رکور به عنوان پارامتر باشد و متغیر مجازی نیز باید از نوع همان رکورد تعریف شود.
مثال: دو عدد موهومی را می خواند و مجموع آنها را محاسبه می کند و به خروجی می دهد.
نکته: عدد موهومی به صورت a+b√-1 است ک قسمت a را حقیقی و قسمت b را وهومی گویند.
در مجموع اعداد موهوی، قسمتهای قیقی ا هم و قسمتهای غیر حقیقی با هم جمع می شوند.
حال، زیر برنامه readcom، عدد موهومی را خوانده و به برنامه اصلی تحول می دهد. برنامه اصلی دوبا زیر برنامه را فراخوانی می کند تا دو عدد موهومی خوانده شوند و سپس مجموع آنها را محاسبه کرده و به خروجی می برد. هدفاز ای برنامه، آشنایی با انتقال رکورد ها به زیر برنامه است.
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
program iuss;
uses crt;
type
complex=record
realp:real;
unrealp:real;
end;
var com1,com2,sum:complex;
{**************************}
procedure readcom(var x: complex(;
begin{eadcom{
write('Enter real part,unreal part:'(;
readln(x.realp,x.unrealp(;
end;
{**************************}
begin{iuss{
clrscr;
readcom(com1(;
readcom(com2(;
sum.realp:=com1.realp+com2.realp;
sum.unrealp:=com1.unrealp+com2.unrealp;
write('sum.realp=',sum.realp: 5 : 2,' sum.unrealp=',sum.unrealp : 5 : 2(
end.
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
دستور with
یادآوری: برای استفاده از فیلدهای رکورد، باید نام متغیر رکورد را به همراه نام فیلدی که با نقطه از هم جدا شده اند، به کار برد.
حال اینکار مخصوصا در مواردی که تعداد فیلدهای رکورد زیاد باشد خسته کننده و ضد حال است با استفاده از دستور with ما می توانیم کاری کنیم که هنگام استفاده از فیلدهای رکورد، نام متغیر رکورد را بی خیال شویم. اینگونه:
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
with متغیر رکورد do
begin
....
end;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
نکته:متغیر رکورد در اینجا، متغیری است که ما می خواهیم با فلدهای آن کار کنیم. که اینکار هایی که می خواهیم انجام دهیم با begin شروع با end به پایان می رسد.
نکته: چنانچه بعد از with فقط یک دستور بیاید، نیاز به begin و end نیست.
مثال:
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
type
student = record
name:string[20];
id:integer;
un:integer;
end;
var st:student;
with st do
readln(id,un,name);
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
برای خواندن فیلدهای st بدون استاده از دستور with به این صورت می نویسیم:
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
readln (st.id ,s.unit ,st.name);
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
همانطور که می بینید، استفاده از with کار کردن با فیلدهای رکورد را آسانتر می کند.
آرایه ای از رکورد
اگر اعضای آرایه ای، رکورد باشند، آن آرایه را آرایه ای از رکورد می گویند.
مثلا: فرض می کنیم تعداد دانشجویان کلاسی 100 نفر است و ما می خواهیم مشخصات آنها را نگهداری کنیم.برای این کار باید مشخصات آنها را به صورت رکورد تعریف کنیم و آرایه ای 100 عنصری از این رکورد ایجاد کنیم.
Name : نام دانشجو
Stno : شماره دانشجویی
Age : سن دانشجو
Un : تعداد واحد
Ave : معدل دانشجو
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
type
student=record
name:string[20];
stno:integer;
age:integer;
un:integer;
ave:real;
end;
starray=array[1..100] of student;
var
st:starray;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
در این دستورات،ابتدا نوع رکورد student تعریف شد و سپس نع آرایه starray از نوع student و با طول 100 تعریف شد و متغیر st از نوع آرایه starray تعریف گردید.
مفهوم منو
لیستی از انتخابهاست که مقابل کاربر قرار می گیرد و کاربر برنامه می تواند بر حسب نیاز، یکی از آنها را استفاده کند تا کار خاصی صورت گیرد.
گزینه: به هر یک از انخابهای منو گویند.
نکته: برنامه باید بر اساس انتخاب کاربر، عمل خاصی را انجام دهد.
مثال: برنامه ای که نام،شماره،جنسیت،سن،تعداد درس ترم،نمره،واحد هر درس دانشجویان کلاسی را خوانده، معدل دانشجو را محاسبه و در آرایه ای ذخیره کند.
تعداد دانشجو را 5 و تعداد درس هر دانشجو را m در نظر می گیریم.
::: دانلود :::
رکوردهای تو در تو
هر یک از یلدهای رکورد، خودشان می توانند رکورد باشند و در نتیجه، رکوردهای تو در تو را به وجود می آوردند.
مثلا، می خواهیم رکوردی از دانشجویان تشکیل دهیم که شامل، نام،شماره،تاریخ تولد دانشجو باشد. به این صورت می نویسیم:
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
type
data=record
day:1..31;
month:1..12;
year:integer;
end;
student=record
name:string[20];
stno:integer;
birthday:data;
end;
var st:student;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
در این دستورات، فیلد birthday از رکورد student از نوع رکورد data تعریف شده است که این رکورد خودش از سه فیلد year,month,day تشکیل شده است. متغیر st از نوع رکورد student است. برای دسترسی به فیلدهای متغیر st به صورت زیر می نویسیم:
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
st.name
st.stno
st.birthday.day
st.birthday.month
st.birthday.year
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
انواع شمارشی (enumerated)
یکی از انواع داده ها نوع شمارشی است که در آن مقادیری تعریف می شوند و معانی خاصی هم دارند.
برای تعریف این نوع اینچنین می نویسیم:
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
type
نام نوع شمارشي = (اعضاي نوع) ;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
نکته: نام نوع شمارشی ، از قانون نامگذاری برای متغیرها تبعیت می کند و اعضای این نوع، مقادیری هستند که متغیرهایشان می توانند آنها را بپذیرند.
به عنوان مثال، نوعی به نام رنگ تعریف کرده و اعضای آنرا رنگهای قرمز،زرد،قهوه ای تعیین می کنیم. سپس متغیرهایی از این نوع تعریف کرده و از آنها استفاده می کنیم.
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
type color = (red,yellow,brown);
var c1,c2 :color;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
در این دستورات، پس از تعیین توع color متغیرهای c1,c2 از نوع color تعریف شدند. متغیرهای c1,c2 فقط می توانند مقادیر red,yellow,brown را بپذیرند.
عملگرهای نوع شمارشی
مقدار اولین عنصر نوع شمارشی برابر با صفر، دومین برابر 1،سومین برابر2 و... خواهد بود.
بنابراین، در نع شمارشی color، مقدار red برابر 1 و مقدار yellow برابر 2 و... می باشد.
نکته: متغیرهای نوع شمارشی را می توان با یکدیگر مقایسه کرد و آنها را به یکدیگر نسبت داد.
کاربرد توابع ord,pred,succ در نوع شمارشی
تابع ord: موقعیت عنصری از نوع شمارشی را مشخص می کند.
تابع pred: عنصر قبلی عنصری از نوع شمارشی را مشخص می کند.
تابع succ: عنصر بعدی عنصری ازنوع شمارشی را مشخص می کند.
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
if ord (red) > (yelloe) then
write ('red greater than yellow')
else
write ('red less than yellow')
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
چون مقدار red برابر با صفر و مقدار yellow برابر 1 است. Ord(red) برابر با صفر و ord(yellow) برابر با 1 است. لذا شرط موجود در if درست نیست و دستور بعد از else اجرا می شود.
خواندن و نوشتن نوع داده شمارشی
در پاسکال دستورات خاصی برای خواندن و نوشتن این نوع وجود ندارد، ولی می توان برنامه ای برای خواندن و نوشتن آنها طراحی کرد.
به عنوان مثال، برای نوشتن متغیرهایی از نوع color که قبلا تعریف کردیم، به صورت زیر عمل می کنیم:
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
var c1:color;
case c1 of
red :write ('red');
yellow :write ('yellow');
brown :write ('brown');
end;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
برای خواندن مقادیر نوع شمارشی باید دستورات خاصی نوشته شود. ببینید:
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
var c1:color;
ch:char;
readln(ch)
ch=ucase (ch);
case ch of
'R':c2:=red;
'Y':c2:=yellow;
'B':c2:=brown;
end;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
در این دستورات، برای خواندن رنگها، کاراکتری از ورودی خوانده شد و بر اساس کاراکتر خوانده شده، رنگ مطابق با آن تعیین و در متغیر c2 قرار گرفت.
زیر بازه ای از نوع شمارشی
برای انواع شمارشی نیز می توان نوع زیر بازه تعریف کرد. به عنوان مثال دستورات زیر را در نظر بگیرید:
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
type
days=(saturday,sunday,monday,wednesday,thursday,thursday,friday);
var
workday:saturday ... wednesday;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
در این دستورات، نوع شمارشیdays که شامل ایام هفته می شود و متغیر workday به صورت نوع زیربازه ای از نوع days تعریف شد که شامل روزهای کاری می باشد.
رکوردهای با طول متغیر
نوع رکورد را می توان طوری تعریف کرد که طول بخشی از آن، ثابت و طول بخشی دیگر بر اساس ایط فیلدها، متغیر باشد که این رکورد ها را رکوردهای با طول متغیر می گویند.
مثلا، هنگام خواندن اطلاعات دانشجویان، می خواهیم مشخص کنیم که دانشجو متاهل است یا مجرد. اگر متاهل بودف تعداد فرزندان و سال ازدواج دانشجو را نیز به عنوان بخشی از اطلاعات دانشجو ذخیره کند . بنابراین رکورد مربوط به داشجویان متاهل با رکورد دانشجویان مجرد متفاوت خواهد بود. در تعریف رکود با طول متغیر، ابتدا بخش ثابت و سپس بخش متغیر ظاهر می شود. معمولا بخش متغیر رکورد، بر اساس مقدار فیلدی تعیین می شود که آن فیلد را فیلد برچسب(tag field) گویند.
برای تعریف نوع رکورد با طول متغیر به این صورت عمل می کنیم:
<-- Iran Universities Software Students [elibom.ir] -->
<-- Start Code -->
type
نام نوع رکورد متغير = record
1فيلد:نوع;
2فيلد:نوع;
.
.
.
nفيلد:نوع;
case فيلد برچسب:نوع برچسب of
1مقدار:(فيلدها);
2مقدار:(فيلدها);
nمقدار:(فيلدها);
end;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
نکته: بخش ثابت رکورد، قبل از case تعریف می شود و بخش متغیر با کلمه case شروع می شود.
نکته: بخش متغیربا مقدار فیلد بر چسب تعیین می شود
نکته: پس از نام فیلد برچسب ( : ) قرار می گیرد و نوع برچسب باید Boolean نوع شمارشی یا زیربازه باشد.
نکته: مقدار 1ومقدار2و... مجموعه ای از مقادیر فیلد برچسب هستند که توسط "نوع برچسب" تعریف می شوند.
نکته: به ازای هر مقدار، می توان فیلدها را تعیین کرد.برای تعیین فیلدها باید نام و نوع فیلد را مشخص کرد و بعد از هر فیلد ( ; ) قرار می گیرد.
*** نکات ***
1. فیلدها نباید همنام باشند
2. اگر پس از مقداری از case ، فیلدی تعیین نشود، باید پرانتز های باز و بسته را به اینصورت قرار داد . ()
3. هر فیلد موجود در قسمت case ممکن است ممکن است خودش دارای بخش ثابت و متغیر باشد.
4. تعریف نوع رکورد متغیر، به یک end ختم می شود، یعنی برای case، دستور end جداگانه ای وجود ندارد.
*********************
خوب. آنچه که خواندید قستهای مهم و کلیدی از کتاب "برنامه نویسی به زبان پاسکال" نوشته "مهندس عین الله جعفر نژاد قمی" بود که به طور خلاصه تقدیم گردید.
ما از ارائه این متن ، تنها قصدی که داریم، آموزش مطالب بود و هیچ قصد خاص دیگری نداشتیم و نخواهیم داشت.
با تشکر