You are on page 1of 8

‫תאריך המבחן‪ :‬כ"ט שבט תשפ"ב ‪31/1/22‬‬ ‫אוניברסיטת בן גוריון בנגב‬

‫שמות המורה‪ :‬ציון סיקסיק‬


‫מבוא לתכנות מערכות‬ ‫מבחן ב‪:‬‬
‫‪371.1.1663‬‬ ‫מס' הקורס ‪:‬‬ ‫מספר נבחן ‪:‬‬
‫מיועד לתלמידי‪ :‬ביה"ס להנדסת חשמל ומחשבים‬
‫מועד א'‬ ‫סמ' א'‬ ‫שנה תשפ"ב‬
‫משך הבחינה ‪ 3 :‬שעות‬
‫דף פוליו אחד לא מודפס‬ ‫חומר עזר ‪:‬‬
‫ולא מצולם‪ .‬אין להשתמש במחשבון‪.‬‬

‫במבחן זה ‪ 6‬שאלות‬ ‫•‬

‫• רשמו תשובותיכם בדפי התשובות בלבד‬

‫מחברת הטיוטה לא תימסר לבדיקה‬ ‫•‬

‫• בסיום המבחן נאסוף רק את דפי התשובות‬

‫מותר להגדיר פונקציות עזר בכל השאלות‪ ,‬אלא אם נאמר אחרת‪.‬‬ ‫•‬

‫כתבו קוד קריא והקפידו על אינדנטציה והערות (בעברית)‪.‬‬ ‫•‬

‫בהצלחה!‬ ‫•‬

‫‪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‬באופן שיתאים לתכנית הנ"ל‪.‬‬

‫סעיף ב'‪ 13( .‬נקודות)‬


‫מה הפלט המלא של התכנית?‬
‫שימו לב‪ ,‬פלט מלא כולל הדפסות כל הבניות וההריסות המתרחשות בקוד‪.‬‬

‫שאלה ‪ 12( 2‬נקודות)‬


‫סעיף א'‪ 8( .‬נקודות)‬
‫כתבו פונקציה כללית (‪ )Template‬בשם ‪ maxOccur‬המקבלת מערך של ערכים כללים ואת גודלו‬
‫ומחזירה את הערך הנמצא הכי הרבה בעמים במערך‪.‬‬
‫חובה להקפיד על יעילות!‬

‫סעיף ב'‪ 4( .‬נקודות)‬


‫מה הדרישות (‪ )restrictions‬שהפונקציה מציבה בפני כל טיפוס ‪ T‬של המערך שמעבירים לה?‬

‫‪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

FILE *fopen( char *filename, char *mode );


int fclose(FILE *stream);

Repositions the file pointer to the beginning of a file

void rewind( FILE *stream );

Get/put a character

int fgetc( FILE *stream );


int fputc( int c, FILE *stream );

Get/put a string

char *fgets( char *string, int n, FILE *stream );


int fputs( const char *string, FILE *stream );

Formatted Input/Output

int fscanf( FILE *stream, const char *format [, argument ]... );


int sscanf( const char *string, const char *format [, argument ]... );
int fprintf( FILE *stream, const char *format [, argument ]...);
int sprintf( char *string, const char *format [, argument ]...);

Remove a file

int remove(const char* filename);

Rename a file

int rename(const char* oldname, const char*newname);

! ‫בהצלחה‬

You might also like