java ב תונכתל אובמ 5 לוגרת - bguipc161/wiki.files/ipc161-ps5.pdfjava -ב...

35
מבוא לתכנות ב- JAVA תרגול5 Ipc161- practical session 5

Upload: others

Post on 26-Mar-2021

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

JAVA-מבוא לתכנות ב5תרגול

Ipc161- practical session 5

Page 2: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

מה בתרגול

מערכים דו ממדיים•

Java (methods) -שיטות ב/פונקציות•

הגדרת פונקציה–

הפעלה/קריאה–

העברת ארגומנטים–

ערכי החזרה–

Page 3: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

מערך דו ממדי

ניתן באותו אופן )מערך של מערכים חד ממדיים •

(לדבר על מערכים רב מימדיים

פנייה לאיברי המערך נעשית תוך שימוש בשני •אינדקסים

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

Page 4: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

דוגמא

הדפסת איברי המערך•

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();

}

Page 5: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

(Deep copy)העתקת מערכים –תרגיל

bיועתק למערך aהשלימו את הקוד כך שמערך •

int[][] a = {{1,2,3,4},{2,5,1},{7,7,7,7},{1}};

int[][] b;

//Fill here the code

Page 6: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

(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];

}

}

Page 7: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

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");

}

Page 8: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

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;

}

} המשך בשקף הבא

Page 9: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

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");

}

Page 10: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

חלוקה לתתי משימות–מבוא לפונקציות

המספרים הראשוניים kחישוב הממוצע של : בעיה•

הגדולים ביותר במערך

:תתי משימות הנדרשות לפתרון•

בדיקת ראשוניות

מיון מערך

חישוב ממוצע

Page 11: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

11

שימוש חוזר בקוד -מבוא לפונקציות

נניח שבמהלך התוכנית נדרשתם לחשב את •.[e,f], [c,d], [a,b]הסכום של המספרים בקטעים

ל הייתם רושמים את אותה "לצורך החישוב הנ•חתיכת קוד כמה פעמים

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

אחת

for (int i = <start>; i < <end>; i++){sum += i;

}

Page 12: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

? 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));

}}

הגדרת השיטה

שימוש בשיטה

הפעלה -

Page 13: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

הגדרת פונקציה

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){…}

Page 14: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

החזרת ערך בפונקציה

פונקציה יכולה להחזיר ערך או לא להחזיר ערך•

voidהוא <return type>אם הפונקציה לא מחזירה ערך בהגדרה שלה נציין ש •

בגוף הפונקציה כדי returnאם פונקציה מחזירה ערך עליה להשתמש בפקודה •

להחזיר אותו

public static void printFive(){System.out.println("5");

}

public static int five(){return 5;

}

Page 15: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

לחישוב ממוצע של מערך פונקציה–דוגמא

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של

Page 16: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

קריאה לפונקציה

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);

}}

נדגים מה קורה כאשר קוראים פונקציה•

Page 17: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

קריאה לפונקציה

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

Page 18: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

קריאה לפונקציה

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

Page 19: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

קריאה לפונקציה

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

Page 20: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

קריאה לפונקציה

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

Page 21: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

קריאה לפונקציה

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

Page 22: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

קריאה לפונקציה

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

Page 23: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

?מה קורה בזמן קריאה לפונקציה

השליטה של התכנית שומרת את המיקום הנוכחי שלה •

.ועוברת לפונקציה

חדשה שבה מוגדרים ( טבלת משתנים)נפתחת סביבה •

הפרמטרים של הפונקציה והמשתנים שמוגדרים בתוך .הפונקציה

( voidאו סיום הפונקציה במקרה של ) returnההוראה •

סוגרת את הסביבה ומחזירה את השליטה למקום בו היינו

.לפני הקריאה לפונקציה

Page 24: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

ת מערךת–תרגיל

השלימו את הקוד כך שהפונקציה תחזיר תת •

end -ומסתיים ב start–המערך המתחיל ב

public static int[] subArray(int[] arr, int start, int end){//assume that arr.length > end > start > -1

}

Page 25: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

פתרון

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;

}

Page 26: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

העברת פרמטרים לפונקציה

?מה יודפס: שאלה•

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);

}}

Page 27: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

העברת פרמטרים לפונקציה

כדי להבין את הדרך שבה משתנים עוברים לפונקציה עלינו להבין קצת יותר •

טוב את תמונת הזיכרון

כאשר המשתנה הוא פרימיטיבי הוא מחזיק את הערך עצמו•

ערכו הוא כתובת בזיכרון שבו ( משתנה הפנייה)כאשר משתנה אינו פרימיטיבי •:נמצא התוכן

int x = 17;int[] arr = new int[5]

17x

0 0 0 0 0#41 #41arr

Page 28: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

העברת פרמטרים לפונקציה

כלומר הערך 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]);

}}

Page 29: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

העברת פרמטרים לפונקציה

?למה השינוי כן התבצע על המערך•

0 0#411

main

#411arr

ones

#411a

i

Page 30: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

העברת פרמטרים לפונקציה

?מה יודפס•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);

}}

Page 31: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

העברת פרמטרים

0 0 0#411

main

#411arr

arrayOfTenElements

#725arr

#725 0 0 0 0 0 0 0 0 0 0

Page 32: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

שונים במערך איברים–תרגיל

כתבו פונקציה שמקבלת מערך של מספרים •

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

public static boolean allDiff(int[] arr){

}

Page 33: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

פתרון

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;

}

Page 34: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

השתלת תת מחרוזת בתוך מחרוזת -תרגיל

ומחרוזת iמספר שלם sכתבו פונקציה המקבלת מחרוזת •

sub . מושתלת"הפונקציה תחזיר מחרוזת שבה "

שימו לב יש ) i -החל מהאינדקס ה sבתוך subהמחרוזת

(לבדוק נכונות קלט

public static String insertSubString(String s, int i, String sub){

}

Page 35: JAVA ב תונכתל אובמ 5 לוגרת - BGUipc161/wiki.files/ipc161-ps5.pdfJava -ב היצקנופ יהמ השו ע אל הלועפ עוציבל דחיב תודגואמש תודוקפ

פתרון

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;

}