דילוג לתוכן המרכזי

מתכונת 8 במדעי המחשב - תכנות באינטרנט 899372

נבחנים אקסטרניים · שאלון 899372 · 9 שאלות · 2 שעות · פתרון מלא לכל סעיף

מבחן מתכונת במדעי המחשב, תכנות באינטרנט, במבנה של בחינת הבגרות. כל שאלה בו בנויה כמו שאלה מבגרות אחרת. לכל סעיף יש תשובה ופתרון מלא, וכל קוד מופיע ב-Java וב-C#. פתרו בזמן של הבחינה, ורק אחר כך פתחו את הפתרונות.

הוראות הבחינה

א. משך הבחינה: שעתיים.

ב. מבנה השאלון ומפתח הערכה: בשאלון זה שלושה פרקים.

פרק ראשון — (10x3) — 30 נקודות
פרק שני — (20x2)+(10x1) — 50 נקודות
פרק שלישי — (20x1) — 20 נקודות
סך הכול — 100 נקודות

ג. חומר עזר מותר בשימוש: כל חומר עזר, חוץ ממחשבון שיש בו אפשרות תכנות.

יש לכתוב במחברת הבחינה בלבד, יש לרשום "טיוטה" בראש כל עמוד המשמש טיוטה.
כתיבת טיוטה בדפים שאינם במחברת הבחינה עלולה לגרום לפסילת הבחינה.

השאלות בשאלון זה מנוסחות בלשון רבים, אף על פי כן על כל תלמידה וכל תלמיד להשיב עליהן באופן אישי.

בהצלחה!

פרק ראשון

ענו על שלוש השאלות 3-1 (לכל שאלה – 10 נקודות).

שאלה 1 · תפקיד Request.Form

בקוד הכתוב בצד השרת משתמשים לעיתים קרובות ב־Request.Form. מה תפקידו של Request.Form?
העתיקו למחברת הבחינה את התשובה הנכונה מבין האפשרויות א–ד שלפניכם.

א. שליחת קוד HTML מן השרת אל הדפדפן.
ב. קריאת הערכים שהמשתמש מילא בטופס ונשלחו לשרת בשיטת POST.
ג. העברת המשתמש מן הדף הנוכחי לדף אחר באתר.
ד. שמירת מידע המשותף לכל המשתמשים באתר.

העתיקו למחברת הבחינה את התשובה הנכונה מבין האפשרויות א–ד.

(10 נקודות)
◂ פתרון מלא לשאלה 1

פתרון

תשובה

ב. קריאת הערכים שהמשתמש מילא בטופס ונשלחו לשרת בשיטת POST.

מה נדרש – לזהות את תפקידו של Request.Form.

רעיון – האובייקט Request מייצג את הבקשה שהגיעה מהדפדפן אל השרת. כאשר טופס <form method="post"> נשלח, ערכי השדות שלו נשלחים בגוף הבקשה, והשרת קורא אותם לפי ה־name של כל שדה: Request.Form["name"]. האובייקט Response הוא הכיוון ההפוך – התשובה מהשרת אל הדפדפן.

פתרון – נעבור על האפשרויות:

•א. שליחת HTML לדפדפן – זה Response.Write, לא Request.Form.
•ב. נכון – Request.Form קורא את ערכי השדות שנשלחו מטופס בשיטת POST. לדוגמה, אם בטופס יש <input type="text" name="fullName" />, בצד השרת כותבים:
C#
string name = Request.Form["fullName"];
•ג. העברה לדף אחר – זה Response.Redirect("page.aspx").
•ד. מידע משותף לכל המשתמשים – זה האובייקט Application.

תשובה: ב.

בדיקה – "הדפדפן" שולח את השדות fullName ו־phone, והקוד בצד השרת קורא אותם ב־Request.Form["fullName"] ו־Request.Form["phone"] ומקבל בדיוק את הערכים שנשלחו; שדה שלא נשלח מחזיר null.

טעות נפוצה: לבלבל בין Request (מה שמגיע אל השרת) לבין Response (מה שהשרת שולח לדפדפן) ולבחור באפשרות א.

שאלה 2 · שאילתת SQL – דירות להשכרה בחיפה

באתר להשכרת דירות מוגדרת טבלה בשם Apartments ובה נתוני הדירות המוצעות להשכרה. בטבלה העמודות הבאות:

•aptId (מזהה הדירה, מספר שלם)
•address (כתובת הדירה, טקסט)
•city (העיר, טקסט)
•rooms (מספר החדרים, מספר שלם)
•monthlyRent (שכר הדירה החודשי בשקלים, מספר שלם)
•aptState (מצב הדירה, טקסט)
•floor (הקומה, מספר שלם)
•hasElevator (האם יש מעלית: 1 – כן, 0 – לא)

כתבו שאילתה בשפת SQL המחזירה את הכתובות של הדירות הנמצאות בעיר Haifa, ששכר הדירה החודשי שלהן נמוך מ־5000 ושמצבן Renovated.

כתבו שאילתה בשפת SQL המחזירה את הכתובות של הדירות הנמצאות בעיר Haifa, ששכר הדירה החודשי שלהן נמוך מ־5000 ושמצבן Renovated.

(10 נקודות)
◂ פתרון מלא לשאלה 2

פתרון

תשובה

SELECT address FROM Apartments WHERE city = 'Haifa' AND monthlyRent < 5000 AND aptState = 'Renovated';

