עבור לתוכן

שפת C: פונקציה לחיפוש במטריצה

Featured Replies

פורסם

שלום לכולם.

בניתי קוד לחיפוש במטריצה ריבועית.

הקוד אמור לבדוק אם במטריצה בגודל 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;

}

תודה מראש

פורסם

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

פורסם

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

אם גודל המטריצה הוא 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;

פורסם
  • מחבר

שניצל- אני יודע, ניסיתי אבל משום מה הוא מתעלם מהקוד של האינדקסים, ז"א:

if(i==2 && j==2)
flage3=1:

את הקוד הזה אני מכניס בתוך ה IF לחיפוש אם שונה מאחד, אבל אז הוא משום מה גם כאשר המטריצה היא

00000

00110

01010

01110

הוא מתעלם מהאפס במסגרת ומחזיר ערך 1

אז אני צריך קוד אחר בתוך הלולאת FOR, אם למישהו יש רעיון...

UnsignedInteger-אני לא כל כך מבין את הקוד שלך בתוך הלולאות, מה זה אומר &= זה בשפת C רגילה בכלל?

והאם בקוד שלך התעלמת מהאיבר האמצעי בתוך המסגרת?

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

פורסם

כמה דברים

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

if (arr[1][1]==1 && arr[1][2]==1 && arr[1][3]==1 && ... && arr[3][3] == 1)
*p_result=1
else
*p_result=0

כמובן שצריך לדלג על האיבר האמצעי.

פשוט עד כדי כאב ולכן היה חוסך לך שעות של עבודה מול ה debugger ולכתוב הודעות בפורום ולספק לחברים פה "עבודה" :D

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

int check_matrix(int arr[MATRIX][MATRIX])

ג) יש לך כמובן באג שבגללו אתה מחזיר 1 במקרה שהצגת. כרמז אומר שבמקרים מסוימים אחרים לא תחזיר טעות. לדוגמה במקרה הבא:

111
101
011

(קשור לפעולה שאתה מבצע אחרי בדיקת מקרה האיבר האמצעי)

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

פורסם

פותח הת'רד: ניסית להבין מה הבאג שלך? (זה הרי לא קורה "משום מה", יש לזה סיבה די פשוטה)

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

פורסם

עזוב אותך מדגלים.

תעשה שתי לולאות.

אחת בודקת את שתי השורות של המסגרת הפנימים.

אחת בודקת את שתי העמודות של המסגרת הפנימית.

אם באחד מהאיברים נתקלת ב 0, אז שהפונקציה תחזיר 0.

בסוף הפונקציה תחזיר אחד.

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

פורסם
  • מחבר

אוקיי, פתרתי את הבעיה.

סתם לידע כללי:

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

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

הבעיה שלי לא הייתה בהיגיון אלא באג בבדיקה שגיליתי איך לפתור

הגודל של המטריצה לא קבוע, מה שמזכיר לי שעשיתי טעות ששלחתי את הקובץ כי גם אני השתמשתי ב J==2 ו- I==2 והייתי צריך להשתמש ב MATRIX\2==I MATRIX\2==J במקום...

בכל מקרה תודה לכולם על הנסיון לעזור והעוקצנות הרבה :)

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים