בחזרה לעמוד הבית

לולאות ב-actionscript

 

שיעור זה מסביר כיצד להשתמש בלולאות for / for in , while ו- do while .

 

לולאת for

בלולאת for צריכים להופיע שלושה סוגי ערכים חוץ מבלוק הפקודות שמתבצע בכל פעם שמתרחשת הלולאה , מבנה הכתיבה של הלולאה היא בצורה הבאה :

 

for (initialization; condition ; activities ){

//what will the loop activate

//……..

}

 

initialization – אתחול משתנים . בחלק זה נכתבים המשתנים שמאותחלים רק בתחילת הלולאה , ולא בכל פעם שמתבצע סיבוב . אם נשים את האיתחול בתוך הלולאה עצמה הערך של המשתנה יחזור לערך האיתחול בכל סיבוב ואילו בצורה זו המשתנה מאותחל רק פעם אחת .

 

condition – כלל ביצוע הלולאה , כל עוד הערך של הכלל הוא true הלולאה מתבצעת . דוגמאות לכללים : index>5 , index==20 , val1>=val2 וכדומה .

 

Activities – פעולה שמתבצעת בכל פעם שמתרחש סיבוב , חוץ מהפעם הראשונה . בעיקרון ניתן לכתוב את הפעולה גם בתוך הלולאה ולא רק בשורת האיתחול שלה , אבל בצורה זו הכיתוב יותר מסודר ונוח להבנה . לדוגמא : i++ , i-- וכדומה .

 

משפט for  לדוגמא :

For(i = 0; i < 10; i++){

//whatever

}

הלולאה תתחיל כאשר i שווה ל-0 , הערך i יוסיף לעצמו 1 בכל סיבוב (i++) , ויסתיים לאחר 10 סיבובים כאשר התנאי i < 10  יהיה שיקרי .

דוגמא נוספת :

For(i = 10, j = 10 ; i<10 ; i++ , j--)

בדוגמא זו מאותחלים שני משתנים , ומתבצעות שתי פעולות .

דוגמא נוספת :

i = 0;

for( ; ; i++){

            // if(i > 10) stop the loop

}

בדוגמא זו בתוך שורת האתחול של הלולאה  נמצאת רק הפעולה שמתבצעת בכל סיבוב . כיצד עוצרים פעולת לולאה לא דרך שורת האתחול ? על ידי פקודת break .

שיפור הדוגמא הקודמת :

i = 0;

for( ; ; i++){

             if(i > 10) break ;

}

פקודת break  מוציאה את התוכנית מהלולאה אל שורת הפקודות שבאה אחריה .

פקודה נוספת שימושית ללולאות היא continue . על ידי פקודה זו ניתן לדלג על שאר הפקודות בסיבוב זה ולעבור לסיבוב הבא .

דוגמא : נניח שאנחנו רוצים להדפיס את כל המספרים חוץ מהכפולות של 7 :

For (i = 0; i < 100 ; i++){

            if (i%7==0)continue;

            trace(i);

}

השורה לאחר האתחול בדקה האם השארית של המספר לחלק ל-7 הוא 0 ובמקרה זה הוא מתחלק ללא שארית ב-7 ולכן לא נדפיס אותו אלא נעבור ישירות לסיבוב הבא .

 

לולאת for ... in

 

לולאת for in  מתרחשת כמספר האובייקטים/ משתנים עליהם היא עובדת , הסינטקס של השימוש בלולאה זו היא כמו בדוגמא הבאה :

יצרתי בשביל הדוגמא אובייקט בשם myclass והגדרתי לו משתנים ופונקציה :

myclass= new Object();

myclass.a=10;

myclass.b=10;

myclass.showme=function(){};

 

כעת נריץ לולאת for ..in  על האובייקט בשביל לגלות את כל שמות המשתנים :

for(i in myclass){

            trace(i);

}

וה-output יהיה :

showme

b

a

ניתן גם להשתמש בלולאה זו על מנת למצוא שימושים באובייקטים מוכרים , לדוגמא :

z=new XML();

for(i in z){

            trace(i);

}

וה-output  הוא :

previousSibling

parentNode

nodeValue

nodeType

nodeName

nextSibling

lastChild

firstChild

כלומר כל הפונקציות הפנימיות של xml object .

או באובייקטים ויזואליים , לדוגמא (כאשר הסרט ריק) :

for(i in _root){

            trace(i);

}

ה-output יהיה :

$version

שזהו המשתנה היחיד המוגדר לסרט (ולכל level כמשתנה גלובלי אוטומטי) .

 

דרך נוספת לשימוש בלולאת for/in היא דרך שימוש במערכים . גם אם אנחנו לא יודעים מהו אורך המערך אותו אנחנו רוצים להציג / לבדוק / לחפש , ניתן לעשות זאת באמצעות לולאת for /in בצורה הבאה :

myarray = new Array(10,25,”gadi”);

For (i in myarray){

           trace(“index” + i +” – “+x[i]);

}

וה-output יהיה :

gadi

25

10

כלומר כך ניתן לרוץ על כל המערך בלי צורך להגדיר את מספר הפעמים שצריכה להתבצע הריצה . (אישית מצאתי את הפקודה הזאת ישימה במיוחד בטעינת מסמך xml כאשר אין מושג כמה nodes התקבלו מכל סוג , ניתן פשוט לרוץ על הרשימה של כולם על ידי לולאת for/in ואין צורך בידע מוקדם על המסמך לפני טעינתו ).

 

לולאות while

 

לולאת while בנויה מתנאי , ומבלוק פקודות שמתבצע כל עוד התנאי מתקיים .

while( condition ){

           //do the stuff here

}

לדוגמא , הסקריפט הבא , מאתחל משתנה , מריץ לולאה שמתרחשת כל עוד המשתנה קטן מ-10 ובתוך הלולאה מוסיף ערך 1 למשתנה .

x=0;

while(x<10){

            trace(x);

            x++;

}

ניתן גם להשתמש בצורת כתיבה כמו while(true) ואז רק פקודת break (כמו בלולאת for) תוכל לעצור את הלולאה .

x=0;

while(true){

            trace(x);

            x++;

            if(x>10)break;

}

 

לולאת do / while

 

ההבדל היחיד בין לולאת while ל- do/while הוא שהסוג השני יתבצע בכל מקרה פעם אחת לפני בדיקת התנאי , ורק אם התנאי מתקיים יתבצע פעם נוספת וכו . דבר נוסף הוא ";" בסוף המשפט :

x = 0;

do{

            trace(x);

            x++;

}while (x<10) ;

גם אם נגדיר while(false) בסוף הלולאה , כלומר הסיבוב הבא לא יתבצע , לולאה אחת תתרחש ,בניגוד ללולאת for רגילה .

 

לסיכום : כל פעולה שניתן לבצע בעזרת לולאת for ניתן לבצע גם בעזרת לולאת while בעזרת סדר פעולות שונה . לעומת זאת לולאת for/while שונה בכך שלא צריכה את המספר המקסימלי שבו תפסיק הלולאה והופכת אובייקטים למערך .