בגרות במדעי המחשב תכנות באינטרנט 899282/899372 - קיץ 2022
נבחנים אקסטרניים · שאלון 899282/899372 · 9 שאלות · 2 שעות · פתרון מלא לכל סעיף
בחינת הבגרות במדעי המחשב, תכנות באינטרנט, קיץ 2022, כל 9 השאלות כמו בשאלון. לכל סעיף יש תשובה ופתרון מלא: הרעיון, הקוד או המעקב, ובדיקה קצרה. כל קוד מופיע ב-Java וב-C#. נסו לפתור לבד, ואז פתחו את הפתרון.
הוראות הבחינה (כמו בשאלון)
א. משך הבחינה: שעתיים.
ב. מבנה השאלון ומפתח ההערכה:
פרק ראשון — (10×3) — 30 נקודות
פרק שני — (10×1)+(20×2) — 50 נקודות
פרק שלישי — (20×1) — 20 נקודות
סך הכול — 100 נקודות
ג. חומר עזר מותר בשימוש: כל חומר עזר, חוץ ממחשבון שיש בו אפשרות תכנוּת.
יש לכתוב במחברת הבחינה בלבד. יש לרשום "טיוטה" בראש כל עמוד המשמש טיוטה.
כתיבת טיוטה בדפים שאינם במחברת הבחינה עלולה לגרום לפסילת הבחינה.
השאלות בשאלון זה מנוסחות בלשון רבים, אף על פי כן על כל תלמידה וכל תלמיד להשיב עליהן באופן אישי.
בהצלחה!
פרק ראשון
ענו על שלוש השאלות 1–3 (לכל שאלה – 10 נקודות).
שאלה 1 · המונח post (10 נקודות)
לְמה מתייחס המונח post ?
העתיקו למחברת הבחינה את התשובה הנכונה מבין האפשרויות א–ד שלפניכם.
א. לאופן שמירת המידע במסד הנתונים
ב. למשלוח מידע מן הטופס לשרת בצורה גלויה
ג. למשלוח מידע מן הטופס לשרת בצורה מוסתרת
ד. לתכונה של התג table
העתיקו למחברת הבחינה את התשובה הנכונה מבין האפשרויות א–ד.
◂ פתרון מלא לשאלה 1
פתרון
ג. למשלוח מידע מן הטופס לשרת בצורה מוסתרת
מה נדרש: לבחור את ההגדרה הנכונה של המונח post.
רעיון: post הוא ערך של התכונה method בתג form, כלומר שיטה לשליחת נתוני הטופס לשרת. יש שתי שיטות:
page.aspx?name=dana&age=16), ולכן הם גלויים בשורת הכתובת.פתרון: התשובה הנכונה היא ג – למשלוח מידע מן הטופס לשרת בצורה מוסתרת.
<form method="post" action="Register.aspx">
...
</form>בדיקה של שאר האפשרויות:
טעות נפוצה: לחשוב ש"מוסתר" פירושו "מוצפן". בשיטת post הנתונים רק לא מופיעים בכתובת; הם אינם מוצפנים (הצפנה מתקבלת רק בחיבור https).
שאלה 2 · שאילתת SELECT – תלמידים שנולדו ביולי (10 נקודות)
במסד נתונים של בית ספר מוגדרת טבלה בשם Students ובה נתוני התלמידים.
בטבלה יש שש עמודות.
שלוש העמודות הראשונות בטבלה הן:
לאחריהן יש עוד שלוש עמודות, המרכיבות תאריך לידה:
כִּתבו שאילתה בשפת SQL המאחזרת את שמות התלמידים ואת כתובות הדוא"ל של התלמידים שנולדו בחודש 7 (יולי).
כִּתבו שאילתה בשפת SQL המאחזרת את שמות התלמידים ואת כתובות הדוא"ל של התלמידים שנולדו בחודש 7 (יולי).
◂ פתרון מלא לשאלה 2
פתרון
SELECT name, email FROM Students WHERE month = 7;
מה נדרש: להציג שתי עמודות (name, email) רק עבור התלמידים שחודש הלידה שלהם הוא 7.
רעיון: אחרי SELECT כותבים את העמודות שרוצים להציג, אחרי FROM את שם הטבלה, ואחרי WHERE את התנאי על השורות. חודש הלידה שמור בעמודה month כמספר שלם, ולכן התנאי הוא month = 7 (מספר, בלי גרשיים).
פתרון:
SELECT name, email
FROM Students
WHERE month = 7;בדיקה: השאילתה על טבלה לדוגמה עם ארבעה תלמידים: Dana (נולדה ב־3/7/2006), Yossi (חודש 3), Noa (חודש 7), Omer (חודש 12). התקבלו שתי שורות בלבד:
| name | |
|---|---|
| Dana | dana@mail.com |
| Noa | noa@mail.com |
טעות נפוצה: לכתוב SELECT * – כך יוצגו כל שש העמודות, ולא רק השם והדוא"ל שנדרשו.
שאלה 3 · מעקב אחר פונקציית שרת היוצרת טבלה (10 נקודות)
לפניכם הפונקצייה Func , הכתובה בצד השרת:
public void Func (int num)
{
string str = "<table border = '1'>";
int i = 10;
while (i < 50)
{
if (i % 10 + i / 10 == num)
str += "<tr><td>" + i + "</td></tr>";
i++;
}
str += "</table>";
Response.Write (str);
}כִּתבו במחברת הבחינה את הפלט שיוצג בדפדפן לאחר זימון הפונקצייה Func(8) .
כִּתבו במחברת הבחינה את הפלט שיוצג בדפדפן לאחר זימון הפונקצייה Func(8) .
◂ פתרון מלא לשאלה 3
פתרון
טבלה עם מסגרת, בעמודה אחת וארבע שורות: 17, 26, 35, 44
מה נדרש: להבין איזו מחרוזת HTML הפונקצייה בונה ושולחת לדפדפן כש־num = 8, ואיך הדפדפן מציג אותה.
רעיון: הלולאה עוברת על כל המספרים הדו־ספרתיים i מ־10 עד 49. הביטוי i % 10 הוא ספרת האחדות ו־i / 10 (חילוק שלמים) הוא ספרת העשרות. לכן התנאי בודק אם סכום הספרות של i שווה ל־8. לכל מספר כזה נוספת לטבלה שורה (<tr>) עם תא אחד (<td>) שבו המספר. שימו לב: i++ נמצא מחוץ ל־if (ה־if חל רק על השורה שאחריו), ולכן הלולאה מתקדמת תמיד.
מעקב (רק הערכים שבהם התנאי מתקיים):
| i | עשרות i / 10 | אחדות i % 10 | סכום | נוסף לטבלה? |
|---|---|---|---|---|
| 10–16 | 1 | 0–6 | 1–7 | לא |
| 17 | 1 | 7 | 8 | כן |
| 26 | 2 | 6 | 8 | כן |
| 35 | 3 | 5 | 8 | כן |
| 44 | 4 | 4 | 8 | כן |
| 49 | 4 | 9 | 13 | לא; אחרי i++ i = 50 והלולאה נעצרת |
פתרון: המחרוזת שנשלחת לדפדפן היא:
<table border = '1'><tr><td>17</td></tr><tr><td>26</td></tr><tr><td>35</td></tr><tr><td>44</td></tr></table>ולכן בדפדפן תוצג טבלה עם מסגרת, בעלת עמודה אחת וארבע שורות:
| 17 |
| 26 |
| 35 |
| 44 |
בדיקה: הפונקציה מחזירה בדיוק את המחרוזת שלמעלה.
טעות נפוצה: לכתוב את קוד ה־HTML כתשובה בלי לתאר את מה שמוצג בדפדפן, או לשכוח את המספר 17 (מ־10 עד 19 יש מספר אחד שסכום ספרותיו 8).
פרק שני
ענו על שלוש שאלות: על שאלה 4 (שאלת חובה – 10 נקודות) ועל שתיים מן השאלות 5–7 (לכל שאלה – 20 נקודות).
שאלה 4 · דף HTML – ארצות הים התיכון (10 נקודות)
נועה, תלמידת מגמת מדעי המחשב, פיתחה אתר ובו מידע על ארצות הים התיכון – דרום אירופה.
באתר חמישה דפי html : עמוד בית (homepage), דף מידע על יוון (greece), דף מידע על איטליה (italy), דף מידע על צרפת (france) ודף מידע על ספרד (spain).
להלן מבנה התיקייה – site של האתר. בתיקייה נמצאים חמשת דפי ה־ html ותיקייה ששמה pictures ובה ארבע תמונות של דגלי המדינות.

