שפת C: פונקציה לחיפוש במטריצה - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


mdmdmd

Recommended Posts

שלום לכולם.

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

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

}

תודה מראש

קישור לתוכן
שתף באתרים אחרים

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

אם גודל המטריצה הוא 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 אז משיקולי יעילות אל תמשיך בלולאות מכיוון שברור כי המטריצה כבר לא טובה ואין מה לבדוק עוד. תעשה אחד מהבאים: תחזור מייד או תצא מהלולאות ותמשיך בביצוע הפונקציה.

קישור לתוכן
שתף באתרים אחרים

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

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

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

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

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

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

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

קישור לתוכן
שתף באתרים אחרים

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

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

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

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

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

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

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

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...