Professional Documents
Culture Documents
מותר להגדיר פונקציות עזר בכל השאלות ,אלא אם נאמר אחרת. •
בהצלחה! •
1
) נקודות18( 1 שאלה
:נתונה התכנית הבא
#include <iostream>
using namespace std;
class Base {
protected:
int x;
public:
Base(int xx) { x = xx; cout << "Base " << endl; }
virtual void f1() const { cout << "Base::f1 " << x << endl; }
virtual void f2() const { cout << "Base::f2 " << x << endl; }
void f3() const { cout << "Base::f3 " << x << endl; }
virtual ~Base() { cout << " ~Base" << endl; }
};
class Derived1: virtual public Base {
public:
Derived1(int xx): Base(xx + 1) { cout << "Derived1" << endl; }
void f1() const { cout << "Derived1::f1 " << x << endl; }
void f3() const { cout << "Derived1::f3 " << x << endl; }
~Derived1() { cout << " ~Derived1" << endl; }
};
class Derived2: virtual public Base {
public:
Derived2(int xx): Base(xx + 2) { cout << "Derived2" << endl; }
void f3() const { cout << "Derived2::f3 " << x << endl; }
~Derived2() { cout << " ~Derived2" << endl; }
};
class Derived12: public Derived1, public Derived2 {
public:
Derived12(int xx); // will be completed in paragraph 1
void f2() const { cout << "Derived12::f2 " << x << endl; }
~Derived12() { cout << " ~Derived12" << endl; }
};
int main() {
Base* arr[4];
arr[0] = new Base(10);
arr[1] = new Derived1(20);
arr[2] = new Derived2(30);
arr[3] = new Derived12(40);
arr[1]->f2();
arr[2]->f1();
arr[2]->f3();
arr[3]->f1();
arr[3]->f3();
for (int i = 0; i < 4; i++) {
cout << "i=" << i;
delete arr[i];
}
return 0;
}
2
סעיף א' 5( .נקודות)
כתבו את קוד הבנאי במחלקה Derived12באופן שיתאים לתכנית הנ"ל.
3
) נקודות12( 3 שאלה
.מה פלט של קטעי קוד הבאים
.במידה וישנה שגיאה עליכם לפרט בקצרה מה סוג השגיאה וסיבת השגיאה
) נקודות4( .'סעיף א
class Base {
public:
Base(){cout << "Base::Ctor" << endl; }
virtual ~Base() { cout << "Base::Dtor "<< endl; }
};
class Derived : public Base {
public:
Derived(){ cout << "Derived::Ctor" << endl; }
~Derived() { cout << "Derived::Dtor" << endl; }
};
int main() {
Base *p = new Derived();
delete p;
return 0;
}
) נקודות4( .'סעיף ב
class Test {
private:
int x;
public:
Test(int x = 0) { this->x = x; }
void change(Test* t) { this = t; }
void print() { cout << "x= " << x << endl; }
};
int main() {
Test obj(5);
Test* ptr = new Test(10);
obj.change(ptr);
obj.print();
return 0;
}
) נקודות4( .'סעיף ג
class Base {
public:
void fun() { cout << "Base::fun()"; }
void fun(int i=0) { cout << "Base::fun( "<< i << ")"; }
};
class Derived : public Base {
public:
void fun() { cout << "Derived::fun()"; }
};
int main() {
Derived d;
d.fun(1);
return 0;
}
4
) נקודות12( 4 שאלה
.מצאו את כל השורות השגויות בקוד הבא ופרטו בקצרה מה סיבת השגיאה
class B;
class A{
static int num;
int y;
friend void g(B b);
public:
static int getNum() { return num; }
A() { num++; }
virtual void z() = 0;
int getY() { return y; }
};
class B : public A{
int u;
public:
void z() {};
};
class C : public A{
public:
void z1() {};
};
void g(B b){
b.y;
b.u;
}
int A::num = 0;
int main(){
B::getNum();
C::getNum();
B b;
C c;
c.z();
c.getY();
b.getNum();
return 0;
}
5
) נקודות20( C שפת5 שאלה
שמקבלת מחרוזת מורכבת ממיליםlistOfWords נתונה תכנית אשר משתמשת בפונקציה
באותיות לטיניות עם רוח אחד או יותר בין מילה למילה והכותבת של משתנה שמייצג את כמות
: התכנית מדפיסה את אותן המילים בשורות נפרדות כך שהתכנית תדפיס.המילים במחרוזת
Hello
world
C
is
a
very
nice
language
: ?? ) בקוד הבאN ?? -השלימו את הקטעים החסרים (המסומנים ב
#include <stdio.h>
#include <stdlib.h>
char ** listOfWords( char *str, int *plen);
void main(){
char sentence[]="Hello world C is a very nice language";
char **newarr;
int len, i;
newarr = listOfWords(sentence, && 1 && );
for(i=0; i<len; i++)
puts( && 2 && );
}
char ** listOfWords( char *str, int *plen){
int i,j=0,k, count=0;
char **arr;
for(i=0; str[i]; i++)
if( && 3 && || str[i]==' ' && str[i-1]!=' ')
count++;
*plen = && 4 && ;
arr = && 5 && ;
for(i=0; i<count; i++){
while(str[j] && str[j]!=' ')
j++;
arr[ && 6 && ]= && 7 && ;
for(k=0; k<j; k++)
arr[i][k] = str[k];
&& 8 && ;
while( && 9 && )
j++;
str= str+j;
j = && 10 && ;
}
return arr;
}
6
שאלה 6שפת 30( Cנקודות)
לקראת שנת הלימודים החדשה בודקים באוניברסיטה את החובות הסטודנטים של השנה
שעברה .משתמשים בשלושה קבצים:
קובץ של כל הסטודנטים של השנה ושל שנה שעברה יחד ,כל שורה בקובץ כילה .1
את הפרטים הבאים:
✓ שם הסטודנט 20 -תווים
9 -ספרות ✓ ת.ז.
10 -תווים ✓ מחלקה
20 -תווים ✓ כתובת
-אות אחת ( Yכן N /לא) ✓ לומד השנה
קובץ החובות בסוף שנת הלימודים הקודמת ,כל שורה בקובץ מכילה את פרטים .2
הבאים:
✓ ת.ז .הסטודנט 9 -ספרות
4 -ספרות ✓ סכום
-אות אחת ✓ קוד הרושם
✓ תאריך העדכון 8 -תווים
קובץ התשלומים שבוצעו עבור חובות של שנה שעברה ,במבנה זהה לקובץ .3
קודם.
שלושת הקבצים מסודרים לפי מספר ת.ז .בסדר עולה ואין יותר משורה אחת לסטודנט.
כתבו פונקציה
)int univ (FILE* students, FILE* due, FILE* payment, char* dept, char* mail
שמקבלת studentsמצביע לקובץ הסטודנטים due ,מצביע לקובץ החובות payment ,מצביע
לקובץ התשלומים של הקיץ .הפונקציה יוצרת שני קבצים חדשים של הסטודנטים שלאחר
תשלומי חובם עדיין לא סולק לגמרי:
קובץ ששמו במחרוזת deptוהוא קובץ של הסטודנטים שלומדים השנה ועבורם .1
קיים עדין חוב (זה יגרום חסימה לרישום בקורסים של מחלקות שונות) .כל שורה מכילה:
✓ שם הסטודנט 20 -תווים
9 -ספרות ✓ ת.ז.
10 -תווים ✓ מחלקה
4 -ספרות ✓ חוב
קובץ ששמו במחרוזת mailוהוא קובץ של הסטודנטים שלא לומדים השנה .2
ועבורם קיים עדין חוב (הודעה תישלח בדואר) .כל שורה מכילה:
✓ שם הסטודנט 20 -תווים
9 -ספרות ✓ ת.ז.
20 -תווים ✓ כתובת
4 -ספרות ✓ חוב
שני הקבצים מסודרים לפי מספר ת.ז .בסדר עולה.
הפונקציה תחזיר את סה"כ חובות הסטודנטים שלא לומדים השנה ובכל מקרה של תקלה
בעבודה עם קובץ הפונקציה תחזיר את הערך .-1
שימו לב!
• בכל הקבצים אין תווי הפרדה בין השדות.
• אין לעבור על קובץ יותר מפעם אחת.
• אין להעתיק קובץ למבנה נתונים אחר (מערך ,רשימה משורשרת ,עץ ,קובץ אחר)...
7
INPUT/OUTPUT FUNCTIONS PROTOTYPES :פלט/רשימת פונקציות קלט
Open/Close a file
Get/put a character
Get/put a string
Formatted Input/Output
Remove a file
Rename a file
! בהצלחה