מערכים ומטריצות קרן כליף ! נכון שזה נכון?? אז די,אגב http://programmingpalace.files.wordpress.com/2011/12/smokingwarningforsoftwareengineers.jpg 2 © Keren Kalif ביחידה זו נלמד: מהו מערך כיצד מערך נראה בזיכרון גישה לאיברי המערך אתחול מערך חריגה מגבולות המערך השמת מערכים מערך דו-מימדי מערך רב-מימדי לולאת for-each 3 © Keren Kalif מוטיבציה מספרים ומציגה את הממוצע20 אם נרצה לכתוב תוכנית הקוראת : משתנים20 נצטרך להגדיר,שלהם public static void main(String[] args) { Scanner s = new Scanner(System.in); int num1, num2…num20, sum=0; System.out.println(“Please insert 20 numbers: “); num1 = s.nextInt(); num2 = s.nextInt(); ,התוכנית מסורבלת ומייגע לכתוב אותה ….. בייחוד כי יתכן גם שנרצה ממוצע של num20 = s.nextInt(); ... או אפילו יותר, מספרים100 sum = num1 + num2 + … + num20; System.out.println(“The average is ” + sum/20.0); } 4 © Keren Kalif הגדרה מערך הוא אוסף של משתנים מאותו הסוג עם שם אחד ,ובעלי תפקיד זהה דוגמא :מערך של 20מספרים דוגמא :מערך של 10תוים ובאופן כללי: ;]int[ ] numbers = new int[20 ;]char[ ] letters = new char[10 ;]<type>[ ] <var_name> = new <type>[SIZE איברי המערך נשמרים ברצף בזיכרון גודל המערך בזיכרון<*SIZE :גודל הטיפוס> 5 © Keren Kalif דוגמא למערך בזיכרון public static void main(String[] args) { int x = 4; int[ ] arr = new int[3]; char ch = ‘a’; } 4 int:x int[]:arr char: ch 0 0 0 ‘a’ 0 ערכם של איברי המערך שהוקצה הוא 6 © Keren Kalif גישה לאיברי המערך כדי שניתן יהיה להתייחס לכל איבר בנפרד ניתנו להם אינדקסים האיבר הראשון בעל אינדקס ,0השני בעל אינדקס 1והאחרון עם אינדקס SIZE-1 דוגמא: ;]int[ ] arr = new int[3 ;arr[0] = 1 הפניה לאיבר מסוים במערך היא ע"י [ ] כאשר בתוך הסוגריים יהיה האינדקס של האיבר אליו נרצה לגשת פניה לאיבר במערך היא כפניה למשתנה מטיפוס המערך מתייחסים ל arr[0] -כמו שמתייחסים לint - 7 © Keren Kalif דוגמא- גישה לאיברי המערך public static void main(String[] args) { int[] arr = new int[3]; 0 4 arr[0] = 4; int[]:arr arr[1] = 7; arr[2] = 3; System.out.printf(“The values in the array: %d %d %d\n”, arr[0], arr[1], arr[2]); } 0 7 0 3 8 © Keren Kalif מספר האיברים המערך : למערך ישנו נתון המעיד על גודלו public static void main(String[] args) { int[] arr = new int[4]; System.out.printf("There are %d numbers in the array\n", arr.length); } 9 © Keren Kalif לולאות- גישה לאיברי המערך , מאחר ועבודה עם איברי המערך היא עבודה זהה על כל האיברים יותר חסכוני וקל להשתמש בלולאות public static void main(String[] args) { Scanner s = new Scanner(System.in); int[ ] arr = new int[5]; System.out.printf("Please enter %d numbers: ", arr.length); for (int i=0 ; i < arr.length ; i++) arr[i] = s.nextInt(); 0 - יתחיל מi נשים לב שבעבודה עם מערכים ולולאות } System.out.println("The numbers are: "); :האינדקס שאיתו פונים לאיבר במערך יכול להיות for (int i=0 ; i < arr.length ; i++) ) מספר שלם (כמו בדוגמא הקודמת System.out.printf("%d ", arr[i]); ) משתנה (כמו בדוגמא זו System.out.println(); arr[i+2] : למשל, ערך של ביטוי :ניתוח זמן הריצה של תוכנית זו O(main) = O(1) + O(SIZE) + O(SIZE) = O(1) + 2*O(SIZE) = O(SIZE) 10 © Keren Kalif )2( גישה לאיברי המערך – לולאות ..הפעם נרצה להדפיס את איברי המערך מהסוף להתחלה public static void main(String[] args) { Scanner s = new Scanner(System.in); int[ ] arr = new int[5]; System.out.printf("Please enter %d numbers: ", arr.length); for (int i=0 ; i < arr.length ; i++) arr[i] = s.nextInt(); System.out.print("The numbers are: "); for (int i=arr.length-1 ; i >= 0 ; i--) System.out.printf("%d ", arr[i]); System.out.println(); } 11 © Keren Kalif דוגמא- גישה לאיברי המערך – לולאות :תוכנית המוצאת את הערך המקסימלי שהוכנס public static void main(String[] args) { Scanner s = new Scanner(System.in); int[ ] arr = new int[4]; 13 0 11 0 17 0 15 0 System.out.printf("Please enter %d numbers: ", arr.length); for (int i=0 ; i < arr.length ; i++) int[]:arr arr[i] = s.nextInt(); ??? int: i ??? 1 2 3 4 int: max ??? 13 17 int max = arr[0]; for ( int i=1 ; i < arr.length ; i++ ) { if (arr[i] > max) max = arr[i]; } System.out.println("The max is “ + max); } :ניתוח זמן הריצה של תוכנית זו O(main) = O(1) + O(SIZE) + O(SIZE) = O(1) + 2*O(SIZE) = O(SIZE) 12 © Keren Kalif מציאת האינדקס המכיל את הערך המקסימלי public static void main(String[] args) { Scanner s = new Scanner(System.in); int[ ] arr = new int[4]; System.out.printf("Please enter %d numbers: ", arr.length); for (int i=0 ; i < arr.length ; i++) arr[i] = s.nextInt(); 0 11 0 17 0 15 0 13 int[]:arr int maxIndex = 0; int: i for ( int i=1 ; i < arr.length ; i++ ) { ??? 1 2 3 4 if (arr[i] > arr[maxIndex]) int: maxIndex ??? 0 2 maxIndex = i; } System.out.printf("The max is at index %d and its value is %d\n“, maxIndex, arr[maxIndex]); } 13 © Keren Kalif הגדרת מערך : הדרכים הבאות2 - ניתן להגדיר מערך ב int[] arr1, arr2; int arr3[], x; // both arr1 and arr2 are arrays // arr3 is array, x is just int 14 © Keren Kalif אתחול מערך כאשר מקצים מערך ערכי איבריו הוא 0 ניתן לאתחל את איברי המערך במקום הקצאה באחד מן האופנים הבאים: //arr[0]=5, arr[1]=3, arr[2]=1 ;}int arr[] = {5, 3, 1 //arr[0]=5, arr[1]=3, arr[2]=1 ;}int[] arr = {5, 3, 1 נשים לב כי רק בעת האיתחול ניתן לתת ערך לכמה איברים יחד! כל נתינת ערך בהמשך הינה השמה ,ולא איתחול ,ולכן יבוצע על כל איבר בנפרד. 15 © Keren Kalif הגדרת הגודל והערכים:אתחול מערך : עבור המערכים הבאים int[ ] numbers = {5, 3, 1}; char[ ] letters = {‘m’, ‘A’, ‘k’}; : הזכרון יראה כך int[]: numbers char[]: letters 5 3 1 ‘m’ ‘A’ ‘k’ 16 © Keren Kalif הדפסת היסטוגרמה של ערכי המערך:דוגמא public static void main(String[] args) { int[] arr = {4, 3, 2, 7}; System.out.printf("There are %d numbers in the array: \n", arr.length); for (int i=0 ; i < arr.length ; i++) { System.out.print(arr[i] + “: “); for (int j=0 ; j < arr[i] ; j++) System.out.print("*"); System.out.println(); } System.out.println(); } 17 © Keren Kalif הגדרה :מערך סימטרי (פלינדרום) מערך שאם נקרא את ערכיו משמאל לימין או ההפך נקבל אותו הדבר 18 © Keren Kalif והנה דוגמאות נוספות 19 © Keren Kalif האם איברי המערך סימטריים:דוגמא public static void main(String[] args) { Scanner s = new Scanner(System.in); int arr[] = new int [5], left, right; boolean isSymetric=true; System.out.printf("Enter %d numbers: ", arr.length); for (int i=0 ; i < arr.length ; i++) arr[i] = s.nextInt(); for (left=0, right=arr.length-1; left < right && isSymetric ; left++, right--) { if (arr[left] != arr[right]) isSymetric = false; } left right if (isSymetric) System.out.println("The array is symetric"); else System.out.println("The array is NOT symetric"); } 0 8 1 5 2 4 2 3 7 5 4 8 isSymetric = false true 20 © Keren Kalif public static void main(String[] args) { שגיאה נפוצה Scanner s = new Scanner(System.in); int arr[] = new int [5], left, right; boolean isSymetric=true; System.out.printf("Enter %d numbers: ", arr.length); for (int i=0 ; i < arr.length ; i++) arr[i] = s.nextInt(); for (left=0, right=arr.length-1; left < right && isSymetric ; left++, right--) { if (arr[left] != arr[right]) isSymetric = false; else isSymetric = true; } left right if (isSymetric) System.out.println("The array is symetric"); else 0 8 1 7 2 4 3 7 4 9 System.out.println("The array is NOT symetric"); } isSymetric = false true 21 © Keren Kalif דוגמא :היום המועדף בשבוע -פלט בהמשך נראה מה היה קורה אם המשתמש היה מכניס ערך שאינו בין 1ל!7- 22 © Keren Kalif היום המועדף בשבוע:דוגמא public static void main(String[] args) { Scanner s = new Scanner(System.in); final int EXIT = -1; int daysFrequency[] = new int[7], day, maxDayIndex; do { System.out.printf("Insert the day you like most (1-7), %d to EXIT: ", EXIT); day = s.nextInt(); if (day != EXIT) 0 1 2 daysFrequency[day-1]++; 0 0 0 } while (day != EXIT); System.out.println("Each day and number of persons who liked it most:"); for (int i=1 ; i<=7 ; i++) System.out.printf("%d: %d\n", i, daysFrequency[i-1]); 3 0 1 2 int: i 4 0 5 0 6 0 1 ?? int[]: daysFreq maxDayIndex = 0; for (int i=1 ; i < 7 ; i++) { if (daysFrequency[i] > daysFrequency[maxDayIndex]) maxDayIndex = i; } System.out.println("The favorite day is: “ + (maxDayIndex+1)); } int: day -1 4 ?? 7 int: maxDayIndex 0 ?? 23 © Keren Kalif חריגה מגבולות המערך כדי לגשת לאחד מאיברי מערך בגודל Nניגש עם אינדקסים N-1...0 כאשר ננסה לפנות לאינדקס שאינו בגבולות המערך אנו למעשה מנסים לגשת בתא בזיכרון שאיננו יודעים מה יש בו ומה השפעתו, וזוהי גישה לא חוקית לשטח בזיכרון ;]int[] arr = new int[3 ;arr[5] = 7 24 © Keren Kalif חריגה מגבולות המערך ()2 אחריות המתכנת לפנות לתא שבגבולות המערך הקומפיילר אינו מתריע על ניסיון פניה לתא שאינו בגבולות המערך (יתכן שבזמן קומפילציה אינו ידוע מהו התא אליו מנסים לגשת) ;]int[] arr = new int[4 ;int i iיכול להיות בין 0-3ואז הכל בסדר ,או לחילופין ;)(i = s.nextInt מספר שלילי או גדול מ 3 -ואז אנו חורגים מגבולות ;arr[i] = 7 המערך ...ש במקרה של חריגה מגבולות המערך התוכנית תעוף עם חריגה IndexOutOfBoundsException 25 © Keren Kalif השמת מערכים כדי לבצע השמה בין משתנים מאותו הסוג אנו משתמשים באופרטור = ;int x, y=5 ;x = y עבור מערכים השמה תשנה את ההפניה: ;]int[] arr1={1,2,3}, arr2 = new int[3 ;arr2 = arr1 3 2 1 0 0 0 int[]: arr1 int[]: arr2 העתקת ערכי המערכים תבוצע בעזרת לולאה ,בה נעתיק איבר-איבר 26 © Keren Kalif דוגמא- השמת ערכי מערכים public static void main(String[] args) { int[] arr1 = {1,2,3}, arr2 = new int[3]; // arr2 = arr1; // DOESN'T do what we want!! System.out.print("Elements in arr2 before: "); for (int i=0 ; i < arr2.length ; i++) System.out.printf("%d ", arr2[i]); for (int i=0 ; i < arr2.length ; i++) arr2[i] = arr1[i]; System.out.print("\nElements in arr2 after: "); for (int i=0 ; i < arr2.length ; i++) System.out.printf("%d ", arr2[i]); System.out.println(); } 27 © Keren Kalif דוגמא :קבל מספר והחזר מהי הספרה המופיעה הכי הרבה פעמים למשל ,עבור המספר 12,327,293תוצג הספרה 2כי היא מופיעה הכי הרבה פעמים במספר ( 3פעמים) אופציה :1לספור באמצעות לולאה כמה פעמים בכל המספר מופיעה הספרה ,1כנ"ל עבור הספרה 2וכו' ,10*O(n) כאשר nהוא מספר הספרות במספר 10*O(n) = O(n) אופציה :2מיון דליים ,O(n) כאשר nהוא מספר הספרות במספר 28 © Keren Kalif הקוד O(n) public static void main(String[] args) { Scanner s = new Scanner(System.in); int num, maxDigit=0, maxCount=0; public static void main(String[] args) { Scanner s = new Scanner(System.in); int num, counters[] = new int[10]; O(n) System.out.print(“Enter number :”); num = s.nextInt(); System.out.println(“Enter number :”); num = s.nextInt(); while (num > 0) { for (int i = 0; i < 10; i++) { counters[num % 10]++; int temp = num; num /= 10; int count = 0; } while (temp > 0) { if (temp % 10 == i) int max = 0; count++; for (i = 1; i < 10; i++) temp /= 10; if (counters[i] > counters[max]) } max = i; if (count > maxCount) { maxCount = count; System.out.println(“The digit that maxDigit = i; appears most is “ + max); } } } System.out.println(“The digit that appears most is “ + maxDigit); } 29 © Keren Kalif דוגמא הגדר מערך של 10תווים ,קלוט לתוכו נתונים מהמקלדת ,והדפס למסך את התווים שהוקלדו ללא חזרות ,וכן את כמות התווים השונים דוגמא :אם המשתמש הכניס את התווים הבאים: a 0 ? T T 0 $ a T x אזי התכנית תודיע שיש 6תווים שונים ותדפיס למסך: a 0 ? T $ x 30 © Keren Kalif אסטרטגיית הפתרון המשתנים בהם נשתמש: :counter תפקידו לספור את כמות התווים השונים :hasAppear דגל שתפקידו לדעת האם תו כבר הופיע בתווים שלפניו האלגוריתם: אפס counter עבור כל תו במערך: אפס דגל עבור כל אחד מהתווים שלפניו במערך וכל עוד הדגל לא סומן: אם התו הנבדק והתו הנוכחי זהים: סמן את הדגל (כדי להפסיק את לולאת בדיקת התווים שלפניו) אם הדגל נשאר כבוי ,הדפס את התו למסך והגדל את הcounter - 31 © Keren Kalif public static void main(String[] args) { Scanner s = new Scanner(System.in); int count=0; boolean hasAppear = false; char[] str = new char[10]; קוד הפתרון System.out.printf("Please enter %d chars: “, str.length); for (int i=0 ; i < str.length ; i++) קליטת str[i] = s.next().charAt(0); הנתונים // print each char only once System.out.println("The chars are:”); for (int i=0 ; i < str.length ; i++) } hasAppear = false; איפוס הדגל עבור התו הנוכחי for (int j=0 ; j < i && !hasAppear; j++) { if (str[i] == str[j]) אם התו זהה לאחד התווים hasAppear = true; נדליק את הדגל,שלפניו } if (!hasAppear) } נדפיס אותו,אם התו לא הופיע System.out.print(str[i]); count++; counter -ונגדיל את ה { { System.out.printf("\nThere were %d different letters\n”, count); } 32 © Keren Kalif מערך דו-מימדי -מוטיבציה כדי לשמור ציונים של 30סטודנטים בכיתה נגדיר מערך בגודל :30 ;]int[] grades = new int[30 אם יש לנו 3כיתות שעבורן נרצה לשמור ציונים של 30סטודנטים בכיתה נצטרך להגדיר 3מערכים: ;]int[] grades1=new int[30], grades2=new int[30], grades3=new int[30 אבל 3הכיתות האלו הן גם אוסף של משתנים מאותו הסוג – מערך של מספרים בגודל 30 לכן נרצה להגדיר מערך שיש בו 3איברים ,וכל איבר הוא מערך בגודל :30 ;]int[][] grades = new int[3][30 33 © Keren Kalif מערך דו-מימדי בהגדרת מערך חד-מימדי מגדירים את מספרהתאים בו (מספר העמודות): ]int[] arr = new int[4]; arr[0] arr[1] arr[2] arr[3 בהגדרת מערך דו-מימדי נגדיר את מספר התאים בו ע"י ציון מספר השורות ומספר העמודות: arr arr arr arr arr arr arr arr ][0][3 ][1][3 ][0][2 ][1][2 ][0][1 ][1][1 ][0][0 ;]int[][] arr = new int[2][4 ][1][0 מערך דו-מימדי הוא למעשה מטריצה ,או ניתן להסתכל עליו כמערך של מערכים 34 © Keren Kalif מימדי-הגדרת מערך דו :מימדי הגדרנו למשל- כדי להגדיר מערך חד double[] numbers = new double[4]; :ובאופן כללי type[] <name> = new type[SIZE]; :מימדי נגדיר למשל- כדי להגדיר מערך דו double[][] numbers = new double[2][4]; : ובאופן כללי type[][] <name> = new type[ROWS][COLS]; 35 © Keren Kalif מערך דו-מימדי פניה לאיברarr arr arr arr arr arr arr arr ][0][3 ][1][3 ][0][2 ][1][2 ][0][1 ][1][1 ][0][0 ;]int[][] arr = new int[2][4 ][1][0 כדי לפנות לאיבר במערך דו-מימדי צריך לציין את מספר השורה ואת מספר העמודה של האיבר אשר איתו אנו רוצים לעבוד למשל ,כדי לשנות את ערכו של האיבר בשורה השנייה בעמודה השלישית: ;arr[1][2] = 5 למשל ,כדי לשנות את ערכו של האיבר בשורה הראשונה בעמודה הראשונה: ;arr[0][0] = 5 36 © Keren Kalif מספר האיבריםint[][] arr = new int[2][4]; arr arr arr arr arr arr arr arr [0][0] [1][0] [0][1] [1][1] [0][2] [1][2] מימדי-מערך דו [0][3] [1][3] arr.length : כדי לדעת כמה שורות יש arr[0].length : כדי לדעת כמה איברים יש בשורה 37 © Keren Kalif מערך דו-מימדי – דוגמא :קליטת ציונים לכמה כיתות והדפסתם -פלט 38 © Keren Kalif קליטת ציונים לכמה:מימדי – דוגמא-מערך דו כיתות והדפסתם public static void main(String[] args) { Scanner s = new Scanner(System.in); final int NUM_CLASSES=3, STUDENTS_IN_CLASS=5; int [][] grades = new int[NUM_CLASSES][STUDENTS_IN_CLASS]; System.out.printf("Please enter grades for students in %d classes:\n", grades.length); for (int i=0 ; i < grades.length ; i++) { System.out.printf("Please enter grades for %d students in class #%d:", grades[0].length, i+1); for (int j=0 ; j < grades[i].length ; j++) grades[i][j] = s.nextInt(); } System.out.println("The grades in all classes:"); for (int i=0 ; i < grades.length ; i++) { System.out.printf("Class #%d: ", i+1); for (int j=0 ; j < grades[i].length ; j++) System.out.print(grades[i][j] + “ “); System.out.println(); } } 39 © Keren Kalif מערך דו-מימדי – דוגמא :קליטת ציונים לכמה כיתות והדפסת הממוצע -פלט 40 © Keren Kalif קליטת ציונים לכמה:מימדי – דוגמא-מערך דו כיתות והדפסת הממוצע public static void main(String[] args) { Scanner s = new Scanner(System.in); final int NUM_CLASSES=3, STUDENTS_IN_CLASS=5; int [][] grades = new int[NUM_CLASSES][STUDENTS_IN_CLASS]; float[] average = new float[NUM_CLASSES]; System.out.printf("Please enter grades for students in %d classes:\n", grades.length); for (int i=0 ; i < grades.length ; i++) { System.out.printf("Please enter grades for %d students in class #%d:", grades[i].length, i+1); int sum=0; for (int j=0 ; j < grades[i].length ; j++) { grades[i][j] = s.nextInt(); sum += grades[i][j]; } average[i] = (float)sum/STUDENTS_IN_CLASS; } System.out.println("The average for each classe:"); for (int i=0 ; i < average.length ; i++) System.out.printf("Average for class #%d: %f\n", i+1, average[i]); } 41 © Keren Kalif מערך דו-מימדי – ייצוגו בזיכרון מערך דו-מימדי נשמר בזכרון כמערך של מערכים: ;]int [][] arr = new arr[2][3 int[][]: arr ]arr[1][2 42 © Keren Kalif ]arr[1][1 ]arr[1][0 ]arr[0][2 ]arr[0][1 ]arr[0][0 מערך דו-מימדי -איתחול ניתן לאתחל מערך דו-מימדי באופן הבא: ;}}int [][] numbers = { {1,2,3}, {4,5,6 ;)System.out.println(numbers.length // 2 System.out.println(numbers[0].length); // 3 int[][]: numbers 6 5 4 3 2 1 ומכאן ניתן לראות כי ניתן לייצר מערך של מערכים שאורכי שורותיו שונים! 43 © Keren Kalif מימדי מאותחל בשורות באורך שונה-מערך דו int [][] numbers = { {1,2,3}, {4,5,6,7}}; System.out.println(numbers.length); // 2 System.out.println(numbers[0].length); // 3 System.out.println(numbers[1].length); // 4 int[][]: numbers 1 2 3 4 5 6 7 מימדי שאורכי שורותיו שווים נקרא מטריצה מלבנית-מערך דו jagged מימדי שאורכי שורותיו שונים נקרא מטריצה-מערך דו 44 © Keren Kalif מימדי מוקצה בשורות באורך שונה-מערך דו public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.print("How many lines? "); int lines = s.nextInt(); int: lines 2 int: cols 3 4 int[][]: numbers 0 0 0 0 0 0 0 int [][] numbers = new int[lines][]; for (int i=0 ; i < numbers.length ; i++) { System.out.print("How many elements int line # " + (i+1) + "? "); int cols = s.nextInt(); numbers[i] = new int[cols]; } } 45 © Keren Kalif מציאת סכום איברי:מימדי – דוגמא-מערך דו האלכסון של מטריצה ריבועית public static void main(String[] args) { int[][] matrix = { {1,1,1,1}, {2,4,4,2}, {3,2,1,0}, {7,6,5,4} }; int sum=0; //System.out.println("The matrix is:"); //for (int i=0 ; i < matrix.length ; i++) { // // // for (int j=0 ; j < matrix[i].length ; j++) System.out.printf("%d\t", matrix[i][j]); System.out.println(); //} :)ניתוח זמן הריצה של תוכנית זו (ללא לולאת הפלט O(main) = O(1) + SIZE*O(SIZE) = O(SIZE2) // calc the sum of the main diagonal for (int i=0 ; i < matrix.length ; i++) for (int j=0 ; j < matrix[i].length ; j++) if (i == j) sum += matrix[i][j]; System.out.println)"The sum of the main diagonal is “ + sum(; } 46 © Keren Kalif מציאת סכום איברי:מימדי – דוגמא-מערך דו )2( האלכסון של מטריצה ריבועית public static void main(String[] args) { int[][] matrix = { {1,1,1,1}, {2,4,4,2}, {3,2,1,0}, {7,6,5,4} }; int sum=0; :)ניתוח זמן הריצה של תוכנית זו (ללא לולאת הפלט O(main) = O(1) + O(SIZE) = O(SIZE) //System.out.println("The matrix is:"); , הדוגמאות פותרות בדרך שונה את אותה הבעיה2 //for (int i=0 ; i < matrix.length ; i++) { לכן נעדיף פתרון זה אשר.אבל בסיבוכיות שונה // for (int j=0 ; j < matrix[i].length!הקודם ; j++) הסיבוכיות שלו קטנה בסדר גודל שלם מהפתרון // // System.out.printf("%d\t", matrix[i][j]); System.out.println(); //} // calc the sum of the main diagonal for (int i=0 ; i < matrix.length ; i++) sum += matrix[i][i]; System.out.println("The sum of the main diagonal is “ + sum); } 47 © Keren Kalif הדפסת הסכום של כל:מימדי – דוגמא-מערך דו עמודה public static void main(String[] args) { int[][] matrix = { {1,1,1,1}, {2,4,4,2}, {7,6,5,4} }; :ניתוח זמן הריצה של תוכנית זו System.out.println("The matrix is:"); O(main) = for (int i=0 ; i < matrix.length ; i++) { O(1) + ROWS*O(COLS) + COLS*O(ROWS) = for (int j=0 ; j < matrix[i].length ; O(ROWS*COLS) j++) System.out.printf("%d\t", matrix[i][j]); System.out.println(); } for (int i=0 ; i < matrix[0].length ; i++) { int sum=0; for (int j=0 ; j < matrix.length ; j++) sum += matrix[j][i]; System.out.printf("The sum of elements in column #%d %d\n", i+1, sum); } 48 © Keren Kalif הכנסת מספרים למטריצה:מימדי – דוגמא-מערך דו בצורת נחש public static void main(String[] args) { int[][] matrix = new int[8][5]; int value = 1; for (int i=0 ; i < matrix.length ; i++) } if (i%2 == 0) for (int j=0 ; j < matrix[i].length; j++) matrix[i][j] = value++; else for (int j= matrix[i].length -1 ; j >= 0 ; j--) matrix[i][j] = value++; { // print matrix for (int i=0 ; i < matrix.length; i++) } for (int j=0 ; j < matrix[i].length ; j++) System.out.printf("%4d", matrix[i][j]); System.out.println(); { { 49 © Keren Kalif מערך רב-מימדי עד כה ראינו מערכים חד-מימדיים ומערכים דו-מימדיים ניתן להרחיב את ההגדרה לכל מספר סופי של מימדים למשל :מערך תלת –מימדי ;]int[][][] matrix = new int[LENGTH][HEIGHT][DEPTH דוגמא לשימוש :נרצה לשמור ממוצע ציונים עבור 5בתי-ספר ,כאשר בכל בית-ספר יש 10כיתות ,ובכל כיתה 30סטודנטים: ;]double[][][] average = new int[5][10][30 במקרה זה נשתמש בלולאה ,בתוך לולאה ,בתוך לולאה.. 50 © Keren Kalif 51 © Keren Kalif הספר-מימדי – דוגמאת נתוני בתי-מערך רב public static void main(String[] args) { float[][][] grades = { { {90, 100, 95, 88}, {87, 70, 90, 98} }, { {88, 75, 80, 60}, {55, 87, 90, 82} }, { {60, 91, 40, 95}, {77, 66, 88, 99} } }; for (int i=0 ; i < grades.length; i++) { System.out.printf("Classes in school #%d:\n", i+1); for (int j=0 ; j < grades[i].length; j++) { System.out.printf(" Grades in class #%d: ", j+1); for (int k=0 ; k < grades[i][j].length; k++) System.out.printf("%.2f ", grades[i][j][k]); System.out.println(); } System.out.println(); } } לולאת FOR-EACH ראינו שניתן לעבור על ערכי המערך בלולאה באמצעות פנייה לתוכן שבאינדקס מסויים: )for (int i=0 ; i < arr.length ; i++ ;)“ “ System.out.print(arr[i] + ניתן לעבור על איברי המערך ללא אינדקס: 52 © Keren Kalif ביחידה זו למדנו: מהו מערך כיצד מערך נראה בזיכרון גישה לאיברי המערך אתחול מערך חריגה מגבולות המערך השמת מערכים מערך דו-מימדי מערך רב-מימדי לולאת for-each 53 © Keren Kalif תרגילי חימום: .1 .2 .3 .4 .5 .6 הגדר מערך בגודל 10של מספרים שלמים וקלוט לתוכו ערכים .הצג רק ערכים שהם זוגיים. הגדר מערך בגודל 10של תווים וקלוט לתוכו ערכים .הצג את האינדקסים שבתוכם ישנו תו שהוא אות גדולה. הגדר מערך של מספרים בגודל 10ושים בתוכו לפי הסדר ערכים שהם כפולות של :3כלומר הערכים 6 ,3 ,0וכו'. הגדר מערך של מספרים שלמים וקלוט לתוכו ערכים .הגדל ב 1 -את הערכים שנמצאים במיקומיים זוגיים ( 4 ,2 ,0וכו'). הגדר מערך של מספרים שלמים בגודל 10וקלוט לתוכו ערכים. הגדל ב 1 -את הערכים שנמצאים במיקומיים זוגיים ( 4 ,2 ,0וכו') ואח"כ הקטן ב 1-את הערכים שנמצאים במיקומים שהם כפולה של 6 ,3 ,0( 3וכו'). 54 © Keren Kalif תרגילי חימום: .6 .7 .8 .9 .10 הגדר מערך של תווים וקלוט לתוכו ערכים ,וכן קלוט תו נוסף .הצג כמה פעמים התו הנוסף שהתקבל מופיע במערך. הגדר שני מערכים של מספרים שלמים בגודל 5כל אחד .קלוט ערכים לתוך המערך הראשון ואז קלוט ערכים לתוך המערך השני. הצג את המיקומים אשר הערכים בהם בשני המערכים זהים. הגדר 3מערכים של מספרים שלמים בגודל 5כל אחד .קלוט ערכים לתוך המערכים הראשון והשני .שים בכל איבר במערך השלישי את סכום האיברים במיקומים התואמים במערכים הראשון והשני. הגדר מערך של 5תווים וקלוט לתוכו ערכים .בדוק האם כל התווים שהוקלדו למערך זהים והציגו הודעה מתאימה. הגדר מערך של 5מספרים שלמים וקלוט לתוכו ערכים .בדוק האם ערך כל איבר גדול מערך האיבר שלפניו והצג בסוף הודעה מתאימה. 55 © Keren Kalif תרגיל :1 כתוב תוכנית המגדירה מערך בגודל 10של מספרים שלמים קלוט ערכים מהמשתמש ,והדפס את האינדקסים של האיברים שערכם שווה לערך המינימלי במערך כמו כן יש להדפיס את מספר האינדקסים שבתוכם יש ערך השווה לערך המינימלי דוגמא: 6 14 12 14 12 5 14 6 5 5 עבור המערך יש להדפיס ( 5 8 9כי 5הוא המינימלי והוא נמצא באינדקסים אלו) וכן להדפיס את הערך ,3מאחר והערך המינימלי מופיע 3פעמים. 9 56 © Keren Kalif 8 7 6 5 4 3 2 1 0 תרגיל :2 כתוב תוכנית והגדר בה מטריצה ריבועית של תווים בגודל SIZE יש לשים את התו '*' על איברי האלכסון הראשי והמשני ורווח בשאר האיברים (לדמות את הצורה )X הדפס את המטריצה למשל ,עבור SIZE=5המטריצה תראה כך: * * * * * * * 57 © Keren Kalif * * תרגיל :3 כתוב תוכנית והגדר בה מטריצה בגודל ROWSxCOLSשל מספרים קלוט לתוכה ערכים מהמקלדת קלוט מהמשתמש מספר והדפס את האינדקס של העמודה בה המספר שהוקלד מופיע הכי הרבה פעמים אם התו כלל לא מופיע במטריצה יש לתת הודעה מתאימה שימו לב :אין לעבור על המטריצה בהתחלה כדי לבדוק זאת! למשל ,עבור המטריצה הבאה והמספר 3יוצג 2כי המספר 3מופיע הכי הרבה פעמים בעמודה 2 58 © Keren Kalif 8 1 3 9 1 2 7 5 2 0 3 4 3 3 6
© Copyright 2024