‏הצגת רשומות עם תוויות JAVA. הצג את כל הרשומות
‏הצגת רשומות עם תוויות JAVA. הצג את כל הרשומות

יום שישי, 15 בנובמבר 2019

הסבר מתומצת על Casting בשפות מונחות עצמים

נסביר על התכונות הבסיסיות של Casting. כל הדוגמאות יהיו בג'אווה, אבל העקרונות נכונים בעוד הרבה שפות טיפוסיות (Statically Typed Languages) מונחות עצמים.


 Casting

נניח שיש לנו מחלקה משם Animal ויורשת ממנה מחלקה בשם Bird.

מצביע מסוג Animal יכול להצביע על Animal כמובן, אבל הוא יכול להצביע גם על היורשים, ולכן גם על Bird.

    Animal myAnimal1 = new Animal();
    Animal myAnimal2 = new Bird();

פעולה זו נקראת Upcasting, והיא הבסיס לפולימרפיזם.



לאחר ההמרה myAnimal2 לא יכול לקרוא לפונקציות של Bird, מאחר והחיה הזו שכחה שהיא הייתה פעם ציפור. אמנם היא עודנה ציפור וניתן להזכיר לה זאת על ידי Downcasting.


מהו Downcasting?
ההפך של Upcasting. הצבעה על אובייקט עם מצביע ממחלקה שיורשת ממחלקת האובייקט.
Downcasting לעולם יבוא רק לאחר שנעשה Upcasting.

    Bird myBird = (Bird) myAnimal2;

אחרי Downcasting ניתן לקרוא לפונקציות של Bird.

    myBird.fly();





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

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


נדגים:

public class Engineer {
    public void doEngineering() {
        System.out.println("I do some engineering");
    }
}

public class SmartEngineer extends Engineer {
    @Override
    public void doEngineering() {
        System.out.println("I do some engineering (but I am smart!)");
    }
    public void doSmartEngineering() {
        System.out.println("I do some smart engineering");
    }
}

public static void main(String[] args) {
    String userInput = "normal";
        
    Engineer engineer = null;
        
    if (userInput.equals("normal")) {
        engineer = new Engineer();
    }
    else {
        engineer = new SmartEngineer();
    }

    // We can do:
    engineer.doEngineering();

    // We can't do (compilation error):
    // engineer.doSmartEngineering();


    // We can do it but it's risky (If userInput is "normal" we get ClassCastException):

    ((SmartEngineer) engineer).doSmartEngineering();
}


מקווה שהכל ברור.



יום שישי, 28 ביוני 2019

זהירות! רקורסיה הדדית בין מחלקות (Java)

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

class A {
    final static B b;
    static {
        System.out.println("In A static block");    
        b = new B();
    }

    A() {
        if (b != null) {
            System.out.println("B is: " + b);
        } else {
            System.out.println("the static block was not completed, "
                    + "inspite of we are in the constructor!!!");
        }
    }
}

class B {
    final static A a;
    static {
        System.out.println("In B static block");   
        a = new A();
    }

    B() {
    }

    @Override
    public String toString() {
        return "I am B";
    }
}

יום שישי, 4 בינואר 2019

קצת על סיבוכיות

כשסיבוכיות באה לידי מעשה

נתבונן בשאלה הבאה אשר ממחישה בצורה טובה איך ניתן לייעל אלגוריתם.

נתון מערך באורך N אשר מכיל מספרים מאפס עד N כולל, ואף מספר אינו חוזר פעמיים.
פירוש הדבר הוא שקיים בדיוק מספר אחד בין אפס ל-N שלא מופיע במערך.
מצאו את המספר!


ובפשטות, ממשו את הפונקציה findMissingNumber:
    public static void main(String[] args) {
        // N is 6
        int[] array = new int[] {0, 1, 2, 6, 4, 3};
        
        int missingNumber = findMissingNumber(array);
        System.out.println("The missing number is: " + missingNumber); // 5
    }







יום שלישי, 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);




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

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


Telegram Bot with Java

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

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

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

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


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


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












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

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

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

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


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

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

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




סרטון הסבר:


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

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

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

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



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


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

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

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

ממשק גרפי עם JavaFX


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

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

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








מדריכים ל-JavaFX:

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

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

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

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



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



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



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

 



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

יום ראשון, 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;
    }
}




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

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

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


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


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







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

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

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

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

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





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




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

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


Thread


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


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




יום רביעי, 29 בנובמבר 2017

חיבור ה-NetBeans ל-GitHub

חיבור ה-NetBeans ל-GitHub של Bitbucket



1. צרו משתמש, קבוצה ופרויקט ב: Bitbucket.

2. חברו את ה-Git שלכם ל-NetBeans. השתמשו במדריך.





בהצלחה.


יום חמישי, 23 בנובמבר 2017

פרויקט דמו בג'אווה - קליטה ושינוי מה SQL Server

תקשורת בטוחה עם בסיס הנתונים - קריאה ועדכון

הפרויקט של עמית:
-להורדה-


לימדו אותו היטב.





משימה:
- לקבל את כל השורות של הטבלה "Categories" מבסיס הנתונים "NORTHWND" לתוך רשימה (מסוג ArrayList) של אובייקטים שמכילים את כל העמודות של הטבלה.
- לשנות את אחד מאיברי הרשימה, בלי לשנות את ה-id.
- לכתוב פונקציה שמקבלת את הרשימה ששינינו ומעדכנת את הטבלה ב-NORTHWND על פי אותה רשימה.
- לבדוק ב SQL Server שאכן הטבלה Categories עברה שינוי.

יום רביעי, 8 בנובמבר 2017

קלט מהמשתמש ב Java (בדומה ל-scanf)

קלט בג'אווה:

1.
מוסיפים את המחלקה:  "java.util.Scanner"
כך:
import java.util.Scanner;

או את כל המחלקה:
import java.util.*;





2.
כותבים פעם אחת בראש הפונקציה את הקוד:
Scanner s = new Scanner(System.in);

(את המשתנה "s" אפשר להחליף בכל שם שנרצה)

יום רביעי, 25 באוקטובר 2017

כל מה שנחוץ לפרויקט - מדריכי ווידאו של עמית פרדיס

כל מה שנחוץ לתחילת הפרויקט



הקמת טבלאות במסד מידע SQL (למי ששכח איך עושים את זה)


יום שישי, 16 ביוני 2017

אתגר למתכנת - בית בלי להרים את העט

צייר לי בית

מכירים את המשחק בו צריכים לצייר בית ובתוכו איקס בלי להרים את העט ובלי לחזור על אף קו?
לדוגמה:



כמה דרכים אפשריות יש לדעתכם לפתור את החידה?
נסו לכתוב תוכנה שמוצאת את כולן!