תוכנית קורסת בסי - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

תוכנית קורסת בסי


BedB0y

Recommended Posts

זאת התוכנית :

http://dl.dropbox.com/u/24303191/treefunc.txt

קורסת בשורה

while(isEmptyList(&TreeNodesList)==FALSE)

של הפונקציה

void printByLevels(Tree tr)

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

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

תודה לעוזרים

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

יש לך באג ב-createNewTreeNode.

בלי קשר, יש לי כמה הערות:

א. בבדיקה מהסוג (while(something==TRUE, ה-TRUE הוא מיותר. אתה יכול פשוט לעשות (while(something. באותו אופן, במקום (while(something==FALSE אתה יכול פשוט לעשות (while(!something (האופרטור ! הוא אופרטור שלילה). זה יותר קריא ככה.

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

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

א. בבדיקה מהסוג (while(something==TRUE, ה-TRUE הוא מיותר. אתה יכול פשוט לעשות (while(something. באותו אופן, במקום (while(something==FALSE אתה יכול פשוט לעשות (while(!something (האופרטור ! הוא אופרטור שלילה). זה יותר קריא ככה.

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

לדוגמה while (isFinished == FALSE) l

טריק נוסף שזה מאפשר זה להשתמש בתכונת ה- l-value כדי למנוע באג ע"י כתיבה כזאת:

while (FALSE == isFinished) l

אם בטעות כתבת while (FALSE = isFinished) l אז זה לא יתקמפל.

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

למה? לדעתי (while(!isFinished זה הרבה יותר ברור - כשקוראים את זה, זה פשוט אומר "כל עוד לא הסתיים". אם היית יכול להשתמש במילה not במקום באופרטור ! (כמו בשפות תכנות מסויימות) והקוד היה נכתב (while(not isFinished אז זה כמעט אנגלית.

חוץ מזה, הבדיקה (while(isFinished == TRUE היא בעייתית מסיבה אחרת - ב-C, ערך אמת הוא כל ערך שאינו 0. בבדיקה כזו, המתכנת גורם לכך שערך אמת הוא אך ורק 1, וכל ערך אחר הוא למעשה שקר. אם גם ככה המשתנה יכול לקבל רק את הערכים 0 ו-1 זה לא נורא, אבל זה גם סותר את הקונבנציות הנהוגות.

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

למה? לדעתי (while(!isFinished זה הרבה יותר ברור - כשקוראים את זה, זה פשוט אומר "כל עוד לא הסתיים". אם היית יכול להשתמש במילה not במקום באופרטור ! (כמו בשפות תכנות מסויימות) והקוד היה נכתב (while(not isFinished אז זה כמעט אנגלית.

כמו שאמרתי, טעם אישי.

חוץ מזה, הבדיקה (while(isFinished == TRUE היא בעייתית מסיבה אחרת - ב-C, ערך אמת הוא כל ערך שאינו 0. בבדיקה כזו, המתכנת גורם לכך שערך אמת הוא אך ורק 1, וכל ערך אחר הוא למעשה שקר. אם גם ככה המשתנה יכול לקבל רק את הערכים 0 ו-1 זה לא נורא, אבל זה גם סותר את הקונבנציות הנהוגות.

מסכים, עדיף להסתמך על ערכי FALSE, האפס הוא מוחלט :xyxthumbs:

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

ארכיון

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

×
  • צור חדש...