امتحان

مجموعه مشکلات 1

برنامه زیر را مطالعه کنید و سپس به سوالات زیر پاسخ دهید. از شما می‌خواهیم فقط با نگاه کردن به کد منبع به سؤالات پاسخ دهید، یعنی لطفاً آن را در فایل کپی نکنید، آن را کامپایل کنید و بر اساس اجرای آن به سؤالات پاسخ دهید. که تمام لذت را از آن خواهد گرفت!

int main() {
  int counter, first, last, next;
  first = 1; last = 2;

  for (counter = first; counter <= last; counter++) {
    cout << "\n " << counter;
    next = counter * counter;
    cout << " " << next;
  }

  counter = first;
  while (counter <= last) {
    cout << "\n " << counter;
    next = counter * counter;
    cout << " " << next;
    counter++;
  }

  counter = first;
  do {
    cout << "\n " << counter;
    next = counter * counter;
    cout << " " << next;
    counter++;
  } while (counter < last);
}

سوال 1: خروجی این برنامه چیست؟

آ) 1 2
2 4
1 2
2 4
1 2
2 4
ب) 1 1
2 4
1 1
2 4
1 1
2 4
ج) 1 1
2 4
1 1
2 4
1 1
د) 1 1
2 4
1 1
1 1
2 4
E) چیزی را خروجی نمی دهد - خطاهایی در نحو وجود دارد.

سوال 2: اگر مقدار اولیه "counter" را قبل از حلقه do-while حذف کنیم، چه اتفاقی می افتد؟

آ) یک حلقه بی نهایت - حلقه do-while یک سری 1 را خروجی می دهد
ب) خروجی برنامه تغییر نمی کند
ج) حلقه do-while 2 و 4 را خروجی می دهد.
د) حلقه do-while هیچ خروجی نخواهد داشت
E) حلقه do-while 3 و 9 را خروجی می دهد.

سوال 3: با توجه به برنامه اصلی در بالای این صفحه، فرض کنید خطی را که متغیر شمارنده را قبل از حلقه while مقداردهی اولیه می کند حذف کرده ایم. چه اتفاقی می‌افتد اگر مانند زیر، خط counter++ را در داخل حلقه while حذف کنیم؟

آ) حلقه while هیچ خروجی ندارد.
ب) حلقه while خروجی 1 و 1 را دارد. حلقه do-while هیچ خروجی ندارد.
ج) خروجی حلقه while مانند زمانی است که هر دو خط گنجانده شده است.
د) تا زمانی که کامپیوتر را خاموش نکنیم، سیستم اعداد تصادفی را تولید می کند.
E) حلقه while یک حلقه بی نهایت است

سوال 4: با توجه به برنامه اصلی در بالای این صفحه، اگر حلقه while به این شکل باشد چه اتفاقی می افتد؟

counter = first;
while (counter <= last) {
  cout << "\n" << counter;
  if (first % 2 == 0)
    next = counter * counter;
  cout << "  " << next;
  counter++;
}
آ) خروجی حلقه while مانند برنامه اصلی است.
ب) حلقه while چیزی خروجی نخواهد داشت
ج) خروجی حلقه while 1 1 و 1 4 است.
د) خروجی حلقه while 1 2 و 2 4 است.
E) خروجی حلقه while 1 4 و 2 4 است.
و) خروجی حلقه while 2 4 و 2 4 است.

سوال 5: اگر اولین متغیر بزرگتر از آخرین باشد چه اتفاقی می افتد؟

آ) حلقه while چیزی را خروجی می دهد، اما هیچ چیز دیگری خروجی نمی دهد.
ب) حلقه do while چیزی را خروجی می دهد، اما هیچ چیز دیگری خروجی نمی دهد.
ج) هیچ خروجی وجود نخواهد داشت.
د) برنامه خطا یا خراب می شود
E) حلقه for چیزی را خروجی می دهد، اما هیچ چیز دیگری خروجی نمی دهد.

سوال 6: اگر اولین متغیر را با متغیر آخر مقدار دهی اولیه کنیم، خروجی برنامه چیست؟