מה נדרש – להחזיר עמודה אחת (address) של הדירות המקיימות שלושה תנאים יחד.

רעיון – בוחרים רק את העמודה address מהטבלה Apartments, ומסננים ב-WHERE עם שלושה תנאים המחוברים ב-AND:

•city = 'Haifa' – ערך טקסט נכתב בין גרשיים בודדים.
•monthlyRent < 5000 – "נמוך מ־5000" פירושו קטן ממש (דירה ב־5000 בדיוק אינה נכללת); מספר נכתב בלי גרשיים.
•aptState = 'Renovated'.

שאר העמודות (rooms, floor, hasElevator) אינן משתתפות בשאילתה.

פתרון

SQL
SELECT address
FROM Apartments
WHERE city = 'Haifa' AND monthlyRent < 5000 AND aptState = 'Renovated';

בדיקה – השאילתה על טבלה קטנה לדוגמה:

addresscitymonthlyRentaptStateנבחרה?
Herzl 12Haifa4200Renovatedכן
Hanassi 40Haifa4800Oldלא (מצב אחר)
Moriah 7Haifa5000Renovatedלא (5000 אינו נמוך מ־5000)
Dizengoff 90Tel Aviv4500Renovatedלא (עיר אחרת)
Hagefen 3Haifa3600Renovatedכן
Allenby 21Haifa6900Renovatedלא (יקרה מדי)

התוצאה: Herzl 12, Hagefen 3.

טעות נפוצה: לכתוב monthlyRent <= 5000 (אז גם Moriah 7 תוחזר), או לכתוב את Haifa בלי גרשיים.

שאלה 3 · פלט של פונקציה בצד השרת – שורת תאים

לפניכם פונקציה בשם Func הכתובה בצד השרת. העתיקו למחברתכם את מה שיוצג בדפדפן לאחר הרצת הפונקציה Func עם הפרמטר num = 6.

C#
public void Func(int num) {
    string str = "<table border='1'><tr>";
    while (num != 1) {
        if (num % 2 == 0) {
            str += "<td>" + num + "</td>";
            num = num / 2;
        }
        else {
            str += "<td><b>" + num + "</b></td>";
            num = 3 * num + 1;
        }
    }
    str += "<td>" + num + "</td></tr></table>";
    Response.Write(str);
}

העתיקו למחברתכם את מה שיוצג בדפדפן לאחר הרצת הפונקציה Func עם הפרמטר num = 6.

(10 נקודות)
◂ פתרון מלא לשאלה 3

פתרון

תשובה

טבלה עם מסגרת, בעלת שורה אחת ו־9 תאים: 6, 3, 10, 5, 16, 8, 4, 2, 1 (המספרים 3 ו־5 מודגשים).
(ה־HTML שנשלח: <table border='1'><tr><td>6</td><td><b>3</b></td><td>10</td><td><b>5</b></td><td>16</td><td>8</td><td>4</td><td>2</td><td>1</td></tr></table>)

מה נדרש – להבין איזה HTML הפונקציה בונה כש־num = 6, ואיך הדפדפן מציג אותו.

רעיון – הטבלה נפתחת עם <tr> אחד לפני הלולאה, וכל סיבוב מוסיף תא <td> לאותה שורה – לכן מתקבלת שורה אחת עם תאים רבים. בכל סיבוב: אם num זוגי – נוסף תא רגיל ו־num מתחלק ב־2; אם num אי־זוגי – נוסף תא שבו המספר מודגש (<b>) ו־num הופך ל־3·num+1. הלולאה נעצרת כש־num = 1, ואחריה נוסף תא אחרון עם הערך 1.

פתרון – מעקב:

numזוגי?התא שנוסףnum החדש
6כן<td>6</td>3
3לא<td><b>3</b></td>10
10כן<td>10</td>5
5לא<td><b>5</b></td>16
16כן<td>16</td>8
8כן<td>8</td>4
4כן<td>4</td>2
2כן<td>2</td>1
1–הלולאה נעצרת; אחריה נוסף <td>1</td>–

המחרוזת שנשלחת לדפדפן:

HTML
<table border='1'><tr><td>6</td><td><b>3</b></td><td>10</td><td><b>5</b></td><td>16</td><td>8</td><td>4</td><td>2</td><td>1</td></tr></table>

מה יוצג בדפדפן – טבלה עם מסגרת, שורה אחת ו־9 תאים (משמאל לימין, כי לטבלה אין dir), כשהמספרים 3 ו־5 מודגשים:

63105168421

בדיקה – הפונקציה בדיוק כפי שהיא מופיעה בשאלה, עם num = 6, מפיקה את ה־HTML שלמעלה, ובדפדפן מוצגת שורה אחת של 9 תאים עם 3 ו־5 מודגשים. (בדיקות נוספות: עם num = 8 מתקבלים התאים 8, 4, 2, 1, ועם num = 1 – תא אחד בלבד עם 1.)

טעות נפוצה: לצייר כל מספר בשורה נפרדת – אבל <tr> נכתב פעם אחת בלבד, לפני הלולאה, ובלולאה נוספים רק תאים <td>. טעות נוספת: לשכוח את התא האחרון (1), שנוסף אחרי הלולאה.

פרק שני

ענו על שלוש שאלות: על שאלה 4 (חובה – 10 נקודות) ועל שתיים מן השאלות 7-5 (לכל שאלה – 20 נקודות).

שאלה 4 · טבלת HTML מימין לשמאל עם rowspan/colspan ותמונה (10 נקודות)

