Professional Documents
Culture Documents
IOO Exam Moeda 2017
IOO Exam Moeda 2017
IOO Exam Moeda 2017
27/02/2017
שימו לב :את התשובות יש לכתוב אך ורק במחברת הבחינה!
שימו לב :יש להקפיד על תיכון ( )designבסגנון מונחה עצמים .אין להסתפק ב"תוכנה שעובדת" בלבד!
משך הבחינה 3וחצי שעות.
יש לפתור את כל השאלות.
בחינה בחומר פתוח.
בטרם תיגשו לפתרון ודאו כי הטופס מכיל 6עמודים ו 4 -שאלות.
מרצים :ד"ר אחמד ג'בארה ,גב' קרן כהן ,ד"ר תמיר לוי.
מתרגלים :מר קובי דאבוש
בהצלחה!!!
הערה :ניתן להניח שהמילה wordוהמחרוזת sמכילות אותיות קטנות בלבד ,ובמחרוזת sבין כל שתי מילים מפריד רווח
בודד.
2
שאלה מס' 28( 3נקודות)
התוכנית הבאה מממשת משחק קלפים .בתוכנית זו הוגדרו המחלקות הבאות . Card, Deck, Game :ענו על
הסעיפים הבאים על סמך תוכנית זו (מובאת בהמשך).
תארו מה מבצעת השיטה unknownשבמחלקה .Deckבפרט תאר איזה עצם היא מחזירה (ומה הערכים .1
שהיא מחזירה) והאם היא שיטת מחלקה או שיטת אובייקט.
להלן המחלקה Gameהמתארת משחק קלפים פופלארי
נסו לתאר את המשחק (אם תוכל לכתוב את שמו – עוד יותר טוב) .תאר את התפקיד של המשתנים players .2
ו table-של המחלקה .Gameתאר כמה שחקנים משחקים במשחק ומתי מוכרז (מודפס) מנצח.
תארו מה מבצעת הפונקציה )(initשבמחלקה .Game .3
{ class Card
;private int value מתאר את הערך על הקלף //
;private char suit מתאר את ה"צורה" של הקלף //
3
class Deck {
private Card[] cards;
lic boolean isFull(){
private int deckStart;
eturn deckSize == cards.length;
private int deckEnd;
private int deckSize;
lic Deck shuffle (){
public int getDeckSize() {
or (int i = 0 ; i < deckSize ; i++)
return deckSize ;
}
int rnd = (int)(Math.random() * deckSize);
int idx = (deckStart+rnd)%cards.length;
public Deck (int size){
Card temp = cards[idx];
cards = new Card[size];
cards[idx] = cards[i];
deckSize=deckStart=deckEnd=0;
cards[i] = temp;
}
eturn this;
public boolean add(Card c){
if (isFull()) return false;
cards[deckEnd] = c;
lic static Deck unknown(){
deckEnd++;
eck result = new Deck(54);
deckEnd %= cards.length;
or (int v = 2 ; v <= 14 ; v++){
deckSize++;
for (int s = 0 ; s < 4 ;s++)
return true;
{
}
result.Add(new Card(v,Card.suits[s]));
} public Card draw(){
if (deckSize == 0) return null;
esult.Add(new
Card cCard(15, 'J'));
= cards[deckStart];
esult.Add(new Card(15, 'J'));
deckStart++;
eturn result;
deckStart %= cards.length;
deckSize--;
return c;
}
}
4
public class Game {
private Deck[] players;
private
privatevoid play_1_round()
Deck table;
{
Card c0static
public = null, c1 main
void = null;
(String[] args){
int
Gamecards
game= =1;new Game();
ifgame.play();
(table.getDeckSize() > 0) cards = 3;
}for (int i = 0 ; i < cards ; i++)
{
c0 = players[0].Draw();
System.out.println(
public void init(){
table"Player 0 throws " + c0.toString());
= Deck.unknown().shuffle();
c1 = players[1].Draw();
players = new Deck[2];
System.out.println(
players[0] = new Deck(54);
players[1] =1 new
"Player throws " + c1.toString());
Deck(54);
table.Add(c0);
while (table.getDeckSize() > 0){
table.Add(c1);
players[0].Add(table.Draw());
} players[1].Add(table.Draw());
if
} (c1.getValue() == c0.getValue()) return;
{
int winner = 0, loser = 1;
if (c1.getValue() > c0.getValue()) {
winner = 1; loser = 0 ;
}
System.out.println(
"Player " + winner +
" wins the following cards:");
do{ void play(){
public
{ Card c = table.Draw();
init();System.out.println(c.toString());
players[winner].Add(c);
int rounds = 0;
}while(table.getDeckSize()
while (true){ > 0);
} play_1_round();
rounds++;
System.out.println("After round " + rounds
+ ", player 0 has " + players[0].getDeckSize() + " cards"
+ ", player 1 has " + players[1].getDeckSize() + " cards");
if (players[0].IsFull()) { 5
System.out.println(
"player 0 won!!! in round number " + rounds);
return;
שאלה מס' 32( 4נקודות)
המחלקה Carמייצגת רכב אשר מתואר על ידי מספר הרכב וגודל הרכב .גודל הרכב מיוצג על ידי intשיכול
( 1רכב קטן),
המחלקה Slotמייצגת מקום חניה בחניון .מקום חניה מתואר על ידי רכב אשר חונה בו וגודל .גודל מקום חניה
יכול להיות( 1 :רק רכב קטן יכול לחנות)( 2 ,רכב בינוני או רכב קטן יכול לחנות) ,או ( 3רכב בכל גודל יכול לחנות).
המחלקה ParkingLotמייצגת חניון אשר מורכב ממקומות חניה שכל מקום חניה יכול להכיל רכב אחד כפי
שתואר קודם.
4.2הגדירו בנאי/ים למחלקות השונות .להלן מספר הערות שיש להתחשב בהן בעת הגדרת הבנאים:
מקום חניה אינו מכיל רכב בעת הקמתו .יודעים רק את גודלו.
בעת הקמת החניון יודעים כמה מקומות חניה לכל היותר יהיה בו.
בעת הקמת חניון חדש מייצרים גם את מקומות החניה (ללא רכבים כמובן) .קביעת גודל מקום חניה
תהיה אקראית.
4.3הגדירו במחלקה ParkingLotפעולה addשמקבלת כפרמטר עצם מסוג רכב ומוסיפה אותו לחניון .רכב יכול
לחנות בחניון רק אם יש מקום חניה פנוי ותואם לגודל הרכב .השיטה תחזיר אמת אם הצליחה להוסיף את הרכב
4.4הגדירו במחלקה ParkingLotשיטה בשם searchאשר מקבלת מספר רכב כפרמטר ומחזירה את מקום
החניה (עצם מסוג )Slotשבו חונה רכב זה .אם אין רכב עם מספר דומה בחניון השיטה תחזיר .null
4.5הגדירו שיטה בשם exitאשר מקבלת כפרמטר מספר רכב ומוציאה אותו מהחניון .השיטה תמצא תחילה את
4.6בשל ריבוי הדרישות למקומות חניה לרכבים קטנים הוחלט לשרטט את החניון מחדש .עליכם לכתוב שיטה
בשם doSplitאשר עוברת על כל מקומות החניה בחניון ומפצלת אותן למקומות חניה קטנים יותר .מקום חניה
בגודל 1נותר ללא שינוי ,מקום חניה בגודל 2מתפצל לשני מקומות חניה בגודל 1כל אחד ,ומקום חניה בגודל 3
מתפצל לשני מקומות חניה כאשר הנוכחי הופך למקום חניה בגודל 2והחדש בגודל .1
הערה :בסעיף זה עליכם להגדיל את המערך כדי שיתאים למספר מקומות החניה החדש.
6