ב PHP, כשעושים לולאה מה ההבדל בין for ל while

יוסי

משתמש רשום
אם יורשה לי, יש הבדל מהותי בין לולאת for ללולאת while [יודגש: הידע שלי הוא מ-C#]
באופן עקרוני בשתי הלולאות, הלולאה מתבצעת כל עוד מתקיים התנאי הבוליאני [אמת או שקר]. כלומר כל עוד התוצאה של הביטוי הבוליאני היא אמת [ביטוי בוליאני יכול להיות שמשתנה מסוים גדול/קטן/שווה/קטן שווה/גדול שוה ממספר מסוים וכדו'], יתבצע מה שהקוד מכיל.
אך לולאת for היא לולאת מונה - לולאה שמתקדמת בכל איטרציה ['סיבוב'/'ריצה'] לפי הגדרת המונה שלה [כלומר, לפי ההגדרה בכמה היא מתקדמת בכל איטרציה], והשימוש בה הוא כשמספר האיטרציות ידוע מראש, או תלוי במשתנה אחר.
בעוד לולאת while מתבצעת כל עוד התנאי מתקיים - בלי קשר למספר האיטרציות ובלי כל קידום.

אז נכון: כל לולאת for ניתן לכתוב גם בלולאת while [שתפקד כלולאת for], אך בהחלט לא ניתן לכתוב כל לולאת while בלולאת for - כיון שהתנאי יכול להיות משהו שאין לו קשר למשהו מספרי וכדו' [למשל לולאה שרצה כל עוד משתנה מסוים קיים במערכת - כמו לולאה שמאזינה להצטרפות קליינטים חדשים ב-tcp כל עוד השרת פעיל].

כך שבמחילה ממי שכתב "כל מה שאפשר ב while אפשר For ולהפך, ההבדל הוא מתודי" - זה משפט לא מדויק

בנוסף, כפי שכבר נכתב כאן, יש הבדל בין צורת הביצוע ובין משאבי הביצוע של הלולאות השונות.
 

יוסי

משתמש רשום
:)
רק תוספת קטנה לגבי ללולאת foreach [שוב, הדברים נכונים לגבי c#. לגבי שפות אחרות אני לא בקי מספיק]:
לולאה זו נוחה לשימוש ויש לה תחביר מאוד נוח לקריאה ולכתיבה, ואם נתייחס למערכים בלבד, נכון לומר שכל מה שניתן לבצע באמצעות לולאת foreach, ניתן לבצע גם באמצעות לולאת for.

אבל לא להיפך [כלומר, לא כל מה שניתן לבצע באמצעות לולאת for, ניתן לבצע גם באמצעות לולאת foreach], מהסיבות הבאות [שהם גם החסרונות של לולאהת ה-foreach]:
  1. לא ניתן לשנות את הערכים שבאברי המערך, אלא רק לקבל את הערכים [get ולא set]
  2. לא ניתן לדעת בכל איטרציה - מהו האיבר הנוכחי במערך.
  3. בגלל סיבה 2 - הלולאה לא מתאימה כשרוצים לרוץ רק על חלק מהמערך.
ככלל, משתמשים בלולאה זו בדרך כלל במעבר על מערך או אוסף [Colection] של אוביקטים, כשאין חשיבות לסדר ולמספור, ופחות כשמדובר על מערך של מחרוזות או מספרים.
 

Shia

משתמש מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
D I G I T A L
יוסי תודה על האבחנה המעמיקה.
רציתי רק לשאול, האם יהיה זה נכון לומר שכל לולאת for יכולה להיכתב גם כwhile?
 

יוסי

משתמש רשום
על פניו, בהחלט כן, אבל בתנאי שניצור מונה [משתנה מספרי שישמש כ-Counter], נקדם אותו בכל איטרציה, ובשפות מסוימות כ-c#, חובה גם לאתחל את המשתנה].
אך אין צורך להתעקש דוקא על לולאת while. לולאת for עושה את אותן הפעולות בצורה יותר נוחה וקריאה [המונה מאותחל עוד לפני הכניסה ללולאה; ניתן להגדיר את קידום המונה לפי הצורך; ניתן להגדיר לו ריצה עד אורך המערך - array.Length למשל], כך שאני לא רואה סיבה לוותר עליו, ואכן, היא לולאה נפוצה יותר.

דבר נוסף שעולה בדעתי: הוא שניתן להגדיר שני מונים [מקובל לקרוא להם מונה i ומונה j], ולכתוב קוד שיעשה שימוש בכל אחד מהם בהתאמה.
גם זה ניתן לעשות באמצעות לולאת while, אבל זה נעשה הרבה יותר 'נקי' ואלגנטי בלולאת for.
 

יריב

משתמש רשום
נראה לי שעצם השאלה הזו שחוזרת על עצמה לגביי ההחלפות בין הלולאות אינה נכונה.
מנסיוני כל פונקציה ניתן לכתוב במס' רב מאד של דרכים ואיש כטוב בעיניו יעשה.
עם הזמן אתה מגלה כבר את הלוגיקה של השימוש בכל לולאה ע"פ הצורך הרגעי.
דבר אחד בטוח, קיימות מס' אפשרויות ואם הם עושות את העבודה אז כולן נכונות.
והנה שימוש אמיתי ב-while
PHP:
while ($flag)
בהתאם והמשך לדבריו של יוסי
נכנסים ללולאה ויוצאים ממנה באחד מהרבה מצבים אפשריים.
בכל פעם שנתקלים במצב שאמור לשבור את הלולאה, מוסיפים ערך ל- msg שמסביר את היציאה ומגדירים את flag כ-false
יש לולאות כאלה שנמשכות מאות שורות עם עשרות נקודת יציאה.
במקרה כזה כבר לא תחשבו על החלפת לולאה וזה כוונתי שכל מקרה לגופו.
במצבים "פשוטים" אפשר לבחור ולעשות בצורות שונות ורבות אבל במצבים אחרים אין תחליפים לפקודה הנכונה.
 

יוסי

משתמש רשום
יריב, תרשה לי לחלוק עליך בנקודה מסוימת - קריטית לענ"ד.

יש חשיבות רבה מאוד בתכנות לשימוש בקוד נכון ורלוונטי, וכן... גם בלולאה המתאימה!

אחד מכללי היסוד בתכנות [שוב, למיעוט הבנתי וידיעותי] הוא לא "מבחן התוצאה" - כלומר, העיקר שהקוד יעבוד, אלא "יעילות הקוד" - כלומר, יש חשיבות רבה מאוד לכתיבה נכונה וקלה, הן מבחינת ביצועים [בקוד web-י יש משמעות קריטית לכל milisecond בזמן ביצוע], הן מבחינת קריאות הקוד והן מבחינת תחזוקת הקוד.

אחת מה'בשורות' של תכנות מונחה עצמיםשל תכנות מונחה עצמים [OOP], הוא יעילות הקוד ומניעת חזרות.

כשאתה כותב "יש לולאות כאלה שנמשכות מאות שורות עם עשרות נקודות יציאה", זה נשמע רע מאוד מבחינת כתיבת קוד [הדברים נכתבים כמובן ענינית וחלילה שלא ישתמע אחרת].
בכלל, פונקציה [לא רק לולאה] שנמשכת שורות רבות מידי, היא סימן לכתיבה לא נכונה. תמיד רצוי לחלק את הקוד לפונקציות קטנות וקריאות [לא רק כדי להמנע מכתיבת קוד חוזר, אלא גם ובעיקר לקריאות ותחזוקה].
ממעט הנסיון שיש לי בתחום, לא נתקלתי אצלי או בדוגמאות קוד של אחרים, בלולאות שמתפרסות על פני מאות שורות.
 

יריב

משתמש רשום
יוסי יוסי,
ראשית זה אני שהתחלתי לדבר על זמני ביצוע של כל לולאה ולא בכדי, ברור שעם הנסיון והשנים לומדים קצת מעבר לנדרש.
אבל אני שני אנשים, מתכנת ומנהל, המתכנת כל היום לומד ומשתדל להביא את הפתרון הנכון אבל המנהל רואה את מבחן התוצאה בלבד!
בעניין קוד ארוך עם המון יציאות, שים לב שהקוד של vbulletin מכיל מעל 1000 שורות לכל דף קוד.
אני גם מדגיש את השימוש בפונקציות וקוד קצר ומובן עם הערות וכו'.. אבל זה לפעמים מנותק מהמציאות בעיקר בזמנים של קוד פתוח כשאני עובד על בסיס של קודים מוכנים.
דווקא ב-PHP שבעניינו עסקינן אנו משתמשים בקודים מוגמרים כחומר גלם ואז אתה צריך ללמוד להסתכל גם על דפים של 10000 שורות קוד!
לגביי עשרות יציאות, זה לא מוזר ולא טעות זה עשרות בדיקות לכל מקרה קצה אפשרי וככל שתתכנן אותם מראש כך תחסוך זמן דיבגינג בסוף שלוקח לך הרבה יותר ומעל זה בעל ערך דכאוני.
אני ממשיך ועונה בנושא רק לטובת אלו שעוקבים ואולי לומדים משהו מתוך הדיון הזה.
אשמח להמשיך לענות גם לאחרים שמפיקים תועלת מהדיון.
 

drvvv

משתמש פעיל
D I G I T A L
כדאי לכולכם לנסות את asp.net שם כמעט ואין צורך בלולאות ;)
 

יוסי

משתמש רשום
אני לא רוצה לסטות ולהכנס לדיון ארוך על מה שכתבת, כדי לא לסטות מנושא השרשור.
[יש הבדל בין שורות קוד רבות באפליקציה, לבין שורות קוד רבות ב-scope, בדיקות נעשות באמצעות error handling, למה כוונתך ב"שורות קוד רבות בקוד של vbulletin" ? לקוד HTML?
זה מתאים יותר לדיון על כוס קפה [מנסיון, למדתי הרבה מניתוח ודיונים על ענינים אלו - אשמח ללמוד גם ממך], חבל להלאות את כולם.
 

יוסי

משתמש רשום
נכתב ע"י drvvv;331889:
כדאי לכולכם לנסות את asp.net שם כמעט ואין צורך בלולאות ;)
:)
דרך אגב, למי שמעונין בספרות עברית על asp.net יצא בחודש האחרון בהוצאת הוד עמי ספר חדש על asp.net 3.5.
בשונה מהספר הקודם על asp 2.0 [לא מדובר במהדורה חדשה של הספר הקודם, אלא ספר אחר לגמרי], הוא כתוב בצורה מסודרת, בהירה ובתרגום משובח.
ככלל, יש בו חזרה גם על נושאים מרכזים בתכנות בכלל וב-.NET בפרט.
כולל גם פרקים על ajax ועל linq ואפילו SilverLight על קצה המזלג.

