שלום

vTvT

New member
שלום ../images/Emo13.gif

האמת שזו כבר פעם רביעית נראה לי שאני מנסה לשלוח וזה לא שולח אני מקווה שזה לא ישלח כפול.. אז ככה: יש לי שאלה אשמח אם תעזרו לי.. נתקעתי בקטע של תוכנית שבו אני צריכה לבדוק על מטריצה של 4X4 את כל האפשרויות של 0 ו-1 ז"א אם אני לא טועה זה אמור להיות 2 בחזקת 16 אפשרויות.. (ואם אפשר להוריד את האפשרות שבה כל המטריצה 0).. אני צריכה את זה ב-C++ אבל גם פסאודו קוד יעזור.. משום מה קבלתי בלק אאוט למרות שכתבתי קוד דומה פעם.. תודה רבה!!!!!
 

vTvT

New member
מישהו???!!??

פליז.... לפחות כיוון..
כי הכל מתבלבל לי בראש..
 
איפה נתקעת?... ../images/Emo26.gif

מה בדיוק את מנסה לעשות?... עוד טיפה פרטים יעזרו למי שמנסה לעזור...
 

vTvT

New member
אוקיי..

קודם כל תודה על היחס..
אנסה להסביר כמה שאוכל מקווה שזה לא יסבך רק.. עכשיו התוכנית עצמה אמורה להוכיח (א להפריך) איזשהי טענה במתמטיקה בדידה..(לא רלוונטי כ"כ אבל מה שהיא אמורה לעשות זה לבדוק שישנו (או לא)מחזור בחזקות של יחס R) ישנו יחס R שממומש ע"י מטריצה של 0 ו-1 כאשר 1 מבטא שישנו איבר i,j ב-R ו-0 מבטא שאין כזה איבר.. התוכנית אמורה לבדוק שלדוג' עד R^4 מקבלים יחסים שונים ומ-R^5 היחסים חוזרים על עצמם ז"א " R^5=R^1 R^6=R^2 וכן הלאה.. עד כאן התוכנית עובדת לי על R מסוים ז"א שלקחתי מטריצה והחלטתי שרירותית מה יהיו האיברים שלה רק כדי לבדוק שזה אכן עובד.. עכשיו אני צריכה להעביר את זה למשהו יותר כללי ז"א לבדוק על כל האפשרויות של 1 ו-0 ש-R יכול להכיל ואם זה מטריצה של 4X4 אז זה אמור להיות 2 בחזקת 16 אפשרויות (מקווה שאני אכן צודקת).. אז התחלתי לכתוב את זה ופשוט הסתבכתי אי שם בתוך הלולאות כי מה שיצא לי זה לולאה בתוך לולאה בתוך לולאה בתוך לולאה וכו'.. ונתקעתי ולא היה לי מושג איך בעצם לבדוק את זה.. מקווה שהסברתי את עצמי יותר טוב ועוד יותר מקווה שלא סבכתי יותר.. אשמח לכיוון מחשבה כי התבלבלתי לגמרי.. תודה.
 

DNile

New member
עקרונית,

אפשר לממש את זה גם בלי מטריצה... ה"מטריצה" שלך תהיה למעשה מטריצה של ביטים. את משתמשת במספר אחד, בן 16 סיביות(int יתאים למטרה), וכל סיבית שבו מייצגת למעשה מספר בתוך ה"מטריצה". כדי לעבור על כל האפשרויות הללו, את פשוט עושה לולאה מ0 עד 2^16-1. איך מתרגמים מספר שכזה לערכים במטריצה?
int matrix; //Loop matrix from 0 to 65535 int row = [0-3]; int col = [0-3]; int i = row * 4 + col; int bit = (matrix >> i) & 0x1;​
 

vTvT

New member
אז ככה..

קודם כל תודה.. אבל אני כן חייבת מטריצה כי זה חלק מתוכנית שבה הייתי חייבת להשתמש במטריצה.. איך זה בעצם קורה??.. על כל איבר אני אמורה לעשות לולאה ממנו עד הסוף שתעשה על כל איבר לולאה מ-0 עד 2 אבל איך אני מכסה את כל האפשרויות??? יש בכלל אפשרות לבצע את זה בלולאות???
 
למה לך?...../images/Emo26.gif

תחשבי על לולאה חיצונית שהולכת מ-0 עד 2 בחזקת 16 פחות 1 (=65535). זה ייתן לך מספר בינארי בן 16 ספרות (ביטים). נניח: 1011010101111110 עכשיו - נסי להסתכל על המספר הזה בחלוקה לרבעיות ביטים: 1011,0101,0111,1110 ועכשיו נסי לכתוב את הביטים ב-4 שורות נפרדות: 1011 0101 0111 1110 והנה... קיבלת מטריצה 4X4... (ולכל מספר מ-0 עד 65535 תקבלי מטריצה שונה). אני לא יודע איך מימשת הכל - אבל נראה לי שמספיקות שתי לולאות: החיצונית רצה מ-0 עד 65535 - כל איטרציה מייצגת מטריצה שונה. הפנימית רצה מ-0 עד 15 על כל אחת מ-16 הביטים של המספר ונותנת למטריצה את הערכים המבוקשים (DNile הראה לך בדיוק איך עושים את זה - איך פונים למיקום המבוקש במטריצה, ואיך ניגשים לכל ביט במספר...) בהצלחה...
 

vTvT

New member
וואלה..

תודה.. רק עכשיו אני בעצם מבינה ל-מה DNile התכוון.. תודה!!!! פתרון ממש יפה.. שבטח לרובכם היה ברור מאליו אבל ממש לא יצא לי להתעסק עם ביטים אז לא חשבתי אפילו על הכיוון.. אבל ממש אהבתי ושמחתי להחכים.. רק עוד שאלה קטנה אני ממש לא יודעת להתעסק עם ביטים אז אשמח אם מישהו יסביר לי את השורה הזו:
int bit = (matrix >> i) & 0x1;​
matrix >> i זה כדי להגיע לביט שאני רוצה? ומה אומר ה- & 0x1? אם יש לי שם 0 או 1?? ז"א זו השורה שאני אמורה לרשום בתוך הלולאה שהולכת מ-0 עד 16?? ועוד שאלה של סקרנות בעיקרון היה ניתן לבצע עם לולאה או רקורסיה??
 

roterl

New member
זהו סימן ל HEX

ה 0xN זהו סימן ל Hex.. כלומר המספר N הוא בבסיס 16 (במקום 10). כאשר עובדים עם ביטים קל יותר לעבוד בבסים 16. שדוגמה שלך זה זהה - כיוון ש 1 הוא 1 בכל בסיס.
 
OK...../images/Emo26.gif

אז הסימנים << ו->> הם shift (ימינה ומשאלה בהתאמה) של הביטים. נניח - קחי את המספר הבינארי: 10110 shift אחד ימינה ייתן לך: 1011 שני shift-ים ימינה ייתנו לך 101 וכו'. matrix >> i אומר ש"מקצצים" את i הביטים הימניים. הסימן & הוא AND (על הביטים). כלומר מה ש-DNile עשה כאן זה AND של המספר שיצא עם 0000001... שתי הפעולות האלה יחד (הזזה של i ביטים ימינה ו-AND עם 1) - נותנים לך 0 אם הביט ה-i-י דלוק ו-0 אחרת... וככלל כל לולאה אפשר להמיר לרקורסיה וההפך....
 

vTvT

New member
יפה..

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