دروس في الباسكال

achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
في: كانون الثاني 28, 2009, 01:01:57 مسائاً
اقدم لكم اليوم سلسلة من الدروس في لغة الباسكال
1-تاريخ اللغة
تعود قصة الرياضي والفيلسوف الفرنسي  بليز باسكال إلى منتصف القرن السادس عشر ميلادي عام 1642م حيث أن هذا الشاب والذي  كان يبلغ الثامنة عشر ربيعا والذي كانت بوادر العبقرية والاختراع تبدو جليه على  أعماله وحيث أنه كان شديد الإبداع في علم الرياضيات مولعا بالاكتشافات العلمية  وتطبيق النظريات الرياضية ففي نفس السنه اخترع أول حاسب نصف آلي وسمي باسمه ( حاسب  باسكال 1642 ) ، وكان ذلك لسبب أساسي وهو مساعده أبيه الذي كان يعمل في مؤسسة  الضرائب محصلا للفواتير والذي كان يقضي معظم لياليه مستخدما العد اليدوي في إحصاء  وتدقيق حسابات المبالغ التي حصلها وقد كان يشكل هذا النوع البطيء من الحساب إرباكا  لعائلته ، وبالتالي يأخذ منه الوقت الكبير .

يتكون حاسب باسكال الميكانيكي  من مجموعه متتالية من الإطارات ( الأقراص ) كل واحد منها مرقمة من الصفر إلى التسعة  ، هذه الإطارات مرتبه بحيث تقرأ الأرقام المسجلة عليها من اليسار إلى اليمين ويتم  إدارتها يدويا عن طريق الذراع ، فعندما يتم أحد هذه الأقراص دورته من الصفر إلى  التسع فإن نتوء الرقم 9 يدفع الطارة المجاورة له رقما واحدا وعند ذلك أي دورة  الطارة الأولى تسعة مواقع متتالية ( دوره كاملة ) فإنها تدفع الطارة التالية لها من  اليسار موقعا واحدا وهكذا حتى يتم تسجيل العدد .

وبهذه الطريقة استطاع والد  باسكال إجراء عمليات الجمع والطرح أما عمليات الضرب والقسمة فتتم بتكرار عمليات  الجمع والطرح مرات متعددة .



الدرس الأول : أساسيات في الباسكال



قبل أن نتمكن من كتابة برامج بلغة  الباسكال أو أي لغة أخرى لا بد لنا أولا من فهم منطقي لجميع الخطوات الواجب إتباعها  لحل المسألة بواسطة الحاسب


هذه الخطوات هي ما تعرف باللوغاريتم The  Algorithm بعد ذلك يمكن تحويل هذه الخطوات إلى إيعازات باسكال والتي ستتحول بدورها  إلى لغة الآلة المستعملة بواسطة برنامج المصنف Compiler


وبرنامج  الباسكال هو مجموعه من الإيعازات بعضها منفذ Executable وبعضها غير منفذ  Non-Executable


وتتألف هذه الإيعازات من كلمات دليليه أو من كلمات  تعريفية يجب على المبرمج تعريفها في بداية كل برنامج

ولتوضيح ذلك نرى مخطط  لبرنامج باسكال


Program The Total (input, output);


{This  program find sum of two integer number}


Var

A, B, Total:  integer;


Begin


Write (‘Enter two integer numbers to be  add: ‘);


Readln (a, b);


Total: = a+b;


Writeln  (‘The sum of’, A,’and’, B,’is’, Total);


End.


حيث نلاحظ


- السطر الأول هو للتعريف باسم  البرنامج ووسيله الإدخال والإخراج

- أن الجزء الملون بالأزرق هو عباره عن  كلمات محجوزه سنتعرف عليها بالتفصيل بالدروس القادمه

- الجزء الملون بالأخضر  هو عباره عن إيعاز غير منفذ وهي ملاحظات خاصه بقاريء البرنامج

- الكلمه  الدليليه Var للتصريح عن المتغيرات وسيتم دراستها بالتفصيل

- الجزء الممتد  من Begin إلى End هو عباره عن جسم البرنامج والأوامر بينها

- السطر الأخير  يحتوي على End متبوعه بنقطه وذلك للدلاله على نهايه البرنامج وسنلاحظ أن

1-  بعد كل سطر هنالك نقطه فاصلة (;) للدلالة على سطر آخر يلية

2- بعد كلمه End  هنالك نقطة (.) للدلاله على أنه لا يوجد سطر بعد ذلك


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #1 في: كانون الثاني 28, 2009, 01:03:40 مسائاً
الدرس الثاني - الالوان , الاحداثيات , النوافذ و الصوت



الالوان :

لتغيير لون النص الذي يُطبع على الشاشه يمكننا  استخدام الامر TextColor .

مثال  :
program Colors;

uses
crt;

begin  
TextColor(Red);
Writeln('Hello');
TextColor(White);  
Writeln('world');
end.

 
[/B][/SIZE][/FONT]
الامر TextBackground يقوم بتغيير  لون خلفية النص . اذا كنت تريد تغيير لون خلفية الشاشه إلى لون معيّن يجب ان تستخدم  الامر ClrScr .

program Colors;

uses
crt;  

begin
TextBackground(Red);
Writeln('Hello');  
TextColor(White);
ClrScr;
end.
 
[/SIZE][/FONT]
إحداثيات الشاشه :  
يمكنك ان تضع السهم في اي مكان تريده في الشاشه  بإستخدام الامر GoToXY . في الدوس , الشاشه بعرض 80 حرف و ارتفاعها 25 حرف . يتغير  الطول و العرض في المنصات الاخرى , قد تتذكر الرسوم البيانيه في الرياضيات .  احداثيات الشاشه كذلك تعمل بنفس الطريقه . في المثال الذي سوف نعرضه سوف نعرف كيف  نحرّك المؤشر إلى العمود العاشر في الصف الخامس
[/SIZE][/FONT]
program Coordinates;  

