תרגול 2 – מערכים ופונקציות

46
1 ללללל2 – לללללל ללללללללל תתתת תתתתתת

Upload: kamuzu

Post on 08-Jan-2016

38 views

Category:

Documents


2 download

DESCRIPTION

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

TRANSCRIPT

Page 1: תרגול 2 – מערכים ופונקציות

1

– מערכים 2תרגול ופונקציות

מבוא לתכנות

Page 2: תרגול 2 – מערכים ופונקציות

2

היום בתרגול

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

פרימיטיבי.

. פונקציות2

Page 3: תרגול 2 – מערכים ופונקציות

3

מערך חד-מימדי

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

נוצר )בזמן ריצה( ולאחר מכן הוא קבוע.

אילו טיפוסים אנו מכירים?•

3 4 2 6 7 8 1

Page 4: תרגול 2 – מערכים ופונקציות

4

מערך - מאפיינים

פרימיטיבישאינומשתנה •

מבנה מסודר של ערכים.•

לכל ערך יש מקום.•

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

וכן טיפוסים שאינם פרימיטיביים כפי שנלמד 3בהמשך 4 2 6 7 8 1

Page 5: תרגול 2 – מערכים ופונקציות

5

הצורך במערך

יש צורך לשמור מספר גדול של משתנים •מאותו סוג.

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

Page 6: תרגול 2 – מערכים ופונקציות

6

הגדרת מערך

כמו כל משתנה, גם מערך צריך הגדרה •והשמה.

//declares an array of integers

int[] myArray; ההגדרה מורכבת מטיפוס המערך ומשם •

.המערך

הסוגריים המרובעים לאחר הטיפוס מציינים •שהמשתנה המוגדר הוא מסוג מערך.

Page 7: תרגול 2 – מערכים ופונקציות

7

הקצאת זכרון

ההגדרה עצמה אינה מקצה זיכרון עבור •המערך, אלא רק מכריזה על קיומו ויש ליצור

)על ידי הקצאת זיכרון( את המערך.

//create an array of integers

myArray = new int[5] ;

myArray 0 0 0 0 0

טבלת משתנים

Page 8: תרגול 2 – מערכים ופונקציות

8

הקצאת זכרון באמצעות משתנה

int size = 5;

int[] myArray;

myArray = new int[size];

Page 9: תרגול 2 – מערכים ופונקציות

9

length –גודל המערך

int size = 5;int[] myArray;myArray = new int[size];System.out.println(myArray.length(; // prints 5

size = 6;?מה לדעתכם תדפיס כעת השורה הבאה

System.out.println(myArray.length);

Page 10: תרגול 2 – מערכים ופונקציות

10

null – ערך מיוחד

משתנים המצביעים על מערכים יכולים גם •:nullלקבל השמה לערך המיוחד

• myArray = null;

בטבלת המשתנים ערכו של המשתנה •myArray הוא המיוחד הקבוע null.

myArray

null

Page 11: תרגול 2 – מערכים ופונקציות

11

שאלה

לפני myArray.lengthמה נקבל כאשר נבקש •שהקצינו את המערך?

int[] myArray;

System.out.println(myArray.length);

, הקומפיילר מזהה את קומפילציה: שגיאת תשובה•השגיאה ועוצר את תהליך הקומפילציה.

Page 12: תרגול 2 – מערכים ופונקציות

12

שאלה

כאשר נעשתה לו myArray.length ואם נבקש•null?השמה

int[] myArray = null;

System.out.println(myArray.length);

( NullPointerException )מסוג שגיאת זמן ריצה: תשובה•, nullהמציינת שניסינו לפנות למשתנה שערכו הוא

הקומפיילר אינו מזהה את השגיאה.

Page 13: תרגול 2 – מערכים ופונקציות

13

שאלה

ובמקרה:•

int[] myArray = new int[0];

System.out.println(myArray.length);מה יודפס למסך?

0: תשובה•

Page 14: תרגול 2 – מערכים ופונקציות

14

הגדרה והקצאה בשורה אחת

• int[] myArray = new int[5];

• int[] aSmallPrimes ={2,3,5,7,11};

myArray 0 0 0 0 0

aSmallPrimes

2 3 5 7 11

Page 15: תרגול 2 – מערכים ופונקציות

15

מספור תאים במערך

תאים המערכת מתייחסת nאם במערך יש •n-1…0אליהם ע"י המספרים

Page 16: תרגול 2 – מערכים ופונקציות

16

פנייה לאיבר )תא( במערך

int[] aaSmallPrimes= {2,3,5,7,11};

:קריאת ערך מתא במערך•

int num = aaSmallPrimes[3] * 2;

// num = 7*2 = 14

index 0 1 2 3 4

value 2 3 5 7 11

Page 17: תרגול 2 – מערכים ופונקציות

17

פנייה לאיבר במערך

• aaSmallPrimes[3] = 13;

•numנשאר ללא שינוי

index 0 1 2 3 4

value 2 3 5 13 11

Page 18: תרגול 2 – מערכים ופונקציות

18

פנייה לאיבר במערך

• aaSmallPrimes[5] = 17;• num = aSmallPrimes[-1];

Run Time Error

index 0 1 2 3 4

value 2 3 5 13 11

Page 19: תרגול 2 – מערכים ופונקציות

19

פנייה לאיבר במערך

• int i = 5; myArray[i] = 3;

• myArray [i/2] = 1;

בתוך ה-][ יכול להיות ביטוי מתמטי,קריאה •לפונקציה וכו', כל עוד התוצאה הינה מטיפוס

שלם.

Page 20: תרגול 2 – מערכים ופונקציות

20

פעולות על מערך//Demonstrates basic array operationsclass BasicArray {

public static void main(String[] arg) {int[] aSmallPrimes = {2,3,5,7,11};

System.out.println(aSmallPrimes[0]);2

aSmallPrimes[0] = 13;

System.out.println(aSmallPrimes[0]);13

System.out.println(aSmallPrimes.length);5

for(int i=0;i<aSmallPrimes.length;i=i+1) System.out.print(aSmallPrimes[i]+", ");

13, 3, 5, 7, 11, } //main } //class BasicArray

Page 21: תרגול 2 – מערכים ופונקציות

21

איתחול מערך ע"י לולאה//Demonstrate array init with a loop class IntArray {public static void main(String[] arg) {

int[] intArray = new int[5]; System.out.println();

for(int i=0;i < intArray.length ;i=i+1) intArray [i] = i*3;

for(int i=0;i<intArray.length;i=i+1) System.out.print(intArray[i]+", ");

} //main } //class IntArray

0, 3, 6, 9, 12,

Page 22: תרגול 2 – מערכים ופונקציות

22

משתנה פרימיטיבי

int x = 3;

int y = x;

x=7;

•yנשאר ללא שינוי .

טיפוס שם משתנה ערך

int x

int y

3

3

7

Page 23: תרגול 2 – מערכים ופונקציות

23

משתנה שאינו פרימיטיבי

int[] xArray = new int[5];

int[] yArray = xArray;

xArray[1] = 6;

xArray 0 0 0 0 0

yArray

6

Page 24: תרגול 2 – מערכים ופונקציות

24

שאלה

מה יקרה בזכרון בזמן הרצת הקוד הבא?•

int[] myArray;

myArray = new int[5];

myArray = new int[10];

myArray 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

Page 25: תרגול 2 – מערכים ופונקציות

25

פרימיטיבי .vs אינו פרימיטיבימשתנה שאינו

פרימיטיבימשתנה פרימיטיבי

מה נמצא הערך עצמו הכתובתבטבלת

המשתנים

השמה הערך מועתק הכתובת מועתקת

השוואה בין כתובות

(==) השוואה בין ערכיםהשוואה

Page 26: תרגול 2 – מערכים ופונקציות

26

null כתובת

int[] arr1 = null;

int[] arr2 = null;

System.out.println(arr1==arr2);

true

Page 27: תרגול 2 – מערכים ופונקציות

פונקציות

27

Page 28: תרגול 2 – מערכים ופונקציות

28

מוטיבציהאנו נזקקים לבצע פעולה מסוימת או , לעיתים•

רב של פעמים.'לעשות חישוב מסוים מס

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

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

)(Math.abs כבר ראינו את השימוש בפונקציה •

Page 29: תרגול 2 – מערכים ופונקציות

29

מבנה של פונקציה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

Page 30: תרגול 2 – מערכים ופונקציות

יש פונקציות שלא צריכות להחזיר ערך, אלא רק לבצע •משהו )למשל פונקציה שמדפיסה מערך(. במצב כזה

.>return value type< בתור voidנכתוב מילה

פונקציה שמחזירה ערך חייבת להכיל את הפקודה •>value>” “return ).)פעם אחת או יותר

