לשאלה המלאה לחצו כאן

שאלה זו מבוססת על בחינת הבגרות של קיץ 2005.

ביטוי חשבוני פשוט בנוי משלושה חלקים: מספר שלם הראשון (num1), פעולה חשבונית (op) ומספר שלם שני (num2). רשימה "חשבונית" היא רשימה שאיבריה מטיפוס המחלקה Expr ומגדירה ביטוי חשבוני.

num1 ו-num2 הם מספרים שלמים גדולים מ-0. op הוא אחד מארבעת התווים המייצגים פעולה חשבונית: '+', '-', '*', '/'.

דוגמאות לביטויים חשבוניים פשוטים: 3+4, 8/2, 9*100.

הרשימה החשבונית lst מכילה את ארבעת הביטויים החשבוניים הבאים:

lst:

num1: 3, op: '+', num2: 4

num1: 8, op: '/', num2: 2

num1: 7, op: '%', num2: 2

num1: 9, op: '*', num2: 100

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

סעיף שני: הפעולה ()public double Calculate מחזירה את ערכו של ביטוי חשבוני פשוט.

היכן תוגדר פעולה זו? הסבירו.

ממשו את הפעולה.

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

לדוגמה, עבור הרשימה "החשבונית" lst המתוארת באיור, הפעולה ()SumExpressions תחזיר את הערך 908.

היכן תוגדר הפעולה (באיזו מחלקה)? הסבירו.

ממשו את הפעולה (הפעולה צריכה להשתמש בפעולה ()Calculate שכתבתם בסעיף ב).

מעשי:

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

כתבו פעולה המדפיסה את כל התרגילים ולצידם את התשובה.

כתבו פעולה המחזירה את הפעולה עם התשובה המקסימאלית.

כתבו פעולה הבודקת אם יש שתי חוליות עם תשובה זהה ללא קשר לסוג הפעולה החישובית.

מקורות ותוכן שקשור לנושא

פתרון בשפת C#

public class Expr{

private int num1;

private char op;

private int num2;

public Expr(int num1, char op, int num2)

{

        this.num1 = num1;

        this.op = op;

        this.num2 = num2;

}

public int GetNum1()

{

        return num1;

}

public int GetNum2()

{

        return num2;

}

public char GetOp()

{

        return num1;

}

public void SetNum1(int num1)

{

        this.num1=num1;

}

public void SetNum2(int num2)

{

        this.num2=num2;

}

public void SetOp(char op)

{

        this.op=op;

}

public override string ToString()

{

        return num1+" "+ op +" "+num2;

}

public double Calculate()

{

        if(op==’+’)

                return num1+num2;

        if(op==’-’)

                return num1-num2;

        if(op==’*’)

                return num1*num2;

        return (double)num1/num2;

}

}

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

סעיף ג'

בניגוד לפעולה Calculate אשר מתאימה לעצם ספציפי של Expr, הפעולה SumExpression(...) לא שייכת ל- Expr יחיד, אלא להוסף של Expre, לכן היא פעולה שאמורה להיות חיצונית למחלקה Expre, ואף סטטית.

public static double SumExpression(Node<Expr> lst)

{

        Node<Expr> p = lst;

        int sum=0;

        while(p != null)

        {

                sum+= p.GetValue().Calculate();

                p = p.GetNext();

        }

        return sum;

}