uses
crt;

begin
GoToXY(10,5);
Writeln('Hello');  
end.
 
النوافذ  :

النوافذ  ستسمح لك بتعريفها على الشاشه لكي تحتل المنطقه التي تطلبها . اذا قمت بإنشاء  النافذه و قمت بتنظيف الشاشه سوف يتم تنظيف ما على الشاشه فقط . الامر Window يأخذ  4 بارامترات و هم إحداثيات (اعلى , يسار , يمين , اسفل) .
program Coordinates;  

uses
crt;

begin
Window(1,1,10,5);  
TextBackground(Blue);
ClrScr(Blue);
end.

 
الصوت  :

الامر  Sound يُصدر صوت بالتكرار الذي تطلبه منه الذي تطلبه منه . الامر Delay يأخذ الوقت  بالثواني التي تخبره بها . يستخدم هذا الامر بين الامرين Sound و NoSound ليُصدر  الصوت الاخير من مقدار معين من الوقت

program Sounds;  

uses
crt;

begin
Sound(1000);
Delay(1000);  
NoSound;
end.


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #2 في: كانون الثاني 28, 2009, 01:05:02 مسائاً
الدرس الثالث - المتغيرات و الثوابت



   
 
ما  هي المتغيرات؟
 
المتغيرات عباره عن اسماء تخزّن في ذاكرة الحاسوب .  هذا الاسم يستخدم لتخزين المعلومات في الذاكره .

يمكننا استخدام انواع  مختلفه من المعلومات في المتغيرات , مثلاً الارقام و السلال و غيره .

استخدام المتغيرات :
يجب دائماً ان نعلن عن المتغيرات  قبل استخدامها . نستخدم الكلمه الاساسيه var لعمل ذلك . دائماً يجب اختيار نوع  البيانات للمتغير . وهذه هي انواع المتغيرات المختلفه .

Byte :

من 0 إلى 255

Word :
من 0 إلى 65535

ShortInt :
من -128 إلى 127  

Integer :
من -32768  إلى 32767

LongInt :
من -4228250000 إلى 4228249000

Real :  
قيم النّقطة المتغيّرة

Char :
حرفاً واحداً

String :
فوق 255 حرف

Boolean :
true او false  

في هذا المثال سوف نتعرف على طريقة الاعلان  عن متغير من نوع intger اسمه i :
[/SIZE][/FONT]


program  Variables;

var
i: Integer;

begin
end.  
 

لإعطاء قيمه للمتغير  يتم استخدام عامل الاسناد :=


program  Variables;

var
i: Integer;

begin
i := 5;
end.  
 

يمكنك انشاء متغيرين او  اكثر من نفس النوع إذا وضعت الفاصله بعد المتغير الاول و قمت بكتابة اسم المتغير  الثاني بعدها . كذلك يمكنك انشاء متغيرات مختلفه بدون الحاجه إلى استخدام الجمله  الاساسيه var اكثر من مره :
 

program Variables;  

var
i, j: Integer;
s: String;

begin
end.  
اذا كنت تريد  ادراج سلسله في متغير يجب استخدام علامة الاقتباس الفرديه ' , النوع Boolean فقط  يمكن اسناد قيمتين له و هم True و False :


program  Variables;

var
i: Integer;
s: String;
b: Boolean;  

begin
i := -3;
s := 'Hello';
b := True;
end.  
 
الحسابات مع  المتغيرات :
يمكن استخدام المتغيرات في العمليات  الحسابيه . على سبيل المثال يمكن أن تسند القيمة بمتغيّر ثمّ تضيف الرقم 1 له .  العمليات الحسابيه التي يمكن استخدامها :

+ : اضافه (زائد)
- : طرح  
* : ضرب
/ : قسمه
div : قسمة عدد صحيح
mod : باقي قسمة العدد  الصحيح

المثال التالي يقوم ببعض العمليات الحسابيه :  
 
[/FONT]
program Variables;

var  
Num1, Num2, Ans: Integer;

begin
Ans := 1 + 1;
Num1 := 5;  
Ans := Num1 + 3;
Num2 := 2;
Ans := Num1 - Num2;
Ans := Ans *  Num1;
end.
 
يستخدم النوع Strings في تخزين  السلاسل مثل الحروف والارقام المختلفه و غيره , و يمكنك استخدام العمليات الحسابيه  مع هذا النوع من المتغيرات حيث لا يتم جمع الرقمين المخزنين على صيغة String بمعنى  جمع , مثلاً اذا قمت بإضافة السلسله التي قيمتها 1 إلى السلسله التي قيمتها 1 سوف  يكون الناتج 11 و ليس 2 .
 
program Variables;

var  
s: String;

begin
s := '1' + '1';
end.
 
يمكنك قراءة محتوى المتغيرات  بإستخدام Readln و ReadKey . الامر الثاني و هو ReadKey من الوحده crt و هي تقرأ  حرف واحد فقط . سوف ترى ان طريقة عمل ReadKey مختلفه عن Readln .
 
program Variables;  

uses
crt;

var
i: Integer;
s: String;
c: Char;  

begin
Readln(i);
Readln(s);
c := ReadKey;
end.  
 
طباعة المتغيرات على الشاشه طريقه  سهله . اذا كنت تريد طباعة المتغيرات على الشاشه يمكنك استخدام الامر Writeln :  
 
program Variables;

var  
i: Integer;
s: String;
begin
i := 24;
s := 'Hello';  
Writeln(i);
Writeln(s,' world');
end.
 
الثوابت :

الثوابت لا تختلف عن المتغيرات إلا انه قيمتها لا  يمكن ان تتغير أي قيمه ثابته . يمكن اسناد القيمه إلى الثابت عند الاعلان عن الثابت  . const هي الكلمه الاساسيه للاعلان عن الثوابت .
 
const
pi: Real = 3.14;  

var
c, d: Real;

