Looping Structures
Looping Structures
لذلك ال بد من استخدام شيء يمكننا من تكرار تنفيذ العملية ,أال وهو ال looping(Repetition) structuresوتشمل لغة ال
C++ثالث تراكيب ( )for, while, do…whileوسوف نتعرف على كل منهما في هذا القسم.
while loop
تعد حلقة التكرار whileأحد التراكيب التي تغير تسلسل تنفيذ الكود ,حيث تعمل على تكرار تنفيذ جملة معينة إذا تحقق شرط
معين ,وفيما يلي التركيب البناء ل .while loop
إذا أردنا أن ننفذ أكثر من جملة عند تحقق شرط ال while loopفإننا نستخدم ال (Compound )Block of statement
.statement
مثال :1
;int i = 0
{ )(void setup
;)Serial.begin(9600
{)while(i <= 20
;)Serial.print(i
;)" Serial.print(",
;i = i + 5
;)delay(500
}
;)"Serial.println("\nwhile loop finished
}
{ )(void loop
}
نالحظ أن األردوينو وصل ال while loopثم فحص شرط التكرار ,فكانت نتيجته trueوذلك ألن قيمة ال iهي 0وهي أقل
أو تساوي ,20فبالتالي بدا األردوينو بتنفيذ جملة ال loopحيث طبع قيمة ال iعلى شاشة المراقب التسلسلي يليه " ",ثم
أضاف 5على ال iثم توقف األردوينو لمدة نصف ثانية ,وبعد االنتهاء من تنفيذ جملة التكرار رجع األردوينو ليفحص الشرط
وهو ( )i <= 20فكانت قيمته trueألن قيمة ال iأقل هي ,1فينفذ األردوينو جملة التكرار مرة أخرة ,ويبقى يكرر بالعملية
حتى يصل فحص الشرط الذي يكون فيه قيمة ال iهي 25فتكون قيمة الشرط ( )i <= 20هي falseفبالتالي ال ينفذ
األردوينو جملة التكرار وينفذ الجملة التي تلي جملة التكرار حيث يطبع على شاشة المراقب التسلسلي الجملة التالية ( while
)loop finishedبعد ان ينتقل إلى السطر الجديد ,الجدول التالي يوضح ألية تنفيذ ال while loopفي جميع الدورات
( )iterationالتي تمر بها.
Iteration Value of i Expression in Line 2 Statements in Lines 4 and 5
1 i=0 i <= 20 is true Output: 0
i=i+5=0+5=5
2 i=5 i <= 20 is true Output: 5
i = i + 5 = 5 + 5 = 10
3 i = 10 i <= 20 is true Output: 10
i = i + 5 = 10 + 5 = 15
4 i = 15 i <= 20 is true Output: 15
i = i + 5 = 15 + 5 = 20
5 i = 20 i <= 20 is true Output: 20
i = i + 5 = 20 + 5 = 25
6 i = 25 i <= 20 is false The loop terminates
وفيما يلي الناتج النهائي الذي يظهر على شاشة المراقب التسلسلي:
0, 5, 10, 15, 20,
while loop finished
String name;
int numOfStudents, grade, totalGrade = 0, avarge;
int count;
void setup() {
Serial.begin(9600);
Serial.print("Enter the number of Students ==> ");
while(!Serial.available());
numOfStudents = Serial.parseInt();
Serial.println(numOfStudents);
count = 0;
while (count < numOfStudents){
Serial.print("Enter the student's name == >> ");
while(!Serial.available());
name = Serial.readString();
Serial.print(name);
Serial.print(" ,and his grade == >> ");
while(!Serial.available());
grade = Serial.parseInt();
Serial.println(grade);
totalGrade += grade;
count++;
}
Serial.print("\nThe total grade is :: ");
Serial.println(totalGrade);
Serial.print("Student average is = ");
//Serial.println(totalGrade/numOfStudents); note that the output is int
Serial.println(static_cast<float>(totalGrade)/numOfStudents);
}
void loop() {}
while(!Serial.available());
variable = Serial.read(); // or any read variable function.
void setup() {
Serial.begin(9600);
while(!Serial.available());
stud_name = Serial.readString();
Serial.print(stud_name);
Serial.print(" ,and the grade ==> ");
while(!Serial.available());
stud_grade = Serial.parseInt();
Serial.println(stud_grade );
totalMarks += stud_grade;
numOfStudents++;
while(!SENTINEL.equals(stud_name)){
Serial.print("enter the student ");
Serial.print(" name ==> ");
while(!Serial.available());
stud_name = Serial.readString();
Serial.print(stud_name);
Serial.print(" ,and the grade ==> ");
while(!Serial.available());
stud_grade = Serial.parseInt();
Serial.println(stud_grade );
totalMarks += stud_grade;
numOfStudents++;
}
Serial.print("\nThe number of students == ");
Serial.println(numOfStudents - 1);
Serial.print("Student average == ");
Serial.println(static_cast<float>(totalMarks)/(numOfStudents-1));
}
void loop() {}
enter the student 1 name >== Ali ,and the grade ==> 85
enter the student 2 name >== Mohammed ,and the grade ==> 72
enter the student 3 name >== Sara ,and the grade ==> 80
enter the student 4 name >== Ahmad ,and the grade ==> 90
enter the student 5 name >== Mona ,and the grade ==> 94
enter the student 6 name >== Stop ,and the grade ==> 0
لمقارنة متغيرين من نوع Stringفإننا ال نستخدم العالقة التالية ” , “String1” == “String2وذلك ألن أداة المساواة تستخدم
بين أنواع البيانات البسيطة ,وليست بين أنواع البيانات المركبة ,حيث أن المتغير من نوع Stringهو عبارة عن مجموعة من
ال charلذلك فهو ليس نوع بيانات بسيط ,ولحل هذه المشكلة نستخدم األمر التالي String1.equals(String2) :حيث أن
هذا األمر يرجع trueاذا تطابق كال ال Stringويرجع falseعدا ذلك ,ولالطالع على تفاصيل أكثر اتبع الرابط التالي.
نالحظ أن مثال ,1ومثال 2يقومان بنفس الوظيفة ،لكن مثال 2يتيح لنا ادخال ما نشاء من بيانات الطالب بدون معرفة عددهم
مسبقا ،لكن في مثال ,1ال بد من معرفة عدد الطالب قبل عملية ادخال بياناتهم ،كما نالحظ أنه عند إدخال كلمة stopإلى
األردوينو فإن البرنامج يقوم بطباعتها على أنها اسم طالب ،وال يتوقف مباشرة ،وخالل هذا الموضوع سنالحظ كيف حل هذه
المشكلة باستخدام تراكيب برمجية مختلفة ...
;bool isFound
)while (!isFound
{
.
.
.
)if(expression
;isFound = true
.
.
.
}
مثال :4
يقوم البرنامج التالي بشكل عشوائي بإنشاء عدد صحيح أكبر من أو يساوي 0وأقل من .100ثم
يطلب البرنامج من المستخدم تخمين الرقم .إذا خمن المستخدم الرقم بشكل صحيح ،يقوم
البرنامج بإخراج رسالة مناسبة .بخالف ذلك ،يتحقق البرنامج مما إذا كان الرقم الذي تم تخمينه
أقل م ن الرقم العشوائي .إذا كان الرقم الذي تم تخمينه أقل من الرقم العشوائي الذي تم إنشاؤه
بواسطة البرنامج ،فسيخرج البرنامج الرسالة "تخمينك أقل من الرقم .خمن مرة اخرى!"؛ خالف
ذلك ،يقوم البرنامج بإخراج الرسالة "تخمينك أعلى من الرقم .خمن مرة اخرى!" .ثم يطلب البرنامج
من المستخدم إدخال رقم آخرُ .يطلب من المستخدم تخمين الرقم العشوائي حتى يقوم بإدخال
الرقم الصحيح .إلنشاء رقم عشوائي ،يمكنك استخدام الدالة ) random(maxبعد تعريفها من الدالة
)( .randomSeedعلى سبيل المثالُ ،يرجع التعبير ) random(maxقيمة longبين 0و.max-1
لالطالع على تفاصيل أكثر عن دالة التخمين العشوائي ،اتبع الرابط التالي.
int num; //variable to store the random number
int guess; //variable to store the number guessed by the user.
bool isGuessed; //boolean variable to control the loop
void setup()
{
Serial.begin(9600);
Serial.setTimeout(10);
randomSeed(analogRead(0));
num = random(100);
isGuessed = false;
while (!isGuessed)
{
Serial.print("Enter an integer greater");
Serial.print(" than or equal to 0 and ");
Serial.print("less than 100: ");
while(!Serial.available());
guess = Serial.parseInt();
Serial.println(guess);
if (guess == num)
{
Serial.println("You guessed the correct number.");
isGuessed = true;
}
else if (guess < num){
Serial.print("Your guess is lower than the ");
Serial.println("number.\n Guess again!");
}
else{
Serial.print("Your guess is higher than ");
Serial.println("the number.\n Guess again!");
}
}
}
void loop() { }
:فيما يلي الخرج الذي ظهر على شاشة المراقب التسلسلي ألحد المحاوالت
Enter an integer greater than or equal to 0 and less than 100: 80
Your guess is lower than the number.
Guess again!
Enter an integer greater than or equal to 0 and less than 100: 85
Your guess is lower than the number.
Guess again!
Enter an integer greater than or equal to 0 and less than 100: 90
Your guess is lower than the number.
Guess again!
Enter an integer greater than or equal to 0 and less than 100: 93
You guessed the correct number.
for Looping (Repetition) Structure
شكل مخصص منfor حيث تعتبر حلقة,C++ التي تم مناقشتها سابقا كافية لتنفيذ أغلب أشكال التكرار فيwhile تعتبر حلقة
counted or بfor loop لهذا السبب تسمى ال,counter controlled while loop وهي تمثل,while أشكال حلقة
.indexed for loop
الشكل,for loop control statement بupdate statement وloop condition وinitial statement تسمى
:for loop التالي يوضح ألية عمل ال
:5 مثال
The following for loop prints the first 10 nonnegative integers:
: بشكل أكبرfor loop األمثلة التالي يساعد على فهم، عبارة عن جملة مركبةfor من الممكن أنت تكون جملة حلقة
:6 مثال
1. The following for loop outputs Hello! and a star (on separate lines) five times:
The for loop controls only the first output statement because the two output statements are not
made into a compound statement using braces. Therefore, the first output statement executes five
times because the for loop body executes five times. After the for loop executes, the second
output statement executes only once. The indentation, which is ignored by the compiler, is
nevertheless misleading
:7 مثال
The following for loop executes five empty statements:
The semicolon at the end of the for statement (before the output statement, Line 1) terminates the
for loop. The action of this for loop is empty, that is, null. As in Previous example, the indentation
of Line 2 is misleading.
The following are some comments on for loops:
• If the loop condition is initially false, the loop body does not execute.
• The update expression, when executed, changes the value of the loop control variable
(initialized by the initial expression), which should change in such a way that eventually
sets the value of the loop condition to false. The for loop body executes indefinitely if
the loop condition is always true.
• A semicolon at the end of the for statement (just before the body of the loop) is a
semantic error. In this case, the action of the for loop is empty.
• In the to be true for statement, if the. loop condition is omitted, it is assumed
• In a for statement, you can omit all three statements—initial statement, loop condition,
and update statement. However, the for statement must contain two semicolons. The
following is a legal
for loop:
for(;;)
Serial.println ("Hello" );
This is an infinite for loop, continuously printing the word Hello.
: الحظ المثال التالي، للعد تنازلياfor من الممكن استخدام عداد في حلقة
؛ في نهاية حلقة1 تتم تهيئة المتغير على، التاليةfor في حلقة.يمكنك زيادة (أو إنقاص) متغير التحكم في الحلقة بأي رقم ثابت
. أعداد صحيحة فردية موجبة5 أولfor ينتج عن حلقة.2 بمقدارi تتم زيادة،for
)for (i = 1; ; i++
;)Serial.println(i
;)"Serial.print("Stop
نظرا لحذف شرط الحلقة من تعليمة ،forيكون شرط الحلقة دائ ًما صحي ًحا .هذه حلقة ال نهائية.
في حلقة forهذهً ،
:8 مثال
(اكتب كود أردوينو يطلب من,for loop باستخدام ال,2 أعد كتابة كود يعمل نفس وظيفة مثال
وكذلك اسم ودرجة كل طالب لحساب معدل الطالب،المستخدم ادخال عدد الطالب داخل الفصل
:)في الفصل
String name;
int numOfStudents, grade, totalGrade = 0, avarge;
int count;
void setup() {
Serial.begin(9600);
Serial.print("Enter the number of Students ==> ");
while(!Serial.available());
numOfStudents = Serial.parseInt();
Serial.println(numOfStudents);
for (count = 0; count < numOfStudents; count++){
Serial.print("Enter the student's name == >> ");
while(!Serial.available());
name = Serial.readString();
Serial.print(name);
Serial.print(" ,and his grade == >> ");
while(!Serial.available());
grade = Serial.parseInt();
Serial.println(grade);
totalGrade += grade;
}
Serial.print("\nThe total grade is :: ");
Serial.println(totalGrade);
Serial.print("Student average is = ");
Serial.println(static_cast<float>(totalGrade)/numOfStudents);
}
void loop() {}
:سيكون الخرج على شاشة المراقب التسلسلي كالتالي
Enter the number of Students ==> 3
Enter the student's name == >> Ali ,and his grade == >> 80
Enter the student's name == >> Amer ,and his grade == >> 99
Enter the student's name == >> Ahmad ,and his grade == >> 60
:9 مثال
The following C++ program finds the sum of the first n positive integers.
void setup() {
Serial.begin(9600);
Serial.setTimeout(10);
void loop() {}
في هذه الموضوع سوف نتكلم عن النوع الثالث من حلقات التكرار ،أال وهو ( ,)do…whileفيما يلي التركيب البنائي لجملة
ال .do…while
بالطبع ال statementمن الممكن أن تكون جملة واحدة ،أو مجموعة جمل على شكل ,compound statementإذا كانت
عبارة عن جملة مركبة فال تنسى األقواس الخاصة بالجمل ال ُمركبة ،الشكل التالي يوضح ألية عمل هذه الجملة.
:10 مثال
i = 0;
do
{
Serial.print(i);
Serial.print(" ");
i = i + 5;
}
while (i <= 20);
pretest loops لذلك يطلق مصطلح، يتم تنفيذ شرط التكرار قبل تنفيذ جملة التكرارfor و جملة الwhile في جملة ال
لذلك يُطلق عليها, قبل تنفيذ شرط التكرارdo…while بينما تنفذ جملة التكرار في ال,for وwhile على كل من جملة
أال تتنفذ (إذا كانwhile أو الfor ومن هنا نالحظ أنه من الممكن لجملة التكرار في حلقة ال,posttest loops مصطلح
. المثال التالي يوح السابق,do…while ) بينما جملة التكرار تنفذ على األقل مرة واحدة في حلقةfalse شرط التكرار
:11 مثال
.افترض وجود الجمل التالية
a) i = 11;
while (i <= 10)
{
Serial.print(i);
Serial.print(" ");
i = i + 5;
}
Serial.println();
b) i = 11;
do
{
Serial.print(i);
Serial.print(" ");
i = i + 5;
}
while (i <= 10);
Serial.println();
In (a), the while loop produces nothing, the statement never executes. In (b), the do. . .while loop
outputs the number 11 and also changes the value of i to 16. This is expected because in a
do…while, the statement must always execute at least once
:12 مثال
.do…while مستخدما حلقة,3 أعد صياغة مثال
بحيث يتم ادخال اسم الطالب،اكتب كود أردوينو يتيح للمستخدم ادخال اسم الطالب وعالمتهم
بحيث ينتهي عملية االدخال اذا قام، وعالمته وهكذا، ثم اسم الطالب الثاني،األول وعالمته
. ثم يقوم البرنامج بحساب متوسط عالمات الطالب،)Stop( المستخدم بإدخال كلمة
void setup() {
Serial.begin(9600);
do
{
Serial.print("enter the student ");
Serial.print(" name ==> ");
while(!Serial.available());
stud_name = Serial.readString();
Serial.print(stud_name);
Serial.print(" ,and the grade ==> ");
while(!Serial.available());
stud_grade = Serial.parseInt();
Serial.println(stud_grade );
totalMarks += stud_grade;
numOfStudents++;
} while(!SENTINEL.equals(stud_name));
void loop() {}
enter the student name ==> Ali ,and the grade ==> 85
enter the student name ==> Mohammed ,and the grade ==> 72
enter the student name ==> Sara ,and the grade ==> 80
enter the student name ==> Ahmad ,and the grade ==> 90
enter the student name ==> Mona ,and the grade ==> 94
enter the student name ==> Stop ,and the grade ==> 0
The number of students == 5
Student average == 84.20
بمجرد تنفيذ األردوينو لجملة breakينتقل البرنامج لتنفيذ أول جملة في الكود تلي حلقة التكرار.
تستخدم جملة continueفي حلقات التكرار الثالث ( .)for, while and do…whileإذا تم تنفيذ جملة continueفإن
األردوينو سوف يتجاهل باقي جملة التكرار ،وينتقل البرنامج إلى العملية التالية ( )the next iterationفي كل من حلقة
whileوحلقة ، do…whileبينما ينفذ البرنامج update statementثم شرط التكرار في حلقة forوينتقل إلى العملية
التالية (.)the next iteration
:13 مثال
إال،" طلب البرنامج إدخال عالمة الطالبStop" أننا عندما قمنا بإدخال كلمة,12 نالحظ في مثال
. لحل هذه المشكلة12 قم بإعادة مثال،أنه من البديهي أن تنتهي عملية اإلدخال
void setup() {
Serial.begin(9600);
Serial.println("This program calculates the average of the student\n");
do
{
Serial.print("enter the student ");
Serial.print(" name ==> ");
while(!Serial.available());
stud_name = Serial.readString();
Serial.print(stud_name);
if(SENTINEL.equals(stud_name))
break;
Serial.print(" ,and the grade ==> ");
while(!Serial.available());
stud_grade = Serial.parseInt();
Serial.println(stud_grade);
totalMarks += stud_grade;
numOfStudents++;
} while(!SENTINEL.equals(stud_name));
void loop() {}
enter the student name ==> Ali ,and the grade ==> 85
enter the student name ==> Mohammed ,and the grade ==> 72
enter the student name ==> Sara ,and the grade ==> 80
enter the student name ==> Ahmad ,and the grade ==> 90
enter the student name ==> Mona ,and the grade ==> 94
enter the student name ==> Stop
The number of students == 5
Student average == 84.20
مثال :14
اكتب برنامج أردوينو يعمل على جمع األرقام من 1إلى 9ما عدا ال 5
{ )(void setup
;)Serial.begin(9600
;int sum = 0
{)for(int i = 0; i < 10; i++
)if(i == 5
;continue
;sum += i
}
;)Serial.println(sum
}
}{ )(void loop
الحظ عند تحقق شرط جملة ifفإن البرنامج سينفذ جملة ,continueوالتي تعني أن البرنامج سيتجاهل باقي جملة التكرار
وينتقل إلى ال iterationالتالية ،بعد تنفيذ ال .update statement
مثال :15
أكتب كود أردوينو يقوم بطباعة الشكل التالي على شاشة المراقب التسلسلي.
*
**
***
****
*****
من الواضح أننا نريد طباعة خمسة أسطر من النجم (*) في السطر األول نريد طباعة نجمة واحدة ,وفي السطر الثاني نجمتان,
في الثالث ثالث نجم ,وهكذا ,بما أننا نريد طباعة خمس أسطر فبالتالي سنستخدم الجملة التالية:
نالحظ أن قيمة المتغير iفي السطر األول هي ,1وفي السطر الثاني هي ,2وفي الثالث ,3وهكذا ،لذلك من الممكن أن
نستخدم قيمة المتغير iلتحديد عدد النجم في كل سطر ،ويكون هذا من خالل حلقة تكرار داخل حلقة التكرار األولى ،ليصبح
الكود كالتالي:
for (i = 1; i <= 5; i++) //Line 1
{ //Line 2
for (j = 1; j <= i; j++) //Line 3
Serial.print("*"); //Line 4
Serial.println(); //Line 5
}
مثال :16
لنفترض أننا نريد طباعة الجدول التالي:
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
بما أننا نمتلك 5أسطر فإننا سنكتب الجملة التالية كما في المثال السابق:
نالحظ أن السطر األول من الجدول عبارة عن األرقام من 1إلى ,10بينما السطر الثاني عبارة عن األرقام من 1إلى 10
مضروبة ب ,2واألرقام في السطر الثالث عبارة عن األعداد من 1إلى 10مضروبة ب ,3وهكذا ،لذلك سيكون الكود
كالتالي:
{)(void setup
;int i,j
;)Serial.begin(9600
}{)(void loop
أسئلة وتمارين- :
سؤال - :1
أكتب كود أردوينو يظهر الجدول التالي:
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
سؤال - :2
صمم كود أردوينو بحيث نمتلك 5لدات متصلة بالمنفذ 9و 10و 11و 12و ,13بحيث يقوم أحد اللدات
بالوميض ،في حين تكون اللدات األخرى مضيئة ،والجدول التالي يوضح عدد مرات الوميض لكل لد،
وتوقيت الوميض الخاص به وكذلك سرعة الوميض.