אין לי שם אחוזים, אם אתם שואלים;)
 

drvvv

משתמש פעיל
D I G I T A L
נכתב ע"י יוסי;331902:
:)
דרך אגב, למי שמעונין בספרות עברית על asp.net יצא בחודש האחרון בהוצאת הוד עמי ספר חדש על asp.net 3.5.
בשונה מהספר הקודם על asp 2.0 [לא מדובר במהדורה חדשה של הספר הקודם, אלא ספר אחר לגמרי], הוא כתוב בצורה מסודרת, בהירה ובתרגום משובח.
ככלל, יש בו חזרה גם על נושאים מרכזים בתכנות בכלל וב-.NET בפרט.
כולל גם פרקים על ajax ועל linq ואפילו SilverLight על קצה המזלג.

אין לי שם אחוזים, אם אתם שואלים;)
אכן סיימתי לא מזמן את הספר החדש (שנשלח אלי ביום שהוא יצא!) ואכן התרשמתי מאוד מאוד.
המון ידע שאגרתי ביזע ודם מוגש שם על מגש של כסף + טיפים וקיצורים שאפילו אחרי שבניתי כמה וכמה אתרים ב.net עדיין לא ידעתי.
בניגוד לספר הקודם, בספר הנוכחי לא מניחים כלום, מלמדים הכל מהתחלה (אפילו יסודות תיכנות) ומקיפים בספר המון נושאים רלוונטים ובפירוט רב.
אני נהנתי מכל רגע...

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