begin
d := 5;
c := pi * d;
end.  


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #3 في: كانون الثاني 28, 2009, 01:06:54 مسائاً
الدرس الرابع : الثوابت في البرنامج



لقد تعرفنا على طريقة تعريف متغيرات  بالبرنامج لحفظ البيانات فيها حسب نوعها وذلك داخل التعريف Var


ولكن  ماذا لو أردنا تعريف بيانات تكون قيمتها ثابته طوال عمل البرنامج فإننا نستخدم  لتعريفها


نوع جديد داخل الأمر Const وتكون على الشكل التالي  


Const

A = 30 ;


B = 9.6 ;


C =  “Name”;


- طوال عمل البرنامج سيسند للثابت A القيمة 30 ولا يمكن تغيير  هذه القيمة خلال البرنامج أبدا


- نلاحظ أن هناك علامة مساواة = بين إسم  الثابت وقيمته بينما في تعريف Var المتغيرات هناك علامة : بين إسم المتغير ونوعه  


- الثابت المعرف يعامل في البرنامج على أنه كلمة محجوزة Reserved Word  

Program  Circle(input,output);


Const


Pi=3.14;


Var


Radius  : integer ;


Circum , area : real  ;


Begin


Writeln ( ‘Enter Radius’);


Read (  radius);


Circum := 2*pi* radius ;


Area := pi * radius *  radius ;


Writeln (‘The value of circum  is’,circum);


Writeln (‘The value of area  is’,area);


End.


في البرنامج السابق قمنا بتعريف ثابت في  البرنامج بالإسم pi وهو يتخذ دائما القيمة 3.14


إستخدام الثوابت في  البرنامج يسهل عمل البرنامج ويسهل تعديل القيم بسهولة بخاصة في البرامج الكبيرة  


لو أردنا تنفيذ البرنامج السابق ولكن بدون الإعتماد على الثوابت فسيكون  البرنامج على الشكل


Program  Circle(input,output);


Var


Pi : real ;


Radius :  integer ;


Circum , area : real ;


Begin


Write  (‘Enter Value of pi :’);


Readln (pi);


Writeln ( ‘Enter  Radius’);


Read ( radius);


Circum := 2*pi* radius  ;


Area := pi * radius * radius ;


Writeln (‘The value of  circum is’,circum);


Writeln (‘The value of area  is’,area);


End;


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #4 في: كانون الثاني 28, 2009, 01:08:01 مسائاً
تعلم برمجة Pascal الدرس الخامس - اتخاذ القرار



   
 
if then else :  

الجمله  الشرطيه if تسمح لك بإتخاذ القرارات في برنامجك . المثال التالي يسأل المستخدم ان  يدخل رقم و يخبر المستخدم اذا كان الرقم اكبر من 5 .


program  Decisions;

var
i: Integer;

begin
Writeln('Enter a  number');
Readln(i);
if i > 5 then
Writeln('Greater than 5');  
end.
 

و القرارات التي يمكنك  اتخاذها مع الجمله الشرطيه if :

> : اكبر من < : اصغر من
>= :  اكبر من او يساوي <= : اصغر من او يساوي
= : يساوي <> : لا يساوي  

المثال السابق كان يخبرنا فقط اذا كان الرقم اكبر من 5 , اذا كنا نريد ان  يخبرنا انه ليس اكبر من 5 يجب ان نستخدم else .

program Decisions;  

var
i: Integer;

begin
Writeln('Enter a number');  
Readln(i);
if i > 5 then
Writeln('Greater than 5')
else  
Writeln('Not greater than 5');
end.

إذا كانت الحاله صحيحه (True)  اختر الجزء الذي بعد then و اذا لم تكن صحيحه (False) اختر الجزء الذي بعد else .  ذلك لان الحاله i > 5 تعتبر من النوع Boolean


program  Decisions;

var
i: Integer;
b: Boolean;

begin  
Writeln('Enter a number');
Readln(i);
b := i > 5;
end.  
 
اذا كنت تريد ان تستخدم اكثر من  حاله واحده يجب عليك ربط حاله بالاخرى . لربط الحالات يمكنك استخدام AND او OR .  اذا استخدمت AND يجب ان تكون الحالتين صحيحتين و اذا استخدمت OR يجب ان تكون حاله  واحده او الحالتين صحيحتين .

program Decisions;  

var
i: Integer;

begin
Writeln('Enter a number');  
Readln(i);
if (i > 1) and (i < 100) then
Writeln('The number  is between 1 and 100');
end.

اذا كنت تريد كتابة امرين او اكثر  بعد الجمله الشرطيه يجب استخدام begin و end; .

program Decisions;  

var
i: Integer;

begin
Writeln('Enter a number');  
Readln(i);
if i > 0 then
begin
Writeln('You entered ',i);  
Writeln('It is a positive number');
end;
end.

كذلك يمكنك استخدام if داخل if  

program Decisions;  

var
i: Integer;

begin
Writeln('Enter a number');  
Readln(i);
if i > 0 then
Writeln('Positive')
else
if i  < 0 then
Writeln('Negative')
else
Writeln('Zero');
end.  
 

Case :  


الامر Case يشبه إلى حد ما if لكنه يقبل العديد من  الحالات مره واحده
 

program Decisions;  

uses
crt;

var
Choice: Char;

begin  
Writeln('Which on of these do you like?');
Writeln('a - Apple:');  
Writeln('b - Banana:');
Writeln('c - Carrot:');
Choice := ReadKey;  
case Choice of
'a': Writeln('You like apples');
'b': Writeln('You  like bananas');
'c': Writeln('You like carrots');
else;
Writeln('You  made an invalid choice');
end;
end.  



achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #5 في: كانون الثاني 28, 2009, 01:09:02 مسائاً
الدرس السادس - التكرار



   
 
