מדעי המחשב – אוניברסיטת בר אילן ( מועד א 98

‫‪2011 Feb 6‬‬
‫אוניברסיטת בר אילן – מדעי המחשב‬
‫מבחן בתכנות מתקדם (‪ )98-012‬מועד א‬
‫הנחיות כלליות‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫רשמו תשובות קצרות ומדוייקות‪.‬‬
‫משך הבחינה שעתיים‪.‬‬
‫יש לענות על כל השאלות‪.‬‬
‫בהצלחה!‬
‫‪ .1‬עבור אפלקצית )‪" (Desktop Application‬דסק חדשות ‪ "360‬מהו התיכון )‪ (High Level Design‬המוצע‬
‫בהתחשב בנתונים הבאים‪:‬‬
‫‪ ‬האפליקציה מציגה ‪ dashboard‬של חדשות במספר חלונות מסוגים שונים ‪ .‬חלון חדשות כלליות‪,‬‬
‫חלונות לפי נושאים ניתנים לקינפוג‪.‬‬
‫‪ ‬המערכת מציגה חלון מפת עולם עם סימונים של חדשות ותקציר קצר כ ‪. tooltip‬‬
‫‪ ‬המערכת "מקשיבה" למספר מקורות מידע (מושכת עדכונים)‪ :‬אתרי ‪ , Web‬וחיפושי ‪. Twitter‬‬
‫‪ ‬ניתן לבצע שמירה כ ‪ PDF‬המהווה מעין עיתון של תמונת המצב העכשוית‪.‬‬
‫‪ ‬ממשק המשתמש זמין ופעיל תמיד (גם בזמן שמירה‪/‬יצירת ה ‪.) PDF‬‬
‫‪ ‬נדרשת יכולת הרחבה לאתרי חדשות נוספים ומקורות מידע נוספים‪ .‬כמו כן צפויים תקונים‬
‫כשאתרים משתנים (יתכן ע"י צד שלישי)‪.‬‬
‫‪.i‬‬
‫‪.ii‬‬
‫‪.iii‬‬
‫מהו סרטוט המערכת ופריסתה לתתי מערכות (ומה הם שיקולי ה‪Design Pattern & Application -‬‬
‫‪.) Pattern‬‬
‫תכנון מקביליות (‪ - )Multi-tasking‬סרטוט אינטראקציה ושיקולי התכנון‪.‬‬
‫כיצד בדיוק (לוגית ופיזית) תמומש יכולת ההרחבה לטעינה‪/‬שמירה בפורמטים שונים (וכיצד בפועל‬
‫לאחר שהתוכנה הותקנה תתבצעה ההרחבה ע"י צד שלישי)‪.‬‬
‫‪ .2‬הסבירו והדגימו בקצרה (פסקה)‪:‬‬
‫עקרון העדפת הרכבה על ירושה (‪. )Prefer composition over inheritance‬‬
‫‪.i‬‬
‫‪Composite design pattern‬‬
‫‪.ii‬‬
‫‪ inlining / Inline‬ב ‪ C++‬וב ‪ - Java‬הדומה והשונה‪.‬‬
‫‪.iii‬‬
‫תהליך יצירת ‪ process‬מקובץ ריצה עד הרצת ה ‪. main‬‬
‫‪.iv‬‬
:‫ נתון הממשק הבא‬.3
public interface Command {
public void execute();
}
‫ תחל רק לאחר‬Command ‫ כך שכל‬,‫ ע”פ סדר הגעתן‬Commands ‫ שאמור להריץ‬,‫וכן נתון הקוד הבא‬
.‫שנסתימה זו שהגיעה לפניה‬
public class CommandExecutor {
static ArrayBlockingQueue<Command> queue=
new
ArrayBlockingQueue<Command>(10);
static volatile boolean active=false;
public static void addCommand(Command c){
queue.add(c);
}
public static void activate() throws Exception{
if(!active){
active=true;
new Thread(){
public void run(){
while(active){
if(!queue.isEmpty())
queue.poll().execute();
}
}
}.start();
} else
throw new Exception("executor already active");
}
public static void deactivate(){
active=false;
}
}
?‫ מהן‬,‫ בעיות בקוד‬2 ‫זהו‬
.‫תארו את המצב שגורם לכל בעיה‬
.i
‫שכתבו את הקוד במחברת הבחינה‬
.‫כך ששתי הבעיות שתיארתם יפתרו‬
.ii
:‫ עבור הקוד הבא‬.4
?‫מה אמור היה לעשות הקוד‬
.i
)2+( ?‫מהם הבעיות בקוד‬
.ii
?‫כיצד ניתן לתקן את הבעיות‬
.iii
// imports omited
class Entry{
public String word;
public Date creationDate;
public Entry(String w) {word=w;}
public static Entry make(String word){return new Entry(word);}
// code (omitted) to make it a value like: hashCode, equals, comparison etc.
}
public class Prg{
static Set<String> vocabulary= new HashSet<String>();
static Set<Entry> vocabularyWithDates= new HashSet<Entry>();
public static void main(String[] args){
// some code omitted
for(File f:listOfAllBookTextFilesToRead){
String text=readBookFileIntoOneTextString(f);
processText(text);
}
processText("this is is a test is");
//code for doing statistics on vocabulary
}
public static void processText(String text){
String[] words=text.split(" ");
for(String word:words)
if(vocabulary.add(word)){
System.out.println("Added:"+word);
Entry e=Entry.make(word);
vocabularyWithDates.add(e);
e.creationDate=new Date();
}
}
}