שאלה ב JAVA דחוף !!!!

tomer1801

New member
שאלה ב JAVA דחוף !!!!

אפשר לעזור לי בשאלה הבאה ? (אני עובד ב-JAVA)
נגדיר: אלכסון ראשי של מערך דו-ממדי b ריבועי בגודל n´n מכיל את האיברים b[0,0],b[1,1],...,b[n-1,n-1]).

כתבו שיטה בשם square. השיטה תבדוק האם קיים מערך דו-ממדי ריבועי חלקי בפינה הימנית התחתונה של המערך אשר מכיל 1 -ים באלכסונו הראשי והיתר אפסים.
אם קיים - השיטה תחזיר את מספר השורות/עמודות של מערך ריבועי חלקי זה; אם לא קיים - השיטה תחזיר 0.
חתימת השיטה תהיה: public int square()
דוגמא מצורפת
 

BravoMan

Active member
תשובה: (סליחה שלקח חצי שעה!)

כן, בהחלט אפשר לעזור לך!

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

המילה "דחוף" בכותרת פועלת נגדך, ולא סביר שתמצא כאן מישהו שפשוט יפתור לך את התרגיל מ-א' עד ת', אבל אם תסביר היכן נתקעת נשמח לעזור!
 

tomer1801

New member
המשך שאלה על המערך הדו-מימדי

הדחוף היה כי אני לא מצליח לפתור.
ניסיתי לבדוק את האלכסון הראשי מהפינה הימנית למטה .
אחר כך ניסיתי להריץ בתוכה לולאה שתבדוק אם המספרים שווים לאפס או שונים.

לצערי, קיבלתי תשובה שגויה ממי שציפיתי.

אשמח לעזרה.
 

tomer1801

New member
קוד

public class Matrix
{

public static int square(int [][] elements)
{
//Checks the number of the rows and the columns of the matrix, and puts in the variables the last row and colum
int row = elements.length - 1;
int col = elements[0].length - 1;
while (col >=0 && elements[row][col] == 1)
col--;
int size=elements[0].length - 1 - col;
int sizeLeft = elements[0].length - size;
int sizeUp = elements.length - size;

for (int j=0; j<sizeLeft;j++)
for (int i=0; i<elements.length; i++)
{
if (elements[j]!=0) return 0;
}

for (int j=sizeLeft; j<elements[0].length;j++)
{
for (int i=0; i<sizeUp; i++)
{
if (elements[j]!=0) return 0;
}

for (int i=sizeUp; i<elements.length; i++)
{
if (elements[j]!=1) return 0;
}
}
return size;
}
}
 

Guy Yafe

New member
אני לא יודע מה עשית אבל זה לא קשור לשאלה

התחלת בלבדוק את הגודל המקסימלי של תת מטריצה ימנית תחתונה שהאלכסון שלה מכיל אחדות. זה כיוון טוב אבל לא מדוייק מפני שיכולה להיות לה תת מטריצה יותר קטנה שרק היא תכיל אפסים מחוץ לאלכסון.
בנוסף צורת המעבר שלך לא הייתה נכונה: בלולאת ה - while שלך קידמת רק את row ולא את col, מה שאומר שבעצם לא טיילת על האלכסון אלא על הטור הימני.
הדבר הנכון לעשות במעבר על אלכסון הוא להשתמש במשתנה אחד בלבד:

row[col][col]


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

פרסאוס

New member
אם היית מוותר על הדחוף

ומתחיל את השרשור בארבע השורות בהודעה הנוכחית, זה היה שיפור ניכר.
בוא ונניח שאתה לא היחיד שמתקשה בשעורי הבית ומכאן שזה לא דחוף,
לפחות עד כמה שזה קשור בבאי הפורום האחרים.
 

פונציק

New member
הנה!

package help;

public class help2 {

public static void main(String [ ] args){

int f = 0;
int n = 5;
int mat[][] = new int[n][n];

for (int i = 0; i< (n); i++){
for (int j = 0; j< (n); j++)
mat[j] = (int)(Math.random()* 3) ;

}

for (int k = 4; k > -1; k--){

if (k == 4 && mat[4][4] == 1 && mat[4][3] == 0)
f++;
else if (k<4 && k>0){
if( mat[k][k] == 0&& mat[k][k+1] == 0)
f++;
else if (k == 0 && mat[0][0] == 1 && mat[0][1] == 0)
f++;
}



}


System.out.println(f);

for (int i = 0; i< (n); i++){
for (int j = 0; j< (n); j++)
System.out.print(mat[j]) ;
System.out.println("");

}



}




}
 

פונציק

New member
תודה רבה לך.

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

tomer1801

New member
תגובה לקוד

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

פונציק

New member
אם זה לא תואם לשאלה, אז לא הבנתי אותה.

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

לגבי השאלה, לצערי אין לי שמץ.
 

BravoMan

Active member
וכמובן שאין שום סיכוי שיש באג בקוד שלך,

נכון?
הרי בדקת אותו על כל מקרה קצה?

למשל בתנאי:

if( mat[k][k] == 0&& mat[k][k+1] == 0)

אתה לא חושב שצריך להיות:

mat[k][k] == 1

כי k, k הוא אינדקס האלכסון, והאלכסון אמור להיות 1?

זה מה שקורה שיוצרים מקרי קצה שלא לצורך, כגון:

if (k == 4 && mat[4][4] == 1 && mat[4][3] == 0)

ה-if הזה מיותר ומבלבל...
 

BravoMan

Active member
כלל וכלל לא! אבל בטחון מופרז הוא דבר מאוד

מזיק למתכנתים!

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

http://onlinefungags.com/2012/10/difference-between-novice-and-experienced-programmer/

ואכן במקרה של הקוד שלך נראה שיש כמה, וחשבתי שכדאי לציין אותם היות וכולנו כאן כדי ללמוד (וללמוד מטעויות זו דרך טובה! http://www.youtube.com/watch?v=TNXr5Alytg4)
 

פונציק

New member
איזה בטחון מופרז?

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

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

אין לי בעיה עם פידבק. כשאני פותר כאן בעיות, הן לרוב מעל לרמת הידע שלי, ואני פותר אותן על מנת ללמוד, ואני שמח לקבל פידבק. נזיפות לעומת זאת, זה דבר שונה לחלוטין.
 

BravoMan

Active member
"לא עושה מה מה שהוא רוצה", פרושו, מבחינתי

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

בכל מקרה, בהצלחה!
 

פונציק

New member
אני אקרא מחר, אבל בקשר להתחלה

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

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

ד"א יש באג שאני בטוח בו וגם תיקנתי אח"כ, וזה ששכחתי להוסיף בגרסה הסופית שורה ששוברת את הלולאה, ברגע ששורה אחת לא מתאימה.
 
למעלה