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

Class stack ב-C#


gal_il50

Recommended Posts

במסגרת תרגיל שיש לי אני אמור לרשום את הקלאס הנ"ל, בתור התחלה יש לי כמה מתודות שעלי לרשום, המתודה 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();
}
}
}

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

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

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

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

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

אגב תוכל להרחיב טיפה על ToString ולמה לא הודפס לי כלום ? כי לא ממש הבנתי

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

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

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

MyStack s = ...
s.push(x);
y = s.pop();

אז y ו-x הם אותו אובייקט. אם הם לא, אז יש לך באג.

אגב תוכל להרחיב טיפה על ToString ולמה לא הודפס לי כלום ? כי לא ממש הבנתי

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

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

תחשוב מה קורה אם אתה מכניס (push) שני איברים לתוך המחסנית (נניח, 1 ואז 2) ואז עושה pop פעם אחת. מה הערך שמוחזר לך מה-pop? מה הערך שצריך להיות מוחזר?

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

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

הערך 2 הוא זה שאמור להיות מוחזר, השאלה היא איזה ערך באמת מוחזר לפי הקוד שלך.

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

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

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

לפותח הת'רד:

שים לב לטעות המרה שאתה עושה ב 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...
}

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

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

ארכיון

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

×
  • צור חדש...