תרגול 2 – מערכים ופונקציות
DESCRIPTION
תרגול 2 – מערכים ופונקציות. מבוא לתכנות. היום בתרגול. 1. מערך חד-מימדי: מה זה מערך ולמה צריך אותו? איך מגדירים? איך זה נראה בזכרון? דוגמאות לשימוש במערך חד-מימדי. השוואה בין משתנה פרימיטיבי למשתנה שאינו פרימיטיבי. 2. פונקציות. מערך חד-מימדי. - PowerPoint PPT PresentationTRANSCRIPT
1
– מערכים 2תרגול ופונקציות
מבוא לתכנות
2
היום בתרגול
. מערך חד-מימדי:1מה זה מערך ולמה צריך אותו?–איך מגדירים? איך זה נראה בזכרון?–דוגמאות לשימוש במערך חד-מימדי.–השוואה בין משתנה פרימיטיבי למשתנה שאינו –
פרימיטיבי.
. פונקציות2
3
מערך חד-מימדי
מערך הינו מבנה זיכרון המכיל מספר ערכים •מאותו טיפוס, גודל המערך נקבע כאשר הוא
נוצר )בזמן ריצה( ולאחר מכן הוא קבוע.
אילו טיפוסים אנו מכירים?•
3 4 2 6 7 8 1
4
מערך - מאפיינים
פרימיטיבישאינומשתנה •
מבנה מסודר של ערכים.•
לכל ערך יש מקום.•
כל איברי המערך הם מאותו סוג.•מערך יכול להכיל כל טיפוס פרימיטיבי•
וכן טיפוסים שאינם פרימיטיביים כפי שנלמד 3בהמשך 4 2 6 7 8 1
5
הצורך במערך
יש צורך לשמור מספר גדול של משתנים •מאותו סוג.
זהו מבנה מאורגן המאגד בתוכו קבוצה גדולה •של ערכים שניתן לעבור עליהם באופן שיטתי.
6
הגדרת מערך
כמו כל משתנה, גם מערך צריך הגדרה •והשמה.
//declares an array of integers
int[] myArray; ההגדרה מורכבת מטיפוס המערך ומשם •
.המערך
הסוגריים המרובעים לאחר הטיפוס מציינים •שהמשתנה המוגדר הוא מסוג מערך.
7
הקצאת זכרון
ההגדרה עצמה אינה מקצה זיכרון עבור •המערך, אלא רק מכריזה על קיומו ויש ליצור
)על ידי הקצאת זיכרון( את המערך.
//create an array of integers
myArray = new int[5] ;
myArray 0 0 0 0 0
טבלת משתנים
8
הקצאת זכרון באמצעות משתנה
int size = 5;
int[] myArray;
myArray = new int[size];
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);
10
null – ערך מיוחד
משתנים המצביעים על מערכים יכולים גם •:nullלקבל השמה לערך המיוחד
• myArray = null;
בטבלת המשתנים ערכו של המשתנה •myArray הוא המיוחד הקבוע null.
myArray
null
11
שאלה
לפני myArray.lengthמה נקבל כאשר נבקש •שהקצינו את המערך?
int[] myArray;
System.out.println(myArray.length);
, הקומפיילר מזהה את קומפילציה: שגיאת תשובה•השגיאה ועוצר את תהליך הקומפילציה.
12
שאלה
כאשר נעשתה לו myArray.length ואם נבקש•null?השמה
int[] myArray = null;
System.out.println(myArray.length);
( NullPointerException )מסוג שגיאת זמן ריצה: תשובה•, nullהמציינת שניסינו לפנות למשתנה שערכו הוא
הקומפיילר אינו מזהה את השגיאה.
13
שאלה
ובמקרה:•
int[] myArray = new int[0];
System.out.println(myArray.length);מה יודפס למסך?
0: תשובה•
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
15
מספור תאים במערך
תאים המערכת מתייחסת nאם במערך יש •n-1…0אליהם ע"י המספרים
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
17
פנייה לאיבר במערך
• aaSmallPrimes[3] = 13;
•numנשאר ללא שינוי
index 0 1 2 3 4
value 2 3 5 13 11
18
פנייה לאיבר במערך
• aaSmallPrimes[5] = 17;• num = aSmallPrimes[-1];
Run Time Error
index 0 1 2 3 4
value 2 3 5 13 11
19
פנייה לאיבר במערך
• int i = 5; myArray[i] = 3;
• myArray [i/2] = 1;
בתוך ה-][ יכול להיות ביטוי מתמטי,קריאה •לפונקציה וכו', כל עוד התוצאה הינה מטיפוס
שלם.
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
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,
22
משתנה פרימיטיבי
int x = 3;
int y = x;
x=7;
•yנשאר ללא שינוי .
טיפוס שם משתנה ערך
int x
int y
3
3
7
23
משתנה שאינו פרימיטיבי
int[] xArray = new int[5];
int[] yArray = xArray;
xArray[1] = 6;
xArray 0 0 0 0 0
yArray
6
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
25
פרימיטיבי .vs אינו פרימיטיבימשתנה שאינו
פרימיטיבימשתנה פרימיטיבי
מה נמצא הערך עצמו הכתובתבטבלת
המשתנים
השמה הערך מועתק הכתובת מועתקת
השוואה בין כתובות
(==) השוואה בין ערכיםהשוואה
26
null כתובת
int[] arr1 = null;
int[] arr2 = null;
System.out.println(arr1==arr2);
true
פונקציות
27
28
מוטיבציהאנו נזקקים לבצע פעולה מסוימת או , לעיתים•
רב של פעמים.'לעשות חישוב מסוים מס
במקום לשוב ולכתוב את הקוד מס' רב של •ניתן לכתוב פונקציה שעושה את פעמים,
הפעולה הרצויה ולקרוא לפונקציה זו בכל פעם .שרוצים להשתמש בה
)(Math.abs כבר ראינו את השימוש בפונקציה •
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
יש פונקציות שלא צריכות להחזיר ערך, אלא רק לבצע •משהו )למשל פונקציה שמדפיסה מערך(. במצב כזה
.>return value type< בתור voidנכתוב מילה
פונקציה שמחזירה ערך חייבת להכיל את הפקודה •>value>” “return ).)פעם אחת או יותר
ערך החזרה של פונקציה
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)));
}}
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 ;
}}
33
בזמן קריאה לפונקציה:השליטה של התכנית שומרת את המיקום הנוכחי •
שלה ועוברת לפונקציה.נפתחת סביבה )טבלת משתנים( חדשה שבה •
מוגדרים הפרמטרים של הפונקציה והמשתנים .שמוגדרים בתוך הפונקציה
)או סיום הפונקציה במקרה של returnההוראה •void סוגרת את הסביבה ומחזירה את השליטה )
למקום בו היינו לפני הקריאה לפונקציה
•Flow of previous func
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
35
עוד קצת על פונקציות וממנה מתחילה ההרצה. mainהפונקציה הראשית נקראת •.mainניתן לכתוב פונקציות נוספות מלבד ה-•הפונקציות יכולות לקרוא אחת לשניה.•אפשר להעביר לפונקציה ערכים.•פונקציה יכולה להחזיר ערך אחד בלבד או כלום.•משתנים בכל פונקציה אפשר להגדיר משתנים הנקראים •
(SCOPEוהם מוגדרים רק בתוך הפונקציה ), לוקליים
•Passing values/references•iSum in the previous example
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הדפסת מערך של
, 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 */
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 ;
}
העברת משתנים לפונקציה
39
מועברים בעת קריאה לפונקציה בעלת Javaב-פרמטרים, הערכים הרשומים בטבלת המשתנים, בין אם
מדובר בערך ממש או בכתובת:
מה שיעבור - אם הפרמטר הוא מטיפוס פרימיטיבי,ולכן הפונקציה לא , לפונקציה הוא הערך של המשתנה.תוכל לשנות את המשתנה המקורי
- אם הפרמטר הוא מטיפוס שאינו פרימיטיבי, כלומר מכיל מצביע לאובייקט )כגון מערך(, אז הפונקציה
מקבלת את הכתובת, ויכולה לשנות את האובייקט בזיכרון.
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 );
}
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 ;
}
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
43
הפונקציה הבאה אמורה להחליף ערכי שני משתנים , ובכל זאת אינה עובדת. מה הבעיה?intמטיפוס
public static void swap(int a, int b){
int tmp;
tmp = a;
a = b;
b = tmp;
}
שאלות משנים קודמות
45
נק'( 17 )2004מבוחן 4שאלה
מקבלת כקלט מערך של )boolean allDiff)int][ a הפונקציה" אם ורק אם כל אברי המערך שונים זה true ומחזירה "aשלמים
. nullשונה מ- ניתן להניח כי מערך הקלט מזה.ניקוד מלא יינתן על השלימו את גוף הפונקציה בדף התשובות.
.סמך נכונות הקוד וסגנונו
public static boolean allDiff(int[] a){
boolean ans = true;
השלימו //
return ans;
}
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;