מבוא למדעי המחשב – סמסטר א' תשע"ב

Slides:



Advertisements
Similar presentations
תוכנה 1 סמסטר א ' תשע " ב תרגול מס ' 7 * מנשקים, דיאגרמות וביטים * לא בהכרח בסדר הזה.
Advertisements

מבוא למדעי המחשב לתעשייה וניהול
מבוא למדעי המחשב לתעשייה וניהול דוגמאות ותרגול נוסף במערך חד ממדי הרצאה 12.
מערכים ומטריצות קרן כליף.
1 מבוא למדעי המחשב הקצאה דינאמית. 2 הקצאת זיכרון דינאמית  כאשר אנו משתמשים במערכים, אנו מקצים אוטומטית את הזיכרון המקסימלי שנצטרך.  בפועל, אנו משתמשים.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
מה החומר למבחן ? כל החומר שנלמד בהרצאות ובתרגולים. לגבי backtracking: לא תידרשו לממש אלגוריתם, אך כן להבין או להשלים מימוש נתון. אחת משאלות המבחן מבוססת.
תכנות תרגול 4 שבוע : לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
11 Introduction to Programming in C תרגול
1 Formal Specifications for Complex Systems (236368) Tutorial #5 Refinement in Z: data refinement; operations refinement; their combinations.
מבוא למדעי המחשב תרגול 4 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא למדעי המחשב © אריק פרידמן 1 מצביעים כמערכים דוגמה.
א " ב, מילים, ושפות הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 1.
שיעור שישי: מערכים ופונקציות
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
מבוא למדעי המחשב מחרוזות, מצביעים וכתובות
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site : T.A. :Emilia Katz.
תכנות תרגול 6 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
תכנות – שיעור 7. חזרה -מערכים נגדיר בעזרתו קבוצת משתנים כאשר יהיה לנו מספר רב של משתנים זהים נגדיר בעזרתו קבוצת משתנים כאשר יהיה לנו מספר רב של משתנים.
מערכים מבוא לתכנות למנע"ס - שבוע מספר 8 - מאיר קומר - סמסטר ב' - תשס"ו והנה בעיה כתוב תוכנית אשר תקלוט 36 מספרים ותדפיס כמה מתוכם גדולים יותר מהממוצע.
מבוא כללי למדעי המחשב תרגול 3. לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
קורס תכנות – סימסטר ב ' תשס " ח שיעור שישי: מערכים
מבוא למדעי המחשב תרגול 6 - מערכים שעת קבלה : יום שני 11:00-12:00 דוא " ל :
Data Structures, CS, TAU, Perfect Hashing 1 Perfect Hashing בעיה : נתונה קבוצה S של n מפתחות מתחום U השוואה ל - Hash : * טבלה קבועה (Hash רגיל - דינאמי.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
עקרון ההכלה וההדחה.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
תוכנה 1 - תרגול שיעור 10 Pointers (2) שולי לב יהודי
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
1 מבוא למדעי המחשב backtracking. 2 מוטיבציה בעיית n המלכות: נתון: לוח שחמט בגודל. המטרה: לסדר על הלוח n מלכות כך שאף אחת לא תאיים על השנייה. דוגמא: עבור.
1 תרגול 3 - מערכים מבוא למדעי המחשב – סמסטר א' תשע"א.
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
הגדרת משתנים יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר 2015 יום שישי 18 ספטמבר.
Practice session 3 תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי ) שיטות חישוב : Applicative & Normal Evaluation Partial Evaluation.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 7. סברוטינות subroutines.
Practice session 3.  תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי )  שיטות חישוב : Applicative & Normal Evaluation.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 6. מפעל השעווה – לולאות  עד עכשיו  טיפלנו בייצור נרות מסוג אחד, במחיר אחיד  למדנו להתמודד עם טיפול במקרים שונים.
מבנה נתונים ואלגוריתמים ) לשעבר - עיבוד מידע( ד"ר אבי רוזנפלד ד"ר אריאלה ריכרדסון.
Programming Arrays.
Tirgul 12 Trees 1.
Computer Architecture and Assembly Language
מבוא למדעי המחשב סיבוכיות.
הקצאות דינאמיות בשילוב מבנים
מ- JAVA ל- C קרן כליף.
מצביעים קרן כליף.
SQL בסיסי – הגדרה אינדוקטיבית
מערכים קרן כליף.
הקצאות דינאמיות קרן כליף.
מבנים קרן כליף.
פרוקטוז, C6H12O6 , חד-סוכר מיוחד
Introduction to Programming in C
מצביעים קרן כליף.
מערכים ומטריצות קרן כליף.
תרגול 4.
סוגי משתנים קרן כליף.
מבוא למדעי המחשב – סמסטר א' תשע"ד
מחרוזות קרן כליף.
Programming in C תרגול Introduction to C - Fall Amir Menczel.
תוכנה 1 תרגול 13 – סיכום.
תכנות מכוון עצמים ו- C++ יחידה 02 העמסת פונקציות, ערכי ברירת מחדל, enum, קימפול מותנה קרן כליף.
תירגול 8:מצביעים והקצאה דינאמית
שיעור עשירי: מיונים, חיפושים, וקצת סיבוכיות חישוב
Computer Programming תרגול 3 Summer 2016
Engineering Programming A
Computer Architecture and Assembly Language
Presentation transcript:

מבוא למדעי המחשב – סמסטר א' תשע"ב תרגול 3 - מערכים

היום בתרגול 1. מערך חד-מימדי: 2. משתנים שאינם פרימיטיביים. מה זה מערך ולמה צריך אותו? איך מגדירים? איך זה נראה בזכרון? עבודה עם מערכים. 2. משתנים שאינם פרימיטיביים. 3. מערך דו-מימדי: למה צריך? איך מגדירים? איך זה נראה בזכרון? דוגמאות לשימוש במערך דו-מימדי.

נושא ראשון: מערך חד מימדי

מערך חד-מימדי מערך הינו מבנה זיכרון המכיל מספר ערכים מאותו טיפוס, גודל המערך נקבע כאשר הוא נוצר (בזמן ריצה) ולאחר מכן הוא קבוע. אילו טיפוסים אנו מכירים? 3 4 2 6 7 8 1

מערך - מאפיינים טיפוס שאינו פרימיטיבי מבנה מסודר של ערכים. לכל ערך יש מקום. כל איברי המערך הם מאותו סוג. לכל טיפוס פרימיטיבי ניתן לייצר מערך מתאים. וכן לטיפוסים שאינם פרימיטיביים כפי שנלמד בהמשך 3 4 2 6 7 8 1

הצורך במערך יש צורך לשמור מספר גדול של ערכים מאותו סוג. זהו מבנה מאורגן המאגד בתוכו קבוצה גדולה של ערכים שניתן לעבור עליהם באופן שיטתי.

הגדרת מערך כמו כל משתנה, גם מערך צריך הגדרה והשמה. //declares an array of integers int[] myArray; ההגדרה מורכבת מטיפוס המערך ומשם המערך. הסוגריים המרובעים לאחר הטיפוס מציינים שהמשתנה המוגדר הוא מסוג מערך.

כמה מקום בזיכרון דורש מערך? בשיעור קודם למדנו שטיפוס של משתנה מגדיר כמה מקום צריך בזיכרון כדי להכיל ערכים שיכול לקבל המשתנה ואיך להתייחס לערכים אלו. כמה מקום יש להגדיר למערך? כמה מקום דורש int[] ?

הקצאת זכרון myArray = new int[5]; בזמן הגדרת המערך יש מקרים בהם הקומפיילר לא יכול לדעת כמה תאים ידרשו למערך. מסיבה זו ואחרות, ההגדרה עצמה אינה מקצה זיכרון עבור כל המערך, אלא רק מקום שיכול להכיל מצביע למיקומם של תאי המערך אשר יוקצו בזמן ריצה עלידי שימוש במילה השמורה new. myArray = new int[5]; תמונה של מערך בזיכרון: אוסף של תאים "רצופים", כל אחד בגודל המתאים לסוג המערך. הקצאת הזכרון למערך מתרחשת פעם אחת בלבד, בזמן יצירתו. תוכן התאים במערך יכול להשתנות תוך כדי ריצה, אך לא כן מספר התאים (הגודל). למערך קיים מאפיין בשם length המחזיר את גודל המערך. ניתן בעיקרון להקצות מערך בכל גודל חיובי שלם(גם בגודל אפס אך מערך כזה אינו שימושי). myArray

הקצאת זכרון באמצעות משתנה int size = Math.random() * 10; int[] myArray; myArray = new int[size]; נשים לב שבמקרה זה ניתן לדעת את גודלו של המערך רק בזמן ריצה!

הגדרה והקצאה בשורה אחת int[] myArray = new int[5]; int[] smallPrimes ={2,3,5,7,11}; myArray איתחול זה יכול להתבצע רק בסמוך להגדרה smallPrimes 2 3 5 7 11

length –גודל המערך int size = 5; int[] myArray; myArray = new int[size]; System.out.println(myArray.length(; // prints 5 size = 6; מה לדעתכם תדפיס כעת השורה הבאה? System.out.println(myArray.length); להוסיף טבלת משתנים על הלוח

מספור תאים במערך אם במערך יש n תאים הם ממוספרים 0…n-1

פנייה לאיבר (תא) במערך int[] smallPrimes = {2,3,5,7,11}; קריאת ערך מתא במערך : int num = smallPrimes[3] * 2; // num = 7*2 = 14 index 1 2 3 4 value 5 7 11 טבלת משתנים

פנייה לאיבר במערך num נשאר ללא שינוי smallPrimes[3] = 13; index 1 2 3 1 2 3 4 value 5 13 11

Run Time Error פנייה לאיבר במערך smallPrimes[5] = 17; index 1 2 3 4 value 5 13 11 smallPrimes[5] = 17; num = smallPrimes[-1]; Run Time Error פניה למערך במיקום שאינו קיים (כלומר מעבר לגבולות המערך) תגרור שגיאה בזמן ההרצה, בדומה לחילוק באפס, הקומפיילר לא בודק חריגה מגבולות מערך אפילו שלכאורה הוא יכול

פנייה לאיבר במערך int i = 5; myArray[i] = 3; myArray [i/2] = 1; בתוך ה-[] יכול להיות ביטוי מתמטי,קריאה לפונקציה וכו', כל עוד התוצאה הינה מטיפוס שלם. mArray[3.5] שגיאת קומפילציה mArray[(int) 3.5] בסדר למרות, שאין סיבה לעשות משהו מוזר כזה!!

פעולות על מערך //Demonstrates basic array operations public class BasicArray { public static void main(String[] arg) { int[] smallPrimes = {2,3,5,7,11}; System.out.println(smallPrimes[0]); 2 smallPrimes[0] = 13; 13 System.out.println(smallPrimes.length); 5 for(int i=0;i<smallPrimes.length;i=i+1) System.out.print(smallPrimes[i]+", "); 13, 3, 5, 7, 11, } //main } //class BasicArray Print vs. println() 18 18

איתחול מערך ע"י לולאה //Demonstrate array init with a loop public 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,

משתנים שאינם פרימיטיביים נושא שני: משתנים שאינם פרימיטיביים

זיכרון של תוכנית רצה (תהליך) תוכנית רצה נקראת תהליך. הזיכרון של התהליך מחולק לחלקים מתוכם 2 עיקריים: מחסנית (Stack) : חלק קטן מהזיכרון המיועד להחזקת משתנים פרימיטיביים וכתובות. ערימה (Heap) : חלק גדול מהזיכרון המיועד להקצאות דינאמיות (כמו אלו שראינו עבור המערך). בJava זיכרון זה מחזיק רק ערכים מטיפוסים שאינם פרימיטיביים.

משתנה פרימיטיבי y נשאר ללא שינוי. משתנים אלו מוחזקים במחסנית. 3 7 3 int x = 3; int y = x; x=7; y נשאר ללא שינוי. משתנים אלו מוחזקים במחסנית. טיפוס שם משתנה ערך int x y 3 7 3 עם טבלת משתנים על הלוח

משתנה שאינו פרימיטיבי int[] xArray = new int[5]; int[] yArray = xArray; xArray[1] = 6; xArray 6 עדיף לצייר טבלת משתנים על הלוח, אחר כך להראות את האנימציה yArray

שאלה מה יקרה בזכרון בזמן הרצת הקוד הבא? int[] myArray; myArray = new int[5]; myArray = new int[10]; myArray עם טבלת משתנים על הלוח

אינו פרימיטיבי vs. פרימיטיבי משתנה שאינו פרימיטיבי משתנה פרימיטיבי כתובת למקום ב Heap הערך עצמו מה נמצא במחסנית הכתובת (שהיא למעשה הערך במחסנית) מועתקת הערך מועתק השמה השוואה בין כתובות (שהם למעשה הערך במחסנית) השוואה בין ערכים (==) השוואה עם טבלת משתנים על הלוח

null – ערך מיוחד משתנים המחזיקים כתובות (כמו מערכים) יכולים גם לקבל השמה לערך המיוחד null: myArray = null; במחסנית ערכו של המשתנה myArray הוא הקבוע null – שלמעשה אומר, invalid address. myArray null להדגיש נקודה זו

null כתובת int[] arr1 = null; int[] arr2 = null; System.out.println(arr1==arr2); true

שאלה מה נקבל כאשר נבקש myArray.length לפני שהקצינו את המערך? int[] myArray; System.out.println(myArray.length); תשובה: שגיאת קומפילציה, הקומפיילר מזהה את השגיאה ועוצר את תהליך הקומפילציה.

שאלה ואם נבקש myArray.length כאשר נעשתה לו השמה ?null int[] myArray = null; System.out.println(myArray.length); תשובה: שגיאת זמן ריצה (מסוג NullPointerException) המציינת שניסינו לפנות למשתנה שערכו הוא null, הקומפיילר אינו מזהה את השגיאה.

שאלה ובמקרה: int[] myArray = new int[0]; System.out.println(myArray.length);מה יודפס למסך? תשובה: 0

נושא 3: מערכים דו מימדיים.

מערך דו-מימדי מערך שבו כל איבר הוא גם מערך,כלומר מערך של מערכים. חלק שני של התרגול

מערך דו-מימדי int[][] array1 = new int [3][2]; array1 0 0 0 0 0 0 0 0 0 0 0 0 ניתן בקלות ליצור מערך דו-מימדי שבו כל המערכים הפנימיים הם באותו האורך, מערך כזה נקרא מטריצה:

מערך דו-מימדי int[][] array2 ={{1,3},{5,6,7},{4}}; 5 array2 3 6 4 1 7

length – אורך של מערך array1.length  array1[0].length  5 array2 3 6 4 1 7 3 2 3 1 3 Run time Error

פנייה לאיבר // prints 5 System.out.println(array2[1][0]); 3 6 4 System.out.println(array2[1][0]); array2[2][0] = 9; 1 7 9 // prints 5

Run Time Error (NullPointerException) public class ArrayRef{ public static void main(String []args){ int[][] x; x = new int[3][]; x[0] = new int[3]; x[1] = x[0]; x[0][1] = 7; //prints the 2D array for (int i = 0 ; i < x.length ; i= i+1){ for(int j=0 ; j < x[i].length; j = j+1){ System.out.print(x[i][j]+” ”); } System.out.println(); 0 7 0 Run Time Error (NullPointerException) 37 37

שאלה מה יקרה אם נוסיף את השורה הבאה? x[2]= x; תשובה: java מבדילה בין מערך של מספרים ובין מערך של מערכים של מספרים ולכן השורה הזאת לא תעבור קומפילציה (שכן איברי המערך צריכים להיות מאותו טיפוס).

העתקת מערך public class Copy2dArray{ public static void main(String[] args){ int[][] a = {{1,3},{5,6,7},{4}}; int[][] c; //Create the 2dArray row by row c = new int[a.length][]; int i,j; for ( i=0 ; i < c.length; i = i+1) c[i] = new int[a[i].length]; for ( i=0; i < c.length; i = i+1) for (j=0 ; j < c[i].length ; j = j+1) c[i][j] = a[i][j]; } //main } כדאי להתעכב על דוגמה זו

משולש פסקל Wikipedia http://en.wikipedia.org/wiki/Pascal%27s_triangle מה החוקים לחישוב משולש פסקל 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 להראות את הקוד בנפרד להתמקד בחלק השמאלי, ולנסות להסביר החוקים לחישוב המשולש Pascal[j][0] = Pascal[j][j]=1 Pascal[j][i] = Pascal[j-1][i] + Pascal[j-1][i-1]

הדפסת לוח הכפל public class MultiplicationTable { public static void main(String[] arg) { final int ROW = 13; final int COLUMN = 13; int[][] mat = new int[ROW][COLUMN]; for (int i=0; i < ROW; i=i+1) for (int j=0; j < COLUMN; j=j+1) mat[i][j] = i*j; //prints the matrix for (int i=0; i < ROW; i=i+1) { System.out.print(mat[i][j]+"\t"); System.out.println(); } } //main } //class הערה: כדי להדפיס למסך את לוח הכפל יכולנו להסתפק בלולאה כפולה ולא היינו צריכים להשתמש במערך דו-מימדי. דוגמא זו באה להמחיש שימוש ב lookup table : אילו החישוב של i*j היה מסובך, היינו אולי מעוניינים בטבלה כדוגמת הטבלה הזו, שתכיל את כל התוצאות. ע"י כך ניתן להבטיח כי החישוב ייעשה פעם אחת, ולנו תהיה גישה קלה לתוצאה. רק במקרה שיישאר זמן

חיבור מטריצות // Adds two matrices public class Add{ public static void main(String[] args){ int[][] a = { /* insert data here */ }; int[][] b = { /* insert data here */ }; int[][] c; 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 . רק במקרה שיישאר זמן

הכפלת מטריצות* . רק במקרה שיישאר זמן

//Multiplies two matrices pbulic class Mul{ public static void main(String[] args){ int[][] a = { /* insert data here */ }; int[][] b = { /* insert data here */ }; int[][]c; //Create the matrix row by row c = new int[a.length][]; for (int i = 0 ; i < c.length ; i = i+1) c[i] = new int[b[0].length]; //For each element in the matrix for (int i=0; i<a.length ; i=i+1) for(int j=0; j<b[0].length; j=j+1){ //NOTICE that b.length is equal to a[i].length //Calculate the sum c[i][j] = 0; for (int k=0; k<a[i].length ; k= k+1) c[i][j] = c[i][j] + (a[i][k] * b[k][j]); } //for } //main } //class Mul . רק במקרה שיישאר זמן