البرمجة/خوارزمية

من ويكي الكتب
اذهب إلى التنقل اذهب إلى البحث

تعنى هذه المادة بدراسة مبادئ وأساسيات التفكير البرمجي والبرمجة الإجرائية 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
weite("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 .