IOO Exam Moeda 2017

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 6

‫‪NETANYA ACADEMIC COLLEGE‬‬ ‫המכללה האקדמית נתניה‬

‫‪16 Kibutz-Galuyot St.‬‬ ‫רח' קיבוץ גלויות ‪16‬‬


‫‪Kiryat Yitzhak Rabin‬‬ ‫קרית יצחק רבין‬
‫‪NETANYA 42365, ISRAEL‬‬ ‫נתניה ‪42365‬‬

‫מבוא לתכנות מונחה עצמים תשע"ז ‪ -‬בחינת סיכום מועד א'‬

‫‪27/02/2017‬‬
‫שימו לב‪ :‬את התשובות יש לכתוב אך ורק במחברת הבחינה!‬ ‫‪‬‬
‫שימו לב‪ :‬יש להקפיד על תיכון (‪ )design‬בסגנון מונחה עצמים‪ .‬אין להסתפק ב"תוכנה שעובדת" בלבד!‬ ‫‪‬‬
‫משך הבחינה ‪ 3‬וחצי שעות‪.‬‬ ‫‪‬‬
‫יש לפתור את כל השאלות‪.‬‬ ‫‪‬‬
‫בחינה בחומר פתוח‪.‬‬ ‫‪‬‬
‫בטרם תיגשו לפתרון ודאו כי הטופס מכיל ‪ 6‬עמודים ו‪ 4 -‬שאלות‪.‬‬ ‫‪‬‬
‫מרצים‪ :‬ד"ר אחמד ג'בארה‪ ,‬גב' קרן כהן‪ ,‬ד"ר תמיר לוי‪.‬‬ ‫‪‬‬
‫מתרגלים‪ :‬מר קובי דאבוש‬ ‫‪‬‬

‫בהצלחה!!!‬

‫‪Fax: (972-9) 8844439‬‬ ‫פקס‪:‬‬ ‫טל‪Tel: (972-9) 8607777 :‬‬


‫שאלה מס' ‪ 20( 1‬נקודות)‬
‫כתבו שיטה רקורסיבית סטטית בשם ‪ .findNum‬השיטה תקבל כפרמטרים מערך של מספרים שלמים ‪ ,arr‬גודלו‪ , n‬מספר‬
‫שלם ‪ num‬ומספר שלם ‪ . k‬השיטה תחזיר אמת אם המספר ‪ num‬מופיע בדיוק ‪ k‬פעמים במערך ‪ , arr‬אחרת השיטה‬
‫תחזיר שקר‪.‬‬
‫לדוגמה‪:‬‬
‫{ )‪public static boolean findNum(int[] arr, int n, int num, int k‬‬
‫…‬
‫}‬
‫{ ) ‪public static void main( String[] args‬‬
‫; } ‪int[] a = { 3 , 2 , 7 , 2 , 3 , 1 , 3 , 2‬‬
‫; ) ) ‪System.out.println ( findNum ( a , a.length , 2 , 3‬‬
‫יודפס ‪ true‬משום שהמספר ‪ 2‬מופיע בדיוק ‪ 3‬פעמים במערך‪//‬‬
‫; ) ) ‪System.out.println ( findNum ( a , a.length , 3 , 2‬‬
‫יודפס ‪ false‬משום שהמספר ‪ 3‬לא מופיע בדיוק פעמיים במערך‪//‬‬
‫; ) ) ‪System.out.println ( findNum ( a , a.length , 9 , 4‬‬
‫יודפס ‪ false‬משום שהמספר ‪ 9‬לא מופיע בדיוק ‪ 4‬פעמים במערך‪//‬‬
‫{‬

‫שאלה מס' ‪ 20( 2‬נקודות)‬


‫שתי מילים נקראות ״שוות בתווים״ אם יש להן אותם תווים אך לאו דווקא באותו הסדר‪.‬‬
‫למשל‪ ,‬המילים “‪”abac‬ו “‪”baac‬הן שוות בתווים‪.‬‬
‫כתבו שיטה סטטית בשם ‪ searchMixed‬שמקבלת שלושה פרמטרים‪ :‬מילה ‪ , word‬מחרוזת ‪ s‬ומספר שלם ‪ .k‬השיטה‬
‫תחזיר אמת אם במחרוזת ‪s‬יש בדיוק ‪ k‬מילים השוות בתווים למילה ‪ . word‬אחרת‪ ,‬השיטה תחזיר שקר‪.‬‬
‫לדוגמה‪ :‬עבור המילה “ ‪ , ”abac‬המחרוזת " ‪ "aabc abdca caba xyz ab‬ו ‪ k=2‬השיטה תחזיר אמת כי המלים ‪aabc,‬‬

‫‪ caba‬שוות בתווים למילה ‪.abac‬‬

‫הערה‪ :‬ניתן להניח שהמילה ‪ 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‬‬ ‫מתאר את ה"צורה" של הקלף ‪//‬‬

‫{)‪public Card(int value, char suit‬‬


‫;‪this.value = value‬‬
‫;‪this.suit = suit‬‬
‫}‬
‫};‪public int getValue(){return value‬‬

‫פונקציה שמחזירה את הייצוג של העצם כמחרוזת – לצורכי הדפסה ‪//‬‬


‫{)(‪public String toString‬‬
‫לקיצור לא פרטתי לכם את גוף הפונקציה ‪//‬‬
‫}‬
‫‪//‬‬ ‫מערך סטטי שמכיל את כל ה"צורות" האפשריות‬
‫‪//‬‬ ‫יהלום ‪'D' - Diamond -‬‬
‫‪//‬‬ ‫פיק ‪'S' - Spade -‬‬
‫‪//‬‬ ‫לב ‪'H' - Hart -‬‬
‫‪//‬‬ ‫תלתן ‪'C' - Club -‬‬
‫‪//‬‬ ‫ג'וקר – ‪'J' - Joker‬‬
‫;}'‪public static char[] suits = {'D','S','H','C', 'J‬‬
‫}‬

‫‪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‬רכב קטן)‪,‬‬

‫‪( 2‬רכב בינוני)‪,‬‬

‫‪( 3‬רכב גדול)‪.‬‬

‫המחלקה ‪ Slot‬מייצגת מקום חניה בחניון‪ .‬מקום חניה מתואר על ידי רכב אשר חונה בו וגודל ‪ .‬גודל מקום חניה‬

‫יכול להיות‪( 1 :‬רק רכב קטן יכול לחנות)‪( 2 ,‬רכב בינוני או רכב קטן יכול לחנות)‪ ,‬או ‪( 3‬רכב בכל גודל יכול לחנות)‪.‬‬

‫המחלקה ‪ ParkingLot‬מייצגת חניון אשר מורכב ממקומות חניה שכל מקום חניה יכול להכיל רכב אחד כפי‬

‫שתואר קודם‪.‬‬

‫‪ 4.1‬הגדירו את המחלקות ‪ . Car, Slot, 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‬‬

You might also like