التكرار يستخدم متى اردت اعادة  تطبيق الشيفره اكثر من مره .
مثال : اذا اردنا ان نطبع الجمله Hello على الشاشه 10  مرات سوف نحتاج إلى كتابة الامر Writeln عشرة مرات . يمكنك بإستخدام التكرار ان  تكتب الامر مره واحد و سوف يتم طباعة الجمله 10 مرات .

هناك 3 انواع من  التكرار و هم for , while , repeat .

التكرار For  :
هكذا يتم استخدام التكرار for
[/SIZE][/FONT]

program Loops;  

var
i: Integer;

begin
for i := 1 to 10 do  
Writeln('Hello');
end.
 
اذا كنت تريد استخدام اكثر من امر  بعد الكلمه for فيجب ان تضع الاوامر بوسط الامر begin و end


program Loops;  

var
i: Integer;

begin
for i := 1 to 10 do
begin  
Writeln('Hello');
Writeln('This is loop ',i);
end;
end.  

التكرار While :

التكرار While يكرر الاوامر ما دام الشرط صحيح .  طريقة الاستخدام


program Loops;  

var
i: Integer;

begin
for i := 1 to 10 do
begin  
Writeln('Hello');
Writeln('This is loop ',i);
end;
end.  

 
التكرار Repeat until :

التكرار Repeat until  يشبه التكرار while و لكنه يختبر الحاله في اسفل التكرار .

program Loops;  

var
i: Integer;

begin
i := 0;
repeat
i := i + 1;  
Writeln('Hello');
until i = 10;
end.
 

اذا كنت تريد استخدام  اكثر من حاله في التكرار while او rapeat اضف الاقواس بين الحاله  


program Loops;  

var
i: Integer;
s: String;

begin
i := 0;
repeat  
i := i + 1;
Write('Enter a number: ');
Readln(s);
until (i = 10)  or (s = 0);
end.

Break و Continue :

الامر Break يخرج من من  التكرار في اي وقت . في المثال التالي البرنامج لا يطبع اي شئ لانه يخرج من التكرار  قبل تنفيذ العمليه.

program Loops;  

var
i: Integer;

begin
i := 0;
repeat
i := i + 1;  
Break;
Writeln(i);
until i = 10;
end.

الامر Continue يقفز  إلى اعلى التكرار


program Loops;  

var
i: Integer;

begin
i := 0;
repeat
i := i + 1;  
Continue;
Writeln(i);
until i = 10;
end.  


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #6 في: كانون الثاني 28, 2009, 01:10:38 مسائاً
الدرس السابع : قاعدة الأولويات



يجب علينا قبل الدخول في البرمجة فهم  الطريقة الرياضية للتعامل مع البيانات وطريقة تعامل المصنف مع الدوال الرياضية  والأقواس


وبرنامج الباسكال يتعامل مع العمليات الرياضية حسب القاعدة  التالية

والتي تعتمد على الأسبقية بحيث


أولا : تنفيذ الدالة  Not


ثانيا : تنفيذ الدوال  التالية

AND

MOD

DIV

/

*

بحيث أن  الدالتين Div و Mod دوال رياضية سيتم التعرف عليها لاحقا


ثالثا : تنفيذ  العمليات


OR

-

+


رابعا : تنفيذ المعاملات  المنطقية  

=

<>

<=

>=

<

>


عندما  يكون هناك دالتين من نفس المستوى ننفذ الدالة بدءا من اليسار إلى اليمين  

لتتضح الرؤيا حول إستخدام قاعدة الأولويات نرى الأمثلة  التالية


1-Write a PASCAL program to find the roots of a quadratic  equation (assume that b2 – 4ac >= 0)


يريد في هذا المثال إيجاد  جذور لمتتابعة ثنائية


الحل


Program  Root(input,output);


Var


A,b,c :integer;


X1,x2 :  real ;


الناتج عرفناه على أنه عدد حقيقي لإنه سيكون ناتج من عمليات منها  عمليات قسمة


وفي حالة وجود عمليات قسمة فناتجها دائما عدد حقيقي وليس  صحيح


Begin


Writeln (‘Enter the Numbers A , B  ,C’);


Readln (a,b,c);


X1:= (-b+sqrt(b*b  –4*a*c))/(2*a);


X2:= (-b-sqrt(b*b –4*a*c))/(2*a);


Write  (‘The Nunmber X1 =’,x1 ,’And Number X2 =’,x2);

End.


2- Find (7  Div 2/3)


في هذا المثال نلاحظ أن الدالتين Div و / يأتيان في مرتبة  واحده في أولوية التنفيذ


ولكن لإن Div أتت قبل من جهة اليسار فنقوم  بتنفيذها أولا لذلك


7 div 2/3 =


3 / 3  =


1.0


( لاحظ أن العدد جوابه 1.0 وليس 1 لإنه ناتج من قسمة  فلذلك يعد عدد حقيقي Real ولا يعتبر Integer)


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #7 في: كانون الثاني 28, 2009, 01:11:20 مسائاً
الدرس الثامن - Types, Records و Sets



       
 
الانواع :

من  الممكن ان تقوم بإنشاء نوع متغيرات خاص بك بإستخدام الامر type .
النّوع الاول  الذي يمكن ان تعمله هو نوع records (سجلات) . السجلات هي عباره عن متغيّران او اكثر  من انواع مختله في واحد . على سبيل المثال ان يكون المستخدم طالب و لديه رقم و اسم  الطالب . كيف سوف ننشئ نوعاً من البيانات :

program Types;  

Type
Student = Record
Number:
Name;
end;

begin  
end.

 

بعد ان تنشئ النوع يجّب  ان تعلن عن متغير من النوع الذي قمنا بإنشاءه لكي يمكننا استخدامه :  

program Types;  

Type
StudentRecord = Record
Number:
Name;
end;  

var
Student: StudentRecord;

begin
end.
 
 

للوصول إلى العدد و  الاسم من السجل يجب ان تتبع الآتي :

program Types;  

Type
StudentRecord = Record
Number:
Name;
end;  

