קליטת פונקציה דינמית מהמשתנה - C# - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

קליטת פונקציה דינמית מהמשתנה - C#


GWeizman

Recommended Posts

Long story short -

כחלק ממשימה בכיתה, בניתי פשוטה יחסית שמקבלת פונקציה f(x,y) ומציירת אותה בתחום מסויים.

התוכנה למעשה בונה מספר נקודות, כל נקודה מגדירה כ

(x, f(x, z), z) (יותר נוח לראות את החלק ה'תלת מימדי' על ציר הy [שפונה מעלה] מאשר על ציר הz [שפונה לכיוון המשתמש, כביכול)

ומחברת אותם עם קווים - לא מסובך במיוחד.

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

הבעיה היא כזאת:

קלט מהמשתמש.

המצב שאני מחפש הוא שהמשתמש יוכל לכתוב בתיבת טקסט כזו או אחרת ביטוי מורכב כמה שיהיה

(sin(x*x + y^x / 2*x*y) + cosh(x+tan(y)), ושיתבצע ציור שלו.

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

מה שמשאיר לי לעשות parsing (מה לעזאזל המילה בעברית?) של הביטוי כולו מחדש כל פעם לכל ערך של המשתנים (וזה יוצא בין 400 ל40000 פעמים להרצה בודדת), מה שבעייתי.

מה שאני צריך בעצם זה את הדרך הכי יעילה שאפשר לעשות את זה. (הבעיה, בעצם, היא שעוד לא מצאתי דרך לייצור Lambda expressions עם משתנים מתוך string, כי אם זה אפשרי אז אני פשוט יוצר את הביטוי ואז קורא לו בצורה f(x,y) וביעילות לא רעה, כי זה דורש parsing רק פעם אחת ואז הרבה חישובים)

אפשרי?

לא אפשרי?

תודה,

גיא.

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

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

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

אני מניח שהדרך הכי פשוטה לעשות את זה (בהנחה שאת הparsing עצמו אני יודע לבצע) זה לבנות אובייקט של Node כלשהו שיכול להכיל בתוכו:

א. שני nodes נוספים

ב. node ומספר

ג. שני מספרים

(כשמספר תמיד יכול להיות גם משתנה)

ושיכיל בתוכו אופרטור כלשהו

ולבנות בתוכו פונקציה שתמצא את הערך של הnode? (כמובן שאם הוא מכיל nodes בתוכו זה צריך קודם להעריך את הערך שלהם וכו')

או שיש דרך יותר טובה מזה לייצור את העץ עצמו? (משהו מובנה בC# שאני לא מודע אליו ושאין בעיה להכניס לתוכו טקסט (בשביל האופרטורים והמשתנים) ולבנות אותו בצורת 'עץ')

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

  • 3 שבועות מאוחר יותר...

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

חישוב ביטויים חשבוניים

פלט: ערכו של הביטוי החשבוני. .Infix קלט: ביטוי חשבוני בצורה

טיפוסי נתונים מופשטים:

מחסנית של אופרטורים. 

מחסנית של מספרים. 

הרעיון לאלגוריתם:

.Postfix- ל Infix- נתרגם את הביטוי מ 

.Postfix- נחשב את ערכו של הביטוי ב 

דרכים לכתיבת ביטוי חשבוני

.(Operands) נכתבת בין שני הביטויים (operator) הפעולה  Infix- ביטוי ב

מוגדרות קדימויות בין פעולות. 

דרושים סוגריים להביע קדימויות אחרות. 

הפעולה נכתבת אחרי שני הביטויים.  PostFix- ביטוי ב

אין צורך בקדימויות, אינו דורש סוגריים. 

הפעולה נכתבת לפני שני הביטויים.  PreFix- ביטוי ב

אין צורך בקדימויות, אינו דורש סוגריים. 

Postfix - ל Infix - דוגמאות למעבר מ

a ⇒ a (a+b)*c ⇒ ab+c*

a+b ⇒ ab+ (a+b)*c+d ⇒ ab+c*d+

a+b*c ⇒ abc*+ (a*b+c/d)*(e+f) ⇒ ab*cd/+ef+*

Postfix אלגוריתם לחישוב ערכו של ביטוי

אלגוריתם:

. 1. נקרא קלט

2. כל עוד לא הגענו לסוף הקלט:

מספר – נכניס אותו למחסנית. א. אם

על שני המספרים. פעולה – נוציא שני ערכים מהמחסנית. נחשב את הפעולה ב. אם

נכניס תוצאה למחסנית.

. ג. נקרא את הקלט הבא

3. בסיום תימצא בראש המחסנית תוצאת הביטוי.

.

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

ארכיון

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

×
  • צור חדש...