עבור לתוכן

ייעול קוד - מתחיל ב- C

Featured Replies

פורסם

שלום חברים,

סטודנט שנה ראשונה לתואר ראשון במדמ"ח.

קיבלתי תרגיל ב- C של איקס-עיגול תלת מימדי.

בקוד הבא אני בודק ניצחון לאורך, לרוחב, לגובה ואלכסונים.

אני רוצה שהבדיקות תהיינה בלתי תלויות ועבור ניצחון באחת מהבדיקות כל הפונ' תוציא return 1.

מה שעשיתי זה פשוט מספר משתנים שונים כמספר הבדיקות (כמו "ערבי")

אשמח לעזרה בייעול הקוד :)

int check_2d (char board [N][N][N], int x, int y, int z, char sign){    int ok_z = 1;
int ok_y = 1;
int ok_x = 1;
int ok_xx = 1; int ok_xxx = 1; int ok_yy = 1; int ok_yyy = 1; int ok_zz = 1; int ok_zzz = 1;
int ok = 0;
for (int i_x=0; i_x<4; i_x++){
for (int i_y=0; i_y<4; i_y++){
for (int i_z=0; i_z<4; i_z++){
for (int i_i = 0; i_i<4; i_i++){
/* Diagonal Z,X */
if (board[i_i][y][i_i] != sign){
ok_zz = 0;
}
if (board[3-i_i][y][i_i] != sign){
ok_zzz = 0;
}
} // end of diagonal Z
if (board[x][y][i_z] != sign){
ok_z = 0;
}
} // end of row Z
/* Diagonal Y,X */
for (int i_i = 0; i_i<4; i_i++){
if (board[i_i][i_i][z] != sign){
ok_yy = 0;
}
if (board[3-i_i][i_i][z] != sign){
ok_yyy = 0;
}
} // end of diagonal Y
if (board[x][i_y][z] != sign){
ok_y = 0;
}
} // end of column Y
/* Diagonal Y,Z */
for (int i_i = 0; i_i<4; i_i++){
if (board[x][i_i][i_i] != sign){
ok_xx = 0;
}
if (board[x][3-i_i][i_i] != sign){
ok_xxx = 0;
}
} // end of diagonal X
if (board[i_x][y][z] != sign){
ok_x = 0;
}
} // end of height X
ok = ok_x + ok_y + ok_z + ok_xx + ok_yy + ok_zz + ok_xxx + ok_yyy + ok_zzz;
return ok;
}

פורסם

קודם כל, אתה צריך לדעת שאפשר לעשות return באמצע פונקציה. אם בנקודה כלשהי בקוד אתה יודע ב-100% שיש ניצחון, אתה יכול פשוט לעשות return 1 באותו מקום וזהו.

לא כל כך ברור לי מה המשמעות של הפרמטרים החיצוניים x,y,z (מה מי שמשתמש בפונקציה אמור לשים בהם?)

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

נערך על-ידי שניצל

פורסם
  • מחבר

אני מבין מה אתה מתכוון. הבדיקות אצלי יוצאות מנק' הנחה שיש "ניצחון" בכל הבדיקות (= כל המשתנים מאותחלים ל- 1) ואם אחד מהסימנים לא זהים אז המשתנה של הבדיקה מקבל ערך 0.

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

ניסיתי עם continue, לא הלך.

ארכיון

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

דיונים חדשים