البرمجة/خوارزمية
تعنى هذه المادة بدراسة مبادئ وأساسيات التفكير البرمجي والبرمجة الإجرائية Procedural من خلال لغة باسكال Pascal.
تعتبر لغة باسكال من اللغات الإجرائية التعليمية.
الخوارزمية
عدلهي مجموعة من المعلومات المتسلسلة المنتهية تتم كتابتها بلغة برمجة معينة ويتم حفظها في ملف على وسط تخزين وتتم كتابتها باستخدام محرر نصوص editor
- عند تنفيذ البرنامج ينتقل إلى الذاكرة ram
- يتألف البرنامج من متحولات وثوابت
- كل متحول له اسم
- عند تعريف متحول يفضل إعطائه اسم يدل على وظيفته مثل : sum للجمع counter للعداد
- في شبه الرماز لا حاجة لتعريف المتحولات وأنماطها
- لكل متحول : اسم , قيمة , نمط , عنوان(في الذاكرة ram)
مسألة : اكتب برنامج بلغة شبه الرماز يقوم بقراءة متحول وطباعة قيمته على الشاشة
begin
read a
write ("a is :", a)
end
مسألة : اكتب برنامج يقوم بقراءة نصف قطر دائرة وحساب وطباعة مساحتها ومحيطها
Begin
Write “please enter R"
Read R
M= π*R*R
P=2*R*π
Print M
Print P
- ملاحظات :
- تتغير قيمة المتحول في البرنامج أثناء التنفيذ بينما الثابت له قيمة ثابتة.
- تنفيذ تعليمة الإسناد (النسب) يتم من اليمين إلى اليسار a=a+1
ملاحظة : لا تسرف باستخدام متحولات قد لا تستخدمها في البرنامج فيما بعد .
مسألة : اكتب برنامج يقوم بقراءة طول ضلع مربع وحساب وطباعة مساحته ومحيطه .
Begin
Readln x
Writeln (x*x)
Writeln (4*X)
end
التعليمة الشرطية :
عدلفي هذه التعليمة يجري تنفيذ بعد اختيار شرط ما .
1-التنفيذ بشرط :
وشكلها : إذا (شرط) نفذ
وهنا يتم اختيار الشرط فإن لم يتحقق ينتقل البرنامج إلى التعليمة التالية .
2-التعليمة الشرطية الاخيارية :
وهي الاختيار بين طريقتين للتنفيذ ولكن بشرط .
وشكلها : إذا (شرط) نفذ
تعليمات 1
وإلا مجموعة تعليمات 2
if ( ) then
begin
.
.
end
else
begin
.
.
end
وهنا إذا تحقق الشرط ينفذ المجموعة الأولى وإلا الثانية .
المسألة 7 (نوطة كويتر)
begin
read(mark)
if(mark>=60) then
write("passed")
else
write("failed")
end
مسألة :13 إدخال عدد وفحصه بإظهار رسالة تبين إذا كان هذا العدد زوجياً أم فردياً.
Begin
Readln a
If (a mod 2= 0 ) then
Writeln "even"
Else writeln "odd"
end
ملاحظة : even زوجي odd فردي mod باقي القسمة (إذا كان ناتج باقي قسمة عدد على اثنين صفر فالعدد زوجي وإلا فهو فردي)
المسألة 14
begin
readln(a,b)
if (a>b) then
write(b)
else
write a
end
مسألة : أعد المسألة السابقة ولكن باستخدام write واحدة
begin
readln(a,b)
if (a>b) then
min = b
else
min=a
writeln(min)
end
مسألة : اكتب برنامج لحساب وطباعة مقلوب عدد
begin
read a
if (a<>0) then
write(1/a)
else
weite("error")
end
ملاحظة :
- else تتبع دائما لل if الأقرب
- لا يسبق else ولا يلحقها فاصلة
مسألة 15 : اكتب برنامج لقراءة ثلاثة أعداد وطباعة الأكبر
Begin
Readln a , b , c
Max = a
If (a < b) then
Max =b
If ( max < c ) then
Max =c
Writeln (max)
end
مسألة 16 : اكتب برنامج لقراءة أربعة أعداد وطباعة الأكبر
Begin
Readln a , b , c , d
Max = a
If (a < b) then
Max =b
If ( max < c ) then
Max =c
If ( max < d ) then
Max =d
Writeln (max)
end
مسألة 17: برنامج يقوم بقراءة قيمتين لمتحولين صحيحين ,يبدل بين هاتين القيمتين ثم يقوم بطباعة المتحولين بعد التبديل، باستخدام متحول ثالث وسيط , مثال: بعد قراءة a=4 , b=2 يجب طباعة المتحولين على النحو التالي : a=2 , b=4
Begin
readln(x,y)
temp=x
x=y
y=temp
write(x,y)
end
مسألة : أعد المسألة السابقة ولاكن بدون استخدام وسيط
Begin
Readln a , b
a= a + b
b=a-b
a=a-b
Writeln a ,b
end
end
المتحولات(المتغيرات) Variabes
عدللدينا عدة أنماط:
- Integer أعداد صحيحة, وهو نمط متقطع وترتيبي.
- Real أعداد حقيقية وهو نمط مستمر, مثلاً :لا تستطيع معرفة العددالذي يلي أو العدد الذي يسبق العدد 1.2 .
- Boolean نمط منطقي يأخذ قيمة إما صحيحة True أو خاطئة False
- Char هو نمط محرفي أي يتسع لمحرف واحد فقط كالأحرف و علامات التنقيط والفواصل والأرقام حجمه 1 byte
- string هو نسق (مصفوفة احادية السطر) من المحارف أي انها تتسع لعدة محارف متضمنة الرموز والمحارف والأرقام .
الثوابت Constant
عدلتُستخدم الثوابت constant في لغات البرمجة عادةً لللأغراض التالية:
- حفظ البيانات المهمة
- حفظ البيانات التي من المستحيل أن تتغيّر
طريقة تعريف ثابت في لغة Pascal :
cont pi = 3.14; // example
الجمل والتعابير الشرطية
عدلالجمل والتعابير الشرطية هي التعابير التي تنتهي إلى إحدى قيمتين إما true أو false المثال: سنقوم بإختبار عدد إن كان أكبر من 5 ,ونقوم بطباعته إن كان أكبر من 5 فعلاً
program Main(input, output);
var
n: integer;
begin
readln(n);
if n > 5 then
begin
writeln(n);
end;
end.
هذا النوع السابق من التعابير الشرطية يُسمى بـالتعابير الشرطية البسيطة وهناك نوع آخر من التعابير الشرطية وهو التعابير الشرطية المركبة
الشرط المركب يحوي على أكثر من شرط يرتبط كل منها بالآخر بعلاقة منطقية مثل and, or, xor, rsh, lsh
مثال: سنقوم بإختبار عدد ما إذا كان (أكبر من 5) و (أصغر من 10) في الوقت ذاته وطباعته إذا تحقق الشرط
program Main(input, output);
var
n: integer;
begin
readln(n);
if (n > 5) and (n < 10) then
begin
writeln(n);
end;
end.
مثال: سنقوم بإختبار عدد ما إذا كان (أكبر من 5) أو (أصغر من 10 ويقبل القسمة على 2)
program Main(input, output);
var
n: integer;
begin
readln(n);
if (n > 5) or ((n < 10) and (n mod 2 = 0)) then
begin
writeln(n);
end;
end.
حلقة for
عدلهي إحدى الحلقات البرمجية وتتميز عن غيرها بأنها حلقة منتهية (تكون في حالات نادرة حلقة لا نهائية) تأخذ متحول (عداد) يأخذ قيمة ابتدائية (بدء العد) وقيمة نهائية (نهاية العد) .. أو (شرط استمرار الحلقة كمافي لغة سي بلس بلس) و تستخدم من أجل التكرار ويوجد تحتها مجموعة من التعليمات تبدا ب begin و تنتهي ب ;end و يوجد نوعين من حلقات الfor
متزايدة(تصاعدية) ومتناقصة(تنازلية)
مثال بلغة باسكال
program Main(input, output);
var
i: integer;
begin
for i := 1 to 10 do
begin
writeln(i);
end;
end.
مثال (حساب عاملي عدد طبيعي) بلغة باسكال
program Main(input, output);
var
i, n, factorial: integer;
begin
readln(n); {input the data}
factorial := 1;
for i := 2 to n do
begin
factorial := i * factorial;
end;
writeln(n, '! = ', factorial);
end.
يمكن للحلقة في لغة باسكال أن تكون تنازلية وليست تصاعدية ,أي بدل أن يبدأ العدم مثلاً (من 1 إلى 10 ,يبدأ من 10 إلى 1 تنازلياً)
مثال (حساب عاملي عدد طبيعي بطريقة حلقة عدّ تنازلية) بلغة باسكال
program Main(input, output);
var
i, n, factorial: integer;
begin
readln(n); {input the data}
factorial := 1;
for i := n downto 2 do
begin
factorial := i * factorial;
end;
writeln(n, '! = ', factorial);
end.
حلقة while
عدلحلقة while وتُدعى بالحلقة الشرطية ,يمكن التعبير عنها بالعبارة التالية "طالما (الشرط مُحقق) نفذ ما داخل الحلقة"
مثال (حلقة تقوم بطباعة كلمة "pascal" عدد لامنتهي من المرات):
program Main(input, output);
begin
while true do
begin
writeln('Pascal');
end;
end.
مثال (طباعة أعداد تنازلياً من 10 إلى 1):
program Main(input, output);
var
i: integer;
begin
i := 10;
while i > 0 do
begin
writeln(i);
i := i - 1;
end;
end.
مثال (عاملي عدد ):
program Main(input, output);
var
n, fact: integer;
begin
fact := 1;
readln(n);
while n > 1 do
begin
fact := n * fact;
n := n - 1;
end;
writeln(factorial);
end.
مثال ( طباعة معكوس عدد):
program Inverse;
var
n: integer;
begin
writeln ('plz enter the number u want to inverse ')
readln(n);
while n <> o do
begin
write(n mod 10);
n:=n div 10 ;
end;
end.
المصفوفات Arrays
عدلمسألة 55:
يريد مدرس مقرر مادة إصدار قائمة بالطلاب الواجب حرمانهم من تقديم الامتحان النهائي في هذا المقرر ، بحيث يتم حرمان الطالب في حال تجاوزت النسبة المئوية لغيابه في المحاضرات النظرية و العملية معاً نسبة تغيب مقبولة يتم تحديدها من قبل مدرس المقرر .
المطلوب كتابة برنامجاً يعمل على :
- طباعة قائمة بأرقام الطلاب المحرومين و نسبة تغيبهم .
- حساب و طباعة عدد الطلاب المحرومين و المقبولين .
- حساب و طباعة النسبة المئوية لعدد الطلاب المحرومين .
الحل :
program Q55(input, output);
var
rating : real;
student : array [1..100] of real;
num, i : integer;
passed : integer;
failed : integer;
begin
write('input standerd rate : ');
readln(rating);
write('input number of the students : ');
readln(num);
writeln;
passed := 0;
failed := 0;
for i:=1 to num do
begin
write('rate of student [', i, '] : ');
readln(student[i]);
if student[i] >= rating then
passed := passed + 1
else
failed := failed + 1;
end;
for i:=1 to num do
if student[i] < rating then
writeln('student number [', i, '] : failed : ', student[i]:2:2, ' %');
writeln;
writeln('passed students : ', passed);
writeln('failed students : ', failed);
writeln;
writeln('rate of the failed student : ', ((failed*100)/num):2:2, ' %');
readln;
end.
شرح الكود
سنقوم بشرح الكود بعد تعريف المتحولات أي من الـ Begin أولاً سنقوم بقراءة النسبة المئوية الحدية rating (أي النسبة الدنيا لحضور الطالب التي تخوله للنجاح) ثم سنقوم بقراءة عدد الطلاب num ثم سندخل في حلقة for من الواحد إلى num (عدد الطلاب) لقراءة مصفوفة تحوي بكل خانة منها نسبة حضور كل طالب فإذا كانت هذه النسبة أكبر من النسبة الحدية فالطالب ناجح ونزيد قيمة المتحول passed (التي تدل على عدد الطلاب الناجحين) نزيدها واحد أما إذا كانت هذه النسبة أصغر من النسبة الحدية فالطالب راسب لذلك نزيد قيمة المتحول failed (الذي يدل على عدد الطلاب الراسبين) نزيدها واحد.
عند الانتهاء من قراءة مصفوفة نسب الحضور ندخل بحلقة for أخرى (أيضاً من الواحد إلى num ) فإذا كانت النسبة الموجودة في المصفوفة والتي ترتيبها فيها i أصغر من النسبة الحدية عندها نقوم بطباعة نسبة الحضور.
وعند الخروج من الحلقة نقوم بطباعة قيمة المتحول passed والذي أصبح يحمل عدد الطلاب الناجحين ، وطباعة قيمة المتحول failed والذي أصبح يحمل عدد الطلاب الراسبين.
ونقوم بطباعة نسبة عدد الطلاب الراسبين والذي نعينه بالنسبة بين عدد الطلاب الراسبين والعدد الكلي للطلاب ، وللحصول على نسبة مئوية نضرب الناتج بـ 100 .