أولاً : مقدمة .
سنتعرض في هذا الدرس لدراسة عبارات التحكم بمسار البرنامج في الماتلاب والتي تشبه لحد كبير عبارات التحكم في لغات البرمجة الأخرى , وسندرس :
-الاختبار الشرطي if .
-الاختبار switch .
-حلقة while .
-حلقة For .
- إيقاف الحلقةBreak .
-متابعة الحلقة Continue.
-العبارة try .
ثانياً : الحلقات .
1.أمر التحكم (الاختبار) الشرطي If: الشكل العام
elseif logical expression
عبارة else لا تحتوي على شرط منطقي ولكن يجري تنفيذ العبارات المرتبطة بعبارة else إذا كانت نتيجة الشرط المنطقي في عبارة if (أو elseif) خطأ أو مساوي للصفر.
عبارة elseif تحتوي على شرط منطقي يتم تنفيذه إذا كان الشرط المنطقي عبارة if خطأ أو تساوي الصفر ويتم تنفيذ جميع العبارات المرتبطة بها إذا كانت نتيجة الشرط المنطقي في عبارة elseif تساوي الواحد (لا تساوي الصفر).
2.الاختبارswitch : الشكل العام
Switch expression
case value1
statements
case value2
statements
otherwise
statements
end
تنفذ عبارة switch مجموعة من العبارات عن قيم معينة للمتحول المراد اختباره .
تتألف العبارة من كلمة switch متبوعة بالعلاقة المراد اختبارها , وتنفذ العلاقة وتقارن النتيجة مع القيم التي تتبع عبارة case وعند حدوث أول تطابق بين نتيجة العلاقة وبين القيمة الموجودة على يمين عبارة case يتم تنفيذ التي تطابقت القيمة الموجودة على يمينها مع نتيجة العلاقة , حيث أن الماتلاب لا يتابع المقارنة بعد حدوث اول تطابق.
في حال لم يحدث تطابق مع القيم الموجودة على يمين عبارة case ونتيجة العلاقة المراد اختيارها يتم تنفيذ العبارات التي تلي otherwise وعبارة otherwise اختيارية , ويجب إنهاء عبارة switch ب end.
3.حلقة while : الشكل العام
while expression
statements
end
تنفذ حلقة while عبارة أو مجموعة من العبارات بشكل متكرر طالما أن قيمة عبارة التحكم تساوي الواحد (أي عبارة التحكم أو الشرط محقق) و إذا كانت عبارة التحكم مصفوفة فيجب أن تحقق جميع عناصر المصفوفة الشرط ليستمر الحساب.
4.حلقة For : الشكل العام
statements
تقوم حلقة for بتكرار عبارات معينة لعدد محدد من المرات .
5.عبارة الإيقاف break :
تقوم هذه العبارة بإيقاف تنفيذ حلقة For أو حلقة while عند وضعها ضمن الحلقة ... وتتوضح هذه العبارة أكثر بالأمثلة.
6.عبارة المتابعة Continue :
تقوم هذه العبارة بوقف التكرار الحالي للحلقة ويبدأ في التكرار التالي له بمعنى أن الحلقة تستمر بالعمل لكن عند تعرضها لهذه التعليمة ستقوم بتجاهل التعليمات التي تحتها وتعود لمتابعة الحلقة ... وتتوضح هذه العبارة اكثر بالأمثلة.
7.العبارة try : الشكل العام
try statement, … , statement, catch statement, … , statement, end
يتم بشكل طبيعي تنفيذ العبارات بين try و catch ولكن عند حدوث أي خطأ في تنفيذ أي عبارة من العبارات عند ذلك يتم الانتقال إلى تنفيذ العبارات الواقعة بين catch و end وعند حصول خطأ أيضاً من أحد العبارات يوقف الماتلاب تنفيذ الأوامر ويضع عبارة الخطأ في متحول اسمه lasterr.
ملاحظات :
1 - العبارة return تنهي تسلسل تنفيذ الأوامر في الإجراء وتحول القيادة إلى البرنامج الرئيسي وبشكل عام عندما تنتهي أوامر الإجراء فإن القيادة بشكل آلي تنتقل إلى البرنامج الرئيسي ولكن يمكن وضع هذه التعليمة في أي مكان من الإجراء لإعادة القيادة قسرياً إلى البرنامج الرئيسي.
2 – إظهار رسالة الخطأ على الشاشة يتم بواسطة تابع الخطأ بالشكل :
error(‘error_message’)
حيث عند استدعاء رسالة الخطأ من قبل البرنامج فإن البرنامج يظهر العبارة الموضحة بين إشارات التنصيص.
3 – يمكن إدخال المعلومات إلى البرنامج أثناء تنفيذ ملف m وذلك باستخدام التابع input بالشكل :
n = input(‘Prompt_string’)
حيث يظهر على الشاشة سلسلة الحروف بين إشارتي التنصيص.
4 – يمكن التوقف أثناء تنفيذ البرنامج لمراجعة نتائج الحسابات أو لفحص المخططات ولتحقيق ذلك نستعمل الأوامر :
Pause بدون مضمون هذا يسبب توقف البرنامج حتى يضغط المستخدم أي زر من لوحة المفاتيح.
Pause(n) هذا يسبب توقف البرنامج لمدة n ثانية .
ثالثاً : ملاحظات ...
عند كتابة أي برنامج يمكن أن تكون طريقة البرمجة بطريقتين وهما إما أن يكتب البرنامج بشكل مباشر وهذه الطريقة تسمى (script) أو أن ننشئ تابع ونضع ضمنه التعليمات البرمجية اللازمة لتنفيذ البرنامج وهذه الطريقة (function) وهناك عدة فروق بين هاتين الطريقتين نذكر منها :
1-الfunction يبدأ بكلمة function بينما الscript يبدأ بالبرنامج مباشرة.
2-الشكل الافتراضي للكتابة بعد كلمة function هو أن تضع وسطاء الخرج ومن ثم اسم الfunction وبعدها وسطاء الدخل بينما الscripts لا يحتاج إلى كل هذا.
3-يمكنك التابع (function) عند تنفيذه من تغيير وسطاء الدخل بينما لا يكون هذا ممكن في الscripts.
4-المتغيرات التي تحسب في داخل الfunction لا تحفظ في الworkspace بينما في الscripts تحفظ في الworkspace (أي في لوحة الدخل والخرج الرئيسية لبرنامج الماتلاب).
كما أننا عندما نريد البدء بكتابة البرنامج لابد في أن نقوم بفتح ملف من نوع M-file من أجل أن نكتب البرنامج فيه بدلاً من الكتابة في الworkspace لبرنامج الماتلاب وهناك عدة طرق للوصول إلى محرر الM-file وهي إما من اعلى الشاشة نختار file à new à M-file أو أن تكتب edit في الworkspace أو أن نضغط على الملف النصي الظاهر في الصفحة الرئيسية للماتلاب , وعند الإنتهاء من كتابة البرنامج في هذا الملف بقوم بحفظه ومن ثم نقوم بتشغيله من الزر المبين باللون الأخضر اعلى الصفحة ومقاطع الفيديو توضح ذلك أكثر.
رابعأً : أمثلة عملية ...
·المثال الأول
clear
n=5
m=6
for i=1:n
for j=1:m
i;
j;
c(i,j)=i^j
end
end
تم وضع clear في بداية البرنامج لحذف جميع المتغيرات الموجودة في الworkspace وفي هذا البرنامج تكمن وظيفة وضع حلقتي for المتداخلتين في توليد مصفوفة ثنائية البعد حيث تكمن وظيفة حلقة for الأولى في توليد أسطر المصفوفة أما حلقة for الثانية فهي لتوليد أعمدة المصفوفة , حيث هذا البرنامج يقوم بحساب قيمة العنصر من المصفوفة بحيث يساوي رقم السطر الموجود به مرفوعاً بالأس إلى رقم العمود الموجود به هذا العنصر , فلو كان السطر رقمه 3 والعمود رقمه 4 فنلاحظ أن قيمة العنصر ستكون : 81 والمصفوفة الناتجة تكون :
·المثال الثاني
clear
n=-6;
if n<0
disp('input must be positive')
elseif rem(n,2)==0
disp('input is even')
else
disp('input is odd')
end
هذا البرنامج يسمح بإدخال رقم n له قيمة موجبة حصراً ليميز هذا العدد إن كان فردياً أم زوجياً وفي حال إدخال رقم سالب فإنه يعطي العبارة input must be positive ويكون خرج هذا البرنامج في الworkspace .
اعتمدنا في هذا البرنامج على التابع rem(n,2) حيث يقوم هذا التابع بتقسيم العددn على 2 ففي حال وجود باقي للقسمة فلا يتحقق شرط المساواة .
·المثال الثالث
clear
x = 8
units = 'mm'
switch units
case {'inch''in'}
x = x*2.54
case {'feet''ft'}
x=x*12/2.54
case {'millimeter''mm'}
x=x*0.1
case {'centimeter''cm'}
x=x
otherwise
disp(['هذه الواحدة غير معروفة'])
x=nan
end
يقوم هذا البرنامج بتحويل الرقم الذي نكتبه من الواحدة المعطاة (المحددة في السطر الثاني للبرنامج) إلى cm , حيث نلاحظ في المثال الموضح بالبرنامج يكون خرج البرنامج x=0.8.
·المثال الرابع
for i=1:1000
elem = input('==>');
if isempty(elem)
break
end
x(i)=elem
end
x
إن التعليمة input تقوم بطباعة مابين إشارتي التنصيص وتوقف عمل البرنامج حتى يدخل المستخدم قيمة ما ويضغط على الزر Enter , حيث هذا البرنامج يطلب إدخال قيم شعاع قيمة قيمة حتى يدخل المستخدم قيمة فارغة لتقوم break بإنهاء البرنامج.
·المثال الخامس
function vals1(a,b,c)
delta = b^2-4*a*c
if delta>0
x1=(-b+sqrt(delta))/(2*a)
x2=(-b-sqrt(delta))/(2*a)
elseif delta<0
disp('the roots are complex')
else
x1_2=(-b/(2*a))
end
برنامج حل معادلة من الدرجة الثانية بشرط أن تكون حلول هذه المعادلة لا تحوي أي عدد عقدي , نلاحظ أننا انشأنا تابع لحل المعادلة.
إن اسم التابع vals1 هو اختياري للمستخدم ويمكن له تغييره كما يشاء ولكن يجب ملاحظة انه عند حفظ البرنامج يجب حفظه بنفس اسم التابع ومابين قوسين هي الدخل أي القيم التي سيقوم المستخدم بإدخالها , ولإستدعاء هذا التابع نكتب في الworkspace
فيعطي
أو بطريقة ثانية نكتب :
·المثال السادس
function max1(a,b,c)
if a>b
max=a;
if c>max
max=c;
end
else
max=b;
if c>max
max=c;
end
end
max
يقوم هذا البرنامج بتحديد القيمة الأكبر من بين ثلاثة أعداد يدخلها المستخدم , حيث يتم استدعاء التابع الخاص بهذا البرنامج كما يتم الاستدعاء في البرنامج السابق وبإحدى الطريقتين.
·المثال السابع
function c=factor1(n)
v=1
for i=1:n
v=v*i;
end
v
يقوم هذا البرنامج بحساب قيمة العاملي لرقم ما يحدده المستخدم , حيث انشأنا تابع كما في الأمثلة السابقة وطريقة الاستدعاء أيضاً كما ذكرنا في الجلسة السابقة.
·المثال الثامن
function g=sort1(a)
s=length(a);
for i=1:s-1
for j=i+1:s
if a(i)<a(j)
x=a(i);
a(i)=a(j);
a(j)=x;
end
end
end
a
يقوم هذا البرنامج بترتيب عناصر مصفوفة (شعاعية) أي مكونة من سطر واحد ترتيباً تنازلياً , حيث يقارن هذاالتابع قيمة كل عنصر من المصفوفة مع قيمةالعنصر التالي وبناءً على هذا الترتيب يقوم بترتيب عناصر من المصفوفة من جديد.
·المثال التاسع
function prod22(num)
if length(num)~=1|~isnumeric(num)
disp('please enter one number')
else
for i=1:10
disp([num2str(num) 'x' num2str(i) '=' num2str(num*i)])
end
end
يقوم هذا البرنامج بإظهار جدول الضرب لأي رقم يحدده المستخدم , حيث في السطر الثاني من البرنامج يقوم البرنامج بفحص القيمة المدخلة ويتأكد أن لا تكون لا محرف ولا أكثر من رقم , حيث نقوم بتحويل الأرقام إلى محارف بالتعليمة num2str أي number to string وبعد القيام بالعملية المطلوبة بعيد هذه القيمة الرقمية لمحارف بتعليمة معاكسة للسابقة num2str.
·المثال العاشر
function calcul2(a,b,operate)
if operate=='+' | operate=='*' | operate=='-' | operarte=='/'
eval([num2str(a) operate num2str(b)])
else
disp('enter one of this operation{+,-,*,/}')
end
برنامج آلة حاسبة بسيطة حيث يقوم المستخدم بإدخال الرقم الأول والثاني ومن ثم العملية المطلوبة فيعطي البرنامج ناتج العملية بين الرقمين , وفي حال ادخل المستخدم عملية غير معروفة يعطي البرنامج العبارة
'enter one of this operation{+,-,*,/}
في هذا البرنامج نلاحظ أننا استخدمنا التابع eval وتكمن وظيفة هذا التابع في الماتلاب في تنفيذ العبارات المحرفية التي لها معنى في الماتلاب , فلو كتبنا في السطر الثالث للبرنامج العبارة :
z=([num2str(a) operate num2str(b)])
بدلاً من العبارة السابقة أي دون استخدام التابع eval نلاحظ أن البرنامج سيكون خرجه (a+b) "في حال الجمع ومهما كانت قيم a و b"
·المثال الحادي عشر
function game4(c)
n=randperm(c);
for i=1:inf
f=input('enter the number please:')
if f<n(4)
disp('the number is greater than your number')
elseif f>n(4)
disp('the number is smaller than your number')
else
disp('that is right')
disp('congratulaion!!!')
disp(['there are ' num2str(i) 'attempts'])
break
end
end
هذا البرنامج عبارة عن لعبة مسلية يقوم فيها البرنامج بتخزين رقم ويطلب من اللاعب إدخال قيمة للرقم الموجود في ذاكرة البرنامج ليخبره إن كان الرقم أصغر أو أكبر أو يساوي الرقم المخزن في الذاكرة , وبعد إدخال الرقم الصحيح يعطي البرنامج عدد المحاولات التي قام بها اللاعب حتى توصل للرقم الصحيح.
تعليمة randperm تقوم بتوليد أرقام وبترتيب عشوائي والرقم الأعظمي لهذه الأرقام يحدد من قبل المستخدم ويرمز له في برنامجنا هذا c.
المصدر :
- خطوات في احتراف الماتلاب - دار شعاع
- كتاب البرمجة 3 - منشورات جامعة دمشق