מבוא לתכנות ב- JAVA תרגול 5
מה בתרגול מחרוזות מערכים דו ממדיים
מחרוזות (Strings) מחרוזת היא רצף של תווים. immutable על מנת ליצור ולטפל במחרוזות נשתמש במחלקה String למחלקה String מתודות שונות שמאפשרות פעולות על מחרוזות
פעולות על מחרוזות יצירת מחרוזת: String str = new String(); String str2 = new String("This is a sequence of chars"); String str3 = "abcd"; פעולות: אתחול המחרוזת length() מחזיר את אורך המחרוזת charat(i) מחזיר את התו במקום ה- i במחרוזת )התו הראשון נמא באינדקס 0 ) j כולל )לא j ועד i מחזיר את תת המחרוזת החל מאינדקס substring(i,j) -substring(i) מחזיר את תת המחרוזת החל מאינדקס i ועד סוף המחרוזת other) equals(string האם 2 מחרוזות שוות operator+ - שרשור מחרוזות
דוגמא מה יודפס? String str = ""; for (char i='a' ; i <= 'z' ; i++){ str = str + i; System.out.println(str.charAt(0)); System.out.println(str.length()); System.out.println(str.substring(7, 10)); System.out.println(str); א. a 26 hij abcdefghijklmnopqrstuvwxyz ב. שגיאה ג. a 27 ghi abcdefghijklmnopqrstuvwxyz
תרגיל מחרוזת בסדר הפוך str הדפסת מחרוזת בסדר הפוך השלימו את הקוד כך שהמחרוזת strrev תכיל את המחרוזת בסדר הפוך. לדוגמא: אם Hello str = אזי olleh strrev = Scanner sc = new Scanner(System.in); String str = sc.next(); //read a string String strrev =""; //Fill here the code System.out.println(strRev);
תרגיל מחרוזת בסדר הפוך פתרון Scanner sc = new Scanner(System.in); String str = sc.next(); //read a string String strrev =""; for (int i = str.length()-1; i >= 0; i--){ strrev += str.charat(i); System.out.println(strRev);
דוגמה - צופן קיסר סכמה של צופן כללי: מבוא למדעי המחשב, בן גוריון 8
דוגמה - צופן קיסר צופן )Cipher( הוא אלגוריתם ומחזיר טקסט מוצפן. הצפנה, המקבל קריא טקסט ומפתח, צופן קיסר מבוסס על רעיון החלפת האותיות של הטקסט הקריא, לשם יצירתו של הטקסט המוצפן: האלפבית המשמש להצפנה מוסט מעגלית במספר קבוע של 'מקומות' מן האלפבית הרגיל. המפתח )key( = מספר מקומות ההסטה. לפי עדויות היסטוריות יוליוס קיסר עשה בשיטה זו שימוש נרחב. מבוא למדעי המחשב, בן גוריון 9
דוגמה - צופן קיסר למשל, בהזזה של 3 מקומות המילה BABY תתורגם... למילה.EDEB מבוא למדעי המחשב, בן גוריון 10
טבלת ASCII מבוא למדעי המחשב, בן גוריון 11
public static void main(string[] args) { String str = "BEN GURION UNIVERSITY"; int key = 3; String ans = ""; final int ALPHABET_SIZE = 26; for (int i = 0; i < str.length(); i++) { char c = str.charat(i); if (c >= 'A' && c <= 'Z') { //??? ans = ans + c; System.out.println(ans); מבוא למדעי המחשב, בן גוריון 12
public static void main(string[] args) { String str = "BEN GURION UNIVERSITY"; int key = 3; String ans = ""; final int ALPHABET_SIZE = 26; for (int i = 0; i < str.length(); i++) { char c = str.charat(i); if (c >= 'A' && c <= 'Z') { int num = c - 'A'; num = (num + key) % ALPHABET_SIZE; c = (char) (num + 'A'); ans = ans + c; System.out.println(ans); מבוא למדעי המחשב, בן גוריון 13
דוגמה - צופן קיסר שאלה: מהי פעולת פענוח )decrypt( של צופן קיסר? שאלה: בהינתן טקסט מוצפן - לדעת את המפתח? כיצד ניתן לגלות את הטקסט הקריא מבלי מבוא למדעי המחשב, בן גוריון 14
דוגמה - צופן קיסר שאלה: מהי פעולת פענוח )decrypt( של צופן קיסר? תשובה: בדומה להצפנה, מלבד חיסור של מפתח ההזזה במקום חיבורו. שאלה: בהינתן טקסט מוצפן - לדעת את המפתח? כיצד ניתן לגלות את הטקסט הקריא מבלי תשובה: ניתן לנסות את כל ההסטות האפשריות את התוצאה למילון. )כמה כאלו יש?( ולהשוות מבוא למדעי המחשב, בן גוריון 15
מערך דו ממדי מערך של מערכים חד ממדיים )ניתן באותו אופן לדבר על מערכים רב מימדיים( פנייה לאיברי המערך נעשית תוך שימוש בשני אינדקסים int[][] a = new int[3][4]; int[][] arr = {{1,0,{1,2,3,{1,4,5,7; 1 0 1 2 3 1 4 5 7
דוגמא הדפסת איברי המערך int[][] a = {{1,0,{1,2,3,{1,4,5,7,{7,9,13,14; for (int i = 0; i < a.length; i++){ for (int j = 0; j < a[i].length; j++){ System.out.print("["+ a[i][j] +"]"); System.out.println();
תרגיל העתקת מערכים copy( )Deep b השלימו את הקוד כך שמערך a יועתק למערך int[][] a = {{1,2,3,4,{2,5,1,{7,7,7,7,{1; int[][] b; //Fill here the code
Deep copy vs shallow copy int[] a = {1,2,3,4; int[] b = {2,5,1; b = a; a[0] = 777; System.out.println(b[0]);
Deep copy vs shallow copy int[] a = {1,2,3,4; int[] b = {2,5,1; b = a; a[0] = 777; System.out.println(b[0]); Source: http://stackoverflow.com/a/184780
תרגיל העתקת מערכים copy( )Deep פתרון int[][] a = {{1,2,3,4,{2,5,1,{7,7,7,7,{1; int[][] b; b = new int[a.length][]; for (int i = 0; i < a.length; i++){ b[i] = new int[a[i].length]; for (int j = 0; j < a[i].length; j++){ b[i][j] = a[i][j];
תרגיל חיבור מטריצות כתבו תוכנית המגדירה 2 מטריצות a,b מטריצה c אשר תהיה חיבור המטריצות. תזכורת: חיבור מטריצות הינו החיבור במטריצות )כלומר האיבר במקום ה- i,j במקום ה- i,j במטריצה ב'(. לדוגמא: בגודל 4X4, ומגדירה של איברים במטריצה א' מתאימים עם האיבר 22
תרגילים מערך דו מימדי // Adds two matrices public class Add{ public static void main(string[] args){ פתרון: int[][] a ={{1,4,-2,3,{-1,2,5,3,{9,10,-94,12,{0,1,-5,3; int[][] b ={{2,-4,5, 3,{7,9,-7,6,{12,-5,3,6,{-4,2,1,12; int[][] c = new int[a.length][a[0].length]; for (int i = 0 ;i<a.length;i=i+1) for (int j =0;j< a[i].length;j= j+1) c[i][j] = a[i][j] + b[i][j]; //main //class Add 23
if (ismagic){ System.out.println("Magic square!"); else{ System.out.println("Not a magic square"); Magic squares תרגיל ריבוע קסם הוא מטריצה ריבועית בגודל n*n שבה סכום האיברים בכל שורה, עמודה והאלכסון הראשי הוא זהה. בנוסף, כל איבר מופיע בדיוק פעם אחת והוא מהתחום.1 n*n השלימו את הקוד הבא כך שהתוכנית תוודא האם mat הוא ריבוע קסם או לא )הניחו כי האיברים ב- mat הם מהתחום )1 n*n int n = ; int[][] mat = ; boolean ismagic = true; //Fill here the code
Magic squares תרגיל //compute the diagonal sum for(int i=0; i < mat.length; i++){ sumdiagonal += mat[i][i]; פתרון int sumrow, sumcol; int[] occ = new int[n*n]; // check sum condition for each row and column and count occurences for (int i = 0; i < mat.length && ismagic; i++){ sumrow = 0; sumcol = 0; for(int j = 0; j < mat[i].length; j++){ occ[mat[i][j]-1]++; sumrow += mat[i][j]; sumcol += mat[j][i]; if (sumrow!= sumdiagonal sumcol!= sumdiagonal){ ismagic = false; המשך בשקף הבא
Magic squares תרגיל // check that each i in [1,...,n] appears only once for (int i = 0; i < n*n && ismagic; i++){ if (occ[i]!= 1){ ismagic = false; if (ismagic){ System.out.println("Magic square!"); else{ System.out.println("Not a magic square");