var
Student: StudentRecord;

begin
Student.Number :=  12345;
Student.Name := 'John Smith';
end.
 

النوع الآخر هو set ,  النوع set ليس له فائده كبيره , و اي شئ يمكنك عمله مع set يمكن ان يعمل بسهوله في  طريقة اخرى . على سبيل المثال لدينا نوع set يدعى Animal و المعلومات المخزنه dog ,  cat و rabbit :
program Types;

Type
Animal  = set of (dog, cat, rabbit);

var
MyPet: Animal;

begin  
MyPet := dog;
end.


لا يمكنك استخدام Readln او Writeln في  sets . يمكنك ان تنشئ مدى من المتغيرات من 'a' إلى 'z' . في هذا النوع يمكنك ان  تختبر إذا كان المتغير من ضمن المدى :
[/FONT]
program Types;

uses
crt;  

Type
Alpha = 'a'..'z';

var
Letter: set of Alpha;
c:  Char;

begin
c := ReadKey;
if c in [Letter] then
Writeln('You  entered a letter');
end.

 
[/FONT]


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #8 في: كانون الثاني 28, 2009, 01:11:59 مسائاً
الدرس التاسع - الإجراءات و الدوال



الإجراءات  :

الإجراءات يعتبر برنامج فرعي . يمكن ان يستدعى من  الجزء الرئيسي للبرنامج . يتم الإعلان عن الاجراء خارج الجسم الرئيسي للبرنامج  بإستخدام الكلمه procedure . يجب ان تعطي الاجراء اسم مميز . الاجراءات لها بدايه و  نهايه خاصه بها . في هذا المثال سوف نتعرف على طريقة الاعلان و الاستدعاء لاجراء  اسمه Hello يطبع الكلمه "Hello" على الشاشه .
 

program Procedures;  

procedure Hello;
begin
Writeln('Hello');
end;

begin  
end.

لإستخدام الاجراء يجب ان نقوم  بإستدعاءه من خلال اسمه المميز في جسم البرنامج (مكان كتابة شيفره البرنامج)  


program  Procedures;

procedure Hello;
begin
Writeln('Hello');
end;  

begin
Hello;
end.

الاجراءات يجب ان تكون دائماً فوق  المكان الذي يتم استدعاءه اي يجب ان تقوم بالاعلان عن الاجراء ثم استدعاءه ولا يجوز  استدعاء الاجراء قبل الاعلان عنه . في المثال التالي سوف يتم استدعاء اجراء داخل  اجراء آخر .
 

program Procedures;  

procedure Hello;
begin
Writeln('Hello');
end;  

procedure HelloCall;
begin
Hello;
end;

begin  
HelloCall;
end.


يمكن ان تكون للاجراءات بارامترات  مثل اي امر تستخدمه . يجب ان تعطي اسم البارامتر و نوعه و سوف يتم استخدامه مثل اي  متغير . اذا كنت تريد ان تستخدم اكثر من بارامتر في اجراء واحد يجب ان تكون الفاصله  المنقوطه ; هي التي تفصل بينهم


program  Procedures;

procedure Print(s: String; i: Integer);
begin  
Writeln(s);
Writeln(i);
end;

begin
Print('Hello',3);  
end.

المتغيرات العامّه و المحليه :

المتغيرات التي نستخدمها حاليّاً تعتبر متغيرات عامه  , اي يمكننها استخدامها في اي وقت و في اي مكان في البرنامج . المتغيرات المحليه  يمكن استخدامها فقط بداخل الاجراء و المتغيرات المحليه لا تأخذ مكانها من الذاكره  إذا لم يبدأ الاجراء . يتم الاعلان عن المتغيرات المحليه تحت إعلان اسم الاجراء .  


program  Procedures;

procedure Print(s: String);
var
i: Integer;  
begin
for i := 1 to 3 do
Writeln(s);
end;

begin  
Print('Hello');
end.
 
الدوال :

الدوال تشبه الاجراءات بإستثناء انها تعيد قيمه .  الكلمه function تستخدم بدل الكلمه procedure عند تعريف الدوال . لتعريف ما هو نوع  البيانات للقيمه العائده يجب ان تستخدم النقطتين : و بعدها نوع البيانات و قبل  النقطتين اسم الدالّه .


program  Functions;

function Add(i, j:Integer): Integer;
begin
end;  

begin
end.

عند اسناد قيمة الداله لمتغير  سيجعل المتغير يساوي القيمه المعاده من الداله . اذا استخدمت الداله في شئ مع مثل  Writeln سوف يتم طباعة قيمة العائد . لاسناد قيمة العائد انشئ اسم الداله تساوي  القيمه التي تريدها ان تكون هي العائد.


program  Functions;

var
Answer: Integer;

function Add(i, j:Integer):  Integer;
begin
Add := i + j;
end;

begin
Answer :=  Add(1,2);
Writeln(Add(1,2));
end.

يمكنك الخروج من اجراء او داله في  اي وقت بإستخدام الامر Exit .


program  Procedures;

procedure GetName;
var
Name: String;
begin  
Writeln('What is your name?');
Readln(Name);
if Name = '' then  
Exit;
Writeln('Your name is ',Name);
end;

begin
GetName;  
end.


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #9 في: كانون الثاني 28, 2009, 01:12:43 مسائاً
الدرس العاشر - الملفات النصيه



 
الملفات النصيه عباره عن ملفات  تحتوي على اسطر من النصوص . متى اردت الوصول إلى ملف في باسكال يجب عليك ان تنشئ  متغير ملف اولاً


program Files;  

var
f: Text;

begin
end.


بعد الاعلان عن المتغير  يجب ان تسند اسم الملف للمتغير :


program Files;  

var
f: Text;

begin
Assign(f,'MyFile.txt');
end.  


لإنشاء ملف جديد فارغ  استخدم الامر Rewrite . هذا الامر ينشئ اي ملف غير موجود .


program Files;  

var
f: Text;

