פתרתי טוב (java basics) מה אתם אומרים ?

YIM222

New member
פתרתי טוב (java basics) מה אתם אומרים ?

בס"ד
יש כאן תרגיל שניסיתי לפתור- מי שבא לו לעיין ולהגיד מה הוא חושב - סבבה:
זה התרגיל :
4. Exercises on Array
Exercise GradesAverage (Array): Write a program called GradesAverage, which prompts user for the number of students, reads it from the keyboard, and saves it in an int variable called numStudents. It then prompts user for the grades of each of the students and saves them in an int array called grades. Your program shall check that the grade is between 0 and 100. A sample session is as follow:
Enter the number of students: 3
Enter the grade for student 1: 55
Enter the grade for student 2: 108
Invalid grade, try again... Enter the grade for student 2: 56
Enter the grade for student 3: 57
The average is 56.0

קישור : http://www.ntu.edu.sg/home/ehchua/programming/java/J2a_BasicsExercises.html
זה הפיתרון שלי :

package Exercise1;
import java.util.Scanner;
public class GradeAverage {
Scanner input = new Scanner(System.in);
int numStudents ;

public GradeAverage(){
getStudentsNumber();
//saveGrades();
}

public void getStudentsNumber(){
System.out.print("Enter the of number of students: ");
int numStudents = input.nextInt();
int totalGrades=0;
int[] grades = new int[numStudents];
double average = 0;
for(int i = 0;i< numStudents; i ++){

int studentIndex = i +1;
boolean b = false;
while( b ==false ){
System.out.print("Enter the Grade for student "+ studentIndex +":");

grades = input.nextInt();

if (grades >= 0 && grades <=100){
totalGrades = totalGrades + grades;
b = true;
}
else{
System.out.println("invalide grade, try again please...");

}
}
//System.out.println(totalGrades + " - total");
average = (double)totalGrades / numStudents;




}
System.out.println("The average is: "+average);
}



public static void main(String[] args){

GradeAverage a = new GradeAverage();


}
}
 

BravoMan

Active member
בגדול, הפתרון נכון, אבל כמה נקודות קטנות:

1. לא מקובל ב-Java שהמחלקה תעשה את כל העבודה שלה מתוך הבנאי.
אומנם הפרדת את הקוד לפונקציה נפרדת, אבל אתה קורה לה ישירות מתוך הבנאי.
&nbsp
2. שים לב, שאתה מגדיר "הרשאת חבילה" (package scope) על משתני המחלקה שלך input ו-numStudents.
יש מקרים די נדירים שזה נחוץ, ובטח שלא במקרה שלך, כדאי להתרגל מראש לכתוב private או public בהתאם לצורך אמתי.
גם אין סיבה באמת להשתמש פה במשתני מחלקה, מספיקים משתנים מקומיים בפונקציה.
&nbsp
3. אתה מגדיר משתנה numStudents כאיבר מחלקה, אך דורס אותו עם משתנה מקומי באותו שם בפונקציה getStudentsNumber כך שלמעשה, הגדרת משתנה מיותר שלא נעשה בו שימוש.
&nbsp
4. הפוקנציה getStudentsNumber יכולה להיות סטטית, כך שתוכל לקרוא לה ישירות מ-main בלי ליצור אובייקט חדש.
כמובן, שתצטרך להעביר את input לתוכה, אבל היות ואתה לא משתמש בו בשום מקום אחר במחלקה זה רק הגיוני. או שתהפוך גם אותו לסטטי, אבל באמת שאין סיבה להחזיק אותו מחוץ לפונקציה היחידה שמשתמשת בו.
&nbsp
5. השם של הפונקציה getStudentNumber מטעה!
הפונקציה עושה הרבה יותר מלקלוט מספר תלמידים, בעצם היא עושה את הכל.
או שתתן לה שם מתאים יותר, או שתפריד את הפעולות לפונקציות נפרדות.
&nbsp
6. למשתנה b יש שם חסר משמעות.
למעת משתנים שמשמשים לאינדקס לולאות, כגון i, תמיד מומלץ לתת שמות משמעותיים למשתנים, למשל gradeValid.
&nbsp
7. המשתנה studentIndex מיותר.
תוכל לכתוב ישירות את החיבור תוך שימוש בסוגריים בתוך ה-print או, אם אתה רוצה לעשות את זה ממש יפה, תשתמש בפונקציה toString של המחלקה הסטנדרטית Integer. או בפונקציה format של המחלקה String.
 

YIM222