יואב, תלמיד מדעי המחשב, פיתח אתר לספריית העיר ובו טבלת שעות הפתיחה.

HTML
<!DOCTYPE html>
<html lang="he" >
  <meta charset="utf-8"/>
  <table style="width:300px" border=2px dir="rtl">
    <tr>
     <td rowspan=3>ספריית העיר</td>
     <td>ראשון–חמישי</td>
     <td>8:00-18:00</td>
    </tr>
    <tr>
     <td>שישי</td>
     <td>8:00-12:00</td>
    </tr>
    <tr>
     <td colspan=2 align="center">שבת – סגור</td>
    </tr>
    <tr>
     <td colspan=2>טלפון</td>
     <td>04-8123456</td>
    </tr>
  </table>
</html>
א.

כיצד יוצג הדף? כתבו במחברת הבחינה את מספר התשובה הנכונה מבין האפשרויות (a-d).

ב.

כתבו שורת קוד מתאימה ב- html כך שבתא שבו כתוב "ספריית העיר" תוצג, מתחת לכיתוב, התמונה books.png ברוחב 60 פיקסלים.

◂ פתרון מלא לשאלה 4

סעיף א

תשובה

a

מה נדרש: לזהות איך הדפדפן מסדר את תאי הטבלה.

רעיון: עוברים שורה-שורה ומניחים כל תא במקום הפנוי הבא. dir="rtl" – הטבלה נבנית מימין לשמאל: התא הראשון בכל שורה מוצג מימין. rowspan=3 – התא תופס את המקום שלו גם בשתי השורות הבאות; colspan=2 – התא תופס שתי עמודות.

פתרון – בניית הטבלה (3 עמודות, נספור מימין):

שורהמה כתוב בקודהתוצאה
1ספריית העיר עם rowspan=3, ראשון–חמישי, 8:00-18:00ספריית העיר בעמודה הימנית (תופס גם את שורות 2–3), ראשון–חמישי באמצע, 8:00-18:00 משמאל
2שישי, 8:00-12:00העמודה הימנית תפוסה, ולכן שישי באמצע ו-8:00-12:00 משמאל
3שבת – סגור עם colspan=2, ממורכזהעמודה הימנית עדיין תפוסה, ולכן התא תופס את שתי העמודות השמאליות
4טלפון עם colspan=2, 04-8123456טלפון תופס את שתי העמודות הימניות, המספר בעמודה השמאלית

מתקבלת הטבלה של אפשרות a.

בדיקה: הצגנו את הקוד בדפדפן וקיבלנו בדיוק את הסידור של a. האפשרויות האחרות נפסלות:

•b – "שבת – סגור" תופס עמודה אחת בלבד, כאילו אין colspan=2.
•c – הטבלה הפוכה (ספריית העיר משמאל) – כך הייתה מוצגת עם dir="ltr".
•d – ספריית העיר תופס רק שתי שורות, ולכן "שבת – סגור" זז ימינה ונשאר מקום ריק משמאל.

טעות נפוצה: לסדר את התאים משמאל לימין מתוך הרגל, למרות dir="rtl".

סעיף ב

תשובה

<td rowspan=3>ספריית העיר<br><img src="books.png" width="60"></td>

מה נדרש: להוסיף תמונה בתוך התא הקיים, מתחת לטקסט.

רעיון: תמונה מוסיפים בתגית <img> (תגית בודדת, בלי תגית סוגרת): src – שם קובץ התמונה, width – הרוחב בפיקסלים. כדי שהתמונה תופיע מתחת לכיתוב ולא לצידו, שמים לפניה ירידת שורה <br>. הכול בתוך אותו <td>, שנשאר עם rowspan=3.

פתרון: מחליפים את שורת התא הראשון בשורה:

HTML
<td rowspan=3>ספריית העיר<br><img src="books.png" width="60"></td>

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

טעות נפוצה: לכתוב <img href=...> במקום src, או לשים את התמונה בתא חדש – תא נוסף משבש את מבנה הטבלה.

שאלה 5 · Session – הפניית נהג באתר חניה עירוני

באתר החניה של עירייה, נהג מזמין מקום חניה ברחוב. כדי לקבוע לאיזה דף יעבור הנהג, האתר משתמש במשתני Session הבאים:

•Session["hour"]: מספר שלם בין 0 ל־23 המייצג את השעה העגולה שבה מתחילה החניה (למשל 14 מייצג את 14:00)
•Session["isResident"]: משתנה בוליאני המציין האם הנהג הוא תושב העיר (true/false)
•Session["vehicle"]: מחרוזת המייצגת את סוג הרכב: "private" (רכב פרטי רגיל), "electric" (רכב חשמלי) או "motorcycle" (אופנוע)

בהתבסס על משתנים אלה, האתר מפנה את הנהג לדף המתאים:

•אם הנהג הוא תושב העיר וגם לפחות אחד מהתנאים מתקיים: החניה מתחילה לפני השעה 8 או החניה מתחילה החל מהשעה 18 (כולל), אז הנהג מועבר לדף freeParking.aspx
•אחרת, אם לפחות אחד מהתנאים מתקיים: הרכב הוא רכב חשמלי (בכל שעה), או שהרכב הוא אופנוע וגם החניה מתחילה החל מהשעה 10 (כולל) ולפני השעה 16, אז הנהג מועבר לדף reducedRate.aspx
•שאר הנהגים מועברים לדף payParking.aspx