آ) حلقه do while چیزی را خروجی می دهد، اما هیچ چیز دیگری خروجی نمی دهد.
ب) حلقه while چیزی را خروجی می دهد، اما هیچ چیز دیگری خروجی نمی دهد.
ج) هر حلقه یک خط خروجی خواهد داشت.
د) حلقه do while 2 خط خروجی می دهد و حلقه دیگر یک خط را ایجاد می کند.
E) هیچ خروجی نخواهد داشت
و) حلقه for چیزی را خروجی می دهد، اما هیچ چیز دیگری خروجی نمی دهد.


مجموعه مشکلات 2

مانند مجموعه مشکلات قبلی، در اینجا برنامه ای برای بررسی شما وجود دارد. لطفا به سوالات زیر فقط با نگاه کردن به کد منبع پاسخ دهید.

#include <iostream>
using namespace std;

int main() {
  int Boys = 3, Girls = 5;
  void F1(int males, int females);
  void F2(int &m, int &f);

  F1(Boys, Girls);
  cout << "\nAfter calling F1, within main()";
  cout << "\n\tBoys = " << Boys; // #2
  cout << "\n\tGirls = " << Girls;

  F2(Boys, Girls);
  cout << "\nAfter calling F2, within main()";
  cout << "\n\tBoys = " << Boys; // #4
  cout << "\n\tGirls = " << Girls;
}

void F1(int b, int g) {
  b += 3, g += 4;
  cout << "\nF1";
  cout << "\n\tBoys = " << b; // #1
  cout << "\n\tGirls = " << g;
}

void F2(int &b, int &g) {
  b = b + 8, g = g + 5;
  cout << "\nF2";
  cout << "\n\tBoys = " << b; // #3
  cout << "\n\tGirls = " << g;
}

سوال 1: خروجی متغیر Boys روی خطوط مشخص شده چیست؟

آ) شماره 1: 6
شماره 2: 3
شماره 3: 11
شماره 4: 11
ب) شماره 1: 6
شماره 2: 3
شماره 3: 11
شماره 4: 3
ج) شماره 1: 6
شماره 2: 6
شماره 3: 11
شماره 4: 11
د) هیچ خروجی نمی دهد زیرا کامپایل یا اجرا نمی شود.

سوال 2: تمام موارد مربوط به خطوط زیر برنامه را انتخاب کنید:

void F1(int males, int females);
void F2(int &m, int &f);
آ) قوانین C++ بیان می کنند که ما می توانیم این دو خط را حذف کنیم به شرطی که روش ها قبل از استفاده تعریف شده باشند.
ب) قوانین C++ بیان می کنند که نام آرگومان ها باید بین اعلان و تعریف یکسان باشد.
ج) اگر این دو خط را حذف کنیم این برنامه از کار می افتد.
د) بیشتر متداول است که اعلامیه ها در محدوده جهانی بیان شوند.
E) اینها را اعلامیه های پیش رو می نامند.

سوال 3: اگر خط زیر را از main() منتقل کنیم و در محدوده جهانی قرار دهیم، چه اتفاقی می افتد؟

int Boys = 3, Girls = 5;
آ) خروجی یکسان خواهد بود.
ب) پسران = 3 و دختران = 5 در تمام خروجی
ج) پسرها = 3 و دختران = 5 فقط در خروجی main()

سوال 4: اگر ابتدای برنامه را به شکل زیر تغییر دهیم چه می شود:

// We have moved moved these to global scope
const int Boys = 3;
const int Girls = 5;

void main() {
  //int Boys = 3, Girls = 5;
آ) برنامه کامپایل می شود اما وقتی آن را اجرا می کنیم خراب می شود.
ب) هیچ تغییری در خروجی وجود نخواهد داشت
ج) خروجی در طول برنامه پسر = 3 دختر = 5 خواهد بود
د) خروجی فقط در خروجی main() پسران = 3 دختر = 5 خواهد بود.
E) برنامه احتمالاً کامپایل نخواهد شد (بسته به کامپایلر).

سوال 5: داده ها با مقدار F2 ارسال می شوند.

آ) درست است، واقعی.
ب) نادرست


مجموعه مشکلات 3

مانند مجموعه مشکلات قبلی، در اینجا برنامه ای برای بررسی شما وجود دارد. لطفا به سوالات زیر فقط با نگاه کردن به کد منبع پاسخ دهید. این یکی از دو مورد قبلی جالب تر است - کد را با دقت دنبال کنید.

