מבוא למדעי המחשב ושפת Java מפגש שביעי • לולאות מקוננות • מערכים דו מימדיים • תוים ומחרוזות לולאות מקוננות מזכיר את עיקרון ה if -המקונן שימוש בלולאות שלמדנו בצורה מקוננת { )for (int i = 1; i <= 10; i++ )for (int j = 1; j <= 10; j++ ;)”System.out.print(i * j + “\t ;)(System.out.println } טבלאות מעקב for (int i = 1; i <= 3; i++) { i j 1 1 1 2 1 3 2 1 2 2 2 4 6 2 3 3 6 9 3 1 3 2 3 3 for (int j = 1; j <= 3; j++) System.out.print(i * j + “\t”); System.out.println(); } 1 2 3 דוגמא – הדפסת תפריט שבועי תוכנית שמדפיסה כמות קלוריות מקסימלית לתפריט דיאטטי שבועי Sat Fri Thu Wed Tue Mon Sun 300 200 250 250 250 250 250 Breakfast 1200 500 1000 1000 1000 1000 1000 Lunch 250 800 300 300 300 300 300 Dinner public class DietTable { public static void main () { CaloriesCalculator slimMe = new CaloriesCalculator(); String[] days = {“Sun”, “Mon”, “Tue”, “Wed”, “Thu”, “Fri”, “Sat”}; String[] meal = {“Breakfast”, “Lunch”, “Dinner”}; System.out.print(“The new and improved diet table – success guaranteed!!!"); for (int i = 0; i < days.length; i++) System.out.print(days[i] + “\t”); System.out.println(); for (int i = 0; i < 3; i++) { System.out.print(meal[i] + “\t”); for (int j = 0; j < 7; j++) System.out.print(slimMe.calculateCalories(meal[i], days[j]) + “\t”); } } } System.out.println(); דוגמא נוספת תרגיל :כתבו תוכנית שמקבלת מהמשתמש מספר ומדפיסה את כל המספרים הראשוניים בין 2למספר שנקלט מהמשתמש (כולל) ;int i )for (i = 2; i < number; i++ )if (number % i == 0 ;break )if (i == number ;)"System.out.println("Prime else ;)"System.out.println("Not Prime פתרון public class Prime { public static void main () { int number, i; Scanner scan = new Scanner(System.in); System.out.print("Please enter a number: "); number = scan.nextInt(); for (int j = 2; j <= number; j++) { for (i = 2; i < j; i++) if (j % i == 0) break; if (i == j) System.out.print(j + “ ”); } } } מספר לולאות מקוננות שאלה :כמה כוכביות יודפסו על המסך אחרי הרצת הקוד הבא: )for (int i = 0 ; i < 10; i++ )for (int j = 5; j <= 14; j++ )for (int k = -12; k < -2; k++ ;)"*"(System.out.print )מספר לולאות מקוננות (המשך ?ועכשיו for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) System.out.print("*"); for (int k = 0; k < 10; k++) System.out.print("*"); } דוגמא נוספת תרגיל :כתבו תוכנית שמדפיסה משולש הפוך שמורכב מכוכביות (השורה העליונה בנוייה מ11 - כוכביות וכל שורה קטנה ב 2 -כוכביות מקודמתה) סה"כ 6שורות *********** ********* ******* ***** *** * הפתרון int maxStars = 11; int maxSpaces = maxStars / 2 + 1; for (int i = 0; i <= maxSpaces ; i++) { for (int j = 0; j < i; j++) // print spaces System.out.print(" "); for (int j = 0; j < maxStars - i * 2; j++) //print * System.out.print("*"); System.out.println(); // new line } שכלול התרגיל שכללו את התרגיל כך שניתן יהיה להגדיר את גודל המשולש – מספר השורות ממנו הוא מורכב (בדוגמא מספר השורות הינו )6 ;)(• int lines = scan.nextInt = • maxSpaces = • maxStars שכלול נוסף של התרגיל שכללו את התרגיל כך שיודפסו שני משולשים הפוכים ,הנוגעים ראש בראש ********* ******* ***** *** * * *** ***** ******* ********* מערך דו מימדי בלוק דו מימדי של תאי זיכרון שמחזיקים משתנים מאותו טיפוס (פשוטים או אובייקטים) מאפשר לאחסן ערכים רבים (ללא צורך במשתנים רבים) ובסדר מסויים גודלו של המערך הדו מימדי נקבע עם יצירתו ולא ניתן לשינוי מערך דו מימדי -דוגמא מערך דו מימדי של intבגודל ( 4X5סה"כ 20 תאים המכילים משתנים מסוג )int עמודות שורות ;]int[][] numArray = new int[4][5 גישה לתא בשורה 1בעמודה 3תעשה ע"י: ;]int number = numArray[1][3 מערכים דו מימדיים ולולאות מקוננות הדפסת מערך דו מימדי שמכיל מספרים ממשיים final int ROWS = 6; final int COLUMNS = 9; double[][] numbers = new double[ROWS][COLUMNS]; for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLUMNS; j++) System.out.print(numbers[i][j] + " "); System.out.println(); } גודל של מערך דו מימדי :נתון הקוד הבא Scanner scan = new Scanner(System.in); System.out.print(“Please enter 2 integers for the size of the 2-dimentional array: “); int row = scan.nextInt(); int col = scan.nextInt(); double[][] numbers = new double[row][col]; … גודל של מערך דו מימדי במיקום אחר בקוד אני נדרש להדפיס את המערך for (int i = 0; i < numbers.length; i++) { int rowLength = numbers[i].length; for (int j = 0; j < rowLength ; j++) System.out.print(numbers[i][j] + " "); System.out.println(); } )מערכים דו מימדיים ולולאות מקוננות (המשך כתבו תוכנית שמייצרת מערך דו מימדי:תרגיל שמכיל את לוח הכפל final int SIZE = 10; int[][] multiBoard = new int[SIZE][SIZE]; int i, j; for (i = 0; i < multiBoard.length; i++) { for (j = 0; j < multiBoard[i].length; j++) multiBoard[i][j] = ((i + 1) * (j + 1)); } הצהרה ,יצירה והשמה בדומה למערך חד מימדי ניתן לאתחל את המערך בערכים בזמן ההצהרה והיצירה שלו { = int[][] grades {77, 98, 80, 100}, {89, 65, 99}, }{87, 90, 66, 95 ;} ההצהרה וההשמה חייבים להופיע בפקודה אחת יצירת מערך דו מימדי – חלוקה לשלבים :כשאנחנו כותבים את הפקודה הבאה double[][] numbers = new double[ROWS][COLUMNS]; : בעצם מבצעת עבורנו את הפקודות הבאותjava double[ ][ ] numbers; numbers = new double[ROWS][ ]; for (int i = 0; i < ROWS; i++) numbers[i] = new double[COLUMNS]; !מערך דו מימדי זה גם אובייקט heap -מערך דו מימדי הוא גם אובייקט שממוקם ב int[][] numArray; undefined undefined undefined undefined undefined undefined numArray Heap Memory !מערך דו מימדי זה גם אובייקט heap -מערך דו מימדי הוא גם אובייקט שממוקם ב int[][] numArray = new int[4][5]; 0 1 0 1 2 3 4 0 1 2 3 4 undefined undefined undefined 2 0 1 2 3 4 0 1 2 3 4 3 34866 undefined Heap undefined 34866 Memory numArray !מערך דו מימדי זה גם אובייקט heap -מערך דו מימדי הוא גם אובייקט שממוקם ב numArray[2][4] = 6; 0 1 0 1 2 3 4 0 1 2 3 4 undefined 6 undefined 2 0 1 2 3 0 1 2 3 4 3 34866 undefined Heap 4 undefined undefined 34866 Memory numArray מערך דו מימדי עם שורות בגדלים שונים כאמור מערך דו מימדי הינו מערך של מערכים, לכן ניתן להגדיר מערך דו מימדי שגודל כל שורה בו שונה ;][]int[][] example = new int[4 ;]example[0] = new int[5 ;]example[1] = new int[4 ;]example[2] = new int[3 ;]example[3] = new int[5 מערך דו מימדי עם שורות בגדלים שונים :כך זה ייראה בזיכרון 0 1 0 1 2 3 0 1 2 3 4 undefined undefined undefined 2 0 1 2 0 1 2 undefined 3 34866 undefined Heap 3 4 34866 Memory example מערך דו מימדי עם שורות בגדלים שונים ?example.length למה שווה עכשיו ?example[1].length = example[2].length האם 0 1 0 1 2 3 0 1 2 3 4 undefined undefined undefined 2 0 1 2 0 1 2 undefined 3 34866 undefined Heap 3 4 34866 Memory example מערך תלת מימדי ו... ניתן גם להגדיר מערך תלת מימדי: ;]int[][][] array3D = new int[5][5][5 וגם ארבע מימדי: ;]int[][][][] array4D = new int[5][5][5][5 והשמיים הם הגבול... תרגיל נוסף כתבו מחלקה בשם GradesStatistics שמייצגת מאגר ציונים של תלמידים בחמישה מקצועות שונים (לכל תלמיד נשמרים הציונים בכל אחד מ 5 -המקצועות) תרגיל נוסף :המחלקה צריכה לכלול את המתודות הבאות public GradesStatistics(int maxStudentNum) public int addGradesPerStudent(int[] grades) public double calculateAverageByStudent(int studentId) public double calculateAverageByCourse(int courseNumber) public void printGradesByStudent(int studentId) public void printGradesByCourse(int courseNumber) public String toString() public class GradesStatisticsTester { public static void main(String[] args) { GradesStatistics statistics = new GradesStatistics(10); int int int int int [] [] [] [] [] grades1 grades2 grades3 grades4 grades5 int int int int int studentId1 studentId2 studentId3 studentId4 studentId5 = = = = = = = = = = {100, 100, 89, 98, 78}; {56, 80, 67, 98, 100}; {80, 80, 80, 80, 80}; {100, 100, 80, 80, 90}; {55, 40, 61, 12, 66}; statistics.addGradesPerStudent(grades1); statistics.addGradesPerStudent(grades2); statistics.addGradesPerStudent(grades3); statistics.addGradesPerStudent(grades4); statistics.addGradesPerStudent(grades5); double averageForStudent3 = statistics.calculateAverageByStudent(studentId3); statistics.printGradesByStudent(studentId3); System.out.println("The average of student 3 is: " + averageForStudent3); double averageForCourse2 = statistics.calculateAverageByCourse(2); statistics.printGradesByCourse(2); System.out.println("The average of course 2 is: " + averageForCourse2); } } System.out.println(statistics); GradesStatistics public class GradesStatistics { // instance variables - replace the example below with your own private final int NUMBER_OF_COURSES = 5; private int[][] _grades; private int _actualStudentNum; public GradesStatistics(int maxStudentNum) { // initialise instance variables _grades = new int[maxStudentNum][NUMBER_OF_COURSES]; _actualStudentNum = 0; } GradesStatistics public int addGradesPerStudent(int[] grades) { if (_actualStudentNum < _grades.length) { for (int i =0; i < grades.length; i++) { _grades[_actualStudentNum][i] = grades[i]; } return ++_actualStudentNum; } else return -1; } GradesStatistics public double calculateAverageByCourse(int courseNumber) { double sum = 0; for (int i =0; i < _actualStudentNum; i++) sum += _grades[i][courseNumber - 1] ; return (sum/_actualStudentNum); } public double calculateAverageByStudent(int studentId) { double sum = 0; for (int i =0; i < NUMBER_OF_COURSES; i++) sum += _grades[studentId][i] ; return (sum/NUMBER_OF_COURSES); } GradesStatistics public void printGradesByStudent(int studentId) { String output = "Student id: " + studentId + "\n"; for (int i =0; i < NUMBER_OF_COURSES; i++) output += ("Course Number: " + i + " Grade: " +_grades[studentId][i] +"\n"); System.out.print(output); } public void printGradesByCourse(int courseNumber) { String output = "Course number: " + courseNumber + "\n"; for (int i =0; i < _actualStudentNum; i++) output += ("Student Id: "+ i+" Grade: " +_grades[i][courseNumber-1] +"\n"); System.out.print(output); } GradesStatistics public String toString() { String output = ""; for (int i =0; i < _actualStudentNum; i++) { output += ("Student id: " + i + " "); for (int j =0; j < NUMBER_OF_COURSES; j++) output += ("Course Number: " + j +" Grade: " +_grades[i][j]+" "); output += "\n"; } return output; } } מחרוזות ותוים מייצג תו בודד – אות – char ;’char c = ‘a המשתנה cמכיל את התו ’ ‘aשזהו בעצם ערך מספרי לפי טבלת ASCII American Standard Code for Information Interchange לכל תו יש ערך מספרי בטבלת ASCIIלמשל הערך של aהינו .97 כתוב תוכנית המקבלת תו מהמשתמש ומדפיסה את הערך ה ASCII -שלו ASCII טבלת תוים char c1 = a; ?חוקי char c1 = ‘a’, c2 = ‘b’; if (c1 < c2) System.out.print( “YES”(; abc -• הדפס את כל תוי ה for (char c = ‘a’; c<= ‘z’; c++) System.out.print(c(; תוים שיטה שבודקת האם תו שהוקלד ע"י המשתמש הינו תו גדולות או קטנות,abc-ב boolean isInAbc(char c) { if ((‘a’ <= c && c <= ‘z’) || (‘A’ <= c && c <= ‘Z’)) return true; return false; } תוים שיטה המקבלת תו מהמשתמש ,אם הוא אות קטנה ,היא הופכת אותו לאות גדולה .למשל את aלA - { )char low2High(char c { )’if (‘a’ <= c && c <= ‘z ;)’c -= (‘a’ – ‘A } ;return c } מחרוזות • מחרוזת היא רצף של תוים String מחרוזת מוגדרת כמחלקהJava – • ב • String str = “Hello World”; • String str1 = new String (“Hello World”); if (str == str1) System.out.println(“YES”); else System.out.println(“NO”); השוואה- מחרוזות שלequals • על מנת להשוות בין מחרוזות נשתמש בשיטה . השיטה עוברת תו תו ומשווה,String המחלקה String s1 = new String (“Hello”); String s2 = new String (“Hello”); if (s1.equals(s2)) System.out.println(“YES”); else System.out.println(“NO”); equalsIgnoreCase - • השוואה ללא תלות בגודל האות מחרוזות – קבלת תו • על מנת לקבל תו מסויים במחרוזת נשתמש בשיטה ) charAt(int indexשל String • אפשר להתייחס אל מחרוזת כאל מערך של תוים ,לכן ) charAt(0יחזיר את התו הראשון של המחרוזת. ;)”String s1 = new String (“Hello World ;)char c = s1.charAt(2 ;)c = s1.charAt(10 ;)c = s1.charAt(22 • בצורה כזו אפשר לבדוק את ערכו של כל תו במחרוזת מחרוזות – חיפוש אינדקס של תו • על מנת לקבל את האינדקס בו נמצא תו מסויים במחרוזת נשתמש בשיטה ) indexOf(char cשל String ;)”String s1 = new String (“Hello ;)’int i = s1.indexOf(‘e ;)’i = s1.indexOf(‘l מחזיר את האינדקס של התו הראשון שנמצא מתאים )indexOf(char c, int fromIndex התחל האינדקס i = s1.indexOf(‘l’, 3); // 3 מחרוזות – תת מחרוזת • על מנת לקבל מחרוזת חלקית של מחרוזת נתונה נשתמש בשיטה ) substring(int beginIndxשל Stringהמחזירה תת מחרוזת המתחילה באינדקס הנתון ;)”String s1 = new String (“Hello ;)String s2 = s1.substring(1 • ניתן לקבל תת מחרוזת המתחילה באינדקס מסויים ונגמרת באינדקס מסויים )substring(int beginIndx, int endIndx ;)s2 = s1.substring(2, 4 מחרוזות – תרגול • שיטה המחזירה את האינדקס האחרון של תו מסויים lastIndexOf(string s, char c) • String s = “abccabccca”; • int i = lastIndexOf(s, ‘b’); • שיטה המחזירה את מספר האותיות במחרוזת numOfLetters(string s) • string s = “as#$ fd !@?”; • int num = numOfLetters(s); תרגיל נגדיר שפה חדשה ,שהמילים בה מצייתות לכללים הבאים: האותיות החוקיות היחידות בשפה הן.a, b, c : כל תו אחר אסור לשימוש כל מילה חייבת להתחיל באות a מספר ה b -במילה חייב להיות זוגי אחרי כל אות cבמילה חייבות לבוא שתי אותיות a תרגיל (המשך) דוגמאות למילים חוקיות: a, abba, acaabcaab, abbabbababcaa המילים הבאות אינן חוקיות: – abbbמספר ה b-אינו זוגי – bbמילה חייבת להתחיל באות a – abcabאחרי כל cחייבות לבוא שתי a – abdfbהאותיות dו f-אינן שייכות לשפה )תרגיל (המשך אםtrue כתבו מתודה שמקבלת מילה ומחזירה אחרתfalse -המילה חוקית בשפה ו public class WordValidator { public boolean isValid(String word) { … } } import java.util.Scanner; public class Tester { public static void main() { driver class Scanner scan = new Scanner(System.in); WordValidator wordValid = new WordValidator(); String word; System.out.println("Welcom to the words validator!!!"); System.out.print("Please enter a word to validate: "); word = scan.next(); while( !word.equals("quit")) { if(wordValid.isValid(word)) System.out.println(word + " is a valid word"); else System.out.println(word + " is not a valid word"); System.out.print("Another word? (type quit to exit): "); } } } word = scan.next(); System.out.println("Thank you for using Word Validator!"); public boolean isValid(String word) { boolean valid = true; // flag to indicate if the word is valid or not int i, bCount = 0; char temp; // not starting with 'a' if (word.charAt(0) != A) valid = false; // run over the rest of the word, stop in the end, or if some rule was broken for (i = 1 ; i < word.length() && valid ; i++) { // save the current letter temp = word.charAt(i); // if 'b' found = count it if (temp == B) bCount++; // if 'c' was found: else if (temp == C) { // first check that it's not the last or one before last. If yes - there can't be two 'a' after it, and the rule is broken if (i == word.length() - 1 || i == word.length() - 2) valid = false; // if not - check the next two characters, looking for 'a' else if(word.charAt(i+1) != A || word.charAt(i+2) != A) valid = false; } // if the current character is not 'a', 'b' or 'c' - illegal word else if (temp != A) valid = false; } // for // check if the number of 'b' is even if (bCount % 2 != 0) valid = false; // valid contains true if the word is legal, and false otherwise. return valid; } עבודה עם הdebugger - באג ( – (bugשגיאה שאנחנו עושים במהלך כתיבת הקוד של התוכנית BlueJנותנת לנו כלי לאיתור שגיאות וטיפול בהן הכלי – debugger :מאפשר לנו לקבוע נקודות עצירה לאורך הקוד ולעקוב בפירוט על ביצוע הפקודות
© Copyright 2024