ערך החזרה של פונקציה

Page 31: תרגול 2 – מערכים ופונקציות

31

:דוגמאות להגדרה ושימוש בפונקציות

// Shows how to define and use a simple functionpublic class Max{

// returns the larger number between the argumentspublic static double max(double dx, double dy){

double ans;if(dx < dy)

ans = dy;else

ans = dx;return ans;

}public static void main(String[] args){

double dx1, dx2, dx3;dx1 = 2; dx2 = 0; dx3 = -1.8;System.out.println(max(dx1, max(dx2, dx3)));

}}

Page 32: תרגול 2 – מערכים ופונקציות

32

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

int iLastInd = 10;int iSum = sumNums(lastInd);

System.out.println(“The sum of numbers from 1 to “+ iLastInd + “ = “ +

iSum );System.out.println(“The sum of numbers from 1 to

“+ 8 + “ = “ + sumNums(8));}

// returns the sum of numbers from 1 to endpublic static int sumNums(int iEnd) {

int iSum = 0;for(int i = 1; i <= iEnd; i = i+1)

iSum = iSum + i;return iSum ;

}}

Page 33: תרגול 2 – מערכים ופונקציות

33

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

שלה ועוברת לפונקציה.נפתחת סביבה )טבלת משתנים( חדשה שבה •

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

)או סיום הפונקציה במקרה של returnההוראה •void סוגרת את הסביבה ומחזירה את השליטה )