begin
Assign(f,'MyFile.txt');  
Rewrite(f);
end
 

الامرين Write و  Writeln يعملون على الملفات على طريقه واحده على الشاشه بإستثناء البارامتر الاضافي  الذي يخبرهم للكتابه في الملفات :


program Files;  

var
f: Text;

begin
Assign(f,'MyFile.txt');  
Rewrite(f);
Writeln(f,'A line of text');
end.


اذا كنت تريد قرائه  محتويات ملف موجود سابقاً اولاً يجب ان تستخدم الامر Reset بدلاً من Rewrite .  ثانيا استخدم الامر Readln لقرائه السطور من الملف . سوف تحتاج إلى التكرار while  لقرائه جميع السطور .

program Files;  

var
f: Text;
s: String;

begin  
Assign(f,'MyFile.txt');
Reset(f);
while not eof(f) do  
Readln(f,s);
end.
 

الامر Append يفتح  الملف و يسمح لك ان تكتب المزيد من النصوص في آخر الملف .


program Files;  

var
f: Text;
s: String;

begin  
Assign(f,'MyFile.txt');
Append(f);
Writeln('Some more text');  
end.



يجب عليك اغلاق الملف  بعد الانتهاء من استخدامه . اذا لم تغلقه قد تخسر بعض النصوص التي قمت بكتابتها فيه  .


program Files;  

var
f: Text;
s: String;

begin  
Assign(f,'MyFile.txt');
Append(f);
Writeln('Some more text');  
Close(f);
end.


يمكنك تغير اسم ملف مع  الامر Rename و حذف الملفات مع الامر Erase


var
f: Text;  

begin
Assign(f,'MyFile.txt');
Rename(f,'YourFile.txt');  
Erase(f);
Close(f);
end.

للبحث عن الملف اذا كان موجود ام  لا , يجب اولاً ان تتبع ذلك بإستخدام {$I-} . بعد ذلك يجب ان تقوم بإستخدام الامر  Reset على الملف بعدها استخدام الجمله الشرطيه if IOResult = 2 then و معناها اذا  كان الملف غير موجود , و استخدام الشرط If IOResult = 0 و معناها اذا كان الملف  موجود . و اذا كانت قيمة IOResult ليست 2 او 0 نستخدم الامر Halt لإنهاء البرنامج .  الـ IOResult سوف يفقد قيمته اذا تم استخدامه لمره واحده لذلك يجب علينا ان نضعه في  متغير قبل استخدامه.
 يجب عليك كذلك استخدام {$I+} لإعادة تتبع الاخطاء .  
 

program Files;  

var
f: Text;
IOR: Integer;

begin  
Assign(f,'MyFile.txt');
{$I-}
Reset(f);
{$I+}
IOR :=  IOResult;
if IOR = 2 then
Writeln('File not found');
else
if IOR  <> 0 then
Halt;
Close(f);
end.


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #10 في: كانون الثاني 28, 2009, 01:13:24 مسائاً
الدرس الحادي عشر - ملفات المعلومات



 
ملفات المعلومات تختلف عن ملفات  النصوص بأشياء بسيطه . ملفات المعلومات هي الوصول العشوائي يعني انه لا يجب ان تقرأ  سطر بعد سطر بدلاً من ذلك يمكن ان تصل إلى اي جزء من اجزاء الملف في اي وقت . و  طريقة تعريف ملفات البيانات :


program  DataFiles;

var
f: file of Byte;

begin
end.  
 
يجب ان تستخدم Assign بنفس طريقة  استخدامها في ملفات النصوص .

program DataFiles;  

var
f: file of Byte;

begin
Assign(f,'MyFile.txt');  
end.

يمكنك استخدام Rewrite لانشاء ملف  جديد غير موجود . الاختلاف بين ملفات النصوص و ملفات المعلومات عند استخدام الامر  Rewrite هو ان ملفات المعلومات يمكنك القرائه منها و الكتابة عليها .

program DataFiles;  

var
f: file of Byte;

begin
Assign(f,'MyFile.txt');  
Rewrite(f);
end.

الامر Reset مثل الامر Rewrite  بإستثناء انه لا ينشئ الملف اذا كان لم يكن موجوداً :

program DataFiles;  

var
f: file of Byte;

begin
Assign(f,'MyFile.txt');  
Reset(f);
end.

عندما تريد الكتابه على الملف يجب  ان تستخدم الامر Write , يجب اولاً ان تضع الذي تريد كتابته على الملف في متغير ,  قبل الكتابه او القرائه من ملفات المعلومات يجب ان تستخدم الامر Seek للبحث عن  المكان الصحيح لبداية الكتابه . يجب ان تتذكر ملف المعلومات يبدأ من الوضع 0 و ليس  1 .

program DataFiles;  

var
f: file of Byte;
b: Byte;

begin  
Assign(f,'MyFile.txt');
Reset(f);
b := 1;
Seek(f,0);  
Write(f,b);
end.

الامر Read يستخدم للقراءه من  ملفات المعلومات .

program DataFiles;  

var
f: file of Byte;
b: Byte;

begin  
Assign(f,'MyFile.txt');
Reset(f);
Seek(f,0);
Read(f,b);
end.  

يجب عليك ان تغلق ملفات المعلومات  بعد الانتهاء منها مثل ملفات النصوص .
 

program DataFiles;  

var
f: file of Byte;
b: Byte;

begin  
Assign(f,'MyFile.txt');
Reset(f);
Seek(f,0);
Read(f,b);  
Close(f);
end.

الامر FileSize يمكن استخدامه مع  الامر FilePos لمعرفة متى وصلت إلى نهاية الملفات . الامر FileSize يعيد الرقم  الفعلي لعدد التسجيلات و يبدأ من 1 و ليس 0 . الامر FilePos يخبرنا عن الوضع الذي  هو عليه الملف الآن .

program DataFiles;  

var
f: file of Byte;
b: Byte;

