View Full Version : آموزش زبان پاسكال
tomboy
پنج شنبه 08 بهمن 1388, 12:52 عصر
تاریخچه
پاسکال بر پایه زبان برنامه نویسی Algol میباشد و به افتخار ریاضی دان و فیلسوف فرانسوی Blaise Pascal نام گذاری شد. آقای Wirth متعاقباٌ Modula-2 و Obern که شبیه پاسکال بودند را توسعه داد. قبل از آن و برای تهیه مقدمات پاسکال، ایشان زبان Euler که از Algol-W پیروی میکرد را توسعه دادند.
در ابتدا پاسکال بسیار وسیع و جامع بود، اما تنها به منظور یاددادن برنامه نویسی ساخت یافته به دانشجویان نبود. نسلهای متمادی از دانشجویان بر روی پاسکال به عنوان یک زبان مقدماتی در دورههای لیسانس کار کردند. همچنین نسخههای متفاوتی از پاسکال مکرراً برای هر چیزی از پروژههای تحقیقاتی گرفته تا بازی های رایانهای و سیستم های جاسازی شده استفاده شد. هم اکنون کامپایلر های جدید تر پاسکال موجود میباشند که که به طور وسیع و گسترده استفاده میشوند.
پاسکال نخستین زبان سطح بالا بود که برای توسعه و تکامل در Apple Lisa استفاده شد و در سال های اولیه Mac، قسمت هایی از سیستم عامل اصلی مکینتاش، از منابع پاسکال توسط دست به زبان اسمبلی 68000 Motorola ترجمه شد. حروفچینی محبوب سیستم TeX توسط Donald E.Knuth در WEB (سیستم برنامه نویسی آموزش دیده اصلی) نوشته شد، که بر پایه DEC PDP-10 Pascal میباشد، آن هم در هنگامی که یک برنامه کاربردی مانند Total Commander در Delphi (پاسکال شی گرا) نوشته شد
tomboy
پنج شنبه 08 بهمن 1388, 12:53 عصر
قصد آقای Wirth خلق یک زبان کار آمد بود (در هر دو مورد سرعت کامپایل و کد ساخته شده) که بر پایه به اصطلاح برنامه نویسی ساخت یافته (مفهومی که به تازگی محبوب شده است) میباشد. اصول و ریشههای پاسکال در زبان الگول 60 میباشد، اما علاوه بر آن مفاهیم و مکانیزم هایی را مافوق اعداد و آرایههای الگول معرفی کرد که برنامه نویسان را قادر به تعریف انواع داده (ساختمان) پیچیده خودشان میکرد و همچنین ساخت ساختمان دادههای بازگشتی و پویا مانند لیست ها، درخت ها و گرافها را آسانتر میکرد.
امکانات مهم که برای این امور اضافه شده بود، رکوردها، شمارش ها، زیر حوزه ها، متغیر های اختصاص داده شده پویا همراه اشاره گر های وابسته و مجموعهها میباشد. برای تحقق و معنی دار کردن این امر، پاسکال یک سیستم تایپ دهی قوی روی تمام اشیا دارد، به این معنی که یک نوع داده نمیتواند بدون تبدیل صریح، به عنوان نوع دیگر تفسیر و یا تبدیل شود. امروزه در بسیاری از زبان های برنامه نویسی مکانیزم های مشابهی به صورت استاندارد میباشند. زبان های دیگر که از توسعه پاسکال تأثیر گرفتند، کوبول، سیمولا 67 و Algol W خود آقای Wirth میباشند.
پاسکال مانند بسیاری از زبان های اسکریپتی امروزه ( اما بر خلاف زبان های خانواده C ) به تعریف پروسههای تودرتو تا هر عمقی و همچنین اکثر انواع تعریف ها و اعلان ها درون پروسهها و توابع اجازه میدهد. این امر یک نحو خیلی ساده و منسجم را امکان پذیر می سازدکه یک برنامه کامل از نظر نحوی، خیلی نزدیک به یک تابع و یا پروسه تنهاست (البته به استثنای خود کلمه کلیدی).
tomboy
پنج شنبه 08 بهمن 1388, 12:55 عصر
اولین کامپایلر پاسکال برای سری CDC 6000 خانواده کامپیوتر های پردازنده مرکزی در زوریخ طراحی شد. آقای Wirth گزارش میدهد که اولین کوشش برای پیاده سازی آن در فرترن در سال 1969 با توجه به نارسایی فرترن برای بیان ساختمان دادههای پیچیده، ناموفق بود. دومین تلاش ها برای خود زبان پاسکال تنظیم و فرموله شد و در اواسط سال 1970 قابل استفاده شد. پس از آن بسیاری از کامپایلر های پاسکال به طور مشابه، خودمیزبان بودند، به این معنا که خود کامپایلر در پاسکال نوشته شده است و کامپایلر هنگامی که امکانات جدید به زبان اضافه میشود و یا به محیطی جدید منتقل میشود، معمولاً قادر به دوباره کامپایل کردن خود میباشد. کامپایلر GNU Pascal یک استثنای قابل توجه در این مورد میباشد که در C نوشته شده است.
اولین انتقال موفق کامپایلر CDC Pascal به یک کامپیتر پردازنده مرکزی دیگر، توسط Welsh و Quinn در دانشگا ه Queen در شهر Balfast در سال 1972 انجام گرفت. کامپیوتر هدف یک ICL 1900 بود. اولین کامپایلر پاسکال که در آمریکای شمالی نوشته شد، در دانشگاه Illinois زیر نظر Donald B.Gillies برای PDP-11 و کد ماشین تولید شده محلی ، ساخته شد. پاسکال در سراسر سال های 1970 و 1980 از محبوبیتی بزرگ برخوردار بود.
به منظور انتشار سریع زبان، یک کامپایلر (porting kit) در زوریخ ساخته شد که شامل یک کامپایلر بود که برای یک ماشین پشته مجازی کد تولید میکرد(یعنی کدی که خودش را به یک تفسیر کارآمد معقول از خودش ارجاع میداد) به همراه یک مفسر برای این کد Pascal-P system. اگر چه کد SC (کامپیوتر استک) در ابتدا به قصد کامپایل به کد ماشین صحیح بود، حداقل یک سیستم (سیستم پاده سازی جالب توجه UCSD) از آن برای خلق مفسر UCSD P-system استفاده کرد. کامپایلرهای سیستم P، با P1 تا P4 نامیده میشوند. P1 به عنوان اولین نسخه و P4 به عنوان آخرین نسخه انتشار یافته از زوریخ.
کامپایلر/ مفسرP4 هنوز برروی سیستمهای سازگار با پاسکال اصلی قابل اجرا و کامپایل است. با این حال خودش فقط یک زیرمجموعه از زبان پاسکال را قبول میکند. یک نسخه از P4 که زبان پاسکال کامل را قبول میکند و سازگار با ISO 7185 است، نیز ساخته شد و به نام کامپایلر P5 نامگذاری شد که به صورت منبع در دسترس و مهیاست. یک نسخه جایگزین از آن که به عنوان مدل پیاده سازی پاسکال شناخته میشودنیز پاسکال کامل را قبول میکند و با ISO 7185 سازگار است، اما در کامپیوتر های خواندنی فراهم نمیباشد.
یک نسخه از کامپایلرهای P4 که اعداد باینری محلی را خلق کرد، برای کامپیوتر پردازنده مرکزی IBM System 370 توسط کمیسیون انرژی اتمی استرالیا ارائه شد. این کامپایلر AAECPascal Compiler نامیده شد پس از حروف اختصاری نام کمیسیون. یک نسخه از P4 از 6-1975 شامل منابع و اعداد باینری لازم برای کامپایلر و فایل های کتابخانهای زمان اجرا، برای پردازنده مرکزی PDP-10 ممکن است از این پیوند قابل دریافت باشد.
در اوایل 1980 WatcomPascal نیز برای IBM System 370 توسعه داده شد. IP Pascal یک پیاده سازی از زبان برنامه نویسی پاسکال بود که از Micropolis Dos استفاده میکرد، اما به سرعت به CP/M که برروی Z80 اجرا میشد، حرکت کرد. بعدها نیز به انواع ماشین های 80386 در سال 1994 حرکت کرد و امروزه به صورت پیاده سازی شده در Linux و Windows/XP وجود دارد. در سال 2008 سیستم به یک سطح جدید ارتقا یافت و زبان حاصله به عنوان Pascaline (بعد از Pascal’s Calculator ) نامیده شد.آن زبان، شامل اشیا، کنترل های فضای نام، آرایههای پویا، به همراه بسیاری الحاقات دیگر، و امکانات عمومی دارای کارکرد مشابه، و حفاظت نوع داده همانند C# میباشد. این تنها پیاده سازی است که با پیاده سازی پاسکال اصلی سازگارمی باشد (که در ISO 7185 استاندارد شده است).
در اوایل 1980 به منظور مهیا کردن یک جایگزین ساخت یافته برای مفسرهای پایه که با ماشین ها آمدند، UCSD Pascal به کامپیوترهای Apple II,Apple III انتقال یافت. کامپیوتر Apple، Lisa Pascal خودش را برای محیط کار Lisa در سال 1982 خلق کرد و این کامپایلر را به Apple Macintosh و MPW در سال 1985 منتقل کرد. در سال 1985 Larry Tesler در مشاوره با Niklaus Wirth پاسکال شی گرا را تعریف کردو این امکانات در هر دوی Lisa Pascal و Mac Pascal جای داده شدند.
در سال های 1980، Anders Hejlsberg کامپایلر Blue Label را برای Nascom-2 نوشت. یک پیاده سازی مجدد از این کامپایلر برای IBM PC تحت نام های Compas Pascal و PolyPascal قبل از اینکه توسط Borland شناسایی شود، در معرض فروش قرار داده شد. نامگذاری مجدد به Turbo Pascal موجب افزایش محبوبیت و قدردانی شد. قدردانی در یک قسمت به خاطر یک راهبرد قیمت گذاری جسورانه و پر پشتکار و در یک قسمت به خاطر داشتن یکی از نخستین محیط های توسعه یکپارچه تمام صفحه. علاوه بر اینها، Turbo در زبان اسمبلی نوشته شد و تماماً به نحو احسن بهینه شد که سبب شد در رقابت بسیار کوچکتر و سریعتر شود. در سال 1986، Anders، توربو پاسکال را به Macintosh منتقل کرد و الحاقات پاسکال شی گرای Apple را با Turbo درآمیخت. این الحاقات سپس مجدداً به توربو پاسکال نسخه PC شماره 5.5 اضافه شدند.
کامپایلر ارزان بورلند یک تأثیر شگرف بر جامعه پاسکال گذاشت که سبب تمرکز ویژه برروی کامپیوتر های شخصی IBM در اواخر سال های 1980 شد. بسیاری از علاقمندان به کامپیوترهای شخصی که در جستجوی یک جایگزین ساخت یافته برای BASIC بودند، شروع به استفاده از این محصول کردند. همچنین این محصول توسط استفاده کنندگان حرفهای نیز کم کم مورد پذیرش قرار گرفت. درهمین حین، تعدادی مفاهیم از C، به منظور اجازه دادن به برنامه نویسان پاسکال برای استفاده مستقیم از API های Microsoft Windows که بر پایه C بودند، وارد پاسکال شدند. این الحاقات مشتمل بر رشتههای بدون پایان، اشاره گرهای عددی و حسابی، اشاره گر های توابع، آدرس عملگرها و انواع دادهای ناامن میباشند.
با این حال، بورلند بعداً تصمیم گرفت که امکانات شی گرایی با دقت بیشتر و جزئیات دقیقتر می خواهد و آن را با استفاده از پیش نویس های استاندارد پاسکال شی گرا که توسط Apple به عنوان اساس و پایه پیشنهاد شده بود، مجدداً در Delphi پیاده کرد( این پیش نویس Apple هنوز یک استاندارد رسمی نمیباشد). بنابراین اولین نسخههای زبان برنامه نویسی Delphi، پاسکال شی گرا (Object Pascal) نامیده شدند.الحاقات اصلی در مقایسه با پاسکال شی گرای قدیمی تر، مدل شی گرای مبتنی بر مرجع، سازندهها و مخرب های مجازی و جزئیات بودند. کامپایلر های متعدد دیگر نیز این شیوه را اجرا و پیاده سازی کردند.
توربو پاسکال و دیگر مشتقات به همراه واحدها یا مفاهیم پیمانه ای، هم از زبان های پیمانهای هستند. با این حال، مفهوم پیمانه تودرتو و یا ورود و خروج صحیح نمادهای ویژه را مهیا نمیکنند. Super Pascal یک نوع دیگر بود که برچسب های بدون عدد را اضافه کردکه یک دستور یا عبارت بازگشت به عنوان نام هایی از نوع ها میباشد.
دانشگاههای زوریخ، Karlsruhe و Wuppertal، یک قابلیت را برای محاسبات علمی توسعه دادند (XSC Pascal) که یک راه حل مفید را برای برنامه ریزی محاسبات عددی با دقت کنترل شده، مهیا میکند. در سال 2005 در کنفرانس WEB 2.0 ، Marfic Technology ابزاری معرفی کرد که توسعه کاربردهای WEBکه تماماً در Marfic Pascal نوشته شده بود را مهیا میکرد. Marfic Pascal یک گونه از پاسکال شی گرا است که بسیار نزدیک به Delphi میباشد.
tomboy
پنج شنبه 08 بهمن 1388, 12:57 عصر
پاسکال در شکل اصلی خودش به طور خالص یک زبان رویهای است و دارای آرایش سنتی الگول است که شبیه ساختارهای کنترل به همراه کلمات رزروشده همچون if,then,else,while,for و ... میباشد. با این حال پاسکال بسیاری امکانات ساخت یافته دادهای و انتزاعی را داراست که در الگول 60 اصلی موجود نبودند. مانند تعاریف نوع ها، رکوردها، اشاره گرها، شمارش ها و مجموعه ها. یک همچنین ساختار هایی تا یک اندازه از Simula 67 ،Algol 68، Algol W خود آقای Wirth و پیشنهادات C.A.R. Hoare الهام گرفته شده و یا به ارث برده شدند.
tomboy
پنج شنبه 08 بهمن 1388, 12:58 عصر
برنامههای پاسکال توسط کلمه کلیدی Program به همراه لیستی از فایل های خارجی به عنوان پارامترها شروع میشوند. سپس بلوک عبارت اصلی که توسط کلمات کلیدی Begin و End بسته بندی شده است را دنبال میکنند. علامت semicolon (;) عبارات را از هم جدا میکند و نقطه آخر برنامه تمام برنامه را خاتمه میدهد. در پاسکال، بزرگ و کوچکی حروف مطرح نیست. بعضی کامپایلرها مثل توربو پاسکال در میان آنها کلمه کلیدی Program را اختیاری در نظر میگیرند.
در اینجا یک مثال از کد برای یک برنامه خیلی ساده آورده شده است.
Program HelloWorld(output);
begin
writeLn('Hello, World!')
end.
tomboy
پنج شنبه 08 بهمن 1388, 12:59 عصر
یک تایپ در پاسکال و در عموم زبان های برنامه نویسی محبوب دیگر، یک متغیر را به گونهای در نظر میگیرد که درآن، حوزهای از مقادیر قابل قبول تعریف میشود که متغیر قادر به ذخیره آن میباشد و همچنین مجموعهای از عملگرها را لحاظ میکند که برروی آن متغیر با آن نوع مجاز است. انواع دادهها و توضیحی مختصر در مورد آنها در زیر آورده شده است.
نوع داده حوزه قابل ذخیره توسط متغیر integer تمام اعداد از32768- تا 32768 byte اعداد صحیح از0 تا 255 real 1E-38 تا 1E+38 اعداد اعشاری از boolean تنها مقادیر درست و نادرست را نگه میدارد. char هر کاراکتر درمجموعه کد اسکی
tomboy
پنج شنبه 08 بهمن 1388, 13:00 عصر
انواع دادهای ساده پاسکال عبارتند از real,integer,character,Boolean,enumeration که enumeration یک نوع داده جدید میباشد که توسط پاسکال معرفی شد.
var
r: Real;
i: Integer;
c: Char;
b: Boolean;
e: (apple, pear, banana, orange, lemon);
زیرحوزههای هر نوع داده ترتیبی وصفی ( هر نوع ساده به غیر از real ) را میتوان تغییر داد و ساخت.
var
x: 1..10;
y: 'a'..'z';
z: pear..orange;
برخلاف دیگر زبان های برنامه نویسی زمان خودش، پاسکال نوع داده مجموعهای را پشتیبانی میکند.
(set type)
var
set1: set of 1..10;
set2: set of 'a'..'z';
set3: set of pear..orange;
یک مجموعه، مفهومی اساسی برای ریاضیات مدرن میباشد و آنها ممکن است در الگوریتم های بزرگ زیادی استفاده شوند. این چنین امکانی بسیار مفید است و ممکن است از ساختن یک معادل در زبانی که مجموعهها را پشتیبانی نمیکند بسیار سریع تر باشد، برای مثال برای بسیاری از کامپایلر های پاسکال
if i in [5..10] then
...
بسیار سریع تر است از
if (i>4) and (i<11) then
...
تایپ ها میتوانند از دیگر تایپ ها با استفاده از اعلان تایپ تعریف شوند:
type
x = Integer;
y = x;
...
علاوه بر این، نوع های پیچیده میتوانند از نوع های ساده ساخته شوند:
type
a = Array [1..10] of Integer;
b = record
x: Integer;
y: Char
end;
c = File of a;
همان طور که در مثال بالا نشان داده شده است فایل های پاسکال سلسلهای از اجزا هستند. هر فایل یک متغیر بافر دارد که با f^ مشخص میشود. رویهها (procedure) متغیر بافر را برای خواندن(get) و نوشتن(put) به المان بعدی حرکت میدهند. خواندن به این صورت معرفی میشود که read(f,x) همانند x:=f^ ; get(f) میباشد. نوشتن به این صورت معرفی میشود که write(f,x) مانند f^:=x ; put(f) است. نوع داده متن به عنوان فایلی از کاراکترها از پیش تعریف شده است. هنگامی که متغیر بافر برای رسیدگی به کاراکتر بعدی میتواند مورد استفاده قرار گیرد، از آن استفاده به عمل خواهد آمد (بررسی یک رقم قبل از خواندن یک مقدار صحیح). این مفهوم منجر به اشکالات جدی برای برنامههای محاورهای با پیاده سازی های جدید شد، اما بعدها توسط مفهوم “lazy I/O” حل شد.
در پاسکال Jensen و Wirth رشتهها به صورت آرایه بسته بندی شدهای از کاراکتر ها نمایش داده میشوند. بنابراین آنها دارای طول ثابت اند و معمولاً دارای فضای خالی میباشند. بعضی گونهها یک نوع رشته سفارشی دارند.
tomboy
پنج شنبه 08 بهمن 1388, 13:02 عصر
پاسکال استفاده از اشاره گر ها را پشتیبانی میکند.
type
a = ^b;
b = record
a: Integer;
b: Char;
c: a
end;
var
pointertob: a;
در اینجا متغیر اشاره گر به b، یک اشاره گر به نوع داده b که یک رکورد است، میباشد. اشاره گرها قبل از اینکه اعلان شوند، میتوانند استفاده شوند. این یک اعلان رو به جلو است، یک استثنا برای این قانون که اشیا قبل از استفاده باید تعریف شوند. برای ساخت یک رکورد جدید و اختصاص دادن مقدار 10 و کاراکتر A به قسمت های a و b در رکورد و برای مقداردهی اولیه اشاره گرc به تهی، دستورات باید به صورت زیر باشند.
new(pointer_to_b);
pointertob^.a := 10;
pointertob^.b := 'A';
pointertob^.c := nil;
...
این امر میتواند با استفاده از عبارت with به صورت زیر نوشته شود.
new(pointer_to_b);
with pointertob^ do
begin
a := 10;
b := 'A';
c := nil
end;
...
توجه داشته باشید که درون حوزه عبارت with کامپایلر میداند که a و b به زیر حوزههای اشاره گر به رکورد pointertob ارجاع میدهد و نه به رکورد b و یا نوع داده اشاره گر a .
لیست های پیوندی، پشتهها و صف ها با داخل کردن یک نوع اشاره گر( c) به درون رکورد، قابل ساخت میباشند. (مفاهیم nil و null را در برنامه نویسی کامپیوتری مشاهده کنید)
tomboy
پنج شنبه 08 بهمن 1388, 13:03 عصر
پاسکال یک زبان برنامه نویسی ساخت یافته است، به این معنا که جریان کنترل برنامه، به طور کامل در میان عبارات استاندارد ساخت یافتهای میباشد، البته بدون فرمان go to .
while a <> b do writeln('Waiting');
if a > b then writeln('Condition met')
else writeln('Condition not met');
for i := 1 to 10 do writeln('Iteration: ', i:1);
repeat
a := a + 1
until a = 10;
case i of
0: write('zero');
1: write('one');
2: write('two')
end;
tomboy
پنج شنبه 08 بهمن 1388, 13:04 عصر
پاسکال برنامهها را به توابع و پردازهها شکل دهی میکند.
program mine(output);
var i : integer;
procedure print(var j: integer);
function next(k: integer): integer;
begin
next :ه ا= k + 1
end;
begin
writeln('The total is: ', j);
j := next(j)
end;
begin
i := 1;
while i <= 10 do print(i)
end.
پردازهها و توابع میتوانند تا هر عمقی به صورت تودرتو باشند و ساختار برنامه به صورت منطقی، بیرونی ترین بلوک در نظر گرفته میشود. هر پردازه یا تابع میتواند اعلان های خودش برای برچسب های goto، ثوابت، تایپ ها، متغیرها و دیگر پردازهها و توابع را داشته باشد که همگی باید در آن دسته قرار گیرند. این ملزومات ترتیبی، در اصل به قصد اجازه به کامپایل یک طرفه کارآمد بود. با این حال در بعضی نسخه ها، ملزومات الزامی ترتیبی قسمت اعلان ها، مورد نیاز نمیباشد.
__________________
tomboy
پنج شنبه 08 بهمن 1388, 13:06 عصر
یک برنامه به زبان پاسکال از قسمت های مختلفی تشکیل میشود . کوچک ترین واحدهای معنی دار در زبان پاسکال توکن (http://fa.wikipedia.org/wiki/%D8%AA%D9%88%DA%A9%D9%86) ( Token (http://fa.wikipedia.org/w/index.php?title=Token&action=edit&redlink=1) ) نامیده میشود که عبارت اند از :
1 - حروف : حروف الفبای بزرگ ( از A تا Z ) و حروف الفبای کوچک ( a تا z )
2 - ارقام مبنای 10 : ارقام 0 تا 9
3 - ارقام مبنای 16 : ارقام 0 تا 9 و حروف A تا F و یا a تا f
4 - کاراکترهای تکی : + ، - ، / ، * ، = و . . .
5 - جفت کاراکترها : مانند <> ، => ، =< ، = و . . .
6 - شناسه (http://fa.wikipedia.org/w/index.php?title=%D8%B4%D9%86%D8%A7%D8%B3%D9%87&action=edit&redlink=1) ( Identifier (http://fa.wikipedia.org/w/index.php?title=Identifier&action=edit&redlink=1) ) : از شناسهها برای نام گذاری استفاده میشود . شناسه ترکیبی از حروف ، ارقام و کاراکتر زیر خط (-) است که میتواند دارای طول دلخواهی باشد اما پاسکال فقط 63 کاراکتر اول را در نظر خواهد گرفت . شناسه حتما باید با یک حرف یا علام زیر خط (-) آغاز شود . شناسههای به دو دسته تقسیم میشوند :
الف ) شناسههای استاندارد (http://fa.wikipedia.org/w/index.php?title=%D8%B4%D9%86%D8%A7%D8%B3%D9%87%E2% 80%8C%D9%87%D8%A7%DB%8C_%D8%A7%D8%B3%D8%AA%D8%A7%D 9%86%D8%AF%D8%A7%D8%B1%D8%AF&action=edit&redlink=1) : این شناسهها از قبل در پاسکال تعریف شده اند برای نمونه میتوان به Write و Read اشاره نمود .
ب ) شناسههای غیر استاندارد (http://fa.wikipedia.org/w/index.php?title=%D8%B4%D9%86%D8%A7%D8%B3%D9%87%E2% 80%8C%D9%87%D8%A7%DB%8C_%D8%BA%DB%8C%D8%B1_%D8%A7% D8%B3%D8%AA%D8%A7%D9%86%D8%AF%D8%A7%D8%B1%D8%AF&action=edit&redlink=1) : این شناسهها به وسیله کاربر به طور مجزا تعریف میشوند به همین دلیل به آن ها User defined گفته میشود .
لازم به ذکر است که پاسکال در تعریف شناسهها تفاوتی میان حروف بزرگ و کوچک قائل نمیشود بنابراین شناسههای counter و COUNTER با یکدیگر معادل اند .
7 - برچسب (http://fa.wikipedia.org/w/index.php?title=%D8%A8%D8%B1%DA%86%D8%B3%D8%A8&action=edit&redlink=1) ( label (http://fa.wikipedia.org/w/index.php?title=Label&action=edit&redlink=1) ) : از برچسب برای مشخص نمودن خطوط خاصی از برنامه استفاده میشود . با استفاده از دستور goto میتوان کنترل برنامه را به خط مشخصی از برنامه منتقل نمود . برچسب ها میتوانند عدد صحیح در محدوده 0 تا 9999 و یا یک شناسه باشد .
8 - اعداد : اعداد میتوانند حقیقی یا صحیح ، مثبت یا منفی باشند . هرکدام به چند نوع تقسیم میشوند . باید توجه داشت که اعداد صحیح میتوانند از نوع هگزادسیمال (http://fa.wikipedia.org/wiki/%D9%87%DA%AF%D8%B2%D8%A7%D8%AF%D8%B3%DB%8C%D9%85%D 8%A7%D9%84) نیز باشند که در این صورت باید اولا با علامت $ شروع شوند و ثانیا طول آن نباید از هشت رقم هگزادسیمال بیشتر باشد بنابراین محدوده قابل قبول برای اعداد صحیح هگزادسیمال از 00000000$ تا FFFFFFFF$ است و در ضمن نباید شامل علامت + یا – باشند .
9 - ثابت های رشته ای (http://fa.wikipedia.org/w/index.php?title=%D8%AB%D8%A7%D8%A8%D8%AA_%D9%87%D8 %A7%DB%8C_%D8%B1%D8%B4%D8%AA%D9%87_%D8%A7%DB%8C&action=edit&redlink=1) ( string constants (http://fa.wikipedia.org/w/index.php?title=String_constants&action=edit&redlink=1) ) : ثابت رشتهای ، عبارت از تعدادی کاراکتر است که درون دو علامت آپوستروف (http://fa.wikipedia.org/w/index.php?title=%D8%A2%D9%BE%D9%88%D8%B3%D8%AA%D8% B1%D9%88%D9%81&action=edit&redlink=1) ( ' ) قرار میگیرند . استفاده از کاراکترهای کنترلی ( کاراکترهایی که دارای کد ASCII (http://fa.wikipedia.org/wiki/ASCII) تا 30 میباشند ) در یک ثابت رشتهای مجاز است اما استفاده از کاراکترهای آپوستروف ( ' ) و carriage Return ( <cr> ) غیرمجاز است . همچنین در صورتی که از علامت # به همراه یک عدد مثبت بین 0 تا 255 استفاده شود باعث جایگزینی کاراکتر متناظر با عدد مربوط در جدول کدهای ASCII خواهد شد . کلمات رزرو شده (http://fa.wikipedia.org/w/index.php?title=%DA%A9%D9%84%D9%85%D8%A7%D8%AA_%D8 %B1%D8%B2%D8%B1%D9%88_%D8%B4%D8%AF%D9%87&action=edit&redlink=1) ( Reserved words ) : به مجموعهای از کاراکترها اطلاق میشود که برای پاسکال دارای معنای خاصی میباشند و هرگز نمیتوان از آن ها به عنوان شناسه غیراستاندارد استفاده نمود .
tomboy
پنج شنبه 08 بهمن 1388, 13:07 عصر
جزای اصلی یک برنامه به زبان پاسکال عبارت اند از :
عنوان برنامه ( program Heading (http://fa.wikipedia.org/w/index.php?title=Program_Heading&action=edit&redlink=1) )
قسمت اطلاعات (Data section (http://fa.wikipedia.org/w/index.php?title=Data_section&action=edit&redlink=1) )
قسمت دستورالعمل ها ( code section (http://fa.wikipedia.org/w/index.php?title=Code_section&action=edit&redlink=1) )
1 - عنوان برنامه شامل دو قسمت زیر است
الف ) نام برنامه ( program Name (http://fa.wikipedia.org/w/index.php?title=Program_Name&action=edit&redlink=1) )
ب ) فرمان های کامپایلر ( compiler Directives (http://fa.wikipedia.org/w/index.php?title=Compiler_Directives&action=edit&redlink=1) )
این قسمت که به عنوان اولین بخش از ساختمان یک برنامه در نظر گرفته میشود محل قرار گرفتن نام برنامه به همراه پارامترهای ورودی و خروجی و همچنین فرمان های کامپایلر که کنترل عمل کامپایل شدن برنامه را برعهده دارند میباشد . قسمت های الف و ب هر دو اختیاری بوده ، وجود آن ها باعث روشن شدن هر چه بیشتر وظیفه برنامه و شرایط ترجمه آن به زبان ماشین میباشد .
2 - قسمت اطلاعات ( Data section )
این قسمت خود شامل 4 قسمت دیگر میباشد که عبارت اند از :
الف ) اعلان ثابت ها Constant Declaration (http://fa.wikipedia.org/w/index.php?title=Constant_Declaration&action=edit&redlink=1)
ب ) اعلان انواع اطلاعات
ج ) اعلان متغیرها (http://fa.wikipedia.org/w/index.php?title=%D9%85%D8%AA%D8%BA%DB%8C%D8%B1%D9% 87%D8%A7&action=edit&redlink=1) Variable Declatration (http://fa.wikipedia.org/w/index.php?title=Variable_Declatration&action=edit&redlink=1)
د ) اعلان برچسب ها Label Declatration (http://fa.wikipedia.org/w/index.php?title=Label_Declatration&action=edit&redlink=1)
3 - در این قسمت دستورات به ترتیب اجرا مرحله به مرحله گنجانیده میشوند . این قطعه ، همواره شامل بلوک اصلی برنامه ( Main program Block ) بوده و میتواند در صورت لزوم شامل پروسیجرها و توابع نیز باشند . در بلوک اصلی برنامه که خود با کلمه رزرو شده begin شروع و با end ختم میگردد . دستورات عملیاتی مانند نسبت دادن مقادیر معلوم به متغیرها ، فراخوانی پروسیجرها و توابع اجرای حلقههای مختلف و غیره انجام میشود . این قسمت خود شامل سه قسمت دیگر میباشد که عبارت اند از :
الف ) پروسیجرها (http://fa.wikipedia.org/w/index.php?title=%D9%BE%D8%B1%D9%88%D8%B3%DB%8C%D8% AC%D8%B1%D9%87%D8%A7&action=edit&redlink=1) ( procedures )
ب ) توابع (http://fa.wikipedia.org/wiki/%D8%AA%D9%88%D8%A7%D8%A8%D8%B9) ( function )
ج ) بلوک اصلی برنامه
tomboy
پنج شنبه 08 بهمن 1388, 13:09 عصر
زبان پاسكال يكي از زبانهاي برنامه سازي است كه ويژگيهاي آموزشي آن بسيار بالاست يعني زبان خوبي براي آموزش برنامه نويسي منظم و دقيق است.قابليت خوانايي و درك برنامه هاي اين زبان بالاست وميتوان برنامه هايي نوشت كه احتمال خطاهاي آنها بسيار اندك باشد علتش اين است كه يك زبان ساختار يافته (structed) است .
ساختار كلي برنامه چيست؟
1-تعريف
2-به وسيله procedure و functionقسمتهاي تكراري را از بين ببريم
3-بدنه
فرم كلي پاسكال:
اسم Program
; تعريف ثابت const
; تعريف نوع type
; تعريف متغيرها var
)پارامترها ) نام procedure
begin
____
____
____
end ;
; ( پارامترها ) نام نوع تابع function
begin
____
____
____
end ;
begin
____
____
____
end .
متغير : محلي است كه داراي يك اسم مي باشد و مي توان مقداري را در آن ذخيره كرد
انواع متغيرها در پاسكال:
Integer :انواع عددي صحيح شامل اعداد بدون نقطه مميز است
نوع مقاديري كه مي پذيرند طول(بايت)
byte 0 تا 255 1
Shortint 128- تا 127 1
integer 32768- تا 32767 2
Word 0 تا 65535 2
Longint 2147483648- تا 2147483647 4
اعداد اعشاري:
انواع عددي اعشاري شامل اعدادي با نقطه مميز است
نوع مقاديري كه ميپذيرند ارقام با معني طول(بايت)
single 1.5e-45 تا3.4e38 7 تا 8 4
real 2.9e-39 تا 1.7e38 11 تا 12 6
Double 5.0e-324تا 1.7e308 15 تا 16 8
extended 1.9e-4951تا 1.1e493 19 تا 20 10
انواع داده هاي اعشاري
-Char :
نوع داده كاراكتري كه با كلمه char مشخص مي شود ميتواند يك كاراكتر را در خود نگهداري كند بنابراين كاراكترها در يك بايت از حافظه كامپيوتر ذخيره مي شوند
String - :
اين نوع داده ها براي ذخيره رشته ها مثل اسامي افراد به كار مي رود و با كلمه كليدي string مشخص ي گردد
براي هر رشته بايد طول معلوم كنيم اگر طولي تعريف نشود به طور پيش فرض 80 در نظر گرفته ميشود(مقدار طول حداكثر 255 است)
- Boolean :
نوع ديگري از داده ها در پاسكال وجود دارند كه داده هاي بولي خوانده مي شوند مقادير بولي داراي دو ارزش درستي يا نادرستي اند كه در پاسكال با صفر و يك نمايش داده مي شوند صفر به معني نادرستي و يك به معني درستي به كار ميرود اين نوع داده ها با كلمه Boolean تعريف ميشوند.
دستورات ورودي در پاسكال:
دستور Readlnبراي خواندن اطلاعات از ورودي به كار ميرود.
فرمت آن به صورت مقابل است:
(اسامي متغيرها)read/ln
اسامي متغيرها بايد با كاما از يكديگر جدا شوند..
براي چاپ اطلاعات در خروجي از دستور write/ln استفاده ميكنيم.
فرمت آن به صورت مقابل است:
' يك پيام '
( متغير ) write/ln
عبارت محاسباتي
انتساب متغيرها:
مقدار ثابت
( متغير )=: متغير
عبارت محاسباتي
مثال : برنامه اي بنويسيد كه دو عدد را از ورودي دريافت و حاصلجمع آن دو را چاپ كند .
Program add;
Var
a,b:integer;
begin
writeln('enter 2 num');
readln(a,b);
c:=a+b;
writeln('result is =',c);
end.
تكليف : چرا برنامه بايد ادب داشته باشد ؟
مثال : برنامه اي بنويسيد كه حقوق پايه وتعداد فرزندان يك كارگر را از ورودي دريافت و مبلغ حقوق وي را بر اساس فرمول زير حساب كنيد.
10*تعداد فرزندان + حقوق پايه =حقوق كل
Program test;
Var
Salary:longint;
Child:byte;
kole:integer
Begin
Writeln('enter salary and number of child);
Readln(salary,child);
Kole := salary + child *10
Writeln('kole is ',kole);
END.
اولويت عملگرها:
/ *
- +
شرط:
then شرط if
Begin
____
____
____
end
else
begin
____
____
____
end;
نكته : دستورالعمل قبل از IF سمي كالن نمي گيرد
عناصر شرط:
< > <= >= = <>
اپراتورها :
AND OR NOT XOR
NOT A
1 0
0 1
XOR OR AND B A
0 1 1 1 1
1 1 0 0 1
1 1 0 1 0
0 0 0 0 0
مثال : برنامه اي بنويسيد كه با دريافت دو عدد بزرگترين آنها را چاپ كند.
Program test;
Var
a,b:integer;
if a>b then
begin
writeln(a);
end
else
writeln(b);
end.
مثال : برنامه اي بنويسيد كه با دريافت سه عدد به عنوان ضرايب y=ax2+bx+c معادله درجه دو را حل كند(اين برنامه را با يك If بنويسيد).
Var
A,b,c:integer;
D,x1,x2:real;
Begin
Writeln('enter a,b,c');
Readln(a,b,c);
D:=b*b-4*a*c;
If (d >=0 ) then
Begin
X1:=(-b+sqrt(d))/2*a);
X1:=(-b-sqrt(d))/2*a);
مثال : برنامه اي بنويسيد كه تعداد فرزندان وحقوق پايه و رتبه يك كارگر را از ورودي دريافت و حقوق كل وي را بر اساس فرمول زير حساب كند.
كسريها - مزايا +بيمه = حقوق كل
5*رتبه +1000* تعداد فرزند = مزايا
ماليات + بيمه = كسريها
بيشتر كمتر يا مساوي 2 تعداد فرزند
تعداد فرزندان 1000 بيمه
هر چيزي ديگر 20 تا 0 رتبه
حقوق پايه حقوق پايه*100/10 ماليات
begin
writeln('enter salary and grade and number of child');
readln(salary ,num,grade);
if num<=2 then
bimeh:=100
else
bimeh :=num*500;
if (grade>=0) and (grade<=20)then
net := 10/100*salary
else
if grade >20 then
begin
net:=20/100*salary;
mazaya:=num*1000+grade*50;
kasry:=bimeh+net;
kol :=salary + mazaya-kasry;
end;
writeln(kol);
end.
تكليف : در يك تركيب شيميايي 4 عنصر شركت دارند مقدار مجاز براي تهيه ماده اي به نام asxd به اين صورت است.
A 0 ~ 50
S 0.5 ~ 0.83
X 81 ~ 92 or 824 ~ 901
D -100 ~ 100
با دريافت مقادير a,s,x,d از ورودي به ما بگويد كه آيا مي توان اين ماده را توليد كرد يا نه ؟
Begin
Num:=0;
Writeln('please enter a s x d');
Readln(a,s,x,d);
If (a>0) and(a<50) then
Num:=num+1;
If (s>0.5)and (s<0.83) then
Num:=num+1;
If ((x>81)and(x<92))or ((x>824)and(x<901))then
Num:=num+1;
If (d>-100) and (d<100) then
Num:=num+1;
If num=4 then
Writeln('yes can')
Else
Writeln('you can not');
End.
تكليف : برنامه اي بنويسيد كه با دريافت سه عدد و با فرض اينكه عدد دوم وتر ميباشد به ما بگوييد كه آيا اين سه عدد تشكيل يك مثلث قايم الزاويه مي دهد يا خير؟
CASE:
CASE ميتواند تعداداي شرط را بگيرد و انتخاب كند.
مقاديري كه دستور CASE ميپذيرد ORDINAL است مقاديري كهORDINAL هستند داراي تركيب نيستند و همچنين قابل شمارش هم هستند مثل INTEGER,CHARACTER,BYTE,BOOLEAN,LONGINT,…
پسREAL,STRING ORDINAL<---- نيستند
CASE تنها دستوري است كه BEGIN ندارد ولي END دارد
مقدارها ميتوانند شامل يك مقدار يا چند مقدار كه از يكديگر با كاما جدا شده اند باشند و يا يگ سري شمارشي باشند مثل:
1:------
1,10,28:------
1..100,150..243:---------
'A'..'Z':---------
Of متغير Case
Begin : مقدار1
-------
-------
End;
Begin : مقدار2
-------
-------
End;
Begin :Else
-------
-------
End;
End.
مثال : برنامه اي بنويسيد كه يك عدد را از ورودي دريافت ( (0<=x<3وتلفظ آنها را چاپ كند.
BEGIN
READLN(X);
CASE X OF
0:WRITELN('ZERO');
1:WRITELN('ONE');
2:WRITELN('TWO')
ELSE
WRITELN('ERROR');
END;
END.
tomboy
پنج شنبه 08 بهمن 1388, 13:11 عصر
مثال : برنامه اي بنويسيد كه دو عدد را از ورودي دريافت و چنانچه عدد اول در بازه 0 تا 5 بود توان دوم عدد دوم را چاپ كند چنانچه 68 بود حاصلضرب دو عدد را چاپ كند و در غير اينصورت مقادير مجاز را چاپ كند.
BEGIN
WRITELN('ENTER TWO NUMBER');
READLN(A,B);
CASE A OF
0..5 :WRITELN(B*B);
68:WRITELN(A*B)
ELSE
WRITELN('ENTER 0..5 OR 68');
END;
END.
- معادل برنامه بالا با دستور If :
Begin
Writeln('enter 2 number');
Readln(a,b);
If (a>=0)and(a<=5) then
Writeln(b*b)
Else
If a=68 then
Writeln(a*b)
Else
Writeln('enter 0..5 or68');
End.
تكليف : روشي براي تلفظ اعداد پيدا كنيد.
حلقه تكرار :
1- تعداد معين
2- تعداد معين
Do مقدار نهايي to { مقدار شروع=: متغير for
downto
begin
___
___
___
end;
توجه مهم : در برخي از حلقه ها دستورات داخل حلقه به متغير حلقه مرتبط مي باشند و در برخي موارد هيچگونه ارتباطي وجود ندارد.
حلقه for براي تعداد تكرار معين به كار ميرود
Downto : در مواردي به كار ميرود كه مقدار اوليه از مقدار نهايي بيشتر باشد
مثال : برنامه اي بنويسيد كه توان دوم اعداد 100 تا 200 را چاپ كند.
Begin
For i:=100 to 200 do
Begin
Writeln(i*i);
End;
End.
نكته : اجازه نداريد مقدار متغير حلقه را در داخل بدنه عوض كنيد .
مثال : برنامه اي بنويسيد كه حاصلجمع اعداد 100..1 را چاپ كند.
Begin
Sum:=0;
For i:=1 to 10 do
Begin
Sum:=sum+i
End;
Write(sum);
End.
مثال : برنامه اي بنويسيد كه حاصلجمع مضارب 5 بين 0 تا 100را به دست آورد.
Begin
Sum:=0;
For I:=1 to 20 do
Begin
Sum:=sum+i*5;
End;
Writeln(sum);
End.
مثال : برنامه اي بنويسيد كه دو عدد را از ورودي دريافت و اعداد ما بين اين دو عدد را چاپ كند (a
Begin
Writeln('enter a,b');
Readln(a,b);
For I:= a to b do
Writeln(i);
End.
مثال : برنامه اي بنويسيد كه با يك حلقه for اعداد بين100..1 و738..353و 950..940 را چاپ كند
Begin
For i:=1 to 950 do
Begin
If ( i>=1) and (i<=100) then
Writeln(i);
If (i>353) and (i<=738) then
Writeln(i);
If (i>=940) and (i<=950) then
Writeln(i);
End;
End.
معادل برنامه بالا با استفاده از دستور case :
Begin
For i:=1 to 950 do
Case I of
1..100,353..738,940..950: writeln(i);
end;
end.
باقيمانده mod
مثال :
X mod y
مثال : برنامه اي بنويسيد كه مضارب 7 بين 1 تا 100 را چاپ كند
Begin
For i:= 1 to 100 do
Begin
If I mod 7 = 0 then
Writeln(i);
End;
End.
مثال : برنامه اي بنويسيد كه تعداد مضارب 5و7 را در بازه 231~846 چاپ كند.
Begin
K:=0;
C:=0;
For i:=846 downto 231 do
Begin
If I mod 5 = 0 then
C:=c+1;
If I mod 7 = 0 then
K:=k+1;
End;
Writeln('5=',c,'7=',k);
End;
End.
مثال : برنامه اي بنويسيد كه حقوق پايه وتعداد فرزندان 100 كارگر را از ورودي دريافت و مبلغ حقوق آنها را بر اساس فرمول زير حساب كند0
1000*تعداد فرزند + حقوق پايه = حقوق كل
Begin
For i:=1 to 100 do
Begin
Writeln('enter salary and number of children');
readln(salary,num);
kol := salary + num * 1000;
writeln(kol);
end;
end.
مثال : برنامه اي بنويسيد كه 100 عدد را از ورودي دريافت و ميانگين و حاصلجمع آنها را به ما بدهد.
Begin
Sum:=0;
For i:= 1 to 100 do
Begin
Writeln('enter num');
Readln(num);
Sum:=sum+num;
End;
Ave:=ave/100;
Writeln(sum,ave);
End.
تعداد تكرار نامعين :
Do شرط while
begin
___
___
___
end;
مثال : برنامه اي بنويسيد كه اعداد 100..1 را چاپ كند
Begin
I:=1;
While i<=100 do
Begin
Write(i);
I:=i+1;
End;
مثال : برنامه اي بنويسيد كه تعدادي اسم را از ورودي دريافت و به ما بگويد چند بار اسم ali تكرار شده است(آخرين اسم end است).
Var
S:integer;
St:string;
Begin
Read(st);
While st<> 'end' do
Begin
If st='ali' then
S:=s+1;
Read(st);
End;write(s);
End.
مثال : برنامه اي بنويسيد كه تعدادي عدد كه آخرين آنها صفر است را از ورودي دريافت و حاصلجمع آنها را چاپ كند.
Begin
Readln(num);
T:=1;
While num<>0 do
Begin
Sum:=sum+num;
Readln(num);
T:=t+1;
End;
Writeln('s=',s,'average',s/t);
End;
تكليف : براي دانش آموزان يك كلاس برنامه اي بنويسيد كه نام آنها به همراه تعداد نمرات و سپس نمرات آنها را به فرم زير از ورودي دريافت كند.تعداد دانش آموزان كلاس نامعين است ولي آخرين نفر نامش end است .برنامه ميبايستي پس از دريافت هر يك از اطلاعات پيامي به شكل زير چاپ كند.
Average: Sum: Ali Name:
3
18
20
13.5
program test;
var
name:string[10];
ave,sum,nomreh:real;
num,i:integer;
begin
writeln('enter name ' );
readln(name);
while name <> 'end' do
begin
writeln('enter num:');
readln(num);
for i:=1 to num do
begin
writeln('enter nomreh: ');
readln(nomreh);
sum:=sum+nomreh;
end;
ave:=sum/num;
writeln('name:',name,'sum:',sum,'ave:',ave);
writeln('enter name ');
readln(name);
end;
end.
تكليف : ميخواهيم براي برنامه هاي خود يك منو تهيه كنيم اين منو شامل موارد زير است
1) load
2) save
3) edit
4) exit
please select a number :
program test;
var
num:integer;
begin
writeln(' 1) load');
writeln(' 2) save');
writeln(' 3) edit');
writeln(' 4) exit');
writeln(please select a number : ');
readln(num);
while num<>4 do
begin
case num of
1:writeln('loading');
2:writeln('saving');
3:writeln('editing');
end;
end;
tomboy
پنج شنبه 08 بهمن 1388, 13:13 عصر
مثال : برنامه اي بنويسيد كه دو عدد را از ورودي دريافت و طبق جدول زير نسبت به مقدار آن واكنش نشان دهد
3 2 1 a
B+...+3+2+1 1..b b..1 واكنش
Begin
Writeln (' enter a,b :');
Readln(a,b);
Case a of
1:begin
for i:=1 to b do
write(i);
end;
2:begin
or I;=b downto 1 do
write(i);
end;
3:begin
sum:=0;
for i:=1 to b do
sum:=sum+I;
write(sum);
end;
end.
tomboy
پنج شنبه 08 بهمن 1388, 13:14 عصر
آرايه ها به عناصري اتلاق ميشود كه با يك نام تعدادي محل از حافظه را كنترل كند براي تشخيص محلها از انديس استفاده ميشود
انواع آرايه ها :
1- آرايه هاي يك بعدي
2- عناصر دو بعدي
3- آرايه هاي سه بعدي
تعريف آرايه ها :
var
نوع of ]انديس پايان..انديس شروع: array [ نام آرايه
نوع متغير آرايه : متغير آرايه
خواندن آرايه :
مثال : برنامه اي بنويسيد كه نمرات 100 دانش آموز را از ورودي دريافت و در يك آرايه بريزد.
Var
A:array[1..100] of real;
Begin
For i:=1 to 100 do
Readln(a[i ]);
tomboy
پنج شنبه 08 بهمن 1388, 13:16 عصر
مثال : برنامه اي بنويسيد كه نمرات 100 دانش آموز را از ورودي دريافت و 50 تاي اول را چاپ كند سپس تعداد نمرات 20 را مشخص كند.
Var
A:array[1..100] of real;
Begin
For I;=1 to 100 do
Writeln('enter no(',I,')');
Readln(a[ i]);
For i:=1 to 50 do
Writeln(a [ i]);
S:=0;
For i:=1 to 100 do
If i:=1 to 100 do
If a[ i]=20 then
S:=s+1;
Writeln(s);
End.
javad2012
یک شنبه 25 دی 1390, 14:29 عصر
سلام
من تازه شروع به پاسكال كردم
وقتي برنامه ام رو اجرا مي كنم error ميده
---------------------------
Error
---------------------------
Runtime error 105 at 0001:0032.
---------------------------
OK
---------------------------
كامپايلر من turbo pascal هست
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.