ממי!!!!!!

משתמש פעיל
סליחה שאני מקפיצה שוב,
בהשוואת שתי פונקציות בc#, האם יש משמעות לסוג הלולאה בה משתמשים?
 

אולי מעניין אותך גם...

הפרק היומי

הפרק היומי! כל ערב פרק תהילים חדש. הצטרפו אלינו לקריאת תהילים משותפת!


תהילים פרק קיט ב'

ט בַּמֶּה יְזַכֶּה נַּעַר אֶת אָרְחוֹ לִשְׁמֹר כִּדְבָרֶךָ:י בְּכָל לִבִּי דְרַשְׁתִּיךָ אַל תַּשְׁגֵּנִי מִמִּצְוֹתֶיךָ:יא בְּלִבִּי צָפַנְתִּי אִמְרָתֶךָ לְמַעַן לֹא אֶחֱטָא לָךְ:יב בָּרוּךְ אַתָּה יְהוָה לַמְּדֵנִי חֻקֶּיךָ:יג בִּשְׂפָתַי סִפַּרְתִּי כֹּל מִשְׁפְּטֵי פִיךָ:יד בְּדֶרֶךְ עֵדְוֹתֶיךָ שַׂשְׂתִּי כְּעַל כָּל הוֹן:טו בְּפִקֻּדֶיךָ אָשִׂיחָה וְאַבִּיטָה אֹרְחֹתֶיךָ:טז בְּחֻקֹּתֶיךָ אֶשְׁתַּעֲשָׁע לֹא אֶשְׁכַּח דְּבָרֶךָ:
נקרא  10  פעמים

לוח מודעות

למעלה