מבחן מתכונת במדעי המחשב - שאלון 899381 מבחן_מתכונת...

מבחן מתכונת במדעי המחשב - שאלון 899381 מבחן_מתכונת2_תשפד.גרסה1_סופי (1)

באדיבותו של המורה אלוג'דאן כסרא סמיע

משך הבחינה : שלוש שעות ו-30 דקות

מבנה השאלון ומפתח הערכה:

בשאלון זו שלושה פרקים:
פרק ראשון – בפרק זה שלוש שאלות, עליכם לענות על שתיים.
שאלה 1 שאלת חובה – 10 נק'
שאלה 2 או שאלה 3 – 15 נק'
פרק שני – בפרק זה ארבע שאלות
פרק שלישי – בפרק זה שתי שאלות
עליכם לענות על 3 שאלות מהפרק השני והשלישי
לכל שאלה 25 נקודות ( 3 * 25 ) – 75 נק'

חומר עזר מותר בשימוש : כל חומר עזר ,חוץ ממחשב שניתן לתכנות וטלפון נייד,
אין להעביר ספרים ודפים בין הנבחנים.
יש לענות על שאלות מפרק 1 + 3 במחברת נפרדת
ושאלות מפרק 2 במחברת אחרת –
יש לכתוב על כל מחברת מה הפרקים שעניתם עליהם

ב ה צ ל ח ה !!


פרק ראשון יסודות
שאלה 1:
כתוב פעולה חיצונית שמקבלת מערך של מספרים שלמים שליליים וחיוביים,
הפעולה תבנה 2 מערכים חדשים, הראשון של המספרים החיוביים (כולל המספר 0) והשני של המספרים השליליים,
ותחזיר את המערך שיש לו הסכום הגדול של איבריו בערך מוחלט.

דוגמה:
עבור הקלט:
arr[0] = 0
arr[1] = 2
arr[2] = -20
arr[3] = 1
arr[4] = 7
arr[5] = 4
arr[6] = 0
arr[7] = -3
arr[8] = -19
arr[9] = 2

הפולה תחזיר:
r[0] = -20
r[1] = -3
r[2] = -19

משום שסכום האיברים השליליים בערך מוחלט הוא 42, ואילו סכום האיברים החיוביים הוא: 14

פתרון מלא בשפת c#:



public static int[] MaxArr(int[] arr)
{
    int pos = 0, neg = 0;
    for (int i = 0; i < arr.Length; i++)
    {
        if (arr[i] < 0)
            neg++;
        else pos++;
    }
    int[] possitave = new int[pos];
    int[] negative = new int[neg];
    pos = 0;
    neg = 0;
    int countpos=0,countneg=0;
    for (int i = 0; i < arr.Length; i++)
    {
        if (arr[i] < 0)
        {
            negative[neg++] = arr[i];
            countneg += Math.Abs(arr[i]);
        }
        else
        {
            possitave[pos++] = arr[i];
            countpos += Math.Abs(arr[i]);
        }   
    }
    return countpos > countneg ? possitave : negative;
}


שאלה 2:
נתונה המחלקה SpecialString שיש לה 2 תכונות:
string quote
bool isSentence


הפעולה הבונה מקבלת מחרוזת ומאתחלת את התכונה quote בערך של הקלט, 
תבדוק אם המחרוזת המתקבלת מהווה משפט (לפחות 2 מילים מופרדות ע"י רווח), אם משפט תגדיר את הערך של התכונה isSentence באמת אחרת בשקר.

הנח שיש פעולת Get ו Set לכל אחת מתכונות המחלקה. 

1) כתוב את כותרת הפעולה הבונה של המחלקה וממש אותה.


נתונה המחלקה Article שיש לה 2 תכונות:
הראשונה: מערך מטיפוס SpecialString בשם strings
השנייה: מערך מטיפוס שלם בשם wordsCount מונה מילים בגודל 6. כלומר כל המשפטים חייבות להיות באורך מקסימלי של 5 מילים.

הפעולה הבונה של המערך מקבלת מערך מטיפוס SpecialStrings ומאתחלת את המערך מונה מילים בצורה הבאה:
אם המחרוזת היא משפט (2 מילים ומעלה) המערך ימנה אותה מתחת לאינדקס המתאים, כלומר מערך מונה המילים יכיל מתחת לכל מקום את מספר המשפטים באורך של האינדקס.

2) כתוב את כותרת הפעולה הבונה של המחלקה Article וממש אותה. 
יש להשתמש בפעולה המאחזרת של הערך isSentense

דוגמה:

עבור הערכים של quote במערך strings:

arr[0] = "This exam"; // size 2
arr[1] = "is"; //size 1
arr[2] = "champions of the world"; // size 4
arr[3] = "so" //size 1
arr[4]="easy, and we are" //size 4
arr[5] = "1 2 3 4 5"; //size 5
arr[6]="thanks you are the best"; //size 5

הפעולה הבונה תבנה את המערך wordsCount:

wordsCount[0] = 0
wordsCount[1]=0
wordsCount[2] = 1
wordsCount[3] = 0
wordsCount[4] =1
wordsCount[5] = 2




פתרון מלא שאלה 2 סעיף 1
public SpecialString(string st)
{
quote = st;
if( st.IndexOf(' ')>0 && !st[1].Equals(' ') && !st[st.Length-1].Equals(' '))
isSentence = true;
else
isSentence = false;
}


פתרון שאלה 2 סעיף 2:

public Article(SpecialString[] strings)
{
    int maxcount = CountSpace(strings[0].GetQute());
    for (int i = 0; i < strings.Length; i++)
    {
        int tmp = CountSpace(strings[i].GetQute());
        if (tmp > maxcount)
            maxcount = tmp;
    }
    wordsCount = new int[maxcount+2];
    for (int i = 0; i < strings.Length; i++)
    {
        if (strings[i].GetIsSentence()) // if true
        {
            int count = CountSpace(strings[i].GetQute());
            wordsCount[count+1]++;
        }
    }
}



שאלה 3
נתונות 2 המחלקות הבאות:
המחלקה TrafficLight רמזור מאופיין ע"י תכונה אחת מטיפוס מחרוזת שאורכה שווה ל-3:
RYG :
Red
Yellow
Green

המחרוזת יכולה להכיל בכל מקום או 0 או 1 , 0=כבוי, 1=דלוק
למשל אם ערך המחרוזת RYG="001" הרמזור דולק ירוק

המחלקה צומת Point מאופיינת ע"י מספר שלם number ומערך מטיפוס TrafficLight בשם lights באורך מספר הרמזורים שיש בצומת שזה המספר number (number מספר הרמזורים בצומת)

הפעולה הבונה של המחלקה Point מקבלת מספר שלם number ומאתחלת את המערך lights לערכים ריקים null
כותרת הפעולה הבונה public Point (int number)
דוגמא לצומת עם 3 רמזורים - הניחו שיש צמתים רק עם 3 רמזורים מהסוג הזה:

במערכת בדיקת תקינות הרמזורים בצמתים רוצים לבדוק בכל זמן נתון את תקינות הרמזורים בצומת, מצב תקלה הוא מצב שיכול לגרום התנגשות בין 2 רכבים. 

1) פרט שלב תכנון בדיקת תקינות הרמזורים בצמתים, ההסבר שלך יכול כל האופציות כך שיהיה מצב תקין של רמזורים הצומת
2) כתוב פעולה חיצונית שתקבל עצם מטיפוס Point, הפעולה תבדוק את תקינות הרמזור בזמן שקוראים לה, תחזיר אמת אם מרכזת הרמזורים תקינה אחרת תחזיר שקר.