תרגול 3 – מערך דו מימדי, פונקציות

Preview:

DESCRIPTION

תרגול 3 – מערך דו מימדי, פונקציות. מבוא לתכנות מערכות. היום בתרגול. מערך דו-מימדי: למה צריך? איך מגדירים? איך זה נראה בזכרון? דוגמאות לשימוש במערך דו-מימדי. העמסה של פונקציות. 2. מערך דו-מימדי. מערך שבו כל איבר הוא גם מערך,כלומר מערך של מערכים. 3. מערך דו-מימדי. - PowerPoint PPT Presentation

Citation preview

1

– מערך דו מימדי, 3תרגול פונקציות

מבוא לתכנות מערכות

2

היום בתרגול

מערך דו-מימדי:•למה צריך? איך מגדירים? איך זה נראה בזכרון?–דוגמאות לשימוש במערך דו-מימדי.–

העמסה של פונקציות•

3

מערך דו-מימדי

מערך שבו כל איבר הוא גם מערך,כלומר מערך של מערכים.•

4

מערך דו-מימדי

int[][] array1 = new int [3][2];

array1

0 0

0 0

0 0

5

מערך דו-מימדי

int[][] array2 ={{1,3},{5,6,7},{4}};

7

1

5

array2

3

6

4

6

length – אורך של מערך

• array1.length • array1[0].length • array2.length • array2[2].length • array2[1].length • array2[3].length

array1

32

Run time Error

13

3

5

array2

3

6

4

1

7

7

פנייה לאיבר

System.out.println(array2[1][0]);

array2[2][0] = 9;

5

array2

3

6

4

7

1

9

// prints 5

8

class ArrayRef{public static void main(String []args){

int[][] arr; arr = new int[3][]; arr[0] = new int[3]; arr[1] = arr[0]; arr[0][1] = 7;//prints the 2D arrayfor (int i = 0 ; i < arr.length ; i= i+1){

for(int j=0 ; j<arr[i].length; j = j+1){

System.out.print(arr[i][j]+” ”);}System.out.println();

}}

}

0 7 00 7 0NullPointerException

9

שאלה

מה יקרה אם נוסיף את השורה הבאה?•

arr[2]= arr; מבדילה בין מערך של מספרים javaתשובה: •

ובין מערך של מערכים של מספרים ולכן השורה הזאת לא תעבור קומפילציה )שכן

איברי המערך צריכים להיות מאותו טיפוס(.

10

העתקת מערךclass Copy2dArray{

public static void main(String[] args){ int[][] iA = {{1,3},{5,6,7},{4}}; int[][] iC;

//Create the 2dArray row by row iC = new int[iA.length][]; int i,j; for ( i=0 ; i < iC.length; i = i+1) iC[i] = new int[iA[i].length]; for ( i=0; i < iC.length; i = i+1) for (j=0 ; j < iC[i].length ; j = j+1) iC[i][j] = iA[i][j];

} //main}

משולש פסקל

11

Wikipedia http://en.wikipedia.org/wiki/Pascal%27s_triangle

מה החוקים לחישוב משולש פסקל 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1

Pascal[j][0] = Pascal[j][j]=1

Pascal[j][i] = Pascal[j-1][i] + Pascal[j-1][i-1]

12

הדפסת לוח הכפלclass MultiplicationTable {

public static void main(String[] arg) {

final int iROW = 13;

final int iCOLUMN = 13;

int[][] mat = new int[iROW][iCOLUMN];

for (int i=0; i < iROW; i=i+1)

for (int j=0; j < iCOLUMN; j=j+1)

mat[i][j] = i*j;

//prints the matrix

for (int i=0; i < iROW; i=i+1) {

for (int j=0; j < iCOLUMN; j=j+1)

System.out.print(mat[i][j]+"\t");

System.out.println();

}

} //main

} //class

13

(Overloading ) העמסה

שתי פונקציות בעלות שם זהה )אבל חתימה שונה!(.

לדוגמא: Math.min)int,int( -ו Math.min)double,double(

או System.out.println)int(ו -System.out.println)char(

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

.doubleמסוג איזה עוד דוגמאות לאופרטורים מועמסים ישנם?-

•‘+’ with strings

14

:דוגמא להעמסה

public static int foo(int num){…} √public static int foo(double num){…} √public static double foo(int num){…} X

אם היינו מחליפים את טיפוס הארגומנט בטיפוס

int?מה היה קורה

public class Max{// returns the larger between the argumentspublic static double max(double d1, double d2){

double ans;

if(d1 < d2) ans = d2;

else ans = d1;

return ans;}

public static int max(int i, double d){int ans;

if(i < d) ans = (int)d;

else ans = i;

return ans;}

15

/* output/* output 2.02.0 22 22*/*/

public static void main(String[] args){

int i1 = 1, i2 = 2 ;

double d1 = 2, d2 = 0 ;

System.out.println(max(d1,d2));

System.out.println(max(i1,d1));

System.out.println(max(i1,i2)); // example for casting

}

שאלות משנים קודמות

18

נקודות(20 )2002 מבוחן 1שאלה

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

checkMatrix)int[][] m( ,אשר בודקת אם מערך דו-מימדי ,m היינו ,אם קוראים לשיטה עם הערה: מטריצה ומחזירה ערך בוליאני בהתאם.

.false, על השיטה להחזיר את הערך nullפרמטר שערכו .)";"כלומר לא יופיע בו (בכל ריבוע ריק יש להשלים הוראה יחידה

[דוגמא]

&&

19

main :לשם הבהרה, השיטה

:תדפיס truefalsefalsefalsefalsefalsefalse

public static void main (String[] args){

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

}

20

21

נק'(20)2002 מבוחן 2שאלה

(. 1נאמר ששני מספרים טבעיים חיוביים הם זרים אם אין להם מחלק משותף )פרט ל- אשר מחזירה את המחלק )public static int gcd )int m, int n נתונה לכם שיטה סטטית

