מצגת של PowerPoint

מסמכים קשורים
תוכנה 1 בשפת Java שיעור מספר 3: "חתיכת טיפוס"

מהוא לתכנות ב- JAVA מעבדה 3

Microsoft PowerPoint - rec1.ppt

תרגול 1

אוניברסיטת בן גוריון בנגב תאריך המבחן: שקולניק אלכסנדר שם המרצה: מר בשפת JAVA מבוא לתכנות מבחן ב: מס' הקורס : הנדסת תעשיה וניהול מ

מבוא למדעי המחשב

PowerPoint Presentation

PowerPoint Presentation

Slide 1

מבוא לתכנות ב- JAVA תרגול 7

מבחן 7002 פרטים כלליים מועד הבחינה: בכל זמן מספר השאלון: 1 משך הבחינה: 3 שעות חומר עזר בשימוש: הכל )ספרים ומחברות( המלצות: קרא המלצות לפני הבחינה ובדי

תכנות מונחה עצמים א' – תש"ע

PowerPoint Presentation

Slide 1

Microsoft PowerPoint - rec3.ppt

אוניברסיטת בן גוריון בנגב תאריך המבחן: שם המרצה: מר אלכסנדר שקולניק, בשפת JAVA מבחן ב: מבוא לתכנות מס' הקורס : מיועד לתלמידי : הנד

Slide 1

PowerPoint Presentation

Slide 1

Slide 1

PowerPoint Presentation

מבוא למדעי המחשב

Slide 1

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

PowerPoint Presentation

פתרון מוצע לבחינת מה"ט ב_שפת c מועד ב אביב תשע"ט, אפריל 2019 מחברת: גב' זהבה לביא, מכללת אורט רחובות שאלה מספר 1 מוגדרת מחרוזת המורכבת מהספרות 0 עד 9.

מבוא למדעי המחשב

מבוא למדעי המחשב

Microsoft PowerPoint - T-10.ppt [Compatibility Mode]

PowerPoint Presentation

מבוא לתכנות ב- JAVA תרגול 11

Slide 1

תורת החישוביות תרגול הכנה לוגיקה ותורת הקבוצות מה יש כאן? בקורס תורת החישוביות נניח ידע בסיסי בתורת הקבוצות ובלוגיקה, והכרות עם מושגים בסיסיים כמו א"ב

PowerPoint Presentation

Microsoft Word - pitaron222Java_2007.doc

Tutorial 11

מקביליות

PowerPoint Presentation

תרגול 3 - מערכים

סדנת תכנות ב C/C++

הגשה תוך שבוע בשעת התרגול

פתרון 2000 א. טבלת מעקב אחר ביצוע האלגוריתם הנתון עבור הערכים : פלט num = 37, sif = 7 r האם ספרת האחדות של sif שווה ל- num num 37 sif 7 שורה (1)-(2) (

מספר מחברת: עמוד 1 מתוך 11 ת"ז: תשע"א מועד ב סמסטר א' תאריך: 00:11 שעה: 0 שעות הבחינה: משך כל חומר עזר אסור בשימוש בחינה בקורס: מבוא למדעי ה

מבחן סוף סמסטר מועד ב 28/10/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, גדי אלכסנדרוביץ הוראות: א. בטופס המבחן 6 עמודים (כולל דף זה) ו

שאלהIgal : מערכים דו מימדיים רקורסיה:

תרגול מס' 4: המתרגם שימוש במחלקות קיימות מחרוזות, קבצים, וקבלת קלט מהמשתמש

משימה תכנית המתרגמת קטעי טקסט לשפה אחרת הקלט: קובץ המכיל את קטעי הטקסט וכן את השפה אליה רוצים לתרגם תרגול מס' 4: המתרגם שימוש במחלקות קיימות תכנות מתק

Microsoft Word B

Slide 1

אוניברסיטת חיפה החוג למדעי המחשב.5.6 מבוא למדעי המחשב סמסטר א' תשע"ז בחינה סופית מועד א', מרצה: שולי וינטנר מתרגלים: סמאח אידריס, ראמי עילבו

מבחן סוף סמסטר מועד א 15/02/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, דניאל גנקין הוראות: א. בטופס המבחן 7 עמודים ו 4 דפי נוסחאות. ב

PRESENTATION NAME

מתכונת עיצוב 3013

Slide 1

תורת הקומפילציה

עוצמת ההורשה מה הופך את ההורשה לכלי כל כך עוצמתי? מעבר לכך שהוא מקל בהגדרת מחלקות חדשות על סמך מחלקות קיימות, יש לנו אפשרות להתייחס לאובייקט מסויים בכ

שבוע 4 סינטקס של HACK ASSEMBLY ניתן להשתמש בשלושה אוגרים בלבד:,A,D,M כולם בעלי 16 ביטים. M אינו אוגר ישיר- הוא מסמן את האוגר של ה RAM שאנחנו מצביעים ע

שאלהIgal : מערכים דו מימדיים רקורסיה:

שאלהIgal : מערכים דו מימדיים רקורסיה:

אוניברסיטת חיפה החוג למדעי המחשב מבוא למדעי המחשב מועד א' סמסטר ב', תשע"ג, משך המבחן: שעתיים וחצי חומר עזר: אסור הנחיות: וודאו כי יש בידיכם

אוניברסיטת חיפה החוג למדעי המחשב מרצה: שולי וינטנר מתרגלים: נעמה טוויטו, מחמוד שריף מבוא למדעי המחשב סמסטר א' תשע"ב בחינת סיום, מועד א', הנחי

Slide 1

תשע"דד אביב תוכנה 1 תרגיל מספר 4 עיבוד מחרוזות וקריאה מקבצים הנחיות כלליות: קראו בעיון את קובץ נהלי הגשת התרגילים אשר נמצא באתר הקורס..(

תוכן העניינים

מקביליות

Microsoft Word - Ass1Bgu2019b_java docx

Slide 1

Microsoft PowerPoint - lec2.ppt

יוםראשון, 02 ליולי 2014 סמסטר סוף מבחן )236703( עצמים מונחה תכנות - א' מועד 2014, אביב סמסטר קמחי יחיאל ד"ר מרצה: מסינג מיטל עבדאלקאדר, כרם גלעד, ערן

Microsoft PowerPoint - 10_threads.ppt

Microsoft PowerPoint - lec10.ppt

תרגיל בית מספר 1#

PowerPoint Presentation

לנץ קרן מרצה: תכנותמונחהעצמים) ( יוםשישי 15 אוקטובר 0202 ב מועד 0202, אביב סמסטר סמסטר סוף מבחן גוטמן אייל רביב, אריאל משנה, אלון מתרגלים: הנחי

תוכן העניינים

Slide 1

Microsoft PowerPoint - YL-05.ppt

מקביליות

תרגול מס' 7: תרגילים מתקדמים ברקורסיה

תרגול 1

1 תבניות טקסט מהי תבנית טקסט? שימוש ב- Characters Meta שימוש ב- Expression Grouping שימוש ב- Quantifiers תת תבניות הפונקציה preg_match הפונקציה preg_m

תרגיל 1 בקורס תוכנה 1

Python 2.7 in Hebrew

Slide 1

אוניברסיטת חיפה החוג למדעי המחשב מרצה: שולי וינטנר מתרגלים: נעמה טוויטו, מחמוד שריף מבוא למדעי המחשב סמסטר א' תשע"ב בחינת סיום, מועד א', הנחי

מבוא למדעי המחשב - חובלים

Microsoft Word - c_SimA_MoedB2005.doc

מבוא לאסמבלי

המשימה תרגול מס' 5: קלט-פלט במערכות הפעלה שונות יש סימונים שונים עבור ירידת שורה :)newline( ב- UNIX/Linux )Line Feed( \n ב- Windows )Carriage Return +

מבוא למדעי המחשב

תרגול מס' 1

מבוא למדעי המחשב - חובלים

מספר זהות: סמסטר ב' מועד א' תאריך: 11102/4// שעה: 9:22 משך הבחינה: 3 שעות חומר עזר: אין מותר השימוש במחשבון פשוט בחינה בקורס: מבני נתונים מרצה: הדר בי

אוניברסיטת תל אביב - בית הספר למדעי המחשב מבוא מורחב למדעי המחשב, אביב 2019 תרגיל בית מספר - 2 להגשה עד 02/04/2019 בשעה 23:55 קיראו בעיון את הנחיות הע

תוכנה 1 1 אביב תשע"ג תרגיל מספר 5 מערכים, מחרוזות, עיבוד טקסט ומבני בקרה הנחיות כלליות: קראו בעיון את קובץ נהלי הגשת התרגילים אשר נמצא באתר הקורס. הגש

תמליל:

שיעור מספר 2: זרימה של תוכניות ליאור וולף מתי שמרת בית הספר למדעי המחשב

מה היום בתכנית? מבני בקרה ב Java משפטי תנאי if switch לולאות while/do-while for זימון והגדרת שרותי מחלקה )קצת חזרה על התרגול( )methods( העמסת שרותים 2

התקדמות לינארית בשיעור הקודם דנו בביטויים בשפה וראינו תוכניות פשוטות שמבצעות פעולות )בעיקר השמה( על ביטויים ומשתנים התוכנית התקדמה באופן קווי )לינארי( החל בפונקציה main התוכנית בצעה שורה אחר שורה את התוכנית, עד שהגיעה לסוף main והסתיימה ציינו בעזרת החץ את השורה הנוכחית שבה אנו נמצאים. בסוף כל שורה ירד החץ שורה למטה איך מיוצג החץ במודל הזכרון של התוכנית? 3

מצביע התוכנית counter( )program לפני תחילת ריצת התוכנית מועתק קוד התוכנית לאיזור מסוים בזכרון המחשב )איזור בשם )CODE משתנה מיוחד בשם מצביע התוכנית ( program )counter מציין באיזו שורה אנחנו נמצאים בביצוע הקוד לאחר ביצוע כל שורה בתוכנית מעודכן ערך המצביע לשורה הבאה שאותה יש לבצע נציג היום כמה משפטים ב Java אשר משפיעים על זרימת התוכנית. כלומר גורמים לתוכנית להתבצע בצורה שאינה לינארית 4

