C# C++ יציאה מלולאה - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

C# C++ יציאה מלולאה


MrAlex

Recommended Posts

יש לי את שלושת המקרים הבאים הכתובים בC#(השאלה מתייחסת גם לשפה C++ ->להמיר כמה פקודות אבל התוכן אותו תוכן) :

http://pastebin.com/04UHn0EG

המורה ביקשה שאני לא אתעסק עם BREAK בC#,אבל הספר שאני לומד ממנו במקביל ללמידה בבית הספר- בשפה C++ לא ציין שאסור להשתמש בזה(ניראאלי הוא טען שזה מסרבל את התכנית או משהו בסגנון).

רציתי לדעת איזו מן השיטות הבאות הטובה הבטוחה וכו'...

אשמח לפירוט מלא וגם מה נכון לC++(גם אם זה קשור לזיכרון ><")

תודה רבה :)

קישור לתוכן
שתף באתרים אחרים

בעיקרון, שלושתם יעבדו בלי בעיה.

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

למיטב ידיעתי, הצורה הראשונה היא לא כל כך אלגנטית (לא כל כך נהוג לשנות את משתנה הלולאה במקום שאינו שורת הלולאה עצמה).

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

אין הבדל בין #C ל-++C בעניין הזה, ואין פה שום קשר לזכרון.

קישור לתוכן
שתף באתרים אחרים

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

ללולאה עצמה, כשקוראים מקובץ מסוים ויש תבנית קבועה - כל עוד לא הגענו לסוף הקובץ.

קישור לתוכן
שתף באתרים אחרים

http://pastebin.com/zMmnEZmf

במצב הראשון והשלישי אני יכול לצאת מגוף הלולאה ע"י קידום איטריצה בעזרת continue זה בסדר?

ניראלי אני אלך על האופציה של המשתנה הבוליאני בתור תנאי נוסף ללולאה,אבל בשלבים התחלתיים הBREAK לא מסרבל כל כך והדרך עם המשתנה הבוליאני והקונטיניו לא מסרבלת במידה פחותה מהBREAK,אני לא מבין את המורה יש איזשהי דרך להסביר לה ><"?

קישור לתוכן
שתף באתרים אחרים

אני לא מבין את המורה יש איזשהי דרך להסביר לה ><"?

אם אתה לא מבין את המורה, אז היא צריכה להסביר לך ולא להיפך...

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

קישור לתוכן
שתף באתרים אחרים

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

אם במהלך הלולאה יש תנאי שעלול להפסיק את הלולאה - הפוך את הלולאה ללולאת while

יש קפדנים (או שפות, למשל פסקל המקורית) שלא משתמשים בbreak אלא מכניסים את התנאי למשתנה הבקרה (זה המקרה האחרון שלך), אחרים כן ישתמשו ב-break ובמקרים מסויימים יצאו מכמה לולאות מקוונות ע"י goto ישר החוצה...

לולאות for כדאי להשאיר אותן למקרה שבו הלולאה תתבצע N פעמים בכל מקרה. בלי תנאים ובלי בדיקות. הסיבה היא לא רק סיגנונית אלא האפשרות למקבל את הלולאות ע"י כלים מסויימים (למשל openmp)

קישור לתוכן
שתף באתרים אחרים

חוץ מזה ששורה כזאת:

