של צוות הפיתוח מאוניברסיטת ת"א

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‬‬