שאלה דחופה למומחי C++!!!!

שמרית 17

New member
שאלה דחופה למומחי C++!!!!

יש לי בחינה ומחר והינה שאלת חזרה שניתנה לי:
#include<iostream.h> float second=50; void mystery (float&first) { float imp=10; first-=imp; imp++; second+=first; cout<<second; float second=imp; imp++; cout<<" "<<second<<endl; cout<<imp<<" "<<first<<endl; } void main (void) { float last=24; while(last>12) mystery(last); cout<<second<<endl; }​
והפלט יוצא כך: 64 11 12 14 68 11 12 4 68 ושאלתי : מדוע בהרצה השניה של הלולאה SECOND=68???? אודה לעזרתכם המהירה !!!!!!!!!!!!!!
 

שמרית 17

New member
שמעתי אבל...

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

vinney

Well-known member
זה כבר שאלה אחרת לגמרי ../images/Emo13.gif

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

Dragon Eye

New member
אני אכן אתקן אותך

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

vinney

Well-known member
מסתבר שטעית

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

שמרית 17

New member
קודם כל...

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

vinney

Well-known member
על השאלה העקרונית שלך עניתי

אבל זה היה השאלה השניה השאלה הראשונה הייתה "אין לי מושג, לא רוצה להתעמק, תנו לי פתרון", ולזה לא אענה בחיים.
 

שמרית 17

New member
טוב...

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

galh

New member
לא מומחה, אבל...

בריצה הראשונה מוסיפים ל- second הגלובלי 14 (שזה 24-10) והערך שלו הופך להיות 64. בריצה השניה מוסיפים ל- second הגלובלי 4 (14-10) ומקבלים 68. כל מה ש"קורה" ל- second אחרי ההצהרה עליו בפונקציה קורה למשתנה second לוקלי שלא משפיע על ה- second הגלובלי.
 

שמרית 17

New member
תודה.. אני אלאה אותך בעוד שאלה קטנה

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

שמרית 17

New member
זה כן second

אחרי הרצה ראשונה של הwhile ישנה הרצה נוספת. הוא מדפיס 68 (second) ולאחר מכן בcout השני מדפיס רווח ועוד פעם את second רק שהפעם מדפיס 11. זה מה שאני לא מבינה.... 11 הינו הערך של הגלובלי - משמע תמיד מדפיס את הגלובלי? למה הוא לא הדפיס את הערך של second הלוקלי שם?
 

vinney

Well-known member
שוב

הנה הקוד:
float imp=10; first-=imp; imp++; second+=first; cout<<second; float second=imp; imp++; cout<<" "<<second<<endl; cout<<imp<<" "<<first<<endl;​
כמו שאת רואה אחרי הcout הראשון, מוקם משתנה לוקלי בשם second, שערכו זהה לimp (לפני ה++ השני), וזה מה שמודפס.
 

galh

New member
לא, לא סיבכת.

תסתכלי שוב על התוכנית. יש שלוש הדפסות (הקריאות >> ל- cout): הראשונה מדפיסה את second הגלובלי. השניה: רווח ואז את second _הלוקאלי_ (בעצם ערך 11 קבוע). השלישית: את imp (לוקאלי) ואת first שהוא הרפרנס לפרמטר last. אין הבדל בין מה שהפונקציה עושה בשני הקריאות, רק הנתונים שונים.
 
למעלה