#include <iostream>
using namespace std;

const int MAX_SIZE = 20;
typedef int ARR2D[MAX_SIZE][MAX_SIZE];

void Print(ARR2D in_array, int rows, int cols);
void Fill(ARR2D in_array, int rows, int cols);

int main() {
  ARR2D matrix;
  int row, col;
  do {
    cout << "Please enter the size of the matrix to generate (rows and cols) :" << endl;
    cin >> row >> col;
  } while (row <= 0 || row > MAX_SIZE || col <= 0 || col > MAX_SIZE);
  Fill(matrix, row, col);
  Print(matrix, row, col);
  return(0);
}

void Print(ARR2D in_array, int rows, int cols) {
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++)
      cout << '\t' << in_array[i][j];
    cout << endl;
  }
}

void Fill(ARR2D in_array, int rows, int cols) {
  for(int i = 0; i < rows; i++)
    for (int j = 0; j < cols; j++)
      in_array[i][j] = 0;

  const int limit = rows * cols;
  int cNum = 1;
  int cRow = 0;
  int cCol = 0;
  int cDir = 0;  // 0-north, 1-east, 2-south, 3-west

  while(true) {
    // Place the number.
    in_array[cRow][cCol] = cNum;
    cNum++;
    if (cNum > limit) break;

    int fRow = cRow;
    int fCol = cCol;
    while (true) {
      fRow = cRow;
      fCol = cCol;
      switch(cDir) {
        case 0: fRow--; break;
        case 1: fCol++; break;
        case 2: fRow++; break;
        case 3: fCol--; break;
      }

      if ( fRow >= 0 && fRow < rows && fCol >= 0 && fCol < cols && in_array[fRow][fCol] == 0)
        break;
      cDir = (cDir + 1) % 4;
    }
    cRow = fRow;
    cCol = fCol;
  }
}

سوال 1: این برنامه با ورودی 3 برای سطرها و 4 برای ستون ها چه خروجی می دهد؟

آ) 1 2 3
4 5 6
7 8 9
10 11 12
ب) 1 2 3 4
5 6 7 8
9 10 11 12
ج) 12 11 10 9
8 7 6 5
4 3 2 1
د) 1 3 2 4
8 6 7 5
9 11 10 12
E) 1 2 3 4
10 11 12 5
9 8 7 6
ز) 9 8 7 6
10 11 12 5
1 2 3 4
ح) هیچ خروجی نمی دهد - منطق معیوب است.
من) چیزی خروجی نمی دهد - خطاهای نحوی وجود دارد.
ج) چیزی را خروجی نمی دهد - قرار نیست.
ک) 12 عدد اولی را که در انتظار اجرای برنامه به ذهنتان خطور می کند، خروجی می دهد.

سوال 2: اگر خط زیر را به تابع main() خود اضافه کنیم چه می شود؟

MAX_SIZE = 10;
آ) این در C++ مجاز نیست.
ب) این مجاز است؛ برنامه با MAX_SIZE تنظیم شده روی 20 اجرا می شود
ج) این مجاز است؛ برنامه با MAX_SIZE تنظیم شده روی 10 اجرا می شود.

سوال 3: چهار خط زیر را از برنامه بالا در نظر بگیرید:

const int MAX_SIZE = 20;
typedef int ARR2D [MAX_SIZE][MAX_SIZE];

void Print  (ARR2D A, int rows, int cols);
void Fill   (ARR2D A, int rows, int cols);

1) آیا می توان از const در typedef استفاده کرد؟
2) آیا می توان از typedef در یک اعلان قبل از اعلام متغیری از آن نوع استفاده کرد؟

آ) 1) بله 2) بله
ب) 1) خیر 2) خیر
ج) 1) خیر 2) بله
د) 1) بله 2) خیر

سوال 4: آیا می توانیم از موارد زیر استفاده کنیم:

#define MAX_SIZE 20
به جای:
const int MAX_SIZE = 20;
آ) بله کار خواهد کرد و استفاده از #define برای ثابت ها در C++ خوب است
ب) بله کار می کند اما معمولاً از #define برای ثابت ها در C++ استفاده نمی کنیم
ج) #define در C++ موجود نیست
د) شما نمی توانید هیچ یک از این کارها را در C انجام دهید

