יום שלישי, 4 בדצמבר 2018

Immutable Class in Java

Immutable Class


Immutable Object הוא אובייקט שלא ניתן לשנות בשום דרך. הוא לעולם יכיל את אותם הערכים איתם הוא נוצר.
המחלקה הכי מוכרת מסוג זה היא למעשה String.

בדוגמה הבאה לא ניתן לשנות את התוכן של s1 בשום אופן:
String s1 = "ABC";


השורה הבאה לא משנה את התוכן שהיה באובייקט עליו הצביע s1, אלא יוצרת אובייקט חדש ואומרת ל-s1 להצביע כעת עליו:
s1 = s1 + "D";


יהיה אשר יהיה הקוד בפונקציה ()f, ההדפסה בלי ספק תהיה "abcde":
String s2 = "abcde";
f(s2);
System.out.println(s2);




יום חמישי, 8 בנובמבר 2018

מצגת: ראיית מכונה בזמן אמת

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

ראיית מכונה בזמן אמת




יום שישי, 3 באוגוסט 2018

סיכום טירונות 02

טירונות 02 - המלצות

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





משך הטירונות

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



מיקום

צריפין. (Google Maps)


יום ראשון, 1 ביולי 2018

יצירת בוט בטלגרם (Java)


Telegram Bot with Java

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

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

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

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


את הבוט כתבתי ב-Java, תוך שימוש בספרייה Rubenlagus' library for Java שניהלה את התקשורת עם ה-API של טלגרם.
קוד המקור של הבוט שלי: [צפייה חסר], [הורדה חסר]


................................












התחלה: יצירת בוט במסד של טלגרם

יום רביעי, 27 ביוני 2018

ביצוע "מיון מיזוג" על מערך דו ממדי

Merge Sort על מערך דו ממדי


"Merge Sort" הוא אחד מהאלגוריתמים המפורסמים למיון מערכים.
תוכלו לקרוא עליו בהרחבה באתר של GeeksforGeeks.

נדגים עיקרון חשוב בעניין מערכים דו-ממדיים:
"מערך דו ממדי מתנהג ונשמר בזיכרון בדיוק כמו מערך חד ממדי."


לדוגמה, המערך:
[15],[22],[33]
[20],[80],[17]

נשמר בזיכרון כך:
[20],[80],[17],[15],[22],[33]

למעשה אם מערך חד ממדי לא שונה מ"מצביע", אז מערך דו ממדי לא שונה מ"מצביע למצביע".





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

הקוד:
(הקוד זמין גם כאן)

יום ראשון, 24 ביוני 2018

עוד על מבוכים, הפעם עם JavaFX

יצירה קלה של מבוכים חדשים עם ממשק משתמש גרפי


פוסט זה ממשיך בנושא פתרון מבוכים.

זה לא חלק מהחידה, אבל באיזשהו שלב רציתי שיהיה לי כלי נוח ליצירת מבוכים חדשים. ככה אוכל לבחון את התוכנה שכתבתי בשפת C ולוודא שהיא באמת פותרת כל מבוך.
לשם כך כתבתי תוכנה נוספת (ב-JavaFX), אשר באמצעות ממשק משתמש גרפי מאפשרת ליצור בקלות מבוכים חדשים.
את המבוכים החדשים היא שומרת בקובץ טקסט באותה התיקייה שבה היא רצה.

הורדת קובץ הרצה
הורדת קוד מקור




סרטון הסבר:


יום רביעי, 20 ביוני 2018

מציאת הפתרון המהיר ביותר למבוך

הפתרון המהיר ביותר למבוך

הקוד הבא הוא למעשה חידה מפורסמת. נתקלתי בו בבלוג של Symbol/Skyance, ועם שינויים מסוימים אני מביא אותו לכם.



