Introduction to Programming in Java תרגול 5 1
היום בתרגול void מה הן פונקציות הגדרת פונקציה, קריאה לפונקציה העברת ארגומנטים, החזרת ערך או דוגמאות 2
מוטיבציה לעיתים,אנו נזקקים לבצע פעולה מסוימת או לעשות חישוב מסוים מס' רב של פעמים. במקום לשוב ולכתוב את הקוד מס' רב של פעמים, ניתן לכתוב פונקציה שעושה את הפעולה הרצויה ולקרוא לפונקציה זו בכל פעם שרוצים להשתמש בה. 3
מבנה של פונקציה public static <return type> <func name> (<arg1_type> <arg1>, <arg2_type> <arg2>, ) <function body> חתימה של פונקציה מורכבת משם הפונקציה ומרשימת טיפוסי הארגומנטים שהפונקציה מקבלת )מספר,סוגי טיפוסים וסדר(. הערך המוחזר וכן מאפיינים נוספים של פונקציה public ) static אינם נכללים בחתימה של הפונקציה. לכל שתי פונקציות בתכנית חתימה שונה (כגון ו- public static int foo(int num) public static int foo(int num1, double num2) public static int foo(double num) public static double foo(int num) X 4
ערך החזרה של פונקציה יש פונקציות שלא צריכות להחזיר ערך, אלא רק לבצע משהו )למשל פונקציה שמדפיסה מערך(. במצב כזה נכתוב מילה.<return value type> בתור void פונקציה שמחזירה ערך חייבת להכיל את הפקודה <value> return (פעם אחת או יותר(. 5
דוגמא להגדרה ושימוש בפונקציות: 6
public class Sum public static void main(string[] args) int lastind = 10; int sum = sumnums(lastind ); System.out.println( The sum of numbers from 1 to + lastind + = + sum); System.out.println( The sum of numbers from 1 to + 8 + = + sumnums(8)); // returns the sum of numbers from 1 to end public static int sumnums(int end) int sum = 0; for(int i = 1; i <= end; i = i+1) sum = sum + i; return sum; main lastind int 10 sum int 55 sumnums(10) end int 10 sum int 0 i int 1 155 7
תרגיל 1 תרגיל: כתבו פונקציה המקבלת מערך של מספרים שלמים ומדפיסה אותם למסך עם רווחים בין המספרים. 8
- פתרון תרגיל 1 public static void printarray(int[] arr) for(int i=0; i < arr.length; i=i+1) System.out.print(arr[i]+ ); System.out.println(); 9
, של תרגיל 2 חישוב המקדם הבינומי המציין את מספר תתי הקבוצות בגודל k קבוצה בגודל n. עליכם לכתוב את הפונקציה :nchoosek public class BinCoeff public static void main(string[] args) int n = 5, k = 3; System.out.print("The number of different subsets of size " + k + " in a set of size " + n + " is: "); System.out.println(nChooseK(n,k)) ; /* output : The number of different subsets of size 3 in a set of size 5 is: 10 */ 10
תרגיל - פתרון 2 // Assumes that n>=0 public static int factorial(int n) int result = 1; for(int i=2; i <= n; i = i+1) result = result * i; return result; public static int nchoosek(int n, int k) int ans = 0; if (n>=k && k>=0) ans = factorial(n) / (factorial(k) * factorial(n-k)); return ans; 11
תרגיל 3 s כתבו פונקציה המקבלת מחרוזת הפונקציה מחזירה מחרוזת שבה החל מהאינדקס i.,sub ומחרוזת i, מספר שלם s, "מושתלת" המחרוזת sub בתוך public static String insertsubstring(string s, int i, String sub) 12
- תרגיל 3 פתרון public static String insertsubstring(string s, int i, String sub) if (s == null sub == null i < 0 i >= s.length()) return null; String ans = s.substring(0,i) + sub + s.substring(i); return ans; 13
תרגיל 4 מערך דו-ממדי נקרא מטריצה אם אינו ריק ואם כל שורותיו שוות באורכן ואורך זה גדול מאפס. השלימו את הגדרת השיטה הסטטית (m,checkmatrix(int[][] אשר בודקת אם מערך דו-מימדי, m, הינו מטריצה ומחזירה ערך בוליאני בהתאם. הערה: אם קוראים לשיטה עם פרמטר שערכו.false על השיטה להחזיר את הערך,null בכל ריבוע ריק יש להשלים הוראה יחידה (כלומר לא יופיע בו ";"). && 14
public static void main (String[] args) לשם הבהרה, השיטה :main int[] line1 = 1,2,3,4; int[] line2 = 5,6,7,8; int[] line3 = 9; int[] line4 = new int[0]; int[][] m1 = line1,line2; int[][] m2 = line1,line2,line3; int[][] m3 = null; int[][] m4 = null,null; int[][] m5 = line4,line4; int[][] m6 = line2,null; int[][] m7 = new int[0][0]; System.out.println(checkMatrix(m1)); System.out.println(checkMatrix(m2)); System.out.println(checkMatrix(m3)); System.out.println(checkMatrix(m4)); System.out.println(checkMatrix(m5)); System.out.println(checkMatrix(m6)); System.out.println(checkMatrix(m7)); תדפיס: true false false false false false false 15
תרגיל - פתרון 4 (m!=null && m.length>0 && m[0]!=null && m[0].length>0); tmp && i<m.length && (m[i]!=null && m[0].length==m[i].length) 16
תרגיל 5 מערך דו-מימדי יקרא "ממויין שורות" אם כל השורות בו ממויינות בסדר עולה. מערך דו-מימדי ייקרא "ממויין עמודות" אם כל העמודות בו ממויינות בסדר עולה. מערך ייקרא "ממויין" אם המערך "ממויין שורות" וגם "ממויין עמודות". כתבו פונקציה המקבלת מערך דו-מימדי ומחזירה האם המערך לדוגמא: המערך הבא "ממויין": "ממויין". public static boolean issorted (int [][] arr) -1 0 3 4 4 6 10 14 6 10 21 52 7 14 25 60 17
- תרגיל 5 פתרון public static boolean issorted(int[][] arr) return iscolumnsorted(arr) && isrowsorted(arr); public static boolean isrowsorted(int[][] arr) for (int i = 0; i < arr.length; i++) for (int j = 1 ; j < arr[i].length; j++) if (arr[i][j - 1] > arr[i][j]) return false; return true; public static boolean iscolumnsorted(int[][] arr) for (int i = 1; i < arr.length; i++) for (int j = 0 ; j < arr[i].length; j++) if (arr[i-1][j] > arr[i][j]) return false; return true; 18
תרגיל 6 0 0 3 0 2 0 2 1 0 0 2 3 1 4 8 11 0-2 9 7 נגדיר "פרח" במערך דו מימדי כך: - האיברים מתוך תת מערך בגודל 3X3 - האיבר המרכזי במערך הוא "לב הפרח". - ארבעת האיברים הצמודים לו בפינותיו הם "עלי הפרח". - הערך של "לב הפרח" שווה לסכום ערכי "עלי הפרח". א. כתוב תוכנית הקולטת למערך בגודל 15X18 מספרים שלמים ב. מערך נקרא "פרחוני", אם יש בו לפחות 5 "פרחים". כתבו תוכנית שתחזיר אמת במידה ומערך הוא "פרחוני" ושקר אחרת public static void main( String [] args) int arr[][] = new int[15][18];//input array inputarr(arr); if (isflowery(arr)) System.out.println("The array is flowery"); else System.out.println("The array isn't flowery"); 19
פתרון חלק א' תרגיל 6 public static void inputarr(int[][] arr) int i,j;//loop counters System.out.println("Please enter 15 rows and 18 columns"); for(i=0;i<arr.length;i++) for(j=0;j<arr[i].length;j++) arr[i][j] = sc.nextint(); 20
פתרון חלק ב' תרגיל 6 private static boolean isflowery(int[][] arr) int count=0;//number of flowers for(int i=0;i<arr.length;i++) for(int j=0;j<arr[i].length;j++) if (isflower(arr,i,j)) count++; return count >= 5; public static boolean isflower(int[][] arr, int i, int j) int sum;//sum of flower's elements if(i==0 i == arr.length-1 j==0 j == arr[0].length-1) return false; sum=arr[i-1][j-1]+arr[i-1][j+1]+arr[i+1][j-1]+arr[i+1][j+1]; if(arr[i][j]==sum) return true; else return false; 21
תרגיל 7 תרגיל: כתבו פונקציה המקבלת מערך של שמות סטודנטים בקורס ומערך של ציונים ומחזירה מערך המכיל את כל שמות הסטודנטים בעלי ציון גדול מהממוצע ממויינים לפי הציונים. לדוגמא: public static void main (String[] args) String [] students = "A", "B", "C", "D", "E", "F", "G" ; int [] grades = 100, 80, 90, 100, 40, 90, 70 ; String[] excellent = getexcellentstudents(students, grades); for (int i = 0; i < excellent.length; i++) System.out.print(excellent[i] + " "); C F D A יודפס )הממוצע הוא 81.42(: 22
- פתרון תרגיל 7 public static String[] getexcellentstudents(string[]students, int[]grades) double avg = calcaverage(grades); int excellentcount = aboveaverage(grades, avg); String [] excellentstudent = new String[excellentCount]; int [] excellentgrades = new int [excellentcount]; for (int i = 0, j = 0; i < grades.length; i++) if (grades[i] >= avg) excellentgrades[j] = grades[i]; excellentstudent[j] = students[i]; j++; selectionsort(excellentgrades, excellentstudent); return excellentstudent; 23
- פתרון תרגיל 7 public static int aboveaverage(int[] grades, double avg) int count = 0; for (int i = 0; i < grades.length; i++) if (grades[i] > avg) count++; return count; public static double calcaverage(int[] grades) double avg = 0; for (int i = 0; i < grades.length; i++) avg += grades[i]; return avg / grades.length; 24
- פתרון תרגיל 7 public static void selectionsort (int [] arr, String[] strs) for(int i=0; i<arr.length; i++) int min_pos=i; for(int j=i+1; j<arr.length; j++) if ( arr[j] < arr[min_pos] ) min_pos=j; String tmp = strs[i]; // help variable strs[i] = strs[min_pos]; strs[min_pos] = tmp; int temp = arr[i]; // help variable arr[i]=arr[min_pos]; arr[min_pos]=temp; 25
תרגיל 8 כתבו פונקציה המקבלת מערך של מחרוזות המייצגות קבצים,files מחרוזת,extension ומחרוזת נוספת,newExtension על הפונקציה לשנות את כל הסיומות של הקבצים המסתיימות ב- extension ל- newextension ולהחזיר מערך של הקבצים לאחר השינוי. a.txt b.rar c.rar d.txt e.rar a.txt b.zip c.zip d.txt e.zip לדוגמא: עבור הקבצים: המחרוזת: rar והמחרוזת להחלפה: zip נקבל מערך: הערה: הניחו כי בשם הקובץ מופיע נקודה אחת בלבד. 26
תרגיל - פתרון 8 public static String[] replaceextensions(string[] files, String extension, String newextension) String [] ans = new String[files.length]; for (int i = 0; i < files.length; i++) ans[i] = files[i].replaceall("."+extension, "."+newextension); return ans; 27