[COLOR=#008000][FONT=Consolas]{[/FONT][/COLOR][COLOR=#000000][FONT=Consolas]   i [/FONT][/COLOR][COLOR=#008000][FONT=Consolas]=[/FONT][/COLOR][COLOR=#FF0000][FONT=Consolas]11[/FONT][/COLOR][COLOR=#008000][FONT=Consolas];[/FONT][/COLOR][COLOR=#0600FF][FONT=Consolas][B]continue[/B][/FONT][/COLOR][COLOR=#008000][FONT=Consolas];[/FONT][/COLOR][COLOR=#008000][FONT=Consolas]}[/FONT][/COLOR]

מאוד לא נעימה לעין וסותרת כל coding guidlines מוכרים.

קישור לתוכן
שתף באתרים אחרים

חוץ מזה ששורה כזאת:

[COLOR=#008000][FONT=Consolas]{[/FONT][/COLOR][COLOR=#000000][FONT=Consolas]   i [/FONT][/COLOR][COLOR=#008000][FONT=Consolas]=[/FONT][/COLOR][COLOR=#FF0000][FONT=Consolas]11[/FONT][/COLOR][COLOR=#008000][FONT=Consolas];[/FONT][/COLOR][COLOR=#0600FF][FONT=Consolas][B]continue[/B][/FONT][/COLOR][COLOR=#008000][FONT=Consolas];[/FONT][/COLOR][COLOR=#008000][FONT=Consolas]}[/FONT][/COLOR]

מאוד לא נעימה לעין וסותרת כל coding guidlines מוכרים.

למה אתה מתכוון?

אם זה לפי סגנון כתיבה אז כן אני ידוע שצריך להוריד את הקונטיניו שורה וכו'

זאת היה הדגמה עצלנית xD

קישור לתוכן
שתף באתרים אחרים

האופציה הראשונה, השמת i = 11 בתוך הקוד, היא תועבה.

פשוט תועבה. אם המורה שלך מלמד/ת שזה יותר טוב מ-break כדי לסיים לולאה מוקדם, אתה יכול למסור לו/ה ממני שהוא/היא צריכ/ה להתרחק מלימוד תכנות, ועדיף ממחשבים בכלל ואולי גם מהפלנטה. (טוב אני מגזים, אבל יש לי דיעה מאוד נמוכה על מורה כזה/ו).

אתן מספר סיבות (לא ממצה), אבל השיעור החשוב לצופים: לעולם* אל תשנו את משתנה הלולאה רק כדי לצאת ממנה, ובד"כ עדיף לא לשנות את משתנה הלולאה בכלל מתוך קוד פנימי.

* כמו כל החוקים, יתכן מצב שגם את זה צריך להפר. אבל רק אם אתם מכירים את כל החוקים והסיבה לכל אחד מהם, ומחליטים באופן מושכל להפר אותם.

סיבה 1: קריאות

אחד היתרונות החשובים בשפה עילית היא שבני אדם קוראים אותה בקלות. לולאת for אחרי הכל לא שונה מלולאת while (וגם לא שונה מאוסף של if ו-goto). למה צריך אותה? לולאת for עוזרת לנו להפריד באופן אלגנטי בין הקוד שמטפל בבקרת הלולאה (השורה הראשונה של ה-for), וקוד שעליו אנו רוצים לחזור (בתוך ה-{ } ). כאשר מתכנת קורא לולאת for בתוכנה כלשהי, הוא/היא באופן אוטמטי מניח את ההפרדה הזו. זה עוזר מאוד לקריאות הקוד.

אבל מה לעשות, לפעמים אין ברירה, חייבים לסיים לולאה באמצע, וזה לא תמיד מעשי להכניס את זה בשורת ה-for.

בדיוק בשביל זה יש את break ! זו כל המטרה שלו. הוא בולט בקוד (ובדרך כלל גם מבליטים אותו עוד יותר בשביל להגדיל קריאות) ומשדר מיידית לקורא התוכנה: "שימו לב: יש כאן בקרה של לולאה, והיא עלולה לצאת מוקדם". קל למתכנת להבין מה עושה break ואיך הוא משפיע על הבקרה (לרוב). על כן מתכנתים שקוראים קוד מניחים (באופן כמעט תת-מודע!) שרק קוד הלולאה (שורת for) משנה את משתנה הלולאה.

עכשיו תחשוב על התועבה: אין break. אין שום דבר מיוחד שעוזר למתכנת להבין איך הלולאה תתנהג. ההפרדה בין קוד הבקרה ולקוד האיטרציה נשברה, והכי גרוע: לא ברור שהיא נשברה! מי שיקרא את הקוד בזריזות עלול לפספס בקלות השמה למשתנה הלולאה, במיוחד כי הוא מניח שלא קיימת אחת (ראה לעיל). הוא יחשוב שהלולאה מתבצעת עשר פעמים תמיד וזהו. גם אם הקורא שם לב להשמה, הוא רואה i = 11 ועכשיו על הקורא לוודא מול תנאי הלולאה שכתוב במקום אחר מה זה עושה. כמה איטרציות יש ללולאה? האם זה עוצר? איך נכתב תנאי העצירה?

תשווה את זה למשמעות של break פשוט: מסיים את הלולאה, וזהו. הוא משדר את תפקידו באופן ברור וחד משמעי.

סיבה 2: תחזוקת קוד

נניח שתנאי העצירה מסובך וכולל שני משתנים. האם הצבת נכון לשניהם על מנת שהלולאה תסתיים? אופס! באג.

נניח שעוד חצי שנה שמספר האיטרציות הרגיל השתנה ל-20. האם תזכור עוד חצי שנה גם לעדכן את ההשמה ל- i = 21 ? סביר שלא. אופס! באג.

break תמיד יוצא מהלולאה ולכן תמיד עובד.

סיבה 3: כלים מודרנים

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

הערת אגב

הרבה שפות מודרניות בכלל לא מאפשרות לבצע כזו השמה. לולאת for עוברת פעם אחת על כל ערך מאוסף הערכים (לדוגמא 0 עד 9), וכל פעם שמה את הערך הזה באיזשהו משתנה (לדוגמא i). אבל השמה למשתנה כלל לא משפיעה על הלולאה! הדרך לסיים מוקדם הוא ע"י קוד בקרה מפורש כגון break או return או continue.

דוגמא: פייתון, ואפילו #C (לולאות for each)

קישור לתוכן
שתף באתרים אחרים

האופציה הראשונה, השמת i = 11 בתוך הקוד, היא תועבה.

פשוט תועבה. אם המורה שלך מלמד/ת שזה יותר טוב מ-break כדי לסיים לולאה מוקדם, אתה יכול למסור לו/ה ממני שהוא/היא צריכ/ה להתרחק מלימוד תכנות, ועדיף ממחשבים בכלל ואולי גם מהפלנטה. (טוב אני מגזים, אבל יש לי דיעה מאוד נמוכה על מורה כזה/ו).

אתן מספר סיבות (לא ממצה), אבל השיעור החשוב לצופים: לעולם* אל תשנו את משתנה הלולאה רק כדי לצאת ממנה, ובד"כ עדיף לא לשנות את משתנה הלולאה בכלל מתוך קוד פנימי.

* כמו כל החוקים, יתכן מצב שגם את זה צריך להפר. אבל רק אם אתם מכירים את כל החוקים והסיבה לכל אחד מהם, ומחליטים באופן מושכל להפר אותם.

סיבה 1: קריאות

אחד היתרונות החשובים בשפה עילית היא שבני אדם קוראים אותה בקלות. לולאת for אחרי הכל לא שונה מלולאת while (וגם לא שונה מאוסף של if ו-goto). למה צריך אותה? לולאת for עוזרת לנו להפריד באופן אלגנטי בין הקוד שמטפל בבקרת הלולאה (השורה הראשונה של ה-for), וקוד שעליו אנו רוצים לחזור (בתוך ה-{ } ). כאשר מתכנת קורא לולאת for בתוכנה כלשהי, הוא/היא באופן אוטמטי מניח את ההפרדה הזו. זה עוזר מאוד לקריאות הקוד.

אבל מה לעשות, לפעמים אין ברירה, חייבים לסיים לולאה באמצע, וזה לא תמיד מעשי להכניס את זה בשורת ה-for.

בדיוק בשביל זה יש את break ! זו כל המטרה שלו. הוא בולט בקוד (ובדרך כלל גם מבליטים אותו עוד יותר בשביל להגדיל קריאות) ומשדר מיידית לקורא התוכנה: "שימו לב: יש כאן בקרה של לולאה, והיא עלולה לצאת מוקדם". קל למתכנת להבין מה עושה break ואיך הוא משפיע על הבקרה (לרוב). על כן מתכנתים שקוראים קוד מניחים (באופן כמעט תת-מודע!) שרק קוד הלולאה (שורת for) משנה את משתנה הלולאה.

עכשיו תחשוב על התועבה: אין break. אין שום דבר מיוחד שעוזר למתכנת להבין איך הלולאה תתנהג. ההפרדה בין קוד הבקרה ולקוד האיטרציה נשברה, והכי גרוע: לא ברור שהיא נשברה! מי שיקרא את הקוד בזריזות עלול לפספס בקלות השמה למשתנה הלולאה, במיוחד כי הוא מניח שלא קיימת אחת (ראה לעיל). הוא יחשוב שהלולאה מתבצעת עשר פעמים תמיד וזהו. גם אם הקורא שם לב להשמה, הוא רואה i = 11 ועכשיו על הקורא לוודא מול תנאי הלולאה שכתוב במקום אחר מה זה עושה. כמה איטרציות יש ללולאה? האם זה עוצר? איך נכתב תנאי העצירה?

תשווה את זה למשמעות של break פשוט: מסיים את הלולאה, וזהו. הוא משדר את תפקידו באופן ברור וחד משמעי.

סיבה 2: תחזוקת קוד

נניח שתנאי העצירה מסובך וכולל שני משתנים. האם הצבת נכון לשניהם על מנת שהלולאה תסתיים? אופס! באג.

נניח שעוד חצי שנה שמספר האיטרציות הרגיל השתנה ל-20. האם תזכור עוד חצי שנה גם לעדכן את ההשמה ל- i = 21 ? סביר שלא. אופס! באג.

break תמיד יוצא מהלולאה ולכן תמיד עובד.

סיבה 3: כלים מודרנים

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

הערת אגב

הרבה שפות מודרניות בכלל לא מאפשרות לבצע כזו השמה. לולאת for עוברת פעם אחת על כל ערך מאוסף הערכים (לדוגמא 0 עד 9), וכל פעם שמה את הערך הזה באיזשהו משתנה (לדוגמא i). אבל השמה למשתנה כלל לא משפיעה על הלולאה! הדרך לסיים מוקדם הוא ע"י קוד בקרה מפורש כגון break או return או continue.

דוגמא: פייתון, ואפילו #C (לולאות for each)

תודה,על התשובה המפורטת :)

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...