נתון מבוך שמיוצג ע"י מטריצה NxM כאשר תמיד תחילת המבוך בקואורדינטות (0,0) והסיום בקואורדינטות (N-1,M-1).
ערך של 1- באיבר במטריצה מייצג קיר שאי אפשר לעבור וערך של 0 מייצג דרך שאפשר לעבור בה.
לשם הפשטות מותר ללכת במבוך רק בקוים ישרים.

עליכם לכתוב תוכנית מחשב שתמצא את הדרך הקצרה ביותר שניתן ללכת בה במבוך מההתחלה עד לסיום.





יום שלישי, 19 ביוני 2018

קורס מבוא לתכנות של הבסמ"ח

קורס מבוא לתכנות של Basmach!

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

בסך הכל ארבעה פרקים חשובים מאוד.
בקורס לומדים ++C. משום שכבר למדנו אותה נוכל להתמקד בסטנדרטים של הבסמ"ח.






ייצוא הפרויקט לקובץ EXE (‏Java)

ייצוא קובץ EXE באמצעות Launch4j

אז כתבתם פרויקט ב-NetBeans וכעת אתם רוצים לשתף אותו עם העולם,
לשם כך אתם רוצים לייצא אותו אל קובץ EXE.



נתחיל:
נתחיל בכך שתהיה לכם תוכנה מוכנה כלשהי, לדוגמה מחשבון פשוט אותו תוכלו ליצור כפי שמודגם כאן.


יצירת קובץ JAR הניתן להרצה:
ייצאו את הקוד שלכם אל קובץ JAR, אותו למעשה ניתן להריץ אף מבלי שתמשיכו ותעטפו אותו כקובץ EXE.
עשו זאת על ידי לחיצה ימינית על הפרויקט ואז בחירה באפשרות "Clean and Build".
קובץ ה-JAR ייווצר בתיקייה dist של הפרויקט.

יום שני, 18 ביוני 2018

