שפת java דחוף

ofek712

New member
שפת java דחוף

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

דוגמה:
קלט
12
15
18
57
100
פלט
מספרים:100,57
הפרש:43
מס' סידורי:4-5.


תודה לעוזרים. אשמח גם לדרך פיתרון לא חייב פיתרון:).
עד עכשיו למדנו רק עד לולאת for אז אני לא יכול להשתמש בחומר מתקדם יותר!
 

deepspace

New member
תנסה לשבת עם דף ועט

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

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

(פשוט לא ייצא לך כלום אם מישהו פשוט יכתוב לך את כל הפיתרון :) ).
 

BravoMan

Active member
מה כ"כ דחוף בזה, במיוחד אם זה תרגיל למחשבה

בלבד?

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


בכל מקרה, לא נהוג כאן לספק תשובות לשיעורי בית.

אם תציין ספציפית במה אתה מתקשה, אפשר יהיה לעזור לך.
למשל:
אתה יודע איך קולטים מספר?
אתה יודע איך משווים בין 2 מספרים?

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

בהצלחה!
 

בוקה3

New member
התרגיל הוא לא כזה קשה, רק דורש מחשבה

מדובר על לולאה אחד + תנאי IF בלבד.

אל תלך לכתוב קוד ישר, תכתוב על דף, תצייר, תבין את הלוגיקה, ותבין.

זה ההמלצה שלי
 

nocgod

New member
אתה לא צריך שום דבר יותר מתקדם מלולאת FOR

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

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

כתבתי עבורך קוד ב JAVA מתוך תיקווה שאתה לומד #C בבית הספר או C ותוכל להשתמש בקוד שלי בכתהליך לוגי לפיתרון ולא כהעתקה לפיתרון
(איזה עצוב זה שאני מעדיף #C ועובד בכל זאת בג'אווה כי אני לא זוכר #C בשיט)

public static void main(String[] args) throws NumberFormatException, IOException
{
int[] arr = new int[5];

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // reader

for (int i = 0; i < 5; i++)
{
arr = Integer.parseInt(br.readLine()); // read an int to the array in the i-th position
}

int diff = 0, firstNumberIndex = 0, secondNumberIndex = 0; // some variables to hold data

for (int i = 0; i < 4; i++)
{
if (Math.abs((double) (arr - arr[i + 1])) > diff) // if the current pair has a bigger difference, save the data
{
diff = (int) Math.abs((double) (arr - arr[i + 1]));
firstNumberIndex = i + 1; // notice that arrays a 0 based data sets where as
secondNumberIndex = i + 2; // human output should be in 1 based count.
}
}

System.out.println("The difference was: " + diff);
// notice to NOT get out of array boundaries
System.out.println("The numbers were: " + arr[firstNumberIndex - 1] + " and " + arr[secondNumberIndex - 1]);
System.out.println("The numbers were placed at: " + firstNumberIndex + " and " + secondNumberIndex);
}
 

BravoMan

Active member
ככה זה כשחיים על תקוות


הכותרת המקורית היית "Java דחוף" אז למעשה סיפקת לו פתרון מלא.

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

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

אבל מה זה משנה...
 
למעלה