כתבו בצד שרת קוד המתאים לדרישות.

כתבו בצד שרת קוד המתאים לדרישות.

(20 נקודות)
◂ פתרון מלא לשאלה 5

פתרון

תשובה

if (isResident && (hour < 8 || hour >= 18)) Response.Redirect("freeParking.aspx");
else if (vehicle == "electric" || (vehicle == "motorcycle" && hour >= 10 && hour < 16)) Response.Redirect("reducedRate.aspx");
else Response.Redirect("payParking.aspx");

מה נדרש – קוד C# בצד השרת שקורא שלושה משתני Session (מספר, בוליאני ומחרוזת) ומפנה לאחד משלושה דפים.

רעיון

1.ממירים את ערכי ה-Session: int.Parse(Session["hour"].ToString()), bool.Parse(Session["isResident"].ToString()), ואת סוג הרכב קוראים כמחרוזת: Session["vehicle"].ToString().
2.כלל ראשון: "תושב וגם (לפני 8 או החל מ־18)" ⇐ isResident && (hour < 8 || hour >= 18). הסוגריים חובה.
3.כלל שני: "חשמלי, או (אופנוע וגם 10 ≤ שעה < 16)" ⇐ vehicle == "electric" || (vehicle == "motorcycle" && hour >= 10 && hour < 16). "החל מ־10 (כולל)" ⇐ >=, "לפני 16" ⇐ <.
4.הכללים נבדקים לפי הסדר (if / else if / else), כך שתושב שחונה בלילה ברכב חשמלי מקבל חניה חינם ולא תעריף מוזל.

פתרון (בתוך Page_Load של הדף):

C#
protected void Page_Load(object sender, EventArgs e)
{
    int hour = int.Parse(Session["hour"].ToString());
    bool isResident = bool.Parse(Session["isResident"].ToString());
    string vehicle = Session["vehicle"].ToString();

    if (isResident && (hour < 8 || hour >= 18))
        Response.Redirect("freeParking.aspx");
    else if (vehicle == "electric" || (vehicle == "motorcycle" && hour >= 10 && hour < 16))
        Response.Redirect("reducedRate.aspx");
    else
        Response.Redirect("payParking.aspx");
}

בדיקה:

hourisResidentvehicleדף
21trueprivatefreeParking.aspx
7trueelectricfreeParking.aspx (הכלל הראשון קודם)
18truemotorcyclefreeParking.aspx (18 כלול)
12trueelectricreducedRate.aspx (תושב, אבל בשעות היום)
22falseelectricreducedRate.aspx (חשמלי – בכל שעה)
10falsemotorcyclereducedRate.aspx (10 כלול)
16falsemotorcyclepayParking.aspx (16 אינו "לפני 16")
9trueprivatepayParking.aspx
23falseprivatepayParking.aspx

בכל השעות 0–23 עם תושב/לא תושב ושלושת סוגי הרכב המשתמש מופנה לדף הנכון.

טעות נפוצה: להשוות מחרוזת ב-Session ישירות בלי ToString (Session["vehicle"] == "electric" משווה הפניות של object ולא את תוכן המחרוזות, ועלול להחזיר false גם כשהערך הוא electric), ולשכוח סוגריים סביב החלק של האופנוע או סביב hour < 8 || hour >= 18.

הקוד המלא
C#
protected void Page_Load(object sender, EventArgs e)
{
    int hour = int.Parse(Session["hour"].ToString());
    bool isResident = bool.Parse(Session["isResident"].ToString());
    string vehicle = Session["vehicle"].ToString();

    if (isResident && (hour < 8 || hour >= 18))
        Response.Redirect("freeParking.aspx");
    else if (vehicle == "electric" || (vehicle == "motorcycle" && hour >= 10 && hour < 16))
        Response.Redirect("reducedRate.aspx");
    else
        Response.Redirect("payParking.aspx");
}

שאלה 6 · מספר מאוזן – ספרות זוגיות ואי-זוגיות

נגדיר מספר מאוזן – מספר שלם חיובי שבו מספר הספרות הזוגיות שווה למספר הספרות האי-זוגיות (הספרה 0 נחשבת ספרה זוגית).
דוגמאות למספרים מאוזנים: 1234, 50, 207813
דוגמאות למספרים שאינם מאוזנים: 135, 2468, 7, 12345

כתבו פונקציה בשם isBalanced בצד שרת המקבלת מספר שלם חיובי ומחזירה אמת אם המספר מאוזן. אחרת, מחזירה שקר.

כתבו פונקציה בשם isBalanced בצד שרת המקבלת מספר שלם חיובי ומחזירה אמת אם המספר מאוזן. אחרת, מחזירה שקר.

(20 נקודות)
◂ פתרון מלא לשאלה 6

פתרון

תשובה

public bool isBalanced(int num) – מפרקים את המספר לספרות (% 10, / 10), סופרים ספרות זוגיות (d % 2 == 0) ואי-זוגיות, ומחזירים evenCount == oddCount.

מה נדרש: פונקציה ב-C# (צד שרת) שמחזירה true אם במספר יש בדיוק אותו מספר של ספרות זוגיות ושל ספרות אי-זוגיות.

רעיון: מפרקים את המספר לספרות: num % 10 היא הספרה האחרונה, ו-num / 10 מסיר אותה. לכל ספרה בודקים אם היא זוגית (d % 2 == 0, כולל 0) ומקדמים את המונה המתאים. בסוף משווים בין שני המונים.

