, סמסטר א JAVA 202.1.9031 בקורס מבוא לתכנות 4 תרגיל רקורסיות

‫תרגיל ‪ 4‬בקורס מבוא לתכנות ‪ ,JAVA 202.1.9031‬סמסטר א‬
‫רקורסיות‬
‫תאריך אחרון להגשה בציון מלא‪ 10.01.17 :‬עד שעה‪ ,23:55 :‬כל יום איחור לא מאושר או חלק ממנו מוריד ‪ 10‬נקודות‬
‫מציון העבודה‪.‬‬
‫מתרגל אחראי‪ :‬הודי גולדמן‪ .‬שעות קבלה‪ :‬יום ד'‪ 16:00 – 18:00,‬בבניין ‪ 37‬חדר ‪ ,205‬אלא אם צוין אחרת באתר הקורס )יש‬
‫להתעדכן לפני שעת הקבלה על שינויים בשעות ובמיקום(‪ .‬שעות קבלה נוספות יפורסמו באתר הקורס‪.‬‬
‫בכל בעיה ניתן לשאול שאלות בפורום המטלה‪ ,‬או בשעות הקבלה של המתרגל האחראי בלבד‪.‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫שימו לב – קובץ זה מכיל ‪ 11‬עמודים‪.‬‬
‫אסור להשתמש בלולאות לאורך התרגיל‪ ,‬גם חזרה על התפריט צריך לממש ברקורסיה‪ .‬השימוש אפילו בלולאה‬
‫אחת יגרור ציון ‪ 0‬בעבודה‪.‬‬
‫אם לא נאמר אחרת כל הדפסה מתבצעת בשורה נפרדת‪.‬‬
‫שימו לב – העבודה בזוגות בלבד‪.‬‬
‫תיאור המטלה‪:‬‬
‫במטלה זו תתבקשו לממש מספר פונקציות רקורסיביות אשר פותרות בעיות חשובות בתחום מדעי המחשב‪.‬‬
‫באתר העבודה מצורף שלד )‪ (Template‬תכנית עם חתימות המתודות הנדרשות ויש להשתמש בהן כפי שהן הוגדרו ובהתאם‬
‫להוראות במסמך זה‪.‬‬
‫דגשים נוספים יובהרו בדף האחרון של מסמך זה‪.‬‬
‫בכל סעיף תממשו שיטה אחרת מקובץ ה"שלד" עד שבסוף נממש את השיטה ‪ main‬ונקבל תוכנית שלמה‪ ,‬לכן לפני תחילת‬
‫העבודה יש לפתוח את קובץ השלד מהאתר ב ‪ eclipse‬ולממש את כל הקוד בקובץ זה‪.‬‬
‫תחילה נתאר את התפריט הראשי ואת מבנה התוכנית ולאחר מכן נתאר בפרוט את חלקי העבודה‪.‬‬
‫התפריט‪:‬‬
‫• הערה‪ :‬יש להשתמש במערך ‪ array‬שמופיע בתחילת קובץ השלד‪.‬‬
‫שימו לב – מערך זה מכיל ערכים התחלתיים‪ ,‬אתם מוזמנים לשנות ערכים אלו כדי לבדוק בנוחות את המתודות שלכם‬
‫ללא צורך בקליטת מספרים למערך בכל פעם‪.‬‬
‫• יש להשתמש בשיטות שתממשו בסעיפים הבאים כדי להשלים את המשימה‪.‬‬
‫תחילה נייצר תפריט‪ ,‬יש לממש את השיטה‪:‬‬
‫)(‪public static void showMenu‬‬
‫זו השיטה העיקרית של התוכנית‪ ,‬תפקידה להציג למשתמש את התפריט ולהפעיל את שאר השיטות במערכת‪ ,‬שיטה זו תרוץ‬
‫באופן רקורסיבי עד שהמשתמש בוחר באפשרות לסיים‪ .‬תחילה השיטה תדפיס למסך את התפריט הבא )מבלי לרדת שורה‬
‫אחרי השורה האחרונה(‪:‬‬
‫‪0. Exit‬‬
‫‪1. Read Array of numbers‬‬
‫‪2. Check sub-set sum‬‬
‫‪3. Check if can split‬‬
‫‪4. Count Occurrences of X‬‬
‫‪5. Print the Array‬‬
‫> ‪Enter your choice‬‬
‫ולאחר מכן תקלוט מהמשתמש את בחירתו מאפשרויות התפריט‪ ,‬ותבצע את המשימה המתאימה‪.‬‬
‫אם המשתמש הכניס ערך לא חוקי תודפס למסך הודעת שגיאה מתאימה ושוב יוצג התפריט ונקלוט מהמשתמש ערך חדש‬
‫לדוגמא‪:‬‬
‫‪0. Exit‬‬
‫‪1. Read Array of numbers‬‬
‫‪2. Check sub-set sum‬‬
‫‪3. Check if can split‬‬
‫‪4. Count Occurrences of X‬‬
‫‪5. Print the Array‬‬
‫‪Enter your choice > -1‬‬
‫!‪Error: wrog input‬‬
‫‪0. Exit‬‬
‫‪1. Read Array of numbers‬‬
‫‪2. Check sub-set sum‬‬
‫‪3. Check if can split‬‬
‫‪4. Count Occurrences of X‬‬
‫‪5. Print the Array‬‬
‫> ‪Enter your choice‬‬
‫אפשרות ‪ :0‬יציאה‬
‫לאחר בחירה באפשרות זו תוצג הודעת פרידה והמתודה תסתיים‪ ,‬לדוגמא‪:‬‬
‫‪0. Exit‬‬
‫‪1. Read Array of numbers‬‬
‫‪2. Check sub-set sum‬‬
‫‪3. Check if can split‬‬
‫‪4. Count Occurrences of X‬‬
‫‪5. Print the Array‬‬
‫‪Enter your choice > 0‬‬
‫‪Good bye.‬‬
‫אפשרות ‪ :1‬קליטת ערכים למערך ‪array‬‬
‫לאחר בחירה באפשרות זו תודפס למשתמש ההודעה הבאה )מבלי לרדת שורה(‪:‬‬
‫?‪How much numbers to read‬‬
‫ואחר כך המתודה תקלוט מספר מהמשתמש )נקרא לו ‪ (S‬שמציין את מספר האיברים שברצונו להכניס‪ ,‬ולאחר מכן תקלוט ‪S‬‬
‫איברים מהמשתמש לתוך המערך ‪ array‬שמוגדר בקובץ השלד שקיבלתם כאשר ‪ array‬מערך בגודל ‪ ,S‬תבצע קליטה של‬
‫הנתונים בעזרת השיטה ‪ readToArray‬כפי שמוגדר בסעיף ‪ ,1‬לדוגמא‪:‬‬
‫‪How much numbers to read? 2‬‬
‫‪Enter number to index 0 > 1‬‬
‫‪Enter number to index 1 > 2‬‬
‫התוצא תהיה שמערך ‪ array‬יכיל את האיברים‪{2 ,1} :‬‬
‫לאחר מכן יוצג שוב התפריט והמתודה תחכה לבחירה הבאה‪.‬‬
‫אם המשתמש הכניס גודל ‪ S‬קטן מ ‪ 1‬תוצג הודעת שגיאה הבאה ושוב יוצג התפריט הראשי לניסיון חוזר‪:‬‬
‫‪Error: must be positive number of elements‬‬
‫אפשרות ‪sub-set-sum :2‬‬
‫לאחר בחירה באפשרות זו המתודה תדפיס למסך את ההודעה )מבלי לרדת שורה(‪:‬‬
‫> ‪Enter target sum‬‬
‫הקבוצות של ‪ array‬שסכומם‬
‫ואחר כך המתודה תקלוט מספר מטרה מהמשתמש‪ ,‬ולאחר מכן תדפיס למסך את מספר תתי‬
‫שווה למספר המטרה‪ ,‬החישוב יבוצע בעזרת השיטה ‪ subSetSum‬כפי שמוגדר בסעיף ‪ ,3‬בתוצאה תודפס באופן הבא‪:‬‬
‫כאשר במקום >‪ <target‬יופיע מספר המטרה שהוכנס ובמקום‬
‫שווה למספר המטרה‪.‬‬
‫>‪There is <count> subsets of sum <target‬‬
‫>‪ <count‬יופיע מספר תתי הקבוצות של ‪ array‬שסכומן‬
‫לדוגמא כאשר המערך ‪ array‬הוא }‪:{2 ,1‬‬
‫‪Enter target sum > -1‬‬
‫‪There is 0 subsets of sum -1‬‬
‫ודוגמא נוספת לאותו המערך‪:‬‬
‫‪Enter target sum > 3‬‬
‫‪There is 1 subsets of sum 3‬‬
‫לאחר מכן יוצג שוב התפריט והמתודה תחכה לבחירה הבאה‪.‬‬
‫אפשרות ‪ :3‬חלוקה לשתי קבוצות שוות סכום‬
‫לאחר בחירה באפשרות זו המתודה תפתור את בעיית החלוקה כפי שמוסבר בסעיף ‪ 4‬בעזרת השיטה ‪ twoGrups‬עבור המערך‬
‫‪ array‬כלומר תבדוק האם איברי המערך ‪ array‬ניתנים לחלוקה לשתי קבוצות בעלות סכום זהה‪ ,‬במידה וכן‪ ,‬המתודה‬
‫תדפיס למסך את ההודעה‪:‬‬
‫‪The array can be splitted‬‬
‫אחרת תדפיס את ההודעה‪:‬‬
‫‪The array cannot be splitted‬‬
‫לדוגמה כאשר המערך ‪ array‬הוא }‪ {2 ,3 ,1‬יודפס‪:‬‬
‫‪The array can be splitted‬‬
‫וכאשר המערך ‪ array‬הוא }‪ {4 ,2‬יודפס‪:‬‬
‫‪The array cannot be splitted‬‬
‫לאחר מכן יוצג שוב התפריט והמתודה תחכה לבחירה הבאה‪.‬‬
‫אפשרות ‪ :4‬ספירת מספר מופעים‬
‫אפשרות זו משתמשת בשיטה ‪ countOccurrences‬כפי שמוסבר בסעיף ‪.5‬‬
‫לאחר בחירה באפשרות זו המתודה תדפיס למסך את ההודעה )מבלי לרדת שורה(‪:‬‬
‫> ‪Enter number to cont‬‬
‫ואחר כך המתודה תקלוט מספר מהמשתמש‪ ,‬ותדפיס למסך את ההודעה הבאה שאומרת כמה פעמים מופיע המספר שנקלט‬
‫במערך ‪:array‬‬
‫>‪number of occurrences: <occurrences‬‬
‫כאשר במקום >‪ <occurrences‬יוצג מספר המופעים של המספר שנקלט‪,‬‬
‫לדוגמה אם המערך ‪ array‬הוא }‪:{1 ,2 ,1‬‬
‫‪Enter number to cont > 1‬‬
‫‪number of occurrences: 2‬‬
‫דוגמה נוספת עם אותו מערך ‪:array‬‬
‫‪Enter number to cont > 3‬‬
‫‪number of occurrences: 0‬‬
‫לאחר מכן יוצג שוב התפריט והמתודה תחכה לבחירה הבאה‪.‬‬
‫אפשרות ‪ :5‬הדפסת המערך‬
‫לאחר בחירה באפשרות זו המתודה תדפיס למסך את איברי המערך ‪ array‬לפי הסדר שלהם‪ ,‬כל איבר בשורה נפרדת‪.‬‬
‫לאחר מכן יוצג שוב התפריט והמתודה תחכה לבחירה הבאה‪.‬‬
‫המתודה תשתמש בשיטה ‪ printArray‬כפי שמוסבר בסעיף ‪.1‬‬
‫‪array‬‬
‫התוכנית המלאה‪:‬‬
‫יש להשלים את פונקציית ה ‪ main‬כך שתתקבל תוכנית שמדפיסה למסך את ההודעה‪:‬‬
‫‪Assignment 4 - Recursion‬‬
‫ותממש את התפריט כמתוער לעיל בעזרת השיטה ‪.showMenu‬‬
‫כאשר המשתמש בוחר באפשרות ‪ 0‬תוצג הודעת הפרידה ולאחר מכן התוכנית תסתיים‪.‬‬
‫סעיף ‪:1‬‬
‫מימוש השיטה‪:‬‬
‫)‪public static void printArray(int[] arr, int length‬‬
‫שיטה זו מקבלת כפרמטר מערך של מספרים שלמים ‪ arr‬ואורך ‪. length‬‬
‫השיטה תדפיס למסך את כל האיברים בתת המערך של ‪ arr‬המתחיל באינדקס ‪ 0‬ובאורך ‪ ,length‬כל איבר יודפס בשורה‬
‫חדשה‪.‬‬
‫אין צורך לבדוק תקינות הפרמטרים‪ ,‬אפשר להניח שהמערך תקין וש ‪ length‬לא שלילי ולא יותר מאורך המערך‪.‬‬
‫סעיף ‪:2‬‬
‫מימוש השיטה‪:‬‬
‫)‪public static void readToArray(int[] arr, int fromIndex‬‬
‫שיטה זו מקבלת כפרמטר מערך של מספרים שלמים ‪ arr‬ואינדקס ‪. fromIndex‬‬
‫השיטה תבקש מהמשתמש להכניס מספרים שלמים ותשמור אותם לפי הסדר במערך ‪ arr‬החל מהאינדקס ‪ fromIndex‬באופן‬
‫הבא‪:‬‬
‫עבור כל תא החל מ ‪ fromIndex‬במערך השיטה תדפיס למסך את המשפט )בלי לרדת שורה(‪:‬‬
‫> >‪Enter number to index <index‬‬
‫אך במקום >‪ <index‬יופיע האינדקס במערך אליו יכנס הערך‪.‬‬
‫לדוגמה עבור אינדקס ‪ 0‬במערך יודפס‪:‬‬
‫> ‪Enter number to index 0‬‬
‫‪ fromIndex‬במערך ‪.arr‬‬
‫ולאחר מכ ן תחכה לקליטת מספר שלם מהמשתמש ותשמור אותו באינדקס‬
‫השיטה תסתיים כשכל התאים של ‪ arr‬החל מאינדקס ‪ fromIndex‬מולאו בערכים מהמשתמש‪.‬‬
‫אם הפרמטר ‪ fromIndex‬חורג מגודל המערך השיטה תסתיים מבלי לשנות את המערך‪.‬‬
‫אין צורך לבדוק תקינות הפרמטרים‪ ,‬אפשר להניח שהמערך תקין וש ‪ fromIndex‬לא שלילי‪.‬‬
‫סעיף ‪:3‬‬
‫בסעיף זה נפתור וריאציה של בעיית ה ‪ ,sub-set-sum‬בעיה זו הינה בעיה חשובה בתחום מדעי המחשב ושייכת לקבוצת בעיות‬
‫שנחשבות "קשות" ונקראות ‪­NP‬שלמות‪sub-set-sum wiki .‬‬
‫בבעיה זו יש לנו קבוצת מספרים )מערך( ומספר נוסף‪ ,‬עלינו לספור את מספר תתי הקבוצה של המספרים הללו )ללא‬
‫כפילויות( שסכום האיברים בהן שווה בדיוק למספר הנוסף‪ ,‬כלומר כמה תתי מערכים של המערך המקורי המכילים אפס או‬
‫יותר איברים מהמערך המקורי )לא בהכרח באותו הסדר או ברצף(‪ ,‬סכום איבריהם הוא המספר הנוסף‪.‬‬
‫נפתור את הבעיה באופן רקורסיבי ע"י מימוש השיטה‪:‬‬
‫)‪public static int subSetSum(int[] arr, int fromIndex, int target‬‬
‫שיטה זו מקבלת כפרמטר מערך של מספרים שלמים ‪ arr‬אינדקס ‪ fromIndex‬וערך יעד ‪.target‬‬
‫השיטה תחזיר את מספר תתי המערכים בעלי הסכום ‪ target‬של המערך ‪ arr‬המתחיל מאינדקס ‪.fromIndex‬‬
‫כל תת מערך מורכב רק מהאיברים ב ‪ arr‬החל מאינדקס ‪ fromIndex‬כך שכל איבר ב ‪ arr‬מופיע לכל היותר פעם אחת‪.‬‬
‫אין צורך לבדוק תקינות הפרמטרים‪ ,‬אפשר להניח שהמערך תקין וש ‪ fromIndex‬לא שלילי‪.‬‬
‫דוגמאות קלט פלט‪:‬‬
‫‪0‬‬
‫‪1‬‬
‫‪3‬‬
‫‪1‬‬
‫;}‪3‬‬
‫‪// return:‬‬
‫‪// return:‬‬
‫‪// return:‬‬
‫‪// return:‬‬
‫‪int[] arr = {-1, 1, 2,‬‬
‫;)‪subSetSum(arr, 1, -1‬‬
‫;)‪subSetSum(arr, 0, -1‬‬
‫;)‪subSetSum(arr, 0, 3‬‬
‫;)‪subSetSum(arr, 2, 3‬‬
‫סעיף ‪:4‬‬
‫בסעיף זה נפתור את בעיית החלוקה‪ ,‬גם בעיה זו נקראת ‪-NP‬שלמה‪wiki .‬‬
‫בבעיה זו יש לנו קבוצת מספרים )מערך(‪ ,‬עלינו להחליט האם אפשר לחלק את הקבוצה לשתי קבוצות בעלות סכום זהה‪.‬‬
‫נפתור וריאציה של הבעיה באופן רקורסיבי ע"י מימוש השיטה‪:‬‬
‫)‪public static boolean twoGrups(int[] arr, int length, int balance‬‬
‫שיטה זו מקבלת כפרמטר מערך של מספרים שלמים ‪ ,arr‬גודל ‪ length‬ומספר שלם ‪.balance‬‬
‫השיטה תחזיר ‪ true‬אם קימת לתת המערך של ‪ arr‬בגודל ‪ length‬החל מאינדקס ‪ 0‬חלוקה לשתי תתי קבוצות שההפרש בין‬
‫סכום איברי הקבוצות בוא בדיוק ‪ balance‬ותחזיר ‪ false‬בכל מקרה אחר‪.‬‬
‫לדוגמא‪:‬‬
‫;}‪int[] arr = {1, 2, 5‬‬
‫‪twoGrups(arr, 3, 0); // false‬‬
‫‪twoGrups(arr, 3, 2); // true - {5} and {1, 2}: 5-3 = 2‬‬
‫‪twoGrups(arr, 3, -8); // true - {} and {1, 2, 5}: 0-8 = -8‬‬
‫אין צורך לבדוק תקינות הפרמטרים‪ ,‬אפשר להניח שהמערך תקין וש ‪ length‬לא שלילי ולא יותר מאורך המערך‪.‬‬
‫סעיף ‪:5‬‬
‫בסעיף זה יש לממש את השיטה‪:‬‬
‫)‪public static int countOccurrences(int[] arr, int length, int number‬‬
‫שיטה זו מקבלת כפרמטר מערך של מספרים שלמים ‪ ,arr‬גודל ‪ length‬ומספר שלם ‪.number‬‬
‫השיטה תספור ותחזיר כמה פעמים מופיע המספר ‪ number‬בתת המערך של ‪ arr‬המתחיל מאינדקס ‪ 0‬באורך ‪.length‬‬
‫לדוגמא‪:‬‬
‫;}‪2‬‬
‫‪4, 2); // return 2‬‬
‫‪2, 2); // return 1‬‬
‫‪1, 2); // return 0‬‬
‫‪int[] arr = {1, 2, 3,‬‬
‫‪countOccurrences(arr,‬‬
‫‪countOccurrences(arr,‬‬
‫‪countOccurrences(arr,‬‬
‫אין צורך לבדוק תקינות הפרמטרים‪ ,‬אפשר להניח שהמערך תקין וש ‪ length‬לא שלילי ולא יותר מאורך המערך‪.‬‬
‫דוגמאות‪:‬‬
‫להלן דוגמאות הרצה של התוכנית כולה‪ ,‬התוכנית שלכם צריכה לעבוד בדיוק כמו הדוגמאות‪:‬‬
‫‪.1‬‬
‫‪5‬‬
‫‪-1‬‬
‫‪-2‬‬
‫‪2‬‬
‫‪5‬‬
‫‪2‬‬
‫‪Assignment 4 - Recursion‬‬
‫‪0. Exit‬‬
‫‪1. Read Array of numbers‬‬
‫‪2. Check sub-set sum‬‬
‫‪3. Check if can split‬‬
‫‪4. Count Occurrences of X‬‬
‫‪5. Print the Array‬‬
‫‪Enter your choice > 1‬‬
‫?‪How much numbers to read‬‬
‫> ‪Enter number to index 0‬‬
‫> ‪Enter number to index 1‬‬
‫> ‪Enter number to index 2‬‬
‫> ‪Enter number to index 3‬‬
‫> ‪Enter number to index 4‬‬
‫‪0. Exit‬‬
‫‪1. Read Array of numbers‬‬
‫‪2. Check sub-set sum‬‬
‫‪3. Check if can split‬‬
‫‪4. Count Occurrences of X‬‬
5. Print the Array
Enter your choice > 5
-1
-2
2
5
2
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 2
Enter target sum > 2
There is 4 subsets of sum 2
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 3
The array can be splitted
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 4
Enter number to cont > 2
number of occurrences: 2
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > -1
Error: wrog input!
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 1
How much numbers to read? 0
Error: must be positive number of elements
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 6
Error: wrog input!
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 5
-1
-2
2
5
2
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 0
Good bye.
.2
Assignment 4 - Recursion
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 1
How much numbers to read?
Enter number to index 0 >
Enter number to index 1 >
Enter number to index 2 >
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 2
Enter target sum > 3
There is 0 subsets of sum
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 2
Enter target sum > 2
There is 1 subsets of sum
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
3
-2
6
4
3
2
4. Count Occurrences of X
5. Print the Array
Enter your choice > 3
The array can be splitted
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 4
Enter number to cont > 4
number of occurrences: 1
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 4
Enter number to cont > 2
number of occurrences: 0
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 5
-2
6
4
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 1
How much numbers to read? -3
Error: must be positive number of elements
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 1
How much numbers to read? 3
Enter number to index 0 > 1
Enter number to index 1 > 2
Enter number to index 2 > 1
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 5
1
2
1
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 0
Good bye.
.3
Assignment 4 - Recursion
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 1
How much numbers to read? 7
Enter number to index 0 > -3
Enter number to index 1 > -2
Enter number to index 2 > -1
Enter number to index 3 > 0
Enter number to index 4 > 1
Enter number to index 5 > 2
Enter number to index 6 > 3
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 3
The array can be splitted
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 2
Enter target sum > 1
There is 16 subsets of sum 1
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 2
Enter target sum > -3
There is 12 subsets of sum -3
0. Exit
1. Read Array of numbers
2. Check sub-set sum
3. Check if can split
4. Count Occurrences of X
5. Print the Array
Enter your choice > 0
Good bye.
:‫להלן דגשי כתיבה נדרשת עם קובץ השלד‬
.‫ כל הקוד שלכם צריך להיכתב בתוך קובץ השלד שקיבלתם‬.1
‫ שהוגדר בשלד בראש המחלקה לקליטת מספר מהמשתמש ולא להגדיר‬sc ‫ יש להשתמש לאורך כל התוכנית במשתנה‬.2
.‫עוד כמוהו או לשנות את שמו‬
.4 ‫ ויש להשתמש רק בו לסעיף‬,‫ בראש המחלקה‬array ‫ אין לשנות את הגדרת המערך‬.3
.(‫ אין לשנות אף חתימת פונקציה )טיפוס ערך החזרה ורשימת טיפוסי הפרמטרים‬.4
.(‫ ניתן )אך לא חובה( להוסיף שיטות למחלקה )רקורסיביות או לא רקורסיביות‬.5
.(for ‫ ו‬while ‫ לאורך כל התוכנית אין להשתמש בכל צורת לולאה שהיא )כמו‬,‫ להזכירכם‬.6
:‫ ותפקידם‬ASM ‫פירוט שיטות המחלקה‬
‫ בשיטה‬eclipse ‫• טבלה זו היא נוצרה באופן אוטומטי מההערות וחתימות השיטות בקובץ השלד שקיבלתם ע"י תוכנת‬
String JavaDocs :‫ שלמדנו‬String ‫ כן גם נוצר התיאור של המחלקה‬,JavaDocs ‫שנקראת‬
wiki :‫להעשרה עצמית‬
Method Summary
Modifier and Type
Method and Description
static int
countOccurrences(int[] arr, int length, int number)
This method count the number of occurrences of the given 'number' in
the first 'length' elements of the array 'arr'.
static void
main(java.lang.String[] args)
the main program method.
static void
printArray(int[] arr, int length)
This method print the 'length' first elements of the array 'arr'.
static void
readToArray(int[] arr, int fromIndex)
This method reads numbers from the user and save them in the array
starting from specific index.
static void
showMenu()
This method will show the program menu, read the user choice and
execute the the corresponding code and methods to complete the
task.
static
subSetSum(int[] arr, int fromIndex, int target)
This method count the number of sub-set's of sum 'target' in 'arr'
starting from index 'fromIndex'.
int
static boolean
twoGrups(int[] arr, int length, int balance)
this method check if the first 'length' elements of 'arr' can be
partitioned into two subsets that the difference between their sum is
exactly 'balance'
‫קראו היטב את ההערות בדף הבא‬
‫הערות‪:‬‬
‫לתרגיל זה מצורף קובץ המכיל את תבנית הפונקציות שיש למלא‪ .‬עבודה נכונה ויעילה תהיה למלא את הפונקציות בהתאם‬
‫לדרישות כל סעיף ובסיום כל אחת לבדוק את תקינותה‪ ,‬ורק אחר כך להמשיך לסעיף הבאה‪.‬‬
‫‪ .1‬העבודות יוגשו בזוגות בלבד‪.‬‬
‫‪ .2‬כל יום איחור או חלק ממנו יהיה במחיר ‪ 10‬נקודות‪ ,‬לדוגמא איחור ב ‪ 27‬שעות יקנה ציון מקסימאלי של ‪ 80‬לעבודה‪.‬‬
‫‪ .3‬יש להגיש קובץ ‪ zip‬בשם ‪ <id>.zip‬כאשר >‪ <id‬הוא מספר תעודת הזהות שלכם‪ .‬בתוך הקובץ הנ"ל יהיה קובץ‬
‫‪ java‬בודד )ללא תיקיות( בשם ‪ Assignment4.java‬בדיוק‪.‬‬
‫‪ .4‬ניתן להניח שבסוף הזנת הקלט המשתמש יקליד ‪ enter‬ולא כל כפתור אחר‪.‬‬
‫‪ .5‬ניתן להניח שהקלט תמיד יהיה מספר שלם‪ .‬כלומר עליכם להשתמש ב )(‪ nextInt‬בשביל קלט מספר מהמשתמש‪.‬‬
‫)תזכורת‪ (https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html:‬הוגדר לכם משתנה‬
‫‪ Scanner‬בראש ה‪ Class -‬לכל ההזנות בכל הסעיפים‪ .‬יש לעבוד רק איתו למניעת בעיות זיכרון‪.‬‬
‫‪ .6‬במטלה זו אין להשתמש בלולאות בצורתן השונות )‪ ,(while / do while / for‬או כל מבנה נתונים אחר וכל נושא‬
‫שטרם נלמד‪ .‬אין לשנות את חתימת השיטות שהוגדרו‪.‬‬
‫‪ .7‬העבודה צריכה להיות מוכלת בחבילת ברירת המחדל )‪ .(default package‬כלומר בתחילת הקובץ שלכם לא אמור‬
‫להופיע המשפט ;>‪package <name‬‬
‫‪ .8‬באחריות כל סטודנט להתעדכן בשינויים‪/‬עדכונים באתר הקורס‪.‬‬
‫‪ .9‬יש לשמור על הקוד במקום שנגיש אך ורק לכם‪ ,‬סיבות כגון מחשב שניזוק או דיסק און קי שנשרף לא יתקבלו‬
‫כסיבות מוצדקות להגשת עבודה באיחור‪.‬‬
‫‪ .10‬יש לתת שמות משמעותיים למשתנים‪ ,‬יש להעיר הערות ברורות ומבארות על העבודה כחלק מהקוד עצמו‪,‬‬
‫מרכיבים אלו הינם חלק מהניקוד על העבודה‪.‬‬
‫‪ .11‬על ההערות להיות כתובות באנגלית בלבד מתומצתות ובשיקול דעת‪.‬‬
‫‪ .12‬יש להקפיד שהעבודה תהיה קריאה‪ .‬אין לכתוב שורות קוד ארוכות מאוד ויש להקפיד על הזחה )אינדנטציה(‪ :‬על‬
‫קטעי הקוד הנמצאים בתוך לולאה או ‪ if‬להיות מוזזים ימינה ב ‪ .tab‬למידע נוסף על אינדנטציה ראה ערך‬
‫‪https://en.wikipedia.org/wiki/Indent_style‬‬
‫‪ .13‬אין להשתמש בחומר שאינו נלמד בכיתה עד מערכים ומחרוזות‪ .‬בפרט אין להשתמש בכל ספריה‪ ,‬פונקציה‪ ,‬או כל‬
‫קטע קוד אחר שלא הועבר בשיעור ‪ /‬תרגול‪.‬‬
‫‪ .14‬מומלץ לא לכתוב את כל הקוד ורק אז לקמפל ולדבג‪ ,‬אלא לכתוב חלק אחד ורק לאחר שחלק זה מקומפל ומדובג‬
‫היטב להמשיך הלאה‪.‬‬
‫‪ .15‬מומלץ לא לחכות לרגע האחרון ולהתחיל את העבודה בהקדם האפשרי‪.‬‬
‫‪ .16‬שאלות בנוגע לעבודה יש לפרסם בפורום העבודה הנמצא באתר הקורס‪ .‬לפני פרסום שאלה‪ ,‬יש לעבור על השאלות‬
‫שכבר נענו בפורום ולוודא שהשאלה לא נשאלה כבר וקיבלה מענה‪ .‬שאלות שיישלחו למיילים של צוות הקורס או‬
‫שאלות חוזרות לא יקבלו מענה‪ .‬כמו כן‪ ,‬אין לשאול שאלות בנוגע לעבודה במהלך התרגול או בהפסקות‪.‬‬
‫‪ .17‬נא לשמור על הגינות אקדמית‪.‬‬
‫!‪Have Fun‬‬