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

שתי שאלות בC


orninyo

Recommended Posts

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

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

  • תגובות 37
  • נוצר
  • תגובה אחרונה

תודה רבה אחי , אבל כמו שהזכרתי מקודם,

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

רק אם אתה יכול תציץ ב findprevious באחת ההודעות הקודמות ותגיד לי אם היא הגיונית

כי לפי מה שהבנתי היא מחזירה את האיבר הבא ולא את הקודם , כל המימוש שלה הזוי.

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

לגבי ה-FindPrevious יש בה כמה בעיות שאני רואה באופן מקומי, מה שמשפיע בהכרח על שימוש מאוד מסויים בה (אלא אם כן ניתן לשנותה):

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

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

3. אם אלמנט הוא טיפוס בסיסי ב-C (כמו int, double וכו') ולא טיפוס שאתה יצרת, לא אמורה להיות בעיה בהפעלת האופרטור =! בסוף שורת ה-while, אחרת אין באפשרות התוכנית להשוות בין אלמנטים שונים אלא באמצעות העמסת אופרטורים, מה שלפי דעתי תכונה חסרה ב-C, קיימת באחותה הגדולה C++, מצד שני אם כן הייתה בעייה אז כנראה היית נתקל בה בשלב הקומפילציה.

ממבט מהיר בפונקציות שפירטת, נראה כי אכן אתה נכנס עמוק בתוך הרקורסיה ללא הגעה לתנאי עצירה, כאשר התוכנית מפסיקה כנראה בעת תום מילוי מחסנית הקריאות לפונקציה:

1. תחילה השימוש בשורה if (!First(P)) בעייתית לדעתי, שכן אולי מבחינת קונטקסט התכוונת "אם לא האיבר הראשון" אך למעשה הבלוק בתוך התנאי יתבצע רק אם האיבר אחרי P הוא NULL (כלומר P מצביע לאחרון ברשימה)

2. התנאי עליו דיברתי בסעיף הקודם יתאמת באיטרציה הראשונה, אך הפונקציה FindPrevious לא תשנה את P שכן הוא המצביע לאיבר האחרון, ואז באופן הקריאה לפונקציה אתה קורא לה למעשה עם רשימה בעלת איבר אחד בלבד, ללא אלמנט דמי (אם הבנתי נכון בו השתמשת במימוש הרשימה) כך שהאיבר הבא הוא NULL ולכן לא תהיה כניסה ללולאה הראשית בפונקציה זו, ולכן P יחזור כפי שהיה. מסיבה זו ש-P אינו משתנה אתה למעשה מפעיל רקורסיה על אותם פרמטרים בלי סיכוי שישתנו באיזשהו שלב ולכן "אינסופית".

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

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

תודה רבה על ההסבר המושקע

לפי מה שאני מבין, אופן השימוש בפונצקיה findprevious הוא להעביר לה את האלמנט הראשון ואת הצומת האחרונה

ובשביל לעשות זאת אני צריך לשמור במשתנה את הערך של האלמנט הראשון בשביל להשתמש בו בהמשך.

הבנתי נכון?

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

אתה צריך לתת לה את האיבר הראשון ואת האיבר שאתה צריך למצוא לו את הקודם.

וכן, אתה צריך למצוא דרך לשמור את האיבר הראשון בצורה כלשהי.

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

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

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

תצייר לך בכלליות 2 ציורים - באחד מהם תתאר את מה שקורה כאשר אתה מכניס אחרי הקריאה, ובציור השני תתאר את מה שקורה כאשר אתה מכניס למחסנית לפני הקריאה.

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

ארכיון

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


×
  • צור חדש...