פורסם 2010 באוגוסט 2015 שנים שלום לכולם.בניתי קוד לחיפוש במטריצה ריבועית.הקוד אמור לבדוק אם במטריצה בגודל 5X5 המסגרת הפנימית היא מורכבת מ-אחדים (1 דים).ז"א נגיד שהמטריצה תהיה 00000 01110 01110 01110 00000אז הפונקציה תחזיר שהכל תקין ובעצם תחזיר את הספרה אחדואם המטריצה תהיה 00000 01010 01110 01110 00000הפונקציה תחזיר את הספרה 0אבל הבעיה היא שהפונקציה צריכה לחפש רק במסגרת הפנימית ולא כולל האיבר האמצעי במטריצה ז"א 00000 01110 01010 01110 00000הפונקציה צריכה להחזיר שהכל תקין, ז"א 1אני צריך איזשהו קוד שידלג על בדיקת האיבר האמצעי (רק המסגרת הפנימית צריכה להיות עשויה מאחדים, כל השאר יכולים להיות כל מספר)זהו הקוד:void check_matrix(int arr[MATRIX][MATRIX],int* p_result){ int i,j; int flag3=1; int temp; for(i=1 ; i<MATRIX-1 ; i++)//i goes 1,2,3 out { for(j=1 ; j<MATRIX-1 ; j++)//j goes 1,2,3 out { arr[i][j]; if(arr[i][j]!=1)//exclude the value in the middle of matrix { flag3=0; } } } *p_result=flag3;}תודה מראש
פורסם 2010 באוגוסט 2015 שנים במקום לעבור על כל האיברים הפנימיים, אתה יכול לעבור רק על השורות והעמודות שאתה צריך.אם גודל המטריצה הוא WIDTH*HEIGHT, תעשה:int result =1;for (int j = 1; i < HEIGHT - 1; ++j){result &= arr[j][WIDTH - 1] & arr[j][1];}for (int i = 2; i < WIDTH - 2; ++i){ result &= arr[1][i] & arr[HEIGHT - 1][i];}return result;
פורסם 2010 באוגוסט 2015 שנים מחבר שניצל- אני יודע, ניסיתי אבל משום מה הוא מתעלם מהקוד של האינדקסים, ז"א:if(i==2 && j==2)flage3=1:את הקוד הזה אני מכניס בתוך ה IF לחיפוש אם שונה מאחד, אבל אז הוא משום מה גם כאשר המטריצה היא00000001100101001110הוא מתעלם מהאפס במסגרת ומחזיר ערך 1אז אני צריך קוד אחר בתוך הלולאת FOR, אם למישהו יש רעיון...UnsignedInteger-אני לא כל כך מבין את הקוד שלך בתוך הלולאות, מה זה אומר &= זה בשפת C רגילה בכלל?והאם בקוד שלך התעלמת מהאיבר האמצעי בתוך המסגרת?תודה בכל מקרה על העזרה.
פורסם 2010 באוגוסט 2015 שנים כמה דברים א) כאלטרנטיבה (אם גודל המטריצה קבוע ולא ישתנה בעתיד ו/או מה שיעניין אותך זו רק "המסגרת" אז) אתה יכול לבדוק ישירות את התאים במסגרת ללא לולאה. if (arr[1][1]==1 && arr[1][2]==1 && arr[1][3]==1 && ... && arr[3][3] == 1) *p_result=1else *p_result=0 כמובן שצריך לדלג על האיבר האמצעי. פשוט עד כדי כאב ולכן היה חוסך לך שעות של עבודה מול ה debugger ולכתוב הודעות בפורום ולספק לחברים פה "עבודה" ב) מכיוון שהפונקציה שלך בעקרון מחזירה ערך אחד אז עדיף שתגדיר את הפונקציה כמחזירה ערך במקום להעביר את התוצאה המחושבת בפרמטר. int check_matrix(int arr[MATRIX][MATRIX]) ג) יש לך כמובן באג שבגללו אתה מחזיר 1 במקרה שהצגת. כרמז אומר שבמקרים מסוימים אחרים לא תחזיר טעות. לדוגמה במקרה הבא: 111101011 (קשור לפעולה שאתה מבצע אחרי בדיקת מקרה האיבר האמצעי) ד) ללא קשר אם כבר הגעת לשלב בו flag3 צריך להיות 0 אז משיקולי יעילות אל תמשיך בלולאות מכיוון שברור כי המטריצה כבר לא טובה ואין מה לבדוק עוד. תעשה אחד מהבאים: תחזור מייד או תצא מהלולאות ותמשיך בביצוע הפונקציה.
פורסם 2010 באוגוסט 2015 שנים פותח הת'רד: ניסית להבין מה הבאג שלך? (זה הרי לא קורה "משום מה", יש לזה סיבה די פשוטה)במקרה ש-i,j שניהם 2, אין סיבה להדליק את הדגל מחדש, פשוט צריך להימנע מלכבות אותו.
פורסם 2010 באוגוסט 2015 שנים עזוב אותך מדגלים.תעשה שתי לולאות.אחת בודקת את שתי השורות של המסגרת הפנימים.אחת בודקת את שתי העמודות של המסגרת הפנימית.אם באחד מהאיברים נתקלת ב 0, אז שהפונקציה תחזיר 0.בסוף הפונקציה תחזיר אחד.אני לא מבין מה יכול להיות יותר פשוט מזה. לא רואה שום סיבה לרוץ על כל המטריצה.
פורסם 2010 באוגוסט 2215 שנים מחבר אוקיי, פתרתי את הבעיה. סתם לידע כללי: התרגיל הזה הוא תרגיל בית בתכנות שאני צריך להגיש ולקבל עליו ציון אני לא יכול להשתמש בפונקציה המחזירה ערך (מן הסתם הייתי עושה את זה אם הייתי יכול) זה חלק מדרישות התרגיל הבעיה שלי לא הייתה בהיגיון אלא באג בבדיקה שגיליתי איך לפתור הגודל של המטריצה לא קבוע, מה שמזכיר לי שעשיתי טעות ששלחתי את הקובץ כי גם אני השתמשתי ב J==2 ו- I==2 והייתי צריך להשתמש ב MATRIX\2==I MATRIX\2==J במקום... בכל מקרה תודה לכולם על הנסיון לעזור והעוקצנות הרבה
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.