System.out.println(“YES”)

‫מבוא למדעי המחשב‬
‫ושפת ‪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 :‬מאפשר לנו לקבוע נקודות‬
‫עצירה לאורך הקוד ולעקוב בפירוט על ביצוע‬
‫הפקודות‬