פתרון – הקוד המלא בלשונית C#:

C#
public bool isBalanced(int num)
{
    int evenCount = 0;
    int oddCount = 0;
    while (num > 0)
    {
        int d = num % 10;
        if (d % 2 == 0)
            evenCount++;
        else
            oddCount++;
        num = num / 10;
    }
    return evenCount == oddCount;
}

בדיקה – מעקב על 207813:

numdזוגית?evenCountoddCount
2078133לא01
207811לא02
20788כן12
2077לא13
200כן23
22כן33

בסוף 3 = 3 ⇐ true.

על הדוגמאות שבשאלה: 1234, 50, 207813 ⇐ True; ‏135, 2468, 7, 12345 ⇐ False.

טעות נפוצה: לבדוק את זוגיות המספר (num % 2) במקום את זוגיות הספרה (d % 2); או לעצור את הלולאה כשהספרה היא 0 (למשל while (num % 10 != 0)) – אז במספר כמו 50 הספרה 0 לא תיספר.

הקוד המלא
C#
public bool isBalanced(int num)
{
    int evenCount = 0;
    int oddCount = 0;
    while (num > 0)
    {
        int d = num % 10;
        if (d % 2 == 0)
            evenCount++;
        else
            oddCount++;
        num = num / 10;
    }
    return evenCount == oddCount;
}

שאלה 7 · שאילתות SQL על טבלת מוצרי מזנון

במסד הנתונים של מזנון בית הספר יש טבלה ששמה Products המכילה את נתוני המוצרים הנמכרים במזנון.
העמודות בטבלה הן:

א. pname (שם המוצר), מסוג טקסט.
ב. category (קטגוריה), מסוג טקסט.
ג. price (מחיר המוצר בשקלים), מסוג מספר שלם.
ד. stock (מספר היחידות במלאי), מסוג מספר שלם.

דוגמה לטבלה ובה מוצרי המזנון:

stockpricecategorypname
405משקאותמים מינרליים
257משקאותשוקו
1012משקאותמיץ תפוזים
306חטיפיםביסלי
815מאפיםכריך טונה
09מאפיםבורקס

יש לבחור 2 מתוך 4 הסעיפים הבאים:

1.

כתבו שאילתה בשפת SQL המציגה את שמות המוצרים ואת מחיריהם, עבור המשקאות שמחירם קטן מ-10 ש״ח.

2.

כתבו שאילתה בשפת SQL המחזירה את השווי הכולל של המלאי במזנון (לכל מוצר: מחיר × מספר יחידות במלאי, ואז סכום על כל המוצרים). בדוגמה: יוחזר 795

3.

כתבו שאילתה בשפת SQL המעלה ב-2 ש״ח את המחיר של כל המוצרים בקטגוריה מאפים.

4.

כתבו שאילתה בשפת SQL המחזירה את המחיר הגבוה ביותר של מוצר במזנון. בדוגמה: יוחזר 15

◂ פתרון מלא לשאלה 7

סעיף 1

תשובה

SELECT pname, price FROM Products WHERE category = 'משקאות' AND price < 10

מה נדרש: להציג שתי עמודות (pname, price) לשורות שמקיימות שני תנאים: הקטגוריה היא משקאות וגם המחיר קטן מ-10.

רעיון: מחברים את שני התנאים ב-WHERE בעזרת AND. ערך הטקסט 'משקאות' נכתב בגרשיים, והמספר 10 – בלי גרשיים.

פתרון:

SQL
SELECT pname, price FROM Products WHERE category = 'משקאות' AND price < 10

בדיקה: על טבלת הדוגמה התקבלו 2 שורות: מים מינרליים 5, שוקו 7. מיץ תפוזים (12) לא הוצג, וגם ביסלי (6, אבל חטיפים) לא הוצג.

טעות נפוצה: לכתוב OR במקום AND – אז יוצגו כל המשקאות וגם כל המוצרים הזולים מכל הקטגוריות.

סעיף 2

תשובה

SELECT SUM(price * stock) FROM Products (בדוגמה: 795)

מה נדרש: מספר אחד – סכום של price * stock על כל השורות.

רעיון: בתוך פונקציית הצבירה SUM אפשר לכתוב ביטוי חשבוני על עמודות. לכל שורה מחושב price × stock, ו-SUM מחבר את התוצאות.

פתרון:

SQL
SELECT SUM(price * stock) FROM Products

בדיקה: על טבלת הדוגמה: 5·40 + 7·25 + 12·10 + 6·30 + 15·8 + 9·0 = 200 + 175 + 120 + 180 + 120 + 0 = 795.

טעות נפוצה: לכתוב SUM(price) * SUM(stock) – זו מכפלה של שני סכומים (54 · 113) ולא סכום של מכפלות.

סעיף 3

תשובה

UPDATE Products SET price = price + 2 WHERE category = 'מאפים'

מה נדרש: לשנות ערך בעמודה price בשורות קיימות – רק בשורות של מאפים.

רעיון: פקודת UPDATE ... SET משנה ערכים בשורות קיימות. SET price = price + 2 מחשב את הערך החדש מהערך הישן של אותה שורה, ו-WHERE קובע אילו שורות משתנות.

פתרון:

SQL
UPDATE Products SET price = price + 2 WHERE category = 'מאפים'

בדיקה: על טבלת הדוגמה עודכנו 2 שורות: כריך טונה 15 ⇐ 17, בורקס 9 ⇐ 11. שאר המוצרים לא השתנו.

