שאלות ממבחן

pilot23

New member
שאלות ממבחן

שלום,
אני פותרת מספר שאלות ממבחן ונתקלת בקצת בעיות:
1. מה יהיה ערכו של X לאחר ביצוע הקטע ?
מה שאני לא מבינה כאן זה התנאי של ה- while מה זאת אומרת X או X ?
x=5;
while (! x | x))zz ה- zz כמובן לא קשור.
}

++x;
}

--x ;

2. מה יהיה ערכו של K לאחר ביצועה ?

int x=3;
int i,k,a;
main ()
}
a=1;
for ( i=1, k=0; i<17; i++, a=a<<1)
}
if (x&a) zz
++k;
{
printf("\ nvalue of K = %d,k)zz

3. מה המשמעות של y= ~x ?

תודה.
 

BravoMan

Active member
כמה תשובות:

1. אני חושב שהעתקת לא נכון את הקוד.
מומלץ להשתמש בתגיות |⁣הקוד⁣| ו- |⁣סקוד⁣| כדי להצמיד ימינה, או לצרף קובץ טקסט במקום.

בשורה של ה-while יש סוגר מיותר או שחסר סוגר.
צריך לדעת את התנאי במדויק, כדי לענות על השאלה.

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

2. כאן יש עוד תרגיל של חישוב סיביות:
מתחילים עם a = 1 ו-x = 3.
לערך של a עושים הזזת סיביות שמאלה.
מחשבים תוצאה של פעולת סיביות & (and) בין a ל-x.

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

כל עוד יש לפחות סיבית אחת חופפת, k גדל באחד.

להזכירך, תוצאות הפעולה & הן:
0 & 0 = 0
1 & 0 = 0
0 & 1 = 0
1 & 1 = 1

3. האופרטור ~ הוא פעולת NOT על סיביות. הוא הופך כל סיבית לערך הנגדי שלה, כלומר 0 = 1 ו-1 = 0.
 

pilot23

New member
לקחתי מספר מבחנים, ולא סתם לא הכרתי

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

BravoMan

Active member
לא נורה. רוב הסיכויים שתלמדי את זה עד סוף

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

למשל:

1 && 2 = true
1 & 2 = false

במבחן, אם תשכחי סימן, ירד לך הניקוד.
 

nocgod

New member
עבור שאלה 1

התנאי !X | X זה bitwise operators, כלומר אופרטורים שעובדים על הביטים של המספר.
במקרה של ! על מספר את תקבלי את המשלים של המספר ל r (נראה לי) ובמקרה של | את תקבלי פעולת or בין הביטים של המספרים (במקרה שלך זה בין המשלים של X ל X עצמו, ככה שאת תמיד תקבלי את X עצמו)
דוגמא
נניח X הוא 5, כלומר הוא מיוצג בינארית כ 00000000000000001001 משלים שלו זה 11111111111111110110 כאשר עושים או בין 2 מספרים בינארים 1 "או" עם כל דבר נותן 1, 0 או 0 זה אפס.
בגלל זה אם נעשה או בין 2 המספרים נקבל תמיד 11111111111111111111 שזה לא 0 ועל כן זה נראה כאילו נכנסים ללולאה אין סופית...(בכל מקרה אצלי היא עדיין לא סיימה לרוץ)

יש מצב העתקת לא נכון את התרגיל?
 

BravoMan

Active member
תיקון קטן: ! הוא לא פעולת סיביות, הוא פעולה

בוליאנית ולכן יחזיר 0 (false) על כל דבר שאינו 0 ו-1 (או כל דבר אחר שמוגדר true ע"י קומפיילר נתון), לא את המשלים.
~ הוא NOT על סיביות .
 

BravoMan

Active member
אגב, הניחוש שלי הוא שחסר שם סוגר, והתנאי

אמור להראות כך:

(!(x | x))

מה שאומר שאף פעם לא נכנסים ללולאה והתוצאה הסופית היא x = 4.

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

nocgod

New member
תראה...

הם לא למדו bitwise ops (היא אמרה) אז בכל מקרה זה לא משנה כבר
אבל כן מאוד הגיוני עם הסוגריים ככה, כי אז מתקבל שלילי בתנאי וכולה מפחיתים מx אחד...
 

nocgod

New member
תראה...

הם לא למדו bitwise ops (היא אמרה) אז בכל מקרה זה לא משנה כבר
אבל כן מאוד הגיוני עם הסוגריים ככה, כי אז מתקבל שלילי בתנאי וכולה מפחיתים מx אחד...
 
למעלה