begin  
Assign(f,'MyFile.txt');
Reset(f);
while FilePos(f) <>  FileSize(f) do
begin
Read(f,b);
Writeln(b);
end;
Close(f);  
end.

 
الامر Truncate يحذف أي شئ في  الملف من الوضع الحالي .
 

program DataFiles;  

var
f: file of Byte;

begin
Assign(f,'MyFile.txt');  
Reset(f);
Seek(f,3);
Truncate(f);
Close(f);
end.  


احد اكثر الاشياء افادة  في ملفات المعلومات هو امكانية استخدام التسجيلات و ملفات المعلومات مع بعضها البعض  .
 

program DataFiles;  

type
StudentRecord = Record
Number: Integer;
Name: String;  

var
Student: StudentRecord;

begin  
Assign(f,'MyFile.txt');
Reset(f);
Student.Number := 12345;  
Student.Name := 'John Smith';
Write(f,Student);
Close(f);
end.  



achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #11 في: كانون الثاني 28, 2009, 01:16:36 مسائاً
الدرس الثاني عشر - انشاء وحداتك الخاصّه



لابد و انك تعلم ما هي الوحدات , تذكر  ذلك عندما استخدمنا الوحده crt , قد تضطر يوماً إلى كتابة العديد من الاجراءات و  الدوال . يمكنك انشاء وحدتك الخاصه ووضعك اجراءاتك و دوالك فيها .

لإنشاء  وحدتك الخاصه يجب اولا ان تنشئ ملف باسكال جديد بإسم MyUnit.pas . السطر الاول يجب  ان يبدأ بالكلمه unit و بعدها اسم وحدتك . اسم الوحده يجب ان تكون مثل اسم الملف .  


unit MyUnit;  
 

في السطر التالي نقوم  بإضافة الكلمه interface . بعدها يجب علينا وضع اسم الاجراء الذي سوف نستخدمه من  هذه الوحده . على سيبل المثال قمنا بإنشاء داله بإسم NewReadln تشبه Readln و لكنها  تسمح لك بتحديد عدد الحروف التي يمكن ادخالها .


unit MyUnit;  

interface

function NewReadln(Max: Integer): String;  


السطر الذي يليه نضيف الكله  implementation . هذا هو المكان الذي يمكنك ان تكتب في كامل شيفرتك و اجراءاتك و  دوالك . سوف نحتاج إلى استخدام الوحده crt لإنشاء NewReadln . بعد الانتهاء من  الوحده يجب ان نكتب الامر end للانتهاء .


unit MyUnit;  

interface

function NewReadln(Max: Integer): String;  

implementation

