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

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


NatanZ

Recommended Posts

שלום חברים,

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

קיבלתי תרגיל ב- 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, לא הלך.

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

ארכיון

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

×
  • צור חדש...