השלימו את השיטה המשותף הגדול ביותר של שני מספרים טבעיים חיוביים.checkGCD)int[] a( אשר מחזירה ערך בוליאני המציין האם מערך a מקיים אחת משתי

התכונות הבאות: זרים.a ב- מספרים שוניםא. כל שני אינם זרים.a ב-מספרים שוניםב. כל שני

 

למשל: מקיים את תכונה א' 4,7,25 האוסף -המחלק את 1למרות שאין שום מספר גדול מ- מקיים את תכונה ב', 6,10,15 האוסף -

שלושת המספרים. שונים והם זרים.20 ו- 7 מקיים את תכונה א' כי רק 20,7,20 האוסף- אינו מקיים אף אחת משתי התכונות. 4,7,28 האוסף-

false. ואילו על הרביעי true על שלושת המערכים הראשונים מחזירה checkGCDהפעלת-.

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

22

פתרון:

public static boolean checkGCD(int[] a){

boolean aliens = true; // each 2 are aliens boolean notAliens = true; // each 2 are not aliens for (int i = 0; i < a.length – 1 && (aliens || notAliens); i=i+1){ for (int j = i+1; j < a.length && (aliens || notAliens); j=j+1){ if (a[i] != a[j]) {

if (gcd(a[i], a[j]) == 1) notAliens = false;

else aliens = false;

} } }

return aliens || notAliens;}

23

נקודות(2004 ( 17מבוחן 5 שאלה

)public static int oddGCD)int m, int nנתונה הפונקציה של שני מספרים ( gcd )לחישוב המחלק המשותף המקסימלי

.שיטה זו פועלת נכון רק במקרה ולפחות אחד n ו- mשלמים .זוגי-המספרים הינו אי

תוך שימוש בשיטה , השלימו את הגדרת השיטה הבאהoddGCD כך שתחשב את המחלק המשותף , הנתונה

שליליים )הניחו כי לפחות -המקסימאלי עבור כל שני שלמים אי.)אחד המספרים אינו אפס

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

- ו n- ניתן להניח שהקלט הינו חוקי )כלומר ש .)!, &, |(לוגיות כמו m שליליים ולפחות אחד מהם חיובי ממש(-אי.

 public static int generalGCD(int m, int n) {השלימו // } 

:רמזgcd)x y,∙ x z) = ∙ x gcd(y,z)∙

24

פתרון:

public static int generalGCD)int m, int n( {

int multiply = 1;

while( (m % 2 == 0) && (n % 2 == 0) {

multiply = multiply * 2;

m = m / 2;

n = n / 2;

}

return multiply * oddGCD(m, n);

}

Recommended