יום שני, 8 במאי 2017

פונקציה בונה

פונקציה בונה ב class שלנו

לרוב נרצה שתהיה "פונקציה בונה" (Constructor) בכל class.
תפקידה להכניס ערכים ראשוניים לחלק/לכל המשתנים של האובייקט.

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


לדוגמה:

#include <iostream>
#include <string.h>
using namespace std;
class worker {
 char name[20];
 int age;
public:
 worker() { // זו הפונקציה הבונה
  cout<<"Enter name: ";
  cin >> name; 
  do {
   cout <<"Enter Age: "; 
   cin >> age;
  }while(age < 18);    // משום שנרצה עובד בגיל 18 ומעלה
 }
 void SetAge(int a) {
  if(a >= 18)
   age = a;
 }
 void Show() {
  cout<<"Name: "<<name << "  Age: "<<age<<"\n";
 }
};
void main() {
 worker w3; // למרות שיצירתו מפעילה את הפונקציה הבונה שלו .w3 כפי שרואים לא צריך סוגריים אחרי
 w3.Show();
 w3.SetAge(70);  // נזכיר שמשנים את הגיל אך ורק באמצעות הפונקציה
 w3.Show();
}





דוגמה 2:
פונקציה בונה שמקבלת ערכים.
#include <iostream>
#include <string.h>
using namespace std;
class worker {
 char name[20];
 int age;
public:
 worker(char *nint a) {  // פונקציה בונה שמקבלת ערכים
  strcpy(name, n);
  if(a >= 18)
   age = a;
  else 
   age = 18;
 }
 void SetAge(int a) {
  if(a >= 18)
   age = a;
 }
 void Show() {
  cout<<"Name: "<<name << "  Age: "<<age<<"\n";
 }
};
void main() {
 worker w1("Shalom" , 27);
 w1.Show();
}





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





שימו לב: כשיוצרים מערך של אובייקטים, מופעלת הפונקציה הבונה עבור כל איבר במערך.




שאלות:

1. הגדר מחלקה אשר תייצג תיק של עובד.
 במחלקה יוגדרו המשתנים הבאים:
    -מספר זהות.
    -שכר לשעה.
    -מספר שעות עבודה רגילות.
    -מספר שעות נוספות.
 בנוסף תוגדר פונקציה בונה לאתחול המשתנים, פונקציה אשר תציג את
 המשתנים ופונקציה לחישוב משכורת העובד לפי הנוסחה הבאה:
 (שכר לשעה * שעות רגילות) + (שכר לשעה * שעות נוספות * 1.5).
 כתוב תוכנית ראשית אשר מוגדר בה מערך של 3 אובייקטים, תציג אותם ותחשב
 את המשכורת של כל העובדים.

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

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

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







תשובות:
1.
#include <iostream>
#include <string.h>
using namespace std;
#define N 3 // מספר העובדים
 
class worker {
 char ID[12];
 int PPH;  // שכר לשעה
 double hours, overtime;
 
public:
 worker() {  // פונקציה בונה שמקבלת ערכים
  cout<<"Enter ID: ";
  cin>> ID;
  cout<<"Enter price per hour: ";
  cin>> PPH;
  cout<<"Enter hours, overtime:  ";
  cin>>hours>>overtime; //  enter קולטים כאן את שניהם באותה פקודה. מופרדים ברווח או ב
 }
 
 void show(){
  cout<<"ID: "<<ID << "  PPH: "<<PPH<<"  Hours: "<<hours<<"  Overtime: "<<overtime<<"\n";
 }
 double salary(){
  return PPH*hours + PPH*overtime*1.5;
 }
};
void main() {
 worker ArryW[N]; ///  יפעיל את הפונקציה הבונה עבור כל איבר במערך
 for (int i=0; i<N; i++){  // for מוגדר כך, הוא מוכר רק בתוך לולאת ה i כאשר המשתנה C++ בשפת
  ArryW[i].show();
  cout << "The salary: "<<ArryW[i].salary()<<"\n";
 }
}




2.
#include <iostream>
using namespace std;
#include <string.h>
 
class Pupil{
 int score1, score2, score3, score4;
public:
 char name[15];
 Pupil(){
  cout <<"Enter name: ";
  cin>>name;
  cout<<"Enter score1: ";
  cin >>score1;
  cout <<"Enter score2 ";
  cin>>score2;
  cout<<"Enter score3: ";
  cin >>score3;
  cout<<"Enter score4: ";
  cin >>score4;
  cout<<"\n\n";
 }
 void show(){
  cout <<"Name: "<<name<<"\n";
  cout<<"Score1: "<<score1<<"\n";
  cout<<"Score2: "<<score2<<"\n";
  cout<<"Score3: "<<score3<<"\n";
  cout<<"Score4: "<<score4<<"\n\n";
 }
 
 double average (){
  return((score1+score2+score3+score4)/4.0);  // int אם נכתוב 4 ולא 4.0 אז התוצאה תהיה 
 }
};
 
void main(){
 int i;
 double best=0;
 char BestName[15];
 Pupil pupilsArray[3];
 
 for(i=0; i<3; i++){
  pupilsArray[i].show();
  if(pupilsArray[i].average() >= best){
   best = pupilsArray[i].average();
   strcpy(BestName , pupilsArray[i].name);
  }
 }
 
 cout<<"\n\nBest pupil: "<<BestName<<"\n";
 cout<<"Average: "<<best<<"\n";
}









המשך יבוא..


תגובה 1:


  1. #include//תרגיל 1 7.5.17
    #include
    using namespace std;

    double distance(double x1, double y1, double x2, double y2){
    return sqrt(pow((x1-x2),2)+pow((y1-y2),2));
    }


    class point{
    public:
    double x;
    double y;
    point(){
    cout<<"Enter x: ";
    cin>>x;
    cout<<"Enter y: ";
    cin>>y;

    }
    void show(){
    cout<<"X: "<>pointnumber;
    }while(pointnumber<3);
    pointsArry = new point [pointnumber];

    }
    void show(){
    int i;
    cout<<"details:\n";
    for(i=0; i>x;
    }

    השבמחק