java ב תונכתל אובמ 5 לוגרת - bguipc161/wiki.files/ipc161-ps5.pdfjava -ב...
TRANSCRIPT
JAVA-מבוא לתכנות ב5תרגול
Ipc161- practical session 5
מה בתרגול
מערכים דו ממדיים•
Java (methods) -שיטות ב/פונקציות•
הגדרת פונקציה–
הפעלה/קריאה–
העברת ארגומנטים–
ערכי החזרה–
מערך דו ממדי
ניתן באותו אופן )מערך של מערכים חד ממדיים •
(לדבר על מערכים רב מימדיים
פנייה לאיברי המערך נעשית תוך שימוש בשני •אינדקסים
int[][] a = new int[3][4]; int[][] arr =
{{1,0},{1,2,3},{1,4,5,7}};
1 0
1 2 3
1 4 5 7
דוגמא
הדפסת איברי המערך•
int[][] a = {{1,0},{1,2,3},{1,4,5,7},{7,9,13,14}};
for (int i = 0; i < a.length; i++){
for (int j = 0; j < a[i].length; j++){
System.out.print("["+ a[i][j] +"]");
}
System.out.println();
}
(Deep copy)העתקת מערכים –תרגיל
bיועתק למערך aהשלימו את הקוד כך שמערך •
int[][] a = {{1,2,3,4},{2,5,1},{7,7,7,7},{1}};
int[][] b;
//Fill here the code
(Deep copy)העתקת מערכים –תרגיל
פתרון•
int[][] a = {{1,2,3,4},{2,5,1},{7,7,7,7},{1}};
int[][] b;
b = new int[a.length][];
for (int i = 0; i < a.length; i++){
b[i] = new int[a[i].length];
for (int j = 0; j < a[i].length; j++){
b[i][j] = a[i][j];
}
}
Magic squares–תרגיל
שבה סכום האיברים n*nריבוע קסם הוא מטריצה ריבועית בגודל •
כל איבר מופיע , בנוסף. עמודה ואלכסון ראשי הוא זהה, בכל שורה. n*n…1בדיוק פעם אחת והוא מהתחום
הוא ריבוע matהשלימו את הקוד הבא כך שהתוכנית תוודא האם •
( n*n…1הם מהתחום mat -הניחו כי האיברים ב)קסם או לא
int n = …;
int[][] mat = …;
boolean isMagic = true;
//Fill here the code
if (isMagic){
System.out.println("Magic square!");
}
else{
System.out.println("Not a magic square");
}
Magic squares–תרגיל
פתרון•//compute the diagonal sum
for(int i=0; i < mat.length; i++){
sumDiagonal += mat[i][i];
}
int sumRow, sumCol;
int[] occ = new int[n*n];
// check sum condition for each row and column and count occurences
for (int i = 0; i < mat.length && isMagic; i++){
sumRow = 0;
sumCol = 0;
for(int j = 0; j < mat[i].length; j++){
occ[mat[i][j]-1]++;
sumRow += mat[i][j];
sumCol += mat[j][i];
}
if (sumRow != sumDiagonal || sumCol != sumDiagonal){
isMagic = false;
}
} המשך בשקף הבא
Magic squares–תרגיל
// check that each i in [1,...,n] appears only once
for (int i = 0; i < n*n && isMagic; i++){
if (occ[i] != 1){
isMagic = false;
}
}
if (isMagic){
System.out.println("Magic square!");
}
else{
System.out.println("Not a magic square");
}
חלוקה לתתי משימות–מבוא לפונקציות
המספרים הראשוניים kחישוב הממוצע של : בעיה•
הגדולים ביותר במערך
:תתי משימות הנדרשות לפתרון•
בדיקת ראשוניות
מיון מערך
חישוב ממוצע
11
שימוש חוזר בקוד -מבוא לפונקציות
נניח שבמהלך התוכנית נדרשתם לחשב את •.[e,f], [c,d], [a,b]הסכום של המספרים בקטעים
ל הייתם רושמים את אותה "לצורך החישוב הנ•חתיכת קוד כמה פעמים
היום נלמד כיצד ניתן לקרוא לסדרה של פקודות •עם פרמטרים שונים כאשר קוד זה ייכתב פעם
אחת
for (int i = <start>; i < <end>; i++){sum += i;
}
? Java -מהי פונקציה ב
לא עושה . שיטה היא סדרה של פקודות שמאוגדות ביחד לביצוע פעולה/פונקציה•
כלום עד שלא מפעילים אותה
:דוגמא•
public class MethodExample {
public static double arrayAverage(int[] arr){
double ans = 0;for (int i = 0; i < arr.length; i++){
ans += arr[i];}
return ans / arr.length ;}
public static void main(String[] args){
int[] a = {1,2,3,4,5,6};System.out.println(arrayAverage(a));
}}
הגדרת השיטה
שימוש בשיטה
הפעלה -
הגדרת פונקציה
public static <return type> <name>(type1 arg1, type2 arg2…){<Statements>
}
•<return type> טיפוס הערך שיוחזר מהפונקציה
•<name> שם השיטה
עבור כל . י פסיק ביניהם"של השיטה מופרדים ע הפורמלייםרשימת הפרמטרים •
פרמטר מוגדר שמו והטיפוס שלו
•<statements> אוסף של פקודות שמהווים את גוף הפונקציה
רשימת טיפוסי הארגומנטיםומ שם הפונקציהשל פונקציה מורכבת מ חתימה•(.סוגי טיפוסים וסדר ,מספר)שהפונקציה מקבלת
יכולות להיות לנו כמה פונקציות עם )לכל שתי פונקציות בתכנית חתימה שונה •
(אותו שם אך עם חתימה שונהpublic static int foo(int num){…}public static int foo(int num1, double num2){…}public static int foo(double num){…}
החזרת ערך בפונקציה
פונקציה יכולה להחזיר ערך או לא להחזיר ערך•
voidהוא <return type>אם הפונקציה לא מחזירה ערך בהגדרה שלה נציין ש •
בגוף הפונקציה כדי returnאם פונקציה מחזירה ערך עליה להשתמש בפקודה •
להחזיר אותו
public static void printFive(){System.out.println("5");
}
public static int five(){return 5;
}
לחישוב ממוצע של מערך פונקציה–דוגמא
public static double arrayAverage(int[] arr){
double ans = 0;
for (int i = 0; i < arr.length; i++){ans += arr[i];
}
return ans / arr.length ;}
doubleערך ההחזרה הוא •
arrayAverageשם השיטה הוא •
מורכבת מפרמטר אחד מסוג מערך הפורמלייםרשימת הפרמטרים •intשל
קריאה לפונקציה
public class MethodExample {
public static int sumBetween(int a, int b){
int sum = 0;for (int i = a; i <= b; i++){
sum += i;}return sum;
}
public static void main(String[] args){
int x = 15;int y = 30;int sum = sumBetween(x, y);System.out.println("The sum of 15 + 16 + ... + 30 =" + sum);
}}
נדגים מה קורה כאשר קוראים פונקציה•
קריאה לפונקציה
public class MethodExample {
public static int sumBetween(int a, int b){
int sum = 0;for (int i = a; i <= b; i++){
sum += i;}return sum;
}
public static void main(String[] args){
int x = 15;int y = 30;int sum = sumBetween(x, y);System.out.println("The sum of 15 + 16 + ... + 30 =" + sum);
}}
main
15
30
x
y
קריאה לפונקציה
public class MethodExample {
public static int sumBetween(int a, int b){
int sum = 0;for (int i = a; i <= b; i++){
sum += i;}return sum;
}
public static void main(String[] args){
int x = 15;int y = 30;int sum = sumBetween(x, y);System.out.println("The sum of 15 + 16 + ... + 30 =" + sum);
}}
main
15
30
x
y
sumBetween
15
30
a
b
?sum
קריאה לפונקציה
public class MethodExample {
public static int sumBetween(int a, int b){
int sum = 0;for (int i = a; i <= b; i++){
sum += i;}return sum;
}
public static void main(String[] args){
int x = 15;int y = 30;int sum = sumBetween(x, y);System.out.println("The sum of 15 + 16 + ... + 30 =" + sum);
}}
main
15
30
x
y
sumBetween
15
30
a
b
0sum
?sum
קריאה לפונקציה
public class MethodExample {
public static int sumBetween(int a, int b){
int sum = 0;for (int i = a; i <= b; i++){
sum += i;}return sum;
}
public static void main(String[] args){
int x = 15;int y = 30;int sum = sumBetween(x, y);System.out.println("The sum of 15 + 16 + ... + 30 =" + sum);
}}
main
15
30
x
y
sumBetween
15
30
a
b
360sum
?sum
קריאה לפונקציה
public class MethodExample {
public static int sumBetween(int a, int b){
int sum = 0;for (int i = a; i <= b; i++){
sum += i;}return sum;
}
public static void main(String[] args){
int x = 15;int y = 30;int sum = sumBetween(x, y);System.out.println("The sum of 15 + 16 + ... + 30 =" + sum);
}}
main
15
30
x
y
360sum
sumBetween
15
30
a
b
360sum
קריאה לפונקציה
public class MethodExample {
public static int sumBetween(int a, int b){
int sum = 0;for (int i = a; i <= b; i++){
sum += i;}return sum;
}
public static void main(String[] args){
int x = 15;int y = 30;int sum = sumBetween(x, y);System.out.println("The sum of 15 + 16 + ... + 30 =" + sum);
}}
main
15
30
x
y
360sum
?מה קורה בזמן קריאה לפונקציה
השליטה של התכנית שומרת את המיקום הנוכחי שלה •
.ועוברת לפונקציה
חדשה שבה מוגדרים ( טבלת משתנים)נפתחת סביבה •
הפרמטרים של הפונקציה והמשתנים שמוגדרים בתוך .הפונקציה
( voidאו סיום הפונקציה במקרה של ) returnההוראה •
סוגרת את הסביבה ומחזירה את השליטה למקום בו היינו
.לפני הקריאה לפונקציה
ת מערךת–תרגיל
השלימו את הקוד כך שהפונקציה תחזיר תת •
end -ומסתיים ב start–המערך המתחיל ב
public static int[] subArray(int[] arr, int start, int end){//assume that arr.length > end > start > -1
}
פתרון
public static int[] subArray(int[] arr, int start, int end){//assume that arr.length > end > start > -1int[] subArray = new int[end-start + 1];int j = 0;for (int i = start; i <= end; i++){
subArray[j] = arr[i];j++;
}return subArray;
}
העברת פרמטרים לפונקציה
?מה יודפס: שאלה•
public class Example {
public static void increment(int i){i = i + 1;
}
public static void main(String[] args){
int x = 0;increment(x);increment(x);increment(x);System.out.println(x);
}}
העברת פרמטרים לפונקציה
כדי להבין את הדרך שבה משתנים עוברים לפונקציה עלינו להבין קצת יותר •
טוב את תמונת הזיכרון
כאשר המשתנה הוא פרימיטיבי הוא מחזיק את הערך עצמו•
ערכו הוא כתובת בזיכרון שבו ( משתנה הפנייה)כאשר משתנה אינו פרימיטיבי •:נמצא התוכן
int x = 17;int[] arr = new int[5]
17x
0 0 0 0 0#41 #41arr
העברת פרמטרים לפונקציה
כלומר הערך by valueהפרמטרים מועברים Java–ב •
שרשום בתוך המשתנה מועבר
?מה יודפס•public class ParamPassExample {
public static void ones(int[] a){for (int i = 0; i < a.length; i++){
a[i] = 1;}
}public static void main(String[] args){
int[] arr = new int[2];ones(arr);System.out.println(arr[0] + "," + arr[1]);
}}
העברת פרמטרים לפונקציה
?למה השינוי כן התבצע על המערך•
0 0#411
main
#411arr
ones
#411a
i
העברת פרמטרים לפונקציה
?מה יודפס•public class Example {
public static void arrayOfTenElements(int[] arr){arr = new int[10];
}
public static void main(String[] args){
int[] arr = new int[3];arrayOfTenElements(arr);System.out.println(arr.length);
}}
העברת פרמטרים
0 0 0#411
main
#411arr
arrayOfTenElements
#725arr
#725 0 0 0 0 0 0 0 0 0 0
שונים במערך איברים–תרגיל
כתבו פונקציה שמקבלת מערך של מספרים •
. שלמים ובודקת האם כל האיברים בו שוניםהפונקציה תחזיר ערך בוליאני בהתאם
public static boolean allDiff(int[] arr){
}
פתרון
public static boolean allDiff(int[] arr){
boolean ans = true;for (int i = 0; i < arr.length && ans; i++){
for (int j = i+1; j < arr.length; j++){if (arr[i] == arr[j]){
ans = false;}
}}return ans;
}
השתלת תת מחרוזת בתוך מחרוזת -תרגיל
ומחרוזת iמספר שלם sכתבו פונקציה המקבלת מחרוזת •
sub . מושתלת"הפונקציה תחזיר מחרוזת שבה "
שימו לב יש ) i -החל מהאינדקס ה sבתוך subהמחרוזת
(לבדוק נכונות קלט
public static String insertSubString(String s, int i, String sub){
}
פתרון
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;
}