function NewReadln(Max: Integer): String;
var  
s: String;
c: Char;
begin
s := ';
repeat
c := ReadKey;  
if (c = #8){#8 = BACKSPACE} and (s >< ') then
begin  
Write(#8++#8);
delete(s,length(s),1);
end;
if (c >< #8)  and (c >< #13){#13 = ENTER} and (length(s) < Max) then
begin  
Write(c);
s := s + c;
end;
until c = #13;
NewReadln := s;  
end;

end.

بعدها قم بتخزين الوحده . الآن  يمكننا استخدام وحدتنا MyUnit التي قمنا بإنشائها من خلال استدعاء الوحده و استخدام  الداله التي فيها NewReadln .


program  MyProgram;

uses
MyUnit;

var
s: String;

begin  
s := NewReadln(10);
end.




achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #12 في: كانون الثاني 28, 2009, 01:17:02 مسائاً
حلقات التكرار في  باسكال



حلقات  التكرار في لغة باسكال
قد يتطلب الأمر في بعض البرامج أن نكرر تنفيذ  مجموعة من الأوامر لعدد من المرات، أو إلى إن يصبح تعبير ما صحيح (true) أو خطأ  (false).
 كأن نرغب في أن يطلب برنامجنا إدخال10 أعداد  من المستخدم، أو نطلب منه إدخال القدر الذي يريده من الأعداد على أن يكون العدد  الأخير يساوي 0 مثلا. هنا نحن بحاجة إلى استعمال الحلقات في برنامجنا.
 يوجد في لغة باسكال 3 تراكيب لعمل حلقات  التكرار، وسوف نبدأ في هذا الدرس بتعلم أولى هذه الحلقات وهي حلقة FOR.
 حلقة  التكرار FOR:

 إذا أردنا تنفيذ مجموعة من الأوامر لعدد محدد  من المرات، لنقل 6 مرات.
 فأمامنا خياران، الأول أن نعيد كتابة هذه  الأوامر 6 مرات في البرنامج وهو أمر مزعج خاصة إذا كان المطلوب أن نعيد التنفيذ  لعدد أكبر من المرات، 600 مثلا
 أما الخيار الثاني (وهو الأفضل) أن نستخدم  حلقة التكرار FOR في البرنامج. وبهذا فإننا تكتب الأوامر التي ترغب في تكرارها 6  مرات داخل حلقة For مرة واحدة فقط
 كيف؟
 
 كهذا :
 
FOR i:=1 TO 6 DO
write('@');
هنا استعملنا حلقة FOR لتكرار أمر الطباعة  write ('@') لستة مرات
 هذا البرنامج سوف يطبع الأعداد من 1 إلى  20
 
PROGRAM example1  (input,output);
VAR
i: integer;
BEGIN
FOR i:=1 TO 20 DO
Writeln (  i);
END.
والآن لاحظ هذا البرنامج الذي يطبع نفس  الأعداد ولكن بالعكس من 20 إلى 1
 
PROGRAM example1 (input,  output);
VAR
i: integer;
BEGIN
FOR i:=20 DOWNTO 1 DO
Writeln (  i);
END.
هل لاحظت الفرق بين استخدام TO و DOWNTO داخل  حلقة FOR؟
 في الأمثلة السابقة كانت هناك عبارة واحدة  نرغب في تكراره، أي أن جسم الحلقة مكون من عبارة واحدة فقط، ولكن يمكن لجسم الحلقة  أن يتكون من عدة عبارات، وفي هذه الحالة يجب أن تحدد بداية ونهاية جسم الحلقة بـ  BEGIN و END.


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #13 في: كانون الثاني 28, 2009, 01:17:33 مسائاً
عبارة CASE في باسكال



 
عبارة CASE في باسكال
تستخدم عبارة Case (الحالة) في المواقع  التي يراد فيها الاختيار بين عدد من البدائل.
تستخدم عبارة الـ CASE كبديل عن  استعمال عدد من عبارات IF - ELSE المتتالية، والتي غالبا ما تكون أكثر تعقيدا،  وصعبة التتبع والفهم
أما باستعمال الـ CASE فإن البرنامج يصبح  أكثر وضوحا، وسهل التتبع
الصيغة العامة لـ  CASE:
CASE selector  OF
  constent1  :
     statement1;
  constent2 :
      statment2;
 .
 .
 .
 .
END;
selector هو عبارة عن متغير من أي نوع  مدرج (راجع درس الأنواع المدرجة)

constent1 و constent2 هي قيم يمكن  أن يأخذها المتغير selector

فإذا كانت قيمة selector هي  constent1 يتم تنفيذ العبارت التالية لها في هيكل CASE وهي  statement1.

وإذا كانت قيمته constent2 تنفذ  العبارة statment2 وهكذا.
لاحظ المثال  التالي:
PROPGRAM ex1 (input,  output);
VAR
  lettergrade : char;
BEGIN
  wirteln('Enter your last  grade: ');
  readln(lettergrade);
  CASE lettergrade OF
    'A':  writeln('4.0');
    'B': writeln('3.0');
    'C': writeln('2.0');
     'D': writeln('1.0');
    'F': writeln('0.0');
  END
END.
في هذا المثال سوف يطبع البرنامج الدرجة  المقابلة للتقدير الذي حصلت عليه مؤخرا
في بعض الأحيان قد نرغب في تنفيذ نفس  الأوامر لعدة قيم للمتغير selector، في هذه الحالة تذكر هذه القيم وتفصل بينها  بالفاصلة
PROPGRAM ex2 (input,  output);
VAR
  number : Integer;
BEGIN
  wirteln('Enter a number  between 1 - 10: ');
  readln(number);
  CASE number OF
    1, 3, 5, 7,  9 : writeln('The number is odd');
    2, 4, 6, 8, 10: writeln(' the number is  even');
  END
END.
         
طبعا إذا أردنا تنفيذ أكثر من أمر واحد في  كل حالة يجب أن نحيطها بـ BEGIN و END.


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #14 في: كانون الثاني 28, 2009, 01:18:14 مسائاً
جملة IF - ELSE



 
جملة IF -  ELSE
قبل البدأ في شرح جملة IF - ELSE وتوضيح  صيغتها العامة، يجب أن نتطرق إلى موضوع مهم وهو التعابير البوليانية في لغة باسكال،  فلنبدأ على بركة الله.
التعابير البوليانية :
في لغة باسكال تظهر التعابير البوليانية  على أحد شكلين:
1- المتغيرات البوليانية Boolean  variables
وهي عبارة عن متغيرات خاصةتعرف في القسم VAR من البرنامج، وتأخذ أحد  قيميتن True أو False
VAR
  switch :  Boolean;
هنا المتغير switch يأخذ أحد قيمتين Ture  أو False
switch := Ture;
switch :=  False;
ويجب ملاحظة أنه لا يمكن قراءة مثل هذه  المتغيرات باستعمال الدالة read إلا أنه من الممكن طباعتها بالدالة  write.
2- متغيرات مربوطة بعوامل نسبية  Relation  Operators:
من الممكن صياغة التعابير البوليانية باستعمال متغيرات تربط بينها  العوامل النسبية التالية
=    يساوي
<>   لا  يساوي
=>    أقل من أو يساوي
=<    أكبر من أو يساوي
>     أقل  من
<     أكبر من
3- تعابير بوليانية مربوطة بعوامل  منطقية logical operators
يمكن ربط أكثر من تعبير بولياني باستعمال أحد العوامل  المنطقية التالية
NOT     نفي
AND      و
OR        أو
ملاحظة:
العوامل  المنطقية تتمتع بأسبقية أعلى من العوامل النسبية، لهذا فإن التعبير التي يعتبر  خطأ:
NOT  4>5
لأن العامل NOT سوف يطبق أولا، لذا  يجب كتابه التعبير السابق كما يلي:
NOT (4>5)
لتكون قيمته true
بعد هذا الشرح عن التعابير  البوليانية، نعود إلى جملة IF
جملة   IF  ELSE
الشكل العام لها:
IF boolean expression
THEN   statment1
ELSE  statment2
&& الحالة الأولى:

عندما يكون لدينا  عبارة واحدة في فيعي جملة IF
مثال: لدينا متغيرين num1 و num2 والمطلوب طباعة  العدد الأكبر بينهما
IF num1>num2
THEN   writeln('The larger is: ', num1)
ELSE  writeln('The larger is: ',  num2)
لاحظ هنا عدم وجود فاصلة منقوطة في  العبارات بعد THEN و ELSE
&& الحالة الثانية:

عندما تكون لدينا  أكثر من عبارة في كل فرع من فرعي الـ IF
مثال: في نفس المثال السابق لو كان  المطلوب تخزين الرقم الأكبر في متغير max بعد طباعته
IF num1>num2
THEN  BEGIN
   writeln('The larger is: ', num1);
   max:= num1
   END
ELSE  BEGIN
   writeln('The larger is: ', num2);
   max:= num2
    END
في هذه الحالة نحتاج إلى وضع العبارات  التي بداخل الـ THEN بين BEGIN و END ونفصل بينها بفواصل منقوطة، ولكن بدون فاصلة  قبل الـ ELSE