سوال 5: typedef برای ایجاد نام مستعار برای نام نوع استفاده می شود.

آ) درست است، واقعی.
ب) نادرست

سوال 6: اگر آرایه را در تابع Fill() مقدار دهی اولیه نکنیم چه اتفاقی می افتد؟

آ) اجرا خواهد شد اما خروجی همه 12 خواهد بود
ب) به خوبی اجرا می شود و همان خروجی را ایجاد می کند که انگار آرایه به 0 مقداردهی اولیه شده است
ج) برنامه اجرا نمی شود یا از کار می افتد
د) اجرا می شود اما خروجی تمام 0 ها خواهد بود
E) اجرا خواهد شد اما ممکن است هیچ خروجی ایجاد نکند

سوال 7: همه مواردی که اعمال می شوند را بررسی کنید. چرا در این برنامه از const برای MAX_SIZE استفاده می کنیم؟ آیا آسان‌تر نیست که به جای MAX_SIZE در هر کجا که نیاز است، «20» را تایپ کنید؟

آ) MAX_SIZE یک مقدار C++ داخلی است که هر کسی می تواند از آن استفاده کند. فقط آن را تنظیم کنید و از آن استفاده کنید.
ب) دقیقاً مانند متغیرهای جهانی باید از عوارض جهانی اجتناب شود
ج) استفاده از یک Const درک برنامه ما را آسان تر می کند
د) اعداد جادویی در یک برنامه معمولاً تمرین خوبی در نظر گرفته می شوند.
E) اگر می‌خواهیم MAX_SIZE را تغییر دهیم، فقط باید آن را در یک مکان تغییر دهیم

سوال 8: دستور switch در تابع Fill() باید دارای یک حروف پیش فرض باشد، زیرا در نظر گرفته می شود که یکی از آن ها را شامل شود.

آ) درست است، واقعی.
ب) نادرست

سوال 9: توجه کنید که در تابع Fill() متغیرها را در بین دستورات اعلام می کنیم. به عنوان مثال، cNum و cRow پس از اجرای یک حلقه for اعلام و مقداردهی اولیه می شوند. آیا این در C++ کار می کند یا همه متغیرها باید در بالای تابع اعلان شوند؟

آ) انجام این کار خوب است.
ب) تمام متغیرها باید در بالای تابع اعلان شوند.
ج) هر دو راه اشتباه است - C++ به متغیرها در هیچ کجای برنامه اجازه نمی دهد.
د) همه متغیرها باید در دامنه جهانی اعلام شوند.

مجموعه مشکلات 4

در اینجا مجموعه ای از فایل ها هستند که یک کلاس ساده را تعریف و آزمایش می کنند. طبق معمول به سوالات زیر فقط با مراجعه به کد منبع پاسخ دهید.

در اینجا فایل هدر (cow.h) آمده است:

#ifndef COW_H
#define COW_H

using namespace std;

typedef enum Color {black, brown, beige, blackandwhite, nocolor};

class Cow {
 public:
  Cow();
  ~Cow();

  // accessors
  double weight() { return weight_; };
  string name() { return name_; };
  Color color() { return color_; };

  // mutators
  void set_name(string inName) { name_ = inName; };
  void set_color(Color inColor) { color_ = inColor; };
  void set_weight(double inWeight) {weight_ = inWeight; };

  void Moo();
  void Properties();

 private:
  Color color_;
  double weight_;
  string name_;
};

#endif

این فایل .cc مرتبط است (cow.cc):

#include <iostream>
#include "cow.h"

using namespace std;

Cow::Cow() {}

Cow::~Cow() {}

void Cow::Moo() {
  cout << name() << " says MOO." << endl;
}

void Cow::Properties() {
  cout << name() << " weighs " << weight() << ", is "
       << color() << " and says MOO." << endl;
}

و در اینجا یک برنامه مشتری برای این کلاس وجود دارد (cowmain.cc):

#include <iostream>
#include "cow.h"

using namespace std;

int main() {
  Cow cow1;
  cow1.set_name("betsy");
  cow1.set_weight(400.0);
  cow1.set_color(black);

  cow1.Moo();
  cow1.Properties();
}