טעות נפוצה: לכתוב SET price = 2 – זה קובע מחיר 2 במקום להעלות ב-2. או לשכוח את ה-WHERE, ואז כל המוצרים מתייקרים.

סעיף 4

תשובה

SELECT MAX(price) FROM Products (בדוגמה: 15)

מה נדרש: מספר אחד – הערך הגדול ביותר בעמודה price.

רעיון: פונקציית הצבירה MAX מחזירה את הערך הגדול ביותר בעמודה (על כל השורות, כי אין WHERE).

פתרון:

SQL
SELECT MAX(price) FROM Products

בדיקה: על טבלת הדוגמה התקבל 15 (כריך טונה).

טעות נפוצה: לכתוב SELECT price FROM Products WHERE price = MAX(price) – אי אפשר להשתמש בפונקציית צבירה בתוך WHERE.

פרק שלישי

ענו על שאלה אחת מן השאלות 9-8.

שאלה 8 · תכנון טבלת הזמנות – חדרי בריחה

חברת חדרי הבריחה "המנעול" רוצה לשמור את ההזמנות שלה בטבלה Bookings במסד הנתונים. לכל הזמנה נשמרים הפרטים הבאים:

•מספר ההזמנה – מספר שלם שמזהה את ההזמנה. מסד הנתונים יוצר אותו באופן אוטומטי (1, 2, 3, ...).
•שם הקבוצה – טקסט של עד 25 תווים. חובה.
•טלפון של איש הקשר – בדיוק 10 ספרות, ומתחיל תמיד בספרה 0. חובה.
•שם החדר – אחד מהחדרים: 'מעבדה', 'פירמידה', 'צוללת'. חובה.
•מספר המשתתפים – מספר שלם בין 2 ל-6 (כולל). חובה.
•תאריך המשחק. חובה.
•האם ההזמנה שולמה – כן או לא. חובה.
•הערות – טקסט של עד 100 תווים. לא חובה.

שתי הזמנות שיש להוסיף:

1.הקבוצה "המפצחים", טלפון 0521234567, חדר 'צוללת', 4 משתתפים, 14/03/2027, שולמה, בלי הערות.
2.הקבוצה "הבלשים הצעירים", טלפון 0549876543, חדר 'פירמידה', 6 משתתפים, 21/03/2027, לא שולמה, הערה: "יום הולדת".

תכננו את הטבלה Bookings: לכל עמודה רשמו את שמה, את טיפוס הנתונים שלה והאם מותר להשאיר בה ערך ריק, וציינו מהו המפתח הראשי. לאחר מכן כתבו פקודות SQL המוסיפות לטבלה את שתי ההזמנות שלמעלה.

תכננו את הטבלה Bookings: לכל עמודה רשמו את שמה, את טיפוס הנתונים שלה והאם מותר להשאיר בה ערך ריק, וציינו מהו המפתח הראשי. לאחר מכן כתבו פקודות SQL המוסיפות לטבלה את שתי ההזמנות שלמעלה.

(20 נקודות)
◂ פתרון מלא לשאלה 8

פתרון

תשובה

BookingId int IDENTITY – מפתח ראשי; TeamName nvarchar(25) NOT NULL; Phone nvarchar(10) NOT NULL; Room nvarchar(10) NOT NULL; Players int NOT NULL; BookingDate date NOT NULL; Paid bit NOT NULL; Notes nvarchar(100) NULL.
INSERT INTO Bookings (TeamName, Phone, Room, Players, BookingDate, Paid, Notes)
VALUES ('המפצחים', '0521234567', 'צוללת', 4, '2027-03-14', 1, NULL);
INSERT INTO Bookings (TeamName, Phone, Room, Players, BookingDate, Paid, Notes)
VALUES ('הבלשים הצעירים', '0549876543', 'פירמידה', 6, '2027-03-21', 0, 'יום הולדת');

מה נדרש – לתכנן טבלה מתוך תיאור במילים (שם, טיפוס, חובה/רשות, מפתח ראשי) ולכתוב INSERT לשתי הזמנות נתונות.

רעיון – לכל פרט בתיאור בוחרים את הטיפוס המתאים: מספר שלם – int, טקסט – nvarchar באורך המקסימלי, תאריך – date, כן/לא – bit. "חובה" פירושו שאסור ערך ריק (NOT NULL). המפתח הראשי הוא השדה שמזהה כל הזמנה – מספר ההזמנה, ומכיוון שהוא נוצר אוטומטית מגדירים אותו IDENTITY ולא כותבים אותו ב-INSERT.

פתרון

מבנה הטבלה:

שם העמודהטיפוס נתוניםמותר ערך ריקהערה
BookingIdint (IDENTITY)לאמפתח ראשי, נוצר אוטומטית
TeamNamenvarchar(25)לא
Phonenvarchar(10)לאטקסט ולא מספר – כדי לא לאבד את ה-0 שבהתחלה
Roomnvarchar(10)לא'מעבדה' / 'פירמידה' / 'צוללת'
Playersintלא2 עד 6
BookingDatedateלא
Paidbitלא1 – שולם, 0 – לא שולם
Notesnvarchar(100)כן

אותו מבנה כפקודת SQL:

SQL
CREATE TABLE Bookings (
  BookingId   INT IDENTITY(1,1) PRIMARY KEY,
  TeamName    NVARCHAR(25)  NOT NULL,
  Phone       NVARCHAR(10)  NOT NULL,
  Room        NVARCHAR(10)  NOT NULL,
  Players     INT           NOT NULL,
  BookingDate DATE          NOT NULL,
  Paid        BIT           NOT NULL,
  Notes       NVARCHAR(100) NULL
);

הוספת שתי ההזמנות (בלי BookingId – הוא נוצר לבד):

SQL
INSERT INTO Bookings (TeamName, Phone, Room, Players, BookingDate, Paid, Notes)
VALUES ('המפצחים', '0521234567', 'צוללת', 4, '2027-03-14', 1, NULL);
INSERT INTO Bookings (TeamName, Phone, Room, Players, BookingDate, Paid, Notes)
VALUES ('הבלשים הצעירים', '0549876543', 'פירמידה', 6, '2027-03-21', 0, 'יום הולדת');

התאריך נכתב בתבנית 'yyyy-mm-dd' (ב-Access כותבים #2027-03-14#), "שולמה" הוא 1 ו"לא שולמה" הוא 0, וכשאין הערה כותבים NULL.

בדיקה – כשהכללים כתובים כאילוצים (IDENTITY, CHECK), שתי הפקודות: התקבלו הרשומות (1, 'המפצחים', '0521234567', 'צוללת', 4, '2027-03-14', 1, NULL) ו-(2, 'הבלשים הצעירים', '0549876543', 'פירמידה', 6, '2027-03-21', 0, 'יום הולדת'). הזמנה עם 7 משתתפים או עם 1, חדר 'מרתף' או בלי שם קבוצה – נדחתה. ועוד בדקנו: אם Phone מוגדר כמספר, הערך 0521234567 נשמר כ-521234567 – ה-0 אובד.

טעות נפוצה: להגדיר את הטלפון כ-int; לכתוב ב-INSERT ערך ל-BookingId שהוא IDENTITY; ולכתוב את המספרים 4 ו-6 בין גרשיים או את שם הקבוצה בלי גרשיים.

שאלה 9 · חיפוש תחנות אופניים – Request.QueryString

לפניכם התוכנית הבאה בדף Search.aspx (אין טעויות תחביר). בטבלה Stations שמורות תחנות השכרת אופניים: העיר (City) ומספר האופניים הפנויים בתחנה (FreeBikes).

HTML
01. <%@ Page Language="C#" %>
02. <%@ Import Namespace="System.Data" %>
03. <%@ Import Namespace="System.Data.SqlClient" %>
04.
05. <script runat="server">
06.  public string msg = "";
07.  protected void Page_Load(object sender, EventArgs e)
08.  {
09.      if (Session["user"] == null)
10.          Response.Redirect("Login.aspx");
11.
12.      string city = Request.QueryString["city"];
13.      if (city != null && city != "")
14.      {
15.          SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\bikes.mdf;Integrated Security=True");
16.          SqlCommand command = new SqlCommand("", connection);
17.          command.CommandText = string.Format("Select * From Stations Where City = '{0}' And FreeBikes > 0", city);
18.          SqlDataAdapter adapter = new SqlDataAdapter(command);
19.          DataTable dt = new DataTable();
20.          adapter.Fill(dt);
21.          msg = "נמצאו " + dt.Rows.Count + " תחנות עם אופניים פנויים";
22.      }
23.  }
24. </script>
25. <html xmlns="http://www.w3.org/1999/xhtml">
26. <head runat="server">
27.    <title>Bikes</title>
28. </head>
29. <body>
30.    <form id="form1" action="Search.aspx" method="get">
31.       <input type="text" name="city" />
32.       <input type="submit" value="Search" />
33.    </form>
34.    <p><%= msg %></p>
35. </body>
36. </html>

לפניכם חמישה הגדים, רשמו עבור כל הגד נכון / לא נכון.

1.לאחר הקלדת עיר ולחיצה על Search, בשורת הכתובת של הדפדפן תופיע הכתובת של Search.aspx ואחריה ?city= והעיר שהוקלדה.
2.גולש שלא התחבר לאתר (Session["user"] אינו מוגדר) יכול לקבל את מספר התחנות, אם יקליד בדפדפן ישירות את הכתובת Search.aspx?city=חיפה
3.בכניסה הראשונה של משתמש מחובר לדף Search.aspx (כתובת בלי פרמטרים), השורות 15 עד 21 לא יתבצעו.
4.אם בעיר שהוקלדה יש 3 תחנות, ובאחת מהן אין אופניים פנויים, יוצג בדף: "נמצאו 3 תחנות עם אופניים פנויים".
5.אם בשורה 12 נחליף את Request.QueryString ב-Request.Form, בלי לשנות דבר נוסף בדף, הדף ימשיך להציג את מספר התחנות אחרי לחיצה על Search.

לפניכם חמישה הגדים, רשמו עבור כל הגד נכון / לא נכון.

(20 נקודות)
◂ פתרון מלא לשאלה 9

פתרון

תשובה

1 – נכון; 2 – לא נכון; 3 – נכון; 4 – לא נכון; 5 – לא נכון

מה נדרש – לקבוע לכל אחד מחמשת ההגדים אם הוא נכון.

רעיון – לעקוב מה Page_Load עושה בכל בקשה, ולשים לב לשורה 30: הטופס נשלח בשיטה get, ולכן הנתונים עוברים בכתובת (Query String) ונקראים ב-Request.QueryString.

פתרון

מה הקוד עושה: בכל בקשה לדף, אם המשתמש לא מחובר (שורה 9) – מעבר ל-Login.aspx, ו-Response.Redirect מסיים את הטיפול בבקשה. אחרת נקראת העיר מהכתובת (שורה 12); רק אם היא קיימת ואינה ריקה (שורה 13) נשלחת שאילתה שמחזירה את התחנות באותה עיר שיש בהן אופניים פנויים (שורה 17), ונבנית ההודעה עם מספר השורות שהתקבלו (שורה 21), שמוצגת בשורה 34.

הגדתשובההסבר
1נכוןבטופס עם method="get" הדפדפן מוסיף את שדות הטופס לכתובת: Search.aspx?city=....
2לא נכוןשורות 9–10: כש-Session["user"] הוא null יש מעבר ל-Login.aspx, והטיפול בבקשה מסתיים – השאילתה לא מתבצעת.
3נכוןבלי פרמטרים Request.QueryString["city"] הוא null, התנאי בשורה 13 לא מתקיים, והשורות 15–21 לא מתבצעות (ההודעה ריקה).
4לא נכוןבשאילתה יש And FreeBikes > 0, ולכן התחנה בלי אופניים פנויים לא נספרת: יוצג "נמצאו 2 תחנות עם אופניים פנויים".
5לא נכוןהטופס עדיין נשלח ב-get, כך שהעיר נמצאת בכתובת ולא בגוף הבקשה. Request.Form["city"] יהיה null, השאילתה לא תתבצע ולא תוצג הודעה. צריך לשנות גם את הטופס ל-method="post".

בדיקה – קוד השרת (שורות 6–23) עם הטבלה (בחיפה 3 תחנות, באחת 0 אופניים פנויים):

בקשהתוצאה
משתמש מחובר, Search.aspx?city=חיפה"נמצאו 2 תחנות עם אופניים פנויים"
משתמש לא מחובר, Search.aspx?city=חיפהמעבר ל-Login.aspx
משתמש מחובר, Search.aspx בלי פרמטריםאין שאילתה, הודעה ריקה
אחרי החלפה ל-Request.Form, הטופס ב-get עם city=חיפהאין שאילתה, הודעה ריקה

טעות נפוצה: לענות על הגד 4 "נכון" בלי לקרוא את תנאי השאילתה עד הסוף, ולחשוב ש-Request.Form ו-Request.QueryString מחליפים זה את זה – כל אחד מתאים לשיטת שליחה אחרת (post / get).

טבלת התשובות
שאלהסעיףתשובה
1-

ב. קריאת הערכים שהמשתמש מילא בטופס ונשלחו לשרת בשיטת POST.

2-

SELECT address FROM Apartments WHERE city = 'Haifa' AND monthlyRent < 5000 AND aptState = 'Renovated';

3-

טבלה עם מסגרת, בעלת שורה אחת ו־9 תאים: 6, 3, 10, 5, 16, 8, 4, 2, 1 (המספרים 3 ו־5 מודגשים).
(ה־HTML שנשלח: <table border='1'><tr><td>6</td><td><b>3</b></td><td>10</td><td><b>5</b></td><td>16</td><td>8</td><td>4</td><td>2</td><td>1</td></tr></table>)

4א

a

ב

<td rowspan=3>ספריית העיר<br><img src="books.png" width="60"></td>

5-

if (isResident && (hour < 8 || hour >= 18)) Response.Redirect("freeParking.aspx");
else if (vehicle == "electric" || (vehicle == "motorcycle" && hour >= 10 && hour < 16)) Response.Redirect("reducedRate.aspx");
else Response.Redirect("payParking.aspx");

6-

public bool isBalanced(int num) – מפרקים את המספר לספרות (% 10, / 10), סופרים ספרות זוגיות (d % 2 == 0) ואי-זוגיות, ומחזירים evenCount == oddCount.

71

SELECT pname, price FROM Products WHERE category = 'משקאות' AND price < 10

2

SELECT SUM(price * stock) FROM Products (בדוגמה: 795)

3

UPDATE Products SET price = price + 2 WHERE category = 'מאפים'

4

SELECT MAX(price) FROM Products (בדוגמה: 15)

8-

BookingId int IDENTITY – מפתח ראשי; TeamName nvarchar(25) NOT NULL; Phone nvarchar(10) NOT NULL; Room nvarchar(10) NOT NULL; Players int NOT NULL; BookingDate date NOT NULL; Paid bit NOT NULL; Notes nvarchar(100) NULL.
INSERT INTO Bookings (TeamName, Phone, Room, Players, BookingDate, Paid, Notes)
VALUES ('המפצחים', '0521234567', 'צוללת', 4, '2027-03-14', 1, NULL);
INSERT INTO Bookings (TeamName, Phone, Room, Players, BookingDate, Paid, Notes)
VALUES ('הבלשים הצעירים', '0549876543', 'פירמידה', 6, '2027-03-21', 0, 'יום הולדת');

9-

1 – נכון; 2 – לא נכון; 3 – נכון; 4 – לא נכון; 5 – לא נכון

כל האתר במבט אחד

קיצורי דרך לכל הכלים, הבגרויות והקורסים

GuyAI הוא המורה הפרטי המתקדם בישראל, המבוסס על מודלי הבינה המלאכותית החזקים בעולם בשילוב הידע הפדגוגי של GOOL. המערכת מספקת פתרונות לכל המקצועות ולכל הרמות - מיסודי ועד אקדמיה, וממתמטיקה ועד היסטוריה.