יצירת קובץ EXE עם כל הספריות dll הדרושות (#C)

קבצי dll ב-Visual Studio

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

- כל הספריות בפרויקט שלנו שמורות תחת References.
- רק אחרי שנוסיף את הספרייה לפרויקט נוכל לקרוא לה על ידי using.




הוספת ספרייה לפרויקט:
דרך 1: להוריד את ה-dll ולהוסיף אותו ידנית.
דרך 2: אם מדובר בספרייה מוכרת, יתכן שניתן בעזרת NuGet להגיע אליה ישירות באמצעות חיפוש אונליין בויזואל סטודיו.
אפשר להגיע אל NuGet כך: TOOLS->Library Package Manager->Manage NuGet Packages for Solution.
או כפי שמתואר כאן.










יצירת קובץ EXE שמכיל את כל הספריות שעשינו בהן שימוש:

יום שישי, 1 ביוני 2018

אודות המבחן האחרון ("מעבדה") ב-SQL ו-Access

פרויקט Access


ביום רביעי ה-30/05/2018 היה יום הלימודים האחרון של יד' תוכנה - הגשת פרויקטים שנתיים לבוחנים של משרד החינוך.
על הפרויקט הגדול ב-Java עוד נכתוב בהמשך, אבל כמה מילים על הפרויקט ב-Access:


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



מה קיבלנו:
הבוחנים לא התעניינו ב-Access, יתכן שזו הייתה אי הבנה, הם ביקשו לראות את קשרי הגומלין בין הטבלאות, ואז נתנו לנו כרבע שעה לבצע משימה כלשהי.









משימות לדוגמה:

יום שלישי, 15 במאי 2018

מדריכים לתחילת עבודה עם JavaFX

ממשק גרפי עם JavaFX


בשלב מסויים אנחנו רוצים שהתוכנה שלנו תראה כמו תוכנה שהיינו מצפים לראות מותקנת על המחשב, כזו עם כפתורים וממשק נוח.
בעברה של Java היה נהוג להשיג את התוצאות האלה באמצעות Swing, אך מאחר והיא מיושנת וסובלת מחוסר תאימות למסכי 4K חיפשתי פתרון עדכני יותר: קבלו את JavaFX - הספרייה הרשמית שמחליפה את Swing.

אחת היכולות החשובות של JavaFX היא האפשרות לחלק את הקוד על פי מודל MVC הנוח.
להרחבה על המודל: Derek Banas, Traversy Media, HandsonERP

כבר בהתחלה, כמובן אחרי שהתקנתם את NetBeans, מומלץ להוריד את התוכנה SceneBuilder לעיצוב חלונות התוכנה בקבצי FXML.
להורדה: כאן.








מדריכים ל-JavaFX:

סדרת מדריכים מומלצת מאת ProgrammingKnowledge

יום שלישי, 8 במאי 2018

חידה: קוד שמדפיס את עצמו

מדובר בחידה נחמדה ומפורסמת מאוד: "קוד שמדפיס את קוד המקור של עצמו"
-אסור לגשת למקום בזיכרון שבו שמורה התוכנית.
-חייבים להדפיס את כל הקוד מתחילתו ועד סופו.



נסו זאת בעצמכם! זה אפשרי.




יום שישי, 4 במאי 2018

ניהול תקשורת בין משתמשים ללא "צד שרת"

תקשורת ללא "צד-שרת"



בעולם האמיתי כמעט תמיד תקשורת בין משתמשים ובין מסד הנתונים עובדת במודל Client-Server.
אבל אנחנו לא בעולם האמיתי, אבטחה ויעילות כרגע לא חשובות לנו, ואין לנו מחשב שישמש צד שרת. עלינו להגיש פרויקט תוך חודש.



אסביר כאן על האופן שבו כל שחקן (בפרויקט שלי, שבו שני שחקנים משחקים אחד נגד השני) לוחץ על כפתור "מצא לי שחקן יריב" ומתחיל לשחק באם נמצא יריב.



לצורך כך ניצור בבסיס הנתונים טבלה בשם "PlayersWaitingForGame":

 



ה-ID יהיה כמובן PK ו-Identity.
ה-PlayerID מקושר בקשר גומלין לטבלת Players.
ה-SecondPlayerID מקושר גם הוא בקשר גומלין לטבלת Players.

יום שלישי, 1 במאי 2018

יצירת פרוצדורה ב-SQL Server

Procedure - TSQL

פרוצדורה היא פונקציה (קטע קוד) ששמורה בשרת ה-SQL ומבצעת רצף פעולות בעת שקוראים לה.
פרוצדורה יכולה לקבל ערכים ולהחזיר ערכים.

יצירה:


CREATE procedure שם
@Parameter01 int, @Parameter02 nvarchar(30) -- קבלת פרמטרים
AS
      ...קוד...
go




עריכת פרוצדורה שכבר יצרנו:
ALTER procedure שם
@Parameter01 int, @Parameter02 nvarchar(30) -- קבלת פרמטרים
AS
      ...קוד...
go


יום ראשון, 29 באפריל 2018

מדריך ווידאו - חיבור Access ל-SQL Server

המדריך החדש של גידי (בהתאם להנחיות משרד החינוך החדשות):





פקודות בסיסיות בשפת פסקל

אז משרד החינוך הוסיף לנו שפה חדשה בהתראה מאוד קצרה: Pascal.


- מדריך בויקיפדיה
- מדריך באנגלית
- קומפיילר אינטרנטי: כאן או כאן







סינטקס:


Syntax pascal:


חשוב להדגיש שפסקל לא מבחינה בין אותיות גדולות לקטנות!

Settings variabels
Exampels:
type
days, age = integer;
yes, true = boolean;
name, city = string;
fees, expenses = real;
Now, the types so defined can be used in variable declarations −
var
weekdays, holidays : days;
choice: yes;
student_name, emp_name : name;
capital: city;
cost: expenses;

יום ראשון, 8 באפריל 2018

ירושה ג'נרית של מחלקת ה-SQL לכל טבלה - Java

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

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







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

אחרי שמבינים את התבנית, ניתן לכתוב פונקציה ג'נרית (פונקציה כללית) שמכילה את עיקר הקוד. לפונקציה שולחים שני ערכים נוספים:
"מערך שמות העמודות בטבלה" ו-"פונקציה שיודעת להמיר ResultSet לאובייקט".










קוד:

יום רביעי, 4 באפריל 2018

ירושה של מחלקת ה-SQL לכל טבלה - Java

הדגמה של מחלקה כללית לענייני טבלאות SQL ממנה יורשות המחלקות של כל הטבלאות



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


תזכורות:
לא לשכוח להוסיף את הדרייבר.
 * protected = רק היורשים יכולים להשתמש
 * final = לא ניתן לשינוי
 * abstract class = מחלקה שניתן לרשת אותה אבל לא ניתן ליצור מופע שלה






מחלקה לייצוג שגיאה:
public class CustomError {
    public String CustomMessage;
    public String SystemMessage;
    public Boolean isThereError;
    public CustomError(){
        CustomMessage = "Good";
        SystemMessage = "Good";
        isThereError = false;
    }
}




מחלקה לייצוג עובד:

יום רביעי, 14 במרץ 2018

חידה: מיון ספרות של מספר שלם



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

לדוגמה:
עבור המספר 23989769
תחזיר          99987632


אסור להשתמש במערך או בכל מבנה נתונים קיים. (למעט משתנים כמובן).
אסור להשתמש בפונקציות מיון קיימות.
אסור לקרוא לאף פונקציה שהיא למעט הפונקציה עצמה.
רק אתם וההבנה שלכם במספרים.









יום שני, 5 במרץ 2018

Enum ב-#C

Enum

בעבר למדנו על Enum בשפת C, היום נלמד עליו ב-#C.
Enum מאפשר לנו ליצג במילים דברים שהיינו יכולים ליצג במספרים, למען קריאות התוכנית למתכנת.

- ניתן ליצור Enum בתוך ומחוץ למחלקות ולמבנים. (מבנים = structs).
- פנייה לקבוע של אינם מסויים היא באמצעות שם האינם.
- אם מדובר באינם ציבורי ממחלקה אחרת, ניתן לפנות אליו רק בצירוף שם המחלקה.
- לכל מילה יש ערך מספרי. בברירת המחדל למילה הראשונה יש את הערך 0 ולכל מילה אחריה יש ערך גדול ב-1.
- לא ניתן להוסיף קבועים לEnum במהלך התוכנית.








דוגמאות:


Enum בתוך מחלקה, והמרה מקבוע אל int:
    class Program
    {
        // יצירת אינם ציבורי בתוך מחלקה
        public enum Season { WINTER, SPRING, SUMMER, FALL } 
 
        static void Main(string[] args)
        {
            // לתת למשתנה את הערך המספרי של קבוע מסוים בתוך האינם
            // int שימו לב שבשפת סי שארפ נדרשת המרה ל  
            int x = (int)Season.WINTER;
            int y = (int)Season.SUMMER;
 
            Console.WriteLine("WINTER = {0}", x); // ידפיס 0
            Console.WriteLine("SUMMER = {0}", y); // ידפיס 2
        }
    }



יום שני, 19 בפברואר 2018

פרסום קוד: מציאת כל הפתרונות האפשריים של כדור מחומשים (#C)

מציאת כל הפתרונות האפשריים שיש לכדור המחומשים

הכל התחיל מכדור מחומשים יפה ושלם.
מדובר היה במשחק, לפרק את הכדור ולהרכיב אותו בחזרה, איזה כיף.
אך אבוי! אחרי שפורק הכדור איש לא הצליח להרכיב אותו בהצלחה.

עברו שנים, ונזכרתי שאני מתכנת...





תמונה של הכדור מפורק:




יום שישי, 16 בפברואר 2018

מבני נתונים מבחנים חיצוניים וסיכומים

סיכומים ומבחנים חיצוניים מהשנים 2006-2017

להורדה: כאן, או כאן.

סמל 714911



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

(תודה דביר, תודה איציק)







יום שלישי, 6 בפברואר 2018

בגרות לבתי ספר על־יסודיים - מדעי המחשב (#C ו-Java)


בגרות במדעי המחשב


להורדת המבחנים והפתרונות של שנים 2016-2017: כאן.







שאלון 899381
המבחנים הם מאתר משרד החינוך.

יום חמישי, 25 בינואר 2018

מבחן מערכות ספרתיות ומבוא לאלקטרוניקה סוף טרימסטר תשע"ח

מבחן מערכות ספרתיות ומבוא לאלקטרוניקה
25/01/2018





ייצוג "תור" ב-#C

ייצוג פשוט של "תור" (עליו למדנו במבנה נתונים) בשפת #C.

הקוד פשוט מאוד להבנה:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace LearnQueue
{
    // תור = הראשון שנכנס הוא הראשון שיוצא
 
 

יום רביעי, 24 בינואר 2018

רשימה ג'נרית ב-#C

מימוש רשימה ג'נרית ב-#C

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



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication103
{
    class Node<T> // "המחלקה "צומת
    {
        private T info;
        private Node<T> next;
 
        public Node(T info)
        {
            this.info = info;
            this.next = null;
        }
 
        public Node(T info, Node<T> next)
        {
            this.info = info;
            this.next = next;
        }
 

תכנות ג'נרי ב-#C

Generic

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



דוגמא - פונקציה ג'נרית להדפסת מערך פשוטה:
(אפשר לתת לסוג המשתנים כל שם, כאן נשתמש ב-"E".)
    class Program
    {
        // פונקציה ג'נרית להדפסה של איברי מערך מכל סוג מספרי
        static void PrintArray<E>(E[] inputArray)
        {
            foreach (E element in inputArray)
                Console.Write(element + ", ");
            Console.WriteLine("\n");
        }
 
 
        static void Main(string[] args)
        {
            // double ו int יצירת מערך של 
            int[] intArray = { 1, 2, 3, 4, 5, 6 };
            double[] doubleArray = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 };
 
            // int הדפסת מערך
            PrintArray<int>(intArray); // 1, 2, 3, 4, 5, 6, :ידפיס
 
            // double הדפסת מערך
            PrintArray<double>(doubleArray); // 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, :ידפיס
        }
    }

יום חמישי, 18 בינואר 2018

עבודה עם קבצי טקסט, הצפנה וקבלת מספר פרמטרים לא קבוע (Java)

עבודה עם קבצים בג'אווה

בלי להכביר במילים (אהמ מה שלא הבנתם תבדקו בגוגל כידוע), המחלקה הבאה מכילה מספר פונקציות שימושיות לעבודה עם קבצים:





תוכלו לצפות בקוד כאן:




יום שלישי, 16 בינואר 2018

תכנות מקבילי Java Thread


Thread


בג'אווה כמו בהרבה שפות תכנות, צריך לפעמים שהמעבד יעשה מספר דברים במקביל. לשם כך נועדו ה-Threads.


הורדת מאמר (PDF): כאן או כאן.
ראו גם: Java מההתחלה, מדריך ביוטיוב של life michael.




יום שישי, 5 בינואר 2018

רשימות מקושרות ב-#C

זוכרים מהי רשימה מקושרת?
היום נלמד על רשימות מקושרות ב-#C.



רשימות מקושרות | Linked List
לפני שנלמד על רשימות מקושרות חשוב להבין שבשפת #C אין מצביעים. למה?
משום שבשפת #C כמעט כל דבר הוא מצביע! עד כדי כך שכבר אין צורך לסמן את זה באופן מיוחד.

הוכחה 1:
        static void Main(string[] args)
        {
            int[] arr1 = new int[5];
            int[] arr2 = new int[5];
            arr2 = arr1;
            arr2[0] = 19;
            Console.WriteLine(arr1[0]); // arr2 ידפיס 19, למרות שביצענו את השינויים על
        }