פורסם 2011 באוגוסט 2414 שנים במסגרת תרגיל שיש לי אני אמור לרשום את הקלאס הנ"ל, בתור התחלה יש לי כמה מתודות שעלי לרשום, המתודה POP אמורה לפי החתימה שהוגדרה לי להחזיר אובייטק אבל אני לא מבין מה ההיגיון ז"א אם אני עושה POP למה אני אמור להחזיר משהו ?זה התרגיל שלי והמתודות שהוגדרו לי (המתודה POP לא גמורה):כמו כן אני לא מצליח להדפיס את הנתונים שהכנסתי ולא מבין למהusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Collections;namespace MyStack{ public class MyStack : IEnumerable { private Object[] Objects; private int iObjects; public MyStack() { this.Objects = new Object[10]; } public MyStack(int MaxSize) { } public void push(object obj) { if (iObjects >= this.Objects.Length) { Object[] TempArray = new Object[this.Objects.Length + 1000]; for (int i = 0; i < this.Objects.Length; i++) { TempArray[i] = this.Objects[i]; } this.Objects = TempArray; } this.Objects[iObjects] = obj; iObjects++; } public object Pop() { this.Objects[iObjects - 1] = null; iObjects--; } public IEnumerator GetEnumerator() { for (int i = iObjects-1; i >= 0 ; i--) { yield return this.Objects[i]; } } } class Program { static void Main(string[] args) { MyStack stack1 = new MyStack(); stack1.push(10); stack1.push(345); stack1.push(3); stack1.push(1); stack1.push(6); stack1.push(937); stack1.push(0); Console.WriteLine(stack1.ToString()); Console.ReadLine(); } }}
פורסם 2011 באוגוסט 2414 שנים לשאלתך הראשונה: זה פשוט נהוג לעבוד ככה עם מחסנית - בד"כ מספקים פונקצית peek שנותנת "הצצה" לאובייקט העליון (כלומר מחזירה את האובייקט העליון בלי לשנות את המחסנית), ופונקציית pop שמוציאה אותו, ועל הדרך גם מחזירה אותו - פשוט כי בד"כ מי שמוציא את האובייקט גם רוצה להשתמש בו. כיוון שלהחזיר אובייקט לא עולה לך כלום, זה לא נורא אם קוראים ל-pop ולא משתמשים בערך ההחזרה.לשאלה השנייה: ToString תעבוד רק אם המחלקה שלך מממשת את הפונקציה. אחרת זה ישתמש במימוש הדיפולטי (שלא מדפיס משהו אינפורמטיבי).
פורסם 2011 באוגוסט 2414 שנים מחבר אתה מתכוון שבמתודת ה-POP פשוט להחזיר return this.Objects[iObjects-1]; ?
פורסם 2011 באוגוסט 2514 שנים מחבר אז זה זה כי ההוצאה (POP) היא תמיד של האובייקט האחרון שהוכנס, זה שהכי למעלה במחסנית ו-iObjects זה המקום הפנוי הראשון במחסנית.אגב תוכל להרחיב טיפה על ToString ולמה לא הודפס לי כלום ? כי לא ממש הבנתי
פורסם 2011 באוגוסט 2514 שנים אז זה זה כי ההוצאה (POP) היא תמיד של האובייקט האחרון שהוכנס, זה שהכי למעלה במחסנית ו-iObjects זה המקום הפנוי הראשון במחסנית.תרשום את הקוד המלא של הפונקציה ואני אסביר לך אם זה נכון או לא (ואם הבנת את העקרון). בתכל'ס, צריך לדאוג שאם מישהו עושה משהו כזה (זה פסאודו קוד, אין לי כוח לכתוב קוד שלם):MyStack s = ...s.push(x);y = s.pop();אז y ו-x הם אותו אובייקט. אם הם לא, אז יש לך באג.אגב תוכל להרחיב טיפה על ToString ולמה לא הודפס לי כלום ? כי לא ממש הבנתי נשאל אותך ככה: איך ציפית מהתוכנה לדעת מה היא צריכה להדפיס עבורך? היא הרי לא מסוגלת לנחש למה התכוונת.
פורסם 2011 באוגוסט 2514 שנים מחבר קצת לא הבנתי למה התכוונת עם ה-X וה-Y אבל תראה ב-MAIN מה רשמתי public object Pop() { this.Objects[iObjects - 1] = null; iObjects--; return this.Objects[iObjects]; }
פורסם 2011 באוגוסט 2514 שנים תחשוב מה קורה אם אתה מכניס (push) שני איברים לתוך המחסנית (נניח, 1 ואז 2) ואז עושה pop פעם אחת. מה הערך שמוחזר לך מה-pop? מה הערך שצריך להיות מוחזר?ולגבי ה-ToString, אני מניח שאתה לומד מתוך ספר כלשהו, אז פשוט תגיע לפרק שמסביר על הפונקציה ואיך מממשים אותה.
פורסם 2011 באוגוסט 2514 שנים מחבר הערך שמוחזר הוא 2 כי הוא האחרון שהוכנס למחסנית, וזה מה שהחזרתי (זה אמור להיות iObjects -1 במקום iObjects)
פורסם 2011 באוגוסט 2514 שנים הערך 2 הוא זה שאמור להיות מוחזר, השאלה היא איזה ערך באמת מוחזר לפי הקוד שלך.אם אתה רוצה, תכתוב בדקה קוד שעושה מה שאמרתי ותגיד לי אם זה עובד. הדרך הכי טובה לבדוק אם קוד כלשהו הוא נכון, היא להריץ אותו.
פורסם 2011 באוגוסט 2514 שנים מחבר זה מה שניסיתי לעשות ב-MAIN אבל ההדפסה לא עובדת לי ועדיין לא ממש הבנתי למה (גם אחרי ההסברים שלך)
פורסם 2011 באוגוסט 2514 שנים איפה ב-main שלך יש קריאה ל-pop?תנסה לדבג את הקוד שלך. תיכנס לתוך הפונקציות push ו-pop ותראה מה בדיוק יש ב-Objects וב-iObjects בכל שלב.
פורסם 2011 באוגוסט 2514 שנים טוב שניצל אני אהרוס לך את הנסיון להסביר צעד צעד טיפין טיפין... גם אני מאמין בגישה של לתת רמזים עדינים וכיוונים כדי שהבן אדם יוכל לעלות בעצמו על הבעיה, אבל אני חושב שאם כבר זה הגיע לעמוד שני בפוסט, כדאי כבר לזרוק את התשובה בפנים.לפותח הת'רד:שים לב לטעות המרה שאתה עושה ב POP. אתה מוחק את האוביקט מהמערך לפני שאתה מחזיר אותו!! קודם כל לפני שאתה מוחק אותו תשמור את ההפניה אליו במקום אחר. אחר כך דחוף שם NULL, אחרי זה תעדכן את האינדקס ואז תחזיר את האוביקט.לגבי TOSTRING, כמו שנאמר. בכל האובייקטים ב C# יש פונקציה TOSTRING (שהיא בעצם פונקציה של המחלקה OBJECT שכל שאר האוביקטים יורשים ממנה).אם תפעיל את TOSTRING על טיפוסים בסיסים כמו INT, STRING, CHAR וכדומה אז היא תדע להדפיס את הערכים שלהם, כי היא שוכתבה עבורם.אם כתבתי מחלקה שמכילה נתונים של אוניברסיטה, על כל הסטודנטים, תשלומים, עובדים, ציונים, ומה לא, מה אתה באמת חושב שיקרה כאשר אני אקרא ל TOSTRING של המחלקה הזאת? שהיא תדע להדפיס לי את כל הנתונים כמו שצריך בצורה יפה? אז התשובה היא לא, ואתה זה שצריך לשכתב אותה (OVERRIDE) ולממש בעצמך את הקוד שידפיס את הנתונים. (ליתר דיוק להחזיר מחרוזת להדפסה)שוב, הפונקציה TOSTRING היא פונקציה של מחלקת האב OBJECT שכל מחלקה שיש בשפה, גם מחלקה שאתה כתבת בעצמך, יורשת ממנה באופן אוטומטי.אם תפעיל TOSTRING על מחלקה שאתה כתבת, ולא מימשת את הפונקציה הזאת בעצמך, זה פשוט ידפיס לך מן HASH CODE שמציין את המחלקה, או שזה ידפיס את השם שלה (לא זוכר מה מביניהם קורה ב C# או ב JAVA).אז איך משכתבים/מעמיסים/דורסים את הפונקציה TOSTRING?ככה:public override string ToString(){ //your implementation goes here...}אה ועוד משהו, אם יש עוד בעיות/שאלות, אני מניח שביצעת שינויים בקוד מאז הקוד הראשון שכתבת פה, אז תצטרף את הקוד העדכני שלך.
פורסם 2011 באוגוסט 2514 שנים סתם הערה קטנונית שלי: ...ואתה זה שצריך לשכתב אותה (OVERRIDE) ... override נקרא בעברית לדרוס, לא לשכתב
פורסם 2011 באוגוסט 2514 שנים ובדיוק בגלל קטנוניות כזו של אנשים כתבתי בסוף "משכתבים/מעמיסים/דורסים" ה OVERRIDE שרשמתי לא היה אמור להיות תרגום, אלה הסינטקס של השפה.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.