נתון קוד ה־ html שכתבה נועה בדף הבית (homepage):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>דף הבית</title>
</head>
<body dir="rtl" style="text-align:center">
<h1>ארצות הים התיכון – דרום אירופה</h1>
<table border="1" style="text-align: center">
<tr height="150">
<td width="200">
<img src="pictures/italy.jpg" height="100" width="150" /></br>
<a href="italy.html">איטליה</a></br>
</td>
<td width="200">
<img src="pictures/greece.jpg" height="100" width="150" /></br>
<a href="italy.html">יוון</a></br>
</td>
<td width="200">
<img src="pictures/spain.jpg" height="100" width="150" /></br>
<a href="italy.html">ספרד</a></br>
</td>
<td width="200">
<img src="pictures/france" height="100" width="150" /></br>
<a href="italy.html">צרפת</a></br>
</td>
</tr>
</table>
דרום אירופה
</body>
</html>כיצד יוצג הדף הכתוב בעמוד הקודם? כִּתבו במחברת הבחינה את מספר התשובה הנכונה מבין האפשרויות (1)–(4):

התמונה של דגל צרפת אינה מוצגת. כִּתבו שורת קוד תקינה כדי שהתמונה תוצג. יש לכתוב רק את השורה הרלוונטית.
בדף הבית, בשורה השלישית מן הסוף, מופיעות המילים "דרום אירופה". כִּתבו שורת קוד ב־ html כך שצמד המילים "דרום אירופה" יהיה קישור לכתובת https://en.m.wikipedia.org/wiki/Southern_Europeh .
◂ פתרון מלא לשאלה 4
סעיף א
(1)
מה נדרש: לזהות את מבנה הטבלה שהקוד יוצר.
רעיון: בטבלה יש תג <tr> אחד בלבד, ובתוכו ארבעה תגי <td>. כל <tr> הוא שורה וכל <td> הוא תא בשורה, ולכן מתקבלת שורה אחת עם ארבעה תאים זה ליד זה.
dir="rtl", ולכן התא הראשון (איטליה) מוצג מימין, ואחריו משמאל: יוון, ספרד, צרפת.</br> – הדפדפנים מתייחסים אליו כמו ל־<br>), שם המדינה כקישור.</table> מוצג מתחת לטבלה, ממורכז (text-align:center בגוף).pictures/france חסר את הסיומת .jpg (ראו סעיף ב).פתרון: התשובה היא (1). באפשרויות (2) ו־(3) יש שתי שורות של שני תאים – לשם כך היה צריך שני תגי <tr>; באפשרות (4) כל מדינה בשורה נפרדת – לשם כך היה צריך ארבעה תגי <tr>.
בדיקה: ניתחנו את הקוד בכלי ניתוח HTML: התקבלו שורה אחת (tr) וארבעה תאים (td), ותמונה אחת שהנתיב שלה (pictures/france) אינו קיים בתיקיית האתר.
הערה: בקוד יש גם תקלה שלא נשאלה עליה: כל ארבעת הקישורים מפנים ל־italy.html.
סעיף ב
<img src="pictures/france.jpg" height="100" width="150" /></br>
מה נדרש: לתקן את השורה של תמונת דגל צרפת.
רעיון: לפי מבנה התיקייה, הקובץ נקרא france.jpg ונמצא בתיקייה pictures. בקוד נכתב src="pictures/france" – בלי הסיומת .jpg, ולכן הדפדפן מחפש קובץ שאינו קיים. יש להוסיף את הסיומת.
פתרון:
<img src="pictures/france.jpg" height="100" width="150" /></br>בדיקה: הנתיב pictures/france.jpg מופיע ברשימת הקבצים של התיקייה site שבאיור, והוא בנוי בדיוק כמו שלוש השורות של שאר הדגלים, שמוצגים כראוי.
סעיף ג
<a href="https://en.m.wikipedia.org/wiki/Southern_Europeh">דרום אירופה</a>
מה נדרש: להפוך את הטקסט "דרום אירופה" שמתחת לטבלה לקישור לאתר חיצוני.
רעיון: קישור נכתב בתג <a>: בתכונה href כותבים את כתובת היעד, ובין תג הפתיחה לתג הסגירה – את הטקסט שעליו לוחצים. כתובת של אתר חיצוני נכתבת במלואה, כולל https://.
פתרון: במקום השורה דרום אירופה כותבים:
<a href="https://en.m.wikipedia.org/wiki/Southern_Europeh">דרום אירופה</a>בדיקה: בניתוח השורה התקבל קישור אחד שה־href שלו הוא בדיוק הכתובת שבשאלה, והטקסט המוצג הוא "דרום אירופה".
הערה: הכתובת הועתקה כפי שהיא מודפסת בשאלון (עם האות h בסוף). הערך האמיתי בוויקיפדיה הוא .../wiki/Southern_Europe, ונראה שה־h נוספה בטעות הדפסה; בבחינה מעתיקים את הכתובת כפי שנתונה.
טעות נפוצה: לכתוב את הכתובת בלי https:// – אז הדפדפן מחפש קובץ בשם הזה בתוך תיקיית האתר.
שאלה 5 · הרשאת מנהל באמצעות Session (20 נקודות)
חברת תוכנה רוצה לכתוב קוד אבטחה שיאפשר רק למנהל רשום לצפות בדף Admin.aspx , ויפנה משתמש שאינו מנהל רשום לדף notManager.aspx .
מבין שלוש האפשרויות שלפניכם, העתיקו למחברת הבחינה את ההגדרה המתאימה לשם כך.
(1) Application["Admin"]
(2) Session["Admin"]
(3) string["Admin"]
כִּתבו קוד אבטחה המפנה לדף notManager.aspx משתמש שאינו מנהל רשום (כלומר שערך האובייקט המתקבל הוא "false").
◂ פתרון מלא לשאלה 5
סעיף א
(2) Session["Admin"]
מה נדרש: לבחור באיזה אובייקט לשמור את המידע "המשתמש הנוכחי הוא מנהל".
רעיון: המידע שייך למשתמש מסוים, ולכן צריך אובייקט שיש לו עותק נפרד לכל משתמש.
Session["Admin"] = "true", ומשתמש אחר לא מושפע מכך.string["Admin"] – אינו אובייקט של ASP.NET ואינו ביטוי תקין ב־C#.פתרון: התשובה היא (2) Session["Admin"].
בדיקה: בסעיף ב קוד האבטחה מפנה, לכל ערך של Session["Admin"], רק את המשתמש שאינו מנהל.
סעיף ב
if (Session["Admin"] == null || Session["Admin"].ToString() == "false") Response.Redirect("notManager.aspx");
מה נדרש: בתחילת הדף Admin.aspx לבדוק אם המשתמש הוא מנהל רשום, ואם לא – להעביר אותו לדף notManager.aspx.
רעיון:
Page_Load של הדף Admin.aspx, כדי שתתבצע לפני שתוכן הדף נשלח לגולש.Session["Admin"] = "true" למנהל ו־"false" לכל משתמש אחר.Session["Admin"] (הערך הוא null) – גם הוא אינו מנהל רשום, ולכן גם אותו מפנים. את הבדיקה של null עושים ראשונה: בזכות הקיצור של ||, אם הערך null לא מגיעים ל־ToString() (שהיה גורם לשגיאה).Session["Admin"] הוא מטיפוס object, ולכן ממירים אותו למחרוזת (ToString()) לפני ההשוואה ל־"false".Response.Redirect מעביר את הגולש לדף אחר.פתרון (Admin.aspx.cs):
protected void Page_Load(object sender, EventArgs e)
{
if (Session["Admin"] == null || Session["Admin"].ToString() == "false")
{
Response.Redirect("notManager.aspx");
}
}בדיקה: הפעולה עבור שלושה משתמשים:
ערך Session["Admin"] | תוצאה |
|---|---|
| null (לא התחבר) | הפניה ל־notManager.aspx |
| "false" | הפניה ל־notManager.aspx |
| "true" | נשאר בדף Admin.aspx |
טעות נפוצה: לבדוק רק Session["Admin"].ToString() == "false" – משתמש שלא התחבר כלל (הערך null) יגרום לשגיאת זמן ריצה במקום להיות מופנה.
protected void Page_Load(object sender, EventArgs e)
{
if (Session["Admin"] == null || Session["Admin"].ToString() == "false")
{
Response.Redirect("notManager.aspx");
}
}שאלה 6 · בדיקת תקינות מספר טלפון ב־JavaScript (20 נקודות)
מספר טלפון נייד תקני צריך לעמוד בדרישות שלהלן:
כִּתבו בשפת javascript פונקצייה ששמה isValid , המקבלת מחרוזת המייצגת מספר טלפון – phoneNumber .
הפונקצייה מחזירה true אם המספר תקין, אחרת היא מחזירה false .
כִּתבו בשפת javascript פונקצייה ששמה isValid , המקבלת מחרוזת המייצגת מספר טלפון – phoneNumber . הפונקצייה מחזירה true אם המספר תקין, אחרת היא מחזירה false .
◂ פתרון מלא לשאלה 6
פתרון
פונקציה הבודקת: אורך 10, כל התווים ספרות, התו הראשון '0', השני '5', השלישי '0'/'2'/'4'.
מה נדרש: פונקציה שמקבלת מחרוזת ומחזירה true רק אם היא עומדת בשלוש הדרישות.
רעיון: בודקים את הדרישות אחת אחרי השנייה, וברגע שדרישה אחת לא מתקיימת מחזירים false:
length) חייב להיות 10."0" ל־"9" (השוואת מחרוזות של תו אחד לפי סדר התווים). כך "10 ספרות" נבדק במלואו: גם האורך 10 וגם שכל התווים ספרות."0" והתו במקום 1 הוא "5"."0" או "2" או "4".אם עברנו את כל הבדיקות – מחזירים true.
פתרון:
function isValid(phoneNumber) {
if (phoneNumber.length != 10)
return false;
for (var i = 0; i < phoneNumber.length; i++) {
var ch = phoneNumber.charAt(i);
if (ch < "0" || ch > "9")
return false;
}
if (phoneNumber.charAt(0) != "0" || phoneNumber.charAt(1) != "5")
return false;
var third = phoneNumber.charAt(2);
if (third != "0" && third != "2" && third != "4")
return false;
return true;
}בדיקה: הפונקציה על 12 מחרוזות:
| קלט | תוצאה | סיבה |
|---|---|---|
| "0501234567" | true | תקין |
| "0521234567" | true | תקין |
| "0547654321" | true | תקין |
| "0531234567" | false | הספרה השלישית 3 |
| "0511234567" | false | הספרה השלישית 1 |
| "0401234567" | false | לא מתחיל ב־05 |
| "1501234567" | false | לא מתחיל ב־05 |
| "050123456" | false | 9 ספרות |
| "05012345678" | false | 11 ספרות |
| "05012a4567" | false | תו שאינו ספרה |
| "050-123456" | false | מקף אינו ספרה |
| "" | false | מחרוזת ריקה |
טעות נפוצה: לבדוק רק את האורך ואת שלוש הספרות הראשונות ולשכוח לוודא שגם שאר התווים הם ספרות – אז מחרוזת כמו "05012a4567" תיחשב תקינה.
שאלה 7 · שאילתה עם תנאים מורכבים – מגרש מכוניות (20 נקודות)
במסד נתונים של מגרש למכירת מכוניות משומשות יש טבלה ששמה Cars המכילה את פרטי המכוניות המוצעות למכירה.
העמודות בטבלה הן:
דוגמה לטבלה ובה כמה מן המכוניות שבמגרש:
| Model | Year | Color | Owners | KM |
|---|---|---|---|---|
| Subaru | 2016 | Silver | 5 | 45,000 |
| Renault | 2018 | Red | 1 | 60,000 |
| Suzuki | 2001 | Blue | 4 | 200,000 |
| Citroen | 1998 | Blue | 3 | 240,000 |
כִּתבו שאילתה אחת בשפת SQL המבקשת להציג את הדגם ואת שנת הייצור של כל המכוניות שמקיימות לפחות אחד מן התנאים האלה:
– שנת הייצור היא בין השנים 2005–2020 (כולל) והמכונית נסעה פחות מ־ 50,000 ק"מ.
– מספר הבעלים הקודמים הוא לכל היותר 2 .
כִּתבו שאילתה אחת בשפת SQL המבקשת להציג את הדגם ואת שנת הייצור של כל המכוניות שמקיימות לפחות אחד מן התנאים שלמעלה.
◂ פתרון מלא לשאלה 7
פתרון
SELECT Model, Year FROM Cars WHERE (Year BETWEEN 2005 AND 2020 AND KM < 50000) OR Owners <= 2;
מה נדרש: להציג Model ו־Year של המכוניות שמקיימות את התנאי הראשון או את השני (או את שניהם).
רעיון:
Year BETWEEN 2005 AND 2020 (BETWEEN כולל את שני הקצוות, כמו "כולל" בשאלה) AND KM < 50000 ("פחות מ־" – אי־שוויון חזק).Owners <= 2.50000, לא 50,000); הפסיק בטבלה הוא רק לתצוגה.פתרון:
SELECT Model, Year
FROM Cars
WHERE (Year BETWEEN 2005 AND 2020 AND KM < 50000) OR Owners <= 2;בדיקה: על טבלת הדוגמה:
| Model | Year | תנאי 1 (2005–2020 ו־KM<50,000) | תנאי 2 (Owners≤2) | מוצגת? |
|---|---|---|---|---|
| Subaru | 2016 | כן (45,000) | לא (5) | כן |
| Renault | 2018 | לא (60,000) | כן (1) | כן |
| Suzuki | 2001 | לא | לא (4) | לא |
| Citroen | 1998 | לא | לא (3) | לא |
התוצאה שהתקבלה: Subaru 2016, Renault 2018.
הערה: אפשר לכתוב במקום BETWEEN גם Year >= 2005 AND Year <= 2020. ב־Access המילה Year היא גם שם של פונקציה, ולכן לעיתים כותבים אותה בסוגריים מרובעים: [Year].
טעות נפוצה: לחבר את כל התנאים ב־AND – אז יוצגו רק מכוניות שמקיימות את שני התנאים (בטבלת הדוגמה – אף אחת).
פרק שלישי
ענו על אחת מן השאלות 8–9.
שאלה 8 · מונה מבקרים שונים – Application ו־Session (20 נקודות)
בדף Default.aspx רוצים לכתוב קטע קוד שמטרתו למנות את מספר המבקרים השונים באתר, כך שבשום מצב לא יימנה אותו המשתמש יותר מפעם אחת.
אביטל הציעה את הפתרון שלהלן:
Application.Lock();
Application[“counter”] = (int)Application[“counter”] +1;
Application.UnLock();האם הקוד שהציעה אביטל מבצע את הנדרש? נמקו. אם הקוד אינו מבצע את הנדרש, כִּתבו מחדש את קטע הקוד כך שיבצע את הנדרש.
האם הקוד שהציעה אביטל מבצע את הנדרש? נמקו. אם הקוד אינו מבצע את הנדרש, כִּתבו מחדש את קטע הקוד כך שיבצע את הנדרש.
◂ פתרון מלא לשאלה 8
פתרון
לא. הקוד מגדיל את המונה בכל טעינה של הדף (גם רענון של אותו משתמש). יש להגדיל את המונה רק כשלמשתמש עדיין אין סימון ב־Session.
מה נדרש: לקבוע אם הקוד סופר משתמשים שונים, ואם לא – לתקן.
התשובה: הקוד אינו מבצע את הנדרש.
נימוק: הקוד נמצא בדף Default.aspx ולכן מתבצע בכל פעם שהדף נטען. אם אותו משתמש מרענן את הדף, או חוזר אליו מדף אחר באתר, המונה גדל שוב – כלומר אותו משתמש נספר כמה פעמים. (השימוש ב־Lock/UnLock נכון – הוא מונע ששני משתמשים יעדכנו את המונה המשותף בו־זמנית – אבל הוא לא פותר את בעיית הספירה הכפולה.)
רעיון לתיקון:
Application משותף לכל המשתמשים ומתאים לשמירת המונה עצמו.Session נפרד לכל משתמש ומתאים לסימון "המשתמש הזה כבר נספר".Session["counted"] עדיין null – זה הביקור הראשון של המשתמש: מסמנים אותו ב־Session ומגדילים את המונה (בתוך Lock/UnLock). אחרת – לא מגדילים.Application["counter"] הוא null וההמרה (int) נכשלת בשגיאה).פתרון:
Global.asax:
protected void Application_Start(object sender, EventArgs e)
{
Application["counter"] = 0;
}Default.aspx.cs:
protected void Page_Load(object sender, EventArgs e)
{
if (Session["counted"] == null)
{
Session["counted"] = "yes";
Application.Lock();
Application["counter"] = (int)Application["counter"] + 1;
Application.UnLock();
}
Response.Write("מספר המבקרים השונים: " + Application["counter"]);
}בדיקה: שני משתמשים: A טען את הדף 3 פעמים ו־B פעמיים (סה"כ 5 טעינות).
| קוד | ערך המונה בסוף |
|---|---|
| הקוד של אביטל | 5 |
| הקוד המתוקן | 2 |
בנוסף, הקוד של אביטל בלי אתחול המונה גרם לשגיאה (NullReferenceException).
הערה: פתרון שקול הוא להעביר את שלוש השורות של אביטל לפעולה Session_Start בקובץ Global.asax – פעולה זו מתבצעת פעם אחת בלבד בתחילת כל Session חדש. בשני הפתרונות "משתמש" פירושו גלישה (Session): אם המשתמש סוגר את הדפדפן וחוזר אחרי שה־Session פג, הוא יקבל Session חדש וייספר שוב. כדי לזהות משתמש גם בין גלישות שונות צריך מזהה קבוע, למשל הרשמה וכניסה עם שם משתמש השמור במסד הנתונים.
הערה על הקוד המודפס: בשאלון מופיעות מירכאות מעוצבות (“counter”); ב־C# יש לכתוב מירכאות רגילות ("counter"), כמו בפתרון.
טעות נפוצה: לשמור את הסימון "כבר נספר" ב־Application במקום ב־Session – אז אחרי שהמשתמש הראשון נספר, אף משתמש נוסף לא ייספר.
protected void Page_Load(object sender, EventArgs e)
{
if (Session["counted"] == null)
{
Session["counted"] = "yes";
Application.Lock();
Application["counter"] = (int)Application["counter"] + 1;
Application.UnLock();
}
Response.Write("מספר המבקרים השונים: " + Application["counter"]);
}שאלה 9 · INSERT, UPDATE, DELETE – טבלת המכוניות (20 נקודות)
שאלה זו מתייחסת לטבלת הנתונים Cars המוצגת בשאלה 7.
| Model | Year | Color | Owners | KM |
|---|---|---|---|---|
| Subaru | 2016 | Silver | 5 | 45,000 |
| Renault | 2018 | Red | 1 | 60,000 |
| Suzuki | 2001 | Blue | 4 | 200,000 |
| Citroen | 1998 | Blue | 3 | 240,000 |
כִּתבו שאילתה בשפת SQL המוסיפה למסד הנתונים מכונית מדגם Peugeot , שנת ייצור 2015 , בצבע green , שמספר הבעלים הקודמים שלה הוא 2 , ושנסעה 128,000 ק"מ.
כִּתבו שאילתה בשפת SQL המעדכנת את מספר הבעלים הקודמים של מכונית מדגם Subaru ל־ 3 ואת מספר הקילומטרים שנסעה המכונית ל־ 95,000 ק"מ.
הניחו שיש רק מכונית אחת מדגם Subaru .
המכונית מדגם Renault נמכרה.
כִּתבו שאילתה בשפת SQL המסירה את המכונית ממסד הנתונים.
הניחו שיש רק מכונית אחת מדגם Renault .
◂ פתרון מלא לשאלה 9
סעיף א
INSERT INTO Cars (Model, Year, Color, Owners, KM) VALUES ('Peugeot', 2015, 'green', 2, 128000);
מה נדרש: להוסיף שורה חדשה לטבלה Cars.
רעיון: הוספת שורה נעשית ב־INSERT INTO. אחרי שם הטבלה רושמים בסוגריים את שמות העמודות, ואחרי VALUES את הערכים באותו סדר. ערכי טקסט (Model, Color) – בתוך גרשיים; מספרים (Year, Owners, KM) – בלי גרשיים ובלי פסיק אלפים.
פתרון:
INSERT INTO Cars (Model, Year, Color, Owners, KM)
VALUES ('Peugeot', 2015, 'green', 2, 128000);בדיקה: על טבלת הדוגמה מתווספת השורה Peugeot | 2015 | green | 2 | 128000.
סעיף ב
UPDATE Cars SET Owners = 3, KM = 95000 WHERE Model = 'Subaru';
מה נדרש: לשנות שני ערכים בשורה קיימת.
רעיון: UPDATE עם SET לכל העמודות שמשנים (מופרדות בפסיק), ו־WHERE שבוחר את השורה. מכיוון שיש רק מכונית אחת מדגם Subaru, התנאי Model = 'Subaru' מזהה אותה באופן יחיד.
פתרון:
UPDATE Cars
SET Owners = 3, KM = 95000
WHERE Model = 'Subaru';בדיקה: אחרי העדכון השורה של Subaru היא Subaru | 2016 | Silver | 3 | 95000, ושאר השורות לא משתנות.
טעות נפוצה: לשכוח את WHERE – אז כל המכוניות בטבלה יעודכנו.
סעיף ג
DELETE FROM Cars WHERE Model = 'Renault';
מה נדרש: למחוק שורה מן הטבלה.
רעיון: DELETE FROM שם הטבלה, ו־WHERE שבוחר את השורה למחיקה (המכונית היחידה מדגם Renault). ב־DELETE לא כותבים שמות עמודות – נמחקת שורה שלמה.
פתרון:
DELETE FROM Cars
WHERE Model = 'Renault';בדיקה: אחרי שלוש השאילתות (א, ב, ג) על טבלת הדוגמה נשארות בטבלה: Subaru (מעודכנת), Suzuki, Citroen, Peugeot (החדשה) – ו־Renault כבר אינה בטבלה.
טעות נפוצה: לכתוב DELETE * FROM Cars ... (תחביר של Access בלבד) או לשכוח את WHERE – בלי WHERE נמחקות כל השורות.
טבלת התשובות
| שאלה | סעיף | תשובה |
|---|---|---|
| 1 | - | ג. למשלוח מידע מן הטופס לשרת בצורה מוסתרת |
| 2 | - | SELECT name, email FROM Students WHERE month = 7; |
| 3 | - | טבלה עם מסגרת, בעמודה אחת וארבע שורות: 17, 26, 35, 44 |
| 4 | א | (1) |
| ב | <img src="pictures/france.jpg" height="100" width="150" /></br> | |
| ג | <a href="https://en.m.wikipedia.org/wiki/Southern_Europeh">דרום אירופה</a> | |
| 5 | א | (2) Session["Admin"] |
| ב | if (Session["Admin"] == null || Session["Admin"].ToString() == "false") Response.Redirect("notManager.aspx"); | |
| 6 | - | פונקציה הבודקת: אורך 10, כל התווים ספרות, התו הראשון '0', השני '5', השלישי '0'/'2'/'4'. |
| 7 | - | SELECT Model, Year FROM Cars WHERE (Year BETWEEN 2005 AND 2020 AND KM < 50000) OR Owners <= 2; |
| 8 | - | לא. הקוד מגדיל את המונה בכל טעינה של הדף (גם רענון של אותו משתמש). יש להגדיל את המונה רק כשלמשתמש עדיין אין סימון ב־Session. |
| 9 | א | INSERT INTO Cars (Model, Year, Color, Owners, KM) VALUES ('Peugeot', 2015, 'green', 2, 128000); |
| ב | UPDATE Cars SET Owners = 3, KM = 95000 WHERE Model = 'Subaru'; | |
| ג | DELETE FROM Cars WHERE Model = 'Renault'; |