למקום בו היינו לפני הקריאה לפונקציה

•Flow of previous func

Page 34: תרגול 2 – מערכים ופונקציות

main

sumNums)10(

34

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

int iLastInd = 10;int iSum = iLastInd );

System.out.println(“The sum of numbers from 1 to “+ iLastInd + “ = “ + iSum );System.out.println(“The sum of numbers from 1 to “+ 8 + “ = “ + sumNums(8));

}

// returns the sum of numbers from 1 to endpublic static int sumNums(int iEnd) {

int iSum = 0;for(int i = 1; i <= iEnd; i = i+1)

iSum = iSum + i;return iSum ;

}}

end int 10

sum int 0lastInd int 10

sum int 55sum int i int 1

155

Page 35: תרגול 2 – מערכים ופונקציות

35

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

(SCOPEוהם מוגדרים רק בתוך הפונקציה ), לוקליים

•Passing values/references•iSum in the previous example

Page 36: תרגול 2 – מערכים ופונקציות

36

public static void printArray(int[] arr) {

for(int i=0; i < arr.length; i=i+1){ System.out.print(arr[i]+” “);}System.out.println();

}

-יםintהדפסת מערך של

Page 37: תרגול 2 – מערכים ופונקציות

, kחישוב המקדם הבינומי המציין את מספר תתי הקבוצות בגודל .nשל קבוצה בגודל

37

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 */

Page 38: תרגול 2 – מערכים ופונקציות

38

// Assumes that n>=0public static int factorial(int iN){

int iResult = 1;

for(int i=2; i <= iN; i = i+1){ result = iResult * i;}return iResult ;

}

public static int nChooseK(int iN, int iK) {

int iAns = 0;if (iN >= iK && iK >=0)

ans = factorial(iN)/(factorial(k)*factorial(iN - iK));return iAns ;

}

Page 39: תרגול 2 – מערכים ופונקציות

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

39

מועברים בעת קריאה לפונקציה בעלת Javaב-פרמטרים, הערכים הרשומים בטבלת המשתנים, בין אם

מדובר בערך ממש או בכתובת:

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

- אם הפרמטר הוא מטיפוס שאינו פרימיטיבי, כלומר מכיל מצביע לאובייקט )כגון מערך(, אז הפונקציה

מקבלת את הכתובת, ויכולה לשנות את האובייקט בזיכרון.

Page 40: תרגול 2 – מערכים ופונקציות

40

דוגמא להעברת פרמטרים מטיפוס פרימיטיבי:

public static void main(String[] args){

int iX =8;

System.out.println(iX );

add5(iX );

System.out.println (iX );

}

public static void add5(int iX ){

iX = iX +5;

System.out.println (iX );

}

Page 41: תרגול 2 – מערכים ופונקציות

41

מה היינו עושים?xאם היינו רוצים לשנות את הערך של xכך שתחזיר ערך ואותו להכניס ל add5 היינו צריכים לשנות את

:

public static void main(String[] args){

int iX =8;

System.out.println(iX );

iX =add5(iX );

System.out.println(iX );

}

public static int add5(int iX ) {

iX = iX +5;

System.out.println(iX );

return iX ;

}

Page 42: תרגול 2 – מערכים ופונקציות

42

public static void main(String[] arg){int [] arr={1,2,3};printArray(arr);add5(arr);printArray(arr);

}

public static void add5(int[] arr) {for (int i=0 ; i< arr.length ;i=i+1)

arr[i] = arr[i]+5;printArray (arr);

}

דוגמא להעברת פרמטרים מטיפוס לא פרימיטיבי:

/*/* outputoutput1 2 31 2 36 7 86 7 86 7 86 7 8*/*/

1 2 3

Page 43: תרגול 2 – מערכים ופונקציות

43

הפונקציה הבאה אמורה להחליף ערכי שני משתנים , ובכל זאת אינה עובדת. מה הבעיה?intמטיפוס

public static void swap(int a, int b){

int tmp;

tmp = a;

a = b;

b = tmp;

}

Page 44: תרגול 2 – מערכים ופונקציות

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

Page 45: תרגול 2 – מערכים ופונקציות

45

נק'( 17 )2004מבוחן 4שאלה

מקבלת כקלט מערך של )boolean allDiff)int][ a הפונקציה" אם ורק אם כל אברי המערך שונים זה true ומחזירה "aשלמים

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

.סמך נכונות הקוד וסגנונו

public static boolean allDiff(int[] a){

boolean ans = true;

השלימו //

return ans;

}

Page 46: תרגול 2 – מערכים ופונקציות

46

:פתרון

for(int i = 0; i < a.length-1 && ans; i=i+1)

for(int j = i+1; j < a.length && ans; j=j+1)

if(a[i] == a[j])

ans = false;