משפט if ב scheme... if (grade > 60) System.out.println("You passed the test!"); System.out.println("Your grade is: " + grade); מזכיר ביטוי if דוגמא: הביטוי בסוגריים חייב להיות ערך בולאני אם ערכו הוא true יתבצע המשפט או הבלוק המופיע מיד אחרי הסוגריים )פסוקית-אז,,)then-clause ואחר כך תמשיך התוכנית בצורה סדרתית אחרת, התוכנית תדלג על משפט )או בלוק( זה 5

משפט if )עם בלוק משפטים( בלוק הוא אוסף משפטים עטוף בסוגריים מסולסלים דוגמא:... if (grade > 60) { System.out.println("You passed the test!"); System.out.println("Hip Hip Hooray!"); System.out.println("Your grade is: " + grade); הלוגיקה של זרימת התוכנית מתקיימת עבור הבלוק כפי שהתקיימה עבור המשפט הבודד בשקף הקודם 6

משפט if/else אם נרצה שכאשר התנאי מתקיים יתבצעו משפטים מסוימים וכאשר הוא אינו מתקיים יתבצעו משפטים אחרים נשתמש במשפט else... if (grade>60) { System.out.println("You passed the test!"); System.out.println("Hip Hip Hooray!"); else { System.out.println("You failed"); System.out.println("It is so sad..."); System.out.println("Your grade is: " + grade); אם התנאי אינו מתקיים התוכנית מדלגת על ביצוע פסוקית-אז וקופצת לשורת ה else משפט else יכול להכיל משפט אחד, בלוק או לא להופיע כלל משפט else הוא בעצם פסוקית )פסוקית-אחרת, )else-clause - הוא יכול להופיע רק אחרי פסוקית-אז 7

משפט if/else מקוננים if( )nested הביטוי הבוליאני ב- if יכול להיות מורכב: if (grade>=55 && grade<60) // recheck the exam... פסוקית-אז ופסוקית-אחרת יכולים להיות בעצמם משפטי :if if (x == y) if (y == 0) System.out.println(" x == y == 0"); else System.out.println(" x == y, y!= 0"); בדוגמא זאת ההיסט )אינדנטציה( מטעה! ה- else משוייך ל if הקרוב לו יש להשתמש ב- { כדי לשנות את המשמעות, וגם לצרכי בהירות 8

אופרטור התנאי אופרטור התנאי )להבדיל ממשפט תנאי( דומה לביטוי if ב- scheme התחביר: <boolean-expression>? <t-val> : <f-val> ראשית, הביטוי <boolean-expression> )ביטוי התנאי, שחייב להיות בוליאני( מחושב אם ערכו <t-val> true מחושב ומוחזר כערך הביטוי אם ערכו <f-val> false מחושב ומוחזר כערך הביטוי הקדימות שלו היא אחרי האופרטורים הבינריים אופרטור התנאי הוא ביטוי ניתן לחשב את ערכו, שהוא משפט בקרה המשפיע על זרימת התוכנית לעומת משפט תנאי 9

אופרטור התנאי שימוש באופרטור התנאי: System.out.print(n==1? "child" : "children"); if (n==1) System.out.print("child"); else System.out.print("children"); שימוש במשפט תנאי: 10

ריבוי תנאים )else-if( if (exp1) { // code for case when exp1 holds else if (exp2) { // when exp1 doesn't hold and exp2 does // more... else { // when exp1, exp2,... do not hold למבנה else if אין סמנטיקה מיוחדת, נשתמש בו במקרה שמתוך אוסף מקרים אמור להתקיים מקרה אחד לכל היותר מה המשמעות של הקוד למעלה ללא ה-?else 11

ריבוי תנאים )switch( System.out.print("Your grade is: "); switch(grade){ case 100: System.out.println("A+"); case 90: System.out.println("A"); case 80: System.out.println("B"); case 70: System.out.println("C"); case 60: System.out.println("D");... קיים תחביר מיוחד לריבוי תנאים: ארגומנט ה switch הוא שלם שאינו long או טיפוס מניה )יוסבר בהמשך הקורס( מתבצעת השוואה בינו ובין כל אחד מערכי ה case ומתבצעת קפיצה לשורה המתאימה אם קיימת לאחר הקפיצה מתחיל ביצוע סדרתי של המשך התוכנית, תוך התעלמות משורות ה case מה יודפס עבור grade שהוא 60? מה יודפס עבור grade שהוא 70? 12

ריבוי תנאים )break( System.out.print("Your grade is: "); switch(grade){ case 100: System.out.println("A+"); break; case 90: System.out.println("A"); break; case 80: System.out.println("B"); break; case 70: System.out.println("C"); break; case 60: System.out.println("D"); break;... ניתן לסיים משפט switch לאחר ההתאמה הראשונה, ע"י המבנה break מה יודפס עבור grade שהוא 70? מה יודפס עבור grade שהוא 50? שימוש במבנה default )ברירת מחדל( נותן מענה לכל הערכים שלא הופיעו ב case משלהם מקובל למקם את ה default כאפשרות האחרונה 13

ריבוי תנאים )default( System.out.print("Your grade is: "); switch(grade){ case 100: System.out.println("A+"); break; case 90: System.out.println("A"); break; case 80: System.out.println("B"); break; case 70: System.out.println("C"); break; case 60: System.out.println("D"); break; default: System.out.println("F");... מה יודפס עבור grade שהוא 50? בתכנות מונחה עצמים נשתדל להימנע משימוש בswitch בהמשך הקורס נראה מנגנונים אחרים של השפה, שנחשבים טובים יותר להתמודדות עם ריבוי תנאים 14

לולאות בקורס המבוא למדנו על תהליכים איטרטיביים ורקורסיביים שניהם נכתבו בתחביר של רקורסיה )האינטרפרטר ממיר רקורסית זנב לאיטרציה( בג'אווה, כמו ברוב השפות, איטרציה כותבים במפורש בעזרת משפטים מיוחדים שנקראים לולאות ג'אווה מאפשרת גם רקורסיה, בצורה הרגילה )כאשר שרות קורא לעצמו, ישירות או בעקיפין( ג'אווה תומכת בשלושה סוגים של לולאות: משפט for ומשפט do משפט, while 15

משפט while boolean expression false while ( <boolean_expression> ) <statement> true statement.1 ביצוע משפט ה while נעשה כך: הביטוי < boolean_expression >מחושב: אם ערכו false מדלגים על <statement> )גוף הלולאה - משפט או בלוק משפטים( אם ערכו true מבצעים את גוף הלולאה וחוזרים ל- )1( לדוגמא: נשתמש בלולאת while "אין מדברים בזמן השיעור" כדי להדפיס 1000 פעמים את המחרוזת 16

"אין מדברים בזמן השיעור" int counter = 0; while (counter<1000) { System.out.println("No talking during class"); counter++; אף על פי שהדוגמא פשוטה, נמצאים בה כל מרכיבי הלולאה: הגדרת משתנה עזר ואתחולו בדיקת תנאי עצירה )שנמשיך?( ביצוע איטרציה נוספת קידום משתנה העזר מוסכמות: משתני עזר מאותחלים ל- 0 בדיקת הסיום היא בעזרת האופרטור < על מספר האיטרציות המבוקש 17

משפט do statement do <statement> while ( <boolean_expression> ); true boolean expression false כאן התנאי מחושב לאחר ביצוע גוף הלולאה לכן הלולאה מתבצעת לפחות פעם אחת לפעמים מאפשר לחסוך כתיבת שורה לפני הלולאה נתרגם את לולאת ה- while מהשקף הקודם ללולאת do-while 18

משפט do int counter = 0; do { System.out.println("No talking during class"); counter++; while (counter<1000); הבחירה בין השימוש במשפט do לשימוש במשפט while )במקרים שבהם ידוע בוודאות שיהיה לפחות מחזור אחד של הלולאה( היא עניין של טעם אישי 19

משפט for במשפט ה while ראינו את 4 יסודות הלולאה אולם תחביר הלולאה כפי שמופיע ב while בהגדרת משתנה עזר, באתחולו ובקידומו אינו תומך ישירות המתכנתת צריכה להוסיף קוד זה לפני הלולאה או בתוכה תחביר משפט for כולל את 4 יסודות הלולאה: for (<initialize> ; <boolean_expression> ; <increment> ) <statement> 20

משפט for for (int counter = 0; counter<1000; counter++) { System.out.println("No talking during class"); הגדרת משתנה עזר ואתחולו משתנה זה מוגדר אך ורק בתחום לולאת ה for ואינו נגיש לאחריו בדיקת תנאי עצירה )שנמשיך?( קידום משתנה העזר גוף הלולאה - ביצוע איטרציה נוספת 21

for (<initialize> ; < boolean_expression> ; <increment> ) <statement> initialize boolean expression false true statement increment 22

משפט for ללולאת ה :for for (<initialize> ; <boolean_expression> ; <increment> ) <statement> כמעט שקולה ללולאת ה- : while <initialize> ; while <boolean_expression> { <statement> ; <increment> 23

משפט for החלקים <increment> ו <initialize> יכולים להכיל יותר ממשפט אחד, מופרדים בפסיקים. לדוגמא: שתי הצהרות של שלמים מאותו טיפוס(: )תחביר כללי לסדרת הצהרות מופרדות בפסיק, של משתנים for (int i = 0, j = 10; i < 10 ; i++, j-- ) sum += i * j ; : הדפסה במשפט <initialize> int counter; for(counter = 0, System.out.println("Starting a loop"); counter<1000; counter++) { System.out.println("No talking during class"); למרות שמו, יכול <increment> לטפל לא רק בהגדלת מספרים, אלא גם להתקדם בסריקה של מבנה נתונים )דוגמאות בהמשך( )למשל( 24

משפט break ביצוע משפט break גורם ליציאה מיידית מהמבנה המכיל אותו )משפט )while, do, for, switch ראינו דוגמא במשפט switch, שם זה שימושי מאד דוגמא נוספת מה עושה הקוד הבא: for ( int i = 1; i < 1000; i++ ) { int j = i*i; if (j > 1000) break; s = s + j; 25

משפט continue ביצוע משפט זה גורם ליציאה מיידית מהאיטרציה הנוכחית של הלולאה, ולהתחיל מייד את האיטרציה הבאה יכול להופיע רק בתוך לולאה )while, do, for )משפט דוגמא - מה עושה הקוד הבא? for ( int i = 1; i < 100; i++ ) { if ( i % 17 == 0 ) continue; s = s + i; 26

break ההבדל בין continue ל- נציג שתי גרסאות למשחק " 2 -בום" for ( int i = 1; i < 10; i++ ) { if ( i % 2 == 0 ) break; System.out.println(i); System.out.println("The End"); break "נריץ" את גרסת ה- 27

break ההבדל בין continue ל- גרסת continue למשחק " 2 -בום" for ( int i = 1; i < 10; i++ ) { if ( i % 2 == 0 ) continue; System.out.println(i); System.out.println("The End"); וכו'... 28

לולאות מקוננות גוף הלולאה יכול להיות לולאה בעצמו נדפיס את לוח הכפל: for ( int i = 1; i <= 10; i++ ) { for ( int j = 1; j <= 10; j++ ) System.out.print(i*j + "\t"); System.out.println(); 29

continue ו- break מתויגים קיימת צורה נוספת של break ו- continue שכוללת תווית, ומאפשרת לצאת ממבנה כלשהו, לאו דווקא המבנה העוטף הסמוך הדבר שימושי ביותר ביציאה מלולאות מקוננות פרטים בקובץ ההערות שנמצא באתר הקורס 30

לולאות ומערכים לולאות שימושיות ביותר בעבודה עם מערכים להלן קטע קוד שמחשב את סכום אברי המערך :arr double [] arr = {1.0, 2.0, 3.0, 4.0, 5.0; double sum = 0.0; for (int i=0; i<arr.length; i++){ sum += arr[i]; System.out.println("arr sum is: " + sum); הגדרת משתנה עזר שיהיה אינדקס המערך ואתחולו לאפס בדיקת תנאי עצירה האם משתנה העזר עדיין קטן מגודל המערך קידום משתנה העזר באחד גוף הלולאה - ביצוע פעולה המשתמשת באיבר במקום ה- i 31

foreach ביצוע פעולה מסוימת על כל אברי מערך היא פעולה שכיחה כל כך עד שב- )for/in )או foreach ניתן לה תחביר מיוחד המכונה Java5 בתחביר זה הקומפיילר מייצר את העבודה עם משתנה העזר בצורה אוטומטית מאחורי הקלעים קטעי הקוד הבאים שקולים: שקול ל- for (int i=0; i<arr.length; i++){ sum += arr[i]; for (double d : arr) { sum += d; בצע..." קרא זו כך: "לכל איבר d מטיפוס double שבמערך arr 32

חידה 33

חידה String i = I love SOFTWARE 1 ; 34

שרותי מחלקה methods( )static בדומה לשיגרה )פרוצדורה, פונקציה( בשפות תכנות אחרות, שרות מחלקה הוא סדרת משפטים שניתן להפעילה ממקום אחר בקוד של ג'אווה ע"י קריאה לשרות, והעברת אפס או יותר ארגומנטים שירותים כאלה מוכרזים על ידי מילת המפתח static כמו למשל: public class MethodExamples { public static void printmultipletimes(string text, int times) { for(int i=0; i<times; i++) System.out.println(text); נתעלם כרגע מההכרזה public 35

הגדרת שרות התחביר של הגדרת שרות הוא: <modifiers> <type> <method-name> ( <paramlist> ) { <statements> >modifiers< הם 0 או יותר מילות מפתח מופרדות ברווחים )למשל )public static >type< מציין את טיפוס הערך שהשרות מחזיר void מציין שהשרות אינו מחזיר ערך >paramlist< רשימת הפרמטרים הפורמליים, מופרדים בפסיק, כל אחד מורכב מטיפוס הפרמטר ושמו 36

החזרת ערך משרות ומשפט return return <optional-expression>; משפט :return ביצוע משפט return מחשב את הביטוי )אם הופיע(, מסיים את השרות המתבצע כרגע וחוזר לנקודת הקריאה אם המשפט כולל ביטוי ערך מוחזר, ערכו הוא הערך שהקריאה לשרות תחזיר לקורא טיפוס הביטוי צריך להיות תואם לטיפוס הערך המוחזר של השרות אם טיפוס הערך המוחזר מהשרות הוא, void משפט ה- return לא יכלול ביטוי, או שלא יופיע משפט return כלל, והשרות יסתיים כאשר הביצוע יגיע לסופו 37

דוגמא לשרות המחזיר ערך public static int arraysum(int [] arr) { int sum = 0; for (int i : arr) { sum += i; return sum; אם שרות מחזיר ערך, כל המסלולים האפשריים של אותו שרות )flows( צריכים להחזיר ערך איך נתקן את השרות הבא: public static int returnzero() { int one = 1; int two = 2; if (two > one) return 0; 38

גוף השרות גוף השרות מכיל הצהרות על משתנים מקומיים declaration( )variable ופסוקים ברי ביצוע )כולל )return משתנים מקומיים נקראים גם משתנים זמניים, משתני מחסנית או משתנים אוטומטיים הצהרות יכולות להכיל פסוק איתחול בר ביצוע )ולא רק אתחול ע"י ליטרלים( public static void dosomething(string str) { int length = str.length();... הגדרת משתנה זמני צריכה להקדים את השימוש בו תחום הקיום של המשתנה הוא גוף השרות חייבים לאתחל או לשים ערך באופן מפורש במשתנה לפני השימוש בו 39

יש צורך באתחול מפורש קטע הקוד הבא, לדוגמא, אינו עובר קומפילציה: int i; int one = 1; if (one == 1) i = 0; System.out.println("i=" + i); הקומפיילר צועק ש- i עלול שלא להיות מאותחל לפני השימוש בו 40

קריאה לשרות call( )method קריאה לשרות )לפעמים מכונה "זימון מתודה"( שאינו מחזיר ערך )טיפוס הערך המוחזר הוא )void תופיע בתור משפט )פקודה(, ע"י ציון שמו וסוגריים עם או בלי ארגומנטים קריאה לשרות שמחזיר ערך תופיע בדרך כלל כביטוי )למשל בצד ימין של השמה, כחלק מביטוי גדול יותר, או כארגומנט המועבר בקריאה אחרת לשרות( קריאה לשרות שמחזיר ערך יכולה להופיע בתור משפט, אבל יש בזה טעם רק אם לשרות תוצאי לוואי, כי הערך המוחזר הולך לאיבוד גם אם השרות אינו מקבל ארגומנטים, השרות יש חובה לציין את הסוגריים אחרי שם 41

public class MethodCallExamples { public static void printmultipletimes(string text, int times) { for (int i = 0; i < times; i++) System.out.println(text); public static int arraysum(int[] arr) { int sum = 0; for (int i : arr) sum += i; return sum; public static void main(string[] args) { printmultipletimes("hello", 5); הגדרת שרות void )פרוצדורה( הגדרת שרות עם ערך מוחזר קריאה לשרות )פונקציה( int[] primes = { 2, 3, 5, 7, 11 ; int sumofprimes = arraysum(primes); System.out.println("Sum of primes is: " + sumofprimes); קריאה לשרות 42

public class MethodCallExamples { public static void printmultipletimes(string text, int times) { for (int i = 0; i < times; i++) System.out.println(text); public static int arraysum(int[] arr) { int sum = 0; for (int i : arr) sum += i; return sum; public static void main(string[] args) { printmultipletimes("hello", 5); משתנה העזר sumofprimes מיותר, ניתן לוותר עליו int[] primes = { 2, 3, 5, 7, 11 ; System.out.println("Sum sumofprimes = arraysum(primes); of is: " + arraysum(primes)); System.out.println("Sum of primes is: " + sumofprimes); 43

public class MethodCallExamples { public static void printmultipletimes(string text, int times) { for (int i = 0; i < times; i++) System.out.println(text); public static int arraysum(int[] arr) { int sum = 0; for (int i : arr) sum += i; return sum; אין חובה לקלוט את הערך המוחזר משרות, אולם אז הוא הולך לאיבוד public static void main(string[] args) { printmultipletimes("hello", 5); int[] primes = { 2, 3, 5, 7, 11 ; arraysum(primes); 44

שם מלא name( )qualified אם אנו רוצים לקרוא לשרות מתוך שרות של מחלקה אחרת )למשל,)main יש להשתמש בשמו המלא של השרות שם מלא כולל את שם המחלקה שבה הוגדר השרות ואחריו נקודה public class CallingFromAnotherClass { public static void main(string[] args) { printmultipletimes("hello", 5); int[] primes = { 2, 3, 5, 7, 11 ; System.out.println("Sum of primes is: " + arraysum(primes)); 45

שם מלא name( )qualified במחלקה המגדירה ניתן להשתמש בשם המלא של השרות, או במזהה הפונקציה בלבד name( )unqualified בצורה זו ניתן להגדיר במחלקות שונות פונקציות עם אותו השם )מכיוון שהשם המלא שלהן שונה אין התלבטות ambiguity )no public class CallingFromAnotherClass { public static void main(string[] args) { MethodCallExamples.printMultipleTimes("Hello", 5); int[] primes = { 2, 3, 5, 7, 11 ; System.out.println("Sum of primes is: " + MethodCallExamples.arraySum(primes)); 46

העמסת שרותים overloading( )method לשתי פונקציות ב Java יכול להיות אותו שם )מזהה( גם אם הן באותה מחלקה, ובתנאי שהחתימה שלהן שונה כלומר הם שונות בטיפוס ו\או מספר הארגומנטים שלהם לא כולל ערך מוחזר! הגדרת שתי פונקציות באותו שם ובאותה מחלקה נקראת העמסה כבר השתמשנו בפונקציה מועמסת println משתנה פרימיטיבי וגם כשהעברנו לה מחרוזת עבדה גם כשהעברנו לה נציג שלוש סיבות לשימוש בתכונת ההעמסה נוחות ערכי ברירת מחדל לארגומנטים תאימות אחורה 47

העמסת פונקציות )שיקולי נוחות( נממש את max המקבלת שני ארגומנטים ומחזירה את הגדול מביניהם ללא שימוש בתכונת ההעמסה )בשפת C למשל( היה צורך להמציא שם נפרד עבור כל אחת מהמתודות: public class MyUtils { public static double max_double(double x, double y) {... public static long max_long(long x, long y) {... השמות מלאכותיים ולא נוחים 48

העמסת פונקציות )פחות נוחות( בעזרת מנגנון ההעמסה ניתן להגדיר: public static double max(double x, double y) public static long max(long x, long y) בחלק מהמקרים, אנו משלמים על הנוחות הזו max(1l, 1L); max(1.0, 1.0); max(1l, 1.0); max(1, 1); למשל, איזו מהפונקציות תופעל במקרים הבאים: // max(long,long) // max(double,double) // max(double,double) // max(long,long) 49

העמסה והקומפיילר המהדר מנסה למצוא את הגרסה המתאימה ביותר עבור כל קריאה לפונקציה על פי טיפוסי הארגומנטים של הקריאה אם אין התאמה מדויקת לאף אחת מחתימות השרותים הקיימים, המהדר מנסה המרות )casting( שאינן מאבדות מידע אם לא נמצאת התאמה או שנמצאות שתי התאמות "באותה רמת סבירות" או שפרמטרים שונים מתאימים לפונקציות שונות המהדר מודיע על אי בהירות )ambiguity( 50

העמסה וערכי ברירת מחדל לארגומנטים נתאר מצב שבו פונקציה המקבלת מספר ארגומנטים, מרבה לקבל את אותם ערכים עבור חלק מהארגומנטים כדי לחסוך ממי שקורא לפונקציה את הצורך לציין את כל הארגומנטים )אולי הם רבים, אולי ערכיהם איזוטרים(, נעמיס גרסה שבה יש לציין רק את הארגומנטים "החשובים באמת" 51

העמסה וערכי ברירת מחדל לארגומנטים לדוגמא: פונקציה לביצוע ניסוי פיזיקלי מורכב: public static void doexperiment(double altitude, double presure, double volume, double mass){... אם ברוב הניסויים המתבצעים הגובה, הלחץ והנפח אינם משתנים, יהיה זה מסורבל לציין אותם בכל קריאה לפונקציה לשם כך, נגדיר עוד גרסה יותר קומפקטית המקבלת כארגומנט רק את המסה: public static void doexperiment(double mass){... 52

העמסה ותאימות לאחור נניח כי כתבת את הפונקציה השימושית : המבצעת חישוב כלשהו על הארגומנט x public static int compute(int x) לאחר זמן מה, כאשר הקוד כבר בשימוש במערכת )גם מתוך מחלקות אחרות שלא אתה כתבת(, עלה הצורך לבצע חישוב זה גם בבסיסי ספירה אחרים )החישוב המקורי בוצע בבסיס עשרוני( בשלב זה לא ניתן להחליף את חתימת הפונקציה להיות: public static int compute(int x, int base) מכיוון שקטעי הקוד המשתמשים בפונקציה יפסיקו להתקמפל 53

העמסה, תאימות לאחור ושכפול קוד על כן במקום להחליף את חתימת השרות חדשה כגירסה מועמסת משתמשי הפונקציה המקורית לא נפגעים נוסיף פונקציה משתמשים חדשים יכולים לבחור האם לקרוא לפונקציה המקורית או לגרסה החדשה ע"י העברת מספר ארגומנטים מתאים בעיה קיים דמיון רב בין המימושים של הגרסאות המועמסות השונות )גוף המתודות )compute דמיון רב מדי - שכפול קוד זה הינו בעייתי מכמה סיבות שנציין מיד 54

55

העמסה, שכפול קוד ועקביות חסרונות שכפול קוד: קוד שמופיע פעמיים, יש לתחזק פעמיים כל שינוי, שדרוג או תיקון עתידי יש לבצע בצורה עקבית בכל המקומות שבהם מופיע אותו קטע הקוד כדי לשמור על עקביות שתי הגרסאות של compute את הגרסה הישנה בעזרת הגרסה החדשה: נממש public static int compute(int x, int base){ // complex calcultion... public static int compute(int x){ return compute(x, 10); 56

העמסת מספר כלשהו של ארגומנטים ב Java5 התווסף תחביר להגדרת שרות עם מספר לא ידוע של ארגומנטים )vararg( נניח שברצוננו לכתוב פונקציה שמחזירה את ממוצע הארגומנטים שקיבלה: public static double average(double x){ return x; public static double average(double x1, double x2){ return (x1 + x2) / 2; public static double average(double x1, double x2, double x3){ return (x1 + x2 + x3) / 3; למימוש 2 חסרונות: שכפול קוד לא תומך בממוצע של 4 ארגומנטים 57

העמסת מספר כלשהו של ארגומנטים רעיון: הארגומנטים יועברו כמערך public static double average(double [] args) { double sum = 0.0; for (double d : args) { sum += d; return sum / args.length; יתרון: שכפול הקוד נפתר חסרון: הכבדה על הלקוח - כדי לקרוא לפונקציה יש ליצור מערך public static void main(string[] args) { double [] arr = {1.0, 2.0, 3.0; System.out.println("Averge is:" + average(arr)); 58

ג'אווה באה לעזרה תחביר מיוחד של שלוש נקודות )...( יוצר את המערך מאחורי הקלעים: public static double average(double... args) { double sum = 0.0; for (double d : args) { sum += d; return sum / args.length; ניתן כעת להעביר מפונקציה מערך או ארגומנטים בודדים: double [] arr = {1.0, 2.0, 3.0; System.out.println("Averge is:" + average(arr)); System.out.println("Averge is:" + average(1.0, 2.0, 3.0)); 59

משתני מחלקה עד כה ראינו משתנים מקומיים משתנים זמניים המוגדרים בתוך מתודה, בכל קריאה למתודה הם נוצרים וביציאה ממנה הם נהרסים ב Java ניתן גם להגדיר משתנים גלובליים variables( )global משתנים אלו מכונים גם: משתני מחלקה variables( )class אברי מחלקה members( )class שדות מחלקה fields( )class מאפייני מחלקה properties/attributes( )class שדות סטטיים fields/members( )static משתנים אלו יוגדרו בתוך גוף המחלקה אך מחוץ לגוף של מתודה כלשהי, ויסומנו ע"י המציין static 60

משתני מחלקה לעומת משתנים מקומיים משתנים אלו, שונים ממשתנים מקומיים בכמה מאפיינים: תחום הכרות: מוכרים בכל הקוד )ולא רק מתוך פונקציה מסוימת( משך קיום: אותו עותק של משתנה נוצר בזמן טעינת הקוד לזיכרון ונשאר קיים בזיכרון התוכנית כל עוד המחלקה בשימוש אתחול: משתנים גלובליים מאותחלים בעת יצירתם. אם המתכנת לא הגדיר להם ערך אתחול - יאותחלו לערך ברירת המחדל לפי טיפוסם null( )0, false, הקצאת זיכרון: הזיכרון המוקצה להם נמצא באזור ה Heap )ולא באזור ה- )Stack 61

נשתמש במשתנה גלובלי counter הקריאות למתודה ()m: כדי לספור את מספר public class StaticMemberExample { public static int counter; //initialized by default to 0; public static void m() { int local = 0; counter++; local++; System.out.println("m(): local is " + local + "\tconter is " + counter); public static void main(string[] args) { m(); m(); m(); System.out.println("main(): m() was called " + counter + " times"); 62

שם מלא ניתן לפנות למשתנה counter גם מתוך קוד במחלקה אחרת, אולם יש צורך לציין את שמו המלא name( )qualified במחלקה שבה הוגדר משתנה גלובלי ניתן לגשת אליו תוך ציון שמו המלא או שם המזהה בלבד name( )unqualified בדומה לצורת הקריאה לשרותי מחלקה public class AnotherClass { public static void main(string[] args) { StaticMemberExample.m(); StaticMemberExample.m(); StaticMemberExample.m(); System.out.println("main(): m() was called " + StaticMemberExample.counter + " times"); 63

זה סופי ניתן לקבע ערך של משתנה ע"י ציון המשתנה כ final למשתנה final ניתן לבצע השמה פעם אחת בדיוק. כל השמה נוספת לאותו משתנה תגרור שגיאת קומפילציה דוגמא: public final static long uniqueid = ++counter; מוסכמה מקובלת היא שמות משתנים המציינים קבועים ב- UPPERCASE כגון: public final static double FOOT = 0.3048; public final static double PI = 3.1415926535897932384; 64

העברת ארגומנטים כאשר מתבצעת קריאה לשרות, ערכי הארגומנטים נקשרים לפרמטרים הפורמלים של השרות לפי הסדר, ומתבצעת השמה לפני ביצוע גוף השרות. בהעברת ערך לשרות הערך מועתק לפרמטר הפורמלי צורה זאת של העברת פרמטרים נקראת call by value כאשר הארגומנט המועבר הוא הפנייה )התייחסות, )reference העברת הפרמטר מעתיקה את ההתייחסות. אין העתקה של העצם שאליו מתייחסים זאת בשונה משפות אחרות כגון ++C שבהם קיימת גם שיטת העברה by reference גם reference מועבר by value Java בשפת 1 תוכנה תל אביב אוניברסיטת ב Java 65

ע) העברת פרמטרים by value העברת פרמטרים by value "י העתקה( יוצרת מספר מקרים מבלבלים, שידרשו מאיתנו הכרות מעמיקה יותר עם מודל הזיכרון של Java למשל, מה מדפיס הקוד הבא? public class CallByValue { public static void settofive(int arg){ arg = 5; public static void main(string[] args) { int x = 0; System.out.println("Before: x=" + x); settofive(x); System.out.println("After: x=" + x); Java בשפת 1 תוכנה תל אביב אוניברסיטת 66

מודל הזיכרון של Java משתנים גלובלים ועצמים אינו תלוי במתודה הנוכחית שרצה משתנים מקומיים וארגומנטים כל מתודה משתמשת באזור מסוים של המחסנית STACK HEAP CODE קוד התוכנית Java בשפת 1 תוכנה תל אביב אוניברסיטת 67

Primitives by value STACK משתנים מקומיים x וארגומנטים כל מתודה println משתמשת באזור מסוים של המחסנית x 0 args main HEAP משתנים גלובלים ועצמים אינו תלוי במתודה הנוכחית שרצה [ ] Before: x=0 public class CallByValue { public static void settofive(int arg){ arg = 5; CODE public static void main(string[] args) { int x = 0; System.out.println("Before: x=" + x); settofive(x); System.out.println("After: x=" + x); Java בשפת 1 תוכנה תל אביב אוניברסיטת 68

Primitives by value STACK HEAP arg 05 settofive x 0 args main [ ] Before: x=0 public class CallByValue { public static void settofive(int arg){ arg = 5; public static void main(string[] args) { int x = 0; System.out.println("Before: x=" + x); settofive(x); System.out.println("After: x=" + x); Java בשפת 1 תוכנה תל אביב אוניברסיטת CODE ש settofive println מסיימת לאחר את אתריצתה המקום שהוקצה משוחרר עלעלה- ה- Stack עבורה 69

Primitives by value STACK HEAP x println After: x=0 x 0 args main [ ] Before: x=0 public class CallByValue { public static void settofive(int arg){ arg = 5; public static void main(string[] args) { int x = 0; System.out.println("Before: x=" + x); settofive(x); System.out.println("After: x=" + x); Java בשפת 1 תוכנה תל אביב אוניברסיטת CODE ש println main מסיימת את מסיימת לאחר את ריצתה ריצתה המקום המקום שהוקצה שהוקצה משוחרר Stack על ה- עבורה 70

שמות מקומיים בדוגמא ראינו כי הפרמטר הפורמלי arg האקטואלי של הארגומנט x קיבל את הערך בחירת השמות השונים לא משמעותית - יכולנו לקרוא לשני המשתנים באותו שם ולקבל התנהגות זהה שם של משתנה מקומי מסתיר משתנים בשם זהה הנמצאים בתחום עוטף או גלובלים מתודה מכירה רק משתני מחסנית הנמצאים באזור שהוקצה לה על המחסנית )frame( Java בשפת 1 תוכנה תל אביב אוניברסיטת 71

מה יקרה אם המשתנה המקומי x שהועבר היה מטיפוס הפנייה? למשל, מה מדפיס הקוד הבא? import java.util.arrays; //explained later... public class CallByValue { public static void settozero(int [] arr){ arr = new int[3]; public static void main(string[] args) { int [] arr = {4,5; System.out.println("Before: arr=" + Arrays.toString(arr)); settozero(arr); System.out.println("After: arr=" + Arrays.toString(arr)); Java בשפת 1 תוכנה תל אביב אוניברסיטת 72

STACK Reference by value HEAP a Arrays.toString 4 5 [4,5] arr args main [ ] public class CallByValue { public static void settozero(int [] arr){ arr = new int[3]; CODE public static void main(string[] args) { int [] arr = {4,5; System.out.println("Before: arr=" + Arrays.toString(arr)); settozero(arr); System.out.println("After: arr=" + Arrays.toString(arr)); Java בשפת 1 תוכנה תל אביב אוניברסיטת 73

STACK Reference by value HEAP x println 4 5 [4,5] Before: arr= arr args main [ ] Before: arr= [4,5] public class CallByValue { public static void settozero(int [] arr){ arr = new int[3]; CODE public static void main(string[] args) { int [] arr = {4,5; System.out.println("Before: arr=" + Arrays.toString(arr)); settozero(arr); System.out.println("After: arr=" + Arrays.toString(arr)); Java בשפת 1 תוכנה תל אביב אוניברסיטת 74

STACK Reference by value HEAP arr arr args settozero main 4 5 [ ] 0 0 0 [4,5] Before: arr= Before: arr= [4,5] public class CallByValue { public static void settozero(int [] arr){ arr = new int[3]; CODE public static void main(string[] args) { int [] arr = {4,5; System.out.println("Before: x=" + Arrays.toString(arr)); settozero(arr); System.out.println("After: x=" + Arrays.toString(arr)); Java בשפת 1 תוכנה תל אביב אוניברסיטת 75

STACK a arr args Reference by value 4 5 Arrays.toString 0 0 main [ ] 0 HEAP [4,5] [4,5] Before: arr= Before: arr= [4,5] public class CallByValue { public static void settozero(int [] arr){ arr = new int[3]; CODE public static void main(string[] args) { int [] arr = {4,5; System.out.println("Before: arr=" + Arrays.toString(arr)); settozero(arr); System.out.println("After: arr=" + Arrays.toString(arr)); Java בשפת 1 תוכנה תל אביב אוניברסיטת 76

STACK x arr args Reference by value 4 5 println main [ ] After: arr= HEAP [4,5] [4,5] Before: arr= 0 After: arr= [4,5] 0 Before: arr= [4,5] 0 public class CallByValue { public static void settozero(int [] arr){ arr = new int[3]; CODE public static void main(string[] args) { int [] arr = {4,5; System.out.println("Before: arr=" + Arrays.toString(arr)); settozero(arr); System.out.println("After: arr=" + Arrays.toString(arr)); Java בשפת 1 תוכנה תל אביב אוניברסיטת 77

הפונקציה הנקראת והעולם שבחוץ בשיטת העברה by value לא יעזור למתודה לשנות את הארגומנט שקיבלה, מכיוון שהיא מקבלת עותק אז איך יכולה מתודה להשפיע על ערכים במתודה שקראה לה? ע"י ערך מוחזר ע"י גישה למשתנים או עצמים שהוקצו ב- Heap מתודות שמשנות את תמונת הזיכרון נקראות בהקשרים מסוימים Mutators או Transformers Java בשפת 1 תוכנה תל אביב אוניברסיטת 78

מה מדפיסה התוכנית הבאה? public class CallByValue { static int global = 4; public static int increment(int [] arr){ int local = 5; arr[0]++; global++; return local; public static void main(string[] args) { int [] arr = {4; System.out.println("Before: arr[0]=" + arr[0] + "\tglobal=" + global); int result = increment(arr); System.out.println("After: arr[0]=" + arr[0] + "\tglobal=" + global); System.out.println("result = " + result); Java בשפת 1 תוכנה תל אביב אוניברסיטת 79

STACK x Heap, Heap Hooray! println 4 HEAP arr args main Before: arr[0]=4 global=4 CallByValue.global 4 [ ] public class CallByValue { static int global = 4; public static int increment(int [] arr){ int local = 5; arr[0]++; global++; return local; CODE public static void main(string[] args) { int [] arr = {4; System.out.println("Before: arr[0]=" + arr[0] + "\tglobal=" + global); int result = increment(arr); System.out.println("After: arr[0]=" + arr[0] + "\tglobal=" + global); System.out.println("result = " + result); Java בשפת 1 תוכנה תל אביב אוניברסיטת 80

STACK local 5 Heap, Heap Hooray! 45 HEAP arr increment After: arr[0]=5 global=5 result arr args 5 main Before: arr[0]=4 global=4 CallByValue.global 45 [ ] public class CallByValue { static int global = 4; public static int increment(int [] arr){ int local = 5; arr[0]++; global++; return local; CODE public static void main(string[] args) { int [] arr = {4; System.out.println("Before: arr[0]=" + arr[0] + "\tglobal=" + global); int result = increment(arr); System.out.println("After: arr[0]=" + arr[0] + "\tglobal=" + global); System.out.println("result = " + result); Java בשפת 1 תוכנה תל אביב אוניברסיטת 81

STACK Heap, Heap Hooray! 5 result = 5 HEAP x println After: arr[0]=5 global=5 result arr args 5 main Before: arr[0]=4 global=4 CallByValue.global 5 [ ] public class CallByValue { static int global = 4; public static int increment(int [] arr){ int local = 5; arr[0]++; global++; return local; CODE public static void main(string[] args) { int [] arr = {4; System.out.println("Before: arr[0]=" + arr[0] + "\tglobal=" + global); int result = increment(arr); System.out.println("After: arr[0]=" + arr[0] + "\tglobal=" + global); System.out.println("result = " + result); Java בשפת 1 תוכנה תל אביב אוניברסיטת 82

STACK Heap, Heap Hooray! 5 result = 5 HEAP x println After: arr[0]=5 global=5 result arr args 5 main Before: arr[0]=4 global=4 CallByValue.global 5 [ ] public class CallByValue { static int global = 4; public static int increment(int [] arr){ int local = 5; arr[0]++; global++; return local; CODE public static void main(string[] args) { int [] arr = {4; System.out.println("Before: arr[0]=" + arr[0] + "\tglobal=" + global); int result = increment(arr); System.out.println("After: arr[0]=" + arr[0] + "\tglobal=" + global); System.out.println("result = " + result); Java בשפת 1 תוכנה תל אביב אוניברסיטת 83

משתני פלט Parameters( )Output לכאורה אוקסימורון איך נכתוב פונקציה שצריכה להחזיר יותר מערך אחד? הפונקציה תחזיר מערך ומה אם הפונקציה צריכה להחזיר נתונים מטיפוסים שונים? הפונקציה תקבל כארגומנטים הפניות לעצמים שהוקצו ע"י הקורא לפונקציה )למשל הפניות למערכים(, ותמלא אותם בערכים משמעותיים בשפות אחרות )למשל #C( קיים תחביר מיוחד לסוג כזה של ארגומנטים ב Java אין לכך סימון מיוחד Java בשפת 1 תוכנה תל אביב אוניברסיטת 84