ABA


"שאלה נוספת על עבודה עם פוינטרים ורקורסיה"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10375 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10375
TYSON 
חבר מתאריך 17.9.08
8384 הודעות, דרג אמינות חבר זה
   19:41   01.05.11   
אל הפורום  
  שאלה נוספת על עבודה עם פוינטרים ורקורסיה  
 
   ממש עזרתם לי באשכול הקודם... גם עם הטיפ
אני קרוב לסיום העבודה
העבודה היא תוכנית שפותרת תרגיל מתמטיקה לפי חוקי סוגריים וכל מה שצריך
למשל
(2*5)^2
כולל כל מיני פונקציות נוספות כמו שורש, חזקה, מחלק משותף הגדול ביותר וכל מיני דברים.
את כל הפונקציות סיימתי ועובד מצויין...
אבל עכשיו אני בשלב של להסביר לתוכנה קודם לפתור את הסוגריים הפנימיים

הקטע של העבודה היא שאסור להשתמש בלולאות... רק רקורסיה


אז בגדול הדבר היחידי שהוספתי לפונקציה שפותרת את התרגיל זה


if(*arr=='(')
return (השם של אותה פונקציה שפותרת את התרגיל)

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


אבל הבעיה שבפוינטרים הכל נדרס, ואת כל העבודה כתבתי בפוינטרים
יש למישהו איזה רעיון מה אפשר לעשות? ליצור אולי בכל שלב איזה temp שיאגור את התשובות?


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  אתה מתכוון שבפיונטרים הפונ' משנה את הערכים האמיתיים? -RD- 02.05.11 00:25 1
     בהכרזה של הפונקציה? TYSON  02.05.11 00:59 2
         תגיד לי אם זה מה שניסית -RD- 02.05.11 17:23 3
             האופציה הראשונה נותנת לי ארורים TYSON  02.05.11 19:14 4

       
-RD- לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 26.5.05
497 הודעות, 1 פידבק, 2 נקודות
   00:25   02.05.11   
אל הפורום  
  1. אתה מתכוון שבפיונטרים הפונ' משנה את הערכים האמיתיים?  
בתגובה להודעה מספר 0
 
   הבעיה זה שאחרי שהפונ' מסיימת לעבוד היא דופקת את הערכים המקוריים?
אם כן זה פשוט, בשורת הגדרה של הפונקציה תכניס את המילה const לפני מערכים או מצביעים שאתה רוצה שיישמרו ואז זה כמו משתנה רגיל (לא ישתנה כשהפונ' תסתיים)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TYSON 
חבר מתאריך 17.9.08
8384 הודעות, דרג אמינות חבר זה
   00:59   02.05.11   
אל הפורום  
  2. בהכרזה של הפונקציה?  
בתגובה להודעה מספר 1
 
   ערכתי לאחרונה בתאריך 02.05.11 בשעה 01:04 בברכה, TYSON
 
עשיתי וזה נותן לי מלא ארורים
על שורות בפונקציה כמו

*last=*buf;

אני לא מבין איך אפשר באמת להשתמש ב const ויש לי פעולות השמה על כתובות?
לזה התכוונת?

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

זה הקוד
buf - התרגיל עצמו... נקלט כמחרוזת כולל הסוגריים והכל
first - צד שמאל של התרגיל - החלק הראשון שלו
last - צד ימין של התרגיל - החלק השני שלו
sign - הפעולה
eval_comp - מקבל את הפעולה, המספר השמאלי, והימני, ומחזיר פתרון כ int


int eval ( char *buf, char *first, char *last)
{
char current=0;
static char sign=0;
static int i=0, j=0;

if(buf==0||first==0||last==0)
return sign;
if(*buf=='(')
return eval(buf+1,first,last);
if(*buf==')')
return eval_comp(first-i,sign,last-j);
current = *buf;

if(current==0)
return eval_comp(first-i,sign,last-j);

// We already found the sign, we can set the value in the 2nd expression
if(sign!=0)
{
*last=*buf;
j++;
return eval(buf+1,first,last+1);
}
else
{
if(*buf=='+'||*buf=='^'||*buf=='*'||*buf=='/'||*buf=='%'||*buf=='c'||*buf=='s')
{
sign = current;
return eval(buf+1, first, last);
}

*first=*buf;
i++;
return eval(buf+1,first+1,last);
}
}



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
-RD- לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 26.5.05
497 הודעות, 1 פידבק, 2 נקודות
   17:23   02.05.11   
אל הפורום  
  3. תגיד לי אם זה מה שניסית  
בתגובה להודעה מספר 2
 
   בשורה הראשונה שבה אתה מגדיר את הפונקציה תוסיף את הקונסט ככה למשל:
int eval (const char *buf, char *first, char *last)

עכשיו יש משהו עם הקונסט נמצע לפני או אחרי המשתנה (נדמה לי שאחד לא נותך לשנות את הכתובת אליה מצביע המצביע והשני שומר על הערך שבתא שאליו הוא מצביע.
בקיצור אם הראשון לא עובד תנסה ככה:
int eval ( char *buf const, char *first, char *last)

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TYSON 
חבר מתאריך 17.9.08
8384 הודעות, דרג אמינות חבר זה
   19:14   02.05.11   
אל הפורום  
  4. האופציה הראשונה נותנת לי ארורים  
בתגובה להודעה מספר 3
 
   השניה בכלל לא עוברת קומפילציה

אבל תודה בכל מקרה על העזרה!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net