של צוות הפיתוח מאוניברסיטת ת"א
Download
Report
Transcript של צוות הפיתוח מאוניברסיטת ת"א
יסודות מדעי המחשב 2
• פרק – 1מחלקות ועצמים :הרחבה והעמקה
– מחלקה – הגדרה ושימוש
– פעולות גישה
– תכונות מורכבות
• פרק – 2תבניות אלגוריתמיות
מערך דו-ממדי -חיפוש בינרי ,מיון (בחירה ,הכנסה ובועות) ומיזוג
• פרק – 3פתרון בעיות
– בעיות המשלבות פיתוח אלגוריתמי יחד עם הגדרת
מחלקות מתאימות לפתרון הבעיה
1
דידקטיקה
• הצגת הנושאים באמצעות אוסף של בעיות פתורות
• לכל בעיה מוטיבציה כגון:
–
–
–
–
–
–
–
הכרת המושגים מחלקה ועצם ,הגדרת מחלקה בסיסית והיכרות עם פעולה
בונה
היכרות עם פעולות גישה – setוget-
הצגת תכונות מורכבות -מערך כתכונה
מערך של עצמים
העמקה בהעברת פרמטרים
הצגת מבנה נתונים – מערך דו ממדי
הצגת תבנית אלגוריתמית
• כל בעיה מלווה בשאלות נוספות
2
שלבים בפתרון בעיה
• הצגת הבעיה
– הצגת דוגמת קלט
• זיהוי המחלקה המתאימה לפתרון הבעיה
– הגדרת התכונות
– הגדרת הפעולות
– מימוש
• הגדרת המחלקה הראשית
–
–
–
–
פירוק לתת משימות
בחירת משתנים
אלגוריתם
מימוש
3
הצגת בעיות
.1משחק קוביות
.2סוכנות נסיעות
.3מפעל תכשיטים
4
בעיה – 1משחק קוביות
• כתבו תכנית המדמה משחק קובייה בין זוג שחקנים:
–
–
–
–
כל שחקן מטיל שתי קוביות בתורו וצובר את הנקודות מהטלות
הקוביות שלו.
אם שחקן מטיל דאבל (כגון )3-3השחקן השני מקבל ניקוד
כפול בתור הבא.
"סיבוב" במשחק מורכב מתור של שחקן ראשון ואחריו תור של
שחקן שני.
המנצח הוא הראשון שמגיע ל 100-נקודות או יותר .אם שני
השחקנים הגיעו ל 100-נקודות או יותר באותו "הסיבוב" נכריז
על תיקו.
5
דוגמה
• סיבוב :1
5 4
9
1 2
3
• סיבוב :2
3 3
6
6 1
7+7
• סיבוב :3
5 6
11
3 2
5
26
22
6
פתרון מונחה עצמים
• מחלקה המגדירה שחקן
• פעולה ראשית המדמה את המשחק
7
המחלקה שחקן
הגדרת התכונות
• :points
– משתנה מטיפוס שלם המייצג את הניקוד המצטבר שצבר
השחקן עד כה.
הגדרת הפעולות
• פעולה בונה:
– הפעולה הבונה לא מקבלת פרמטרים.
– הפעולה מאתחלת את הניקוד המצטבר.
8
הגדרת הפעולות -המשך
• :play
– הפעולה מקבלת פרמטר בוליאני האומר האם לשחק
תור רגיל או תור עם ניקוד כפול.
– הפעולה מדמה את זריקת הקוביות.
– מעדכנת את הניקוד המצטבר של השחקן.
– הפעולה מחזירה האם יצא דאבל.
• :getPoints
– פעולת גישה המחזירה את הניקוד המצטבר של
השחקן.
• :isWin
– פעולת גישה בוליאנית המחזירה האם השחקן נצח.
9
מימוש המחלקה שחקן
import java.util.Random;
public class Player
{
private int points;
public Player()
{
points = 0;
}
10
תכונות השחקן
הפעולה הבונה
פעולה לביצוע תור במשחק
public boolean play(boolean doublePoints)
{
Random rnd = new Random();
int die1 = rnd.nextInt(6) + 1;
הטלת קוביות
int die2 = rnd.nextInt(6) + 1;
if (!doublePoints)
points = points + die1 + die2;
חישוב הניקוד
else
points = points + 2 * (die1 + die2);
return (die1 == die2);
להחזיר האם יצא דאבל
}
11
פעולות גישה להחזרת מספר הנקודות שהשחקן צבר
)(public int getPoints
{
;return points
}
פעולות המחזירה אמת אם הניקוד המצטבר גדול או שווה 100
)(public boolean isWin
{
;)return (points >= 100
}
} // class Player
12
הגדרת הפעולה הראשית
הפעולה הראשית מדמה את המשחק:
• פירוק לתת-משימות
– יצירת השחקנים
– ניהול המשחק
– הצגת תוצאות
• בחירת משתנים
– : player1משתנה מטיפוס שחקן ,מייצג את שחקן 1
– : player2משתנה מטיפוס שחקן ,מייצג את שחקן 2
– :doubמשתנה בוליאני המציין אם יש לשחק תור כפול
13
מימוש הפעולה הראשית
public class DiceGame
{
public static void main(String[] args)
{
Player player1 = new Player();
יצירת שחקנים
Player player2 = new Player();
boolean doub = false;
while (!player1.isWin() && !player2.isWin())
{
שחקן ראשון משחק
doub = player1.play(doub);
System.out.println("player1: "+ player1.getPoints());
שחקן שני משחק
doub = player2.play(doub);
System.out.println("player2: "+ player2.getPoints());
}
14
הצגת תוצאות
if (player1.isWin() && player2.isWin())
תיקו
System.out.println("tie");
else if (player1.isWin())
שחקן ראשון ניצח
System.out.println("player 1 won");
else
שחקן שני ניצח
System.out.println("player 2 won");
} // main
} // class DiceGame
15
בעיה – 2סוכנות נסיעות
• בסוכנות הנסיעות "שלום שלום" מארגנים טיולים.
– הסוכנות מציעה 100טיולים ,שלכל אחד מהם מספר בין 1ל-
.100
– לכל טיול יכולים להירשם עד 50מטיילים.
– מטייל יכול להירשם לטיול רק אם יש מקום בטיול.
• פתחו וממשו אלגוריתם לניהול סוכנות הנסיעות.
– האלגוריתם ירשום אנשים על פי שמם לטיולים אליהם הם
מבקשים להירשם ,עד אשר יתקבל השם ” "Endלסיום הקלט.
– כפלט ,האלגוריתם יציג את רשימת הנרשמים לכל טיול.
16
פתרון מונחה עצמים
• מחלקה המגדירה טיול
• פעולה ראשית :יוצרת טיולים ,רושמת מטיילים לטיולים,
ומציגה את רשימת הנרשמים בכל טיול.
17
המחלקה טיול
הגדרת התכונות
tripNum
numOfPassengers
passengers
•
•
•
MAX_PER_TRIP
•
הגדרת הפעולות
פעולה בונה
addPassenger
getPassengers
getTripNum
getNumOfPassengers
... מימוש המחלקה
18
•
•
•
•
•
מימוש המחלקה טיול
public class Trip
{
private final int MAX_PER_TRIP = 50;
private int tripNum;
private int numOfPassengers;
private String[] passengers;
19
תכונות הטיול
public Trip(int tripNum)
הפעולה הבונה
{
this.tripNum = tripNum;
passengers = new String[MAX_PER_TRIP];
numOfPassengers = 0;
}
הוספת מטייל והחזרת ערך בוליאני המציין אם יש מקום
public boolean addPassenger(String name)
{
if (numOfPassengers < MAX_PER_TRIP) אם יש מקום
{
passengers[numOfPassengers] = name;
numOfPassengers++;
הוספת מטייל ועדכון
return true;
מספר הנרשמים
} // if
return false;
אין מקום
}
20
החזרת שמות הנרשמים לטיול
public String[] getPassengers()
{
הקצאת מערך חדש
String[] pass = new String[numOfPassengers];
for(int i = 0; i < numOfPassengers; i++)
{
העתקת הרשימה
pass[i] = passengers[i];
}
החזרת רשימת המשתתפים
return pass;
}
21
פעולות גישה להחזרת מספר הטיול
public int getTripNum()
{
return tripNum;
}
פעולות גישה להחזרת מספר הנרשמים לטיול
public int getNumOfPassengers()
{
return numOfPassengers;
}
}// class Trip
22
הגדרת הפעולה הראשית
רישום מטיילים לטיולים והצגת רשימת הנרשמים בכל טיול :
פירוק לתת-משימות
– יצירת מערך של 100טיולים ואתחול הטיולים.
– קליטת שמות אנשים עד .Endעבור כל אחד קליטת מספר
הטיול אליו הוא מעוניין להירשם ורישום לטיול זה.
– הצגת רשימת הנרשמים בכל טיול.
בחירת משתנים
–
–
–
–
:TRIPS_NUMקבוע המייצג את מספר הטיולים
: tripsמערך הטיולים
: nameמחרוזת המייצגת שם של מטייל
:tripNumמספר הטיול המבוקש
מימוש הפעולה הראשית...
23
מימוש הפעולה הראשית
public class TravelAgency
{
public static void main(String[] args)
{
final int TRIPS_NUM = 100;
Trip[] trips = new Trip[TRIPS_NUM];
String name;
int tripNum;
for (int i = 0; i < TRIPS_NUM; i++)
{
trips[i] = new Trip(i + 1);
}
24
הגדרת המשתנים
יצירת הטיולים
'End’ קליטת מטיילים והוספתם לטיולים עד לקליטת
name = In.readString)"Enter passenger name, type ‘End’ to finish"(;
while ( !name.equals("End") )
{
tripNum = In.readInt("Enter the trip number");
if (trips[tripNum-1].addPassenger(name))
הוספת מטייל
{
אם יש מקום
System.out.println("You were added successfully");
}
else
{
אם אין מקום
System.out.println("This trip is full");
}
name = In.readString)"Enter passenger name, type ‘End’ to finish"(;
} // while
25
הצגת רשימת הנרשמים בכל טיול
String[] passengers;
for (int i = 0; i < TRIPS_NUM ; i++)
מספר הנרשמים לטיול
{
System.out.println("Trip " + trips[i].getTripNum() +
" has "+ trips[i].getNumOfPassengers()+" passengers");
passengers = trips[i].getPassengers();
for (int j = 0; j < passengers.length; j++)
הצגת רשימת
{
הנרשמים לטיול
System.out.println(passengers[j]);
}
} // for
} // main
} // class TravelAgency
26
בעיה – 3מפעל תכשיטים
•
במפעל לתכשיטים מרכיבים שרשרות מחרוזים
בשלושה צבעים :אדום ,צהוב ,ירוק.
–
–
•
שרשרת "אחידה" היא שרשרת שיש בה
מספר שווה של חרוזים מכל אחד מהצבעים.
שרשרת "פגומה" היא שרשרת שאינה "אחידה".
כתבו את מחלקת "מפעל תכשיטים".
–
–
הגדירו פעולה המקבלת מחרוזת חרוזים ובודקת
האם היא שרשרת אחידה או פגומה.
הגדירו פעולות המחזירות :כמה שרשרות יוצרו באותו היום
וכמה מתוכם היו פגומות.
27
•
כתבו פעולה ראשית הקולטת את החרוזים לייצור
שרשרות במפעל ביום מסוים.
– בעבור כל שרשרת יש לקלוט מחרוזת
המורכבת מהתווים ’ ,‘Y’ ,‘Rו ‘G’-המייצגות את
צבעי החרוזים Yellow ,Redו.Green-
”“RRRGGGYYY
– הקלט יסתיים כאשר תיקלט מחרוזת ריקה.
– לאחר סיום הקלט יש להציג:
•
•
את מספר השרשרות שיוצרו במפעל באותו היום,
את מספר השרשרות הפגומות.
28
פתרון מונחה עצמים
• מחלקה המגדירה מפעל תכשיטים
• פעולה ראשית המפעילה את מפעל התכשיטים
סה"כ שרשרות
סה"כ פגומות
29
המחלקה מפעל תכשיטים
הגדרת התכונות
• totalCount
• faultyCount
הגדרת הפעולות
•
•
•
•
פעולה בונה
createNecklace
getTotalCount
getFaultyCount
מימוש המחלקה "מפעל תכשיטים"...
30
"מימוש המחלקה "מפעל תכשיטים
public class Factory
{
private int totalCount;
private int faultyCount;
31
public Factory()
{
totalCount = 0;
faultyCount = 0;
}
תכונות המפעל
הפעולה הבונה
public void createNecklace(String beeds) יצירת שרשרת
{
מונים לצבעים
int red = 0; int yellow = 0; int green = 0;
עדכון מונה השרשרות
totalCount++;
if (!(beeds.length()%3 == 0)){
אם מספר החרוזים לא מתחלק
faultyCount++;
. => המחרוזת פגומה3-ב
return;
}
for (int i=0; i<beeds.length(); i++)
switch (beeds.charAt(i)) {
case ‘R’: red++; break;
ספירת חרוזים
case ‘Y’: yellow++; break;
case ‘G’: green++; break;
} //switch
if (!(red == yellow && yellow == green))
faultyCount++;
?האם המחרוזת פגומה
32 }
פעולות גישה להחזרת מספר השרשרות שיוצרו במפעל
public int getTotalCount()
{
return totalCount;
}
פעולות גישה להחזרת מספר השרשרות הפגומות
public int getFaultyCount()
{
return faultyCount;
}
} // class Factory
33
הגדרת הפעולה הראשית
הפעולה הראשית מפעילה את מפעל התכשיטים:
• פירוק לתת-משימות
– יצירת מפעל תכשיטים
– קליטת מחרוזות חרוזים עד מחרוזת ריקה והעברתם לפעולת
הייצור במפעל.
– הצגת פלט :מספר השרשרות שיוצרו במפעל באותו היום ומספר
השרשרות הפגומות.
• בחירת משתנים
– : factoryמשתנה מטיפוס מפעל התכשיטים
– : beedsמחרוזת המייצגת חרוזים של שרשרת
• מימוש הפעולה הראשית...
34
מימוש הפעולה הראשית
public class FactoryRunner
{
public static void main(String[] args)
{
Factory factory = new Factory();
הגדרת המשתנים
String beeds;
beeds = In.readString("Enter beeds using RYG, " +
"press ‘Enter’ to finish"(;
while ( ! beeds.equals("") )
יצירת מחרוזות
{
factory.createNecklace(beeds);
beeds = In.readString("Enter beeds using RYG, " +
"press ‘Enter’ to finish"(;
} // while
35
:הצגת פלט
מספר השרשרות שיוצרו
System.out.println)“Total Number of Necklaces created: “ +
factory.getTotalCount());
System.out.println)“Total Number of faulty Necklaces: " +
factory.getFaultyCount());
} // main
} // class FactoryRunner
36
מספר השרשרות הפגומות
שאלות?
37
הסוף !
38