سوال 1: خروجی این برنامه چیست؟

آ) بتسی می گوید MOO.
بتسی 400 وزن دارد، 0 است و می گوید MOO.
ب) بتسی می گوید MOO.
بتسی 400 وزن دارد، مشکی است و می گوید MOO.
ج) بتسی می گوید MOO.
وزن بتسی 400 است

سوال 2: هرگز نباید کد متدهای accessor و mutator را در فایل هدر قرار دهیم. (توجه داشته باشید که Accessor متدی است که مقداری را برمی گرداند و mutator متدی است که مقداری را تغییر می دهد.)

آ) درست است، واقعی.
ب) نادرست

سوال 3: آیا قبل از هر یک از تعاریف تابع در cow.cc به "Cow::" نیاز داریم؟

آ) خیر - از آنجایی که cow.h گنجانده شده است
ب) آره

سوال 4: چه نقشی دارد:

#ifndef COW_H
#define COW_H
...
#endif

در فایل هدر پخش شود؟

همه موارد کاربردی را انتخاب کنید:

آ) آنها هیچ هدفی ندارند زیرا نام فایل cow.h است نه COW_H.
ب) اگر این کار را انجام نمی دادیم، با خطای زمان اجرا مواجه می شدیم
ج) اگر این کار را انجام نمی دادیم، ممکن است فایل را بیش از یک بار اضافه کنیم
د) آنها هیچ کاری انجام نمی دهند زیرا یک یا چند کلمه کلیدی اشتباه املایی دارند.
E) آنها هیچ کاری انجام نمی دهند زیرا کلاس Cow فقط یک فایل هدر دارد.

سوال 5: اگر خط زیر را به cowmain.cc اضافه کنیم چه اتفاقی می افتد؟

cow1.weight_ = 24;
آ) برنامه اجرا می شود و متغیر وزن با این خط اصلاح می شود.
ب) برنامه کامپایل و اجرا می شود، اما در آن خط خراب می شود.
ج) ++C این اجازه را نمی دهد.
د) برنامه کامپایل و اجرا می شود، اما متغیر وزن با این خط تغییر نمی کند.

سوال 6: وقتی خط زیر اجرا می شود، سازنده کلاس Cow فراخوانی می شود:

Cow cow1;

برخی از ویژگی های مهم سازنده ها چیست؟

همه موارد کاربردی را انتخاب کنید

آ) آنها معمولاً هیچ مقداری را بر نمی گردانند
ب) اگر سازنده ای در کلاس خود ارائه نکنیم، کلاس کامپایل نمی شود
ج) سازنده در کلاس Cow غیر معمول است زیرا متغیرهای خصوصی را مقداردهی اولیه نمی کند.
د) آنها همیشه نام کلاس را دارند
E) تا زمانی که آرگومان ها متفاوت باشند، می توانیم چندین سازنده در یک کلاس داشته باشیم
و) زمانی که یک کلاس نمونه سازی می شود یک سازنده فراخوانی می شود.

سوال 7: برخی از ویژگی های مهم یک تخریبگر چیست؟

آ) هنگامی که یک شی از محدوده خارج می شود، یک تخریبگر نامیده می شود
ب) یک تخریبگر همان نام کلاس را دارد اما قبل از آن "~" وجود دارد.
ج) مشکلی در destructor در cow.cc وجود دارد که هیچ کاری انجام نمی دهد.
د) اگر برای کلاس خود یک destructor ایجاد نکنیم، کلاس کامپایل نمی شود

سوال 8: با توجه به نحوه استفاده برنامه مشتری از کلاس، موارد زیر را در نظر بگیرید:

تقسیم اعضا به عمومی و خصوصی در کلاس گاو مناسب نیست. یعنی چیزی که خصوصی است باید عمومی باشد یا چیزی که عمومی است خصوصی باشد.

آ) درست است، واقعی.
ب) نادرست

سوال 9: اگر سازنده دیگری را علاوه بر سازنده ای که باید به cow.cc اضافه کنیم چه می شود. سازنده جدید شبیه این است

Cow::Cow(string inName, double inWeight, Color inColor) {
  set_name(inName);
  set_weight(inWeight);
  set_color(inColor);
}

و خطوط زیر را به main() اضافه می کنیم:

Cow cow2("milly", 350.2, brown);
cow2.Moo();
cow2.Properties();

آیا می توانیم این کار را انجام دهیم؟

همه موارد کاربردی را انتخاب کنید

آ) خط موجود در main() که در آن cow2 را مقداردهی اولیه می کنیم از کار می افتد.
ب) ما فقط می توانیم یک سازنده داشته باشیم.
ج) این در C++ رایج است
د) بله، اما این استفاده معمولی از C++ نیست
E) این به خوبی اجرا می شود، اما هیچ خروجی نمی دهد زیرا خصوصی ها مقداردهی اولیه نشده اند.
و) ما نمی توانیم setName()، setColor() و setWeight() را از داخل متدی از همان کلاس فراخوانی کنیم.


سوالات جایزه

سوال 1) خروجی موارد زیر چیست؟

#include <iostream>
using namespace std;

void HelpMe(int *p, int *num, int *q);
void WhereAmI(int *p, int *q, int a);

void HelpMe(int *p, int *num, int *q) {
  int a;

  a = 2;
  q = &a;
  *p = *q + *num;
  num = p;
}


void WhereAmI(int *p, int *q, int a) {
  a = 6;
  *p = a + *p;
  *q = a + 3;
  HelpMe(q, &a, p);
}


int main() {
  int *p;
  int q;
  int *num;
  int a;

  a = 3;
  q = 5;
  p = &a;
  num = &q;

  HelpMe(&a, p, num);
  WhereAmI(&q, p, *num);

  cout << "*p = " << *p << " q = " << q << " *num = " << *num << endl;
}
 

سوال 2) با فرض اینکه یک کلاس Apple وجود دارد و مقداردهی اولیه شده است، عبارت زیر را در نظر بگیرید. کلاس Apple یک متغیر نمونه color_ دارد:

Apple* granny_smith = new Apple; 

تمام عبارات زیر را که درست هستند انتخاب کنید:

آ) Apple* granny_smith = NULL; اگر (granny_smith == NULL)... این مشکلی ندارد - NULL مقداری نیست که بتوان به این روش بررسی کرد.
ب) سیب* granny_smith, fuji; این دو نشانگر را به اشیاء اپل اعلام می کند
ج) متغیر granny_smith حاوی مقادیر متغیر نمونه مرتبط با یک شی اپل است
د) Apple* granny_smith = NULL; این اشکالی ندارد،
E) متغیر granny_smith حاوی آدرس یک شی اپل است
و) رشته gs_color = *(granny_smith.get_color()); این عبارت رنگ شی granny_smith را برمی‌گرداند، با این فرض که مقداردهی اولیه شده است.
ز) فضای ذخیره سازی برای شی جدید اپل در پشته اختصاص داده شده است
ح) فضای ذخیره سازی برای شی جدید اپل در پشته زمان اجرا اختصاص داده شده است
من) int* a = &b; این آدرس b را در a قرار می دهد.


سوال 3) خروجی برنامه زیر چیست؟

#include <iostream>
using namespace std;

const int kNumVeggies = 4;

void Grill(int squash, int *mushroom);
int Saute(int onions[], int celery);


void Grill(int squash, int *mushroom) {
  *mushroom = squash/4;
  cout << *mushroom + squash << endl;
}

int Saute(int onions[], int celery) {
  celery *= 2;
  onions[celery]++;
  Grill(onions[0], &onions[3]);
  cout << celery << " " << onions[3] << endl;
  return celery;
}

int main() {
  int broccoli, peppers[kNumVeggies], *zucchini;

  for (broccoli = 0; broccoli < kNumVeggies; broccoli++)
    peppers[broccoli] = kNumVeggies - broccoli;
  zucchini = &peppers[Saute(peppers,1)];
  Grill(*zucchini, zucchini);
  zucchini--;
  cout << peppers[3] + *zucchini + *(zucchini + 1) << endl;
}


پاسخ آزمون

شما باید سعی کنید تمام سوالات بالا را بدون نگاه کردن به پاسخ ها تکمیل کنید. بهتر است از کسی کمک بخواهید تا اینکه مستقیماً به برگه پاسخ برای کمک بپرید.

می توانید پاسخ مشکلات فوق را در اینجا مشاهده کنید.