"לא עושה מה מה שהוא רוצה", פרושו, מבחינתי
לפחות, שהוא ציפה בהינתן קלט X לקבל פלט Y ובמקום קיבל פלט Z.
ייתכן, שזה נובע מכך שהתוכנה נבנתה בכוונה לתת פלט Z, ויכול להיות שזה בכלל באג.
אז הסתכלתי על הקוד שלך, ועל פניו נראה שכן הבנת את השאלה, כי בהתחלה אתה מנסה לבדוק שבתא אלכסוני יש 1 ובכל השאר 0, ואחרי זה לא.
תו אחד שגוי בתוכנית, למשל 0 במקום 1 או להפך זה סוג מאוד נפוץ של באגים, שפוקדים גם את המפתחים המנוסים יותר.
ואם נצרף את העובדה שהתוכנה נבנתה לעבוד עם קלט רנדומלי במקום לנצל את הקלט לדוגמה שהשואל סיפק בתרגיל, אני לא רואה איך יכולת לבדוק אותה כהלכה, לכן, הגעתי למסקנה שלמרות הטענה (שנשמעה לי די נחרצת) שהפלט שונה בגלל שלא הבנת את התרגיל, הסיבה האמתית לשוני היא טעות בקוד.
כמובן שאם תגיד לי שהתכוונת לכתוב כך, ולא לבדוק שיש 1 באלכסון, אני אקבל שטעיתי.
בכל מקרה, בלי קשר לנכונות הלוגית של הקוד,אני עדיין עומד מאחורי הטענה השנייה בהודעתי המקורית:
עדיף להימנע מסוג if מורכב ונקודתי מהסוג הזה בתוך לולאות:
if (k == 4 && mat[4][4] == 1 && mat[4][3] == 0)
f++;
אם אתה מגיע למצב כזה, סימן שיש בעיה בתכנון האלגוריתם שלך.
הרי אתה הורס את כל הרעיון שמאחורי לולאה - לחזור על אותן פעולות תוך שימוש במשתנים כדי לעבד נתונים שונים.
בכל אופן, בעוד שאני מאוד מכבד את רצונך ללמוד, אתה לא עושה טובה לאף אחד כשאתה פותר לאחרים שיעורי בית, בלי אפילו להסביר להם איך הקוד עובד.
אתה אולי תלמד משהו מפתרון התרגיל, אבל מה עם האדם שפתרת עבורו?
הוא יגיש את הפתרון שלך ולא ילמד כלום, ותכנות כמו מקצועות רבים אחרים בנוי בשלבים - לא תוכל להתקדם לשלב הבא אם לא הבנת את הבסיס שלו, כך שכל ניסיון לדלג על משהו רק יכשיל אותך.
ולסיום:
בתור מישהו שלמד לבד והגיע (עם לא מעט מזל) לעבודה אמתית בתכנות, הרשה לי לגלות לך סוד:
כשלומדים לבד, יש המון דברים שנוטים לפספס!
דברים, שבלעדיהם קשה עד בלטי אפשרי לשרוד בעבודה אמתית.
לדעת איך לגרום למחשב לבצע משהו בעזרת שפת תכנות זה טוב ויפה, אבל יש עוד המון דברים חשובים מסביב שקל מאוד לפספס אבל קשה מאוד לחיות בלעדיהם.
למשל קונבנציות בכתיבת קוד. איך קוד אמור להיראות, אחידות.
כיצד לכתוב קוד קריא, איך להימנע ממלכודות שונות כמו "מספרי קסם".
ויש כמובן את כל נושא היעילות כשגם יש סוגים שונים של יעילות, למשל יעילות זמן ריצה מול יעילות זיכרון, והכרות עם אלגוריתמים מבוססים ומוכרים וספריות שמספקות אותם.
אם נפנה רגע לדיון על "מתכנת טוב", אז תכונה אחת של מתכנת טוב היא לדעת מתי לא להמציא מחדש את הגלגל.
הנושא לא עולה הרבה בפורום, כי רוב הדיונים כאן הם על שיעורי בית בהם אמורים לעשות הכל מ-0 והרבה פעמים מכריחים אנשים להימנע אפילו משימוש בפונקציות סטנדרטיות, אבל בעולם האמתי המצב הפוך:
אם מישהו כבר כתב את זה, רוב הסיכויים שעדיף להימנע מליצור גרסה משלך.
וזה רק קצה הקרחון.
תזכור זאת כשאתה מחפש חומר לימוד, ואני ממליץ בחום שבנוסף להצצה במדריכים והסברים על שפת תכנות שאתה לומד, תציץ גם בפרויקטים קיימים ומבוססים באותה שפה, כדי לקבל מושג איך תוכנה רצינית נראית.
אולי זה נראה לך לא חשוב בעליל מתי עושים מעבר שורה או איפה דוחפים רווח ואיפה לא (Python קצת פחות סלחנית בנושא רווחים ומעברי שורה משפות אחרות כמו Java), אבל כשתכתוב קוד, תחזור עליו עוד חצי שנה ולא תבין על מה אתה מסתכל, תדע בדיוק על מה אני מדבר.
בכל מקרה, בהצלחה!