New member
תודה רבה !! אני אלמד את התשובות ואיישם בע"ה

תודה על ההשקעה אני מעריך את זה.
 

YIM222

New member
לגבי מה שכתבת

ב-1 - אז איך מקובל להפעיל את התוכנה? ע"י קריאה ישירה מה-main ? ומדוע ?
אשמח בכללי לקישור לאיזה הסבר על ecupsulation principle.
ב-2 - האם זה משנה איזה הרשאות יהיו למשתנים המקומיים ?
 

BravoMan

Active member
תשובות:

1. תלוי בנסיבות.
אין לי קישור ספציפי למאמר על encapsulation, גוגל יעזור לך עם זה, אבל בגדול, זה אומר שכל המידע הרלוונטי למחלקה מסוימת שמור בתוכנה, וכל מניפולציה עליו נעשית רק ע"י פונקציות של אותה מחלקה.
&nbsp
כלומר, לא נוגעים ישירות במשתני מחלקה מקוד חיצוני, אלא רק קוראים לפונקציות שלה.
כמובן, לפונקציות "ציבוריות" (public) אפשר לקרוא מכל מקום בקוד, בלי שום קשר ל-encapsulation.
&nbsp
ספציפית במקרה שלך, הקריאה צריכה להיעשות מ-main כי אין מקום אחר.
תפקיד הבנאי הוא רק לאתחל אובייקט חדש.
אם אובייקט מספק שירות כלשהו, למשל "חישוב ממוצע ציונים", השירות מתבצע ע"י קריאה לפונקציה מתאימה ע"י מי שצריך את השירות, שוב, במקרה שלך זו פונקציה main.
&nbsp
התרגיל שעשית די קטן, ונועד יותר לתרגל לולאות פשוטות מאשר נושאים מורכבים בתכנות מונחה עצמים כמו encapsulation, ולכן אני בטוח שבכלל התכוונו שתשים את כל הקוד ב-main.
&nbsp
אבל, אם אתה רוצה להרחיב את התרגיל, תבנה מחלקה נפרדת שמטפלת בתלמיד וציוניו, תדאג שיהיו לה פונקציות נפרדות להזנת ציונים, לקבלת הממוצע, קביעה וקבלה של כמות הציונים וכו'.
&nbsp
תיצור אובייקט שלה ב-main, ותפעיל עליו את הפונקציות השונות.
&nbsp
2. "משתנה מקומי" הוא משתנה שמוגדר בתוך פונקציה, ואין לו הרשאות.
"איבר מחלקה" הוא משתנה שמוגדר מחוץ לפונקציה, והוא חייב הרשאות מתאימות.
&nbsp
למה?
בדיוק בגלל עקרון האנקפסולציה. כדי שרק מי שמותר לו להתעסק עם המשתנה יוכל לעשות זאת.
&nbsp
אני אתן לך דוגמה:
בתרגיל שלך, מותר לציון להיות רק בין 0 ל-100.
נניח, שהמחלקה שלך היית שומרת ציונים באיבר "ציבורי" public אחרי שקלטה אותם.
בגלל שהאיבר "פתוח לכולם", מישהו היה יכול במקום אחר בקוד, מחוץ למחלקה שלך, להכניס לתוכו ערך לא חוקי, נגיד 5-, ולא היית שום דרך למנוע את זה, וגם לא את השגיאות בהמשך שיתרחשו בגלל הערך הלא חוקי.
&nbsp
יהיה גם מאוד קשה למצוא היכן בדיוק הכניסו את הערך הלא חוקי, ולתקן את הקוד.
&nbsp
אבל אם המשתנה הוא private, רק פונקציות של המחלקה שלך יכולות לשנות אותו, והמחלקה שלך כבר דואגת לבדוק שלא יכנסו ערכים לא חוקיים.
ואם בכל זאת יכנס ערך כזה, נדע שצריך לבדוק רק את הקוד של המחלקה שלך, ולא לחפש בכל התוכנית.
&nbsp
 

BravoMan

Active member
בגדול כן:

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

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

מה שחשוב לדעת, שבניגוד לשפות אחרות, ב-Java "מחלקה" היא הרמה העליונה של סידור קוד.
שום דבר לא נמצא מחוץ למחלקה ב-Java, לא משתנים ולא פונקציות.

(הוראות import עקרונית נמצאות מחוץ למחלקה, אבל הן יותר הוראות לקומפיילר מאשר קוד של ממש)
 

YIM222

New member
חחח אני התכוונתי גם במונח members

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